From 4f0b6199f694862b2eb6cc7b7f4c9ce03272a137 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 19 Jan 2014 16:15:10 -0500 Subject: [PATCH 01/33] Finished self-spells for Fire --- .../common/items/ItemComplexSpellCrystal.java | 13 +++++- .../complex/SpellModifierEnvironmental.java | 2 +- .../common/spell/complex/SpellParadigm.java | 36 +++++++++++++++ .../spell/complex/effect/SpellEffect.java | 15 ++++++ .../spell/complex/effect/SpellEffectFire.java | 21 ++++----- .../spell/complex/effect/SpellHelper.java | 46 +++++++++++++++++++ .../fire/SelfEnvironmentalFire.java | 35 ++++++++++++++ 7 files changed, 153 insertions(+), 15 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java index 2a1a756c..58ebedef 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java @@ -7,10 +7,12 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.common.spell.complex.SpellModifierDefault; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellModifierOffensive; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPotency; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPower; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -54,9 +56,16 @@ public class ItemComplexSpellCrystal extends EnergyItems return par1ItemStack; } + if(par2World.isRemote) + { + return par1ItemStack; + } + SpellParadigm parad = new SpellParadigmSelf(); parad.addBufferedEffect(new SpellEffectFire()); - parad.modifyBufferedEffect(new SpellModifierDefault()); + parad.modifyBufferedEffect(new SpellModifierOffensive()); + parad.applyEnhancement(new SpellEnhancementPower()); + parad.applyEnhancement(new SpellEnhancementPotency()); parad.castSpell(par2World, par3EntityPlayer, par1ItemStack); return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java index 1da4620a..ff9ef7f4 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java @@ -4,6 +4,6 @@ public class SpellModifierEnvironmental extends SpellModifier { public SpellModifierEnvironmental() { - super(SpellModifier.DEFENSIVE); + super(SpellModifier.ENVIRONMENTAL); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java index 1eaae817..893d3ae7 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java @@ -118,4 +118,40 @@ public abstract class SpellParadigm } public abstract int getDefaultCost(); + + public int getBufferedEffectPower() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getPowerEnhancements(); + } + + return 0; + } + + public int getBufferedEffectCost() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getCostEnhancements(); + } + + return 0; + } + + public int getBufferedEffectPotency() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getPotencyEnhancements(); + } + + return 0; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java index df6f8cf8..9ae235a4 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java @@ -154,4 +154,19 @@ public abstract class SpellEffect protected abstract int getCostForOffenseMelee(); protected abstract int getCostForDefenseMelee(); protected abstract int getCostForEnvironmentMelee(); + + public int getPowerEnhancements() + { + return this.powerEnhancement; + } + + public int getCostEnhancements() + { + return this.costEnhancement; + } + + public int getPotencyEnhancements() + { + return this.potencyEnhancement; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index 32d7ab02..49bd8ac1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -4,6 +4,9 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfOffensiveFire; public class SpellEffectFire extends SpellEffect { @@ -43,22 +46,19 @@ public class SpellEffectFire extends SpellEffect @Override public void offensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfOffensiveFire(powerEnhancement,potencyEnhancement,costEnhancement)); } @Override public void defensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfDefensiveFire(powerEnhancement,potencyEnhancement,costEnhancement)); } @Override public void environmentalModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfEnvironmentalFire(powerEnhancement, potencyEnhancement, costEnhancement)); } @Override @@ -120,15 +120,13 @@ public class SpellEffectFire extends SpellEffect @Override protected int getCostForDefaultSelf() { - // TODO Auto-generated method stub - return 1000; + return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)); } @Override protected int getCostForOffenseSelf() { - // TODO Auto-generated method stub - return 0; + return 100*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); } @Override @@ -141,8 +139,7 @@ public class SpellEffectFire extends SpellEffect @Override protected int getCostForEnvironmentSelf() { - // TODO Auto-generated method stub - return 0; + return (int) ((15*Math.pow(1.7, powerEnhancement)+10*Math.pow(potencyEnhancement,1.8))*Math.pow(0.8, costEnhancement)); } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java new file mode 100644 index 00000000..d9bf5e50 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -0,0 +1,46 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public class SpellHelper +{ + public static Random rand = new Random(); + + public static void smeltBlockInWorld(World world, int posX, int posY, int posZ) + { + FurnaceRecipes recipes = FurnaceRecipes.smelting(); + + Block block = Block.blocksList[world.getBlockId(posX, posY, posZ)]; + if(block==null) + { + return; + } + + int meta = world.getBlockMetadata(posX, posY, posZ); + + ItemStack smeltedStack = recipes.getSmeltingResult(new ItemStack(block,1,meta)); + if(smeltedStack!=null && smeltedStack.getItem() instanceof ItemBlock) + { + world.setBlock(posX, posY, posZ, smeltedStack.itemID, smeltedStack.getItemDamage(), 3); + } + } + + public static List getEntitiesInRange(World world, double posX, double posY, double posZ, double horizontalRadius, double verticalRadius) + { + return world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(posX-0.5f, posY-0.5f, posZ-0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(horizontalRadius, verticalRadius, horizontalRadius)); + } + + public static double gaussian(double d) + { + return d * ((rand.nextFloat() - 0.5D)); + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java index 769871cc..cd8f1613 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java @@ -1,7 +1,9 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; public class SelfEnvironmentalFire extends SelfSpellEffect @@ -17,5 +19,38 @@ public class SelfEnvironmentalFire extends SelfSpellEffect int posX = (int) Math.round(player.posX - 0.5f); int posY = (int) player.posY; int posZ = (int) Math.round(player.posZ - 0.5f); + + int powRadius = this.powerUpgrades; + int potRadius = this.potencyUpgrades-1; + + for(int i=-powRadius;i<=powRadius;i++) + { + for(int j=-powRadius;j<=powRadius;j++) + { + for(int k=-powRadius;k<=powRadius;k++) + { + if(world.isAirBlock(posX+i, posY+j, posZ+k)) + { + world.setBlock(posX+i, posY+j, posZ+k, Block.fire.blockID); + + } + } + } + } + + for(int i=-potRadius;i<=potRadius;i++) + { + for(int j=-potRadius;j<=potRadius;j++) + { + for(int k=-potRadius;k<=potRadius;k++) + { + if(!world.isAirBlock(posX+i, posY+j, posZ+k)) + { + SpellHelper.smeltBlockInWorld(world, posX+i, posY+j, posZ+k); + } + } + } + } + } } From 51897c6923fe0592301ed769da827d77c4a343ab Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 19 Jan 2014 16:42:31 -0500 Subject: [PATCH 02/33] Fire stuff --- .../AlchemicalWizardry.java | 5 ++- .../{common => }/BloodMagicConfiguration.java | 6 +-- .../common/AlchemicalWizardryEventHooks.java | 39 +++++++++++++++++++ .../common/PotionFlameCloak.java | 18 +++++++++ .../impactEffects/fire/SelfDefaultFire.java | 2 +- .../impactEffects/fire/SelfDefensiveFire.java | 3 ++ .../impactEffects/fire/SelfOffensiveFire.java | 5 ++- 7 files changed, 71 insertions(+), 7 deletions(-) rename BM_src/WayofTime/alchemicalWizardry/{common => }/BloodMagicConfiguration.java (99%) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 076163e1..3112ef8b 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -23,7 +23,6 @@ import thaumcraft.api.ItemApi; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryFuelHandler; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryTickHandler; -import WayofTime.alchemicalWizardry.common.BloodMagicConfiguration; import WayofTime.alchemicalWizardry.common.CommonProxy; import WayofTime.alchemicalWizardry.common.EntityAirElemental; import WayofTime.alchemicalWizardry.common.LifeBucketHandler; @@ -31,6 +30,7 @@ import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent; import WayofTime.alchemicalWizardry.common.PacketHandler; import WayofTime.alchemicalWizardry.common.PotionBoost; import WayofTime.alchemicalWizardry.common.PotionDrowning; +import WayofTime.alchemicalWizardry.common.PotionFlameCloak; import WayofTime.alchemicalWizardry.common.PotionFlight; import WayofTime.alchemicalWizardry.common.PotionInhibit; import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; @@ -119,6 +119,7 @@ public class AlchemicalWizardry public static Potion customPotionInhibit; public static Potion customPotionFlight; public static Potion customPotionReciprocation; + public static Potion customPotionFlameCloak; public static int customPotionDrowningID; public static int customPotionBoostID; @@ -126,6 +127,7 @@ public class AlchemicalWizardry public static int customPotionInhibitID; public static int customPotionFlightID; public static int customPotionReciprocationID; + public static int customPotionFlameCloakID; public static boolean isThaumcraftLoaded; @@ -537,6 +539,7 @@ public class AlchemicalWizardry customPotionInhibit = (new PotionInhibit(customPotionInhibitID, false, 0)).setIconIndex(0, 0).setPotionName("Inhibit"); customPotionFlight = (new PotionFlight(customPotionFlightID, false, 0)).setIconIndex(0, 0).setPotionName("Flight"); customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); + customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); //All items registered go here //LanguageRegistry.addName(orbOfTesting, "Orb of Testing"); LanguageRegistry.addName(ModItems.weakBloodOrb, "Weak Blood Orb"); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java similarity index 99% rename from BM_src/WayofTime/alchemicalWizardry/common/BloodMagicConfiguration.java rename to BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 03cbb9af..132721ea 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -1,6 +1,5 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorParadigm; import cpw.mods.fml.common.FMLLog; import net.minecraftforge.common.Configuration; @@ -45,7 +44,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.customPotionInhibitID = config.get("Potion ID", "Inhibit", 103).getInt(); AlchemicalWizardry.customPotionFlightID = config.get("Potion ID", "Flight", 104).getInt(); AlchemicalWizardry.customPotionReciprocationID = config.get("Potion ID", "Reciprocation", 105).getInt(); - + AlchemicalWizardry.customPotionFlameCloakID = config.get("Potion ID","FlameCloak",106).getInt(); + MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); AlchemicalWizardry.diamondMeteorArray = config.get("meteor", "diamondMeteor", new String[]{"oreDiamond", "100", "oreEmerald", "75", "oreCinnabar", "200", "oreAmber", "200"}).getStringList(); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index b76a4824..7848d707 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.common.ObfuscationReflectionHelper; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.Entity; @@ -10,6 +11,7 @@ import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.PlayerCapabilities; import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.potion.Potion; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraftforge.event.ForgeSubscribe; @@ -51,6 +53,19 @@ public class AlchemicalWizardryEventHooks ((EntityLivingBase) entityAttacking).attackEntityFrom(DamageSource.generic, damageRecieve); } } + + if(entityAttacked.isPotionActive(AlchemicalWizardry.customPotionFlameCloak)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFlameCloak).getAmplifier(); + + Entity entityAttacking = event.source.getSourceOfDamage(); + + if(entityAttacking != null && entityAttacking instanceof EntityLivingBase && !entityAttacking.isImmuneToFire() && !((EntityLivingBase)entityAttacking).isPotionActive(Potion.fireResistance)) + { + entityAttacking.attackEntityFrom(DamageSource.inFire, 2*i+2); + entityAttacking.setFire(3); + } + } } // @ForgeSubscribe @@ -63,6 +78,9 @@ public class AlchemicalWizardryEventHooks public void onEntityUpdate(LivingUpdateEvent event) { EntityLivingBase entityLiving = event.entityLiving; + double x = entityLiving.posX; + double y = entityLiving.posY; + double z = entityLiving.posZ; if (entityLiving instanceof EntityPlayer && entityLiving.worldObj.isRemote) { @@ -210,5 +228,26 @@ public class AlchemicalWizardryEventHooks } } } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionFlameCloak)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFlameCloak).getAmplifier(); + double range = i*0.5; + + List entities = SpellHelper.getEntitiesInRange(entityLiving.worldObj, x, y, z, range, range); + if(entities!=null) + { + for(Entity entity : entities) + { + if(!entity.equals(entityLiving)&&!entity.isImmuneToFire()&&!(entity instanceof EntityLivingBase && ((EntityLivingBase)entity).isPotionActive(Potion.fireResistance))) + { + entity.setFire(3); + } + } + } + } + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java b/BM_src/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java new file mode 100644 index 00000000..e25a7c06 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionFlameCloak extends Potion +{ + public PotionFlameCloak(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java index 9ea92fcf..209118a1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java @@ -17,6 +17,6 @@ public class SelfDefaultFire extends SelfSpellEffect @Override public void onSelfUse(World world, EntityPlayer player) { - player.addPotionEffect(new PotionEffect(Potion.fireResistance.id,1000,0)); + player.setFire((int)(10*Math.pow(1.5, powerUpgrades+1.5*potencyUpgrades))); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java index 6dbc2f80..16e57c2f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java @@ -16,6 +16,9 @@ public class SelfDefensiveFire extends SelfSpellEffect { { // TODO Auto-generated method stub + world.playAuxSFXAtEntity(player, 1008, (int)player.posX, (int)player.posY, (int)player.posZ, 0); + + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java index 037f1ae0..8e51a25d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java @@ -1,7 +1,9 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; public class SelfOffensiveFire extends SelfSpellEffect @@ -14,7 +16,6 @@ public class SelfOffensiveFire extends SelfSpellEffect @Override public void onSelfUse(World world, EntityPlayer player) { - + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionFlameCloak.id,(this.powerUpgrades+1)*this.powerUpgrades,this.potencyUpgrades)); } - } From adf68761440503604d0caa19ceb64c3d1d524579 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 24 Jan 2014 10:21:10 -0500 Subject: [PATCH 03/33] Some work on spells, etc. --- .../AlchemicalWizardry.java | 10 +- .../BloodMagicConfiguration.java | 3 +- .../alchemicalWizardry/ModBlocks.java | 4 +- .../common/block/BlockConduit.java | 27 +- .../common/block/BlockOrientable.java | 247 ++++++++++++++++++ .../common/block/BlockSpellEffect.java | 12 + .../spell/complex/effect/SpellEffectFire.java | 2 +- .../common/tileEntity/TEConduit.java | 6 +- .../common/tileEntity/TEOrientable.java | 8 + 9 files changed, 298 insertions(+), 21 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 3112ef8b..d387cf35 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -76,6 +76,7 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; @@ -284,6 +285,7 @@ public class AlchemicalWizardry public static int spectralBlockBlockID; public static int blockConduitBlockID; public static int blockBloodLightBlockID; + public static int blockSpellEffectBlockID; public static void registerRenderInformation() { @@ -364,7 +366,7 @@ public class AlchemicalWizardry //blocks - //blockConduit = new BlockConduit(blockConduitBlockID); + proxy.registerRenderers(); proxy.registerEntities(); //ItemStacks used for crafting go here @@ -652,6 +654,7 @@ public class AlchemicalWizardry GameRegistry.registerTileEntity(TEPlinth.class, "containerPlinth"); GameRegistry.registerTileEntity(TETeleposer.class, "containerTeleposer"); GameRegistry.registerTileEntity(TEConduit.class, "containerConduit"); + GameRegistry.registerTileEntity(TEOrientable.class, "containerOrientable"); // GameRegistry.registerBlock(ModBlocks.bloodRune, ItemBloodRuneBlock.class, "AlchemicalWizardry" + (ModBlocks.bloodRune.getUnlocalizedName().substring(5))); LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 0), "Blood Rune"); @@ -689,6 +692,8 @@ public class AlchemicalWizardry LanguageRegistry.addName(ModBlocks.blockTeleposer, "Teleposer"); LanguageRegistry.addName(ModBlocks.spectralBlock, "Spectral Block"); LanguageRegistry.addName(ModBlocks.blockBloodLight, "Blood Light"); + LanguageRegistry.addName(ModBlocks.blockConduit, "Spell Conduit"); + //TODO GameRegistry.registerBlock(ModBlocks.armourForge, "armourForge"); GameRegistry.registerBlock(ModBlocks.emptySocket, "emptySocket"); GameRegistry.registerBlock(ModBlocks.bloodStoneBrick, "bloodStoneBrick"); @@ -700,7 +705,8 @@ public class AlchemicalWizardry GameRegistry.registerBlock(ModBlocks.blockTeleposer, "blockTeleposer"); GameRegistry.registerBlock(ModBlocks.spectralBlock, "spectralBlock"); GameRegistry.registerBlock(ModBlocks.blockBloodLight, "bloodLight"); - //GameRegistry.registerBlock(blockConduit,"blockConduit"); + GameRegistry.registerBlock(ModBlocks.blockConduit,"blockConduit"); + GameRegistry.registerBlock(ModBlocks.blockSpellEffect,"blockSpellEffect"); MinecraftForge.setBlockHarvestLevel(ModBlocks.bloodRune, "pickaxe", 2); MinecraftForge.setBlockHarvestLevel(ModBlocks.speedRune, "pickaxe", 2); MinecraftForge.setBlockHarvestLevel(ModBlocks.efficiencyRune, "pickaxe", 2); diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 132721ea..e6c63b88 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -82,7 +82,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.blockTeleposerBlockID = config.getBlock("BlockTeleposer", 1422).getInt(); AlchemicalWizardry.spectralBlockBlockID = config.getBlock("SpectralBlock", 1423).getInt(); AlchemicalWizardry.blockBloodLightBlockID = config.getBlock("BloodLight", 1424).getInt(); - //blockConduitBlockID = config.getBlock("BlockConduit", 1424).getInt(); + AlchemicalWizardry.blockConduitBlockID = config.getBlock("BlockConduit", 1425).getInt(); + AlchemicalWizardry.blockSpellEffectBlockID = config.getBlock("BlockSpellEffect", 1426).getInt(); //Items AlchemicalWizardry.weakBloodOrbItemID = config.getItem("WeakBloodOrb", 17000).getInt(); AlchemicalWizardry.energyBlasterItemID = config.getItem("EnergyBlaster", 17001).getInt(); diff --git a/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java b/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java index 0be56f76..7a0bb761 100644 --- a/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java +++ b/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java @@ -41,6 +41,7 @@ public class ModBlocks public static Block spectralBlock; public static Block blockConduit; public static Block blockBloodLight; + public static Block blockSpellEffect; public static void init() { @@ -69,7 +70,8 @@ public class ModBlocks blockHomHeart = new BlockHomHeart(AlchemicalWizardry.blockHomHeartBlockID); blockPedestal = new BlockPedestal(AlchemicalWizardry.blockPedestalBlockID); blockPlinth = new BlockPlinth(AlchemicalWizardry.blockPlinthBlockID); + blockConduit = new BlockConduit(AlchemicalWizardry.blockConduitBlockID); blockBloodLight = new BlockBloodLightSource(AlchemicalWizardry.blockBloodLightBlockID); - + blockSpellEffect = new BlockSpellEffect(AlchemicalWizardry.blockSpellEffectBlockID); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java index ad9e502d..18fe8099 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java @@ -1,9 +1,5 @@ package WayofTime.alchemicalWizardry.common.block; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -12,6 +8,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BlockConduit extends BlockContainer { @@ -76,25 +77,25 @@ public class BlockConduit extends BlockContainer ForgeDirection sideClicked = ForgeDirection.getOrientation(side); TileEntity tile = world.getBlockTileEntity(x, y, z); - if (tile instanceof TEConduit) + if (tile instanceof TEOrientable) { //TODO NEEDS WORK - if (((TEConduit) tile).getInputDirection().equals(sideClicked)) + if (((TEOrientable) tile).getInputDirection().equals(sideClicked)) { - ((TEConduit) tile).setInputDirection(((TEConduit) tile).getOutputDirection()); - ((TEConduit) tile).setOutputDirection(sideClicked); - } else if (((TEConduit) tile).getOutputDirection().equals(sideClicked)) + ((TEOrientable) tile).setInputDirection(((TEConduit) tile).getOutputDirection()); + ((TEOrientable) tile).setOutputDirection(sideClicked); + } else if (((TEOrientable) tile).getOutputDirection().equals(sideClicked)) { - ((TEConduit) tile).setOutputDirection(((TEConduit) tile).getInputDirection()); - ((TEConduit) tile).setInputDirection(sideClicked); + ((TEOrientable) tile).setOutputDirection(((TEConduit) tile).getInputDirection()); + ((TEOrientable) tile).setInputDirection(sideClicked); } else { if (!player.isSneaking()) { - ((TEConduit) tile).setOutputDirection(sideClicked); + ((TEOrientable) tile).setOutputDirection(sideClicked); } else { - ((TEConduit) tile).setOutputDirection(sideClicked.getOpposite()); + ((TEOrientable) tile).setOutputDirection(sideClicked.getOpposite()); } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java new file mode 100644 index 00000000..c9dee139 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -0,0 +1,247 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockOrientable extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static Icon topIcon; + @SideOnly(Side.CLIENT) + private static Icon sideIcon1; + @SideOnly(Side.CLIENT) + private static Icon sideIcon2; + @SideOnly(Side.CLIENT) + private static Icon bottomIcon; + + @SideOnly(Side.CLIENT) + private static Icon[] fireIcons; + + public BlockOrientable(int id) + { + super(id, Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setUnlocalizedName("bloodSocket"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + + this.fireIcons = this.registerIconsWithString(iconRegister, "fireEffectBlock"); + } + + @SideOnly(Side.CLIENT) + public Icon[] registerIconsWithString(IconRegister iconRegister, String blockString) + { + Icon[] icons = new Icon[7]; + + icons[0] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_input"); + icons[1] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_output"); + icons[2] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_upArrow"); + icons[3] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_downArrow"); + icons[4] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_leftArrow"); + icons[5] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_rightArrow"); + icons[6] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_blank"); + + return icons; + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + +// @Override +// public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) +// { +// return false; +// } + + @SideOnly(Side.CLIENT) + + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public Icon getBlockTexture(IBlockAccess par1IBlockAccess, int x, int y, int z, int side) + { + TileEntity tile = par1IBlockAccess.getBlockTileEntity(x, y, z); + int meta = par1IBlockAccess.getBlockMetadata(x, y, z); + + if(tile instanceof TEOrientable) + { + ForgeDirection input = ((TEOrientable)tile).getInputDirection(); + ForgeDirection output = ((TEOrientable)tile).getOutputDirection(); + + return this.getIconsForMeta(meta)[this.getTextureIndexForSideAndOrientation(side, input, output)]; + } + + return this.getIcon(side, meta); + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TEOrientable(); + } + + public Icon[] getIconsForMeta(int metadata) + { + return this.fireIcons; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) + { + if (world.isRemote) + { + return false; + } + + ForgeDirection sideClicked = ForgeDirection.getOrientation(side); + TileEntity tile = world.getBlockTileEntity(x, y, z); + + if (tile instanceof TEOrientable) + { + //TODO NEEDS WORK + if (((TEOrientable) tile).getInputDirection().equals(sideClicked)) + { + ((TEOrientable) tile).setInputDirection(((TEOrientable) tile).getOutputDirection()); + ((TEOrientable) tile).setOutputDirection(sideClicked); + } else if (((TEOrientable) tile).getOutputDirection().equals(sideClicked)) + { + ((TEOrientable) tile).setOutputDirection(((TEOrientable) tile).getInputDirection()); + ((TEOrientable) tile).setInputDirection(sideClicked); + } else + { + if (!player.isSneaking()) + { + ((TEOrientable) tile).setOutputDirection(sideClicked); + } else + { + ((TEOrientable) tile).setOutputDirection(sideClicked.getOpposite()); + } + } + } + + world.markBlockForUpdate(x, y, z); + return true; + } + + public int getTextureIndexForSideAndOrientation(int side, ForgeDirection input, ForgeDirection output) + { + if(ForgeDirection.getOrientation(side) == input) + { + return 0; + } + if(ForgeDirection.getOrientation(side) == output) + { + return 1; + } + if(ForgeDirection.getOrientation(side) == output.getOpposite()) + { + return 6; + } + + switch(side) + { + case 0: //BOTTOM + switch(output) + { + case NORTH: return 2; //UP + case SOUTH: return 3; //DOWN + case EAST: return 4; //LEFT + case WEST: return 5; //RIGHT + default: break; + } + break; + case 1: //TOP + switch(output) + { + case NORTH: return 2; //UP + case SOUTH: return 3; //DOWN + case EAST: return 5; + case WEST: return 4; + default: break; + } + break; + case 2: //NORTH + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case EAST: return 4; + case WEST: return 5; + default: break; + } + break; + case 3: //SOUTH + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case EAST: return 5; + case WEST: return 4; + default: break; + } + break; + case 4: //WEST + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case NORTH: return 5; + case SOUTH: return 4; + default: break; + } + break; + case 5: //EAST + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case NORTH: return 4; + case SOUTH: return 5; + default: break; + } + break; + } + + return 0; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java new file mode 100644 index 00000000..f2b38a82 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -0,0 +1,12 @@ +package WayofTime.alchemicalWizardry.common.block; + + +public class BlockSpellEffect extends BlockOrientable +{ + + public BlockSpellEffect(int id) + { + super(id); + setUnlocalizedName("blockSpellEffect"); + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index 49bd8ac1..4683aeb0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -126,7 +126,7 @@ public class SpellEffectFire extends SpellEffect @Override protected int getCostForOffenseSelf() { - return 100*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); + return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java index 1f5f5924..d8b4a426 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java @@ -23,9 +23,9 @@ public class TEConduit extends TEOrientable public void updateEntity() { //this.capacity=(int) (10000*this.capacityMultiplier); - if (!worldObj.isRemote && worldObj.getWorldTime() % 20 == 0) - { - } +// if (!worldObj.isRemote && worldObj.getWorldTime() % 20 == 0) +// { +// } } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java index dcad8303..1933a411 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -1,7 +1,9 @@ package WayofTime.alchemicalWizardry.common.tileEntity; +import WayofTime.alchemicalWizardry.common.PacketHandler; import WayofTime.alchemicalWizardry.common.block.IOrientable; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -82,4 +84,10 @@ public class TEOrientable extends TileEntity implements IOrientable return 0; } } + + @Override + public Packet getDescriptionPacket() + { + return PacketHandler.getBlockOrientationPacket(this); + } } From 1393a24b6e0b46e86ddd351a92d425d6cb79fcaa Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 24 Jan 2014 10:28:03 -0500 Subject: [PATCH 04/33] . --- .../alchemicalWizardry/common/PacketHandler.java | 1 + .../common/tileEntity/TESpellBlock.java | 6 ++++++ .../textures/blocks/fireEffectBlock_blank.png | Bin 0 -> 311 bytes .../textures/blocks/fireEffectBlock_input.png | Bin 0 -> 342 bytes .../textures/blocks/fireEffectBlock_output.png | Bin 0 -> 314 bytes .../textures/blocks/fireEffectBlock_upArrow.png | Bin 0 -> 329 bytes 6 files changed, 7 insertions(+) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java create mode 100644 resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png create mode 100644 resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_input.png create mode 100644 resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png create mode 100644 resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_upArrow.png diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PacketHandler.java b/BM_src/WayofTime/alchemicalWizardry/common/PacketHandler.java index adcce2e2..cb7c0d38 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/PacketHandler.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/PacketHandler.java @@ -420,6 +420,7 @@ public class PacketHandler implements IPacketHandler TEOrientable tileEntityOrientable = (TEOrientable) tileEntity; tileEntityOrientable.setInputDirection(ForgeDirection.getOrientation(dat.readInt())); tileEntityOrientable.setOutputDirection(ForgeDirection.getOrientation(dat.readInt())); + world.markBlockForRenderUpdate(x, y, z); } } else if (packet.channel.equals("TEPedestal")) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java new file mode 100644 index 00000000..d66ddcd9 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +public class TESpellBlock extends TEOrientable +{ + +} diff --git a/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png b/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..29c332d44a7c388db65717d41d73ca1467bde589 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-{=GkYWDJJ9mIWvY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zJ5YSBr;B5V#`&p}PVyc$;9+TZ>N8to)yuH+j@PRq)q6G?l2$zG&%7t3O<&^i+efBL z*r4Z(@W;y3$O#ivOz-@Ok}*Cn@IL+dnVW72&!iL>J{CF_ReP3vllv$(NnzpM!o>Y@ zOdIm&Bx_ygAXBTez;(T#M%;ZLfH>R&+0uygk{JUEcU%U3o zudjL^W`@Un=3P)^+BWg$-0HK;w_@y0oc>;4!}!xFt$SI@tm7abdAj{XE z)7O>#9-{=Gl*VE0e#rMLhV|<~O9AJXEvx$7(-@ zq_(vl{n}oQES{GdHm4U##46rB*S9#Co#~|v1Ea&Pc!kPpPm3+zy^3#eNQ*S2c(-qJ zy;pagli}O3Z5n<#oP~?56>kd6dcJtFMZ4kBi(68%kEeeP7Cn)yHb1yNShP%VmB~NiGP>fSd{p}U`M}XF3&sP>MwpDmh9eP@oaUOY0|oPf6IS7 hHLv;Eu&ZYOb?GMyYIIgvaNGuY*wfX|Wt~$(69DT1ffWD% literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png b/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png new file mode 100644 index 0000000000000000000000000000000000000000..524902475233dc3ce8b8ef7caef9a8814dfa1390 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-{=Gu+jVOJ?cOq+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VouR)5S4F{XE z)7O>#9-{=Gw4QNrRsv8+HZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a50aba4#PI6rk#q|hM)9_RVStm`Ju+iY++Xx*WmRg=2;y4Jy&77VV#G^B&$0`(ZXjY9jdseI!86f-N0K$f#Gp#|CCeSPEl#P#rj6`oYYb> zG-DQ4CO<1>3gE6TIm~EW+_L?7UQGQNuG?X=vU5(H^>na_S}xolHoLIJh+#fYXpqKt z#v5504`Zf&c=$8hWS0EYM=r_s9BY=Snj8ydZC^Jh+~m;{yRBcBaLZ5m@OR%ltyz_i T@}oOvg8b;|>gTe~DWM4fcj literal 0 HcmV?d00001 From 5dcef131dc1155a740ab52e0ac39b994d717c5f7 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 24 Jan 2014 18:07:13 -0500 Subject: [PATCH 05/33] Spell Work Finished the spell blocks enough to allow further expansion. Need to work on textures, as well as the orientation mechanics of the blocks. Also need to look at Vazkii's block renderer to verify a few feature additions. --- .../AlchemicalWizardry.java | 52 +++++++- .../BloodMagicConfiguration.java | 3 + .../alchemicalWizardry/ModBlocks.java | 6 + .../alchemicalWizardry/ModItems.java | 2 +- .../common/block/BlockHomHeart.java | 1 - .../common/block/BlockOrientable.java | 35 +---- .../common/block/BlockSpellEffect.java | 11 +- .../common/block/BlockSpellEnhancement.java | 45 +++++++ .../common/block/BlockSpellModifier.java | 44 +++++++ .../common/block/BlockSpellParadigm.java | 89 +++++++++++++ .../common/items/ItemBloodRuneBlock.java | 1 - .../common/items/ItemComplexSpellCrystal.java | 121 +++++++++++------- .../common/items/ItemSpellEffectBlock.java | 55 ++++++++ .../items/ItemSpellEnhancementBlock.java | 95 ++++++++++++++ .../common/items/ItemSpellModifierBlock.java | 51 ++++++++ .../common/items/ItemSpellParadigmBlock.java | 50 ++++++++ .../common/tileEntity/TEConduit.java | 14 +- .../common/tileEntity/TESpellBlock.java | 48 ++++++- .../common/tileEntity/TESpellEffectBlock.java | 19 +++ .../tileEntity/TESpellEnhancementBlock.java | 56 ++++++++ .../tileEntity/TESpellModifierBlock.java | 19 +++ .../tileEntity/TESpellParadigmBlock.java | 33 +++++ 22 files changed, 765 insertions(+), 85 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellModifierBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index d387cf35..ccd9190b 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -55,6 +55,10 @@ import WayofTime.alchemicalWizardry.common.entity.mob.EntityWaterElemental; import WayofTime.alchemicalWizardry.common.entity.mob.EntityWingedFireDemon; import WayofTime.alchemicalWizardry.common.items.ItemBloodRuneBlock; import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; import WayofTime.alchemicalWizardry.common.items.LifeBucket; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; @@ -80,6 +84,10 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import WayofTime.alchemicalWizardry.common.tileEntity.gui.GuiHandler; @@ -286,18 +294,21 @@ public class AlchemicalWizardry public static int blockConduitBlockID; public static int blockBloodLightBlockID; public static int blockSpellEffectBlockID; + public static int blockSpellParadigmBlockID; + public static int blockSpellModifierBlockID; + public static int blockSpellEnhancementBlockID; public static void registerRenderInformation() { } - ; + public static void registerRenderThings() { } - ; + // The instance of your mod that Forge uses. @Instance("AWWayofTime") @@ -655,12 +666,49 @@ public class AlchemicalWizardry GameRegistry.registerTileEntity(TETeleposer.class, "containerTeleposer"); GameRegistry.registerTileEntity(TEConduit.class, "containerConduit"); GameRegistry.registerTileEntity(TEOrientable.class, "containerOrientable"); + GameRegistry.registerTileEntity(TESpellParadigmBlock.class, "containerSpellParadigmBlock"); + GameRegistry.registerTileEntity(TESpellEffectBlock.class, "containerSpellEffectBlock"); + GameRegistry.registerTileEntity(TESpellModifierBlock.class, "containerSpellModifierBlock"); + GameRegistry.registerTileEntity(TESpellEnhancementBlock.class, "containerSpellEnhancementBlock"); // GameRegistry.registerBlock(ModBlocks.bloodRune, ItemBloodRuneBlock.class, "AlchemicalWizardry" + (ModBlocks.bloodRune.getUnlocalizedName().substring(5))); LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 0), "Blood Rune"); LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 1), "Rune of Augmented Capacity"); LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 2), "Rune of Dislocation"); LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 3), "Rune of the Orb"); + //TODO + + GameRegistry.registerBlock(ModBlocks.blockSpellParadigm, ItemSpellParadigmBlock.class, "AlchemicalWizardry" + (ModBlocks.blockSpellParadigm.getUnlocalizedName())); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 0), "Particle Generator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 1), "Self Augmentator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 2), "Melee Aggregator"); + + GameRegistry.registerBlock(ModBlocks.blockSpellEnhancement, ItemSpellEnhancementBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEnhancement.getUnlocalizedName())); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 0), "Unstable Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 1), "Standard Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 2), "Reinforced Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 3), "Imbued Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 4), "Demonic Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 5), "Unstable Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 6), "Standard Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 7), "Reinforced Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 8), "Imbued Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 9), "Demonic Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 10), "Unstable Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 11), "Standard Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 12), "Reinforced Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 13), "Imbued Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 14), "Demonic Spell Augmenter"); + + GameRegistry.registerBlock(ModBlocks.blockSpellModifier, ItemSpellModifierBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellModifier.getUnlocalizedName())); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 0), "Default Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 1), "Offensive Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 2), "Defensive Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 3), "Environmental Spell Modifier"); + + GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 0), "Crucible of Fire"); + GameRegistry.registerBlock(ModBlocks.speedRune, "speedRune"); LanguageRegistry.addName(ModBlocks.speedRune, "Speed Rune"); GameRegistry.registerBlock(ModBlocks.efficiencyRune, "efficiencyRune"); diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index e6c63b88..2be09e7e 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -84,6 +84,9 @@ public class BloodMagicConfiguration AlchemicalWizardry.blockBloodLightBlockID = config.getBlock("BloodLight", 1424).getInt(); AlchemicalWizardry.blockConduitBlockID = config.getBlock("BlockConduit", 1425).getInt(); AlchemicalWizardry.blockSpellEffectBlockID = config.getBlock("BlockSpellEffect", 1426).getInt(); + AlchemicalWizardry.blockSpellParadigmBlockID = config.getBlock("BlockSpellParadigm", 1427).getInt(); + AlchemicalWizardry.blockSpellModifierBlockID = config.getBlock("BlockSpellModifier", 1428).getInt(); + AlchemicalWizardry.blockSpellEnhancementBlockID = config.getBlock("BlockSpellEnhancement", 1429).getInt(); //Items AlchemicalWizardry.weakBloodOrbItemID = config.getItem("WeakBloodOrb", 17000).getInt(); AlchemicalWizardry.energyBlasterItemID = config.getItem("EnergyBlaster", 17001).getInt(); diff --git a/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java b/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java index 7a0bb761..8a123894 100644 --- a/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java +++ b/BM_src/WayofTime/alchemicalWizardry/ModBlocks.java @@ -42,6 +42,9 @@ public class ModBlocks public static Block blockConduit; public static Block blockBloodLight; public static Block blockSpellEffect; + public static Block blockSpellParadigm; + public static Block blockSpellModifier; + public static Block blockSpellEnhancement; public static void init() { @@ -73,5 +76,8 @@ public class ModBlocks blockConduit = new BlockConduit(AlchemicalWizardry.blockConduitBlockID); blockBloodLight = new BlockBloodLightSource(AlchemicalWizardry.blockBloodLightBlockID); blockSpellEffect = new BlockSpellEffect(AlchemicalWizardry.blockSpellEffectBlockID); + blockSpellParadigm = new BlockSpellParadigm(AlchemicalWizardry.blockSpellParadigmBlockID); + blockSpellModifier = new BlockSpellModifier(AlchemicalWizardry.blockSpellModifierBlockID); + blockSpellEnhancement = new BlockSpellEnhancement(AlchemicalWizardry.blockSpellEnhancementBlockID); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/ModItems.java b/BM_src/WayofTime/alchemicalWizardry/ModItems.java index 689d04b0..e7590fa7 100644 --- a/BM_src/WayofTime/alchemicalWizardry/ModItems.java +++ b/BM_src/WayofTime/alchemicalWizardry/ModItems.java @@ -90,7 +90,7 @@ public class ModItems public static Item armourInhibitor; public static Item creativeFiller; public static Item demonPlacer; - public static Item itemBloodRuneBlock; + public static Item weakFillingAgent; public static Item standardFillingAgent; public static Item enhancedFillingAgent; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java index 7a34a5bf..40d9be27 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java @@ -71,7 +71,6 @@ public class BlockHomHeart extends BlockContainer return false; } - BlockGrass d; ItemStack playerItem = player.getCurrentEquippedItem(); if (playerItem != null) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java index c9dee139..169f81be 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -15,16 +15,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockOrientable extends BlockContainer -{ - @SideOnly(Side.CLIENT) - private static Icon topIcon; - @SideOnly(Side.CLIENT) - private static Icon sideIcon1; - @SideOnly(Side.CLIENT) - private static Icon sideIcon2; - @SideOnly(Side.CLIENT) - private static Icon bottomIcon; - +{ @SideOnly(Side.CLIENT) private static Icon[] fireIcons; @@ -41,17 +32,12 @@ public class BlockOrientable extends BlockContainer @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister iconRegister) - { - this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); - this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); - this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); - this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); - + { this.fireIcons = this.registerIconsWithString(iconRegister, "fireEffectBlock"); } @SideOnly(Side.CLIENT) - public Icon[] registerIconsWithString(IconRegister iconRegister, String blockString) + public static Icon[] registerIconsWithString(IconRegister iconRegister, String blockString) { Icon[] icons = new Icon[7]; @@ -70,20 +56,11 @@ public class BlockOrientable extends BlockContainer @SideOnly(Side.CLIENT) public Icon getIcon(int side, int meta) { + Icon[] icons = this.getIconsForMeta(meta); switch (side) { - case 0: - return bottomIcon; - - case 1: - return topIcon; - - //case 2: return sideIcon1; - //case 3: return sideIcon1; - //case 4: return sideIcon2; - //case 5: return sideIcon2; - default: - return sideIcon2; + case 4: return icons[1]; + default: return icons[6]; } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java index f2b38a82..dd940132 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -1,12 +1,21 @@ package WayofTime.alchemicalWizardry.common.block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; + public class BlockSpellEffect extends BlockOrientable { - public BlockSpellEffect(int id) { super(id); setUnlocalizedName("blockSpellEffect"); } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TESpellEffectBlock(); + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java new file mode 100644 index 00000000..3d166d8e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; + + +public class BlockSpellEnhancement extends BlockOrientable +{ + public BlockSpellEnhancement(int id) + { + super(id); + setUnlocalizedName("blockSpellEnhancement"); + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TESpellEnhancementBlock(); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.blockID == ModBlocks.blockSpellEnhancement.blockID) + { + for(int i=0; i<15; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java new file mode 100644 index 00000000..1b8fb41e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java @@ -0,0 +1,44 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; + + +public class BlockSpellModifier extends BlockOrientable +{ + public BlockSpellModifier(int id) + { + super(id); + setUnlocalizedName("blockSpellModifier"); + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TESpellModifierBlock(); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.blockID == ModBlocks.blockSpellModifier.blockID) + { + for(int i=0; i<4; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java new file mode 100644 index 00000000..ad69671d --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -0,0 +1,89 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.items.BlankSpell; +import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSpellParadigm extends BlockOrientable +{ + Icon[] projectileIcons = new Icon[7]; + + public BlockSpellParadigm(int id) + { + super(id); + setUnlocalizedName("blockSpellParadigm"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + this.projectileIcons = this.registerIconsWithString(iconRegister, "projectileParadigmBlock"); + } + +// @Override +// public Icon[] getIconsForMeta(int metadata) +// { +// return this.projectileIcons; +// } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TESpellParadigmBlock(); + } + + @SideOnly(Side.CLIENT) + + /** + * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) + */ + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.blockID == ModBlocks.blockSpellParadigm.blockID) + { + par3List.add(new ItemStack(par1, 1, 0)); + par3List.add(new ItemStack(par1, 1, 1)); + par3List.add(new ItemStack(par1, 1, 2)); + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) + { + ItemStack stack = player.getCurrentEquippedItem(); + + if(stack != null && stack.getItem() instanceof ItemComplexSpellCrystal) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound itemTag = stack.stackTagCompound; + itemTag.setInteger("xCoord", x); + itemTag.setInteger("yCoord", y); + itemTag.setInteger("zCoord", z); + itemTag.setInteger("dimensionId", world.provider.dimensionId); + return true; + } + + return super.onBlockActivated(world, x, y, z, player, side, what, these, are); + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java index bd4e36ba..5d890264 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java @@ -7,7 +7,6 @@ public class ItemBloodRuneBlock extends ItemBlock { public ItemBloodRuneBlock(int par1) - { super(par1); setHasSubtypes(true); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java index 58ebedef..fe4ece59 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java @@ -1,49 +1,52 @@ package WayofTime.alchemicalWizardry.common.items; -import java.util.List; - +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.common.spell.complex.SpellModifierOffensive; -import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; -import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; -import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPotency; -import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPower; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import net.minecraftforge.common.DimensionManager; -public class ItemComplexSpellCrystal extends EnergyItems +import java.util.List; + +public class ItemComplexSpellCrystal extends EnergyItems { - - public ItemComplexSpellCrystal(int id) - { - super(id); - this.maxStackSize = 1; - //setMaxDamage(1000); - setEnergyUsed(50); - setCreativeTab(AlchemicalWizardry.tabBloodMagic); - } - - @Override - public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + public ItemComplexSpellCrystal(int par1) { - par3List.add("I feel lighter already..."); - - if (!(par1ItemStack.stackTagCompound == null)) - { - par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); - } + super(par1); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); } - - @Override + + @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister iconRegister) { - this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:AirSigil"); + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BlankSpell"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Crystal of infinite possibilities."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } } @Override @@ -56,18 +59,50 @@ public class ItemComplexSpellCrystal extends EnergyItems return par1ItemStack; } - if(par2World.isRemote) + if (!par2World.isRemote) { - return par1ItemStack; - } - - SpellParadigm parad = new SpellParadigmSelf(); - parad.addBufferedEffect(new SpellEffectFire()); - parad.modifyBufferedEffect(new SpellModifierOffensive()); - parad.applyEnhancement(new SpellEnhancementPower()); - parad.applyEnhancement(new SpellEnhancementPotency()); - parad.castSpell(par2World, par3EntityPlayer, par1ItemStack); + //World world = MinecraftServer.getServer().worldServers[getDimensionID(par1ItemStack)]; + World world = DimensionManager.getWorld(getDimensionID(par1ItemStack)); + if (world != null) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + TileEntity tileEntity = world.getBlockTileEntity(itemTag.getInteger("xCoord"), itemTag.getInteger("yCoord"), itemTag.getInteger("zCoord")); + + if (tileEntity instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileParad = (TESpellParadigmBlock) tileEntity; + + tileParad.castSpell(par2World, par3EntityPlayer, par1ItemStack); + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); +// if (!par2World.isRemote) +// { +// //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); +// par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 10)); +// } return par1ItemStack; } + + public int getDimensionID(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.stackTagCompound.getInteger("dimensionId"); + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java new file mode 100644 index 00000000..4f3b6f20 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java @@ -0,0 +1,55 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellEffectBlock extends ItemBlock + +{ + public ItemSpellEffectBlock(int par1) + { + super(par1); + setHasSubtypes(true); + this.setUnlocalizedName("itemSpellEffectBlock"); + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "fire"; + break; + } + + case 1: + { + name = "fill"; + break; + } + + case 2: + name = "empty"; + break; + + case 3: + name = "test"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java new file mode 100644 index 00000000..873b4163 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java @@ -0,0 +1,95 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellEnhancementBlock extends ItemBlock + +{ + public ItemSpellEnhancementBlock(int par1) + { + super(par1); + setHasSubtypes(true); + this.setUnlocalizedName("itemSpellEnhancementBlock"); + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + name = "power1"; + break; + + case 1: + name = "power2"; + break; + + case 2: + name = "power3"; + break; + + case 3: + name = "power4"; + break; + + case 4: + name = "power5"; + break; + + case 5: + name = "cost1"; + break; + + case 6: + name = "cost2"; + break; + + case 7: + name = "cost3"; + break; + + case 8: + name = "cost4"; + break; + + case 9: + name = "cost5"; + break; + + case 10: + name = "potency1"; + break; + + case 11: + name = "potency2"; + break; + + case 12: + name = "potency3"; + break; + + case 13: + name = "potency4"; + break; + + case 14: + name = "potency5"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java new file mode 100644 index 00000000..71e5e46e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java @@ -0,0 +1,51 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellModifierBlock extends ItemBlock + +{ + public ItemSpellModifierBlock(int par1) + { + super(par1); + setHasSubtypes(true); + this.setUnlocalizedName("itemSpellModifierBlock"); + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "power"; + break; + } + + case 1: + { + name = "efficiency"; + break; + } + + case 2: + name = "potency"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java new file mode 100644 index 00000000..934120d8 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java @@ -0,0 +1,50 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellParadigmBlock extends ItemBlock + +{ + public ItemSpellParadigmBlock(int par1) + { + super(par1); + setHasSubtypes(true); + this.setUnlocalizedName("itemSpellParadigmBlock"); + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "projectile"; + break; + } + + case 1: + { + name = "self"; + break; + } + + case 2: + name = "melee"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + { + return par1; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java index d8b4a426..59f375c0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java @@ -1,10 +1,11 @@ package WayofTime.alchemicalWizardry.common.tileEntity; import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; -public class TEConduit extends TEOrientable +public class TEConduit extends TESpellBlock { @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound) @@ -22,10 +23,7 @@ public class TEConduit extends TEOrientable @Override public void updateEntity() { - //this.capacity=(int) (10000*this.capacityMultiplier); -// if (!worldObj.isRemote && worldObj.getWorldTime() % 20 == 0) -// { -// } + } @Override @@ -33,4 +31,10 @@ public class TEConduit extends TEOrientable { return PacketHandler.getBlockOrientationPacket(this); } + + @Override + protected void applySpellChange(SpellParadigm parad) + { + return; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java index d66ddcd9..b4bae067 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java @@ -1,6 +1,50 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -public class TESpellBlock extends TEOrientable -{ +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; +public abstract class TESpellBlock extends TEOrientable +{ + public void modifySpellParadigm(SpellParadigm parad) + { + this.applySpellChange(parad); + TileEntity tile = this.getTileAtOutput(); + if(tile instanceof TESpellBlock) + { + TESpellBlock outputBlock = (TESpellBlock)tile; + outputBlock.modifySpellParadigm(parad); + } + } + + protected abstract void applySpellChange(SpellParadigm parad); + + public TESpellBlock getTileAtOutput() + { + ForgeDirection output = this.getOutputDirection(); + int xOffset = output.offsetX; + int yOffset = output.offsetY; + int zOffset = output.offsetZ; + + TileEntity tile = worldObj.getBlockTileEntity(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset); + + if(tile instanceof TESpellBlock && ((TESpellBlock)tile).canInputRecieveOutput(output)) + { + return (TESpellBlock)tile; + } + + return null; + } + + public boolean canInputRecieve() + { + return true; + } + + public boolean canInputRecieveOutput(ForgeDirection output) + { + return this.canInputRecieve() && this.getInputDirection().getOpposite()==output; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java new file mode 100644 index 00000000..675cb6a2 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java @@ -0,0 +1,19 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; + +public class TESpellEffectBlock extends TESpellBlock +{ + @Override + protected void applySpellChange(SpellParadigm parad) + { + parad.addBufferedEffect(this.getSpellEffect()); + } + + public SpellEffect getSpellEffect() + { + return new SpellEffectFire(); + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java new file mode 100644 index 00000000..3f7a981c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java @@ -0,0 +1,56 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementCost; + +public class TESpellEnhancementBlock extends TESpellBlock +{ + @Override + protected void applySpellChange(SpellParadigm parad) + { + int i = -1; + + switch(this.enhancementType()) + { + case 0: + i = parad.getBufferedEffectPower(); + break; + case 1: + i = parad.getBufferedEffectCost(); + break; + case 2: + i = parad.getBufferedEffectPotency(); + break; + } + + if(i!=-1 && i Date: Sat, 25 Jan 2014 09:22:59 -0500 Subject: [PATCH 06/33] Spell Work Need to work on how the EntitySpellProjectile saves its data. Does not work properly. Perhaps it was not registered? --- .../BloodMagicConfiguration.java | 3 +- .../client/ClientProxy.java | 2 + .../common/CommonProxy.java | 19 ++++- .../common/block/BlockConduit.java | 42 +---------- .../common/block/BlockOrientable.java | 64 +++++++++++----- .../spell/complex/EntitySpellProjectile.java | 73 ++++++++++++------- .../common/spell/complex/SpellParadigm.java | 2 +- .../complex/SpellParadigmProjectile.java | 13 ++++ .../spell/complex/SpellParadigmSelf.java | 46 ++++++++++++ .../spell/complex/effect/SpellEffect.java | 46 ++++++++++++ .../spell/complex/effect/SpellEffectFire.java | 4 +- .../IProjectileImpactEffect.java | 3 +- .../impactEffects/ProjectileDefaultFire.java | 33 +++++++++ .../impactEffects/ProjectileImpactEffect.java | 15 ++++ .../tileEntity/TESpellParadigmBlock.java | 41 ++++++++++- 15 files changed, 314 insertions(+), 92 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 2be09e7e..7f864162 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -174,8 +174,7 @@ public class BloodMagicConfiguration AlchemicalWizardry.focusGravityWellItemID = config.getItem("FocusGravityWell", 17077).getInt(); AlchemicalWizardry.sigilOfMagnetismItemID = config.getItem("SigilOfMagnetism", 17080).getInt(); AlchemicalWizardry.itemComplexSpellCrystalItemID = config.getItem("ComplexSpellCrystal",17081).getInt(); - - + } catch (Exception e) { diff --git a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java index c5ccd93b..9fadd55d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -14,6 +14,7 @@ import WayofTime.alchemicalWizardry.common.renderer.model.*; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBazookaMainProjectile; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBlastProjectile; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderMeteor; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; import WayofTime.alchemicalWizardry.common.tileEntity.*; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; @@ -32,6 +33,7 @@ public class ClientProxy extends CommonProxy //altarRenderType = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerEntityRenderingHandler(EnergyBlastProjectile.class, new RenderEnergyBlastProjectile()); RenderingRegistry.registerEntityRenderingHandler(EntityEnergyBazookaMainProjectile.class, new RenderEnergyBazookaMainProjectile()); + RenderingRegistry.registerEntityRenderingHandler(EntitySpellProjectile.class, new RenderEnergyBlastProjectile()); RenderingRegistry.registerEntityRenderingHandler(EntityMeteor.class, new RenderMeteor()); //EntityRegistry.registerGlobalEntityID(EntityFallenAngel.class, "AlchemicalWizardry.FallenAngel", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); RenderingRegistry.registerEntityRenderingHandler(EntityFallenAngel.class, new RenderFallenAngel(new ModelFallenAngel(), 0.5F)); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/CommonProxy.java b/BM_src/WayofTime/alchemicalWizardry/common/CommonProxy.java index 262506d6..43c7b129 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/CommonProxy.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/CommonProxy.java @@ -1,12 +1,26 @@ package WayofTime.alchemicalWizardry.common; +import net.minecraft.world.World; import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.common.entity.projectile.*; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityBloodLightProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaSecondaryProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; +import WayofTime.alchemicalWizardry.common.entity.projectile.ExplosionProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.FireProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.IceProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.LightningBoltProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.MudProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.TeleportProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WaterProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WindGustProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import net.minecraft.world.World; public class CommonProxy { @@ -63,6 +77,7 @@ public class CommonProxy EntityRegistry.registerModEntity(EntityEnergyBazookaSecondaryProjectile.class, "energyBazookaSecondary", 11, AlchemicalWizardry.instance, 128, 3, true); EntityRegistry.registerModEntity(EntityBloodLightProjectile.class, "bloodLightProjectile", 12, AlchemicalWizardry.instance, 128, 3, true); EntityRegistry.registerModEntity(EntityMeteor.class, "Meteor", 13, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntitySpellProjectile.class, "spellProjectile", 14, AlchemicalWizardry.instance, 128, 3, true); } public void registerTickHandlers() diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java index 18fe8099..1072bc8d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockConduit.java @@ -14,7 +14,7 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockConduit extends BlockContainer +public class BlockConduit extends BlockOrientable { @SideOnly(Side.CLIENT) private static Icon topIcon; @@ -27,7 +27,7 @@ public class BlockConduit extends BlockContainer public BlockConduit(int id) { - super(id, Material.rock); + super(id); setHardness(2.0F); setResistance(5.0F); setCreativeTab(AlchemicalWizardry.tabBloodMagic); @@ -66,44 +66,6 @@ public class BlockConduit extends BlockContainer } } - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) - { - if (world.isRemote) - { - return false; - } - - ForgeDirection sideClicked = ForgeDirection.getOrientation(side); - TileEntity tile = world.getBlockTileEntity(x, y, z); - - if (tile instanceof TEOrientable) - { - //TODO NEEDS WORK - if (((TEOrientable) tile).getInputDirection().equals(sideClicked)) - { - ((TEOrientable) tile).setInputDirection(((TEConduit) tile).getOutputDirection()); - ((TEOrientable) tile).setOutputDirection(sideClicked); - } else if (((TEOrientable) tile).getOutputDirection().equals(sideClicked)) - { - ((TEOrientable) tile).setOutputDirection(((TEConduit) tile).getInputDirection()); - ((TEOrientable) tile).setInputDirection(sideClicked); - } else - { - if (!player.isSneaking()) - { - ((TEOrientable) tile).setOutputDirection(sideClicked); - } else - { - ((TEOrientable) tile).setOutputDirection(sideClicked.getOpposite()); - } - } - } - - world.markBlockForUpdate(x, y, z); - return true; - } - @Override public void breakBlock(World world, int x, int y, int z, int par5, int par6) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java index 169f81be..42c455d2 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -105,6 +105,7 @@ public class BlockOrientable extends BlockContainer @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) { + //Right-click orients the output face. Shift-right-click orients the input face. if (world.isRemote) { return false; @@ -115,25 +116,44 @@ public class BlockOrientable extends BlockContainer if (tile instanceof TEOrientable) { - //TODO NEEDS WORK - if (((TEOrientable) tile).getInputDirection().equals(sideClicked)) - { - ((TEOrientable) tile).setInputDirection(((TEOrientable) tile).getOutputDirection()); - ((TEOrientable) tile).setOutputDirection(sideClicked); - } else if (((TEOrientable) tile).getOutputDirection().equals(sideClicked)) - { - ((TEOrientable) tile).setOutputDirection(((TEOrientable) tile).getInputDirection()); - ((TEOrientable) tile).setInputDirection(sideClicked); - } else - { - if (!player.isSneaking()) - { - ((TEOrientable) tile).setOutputDirection(sideClicked); - } else - { - ((TEOrientable) tile).setOutputDirection(sideClicked.getOpposite()); - } - } + TEOrientable newTile = (TEOrientable)tile; + if(player.isSneaking()) + { + int nextSide = TEOrientable.getIntForForgeDirection(newTile.getInputDirection())+1; + + if(nextSide>5) + { + nextSide = 0; + } + if(ForgeDirection.getOrientation(nextSide)==newTile.getOutputDirection()) + { + nextSide++; + if(nextSide>5) + { + nextSide = 0; + } + } + + newTile.setInputDirection(ForgeDirection.getOrientation(nextSide)); + }else + { + int nextSide = TEOrientable.getIntForForgeDirection(newTile.getOutputDirection())+1; + + if(nextSide>5) + { + nextSide = 0; + } + if(ForgeDirection.getOrientation(nextSide)==newTile.getInputDirection()) + { + nextSide++; + if(nextSide>5) + { + nextSide = 0; + } + } + + newTile.setOutputDirection(ForgeDirection.getOrientation(nextSide)); + } } world.markBlockForUpdate(x, y, z); @@ -221,4 +241,10 @@ public class BlockOrientable extends BlockContainer return 0; } + + @Override + public int damageDropped(int metadata) + { + return metadata; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index 743dfb5d..46f57975 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -5,18 +5,10 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileImpactEffect; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileUpdateEffect; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.IProjectile; -import net.minecraft.entity.boss.EntityWither; -import net.minecraft.entity.monster.EntityGhast; -import net.minecraft.entity.monster.EntityPigZombie; -import net.minecraft.entity.monster.EntitySkeleton; -import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; @@ -26,6 +18,9 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileImpactEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileUpdateEffect; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -50,6 +45,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile private boolean penetration = false; public List updateEffectList = new ArrayList(); public List effectList = new LinkedList(); + public List spellEffectList = new LinkedList(); public EntitySpellProjectile(World par1World) { @@ -81,6 +77,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile motionZ = MathHelper.cos(rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float)Math.PI); motionY = -MathHelper.sin(rotationPitch / 180.0F * (float)Math.PI); this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + } @Override @@ -272,19 +269,23 @@ public class EntitySpellProjectile extends Entity implements IProjectile NBTTagList effectList = new NBTTagList(); - for (String str : this.effectList) - { - if (str != null) - { - NBTTagCompound tag = new NBTTagCompound(); + for(SpellEffect eff : spellEffectList) + { + effectList.appendTag(eff.getTag()); + } + +// for (String str : this.effectList) +// { +// if (str != null) +// { +// NBTTagCompound tag = new NBTTagCompound(); +// +// tag.setString("Class", str); +// effectList.appendTag(tag); +// } +// } - tag.setString("Class", str); - effectList.appendTag(tag); - } - } - - par1NBTTagCompound.setTag("Effects", effectList); - + par1NBTTagCompound.setTag("Effects", effectList); } /** @@ -301,15 +302,32 @@ public class EntitySpellProjectile extends Entity implements IProjectile inGround = par1NBTTagCompound.getByte("inGround") == 1; NBTTagList tagList = par1NBTTagCompound.getTagList("Effects"); - this.effectList = new LinkedList(); - for (int i = 0; i < tagList.tagCount(); i++) + + List spellEffectList = new LinkedList(); + for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); - this.effectList.add(tag.getString("Class")); + SpellEffect eff = SpellEffect.getEffectFromTag(tag); + if(eff!=null) + { + spellEffectList.add(eff); + } } + this.spellEffectList = spellEffectList; + + +// this.effectList = new LinkedList(); +// for (int i = 0; i < tagList.tagCount(); i++) +// { +// NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); +// +// this.effectList.add(tag.getString("Class")); +// } - SpellParadigmProjectile parad = SpellParadigmProjectile.getParadigmForStringArray(effectList); + //SpellParadigmProjectile parad = SpellParadigmProjectile.getParadigmForStringArray(effectList); + SpellParadigmProjectile parad = SpellParadigmProjectile.getParadigmForEffectArray(spellEffectList); + parad.applyAllSpellEffects(); parad.prepareProjectile(this); } @@ -514,7 +532,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile { for(IProjectileImpactEffect impactEffect : impactList) { - impactEffect.onTileImpact(mop); + impactEffect.onTileImpact(worldObj, mop); } } } @@ -549,4 +567,9 @@ public class EntitySpellProjectile extends Entity implements IProjectile { this.effectList = stringList; } + + public void setSpellEffectList(List list) + { + this.spellEffectList = list; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java index 893d3ae7..025d188c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java @@ -13,7 +13,7 @@ import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhanc public abstract class SpellParadigm { protected List bufferedEffectList = new ArrayList(); - protected List effectList = new LinkedList(); + public List effectList = new LinkedList(); public void addBufferedEffect(SpellEffect effect) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java index c0be55c6..d3f83d85 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java @@ -86,6 +86,18 @@ public class SpellParadigmProjectile extends SpellParadigm return parad; } + public static SpellParadigmProjectile getParadigmForEffectArray(List effectList) + { + SpellParadigmProjectile parad = new SpellParadigmProjectile(); + + for(SpellEffect eff : effectList) + { + parad.addBufferedEffect(eff); + } + + return parad; + } + public void prepareProjectile(EntitySpellProjectile proj) { proj.setDamage(damage); @@ -94,6 +106,7 @@ public class SpellParadigmProjectile extends SpellParadigm proj.setPenetration(penetration); proj.setEffectList(effectList); proj.setRicochetMax(ricochetMax); + proj.setSpellEffectList(bufferedEffectList); } public void addImpactEffect(IProjectileImpactEffect eff) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java index c246a94b..4726ddb3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ISelfSpellEffect; import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; import net.minecraft.entity.player.EntityPlayer; @@ -53,4 +54,49 @@ public class SpellParadigmSelf extends SpellParadigm { return 100; } + + public static SpellParadigmSelf getParadigmForStringArray(List stringList) + { + SpellParadigmSelf parad = new SpellParadigmSelf(); + + try + { + for(String str : stringList) + { + Class clazz = Class.forName(str); + if(clazz!=null) + { + Object obj = clazz.newInstance(); + + if(obj instanceof SpellEffect) + { + parad.addBufferedEffect((SpellEffect)obj); + continue; + } + if(obj instanceof SpellModifier) + { + parad.modifyBufferedEffect((SpellModifier)obj); + continue; + } + if(obj instanceof SpellEnhancement) + { + parad.applyEnhancement((SpellEnhancement)obj); + continue; + } + } + } + + } catch (InstantiationException e) { + + e.printStackTrace(); + } catch (IllegalAccessException e) { + + e.printStackTrace(); + } catch (ClassNotFoundException e) { + + e.printStackTrace(); + } + + return parad; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java index 9ae235a4..3ecd7438 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; +import net.minecraft.nbt.NBTTagCompound; import WayofTime.alchemicalWizardry.common.spell.complex.SpellModifier; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; @@ -169,4 +170,49 @@ public abstract class SpellEffect { return this.potencyEnhancement; } + + public NBTTagCompound getTag() + { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setString("Class", this.getClass().getName()); + tag.setInteger("power", powerEnhancement); + tag.setInteger("cost", costEnhancement); + tag.setInteger("potency", potencyEnhancement); + + return tag; + } + + public static SpellEffect getEffectFromTag(NBTTagCompound tag) + { + try { + Class clazz = Class.forName(tag.getString("Class")); + if(clazz !=null) + { + try { + Object obj = clazz.newInstance(); + if(obj instanceof SpellEffect) + { + SpellEffect eff = (SpellEffect) obj; + + eff.powerEnhancement = tag.getInteger("power"); + eff.costEnhancement = tag.getInteger("cost"); + eff.potencyEnhancement = tag.getInteger("potency"); + + return eff; + } + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index 4683aeb0..f4435fab 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; @@ -13,7 +14,8 @@ public class SpellEffectFire extends SpellEffect @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java index d2b347ad..2f2cbf92 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java @@ -2,9 +2,10 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; import net.minecraft.entity.Entity; import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; public interface IProjectileImpactEffect { public void onEntityImpact(Entity mop); - public void onTileImpact(MovingObjectPosition mop); + public void onTileImpact(World world, MovingObjectPosition mop); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java new file mode 100644 index 00000000..feedf4d6 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ProjectileDefaultFire extends ProjectileImpactEffect +{ + public ProjectileDefaultFire(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop) + { + mop.setFire((int)Math.pow(2,this.powerUpgrades)); + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + if(world.isAirBlock(x, y+1, z)) + { + world.setBlock(x, y+1, z, Block.fire.blockID); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java new file mode 100644 index 00000000..7ffbe1d8 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +public abstract class ProjectileImpactEffect implements IProjectileImpactEffect +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public ProjectileImpactEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java index 1486bf76..9599d01a 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java @@ -1,15 +1,27 @@ package WayofTime.alchemicalWizardry.common.tileEntity; +import java.util.List; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatMessageComponent; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; public class TESpellParadigmBlock extends TESpellBlock { public SpellParadigm getSpellParadigm() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + switch(meta) + { + case 0: return new SpellParadigmProjectile(); + case 1: return new SpellParadigmSelf(); + case 2: return new SpellParadigmMelee(); + } return new SpellParadigmSelf(); } @@ -28,6 +40,33 @@ public class TESpellParadigmBlock extends TESpellBlock { SpellParadigm parad = this.getSpellParadigm(); this.modifySpellParadigm(parad); - parad.castSpell(world, entity, spellCasterStack); +// if(parad instanceof SpellParadigmSelf) +// { +// List stringList = parad.effectList; +// SpellParadigmSelf spellParadSelf = SpellParadigmSelf.getParadigmForStringArray(stringList); +// for(String str : stringList) +// { +// ChatMessageComponent chat = new ChatMessageComponent(); +// chat.addText(str); +// entity.sendChatToPlayer(chat); +// } +// spellParadSelf.castSpell(world, entity, spellCasterStack); +// } +// else if(parad instanceof SpellParadigmProjectile) +// { +// List stringList = parad.effectList; +// SpellParadigmProjectile spellParadSelf = SpellParadigmProjectile.getParadigmForStringArray(stringList); +// for(String str : stringList) +// { +// ChatMessageComponent chat = new ChatMessageComponent(); +// chat.addText(str); +// entity.sendChatToPlayer(chat); +// } +// spellParadSelf.castSpell(world, entity, spellCasterStack); +// }else + { + parad.castSpell(world, entity, spellCasterStack); + } + } } From eb46185dc8247e12eb2f590c9b5cbf35e0826a1e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 25 Jan 2014 14:41:50 -0500 Subject: [PATCH 07/33] Fixed the projectile so that it actually work Amazing, eh? --- .../spell/complex/EntitySpellProjectile.java | 7 +- .../complex/SpellParadigmProjectile.java | 73 +++++-------------- .../spell/complex/SpellParadigmSelf.java | 44 ----------- .../spell/complex/effect/SpellEffect.java | 3 + .../spell/complex/effect/SpellEffectFire.java | 11 ++- .../{ => fire}/ProjectileDefaultFire.java | 19 ++++- .../tileEntity/TESpellEnhancementBlock.java | 48 +++++++++++- .../tileEntity/TESpellParadigmBlock.java | 1 + 8 files changed, 93 insertions(+), 113 deletions(-) rename BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/{ => fire}/ProjectileDefaultFire.java (63%) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index 46f57975..b4dcd944 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -12,6 +12,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatMessageComponent; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumMovingObjectType; import net.minecraft.util.MathHelper; @@ -44,7 +45,6 @@ public class EntitySpellProjectile extends Entity implements IProjectile public List impactList = new ArrayList(); private boolean penetration = false; public List updateEffectList = new ArrayList(); - public List effectList = new LinkedList(); public List spellEffectList = new LinkedList(); public EntitySpellProjectile(World par1World) @@ -563,11 +563,6 @@ public class EntitySpellProjectile extends Entity implements IProjectile this.damage = damage; } - public void setEffectList(List stringList) - { - this.effectList = stringList; - } - public void setSpellEffectList(List list) { this.spellEffectList = list; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java index d3f83d85..7c81d8aa 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java @@ -1,7 +1,6 @@ package WayofTime.alchemicalWizardry.common.spell.complex; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; @@ -12,17 +11,29 @@ import WayofTime.alchemicalWizardry.common.items.EnergyItems; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileImpactEffect; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileUpdateEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; public class SpellParadigmProjectile extends SpellParadigm { - public DamageSource damageSource = DamageSource.generic; - public float damage = 1; - public int cost = 0; - public List impactList = new ArrayList(); - public List updateEffectList = new ArrayList(); - public boolean penetration = false; - public int ricochetMax = 0; + public DamageSource damageSource; + public float damage; + public int cost; + public List impactList; + public List updateEffectList; + public boolean penetration; + public int ricochetMax; + + public SpellParadigmProjectile() + { + this.damageSource = DamageSource.generic; + this.damage = 1; + this.cost = 0; + this.impactList = new ArrayList(); + this.updateEffectList = new ArrayList(); + this.penetration = false; + this.ricochetMax = 0; + } @Override public void enhanceParadigm(SpellEnhancement enh) @@ -41,51 +52,6 @@ public class SpellParadigmProjectile extends SpellParadigm EnergyItems.syphonBatteries(itemStack, entityPlayer, cost); } - public static SpellParadigmProjectile getParadigmForStringArray(List stringList) - { - SpellParadigmProjectile parad = new SpellParadigmProjectile(); - - try - { - for(String str : stringList) - { - Class clazz = Class.forName(str); - if(clazz!=null) - { - Object obj = clazz.newInstance(); - - if(obj instanceof SpellEffect) - { - parad.addBufferedEffect((SpellEffect)obj); - continue; - } - if(obj instanceof SpellModifier) - { - parad.modifyBufferedEffect((SpellModifier)obj); - continue; - } - if(obj instanceof SpellEnhancement) - { - parad.applyEnhancement((SpellEnhancement)obj); - continue; - } - } - } - - } catch (InstantiationException e) { - - e.printStackTrace(); - } catch (IllegalAccessException e) { - - e.printStackTrace(); - } catch (ClassNotFoundException e) { - - e.printStackTrace(); - } - - return parad; - } - public static SpellParadigmProjectile getParadigmForEffectArray(List effectList) { SpellParadigmProjectile parad = new SpellParadigmProjectile(); @@ -104,7 +70,6 @@ public class SpellParadigmProjectile extends SpellParadigm proj.setImpactList(impactList); proj.setUpdateEffectList(updateEffectList); proj.setPenetration(penetration); - proj.setEffectList(effectList); proj.setRicochetMax(ricochetMax); proj.setSpellEffectList(bufferedEffectList); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java index 4726ddb3..94a7186a 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java @@ -55,48 +55,4 @@ public class SpellParadigmSelf extends SpellParadigm return 100; } - public static SpellParadigmSelf getParadigmForStringArray(List stringList) - { - SpellParadigmSelf parad = new SpellParadigmSelf(); - - try - { - for(String str : stringList) - { - Class clazz = Class.forName(str); - if(clazz!=null) - { - Object obj = clazz.newInstance(); - - if(obj instanceof SpellEffect) - { - parad.addBufferedEffect((SpellEffect)obj); - continue; - } - if(obj instanceof SpellModifier) - { - parad.modifyBufferedEffect((SpellModifier)obj); - continue; - } - if(obj instanceof SpellEnhancement) - { - parad.applyEnhancement((SpellEnhancement)obj); - continue; - } - } - } - - } catch (InstantiationException e) { - - e.printStackTrace(); - } catch (IllegalAccessException e) { - - e.printStackTrace(); - } catch (ClassNotFoundException e) { - - e.printStackTrace(); - } - - return parad; - } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java index 3ecd7438..7a090649 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java @@ -20,6 +20,7 @@ public abstract class SpellEffect this.modifierState = SpellModifier.DEFAULT; this.powerEnhancement = 0; this.costEnhancement = 0; + this.potencyEnhancement = 0; } public void enhanceEffect(SpellEnhancement enh) @@ -176,6 +177,7 @@ public abstract class SpellEffect NBTTagCompound tag = new NBTTagCompound(); tag.setString("Class", this.getClass().getName()); + tag.setInteger("modifier", modifierState); tag.setInteger("power", powerEnhancement); tag.setInteger("cost", costEnhancement); tag.setInteger("potency", potencyEnhancement); @@ -195,6 +197,7 @@ public abstract class SpellEffect { SpellEffect eff = (SpellEffect) obj; + eff.modifierState = tag.getInteger("modifier"); eff.powerEnhancement = tag.getInteger("power"); eff.costEnhancement = tag.getInteger("cost"); eff.potencyEnhancement = tag.getInteger("potency"); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index f4435fab..65fe51f7 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -3,7 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; @@ -22,21 +22,24 @@ public class SpellEffectFire extends SpellEffect public void offensiveModificationProjectile(SpellParadigmProjectile parad) { // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefaultFire.java similarity index 63% rename from BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java rename to BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefaultFire.java index feedf4d6..435e3c72 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileDefaultFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefaultFire.java @@ -1,5 +1,6 @@ -package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.util.MovingObjectPosition; @@ -24,10 +25,20 @@ public class ProjectileDefaultFire extends ProjectileImpactEffect int x = mop.blockX; int y = mop.blockY; int z = mop.blockZ; - - if(world.isAirBlock(x, y+1, z)) + int range = 0; + for(int i=-range; i<=range;i++) { - world.setBlock(x, y+1, z, Block.fire.blockID); + for(int j=-range; j<=range;j++) + { + for(int k=-range; k<=range; k++) + { + if(world.isAirBlock(x+i, y+j, z+k)) + { + world.setBlock(x+i, y+j, z+k, Block.fire.blockID); + } + } + } } + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java index 3f7a981c..e6110498 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java @@ -3,6 +3,8 @@ package WayofTime.alchemicalWizardry.common.tileEntity; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementCost; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPotency; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPower; public class TESpellEnhancementBlock extends TESpellBlock { @@ -36,6 +38,28 @@ public class TESpellEnhancementBlock extends TESpellBlock public SpellEnhancement getSpellEnhancement() { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + switch(meta) + { + case 0: + case 1: + case 2: + case 3: + case 4: + return new SpellEnhancementPower(); + case 5: + case 6: + case 7: + case 8: + case 9: + return new SpellEnhancementCost(); + case 10: + case 11: + case 12: + case 13: + case 14: + return new SpellEnhancementPotency(); + } return new SpellEnhancementCost(); } @@ -46,7 +70,29 @@ public class TESpellEnhancementBlock extends TESpellBlock public int enhancementType() //0 is power, 1 is cost, 2 is potency { - return 0; + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + switch(meta) + { + case 0: + case 1: + case 2: + case 3: + case 4: + return 0; + case 5: + case 6: + case 7: + case 8: + case 9: + return 1; + case 10: + case 11: + case 12: + case 13: + case 14: + return 2; + } + return 1; } public void doBadStuff() diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java index 9599d01a..73b39124 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java @@ -65,6 +65,7 @@ public class TESpellParadigmBlock extends TESpellBlock // spellParadSelf.castSpell(world, entity, spellCasterStack); // }else { + parad.applyAllSpellEffects(); parad.castSpell(world, entity, spellCasterStack); } From 17f63200aa113d3405e481890f3ede98c7f09b41 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 25 Jan 2014 15:39:46 -0500 Subject: [PATCH 08/33] Added altar recipe registry --- .../AlchemicalWizardry.java | 2 + .../altarRecipeRegistry/AltarRecipe.java | 70 +++++++ .../AltarRecipeRegistry.java | 83 ++++++++ .../common/tileEntity/TEAltar.java | 178 ++++-------------- 4 files changed, 196 insertions(+), 137 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index ccd9190b..df3338e3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -37,6 +37,7 @@ import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; import WayofTime.alchemicalWizardry.common.PotionReciprocation; import WayofTime.alchemicalWizardry.common.alchemy.AlchemicalPotionCreationHandler; import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegistry; import WayofTime.alchemicalWizardry.common.block.ArmourForge; import WayofTime.alchemicalWizardry.common.block.LifeEssenceBlock; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; @@ -785,6 +786,7 @@ public class AlchemicalWizardry ArmourForge.initializeRecipes(); TEPlinth.initialize(); AlchemicalPotionCreationHandler.initializePotions(); + AltarRecipeRegistry.initRecipes(); MinecraftForge.setToolClass(ModItems.boundPickaxe, "pickaxe", 5); MinecraftForge.setToolClass(ModItems.boundAxe, "axe", 5); MinecraftForge.setToolClass(ModItems.boundShovel, "shovel", 5); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java new file mode 100644 index 00000000..a7599f70 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.common.altarRecipeRegistry; + +import net.minecraft.item.ItemStack; + +public class AltarRecipe +{ + public int minTier; + public int liquidRequired; + public boolean canBeFilled; //Tells the system that the item is an orb + public int consumptionRate; + public int drainRate; + public ItemStack requiredItem; + public ItemStack result; + + public AltarRecipe(ItemStack result, ItemStack requiredItem, int minTier, int liquidRequired, int consumptionRate, int drainRate, boolean canBeFilled) + { + this.result = result; + this.requiredItem = requiredItem; + this.minTier = minTier; + this.liquidRequired = liquidRequired; + this.consumptionRate = consumptionRate; + this.drainRate = drainRate; + this.canBeFilled = canBeFilled; + } + + public ItemStack getResult() + { + return this.result; + } + + public ItemStack getRequiredItem() + { + return this.requiredItem; + } + + public boolean doesRequiredItemMatch(ItemStack comparedStack, int tierCheck) + { + if(comparedStack == null || this.requiredItem == null) + { + return false; + } + + return tierCheck>=minTier && this.requiredItem.isItemEqual(comparedStack); + } + + public int getMinTier() + { + return this.minTier; + } + + public int getLiquidRequired() + { + return this.liquidRequired; + } + + public int getConsumptionRate() + { + return this.consumptionRate; + } + + public int getDrainRate() + { + return this.drainRate; + } + + public boolean getCanBeFilled() + { + return this.canBeFilled; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java new file mode 100644 index 00000000..e4128b24 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -0,0 +1,83 @@ +package WayofTime.alchemicalWizardry.common.altarRecipeRegistry; + +import java.util.LinkedList; +import java.util.List; + +import WayofTime.alchemicalWizardry.ModItems; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class AltarRecipeRegistry +{ + public static List altarRecipes = new LinkedList(); + + public static void registerAltarRecipe(ItemStack result, ItemStack requiredItem, int minTier, int liquidRequired, int consumptionRate, int drainRate, boolean canBeFilled) + { + altarRecipes.add(new AltarRecipe(result, requiredItem, minTier, liquidRequired, consumptionRate, drainRate, canBeFilled)); + } + + public static void registerAltarOrbRecipe(ItemStack orbStack, int minTier, int consumptionRate) + { + registerAltarRecipe(null, orbStack, minTier, 0, consumptionRate, 0, true); + } + + public static void initRecipes() + { + registerAltarRecipe(new ItemStack(ModItems.weakBloodOrb), new ItemStack(Item.diamond),1,2000,2,1,false); + registerAltarRecipe(new ItemStack(ModItems.apprenticeBloodOrb), new ItemStack(Item.emerald),2,5000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.magicianBloodOrb), new ItemStack(Block.blockGold),3,5000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.masterBloodOrb), new ItemStack(ModItems.weakBloodShard),4,40000,30,50,false); + registerAltarRecipe(new ItemStack(ModItems.archmageBloodOrb), new ItemStack(ModItems.demonBloodShard),5,50000,5,5,false); + + registerAltarOrbRecipe(new ItemStack(ModItems.weakBloodOrb),1,2); + registerAltarOrbRecipe(new ItemStack(ModItems.apprenticeBloodOrb),2,5); + registerAltarOrbRecipe(new ItemStack(ModItems.magicianBloodOrb),3,5); + registerAltarOrbRecipe(new ItemStack(ModItems.masterBloodOrb),4,25); + registerAltarOrbRecipe(new ItemStack(ModItems.archmageBloodOrb),5,50); + + registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Item.enderPearl),4,2000,10,10,false); + registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); + registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); + + } + + public static boolean isRequiredItemValid(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return true; + } + } + + return false; + } + + public static ItemStack getItemForItemAndTier(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return recipe.getResult(); + } + } + + return null; + } + + public static AltarRecipe getAltarRecipeForItemAndTier(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return recipe; + } + } + + return null; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java index f4332853..6912bdd6 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -4,6 +4,8 @@ import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.*; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipe; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegistry; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.AltarUpgradeComponent; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; import WayofTime.alchemicalWizardry.common.items.EnergyBattery; @@ -535,14 +537,19 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui if (progress >= liquidRequired * stackSize) { ItemStack result = null; - - if (!isResultBlock) + result = AltarRecipeRegistry.getItemForItemAndTier(this.getStackInSlot(0), this.upgradeLevel); + if(result!=null) { - result = new ItemStack(resultID, stackSize, resultDamage); - } else - { - result = new ItemStack(Block.blocksList[resultID], stackSize, 0); + result.stackSize*=stackSize; } + +// if (!isResultBlock) +// { +// result = new ItemStack(resultID, stackSize, resultDamage); +// } else +// { +// result = new ItemStack(Block.blocksList[resultID], stackSize, 0); +// } setInventorySlotContents(0, result); progress = 0; @@ -765,6 +772,17 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui { progress = 0; } + + if(AltarRecipeRegistry.isRequiredItemValid(getStackInSlot(0), upgradeLevel)) + { + AltarRecipe recipe = AltarRecipeRegistry.getAltarRecipeForItemAndTier(getStackInSlot(0), upgradeLevel); + this.isActive = true; + this.liquidRequired = recipe.getLiquidRequired(); + this.canBeFilled = recipe.getCanBeFilled(); + this.consumptionRate = recipe.getConsumptionRate(); + this.drainRate = recipe.drainRate; + return; + } if (getStackInSlot(0).getItem() instanceof ItemBlock) { @@ -902,83 +920,10 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui return; } - if (getStackInSlot(0).itemID == ModItems.archmageBloodOrb.itemID) - { - ItemStack item = getStackInSlot(0); - - if (item.stackTagCompound == null || item.stackTagCompound.getString("ownerName").equals("")) - { - return; - } - - isActive = true; - canBeFilled = true; - consumptionRate = 50; - isResultBlock = false; - return; - } } if (upgradeLevel >= 4) { - if (getStackInSlot(0).itemID == ModItems.weakBloodShard.itemID) - { - isActive = true; - liquidRequired = 40000; - canBeFilled = false; - consumptionRate = 30; - drainRate = 50; - resultID = ModItems.masterBloodOrb.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == ModItems.masterBloodOrb.itemID) - { - ItemStack item = getStackInSlot(0); - - if (item.stackTagCompound == null || item.stackTagCompound.getString("ownerName").equals("")) - { - return; - } - - isActive = true; - canBeFilled = true; - consumptionRate = 25; - isResultBlock = false; - return; - } - - if (getStackInSlot(0).itemID == Item.enderPearl.itemID) - { - isActive = true; - liquidRequired = 5000; - canBeFilled = false; - consumptionRate = 10; - drainRate = 10; - resultID = ModItems.telepositionFocus.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == ModItems.telepositionFocus.itemID) - { - isActive = true; - liquidRequired = 10000; - canBeFilled = false; - consumptionRate = 25; - drainRate = 15; - resultID = ModItems.enhancedTelepositionFocus.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - if (getStackInSlot(0).itemID == ModItems.imbuedSlate.itemID) { isActive = true; @@ -987,7 +932,7 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui consumptionRate = 5; drainRate = 5; ItemStack bloodOrb = new ItemStack(ModItems.apprenticeBloodOrb); - resultID = ModItems.demonicSlate.itemID; + resultID = ModItems.imbuedSlate.itemID; resultDamage = 0; isResultBlock = false; //setInventorySlotContents(1, bloodOrb); @@ -1074,36 +1019,9 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui if (upgradeLevel >= 2) { - if (getStackInSlot(0).itemID == Item.emerald.itemID) - { - isActive = true; - liquidRequired = 5000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - ItemStack bloodOrb = new ItemStack(ModItems.apprenticeBloodOrb); - resultID = ModItems.apprenticeBloodOrb.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - if (getStackInSlot(0).itemID == ModItems.apprenticeBloodOrb.itemID) - { - ItemStack item = getStackInSlot(0); - if (item.stackTagCompound == null || item.stackTagCompound.getString("ownerName").equals("")) - { - return; - } - - isActive = true; - canBeFilled = true; - consumptionRate = 5; - isResultBlock = false; - return; - } + if (getStackInSlot(0).itemID == Item.swordIron.itemID) { @@ -1149,36 +1067,22 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui } } - if (getStackInSlot(0).itemID == Item.diamond.itemID) - { - isActive = true; - liquidRequired = 2000; - canBeFilled = false; - consumptionRate = 2; - drainRate = 1; - ItemStack bloodOrb = new ItemStack(ModItems.weakBloodOrb); - resultID = ModItems.weakBloodOrb.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } +// if (getStackInSlot(0).itemID == Item.diamond.itemID) +// { +// isActive = true; +// liquidRequired = 2000; +// canBeFilled = false; +// consumptionRate = 2; +// drainRate = 1; +// ItemStack bloodOrb = new ItemStack(ModItems.weakBloodOrb); +// resultID = ModItems.weakBloodOrb.itemID; +// resultDamage = 0; +// isResultBlock = false; +// //setInventorySlotContents(1, bloodOrb); +// return; +// } - if (getStackInSlot(0).itemID == ModItems.weakBloodOrb.itemID) - { - ItemStack item = getStackInSlot(0); - - if (item.stackTagCompound == null || item.stackTagCompound.getString("ownerName").equals("")) - { - return; - } - - isActive = true; - canBeFilled = true; - consumptionRate = 2; - isResultBlock = false; - return; - } + if (getStackInSlot(0).itemID == Item.bucketEmpty.itemID) { From 639d9fc87c05a0224cb46a6acd98b199fa63ba79 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 25 Jan 2014 17:11:24 -0500 Subject: [PATCH 09/33] Alchemy recipes finished --- .../AltarRecipeRegistry.java | 23 ++- .../common/tileEntity/TEAltar.java | 149 ------------------ 2 files changed, 19 insertions(+), 153 deletions(-) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java index e4128b24..0b40bd14 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -3,6 +3,8 @@ package WayofTime.alchemicalWizardry.common.altarRecipeRegistry; import java.util.LinkedList; import java.util.List; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.ModItems; import net.minecraft.block.Block; import net.minecraft.item.Item; @@ -26,20 +28,33 @@ public class AltarRecipeRegistry { registerAltarRecipe(new ItemStack(ModItems.weakBloodOrb), new ItemStack(Item.diamond),1,2000,2,1,false); registerAltarRecipe(new ItemStack(ModItems.apprenticeBloodOrb), new ItemStack(Item.emerald),2,5000,5,5,false); - registerAltarRecipe(new ItemStack(ModItems.magicianBloodOrb), new ItemStack(Block.blockGold),3,5000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.magicianBloodOrb), new ItemStack(Block.blockGold),3,25000,20,20,false); registerAltarRecipe(new ItemStack(ModItems.masterBloodOrb), new ItemStack(ModItems.weakBloodShard),4,40000,30,50,false); - registerAltarRecipe(new ItemStack(ModItems.archmageBloodOrb), new ItemStack(ModItems.demonBloodShard),5,50000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.archmageBloodOrb), new ItemStack(ModItems.demonBloodShard),5,75000,50,100,false); registerAltarOrbRecipe(new ItemStack(ModItems.weakBloodOrb),1,2); registerAltarOrbRecipe(new ItemStack(ModItems.apprenticeBloodOrb),2,5); - registerAltarOrbRecipe(new ItemStack(ModItems.magicianBloodOrb),3,5); + registerAltarOrbRecipe(new ItemStack(ModItems.magicianBloodOrb),3,15); registerAltarOrbRecipe(new ItemStack(ModItems.masterBloodOrb),4,25); registerAltarOrbRecipe(new ItemStack(ModItems.archmageBloodOrb),5,50); registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Item.enderPearl),4,2000,10,10,false); registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); - + registerAltarRecipe(new ItemStack(ModItems.duskScribeTool), new ItemStack(Block.coalBlock),4,2000,20,10,false); + registerAltarRecipe(new ItemStack(ModBlocks.bloodSocket), new ItemStack(ModBlocks.emptySocket),3,30000,40,10,false); + registerAltarRecipe(new ItemStack(ModItems.earthScribeTool), new ItemStack(Block.obsidian),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.waterScribeTool), new ItemStack(Block.blockLapis),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.blankSpell), new ItemStack(Block.glass),2,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.blankSlate), new ItemStack(Block.stone),1,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.activationCrystal), new ItemStack(ModItems.lavaCrystal),3,10000,20,10,false); + registerAltarRecipe(new ItemStack(ModItems.fireScribeTool), new ItemStack(Item.magmaCream),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.airScribeTool), new ItemStack(Item.ghastTear),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.reinforcedSlate),3,5000,15,10,false); + registerAltarRecipe(new ItemStack(ModItems.daggerOfSacrifice), new ItemStack(Item.swordIron),2,3000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.alchemyFlask), new ItemStack(Item.glassBottle),2,2000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.reinforcedSlate), new ItemStack(ModItems.blankSlate),2,2000,5,5,false); + registerAltarRecipe(new ItemStack(AlchemicalWizardry.bucketLife), new ItemStack(Item.bucketEmpty),1,1000,5,0,false); } public static boolean isRequiredItemValid(ItemStack testItem, int currentTierAltar) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java index 6912bdd6..7ea5d8d1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -784,161 +784,12 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui return; } - if (getStackInSlot(0).getItem() instanceof ItemBlock) { // if(!getStackInSlot(0).isItemDamaged()&&getStackInSlot(0).getItemDamage()>16&&!isActive) // { // getStackInSlot(0).setItemDamage(0); // } - if (upgradeLevel >= 4) - { - if (getStackInSlot(0).itemID == Block.coalBlock.blockID) - { - isActive = true; - liquidRequired = 2000; - canBeFilled = false; - consumptionRate = 20; - drainRate = 10; - resultID = ModItems.duskScribeTool.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - if (upgradeLevel >= 3) - { - if (getStackInSlot(0).itemID == Block.blockGold.blockID) - { - isActive = true; - liquidRequired = 25000; - canBeFilled = false; - consumptionRate = 20; - drainRate = 20; - //ItemStack bloodOrb = new ItemStack(AlchemicalWizardry.magicianBloodOrb); - resultID = ModItems.magicianBloodOrb.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == ModBlocks.emptySocket.blockID) - { - isActive = true; - liquidRequired = 30000; - canBeFilled = false; - consumptionRate = 40; - drainRate = 10; - //ItemStack bloodOrb = new ItemStack(AlchemicalWizardry.weakBloodOrb); - resultID = ModBlocks.bloodSocket.blockID; - resultDamage = 0; - isResultBlock = true; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == Block.obsidian.blockID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.earthScribeTool.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == Block.blockLapis.blockID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.waterScribeTool.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - - if (upgradeLevel >= 2) - { - if (getStackInSlot(0).itemID == Block.glass.blockID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.blankSpell.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - - if (getStackInSlot(0).itemID == Block.stone.blockID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.blankSlate.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } else - { -// if(!getStackInSlot(0).isItemDamaged()&&getStackInSlot(0).getItemDamage()>16&&!isActive) -// { -// getStackInSlot(0).setItemDamage(0); -// } - if (upgradeLevel >= 5) - { - if (getStackInSlot(0).itemID == ModItems.demonBloodShard.itemID) - { - isActive = true; - liquidRequired = 75000; - canBeFilled = false; - consumptionRate = 50; - drainRate = 100; - resultID = ModItems.archmageBloodOrb.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - } - - if (upgradeLevel >= 4) - { - if (getStackInSlot(0).itemID == ModItems.imbuedSlate.itemID) - { - isActive = true; - liquidRequired = 15000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - ItemStack bloodOrb = new ItemStack(ModItems.apprenticeBloodOrb); - resultID = ModItems.imbuedSlate.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } if (upgradeLevel >= 3) { From 5b05cf651bffc93a590673da6e6e95a768436222 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 25 Jan 2014 17:12:02 -0500 Subject: [PATCH 10/33] *Altar recipe, sorry! --- .../common/tileEntity/TEAltar.java | 169 +----------------- 1 file changed, 1 insertion(+), 168 deletions(-) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java index 7ea5d8d1..9d85190f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -783,174 +783,7 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui this.drainRate = recipe.drainRate; return; } - - { -// if(!getStackInSlot(0).isItemDamaged()&&getStackInSlot(0).getItemDamage()>16&&!isActive) -// { -// getStackInSlot(0).setItemDamage(0); -// } - - - if (upgradeLevel >= 3) - { - if (getStackInSlot(0).itemID == ModItems.magicianBloodOrb.itemID) - { - ItemStack item = getStackInSlot(0); - - if (item.stackTagCompound == null || item.stackTagCompound.getString("ownerName").equals("")) - { - return; - } - - isActive = true; - canBeFilled = true; - consumptionRate = 15; - isResultBlock = false; - return; - } - - if (getStackInSlot(0).itemID == ModItems.lavaCrystal.itemID) - { - isActive = true; - liquidRequired = 10000; - canBeFilled = false; - consumptionRate = 20; - drainRate = 10; - //ItemStack bloodOrb = new ItemStack(AlchemicalWizardry.weakBloodOrb); - resultID = ModItems.activationCrystal.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == Item.magmaCream.itemID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.fireScribeTool.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == Item.ghastTear.itemID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.airScribeTool.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == ModItems.reinforcedSlate.itemID) - { - isActive = true; - liquidRequired = 7000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - ItemStack bloodOrb = new ItemStack(ModItems.apprenticeBloodOrb); - resultID = ModItems.imbuedSlate.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - - if (upgradeLevel >= 2) - { - - - - - if (getStackInSlot(0).itemID == Item.swordIron.itemID) - { - isActive = true; - liquidRequired = 3000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.daggerOfSacrifice.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == Item.glassBottle.itemID) - { - isActive = true; - liquidRequired = 2000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - resultID = ModItems.alchemyFlask.itemID; - resultDamage = ModItems.alchemyFlask.getMaxDamage(); - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - - if (getStackInSlot(0).itemID == ModItems.blankSlate.itemID) - { - isActive = true; - liquidRequired = 2000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 5; - ItemStack bloodOrb = new ItemStack(ModItems.apprenticeBloodOrb); - resultID = ModItems.reinforcedSlate.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - -// if (getStackInSlot(0).itemID == Item.diamond.itemID) -// { -// isActive = true; -// liquidRequired = 2000; -// canBeFilled = false; -// consumptionRate = 2; -// drainRate = 1; -// ItemStack bloodOrb = new ItemStack(ModItems.weakBloodOrb); -// resultID = ModItems.weakBloodOrb.itemID; -// resultDamage = 0; -// isResultBlock = false; -// //setInventorySlotContents(1, bloodOrb); -// return; -// } - - - - if (getStackInSlot(0).itemID == Item.bucketEmpty.itemID) - { - isActive = true; - liquidRequired = 1000; - canBeFilled = false; - consumptionRate = 5; - drainRate = 0; - //ItemStack bloodOrb = new ItemStack(AlchemicalWizardry.weakBloodOrb); - resultID = AlchemicalWizardry.bucketLife.itemID; - resultDamage = 0; - isResultBlock = false; - //setInventorySlotContents(1, bloodOrb); - return; - } - } - + isActive = false; } From bd26e441cbb46900a8af58b47e7c1bc777cb833f Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 25 Jan 2014 20:36:28 -0500 Subject: [PATCH 11/33] Test with stuff + Forestry potential support --- .../AlchemicalWizardry.java | 1 + .../forestry/api/apiculture/BeeManager.java | 40 ++++ .../api/apiculture/EnumBeeChromosome.java | 98 ++++++++ .../forestry/api/apiculture/EnumBeeType.java | 19 ++ .../api/apiculture/FlowerManager.java | 14 ++ .../api/apiculture/IAlleleBeeEffect.java | 31 +++ .../api/apiculture/IAlleleBeeSpecies.java | 46 ++++ .../api/apiculture/IAlvearyComponent.java | 27 +++ .../api/apiculture/IApiaristTracker.java | 52 +++++ .../api/apiculture/IArmorApiarist.java | 24 ++ BM_src/forestry/api/apiculture/IBee.java | 85 +++++++ .../forestry/api/apiculture/IBeeGenome.java | 43 ++++ .../forestry/api/apiculture/IBeeHousing.java | 21 ++ .../forestry/api/apiculture/IBeeListener.java | 40 ++++ .../forestry/api/apiculture/IBeeModifier.java | 66 ++++++ .../forestry/api/apiculture/IBeeMutation.java | 20 ++ BM_src/forestry/api/apiculture/IBeeRoot.java | 111 +++++++++ .../api/apiculture/IBeekeepingLogic.java | 22 ++ .../api/apiculture/IBeekeepingMode.java | 65 ++++++ BM_src/forestry/api/apiculture/IHiveDrop.java | 33 +++ .../forestry/api/apiculture/IHiveFrame.java | 22 ++ .../forestry/api/apiculture/package-info.java | 3 + .../api/arboriculture/EnumGermlingType.java | 18 ++ .../arboriculture/EnumGrowthConditions.java | 5 + .../api/arboriculture/EnumTreeChromosome.java | 86 +++++++ .../api/arboriculture/IAlleleFruit.java | 12 + .../api/arboriculture/IAlleleGrowth.java | 12 + .../api/arboriculture/IAlleleLeafEffect.java | 14 ++ .../api/arboriculture/IAlleleTreeSpecies.java | 67 ++++++ .../api/arboriculture/IArboristTracker.java | 7 + .../api/arboriculture/IFruitProvider.java | 67 ++++++ .../api/arboriculture/IGrowthProvider.java | 33 +++ .../api/arboriculture/ILeafTickHandler.java | 7 + .../api/arboriculture/IToolGrafter.java | 19 ++ BM_src/forestry/api/arboriculture/ITree.java | 92 ++++++++ .../api/arboriculture/ITreeGenome.java | 40 ++++ .../api/arboriculture/ITreeModifier.java | 40 ++++ .../api/arboriculture/ITreeMutation.java | 28 +++ .../forestry/api/arboriculture/ITreeRoot.java | 77 ++++++ .../api/arboriculture/ITreekeepingMode.java | 17 ++ .../api/arboriculture/TreeManager.java | 11 + .../api/arboriculture/package-info.java | 3 + .../forestry/api/circuits/ChipsetManager.java | 8 + BM_src/forestry/api/circuits/ICircuit.java | 27 +++ .../forestry/api/circuits/ICircuitBoard.java | 26 +++ .../forestry/api/circuits/ICircuitLayout.java | 11 + .../api/circuits/ICircuitLibrary.java | 5 + .../api/circuits/ICircuitRegistry.java | 37 +++ .../forestry/api/circuits/ISolderManager.java | 9 + .../forestry/api/circuits/package-info.java | 3 + BM_src/forestry/api/core/BlockInterface.java | 34 +++ BM_src/forestry/api/core/EnumHumidity.java | 72 ++++++ BM_src/forestry/api/core/EnumTemperature.java | 142 +++++++++++ BM_src/forestry/api/core/ForestryAPI.java | 47 ++++ BM_src/forestry/api/core/ForestryEvent.java | 51 ++++ BM_src/forestry/api/core/GlobalManager.java | 35 +++ .../forestry/api/core/IArmorNaturalist.java | 20 ++ .../forestry/api/core/IForestryConstants.java | 19 ++ BM_src/forestry/api/core/IGameMode.java | 36 +++ BM_src/forestry/api/core/IIconProvider.java | 19 ++ BM_src/forestry/api/core/INBTTagable.java | 9 + BM_src/forestry/api/core/IPlugin.java | 32 +++ BM_src/forestry/api/core/IStructureLogic.java | 15 ++ BM_src/forestry/api/core/ITextureManager.java | 15 ++ BM_src/forestry/api/core/ITileStructure.java | 58 +++++ BM_src/forestry/api/core/IToolScoop.java | 8 + BM_src/forestry/api/core/ItemInterface.java | 42 ++++ BM_src/forestry/api/core/PluginInfo.java | 49 ++++ BM_src/forestry/api/core/Tabs.java | 14 ++ BM_src/forestry/api/core/package-info.java | 3 + BM_src/forestry/api/farming/Farmables.java | 15 ++ BM_src/forestry/api/farming/ICrop.java | 16 ++ .../forestry/api/farming/IFarmComponent.java | 12 + BM_src/forestry/api/farming/IFarmHousing.java | 68 ++++++ .../forestry/api/farming/IFarmInterface.java | 15 ++ .../forestry/api/farming/IFarmListener.java | 71 ++++++ BM_src/forestry/api/farming/IFarmLogic.java | 34 +++ BM_src/forestry/api/farming/IFarmable.java | 54 +++++ BM_src/forestry/api/farming/package-info.java | 3 + BM_src/forestry/api/food/BeverageManager.java | 8 + BM_src/forestry/api/food/IBeverageEffect.java | 12 + BM_src/forestry/api/food/IInfuserManager.java | 17 ++ .../forestry/api/food/IIngredientManager.java | 11 + BM_src/forestry/api/food/package-info.java | 3 + .../forestry/api/fuels/EngineBronzeFuel.java | 30 +++ .../forestry/api/fuels/EngineCopperFuel.java | 26 +++ BM_src/forestry/api/fuels/FermenterFuel.java | 24 ++ BM_src/forestry/api/fuels/FuelManager.java | 29 +++ BM_src/forestry/api/fuels/GeneratorFuel.java | 31 +++ BM_src/forestry/api/fuels/MoistenerFuel.java | 29 +++ BM_src/forestry/api/fuels/RainSubstrate.java | 35 +++ BM_src/forestry/api/fuels/package-info.java | 3 + .../forestry/api/genetics/AlleleManager.java | 24 ++ .../forestry/api/genetics/EnumTolerance.java | 11 + BM_src/forestry/api/genetics/IAllele.java | 29 +++ BM_src/forestry/api/genetics/IAlleleArea.java | 10 + .../forestry/api/genetics/IAlleleBoolean.java | 11 + .../forestry/api/genetics/IAlleleEffect.java | 21 ++ .../forestry/api/genetics/IAlleleFloat.java | 10 + .../forestry/api/genetics/IAlleleFlowers.java | 11 + .../forestry/api/genetics/IAlleleHandler.java | 36 +++ .../forestry/api/genetics/IAlleleInteger.java | 10 + .../api/genetics/IAllelePlantType.java | 11 + .../api/genetics/IAlleleRegistry.java | 221 ++++++++++++++++++ .../forestry/api/genetics/IAlleleSpecies.java | 106 +++++++++ .../api/genetics/IAlleleTolerance.java | 10 + .../api/genetics/IBreedingTracker.java | 93 ++++++++ BM_src/forestry/api/genetics/IChromosome.java | 20 ++ .../api/genetics/IChromosomeType.java | 19 ++ .../api/genetics/IClassification.java | 102 ++++++++ BM_src/forestry/api/genetics/IEffectData.java | 22 ++ .../api/genetics/IFlowerProvider.java | 51 ++++ .../forestry/api/genetics/IFruitBearer.java | 45 ++++ .../forestry/api/genetics/IFruitFamily.java | 27 +++ BM_src/forestry/api/genetics/IGenome.java | 25 ++ BM_src/forestry/api/genetics/IHousing.java | 46 ++++ BM_src/forestry/api/genetics/IIndividual.java | 52 +++++ .../api/genetics/IIndividualLiving.java | 40 ++++ .../forestry/api/genetics/ILegacyHandler.java | 10 + BM_src/forestry/api/genetics/IMutation.java | 63 +++++ .../forestry/api/genetics/IPollinatable.java | 43 ++++ .../forestry/api/genetics/ISpeciesRoot.java | 160 +++++++++++++ .../forestry/api/genetics/package-info.java | 3 + .../EnumButterflyChromosome.java | 93 ++++++++ .../api/lepidopterology/EnumFlutterType.java | 10 + .../IAlleleButterflyEffect.java | 16 ++ .../IAlleleButterflySpecies.java | 53 +++++ .../api/lepidopterology/IButterfly.java | 71 ++++++ .../api/lepidopterology/IButterflyGenome.java | 37 +++ .../lepidopterology/IButterflyMutation.java | 9 + .../lepidopterology/IButterflyNursery.java | 16 ++ .../api/lepidopterology/IButterflyRoot.java | 54 +++++ .../api/lepidopterology/IEntityButterfly.java | 23 ++ .../ILepidopteristTracker.java | 9 + .../api/lepidopterology/package-info.java | 3 + BM_src/forestry/api/mail/EnumPostage.java | 15 ++ BM_src/forestry/api/mail/ILetter.java | 53 +++++ BM_src/forestry/api/mail/ILetterHandler.java | 8 + BM_src/forestry/api/mail/IPostOffice.java | 25 ++ BM_src/forestry/api/mail/IPostRegistry.java | 47 ++++ BM_src/forestry/api/mail/IPostalCarrier.java | 42 ++++ BM_src/forestry/api/mail/IPostalState.java | 9 + BM_src/forestry/api/mail/IStamps.java | 9 + BM_src/forestry/api/mail/ITradeStation.java | 19 ++ BM_src/forestry/api/mail/MailAddress.java | 54 +++++ BM_src/forestry/api/mail/PostManager.java | 6 + .../forestry/api/mail/TradeStationInfo.java | 19 ++ BM_src/forestry/api/mail/package-info.java | 3 + BM_src/forestry/api/package-info.java | 3 + .../forestry/api/recipes/IBottlerManager.java | 34 +++ .../api/recipes/ICarpenterManager.java | 65 ++++++ .../api/recipes/ICentrifugeManager.java | 74 ++++++ .../api/recipes/ICraftingProvider.java | 12 + .../api/recipes/IFabricatorManager.java | 12 + .../api/recipes/IFermenterManager.java | 48 ++++ .../forestry/api/recipes/IGenericCrate.java | 11 + .../api/recipes/IMoistenerManager.java | 28 +++ .../api/recipes/ISqueezerManager.java | 45 ++++ .../forestry/api/recipes/IStillManager.java | 29 +++ .../api/recipes/IVariableFermentable.java | 16 ++ .../forestry/api/recipes/RecipeManagers.java | 44 ++++ BM_src/forestry/api/recipes/package-info.java | 3 + .../forestry/api/storage/BackpackEvent.java | 18 ++ .../forestry/api/storage/BackpackManager.java | 22 ++ .../api/storage/BackpackResupplyEvent.java | 18 ++ .../api/storage/BackpackStowEvent.java | 21 ++ .../api/storage/EnumBackpackType.java | 5 + .../api/storage/IBackpackDefinition.java | 54 +++++ .../api/storage/IBackpackInterface.java | 19 ++ BM_src/forestry/api/storage/package-info.java | 3 + BM_src/forestry/api/world/ITreeGenData.java | 18 ++ .../api/world/IWorldGenInterface.java | 17 ++ .../forestry/api/world/WorldGenManager.java | 5 + BM_src/forestry/api/world/package-info.java | 3 + 174 files changed, 5602 insertions(+) create mode 100644 BM_src/forestry/api/apiculture/BeeManager.java create mode 100644 BM_src/forestry/api/apiculture/EnumBeeChromosome.java create mode 100644 BM_src/forestry/api/apiculture/EnumBeeType.java create mode 100644 BM_src/forestry/api/apiculture/FlowerManager.java create mode 100644 BM_src/forestry/api/apiculture/IAlleleBeeEffect.java create mode 100644 BM_src/forestry/api/apiculture/IAlleleBeeSpecies.java create mode 100644 BM_src/forestry/api/apiculture/IAlvearyComponent.java create mode 100644 BM_src/forestry/api/apiculture/IApiaristTracker.java create mode 100644 BM_src/forestry/api/apiculture/IArmorApiarist.java create mode 100644 BM_src/forestry/api/apiculture/IBee.java create mode 100644 BM_src/forestry/api/apiculture/IBeeGenome.java create mode 100644 BM_src/forestry/api/apiculture/IBeeHousing.java create mode 100644 BM_src/forestry/api/apiculture/IBeeListener.java create mode 100644 BM_src/forestry/api/apiculture/IBeeModifier.java create mode 100644 BM_src/forestry/api/apiculture/IBeeMutation.java create mode 100644 BM_src/forestry/api/apiculture/IBeeRoot.java create mode 100644 BM_src/forestry/api/apiculture/IBeekeepingLogic.java create mode 100644 BM_src/forestry/api/apiculture/IBeekeepingMode.java create mode 100644 BM_src/forestry/api/apiculture/IHiveDrop.java create mode 100644 BM_src/forestry/api/apiculture/IHiveFrame.java create mode 100644 BM_src/forestry/api/apiculture/package-info.java create mode 100644 BM_src/forestry/api/arboriculture/EnumGermlingType.java create mode 100644 BM_src/forestry/api/arboriculture/EnumGrowthConditions.java create mode 100644 BM_src/forestry/api/arboriculture/EnumTreeChromosome.java create mode 100644 BM_src/forestry/api/arboriculture/IAlleleFruit.java create mode 100644 BM_src/forestry/api/arboriculture/IAlleleGrowth.java create mode 100644 BM_src/forestry/api/arboriculture/IAlleleLeafEffect.java create mode 100644 BM_src/forestry/api/arboriculture/IAlleleTreeSpecies.java create mode 100644 BM_src/forestry/api/arboriculture/IArboristTracker.java create mode 100644 BM_src/forestry/api/arboriculture/IFruitProvider.java create mode 100644 BM_src/forestry/api/arboriculture/IGrowthProvider.java create mode 100644 BM_src/forestry/api/arboriculture/ILeafTickHandler.java create mode 100644 BM_src/forestry/api/arboriculture/IToolGrafter.java create mode 100644 BM_src/forestry/api/arboriculture/ITree.java create mode 100644 BM_src/forestry/api/arboriculture/ITreeGenome.java create mode 100644 BM_src/forestry/api/arboriculture/ITreeModifier.java create mode 100644 BM_src/forestry/api/arboriculture/ITreeMutation.java create mode 100644 BM_src/forestry/api/arboriculture/ITreeRoot.java create mode 100644 BM_src/forestry/api/arboriculture/ITreekeepingMode.java create mode 100644 BM_src/forestry/api/arboriculture/TreeManager.java create mode 100644 BM_src/forestry/api/arboriculture/package-info.java create mode 100644 BM_src/forestry/api/circuits/ChipsetManager.java create mode 100644 BM_src/forestry/api/circuits/ICircuit.java create mode 100644 BM_src/forestry/api/circuits/ICircuitBoard.java create mode 100644 BM_src/forestry/api/circuits/ICircuitLayout.java create mode 100644 BM_src/forestry/api/circuits/ICircuitLibrary.java create mode 100644 BM_src/forestry/api/circuits/ICircuitRegistry.java create mode 100644 BM_src/forestry/api/circuits/ISolderManager.java create mode 100644 BM_src/forestry/api/circuits/package-info.java create mode 100644 BM_src/forestry/api/core/BlockInterface.java create mode 100644 BM_src/forestry/api/core/EnumHumidity.java create mode 100644 BM_src/forestry/api/core/EnumTemperature.java create mode 100644 BM_src/forestry/api/core/ForestryAPI.java create mode 100644 BM_src/forestry/api/core/ForestryEvent.java create mode 100644 BM_src/forestry/api/core/GlobalManager.java create mode 100644 BM_src/forestry/api/core/IArmorNaturalist.java create mode 100644 BM_src/forestry/api/core/IForestryConstants.java create mode 100644 BM_src/forestry/api/core/IGameMode.java create mode 100644 BM_src/forestry/api/core/IIconProvider.java create mode 100644 BM_src/forestry/api/core/INBTTagable.java create mode 100644 BM_src/forestry/api/core/IPlugin.java create mode 100644 BM_src/forestry/api/core/IStructureLogic.java create mode 100644 BM_src/forestry/api/core/ITextureManager.java create mode 100644 BM_src/forestry/api/core/ITileStructure.java create mode 100644 BM_src/forestry/api/core/IToolScoop.java create mode 100644 BM_src/forestry/api/core/ItemInterface.java create mode 100644 BM_src/forestry/api/core/PluginInfo.java create mode 100644 BM_src/forestry/api/core/Tabs.java create mode 100644 BM_src/forestry/api/core/package-info.java create mode 100644 BM_src/forestry/api/farming/Farmables.java create mode 100644 BM_src/forestry/api/farming/ICrop.java create mode 100644 BM_src/forestry/api/farming/IFarmComponent.java create mode 100644 BM_src/forestry/api/farming/IFarmHousing.java create mode 100644 BM_src/forestry/api/farming/IFarmInterface.java create mode 100644 BM_src/forestry/api/farming/IFarmListener.java create mode 100644 BM_src/forestry/api/farming/IFarmLogic.java create mode 100644 BM_src/forestry/api/farming/IFarmable.java create mode 100644 BM_src/forestry/api/farming/package-info.java create mode 100644 BM_src/forestry/api/food/BeverageManager.java create mode 100644 BM_src/forestry/api/food/IBeverageEffect.java create mode 100644 BM_src/forestry/api/food/IInfuserManager.java create mode 100644 BM_src/forestry/api/food/IIngredientManager.java create mode 100644 BM_src/forestry/api/food/package-info.java create mode 100644 BM_src/forestry/api/fuels/EngineBronzeFuel.java create mode 100644 BM_src/forestry/api/fuels/EngineCopperFuel.java create mode 100644 BM_src/forestry/api/fuels/FermenterFuel.java create mode 100644 BM_src/forestry/api/fuels/FuelManager.java create mode 100644 BM_src/forestry/api/fuels/GeneratorFuel.java create mode 100644 BM_src/forestry/api/fuels/MoistenerFuel.java create mode 100644 BM_src/forestry/api/fuels/RainSubstrate.java create mode 100644 BM_src/forestry/api/fuels/package-info.java create mode 100644 BM_src/forestry/api/genetics/AlleleManager.java create mode 100644 BM_src/forestry/api/genetics/EnumTolerance.java create mode 100644 BM_src/forestry/api/genetics/IAllele.java create mode 100644 BM_src/forestry/api/genetics/IAlleleArea.java create mode 100644 BM_src/forestry/api/genetics/IAlleleBoolean.java create mode 100644 BM_src/forestry/api/genetics/IAlleleEffect.java create mode 100644 BM_src/forestry/api/genetics/IAlleleFloat.java create mode 100644 BM_src/forestry/api/genetics/IAlleleFlowers.java create mode 100644 BM_src/forestry/api/genetics/IAlleleHandler.java create mode 100644 BM_src/forestry/api/genetics/IAlleleInteger.java create mode 100644 BM_src/forestry/api/genetics/IAllelePlantType.java create mode 100644 BM_src/forestry/api/genetics/IAlleleRegistry.java create mode 100644 BM_src/forestry/api/genetics/IAlleleSpecies.java create mode 100644 BM_src/forestry/api/genetics/IAlleleTolerance.java create mode 100644 BM_src/forestry/api/genetics/IBreedingTracker.java create mode 100644 BM_src/forestry/api/genetics/IChromosome.java create mode 100644 BM_src/forestry/api/genetics/IChromosomeType.java create mode 100644 BM_src/forestry/api/genetics/IClassification.java create mode 100644 BM_src/forestry/api/genetics/IEffectData.java create mode 100644 BM_src/forestry/api/genetics/IFlowerProvider.java create mode 100644 BM_src/forestry/api/genetics/IFruitBearer.java create mode 100644 BM_src/forestry/api/genetics/IFruitFamily.java create mode 100644 BM_src/forestry/api/genetics/IGenome.java create mode 100644 BM_src/forestry/api/genetics/IHousing.java create mode 100644 BM_src/forestry/api/genetics/IIndividual.java create mode 100644 BM_src/forestry/api/genetics/IIndividualLiving.java create mode 100644 BM_src/forestry/api/genetics/ILegacyHandler.java create mode 100644 BM_src/forestry/api/genetics/IMutation.java create mode 100644 BM_src/forestry/api/genetics/IPollinatable.java create mode 100644 BM_src/forestry/api/genetics/ISpeciesRoot.java create mode 100644 BM_src/forestry/api/genetics/package-info.java create mode 100644 BM_src/forestry/api/lepidopterology/EnumButterflyChromosome.java create mode 100644 BM_src/forestry/api/lepidopterology/EnumFlutterType.java create mode 100644 BM_src/forestry/api/lepidopterology/IAlleleButterflyEffect.java create mode 100644 BM_src/forestry/api/lepidopterology/IAlleleButterflySpecies.java create mode 100644 BM_src/forestry/api/lepidopterology/IButterfly.java create mode 100644 BM_src/forestry/api/lepidopterology/IButterflyGenome.java create mode 100644 BM_src/forestry/api/lepidopterology/IButterflyMutation.java create mode 100644 BM_src/forestry/api/lepidopterology/IButterflyNursery.java create mode 100644 BM_src/forestry/api/lepidopterology/IButterflyRoot.java create mode 100644 BM_src/forestry/api/lepidopterology/IEntityButterfly.java create mode 100644 BM_src/forestry/api/lepidopterology/ILepidopteristTracker.java create mode 100644 BM_src/forestry/api/lepidopterology/package-info.java create mode 100644 BM_src/forestry/api/mail/EnumPostage.java create mode 100644 BM_src/forestry/api/mail/ILetter.java create mode 100644 BM_src/forestry/api/mail/ILetterHandler.java create mode 100644 BM_src/forestry/api/mail/IPostOffice.java create mode 100644 BM_src/forestry/api/mail/IPostRegistry.java create mode 100644 BM_src/forestry/api/mail/IPostalCarrier.java create mode 100644 BM_src/forestry/api/mail/IPostalState.java create mode 100644 BM_src/forestry/api/mail/IStamps.java create mode 100644 BM_src/forestry/api/mail/ITradeStation.java create mode 100644 BM_src/forestry/api/mail/MailAddress.java create mode 100644 BM_src/forestry/api/mail/PostManager.java create mode 100644 BM_src/forestry/api/mail/TradeStationInfo.java create mode 100644 BM_src/forestry/api/mail/package-info.java create mode 100644 BM_src/forestry/api/package-info.java create mode 100644 BM_src/forestry/api/recipes/IBottlerManager.java create mode 100644 BM_src/forestry/api/recipes/ICarpenterManager.java create mode 100644 BM_src/forestry/api/recipes/ICentrifugeManager.java create mode 100644 BM_src/forestry/api/recipes/ICraftingProvider.java create mode 100644 BM_src/forestry/api/recipes/IFabricatorManager.java create mode 100644 BM_src/forestry/api/recipes/IFermenterManager.java create mode 100644 BM_src/forestry/api/recipes/IGenericCrate.java create mode 100644 BM_src/forestry/api/recipes/IMoistenerManager.java create mode 100644 BM_src/forestry/api/recipes/ISqueezerManager.java create mode 100644 BM_src/forestry/api/recipes/IStillManager.java create mode 100644 BM_src/forestry/api/recipes/IVariableFermentable.java create mode 100644 BM_src/forestry/api/recipes/RecipeManagers.java create mode 100644 BM_src/forestry/api/recipes/package-info.java create mode 100644 BM_src/forestry/api/storage/BackpackEvent.java create mode 100644 BM_src/forestry/api/storage/BackpackManager.java create mode 100644 BM_src/forestry/api/storage/BackpackResupplyEvent.java create mode 100644 BM_src/forestry/api/storage/BackpackStowEvent.java create mode 100644 BM_src/forestry/api/storage/EnumBackpackType.java create mode 100644 BM_src/forestry/api/storage/IBackpackDefinition.java create mode 100644 BM_src/forestry/api/storage/IBackpackInterface.java create mode 100644 BM_src/forestry/api/storage/package-info.java create mode 100644 BM_src/forestry/api/world/ITreeGenData.java create mode 100644 BM_src/forestry/api/world/IWorldGenInterface.java create mode 100644 BM_src/forestry/api/world/WorldGenManager.java create mode 100644 BM_src/forestry/api/world/package-info.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index df3338e3..928d464d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -646,6 +646,7 @@ public class AlchemicalWizardry ModBlocks.blockLifeEssence.setUnlocalizedName("lifeEssenceBlock"); bucketLife = (new LifeBucket(bucketLifeItemID, ModBlocks.blockLifeEssence.blockID)).setUnlocalizedName("bucketLife").setContainerItem(Item.bucketEmpty).setCreativeTab(CreativeTabs.tabMisc); FluidContainerRegistry.registerFluidContainer(lifeEssenceFluid, new ItemStack(bucketLife), FluidContainerRegistry.EMPTY_BUCKET); + FluidRegistry.registerFluid(lifeEssenceFluid); //lifeEssenceFluid.setUnlocalizedName("lifeEssence"); //LiquidContainerRegistry.registerLiquid(new LiquidContainerData(LiquidDictionary.getLiquid("Life Essence", LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(AlchemicalWizardry.bucketLife), new ItemStack(Item.bucketEmpty))); //GameRegistry.registerBlock(testingBlock, "testingBlock"); diff --git a/BM_src/forestry/api/apiculture/BeeManager.java b/BM_src/forestry/api/apiculture/BeeManager.java new file mode 100644 index 00000000..81a666b9 --- /dev/null +++ b/BM_src/forestry/api/apiculture/BeeManager.java @@ -0,0 +1,40 @@ +package forestry.api.apiculture; + +import java.util.ArrayList; +import java.util.HashMap; + +import net.minecraft.item.ItemStack; +import forestry.api.genetics.IMutation; +/** + * + * Some miscellaneous lists and settings for bees. + * + * @author SirSengir + */ +public class BeeManager { + + /** + * Get your own reference to this via AlleleManager.alleleRegistry.getSpeciesRoot("rootBees") and save it somewhere. + */ + @Deprecated + public static IBeeRoot beeInterface; + + /** + * Species templates for bees that can drop from hives. + * + * 0 - Forest 1 - Meadows 2 - Desert 3 - Jungle 4 - End 5 - Snow 6 - Swamp + * + * see {@link IMutation} for template format + */ + public static ArrayList[] hiveDrops; + + /** + * 0 - Common Village Bees 1 - Uncommon Village Bees (20 % of spawns) + */ + public static ArrayList[] villageBees; + + /** + * List of items that can induce swarming. Integer denotes x in 1000 chance. + */ + public static HashMap inducers = new HashMap(); +} diff --git a/BM_src/forestry/api/apiculture/EnumBeeChromosome.java b/BM_src/forestry/api/apiculture/EnumBeeChromosome.java new file mode 100644 index 00000000..a7c6e6a5 --- /dev/null +++ b/BM_src/forestry/api/apiculture/EnumBeeChromosome.java @@ -0,0 +1,98 @@ +package forestry.api.apiculture; + +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IAlleleArea; +import forestry.api.genetics.IAlleleBoolean; +import forestry.api.genetics.IAlleleFloat; +import forestry.api.genetics.IAlleleFlowers; +import forestry.api.genetics.IAlleleInteger; +import forestry.api.genetics.IAlleleTolerance; +import forestry.api.genetics.IChromosomeType; +import forestry.api.genetics.ISpeciesRoot; + +/** + * Enum representing the order of chromosomes in a bee's genome and what they control. + * + * @author SirSengir + */ +public enum EnumBeeChromosome implements IChromosomeType { + /** + * Species of the bee. Alleles here must implement {@link IAlleleBeeSpecies}. + */ + SPECIES(IAlleleBeeSpecies.class), + /** + * (Production) Speed of the bee. + */ + SPEED(IAlleleFloat.class), + /** + * Lifespan of the bee. + */ + LIFESPAN(IAlleleInteger.class), + /** + * Fertility of the bee. Determines number of offspring. + */ + FERTILITY(IAlleleInteger.class), + /** + * Temperature difference to its native supported one the bee can tolerate. + */ + TEMPERATURE_TOLERANCE(IAlleleTolerance.class), + /** + * Slightly incorrectly named. If true, a naturally dirunal bee can work during the night. If true, a naturally nocturnal bee can work during the day. + */ + NOCTURNAL(IAlleleBoolean.class), + /** + * Not used / superseded by fixed values for the species. Probably going to be replaced with a boolean for FIRE_RESIST. + */ + @Deprecated + HUMIDITY(IAllele.class), + /** + * Humidity difference to its native supported one the bee can tolerate. + */ + HUMIDITY_TOLERANCE(IAlleleTolerance.class), + /** + * If true the bee can work during rain. + */ + TOLERANT_FLYER(IAlleleBoolean.class), + /** + * If true, the bee can work without a clear view of the sky. + */ + CAVE_DWELLING(IAlleleBoolean.class), + /** + * Contains the supported flower provider. + */ + FLOWER_PROVIDER(IAlleleFlowers.class), + /** + * Determines pollination speed. + */ + FLOWERING(IAlleleInteger.class), + /** + * Determines the size of the bee's territory. + */ + TERRITORY(IAlleleArea.class), + /** + * Determines the bee's effect. + */ + EFFECT(IAlleleBeeEffect.class); + + Class clss; + + EnumBeeChromosome(Class clss) { + this.clss = clss; + } + + @Override + public Class getAlleleClass() { + return clss; + } + + @Override + public String getName() { + return this.toString().toLowerCase(); + } + + @Override + public ISpeciesRoot getSpeciesRoot() { + return AlleleManager.alleleRegistry.getSpeciesRoot("rootBees"); + } +} diff --git a/BM_src/forestry/api/apiculture/EnumBeeType.java b/BM_src/forestry/api/apiculture/EnumBeeType.java new file mode 100644 index 00000000..849432b3 --- /dev/null +++ b/BM_src/forestry/api/apiculture/EnumBeeType.java @@ -0,0 +1,19 @@ +package forestry.api.apiculture; + +import java.util.Locale; + +public enum EnumBeeType { + DRONE, PRINCESS, QUEEN, LARVAE, NONE; + + public static final EnumBeeType[] VALUES = values(); + + String name; + + private EnumBeeType() { + this.name = "bees." + this.toString().toLowerCase(Locale.ENGLISH); + } + + public String getName() { + return name; + } +} diff --git a/BM_src/forestry/api/apiculture/FlowerManager.java b/BM_src/forestry/api/apiculture/FlowerManager.java new file mode 100644 index 00000000..1a32f6db --- /dev/null +++ b/BM_src/forestry/api/apiculture/FlowerManager.java @@ -0,0 +1,14 @@ +package forestry.api.apiculture; + +import java.util.ArrayList; + +import forestry.api.genetics.IFlowerProvider; + +import net.minecraft.item.ItemStack; + +public class FlowerManager { + /** + * ItemStacks representing simple flower blocks. Meta-sensitive, processed by the basic {@link IFlowerProvider}. + */ + public static ArrayList plainFlowers = new ArrayList(); +} diff --git a/BM_src/forestry/api/apiculture/IAlleleBeeEffect.java b/BM_src/forestry/api/apiculture/IAlleleBeeEffect.java new file mode 100644 index 00000000..64525464 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IAlleleBeeEffect.java @@ -0,0 +1,31 @@ +package forestry.api.apiculture; + +import forestry.api.genetics.IAlleleEffect; +import forestry.api.genetics.IEffectData; + +public interface IAlleleBeeEffect extends IAlleleEffect { + + /** + * Called by apiaries to cause an effect in the world. + * + * @param genome + * Genome of the bee queen causing this effect + * @param storedData + * Object containing the stored effect data for the apiary/hive the bee is in. + * @param housing {@link IBeeHousing} the bee currently resides in. + * @return storedData, may have been manipulated. + */ + IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing); + + /** + * Is called to produce bee effects. + * + * @param genome + * @param storedData + * Object containing the stored effect data for the apiary/hive the bee is in. + * @param housing {@link IBeeHousing} the bee currently resides in. + * @return storedData, may have been manipulated. + */ + IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing); + +} diff --git a/BM_src/forestry/api/apiculture/IAlleleBeeSpecies.java b/BM_src/forestry/api/apiculture/IAlleleBeeSpecies.java new file mode 100644 index 00000000..dafb6477 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IAlleleBeeSpecies.java @@ -0,0 +1,46 @@ +package forestry.api.apiculture; + +import java.util.Map; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import forestry.api.genetics.IAlleleSpecies; + +public interface IAlleleBeeSpecies extends IAlleleSpecies { + + /** + * @return the IBeeRoot + */ + IBeeRoot getRoot(); + + /** + * @return true if this species is only active at night. + */ + boolean isNocturnal(); + + /** + * @return Map of possible products with the chance for drop each bee cycle. (0 - 100) + */ + Map getProducts(); + + /** + * @return Map of possible specialities with the chance for drop each bee cycle. (0 - 100) + */ + Map getSpecialty(); + + /** + * Only jubilant bees produce specialities. + * @return true if the bee is jubilant, false otherwise. + */ + boolean isJubilant(IBeeGenome genome, IBeeHousing housing); + + @SideOnly(Side.CLIENT) + Icon getIcon(EnumBeeType type, int renderPass); + + /** + * @return Path of the texture to use for entity rendering. + */ + String getEntityTexture(); +} diff --git a/BM_src/forestry/api/apiculture/IAlvearyComponent.java b/BM_src/forestry/api/apiculture/IAlvearyComponent.java new file mode 100644 index 00000000..2e6df0a0 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IAlvearyComponent.java @@ -0,0 +1,27 @@ +package forestry.api.apiculture; + +import forestry.api.core.ITileStructure; + +/** + * Needs to be implemented by TileEntities that want to be part of an alveary. + */ +public interface IAlvearyComponent extends ITileStructure { + + void registerBeeModifier(IBeeModifier modifier); + + void removeBeeModifier(IBeeModifier modifier); + + void registerBeeListener(IBeeListener event); + + void removeBeeListener(IBeeListener event); + + void addTemperatureChange(float change, float boundaryDown, float boundaryUp); + + void addHumidityChange(float change, float boundaryDown, float boundaryUp); + + /** + * @return true if this TE has a function other than a plain alveary block. Returning true prevents the TE from becoming master. + */ + boolean hasFunction(); + +} diff --git a/BM_src/forestry/api/apiculture/IApiaristTracker.java b/BM_src/forestry/api/apiculture/IApiaristTracker.java new file mode 100644 index 00000000..314638d9 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IApiaristTracker.java @@ -0,0 +1,52 @@ +package forestry.api.apiculture; + +import forestry.api.genetics.IBreedingTracker; +import forestry.api.genetics.IIndividual; + +/** + * Can be used to garner information on bee breeding. See {@link forestry.api.genetics.ISpeciesRoot} for retrieval functions. + * + * @author SirSengir + */ +public interface IApiaristTracker extends IBreedingTracker { + + /** + * Register the birth of a queen. Will mark species as discovered. + * + * @param queen + * Created queen. + */ + void registerQueen(IIndividual queen); + + /** + * @return Amount of queens bred with this tracker. + */ + int getQueenCount(); + + /** + * Register the birth of a princess. Will mark species as discovered. + * + * @param princess + * Created princess. + */ + void registerPrincess(IIndividual princess); + + /** + * @return Amount of princesses bred with this tracker. + */ + int getPrincessCount(); + + /** + * Register the birth of a drone. Will mark species as discovered. + * + * @param drone + * Created drone. + */ + void registerDrone(IIndividual drone); + + /** + * @return Amount of drones bred with this tracker. + */ + int getDroneCount(); + +} diff --git a/BM_src/forestry/api/apiculture/IArmorApiarist.java b/BM_src/forestry/api/apiculture/IArmorApiarist.java new file mode 100644 index 00000000..b2e5518d --- /dev/null +++ b/BM_src/forestry/api/apiculture/IArmorApiarist.java @@ -0,0 +1,24 @@ +package forestry.api.apiculture; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +/** + * When implemented by armor piece items, allows them to act as apiarist's armor. + */ +public interface IArmorApiarist { + /** + * Called when the apiarist's armor acts as protection against an attack. + * + * @param player + * Player being attacked + * @param armor + * Armor item + * @param cause + * Optional cause of attack, such as a bee effect identifier + * @param doProtect + * Whether or not to actually do the side effects of protection + * @return Whether or not the armor should protect the player from that attack + */ + public boolean protectPlayer(EntityPlayer player, ItemStack armor, String cause, boolean doProtect); +} diff --git a/BM_src/forestry/api/apiculture/IBee.java b/BM_src/forestry/api/apiculture/IBee.java new file mode 100644 index 00000000..dc4e09fb --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBee.java @@ -0,0 +1,85 @@ +package forestry.api.apiculture; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import forestry.api.genetics.IEffectData; +import forestry.api.genetics.IIndividual; +import forestry.api.genetics.IIndividualLiving; + +/** + * Other implementations than Forestry's default one are not supported. + * + * @author SirSengir + */ +public interface IBee extends IIndividualLiving { + + /** + * @return Bee's genetic information. + */ + IBeeGenome getGenome(); + + /** + * @return Genetic information of the bee's mate, null if unmated. + */ + IBeeGenome getMate(); + + /** + * @return true if the individual is originally of natural origin. + */ + boolean isNatural(); + + /** + * @return generation this individual is removed from the original individual. + */ + int getGeneration(); + + /** + * Set the natural flag on this bee. + * @param flag + */ + void setIsNatural(boolean flag); + + /** + * @return true if the bee is mated with another whose isNatural() doesn't match. + */ + boolean isIrregularMating(); + + IEffectData[] doEffect(IEffectData[] storedData, IBeeHousing housing); + + IEffectData[] doFX(IEffectData[] storedData, IBeeHousing housing); + + /** + * @return true if the bee may spawn offspring + */ + boolean canSpawn(); + + /** + * Determines whether the queen can work. + * + * @param housing the {@link IBeeHousing} the bee currently resides in. + * @return Ordinal of the error code encountered. 0 - EnumErrorCode.OK + */ + int isWorking(IBeeHousing housing); + + boolean hasFlower(IBeeHousing housing); + + ArrayList getSuitableBiomeIds(); + + ItemStack[] getProduceList(); + + ItemStack[] getSpecialtyList(); + + ItemStack[] produceStacks(IBeeHousing housing); + + IBee spawnPrincess(IBeeHousing housing); + + IBee[] spawnDrones(IBeeHousing housing); + + void plantFlowerRandom(IBeeHousing housing); + + IIndividual retrievePollen(IBeeHousing housing); + + boolean pollinateRandom(IBeeHousing housing, IIndividual pollen); + +} diff --git a/BM_src/forestry/api/apiculture/IBeeGenome.java b/BM_src/forestry/api/apiculture/IBeeGenome.java new file mode 100644 index 00000000..b8ef85b9 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeGenome.java @@ -0,0 +1,43 @@ +package forestry.api.apiculture; + +import forestry.api.genetics.EnumTolerance; +import forestry.api.genetics.IFlowerProvider; +import forestry.api.genetics.IGenome; + +/** + * Only the default implementation is supported. + * + * @author SirSengir + * + */ +public interface IBeeGenome extends IGenome { + + IAlleleBeeSpecies getPrimary(); + + IAlleleBeeSpecies getSecondary(); + + float getSpeed(); + + int getLifespan(); + + int getFertility(); + + EnumTolerance getToleranceTemp(); + + EnumTolerance getToleranceHumid(); + + boolean getNocturnal(); + + boolean getTolerantFlyer(); + + boolean getCaveDwelling(); + + IFlowerProvider getFlowerProvider(); + + int getFlowering(); + + int[] getTerritory(); + + IAlleleBeeEffect getEffect(); + +} diff --git a/BM_src/forestry/api/apiculture/IBeeHousing.java b/BM_src/forestry/api/apiculture/IBeeHousing.java new file mode 100644 index 00000000..b3840147 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeHousing.java @@ -0,0 +1,21 @@ +package forestry.api.apiculture; + +import net.minecraft.item.ItemStack; +import forestry.api.genetics.IHousing; + +public interface IBeeHousing extends IBeeModifier, IBeeListener, IHousing { + + ItemStack getQueen(); + + ItemStack getDrone(); + + void setQueen(ItemStack itemstack); + + void setDrone(ItemStack itemstack); + + /** + * @return true if princesses and drones can (currently) mate in this housing to generate queens. + */ + boolean canBreed(); + +} diff --git a/BM_src/forestry/api/apiculture/IBeeListener.java b/BM_src/forestry/api/apiculture/IBeeListener.java new file mode 100644 index 00000000..37eb58ce --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeListener.java @@ -0,0 +1,40 @@ +package forestry.api.apiculture; + +import net.minecraft.item.ItemStack; +import forestry.api.genetics.IIndividual; + +public interface IBeeListener { + + /** + * Called on queen update. + * + * @param queen + */ + void onQueenChange(ItemStack queen); + + /** + * Called when the bees wear out the housing's equipment. + * + * @param amount + * Integer indicating the amount worn out. + */ + void wearOutEquipment(int amount); + + /** + * Called just before the children are generated, and the queen removed. + * + * @param queen + */ + void onQueenDeath(IBee queen); + + /** + * Called after the children have been spawned, but before the queen appears + * + * @param queen + */ + void onPostQueenDeath(IBee queen); + + boolean onPollenRetrieved(IBee queen, IIndividual pollen, boolean isHandled); + + boolean onEggLaid(IBee queen); +} diff --git a/BM_src/forestry/api/apiculture/IBeeModifier.java b/BM_src/forestry/api/apiculture/IBeeModifier.java new file mode 100644 index 00000000..f025d8ab --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeModifier.java @@ -0,0 +1,66 @@ +package forestry.api.apiculture; + +public interface IBeeModifier { + + /** + * @param genome Genome of the bee this modifier is called for. + * @param currentModifier Current modifier. + * @return Float used to modify the base territory. + */ + float getTerritoryModifier(IBeeGenome genome, float currentModifier); + + /** + * @param genome Genome of the bee this modifier is called for. + * @param mate + * @param currentModifier Current modifier. + * @return Float used to modify the base mutation chance. + */ + float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier); + + /** + * @param genome Genome of the bee this modifier is called for. + * @param currentModifier Current modifier. + * @return Float used to modify the life span of queens. + */ + float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier); + + /** + * @param genome Genome of the bee this modifier is called for. + * @param currentModifier Current modifier. + * @return Float modifying the production speed of queens. + */ + float getProductionModifier(IBeeGenome genome, float currentModifier); + + /** + * @param genome Genome of the bee this modifier is called for. + * @return Float modifying the flowering of queens. + */ + float getFloweringModifier(IBeeGenome genome, float currentModifier); + + /** + * @param genome Genome of the bee this modifier is called for. + * @return Float modifying the chance for a swarmer queen to die off. + */ + float getGeneticDecay(IBeeGenome genome, float currentModifier); + + /** + * @return Boolean indicating if housing can ignore rain + */ + boolean isSealed(); + + /** + * @return Boolean indicating if housing can ignore darkness/night + */ + boolean isSelfLighted(); + + /** + * @return Boolean indicating if housing can ignore not seeing the sky + */ + boolean isSunlightSimulated(); + + /** + * @return Boolean indicating whether this housing simulates the nether + */ + boolean isHellish(); + +} diff --git a/BM_src/forestry/api/apiculture/IBeeMutation.java b/BM_src/forestry/api/apiculture/IBeeMutation.java new file mode 100644 index 00000000..def04e56 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeMutation.java @@ -0,0 +1,20 @@ +package forestry.api.apiculture; + +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; + +public interface IBeeMutation extends IMutation { + + IBeeRoot getRoot(); + + /** + * @param housing + * @param allele0 + * @param allele1 + * @param genome0 + * @param genome1 + * @return float representing the chance for mutation to occur. note that this is 0 - 100 based, since it was an integer previously! + */ + float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1); +} diff --git a/BM_src/forestry/api/apiculture/IBeeRoot.java b/BM_src/forestry/api/apiculture/IBeeRoot.java new file mode 100644 index 00000000..8057e20e --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeeRoot.java @@ -0,0 +1,111 @@ +package forestry.api.apiculture; + +import java.util.ArrayList; +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import forestry.api.core.IStructureLogic; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.ISpeciesRoot; + +public interface IBeeRoot extends ISpeciesRoot { + + /** + * @return true if passed item is a Forestry bee. Equal to getType(ItemStack stack) != EnumBeeType.NONE + */ + boolean isMember(ItemStack stack); + + /** + * @return {@link IBee} pattern parsed from the passed stack's nbt data. + */ + IBee getMember(ItemStack stack); + + IBee getMember(NBTTagCompound compound); + + /* GENOME CONVERSION */ + IBee templateAsIndividual(IAllele[] template); + + IBee templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive); + + IBeeGenome templateAsGenome(IAllele[] template); + + IBeeGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive); + + /* BREEDING TRACKER */ + /** + * @param world + * @return {@link IApiaristTracker} associated with the passed world. + */ + IApiaristTracker getBreedingTracker(World world, String player); + + /* BEE SPECIFIC */ + /** + * @return type of bee encoded on the itemstack. EnumBeeType.NONE if it isn't a bee. + */ + EnumBeeType getType(ItemStack stack); + + /** + * @return true if passed item is a drone. Equal to getType(ItemStack stack) == EnumBeeType.DRONE + */ + boolean isDrone(ItemStack stack); + + /** + * @return true if passed item is mated (i.e. a queen) + */ + boolean isMated(ItemStack stack); + + /** + * @param genome + * Valid {@link IBeeGenome} + * @return {@link IBee} from the passed genome + */ + IBee getBee(World world, IBeeGenome genome); + + /** + * Creates an IBee suitable for a queen containing the necessary second genome for the mate. + * + * @param genome + * Valid {@link IBeeGenome} + * @param mate + * Valid {@link IBee} representing the mate. + * @return Mated {@link IBee} from the passed genomes. + */ + IBee getBee(World world, IBeeGenome genome, IBee mate); + + /* TEMPLATES */ + ArrayList getIndividualTemplates(); + + /* MUTATIONS */ + Collection getMutations(boolean shuffle); + + /* GAME MODE */ + void resetBeekeepingMode(); + + ArrayList getBeekeepingModes(); + + IBeekeepingMode getBeekeepingMode(World world); + + IBeekeepingMode getBeekeepingMode(String name); + + void registerBeekeepingMode(IBeekeepingMode mode); + + void setBeekeepingMode(World world, String name); + + /* MISC */ + /** + * @param housing + * Object implementing IBeeHousing. + * @return IBeekeepingLogic + */ + IBeekeepingLogic createBeekeepingLogic(IBeeHousing housing); + + /** + * TileEntities wanting to function as alveary components need to implement structure logic for validation. + * + * @return IStructureLogic for alvearies. + */ + IStructureLogic createAlvearyStructureLogic(IAlvearyComponent structure); + +} diff --git a/BM_src/forestry/api/apiculture/IBeekeepingLogic.java b/BM_src/forestry/api/apiculture/IBeekeepingLogic.java new file mode 100644 index 00000000..b2953a04 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeekeepingLogic.java @@ -0,0 +1,22 @@ +package forestry.api.apiculture; + +import forestry.api.core.INBTTagable; +import forestry.api.genetics.IEffectData; + +public interface IBeekeepingLogic extends INBTTagable { + + /* STATE INFORMATION */ + int getBreedingTime(); + + int getTotalBreedingTime(); + + IBee getQueen(); + + IBeeHousing getHousing(); + + IEffectData[] getEffectData(); + + /* UPDATING */ + void update(); + +} diff --git a/BM_src/forestry/api/apiculture/IBeekeepingMode.java b/BM_src/forestry/api/apiculture/IBeekeepingMode.java new file mode 100644 index 00000000..c788fee2 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IBeekeepingMode.java @@ -0,0 +1,65 @@ +package forestry.api.apiculture; + +import java.util.ArrayList; + +import net.minecraft.world.World; + +public interface IBeekeepingMode extends IBeeModifier { + + /** + * @return Localized name of this beekeeping mode. + */ + String getName(); + + /** + * @return Localized list of strings outlining the behaviour of this beekeeping mode. + */ + ArrayList getDescription(); + + /** + * @return Float used to modify the wear on comb frames. + */ + float getWearModifier(); + + /** + * @param queen + * @return fertility taking into account the birthing queen and surroundings. + */ + int getFinalFertility(IBee queen, World world, int x, int y, int z); + + /** + * @param queen + * @return true if the queen is genetically "fatigued" and should not be reproduced anymore. + */ + boolean isFatigued(IBee queen, IBeeHousing housing); + + /** + * @param queen + * @param housing + * @return true if the queen is being overworked in the bee housing (with chance). will trigger a negative effect. + */ + boolean isOverworked(IBee queen, IBeeHousing housing); + + /** + * + * @param queen + * @param offspring + * @param housing + * @return true if the genetic structure of the queen is breaking down during spawning of the offspring (with chance). will trigger a negative effect. + */ + boolean isDegenerating(IBee queen, IBee offspring, IBeeHousing housing); + + /** + * @param queen + * @return true if an offspring of this queen is considered a natural + */ + boolean isNaturalOffspring(IBee queen); + + /** + * @param queen + * @return true if this mode allows the passed queen or princess to be multiplied + */ + boolean mayMultiplyPrincess(IBee queen); + + +} diff --git a/BM_src/forestry/api/apiculture/IHiveDrop.java b/BM_src/forestry/api/apiculture/IHiveDrop.java new file mode 100644 index 00000000..2604bd72 --- /dev/null +++ b/BM_src/forestry/api/apiculture/IHiveDrop.java @@ -0,0 +1,33 @@ +package forestry.api.apiculture; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Bees can be seeded either as hive drops or as mutation results. + * + * Add IHiveDrops to BeeManager.hiveDrops + * + * @author SirSengir + */ +public interface IHiveDrop { + + ItemStack getPrincess(World world, int x, int y, int z, int fortune); + + Collection getDrones(World world, int x, int y, int z, int fortune); + + Collection getAdditional(World world, int x, int y, int z, int fortune); + + /** + * Chance to drop. Default drops have 80 (= 80 %). + * + * @param world Minecraft world this is called for. + * @param x x-Coordinate of the broken hive. + * @param y y-Coordinate of the broken hive. + * @param z z-Coordinate of the broken hive. + * @return Chance for drop as an integer of 0 - 100. + */ + int getChance(World world, int x, int y, int z); +} diff --git a/BM_src/forestry/api/apiculture/IHiveFrame.java b/BM_src/forestry/api/apiculture/IHiveFrame.java new file mode 100644 index 00000000..50417c4a --- /dev/null +++ b/BM_src/forestry/api/apiculture/IHiveFrame.java @@ -0,0 +1,22 @@ +package forestry.api.apiculture; + +import net.minecraft.item.ItemStack; + +public interface IHiveFrame extends IBeeModifier { + + /** + * Wears out a frame. + * + * @param housing + * IBeeHousing the frame is contained in. + * @param frame + * ItemStack containing the actual frame. + * @param queen + * Current queen in the caller. + * @param wear + * Integer denoting the amount worn out. The wear modifier of the current beekeeping mode has already been taken into account. + * @return ItemStack containing the actual frame with adjusted damage. + */ + ItemStack frameUsed(IBeeHousing housing, ItemStack frame, IBee queen, int wear); + +} diff --git a/BM_src/forestry/api/apiculture/package-info.java b/BM_src/forestry/api/apiculture/package-info.java new file mode 100644 index 00000000..aefc81f5 --- /dev/null +++ b/BM_src/forestry/api/apiculture/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|apiculture") +package forestry.api.apiculture; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/arboriculture/EnumGermlingType.java b/BM_src/forestry/api/arboriculture/EnumGermlingType.java new file mode 100644 index 00000000..b6bb0e9a --- /dev/null +++ b/BM_src/forestry/api/arboriculture/EnumGermlingType.java @@ -0,0 +1,18 @@ +package forestry.api.arboriculture; + +public enum EnumGermlingType { + SAPLING("Sapling"), BLOSSOM("Blossom"), POLLEN("Pollen"), GERMLING("Germling"), NONE("None"); + + public static final EnumGermlingType[] VALUES = values(); + + String name; + + private EnumGermlingType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} diff --git a/BM_src/forestry/api/arboriculture/EnumGrowthConditions.java b/BM_src/forestry/api/arboriculture/EnumGrowthConditions.java new file mode 100644 index 00000000..99e117b4 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/EnumGrowthConditions.java @@ -0,0 +1,5 @@ +package forestry.api.arboriculture; + +public enum EnumGrowthConditions { + HOSTILE, PALTRY, NORMAL, GOOD, EXCELLENT +} diff --git a/BM_src/forestry/api/arboriculture/EnumTreeChromosome.java b/BM_src/forestry/api/arboriculture/EnumTreeChromosome.java new file mode 100644 index 00000000..0caccf80 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/EnumTreeChromosome.java @@ -0,0 +1,86 @@ +package forestry.api.arboriculture; + +import net.minecraftforge.common.EnumPlantType; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IAlleleArea; +import forestry.api.genetics.IAlleleFloat; +import forestry.api.genetics.IAlleleInteger; +import forestry.api.genetics.IAllelePlantType; +import forestry.api.genetics.IChromosomeType; +import forestry.api.genetics.IFruitFamily; +import forestry.api.genetics.ISpeciesRoot; + +public enum EnumTreeChromosome implements IChromosomeType { + + /** + * Determines the following: - WorldGen, including the used wood blocks - {@link IFruitFamily}s supported. Limits which {@link IFruitProvider} + * will actually yield fruit with this species. - Native {@link EnumPlantType} for this tree. Combines with the PLANT chromosome. + */ + SPECIES(IAlleleTreeSpecies.class), + /** + * {@link IGrowthProvider}, determines conditions required by the tree to grow. + */ + GROWTH(IAlleleGrowth.class), + /** + * A float modifying the height of the tree. Taken into account at worldgen. + */ + HEIGHT(IAlleleFloat.class), + /** + * Chance for saplings. + */ + FERTILITY(IAlleleFloat.class), + /** + * {@link IFruitProvider}, determines if and what fruits are grown on the tree. Limited by the {@link IFruitFamily}s the species supports. + */ + FRUITS(IAlleleFruit.class), + /** + * Chance for fruit leaves and/or drops. + */ + YIELD(IAlleleFloat.class), + /** + * May add additional tolerances for {@link EnumPlantTypes}. + */ + PLANT(IAllelePlantType.class), + /** + * Determines the speed at which fruit will ripen on this tree. + */ + SAPPINESS(IAlleleFloat.class), + /** + * Territory for leaf effects. Unused. + */ + TERRITORY(IAlleleArea.class), + /** + * Leaf effect. Unused. + */ + EFFECT(IAlleleLeafEffect.class), + /** + * Amount of random ticks which need to elapse before a sapling will grow into a tree. + */ + MATURATION(IAlleleInteger.class), + + GIRTH(IAlleleInteger.class), + ; + + Class clss; + + EnumTreeChromosome(Class clss) { + this.clss = clss; + } + + @Override + public Class getAlleleClass() { + return clss; + } + + @Override + public String getName() { + return this.toString().toLowerCase(); + } + + @Override + public ISpeciesRoot getSpeciesRoot() { + return AlleleManager.alleleRegistry.getSpeciesRoot("rootTrees"); + } + +} diff --git a/BM_src/forestry/api/arboriculture/IAlleleFruit.java b/BM_src/forestry/api/arboriculture/IAlleleFruit.java new file mode 100644 index 00000000..f468af08 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IAlleleFruit.java @@ -0,0 +1,12 @@ +package forestry.api.arboriculture; + +import forestry.api.genetics.IAllele; + +/** + * Simple allele encapsulating an {@link IFruitProvider}. + */ +public interface IAlleleFruit extends IAllele { + + IFruitProvider getProvider(); + +} diff --git a/BM_src/forestry/api/arboriculture/IAlleleGrowth.java b/BM_src/forestry/api/arboriculture/IAlleleGrowth.java new file mode 100644 index 00000000..60b34a63 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IAlleleGrowth.java @@ -0,0 +1,12 @@ +package forestry.api.arboriculture; + +import forestry.api.genetics.IAllele; + +/** + * Simple allele encapsulating an {@link IGrowthProvider}. + */ +public interface IAlleleGrowth extends IAllele { + + IGrowthProvider getProvider(); + +} diff --git a/BM_src/forestry/api/arboriculture/IAlleleLeafEffect.java b/BM_src/forestry/api/arboriculture/IAlleleLeafEffect.java new file mode 100644 index 00000000..b904be26 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IAlleleLeafEffect.java @@ -0,0 +1,14 @@ +package forestry.api.arboriculture; + +import net.minecraft.world.World; +import forestry.api.genetics.IAlleleEffect; +import forestry.api.genetics.IEffectData; + +/** + * Simple allele encapsulating a leaf effect. (Not implemented) + */ +public interface IAlleleLeafEffect extends IAlleleEffect { + + IEffectData doEffect(ITreeGenome genome, IEffectData storedData, World world, int x, int y, int z); + +} diff --git a/BM_src/forestry/api/arboriculture/IAlleleTreeSpecies.java b/BM_src/forestry/api/arboriculture/IAlleleTreeSpecies.java new file mode 100644 index 00000000..8154121f --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IAlleleTreeSpecies.java @@ -0,0 +1,67 @@ +package forestry.api.arboriculture; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraftforge.common.EnumPlantType; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import forestry.api.genetics.IAlleleSpecies; +import forestry.api.genetics.IFruitFamily; + +public interface IAlleleTreeSpecies extends IAlleleSpecies { + + ITreeRoot getRoot(); + + /** + * @return Native plant type of this species. + */ + EnumPlantType getPlantType(); + + /** + * @return List of all {@link IFruitFamily}s which can grow on leaves generated by this species. + */ + Collection getSuitableFruit(); + + /** + * @return Trunk girth. 1 = 1x1, 2 = 2x2, etc. + */ + @Deprecated + int getGirth(); + + /** + * @param tree + * @param world + * @param x + * @param y + * @param z + * @return Tree generator for the tree at the given location. + */ + WorldGenerator getGenerator(ITree tree, World world, int x, int y, int z); + + /** + * @return All available generator classes for this species. + */ + Class[] getGeneratorClasses(); + + /* TEXTURES AND OVERRIDES */ + int getLeafColour(ITree tree); + + short getLeafIconIndex(ITree tree, boolean fancy); + + @SideOnly(Side.CLIENT) + Icon getGermlingIcon(EnumGermlingType type, int renderPass); + + @SideOnly(Side.CLIENT) + int getGermlingColour(EnumGermlingType type, int renderPass); + + /** + * + * @return Array of ItemStacks representing logs that these tree produces, the first one being the primary one + */ + ItemStack[] getLogStacks(); + +} diff --git a/BM_src/forestry/api/arboriculture/IArboristTracker.java b/BM_src/forestry/api/arboriculture/IArboristTracker.java new file mode 100644 index 00000000..8e7ce8a9 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IArboristTracker.java @@ -0,0 +1,7 @@ +package forestry.api.arboriculture; + +import forestry.api.genetics.IBreedingTracker; + +public interface IArboristTracker extends IBreedingTracker { + +} diff --git a/BM_src/forestry/api/arboriculture/IFruitProvider.java b/BM_src/forestry/api/arboriculture/IFruitProvider.java new file mode 100644 index 00000000..1b00e25d --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IFruitProvider.java @@ -0,0 +1,67 @@ +package forestry.api.arboriculture; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import forestry.api.genetics.IFruitFamily; + +public interface IFruitProvider { + + IFruitFamily getFamily(); + + int getColour(ITreeGenome genome, IBlockAccess world, int x, int y, int z, int ripeningTime); + + boolean markAsFruitLeaf(ITreeGenome genome, World world, int x, int y, int z); + + int getRipeningPeriod(); + + // / Products, Chance + ItemStack[] getProducts(); + + // / Specialty, Chance + ItemStack[] getSpecialty(); + + ItemStack[] getFruits(ITreeGenome genome, World world, int x, int y, int z, int ripeningTime); + + /** + * @return Short, human-readable identifier used in the treealyzer. + */ + String getDescription(); + + /* TEXTURE OVERLAY */ + /** + * @param genome + * @param world + * @param x + * @param y + * @param z + * @param ripeningTime + * Elapsed ripening time for the fruit. + * @param fancy + * @return Icon index of the texture to overlay on the leaf block. + */ + short getIconIndex(ITreeGenome genome, IBlockAccess world, int x, int y, int z, int ripeningTime, boolean fancy); + + /** + * @return true if this fruit provider requires fruit blocks to spawn, false otherwise. + */ + boolean requiresFruitBlocks(); + + /** + * Tries to spawn a fruit block at the potential position when the tree generates. + * + * @param genome + * @param world + * @param x + * @param y + * @param z + * @return true if a fruit block was spawned, false otherwise. + */ + boolean trySpawnFruitBlock(ITreeGenome genome, World world, int x, int y, int z); + + @SideOnly(Side.CLIENT) + void registerIcons(IconRegister register); +} diff --git a/BM_src/forestry/api/arboriculture/IGrowthProvider.java b/BM_src/forestry/api/arboriculture/IGrowthProvider.java new file mode 100644 index 00000000..c6e1b3f2 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IGrowthProvider.java @@ -0,0 +1,33 @@ +package forestry.api.arboriculture; + +import net.minecraft.world.World; + +public interface IGrowthProvider { + + /** + * Check to see whether a sapling at the given location with the given genome can grow into a tree. + * + * @param genome Genome of the tree this is called for. + * @param world Minecraft world the tree will inhabit. + * @param xPos x-Coordinate to attempt growth at. + * @param yPos y-Coordinate to attempt growth at. + * @param zPos z-Coordinate to attempt growth at. + * @param expectedGirth Trunk size of the tree to generate. + * @param expectedHeight Height of the tree to generate. + * @return true if the tree can grow at the given coordinates, false otherwise. + */ + boolean canGrow(ITreeGenome genome, World world, int xPos, int yPos, int zPos, int expectedGirth, int expectedHeight); + + EnumGrowthConditions getGrowthConditions(ITreeGenome genome, World world, int xPos, int yPos, int zPos); + + /** + * @return Short, human-readable identifier used in the treealyzer. + */ + String getDescription(); + + /** + * @return Detailed description of growth behaviour used in the treealyzer. + */ + String[] getInfo(); + +} diff --git a/BM_src/forestry/api/arboriculture/ILeafTickHandler.java b/BM_src/forestry/api/arboriculture/ILeafTickHandler.java new file mode 100644 index 00000000..ce9cdcfa --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ILeafTickHandler.java @@ -0,0 +1,7 @@ +package forestry.api.arboriculture; + +import net.minecraft.world.World; + +public interface ILeafTickHandler { + boolean onRandomLeafTick(ITree tree, World world, int biomeId, int x, int y, int z, boolean isDestroyed); +} diff --git a/BM_src/forestry/api/arboriculture/IToolGrafter.java b/BM_src/forestry/api/arboriculture/IToolGrafter.java new file mode 100644 index 00000000..0de513b4 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/IToolGrafter.java @@ -0,0 +1,19 @@ +package forestry.api.arboriculture; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IToolGrafter { + /** + * Called by leaves to determine the increase in sapling droprate. + * + * @param stack ItemStack containing the grafter. + * @param world Minecraft world the player and the target block inhabit. + * @param x x-Coordinate of the broken leaf block. + * @param y y-Coordinate of the broken leaf block. + * @param z z-Coordinate of the broken leaf block. + * @return Float representing the factor the usual drop chance is to be multiplied by. + */ + float getSaplingModifier(ItemStack stack, World world, EntityPlayer player, int x, int y, int z); +} diff --git a/BM_src/forestry/api/arboriculture/ITree.java b/BM_src/forestry/api/arboriculture/ITree.java new file mode 100644 index 00000000..33b9c256 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITree.java @@ -0,0 +1,92 @@ +package forestry.api.arboriculture; + +import java.util.EnumSet; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraftforge.common.EnumPlantType; +import forestry.api.genetics.IEffectData; +import forestry.api.genetics.IIndividual; + +public interface ITree extends IIndividual { + + void mate(ITree other); + + IEffectData[] doEffect(IEffectData[] storedData, World world, int biomeid, int x, int y, int z); + + IEffectData[] doFX(IEffectData[] storedData, World world, int biomeid, int x, int y, int z); + + ITreeGenome getGenome(); + + ITreeGenome getMate(); + + EnumSet getPlantTypes(); + + ITree[] getSaplings(World world, int x, int y, int z, float modifier); + + ItemStack[] getProduceList(); + + ItemStack[] getSpecialtyList(); + + ItemStack[] produceStacks(World world, int x, int y, int z, int ripeningTime); + + /** + * + * @param world + * @param x + * @param y + * @param z + * @return Boolean indicating whether a sapling can stay planted at the given position. + */ + boolean canStay(World world, int x, int y, int z); + + /** + * + * @param world + * @param x + * @param y + * @param z + * @return Boolean indicating whether a sapling at the given position can grow into a tree. + */ + boolean canGrow(World world, int x, int y, int z, int expectedGirth, int expectedHeight); + + /** + * @return Integer denoting the maturity (block ticks) required for a sapling to attempt to grow into a tree. + */ + int getRequiredMaturity(); + + /** + * @return Integer denoting how resilient leaf blocks are against adverse influences (i.e. caterpillars). + */ + int getResilience(); + + /** + * @param world + * @param x + * @param y + * @param z + * @return Integer denoting the size of the tree trunk. + */ + int getGirth(World world, int x, int y, int z); + + + + /** + * + * @param world + * @param x + * @param y + * @param z + * @return Growth conditions at the given position. + */ + EnumGrowthConditions getGrowthCondition(World world, int x, int y, int z); + + WorldGenerator getTreeGenerator(World world, int x, int y, int z, boolean wasBonemealed); + + ITree copy(); + + boolean isPureBred(EnumTreeChromosome chromosome); + + boolean canBearFruit(); +} diff --git a/BM_src/forestry/api/arboriculture/ITreeGenome.java b/BM_src/forestry/api/arboriculture/ITreeGenome.java new file mode 100644 index 00000000..f636d010 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITreeGenome.java @@ -0,0 +1,40 @@ +package forestry.api.arboriculture; + +import java.util.EnumSet; + +import net.minecraftforge.common.EnumPlantType; +import forestry.api.genetics.IGenome; + +public interface ITreeGenome extends IGenome { + + IAlleleTreeSpecies getPrimary(); + + IAlleleTreeSpecies getSecondary(); + + IFruitProvider getFruitProvider(); + + IGrowthProvider getGrowthProvider(); + + float getHeight(); + + float getFertility(); + + /** + * @return Determines either a) how many fruit leaves there are or b) the chance for any fruit leave to drop a sapling. Exact usage determined by the + * IFruitProvider + */ + float getYield(); + + float getSappiness(); + + EnumSet getPlantTypes(); + + /** + * @return Amount of random block ticks required for a sapling to mature into a fully grown tree. + */ + int getMaturationTime(); + + int getGirth(); + + IAlleleLeafEffect getEffect(); +} diff --git a/BM_src/forestry/api/arboriculture/ITreeModifier.java b/BM_src/forestry/api/arboriculture/ITreeModifier.java new file mode 100644 index 00000000..18a12a54 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITreeModifier.java @@ -0,0 +1,40 @@ +package forestry.api.arboriculture; + +public interface ITreeModifier { + + /** + * + * @param genome + * @return Float used to modify the height. + */ + float getHeightModifier(ITreeGenome genome, float currentModifier); + + /** + * + * @param genome + * @return Float used to modify the yield. + */ + float getYieldModifier(ITreeGenome genome, float currentModifier); + + /** + * + * @param genome + * @return Float used to modify the sappiness. + */ + float getSappinessModifier(ITreeGenome genome, float currentModifier); + + /** + * + * @param genome + * @return Float used to modify the maturation. + */ + float getMaturationModifier(ITreeGenome genome, float currentModifier); + + /** + * @param genome0 + * @param genome1 + * @return Float used to modify the base mutation chance. + */ + float getMutationModifier(ITreeGenome genome0, ITreeGenome genome1, float currentModifier); + +} diff --git a/BM_src/forestry/api/arboriculture/ITreeMutation.java b/BM_src/forestry/api/arboriculture/ITreeMutation.java new file mode 100644 index 00000000..538f2c5e --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITreeMutation.java @@ -0,0 +1,28 @@ +package forestry.api.arboriculture; + +import net.minecraft.world.World; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; +import forestry.api.genetics.ISpeciesRoot; + +public interface ITreeMutation extends IMutation { + + /** + * @return {@link ISpeciesRoot} this mutation is associated with. + */ + ITreeRoot getRoot(); + + /** + * @param world + * @param x + * @param y + * @param z + * @param allele0 + * @param allele1 + * @param genome0 + * @param genome1 + * @return float representing the chance for mutation to occur. note that this is 0 - 100 based, since it was an integer previously! + */ + float getChance(World world, int x, int y, int z, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1); +} diff --git a/BM_src/forestry/api/arboriculture/ITreeRoot.java b/BM_src/forestry/api/arboriculture/ITreeRoot.java new file mode 100644 index 00000000..e26bc7b0 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITreeRoot.java @@ -0,0 +1,77 @@ +package forestry.api.arboriculture; + +import java.util.ArrayList; +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IChromosome; +import forestry.api.genetics.IIndividual; +import forestry.api.genetics.ISpeciesRoot; + +public interface ITreeRoot extends ISpeciesRoot { + + boolean isMember(ItemStack itemstack); + + ITree getMember(ItemStack itemstack); + + ITree getMember(NBTTagCompound compound); + + ITreeGenome templateAsGenome(IAllele[] template); + + ITreeGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive); + + /** + * @param world + * @return {@link IArboristTracker} associated with the passed world. + */ + IArboristTracker getBreedingTracker(World world, String player); + + /* TREE SPECIFIC */ + /** + * Register a leaf tick handler. + * @param handler the {@link ILeafTickHandler} to register. + */ + void registerLeafTickHandler(ILeafTickHandler handler); + + Collection getLeafTickHandlers(); + + /** + * @return type of tree encoded on the itemstack. EnumBeeType.NONE if it isn't a tree. + */ + EnumGermlingType getType(ItemStack stack); + + ITree getTree(World world, int x, int y, int z); + + ITree getTree(World world, ITreeGenome genome); + + boolean plantSapling(World world, ITree tree, String owner, int x, int y, int z); + + boolean setLeaves(World world, IIndividual tree, String owner, int x, int y, int z); + + IChromosome[] templateAsChromosomes(IAllele[] template); + + IChromosome[] templateAsChromosomes(IAllele[] templateActive, IAllele[] templateInactive); + + boolean setFruitBlock(World world, IAlleleFruit allele, float sappiness, short[] indices, int x, int y, int z); + + /* GAME MODE */ + ArrayList getTreekeepingModes(); + + ITreekeepingMode getTreekeepingMode(World world); + + ITreekeepingMode getTreekeepingMode(String name); + + void registerTreekeepingMode(ITreekeepingMode mode); + + void setTreekeepingMode(World world, String name); + + /* TEMPLATES */ + ArrayList getIndividualTemplates(); + + /* MUTATIONS */ + Collection getMutations(boolean shuffle); + +} diff --git a/BM_src/forestry/api/arboriculture/ITreekeepingMode.java b/BM_src/forestry/api/arboriculture/ITreekeepingMode.java new file mode 100644 index 00000000..92e65cc3 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/ITreekeepingMode.java @@ -0,0 +1,17 @@ +package forestry.api.arboriculture; + +import java.util.ArrayList; + +public interface ITreekeepingMode extends ITreeModifier { + + /** + * @return Localized name of this treekeeping mode. + */ + String getName(); + + /** + * @return Localized list of strings outlining the behaviour of this treekeeping mode. + */ + ArrayList getDescription(); + +} diff --git a/BM_src/forestry/api/arboriculture/TreeManager.java b/BM_src/forestry/api/arboriculture/TreeManager.java new file mode 100644 index 00000000..2ae534a1 --- /dev/null +++ b/BM_src/forestry/api/arboriculture/TreeManager.java @@ -0,0 +1,11 @@ +package forestry.api.arboriculture; + +public class TreeManager { + public static int treeSpeciesCount = 0; + + /** + * Get your own reference to this via AlleleManager.alleleRegistry.getSpeciesRoot("rootTrees") and save it somewhere. + */ + @Deprecated + public static ITreeRoot treeInterface; +} diff --git a/BM_src/forestry/api/arboriculture/package-info.java b/BM_src/forestry/api/arboriculture/package-info.java new file mode 100644 index 00000000..928619af --- /dev/null +++ b/BM_src/forestry/api/arboriculture/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|arboriculture") +package forestry.api.arboriculture; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/circuits/ChipsetManager.java b/BM_src/forestry/api/circuits/ChipsetManager.java new file mode 100644 index 00000000..8baa4c95 --- /dev/null +++ b/BM_src/forestry/api/circuits/ChipsetManager.java @@ -0,0 +1,8 @@ +package forestry.api.circuits; + +public class ChipsetManager { + + public static ISolderManager solderManager; + public static ICircuitRegistry circuitRegistry; + +} diff --git a/BM_src/forestry/api/circuits/ICircuit.java b/BM_src/forestry/api/circuits/ICircuit.java new file mode 100644 index 00000000..1607036d --- /dev/null +++ b/BM_src/forestry/api/circuits/ICircuit.java @@ -0,0 +1,27 @@ +package forestry.api.circuits; + +import java.util.List; + +import net.minecraft.tileentity.TileEntity; + +public interface ICircuit { + String getUID(); + + boolean requiresDiscovery(); + + int getLimit(); + + String getName(); + + boolean isCircuitable(TileEntity tile); + + void onInsertion(int slot, TileEntity tile); + + void onLoad(int slot, TileEntity tile); + + void onRemoval(int slot, TileEntity tile); + + void onTick(int slot, TileEntity tile); + + void addTooltip(List list); +} diff --git a/BM_src/forestry/api/circuits/ICircuitBoard.java b/BM_src/forestry/api/circuits/ICircuitBoard.java new file mode 100644 index 00000000..dbd79461 --- /dev/null +++ b/BM_src/forestry/api/circuits/ICircuitBoard.java @@ -0,0 +1,26 @@ +package forestry.api.circuits; + +import java.util.List; + +import net.minecraft.tileentity.TileEntity; +import forestry.api.core.INBTTagable; + +public interface ICircuitBoard extends INBTTagable { + + int getPrimaryColor(); + + int getSecondaryColor(); + + void addTooltip(List list); + + void onInsertion(TileEntity tile); + + void onLoad(TileEntity tile); + + void onRemoval(TileEntity tile); + + void onTick(TileEntity tile); + + ICircuit[] getCircuits(); + +} diff --git a/BM_src/forestry/api/circuits/ICircuitLayout.java b/BM_src/forestry/api/circuits/ICircuitLayout.java new file mode 100644 index 00000000..5dc73187 --- /dev/null +++ b/BM_src/forestry/api/circuits/ICircuitLayout.java @@ -0,0 +1,11 @@ +package forestry.api.circuits; + +public interface ICircuitLayout { + + String getUID(); + + String getName(); + + String getUsage(); + +} diff --git a/BM_src/forestry/api/circuits/ICircuitLibrary.java b/BM_src/forestry/api/circuits/ICircuitLibrary.java new file mode 100644 index 00000000..1f38d6cc --- /dev/null +++ b/BM_src/forestry/api/circuits/ICircuitLibrary.java @@ -0,0 +1,5 @@ +package forestry.api.circuits; + +public interface ICircuitLibrary { + +} diff --git a/BM_src/forestry/api/circuits/ICircuitRegistry.java b/BM_src/forestry/api/circuits/ICircuitRegistry.java new file mode 100644 index 00000000..4fe690f1 --- /dev/null +++ b/BM_src/forestry/api/circuits/ICircuitRegistry.java @@ -0,0 +1,37 @@ +package forestry.api.circuits; + +import java.util.HashMap; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ICircuitRegistry { + + /* CIRCUITS */ + HashMap getRegisteredCircuits(); + + void registerCircuit(ICircuit circuit); + + ICircuit getCircuit(String uid); + + ICircuitLibrary getCircuitLibrary(World world, String playername); + + void registerLegacyMapping(int id, String uid); + + ICircuit getFromLegacyMap(int id); + + /* LAYOUTS */ + HashMap getRegisteredLayouts(); + + void registerLayout(ICircuitLayout layout); + + ICircuitLayout getLayout(String uid); + + ICircuitLayout getDefaultLayout(); + + + ICircuitBoard getCircuitboard(ItemStack itemstack); + + boolean isChipset(ItemStack itemstack); + +} diff --git a/BM_src/forestry/api/circuits/ISolderManager.java b/BM_src/forestry/api/circuits/ISolderManager.java new file mode 100644 index 00000000..e9420ffb --- /dev/null +++ b/BM_src/forestry/api/circuits/ISolderManager.java @@ -0,0 +1,9 @@ +package forestry.api.circuits; + +import net.minecraft.item.ItemStack; + +public interface ISolderManager { + + void addRecipe(ICircuitLayout layout, ItemStack resource, ICircuit circuit); + +} diff --git a/BM_src/forestry/api/circuits/package-info.java b/BM_src/forestry/api/circuits/package-info.java new file mode 100644 index 00000000..597af6a8 --- /dev/null +++ b/BM_src/forestry/api/circuits/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|circuits") +package forestry.api.circuits; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/core/BlockInterface.java b/BM_src/forestry/api/core/BlockInterface.java new file mode 100644 index 00000000..08a246a4 --- /dev/null +++ b/BM_src/forestry/api/core/BlockInterface.java @@ -0,0 +1,34 @@ +package forestry.api.core; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.FMLLog; + +public class BlockInterface { + /** + * Rather limited function to retrieve block ids. + * + * @param ident + * @return ItemStack representing the block. + */ + @Deprecated + public static ItemStack getBlock(String ident) { + ItemStack item = null; + + try { + String pack = ItemInterface.class.getPackage().getName(); + pack = pack.substring(0, pack.lastIndexOf('.')); + String itemClass = pack.substring(0, pack.lastIndexOf('.')) + ".core.config.ForestryBlock"; + Object obj = Class.forName(itemClass).getField(ident).get(null); + if (obj instanceof Block) + item = new ItemStack((Block) obj); + else if (obj instanceof ItemStack) + item = (ItemStack) obj; + } catch (Exception ex) { + FMLLog.warning("Could not retrieve Forestry block identified by: " + ident); + } + + return item; + } + +} diff --git a/BM_src/forestry/api/core/EnumHumidity.java b/BM_src/forestry/api/core/EnumHumidity.java new file mode 100644 index 00000000..f45c4290 --- /dev/null +++ b/BM_src/forestry/api/core/EnumHumidity.java @@ -0,0 +1,72 @@ +package forestry.api.core; + +import java.util.ArrayList; + +/** + * Many things Forestry use temperature and humidity of a biome to determine whether they can or how they can work or spawn at a given location. + * + * This enum concerns humidity. + */ +public enum EnumHumidity { + ARID("Arid"), NORMAL("Normal"), DAMP("Damp"); + + /** + * Populated by Forestry with vanilla biomes. Add additional arid biomes here. (ex. desert) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList aridBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional damp biomes here. (ex. jungle) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList dampBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional normal biomes here. + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList normalBiomeIds = new ArrayList(); + + public final String name; + + private EnumHumidity(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + @Deprecated + public static ArrayList getBiomeIds(EnumHumidity humidity) { + switch (humidity) { + case ARID: + return aridBiomeIds; + case DAMP: + return dampBiomeIds; + case NORMAL: + default: + return normalBiomeIds; + } + } + + /** + * Determines the EnumHumidity given a floating point representation of Minecraft Rainfall + * @param rawHumidity raw rainfall value + * @return EnumHumidity corresponding to rainfall value + */ + public static EnumHumidity getFromValue(float rawHumidity) { + EnumHumidity value = EnumHumidity.ARID; + + if (rawHumidity >= 0.9f) { + value = EnumHumidity.DAMP; + } + else if (rawHumidity >= 0.3f) { + value = EnumHumidity.NORMAL; + } + + return value; + } +} diff --git a/BM_src/forestry/api/core/EnumTemperature.java b/BM_src/forestry/api/core/EnumTemperature.java new file mode 100644 index 00000000..30de6e24 --- /dev/null +++ b/BM_src/forestry/api/core/EnumTemperature.java @@ -0,0 +1,142 @@ +package forestry.api.core; + +import java.util.ArrayList; + +import net.minecraft.util.Icon; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.BiomeDictionary; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * Many things Forestry use temperature and humidity of a biome to determine whether they can or how they can work or spawn at a given location. + * + * This enum concerns temperature. + */ +public enum EnumTemperature { + NONE("None", "habitats/ocean"), ICY("Icy", "habitats/snow"), COLD("Cold", "habitats/taiga"), + NORMAL("Normal", "habitats/plains"), WARM("Warm", "habitats/jungle"), HOT("Hot", "habitats/desert"), HELLISH("Hellish", "habitats/nether"); + + /** + * Populated by Forestry with vanilla biomes. Add additional icy/snow biomes here. (ex. snow plains) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList icyBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional cold biomes here. (ex. taiga) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList coldBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional normal biomes here. (ex. forest, plains) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList normalBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional warm biomes here. (ex. jungle) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList warmBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional hot biomes here. (ex. desert) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList hotBiomeIds = new ArrayList(); + /** + * Populated by Forestry with vanilla biomes. Add additional hellish biomes here. (ex. nether) + * @deprecated Biomes will be checked live rather than relying on cached values, so you don't have to register them. + */ + @Deprecated + public static ArrayList hellishBiomeIds = new ArrayList(); + + public final String name; + public final String iconIndex; + + private EnumTemperature(String name, String iconIndex) { + this.name = name; + this.iconIndex = iconIndex; + } + + public String getName() { + return this.name; + } + + @SideOnly(Side.CLIENT) + public Icon getIcon() { + return ForestryAPI.textureManager.getDefault(iconIndex); + } + /** + * @deprecated Switching most internals to use getFromValue to not rely on cached values. + */ + public static ArrayList getBiomeIds(EnumTemperature temperature) { + + switch (temperature) { + case ICY: + return icyBiomeIds; + case COLD: + return coldBiomeIds; + case WARM: + return warmBiomeIds; + case HOT: + return hotBiomeIds; + case HELLISH: + return hellishBiomeIds; + case NORMAL: + default: + return normalBiomeIds; + } + + } + + /** + * Determines if a given BiomeGenBase is of HELLISH temperature, since it is treated seperatly from actual temperature values. + * Uses the BiomeDictionary. + * @param biomeGen BiomeGenBase of the biome in question + * @return true, if the BiomeGenBase is a Nether-type biome; false otherwise. + */ + public static boolean isBiomeHellish(BiomeGenBase biomeGen) { + return BiomeDictionary.isBiomeOfType(biomeGen, BiomeDictionary.Type.NETHER); + } + + /** + * Determines if a given biomeID is of HELLISH temperature, since it is treated seperatly from actual temperature values. + * Uses the BiomeDictionary. + * @param biomeID ID of the BiomeGenBase in question + * @return true, if the biomeID is a Nether-type biome; false otherwise. + */ + public static boolean isBiomeHellish(int biomeID) { + return BiomeDictionary.isBiomeRegistered(biomeID) && BiomeDictionary.isBiomeOfType(BiomeGenBase.biomeList[biomeID], BiomeDictionary.Type.NETHER); + } + + /** + * Determines the EnumTemperature given a floating point representation of + * Minecraft temperature. Hellish biomes are handled based on their biome + * type - check isBiomeHellish. + * @param rawTemp raw temperature value + * @return EnumTemperature corresponding to value of rawTemp + */ + public static EnumTemperature getFromValue(float rawTemp) { + EnumTemperature value = EnumTemperature.ICY; + + if (rawTemp >= 2.0f) { + value = EnumTemperature.HOT; + } + else if (rawTemp >= 1.2f) { + value = EnumTemperature.WARM; + } + else if (rawTemp >= 0.2f) { + value = EnumTemperature.NORMAL; + } + else if (rawTemp >= 0.05f) { + value = EnumTemperature.COLD; + } + + return value; + } + +} diff --git a/BM_src/forestry/api/core/ForestryAPI.java b/BM_src/forestry/api/core/ForestryAPI.java new file mode 100644 index 00000000..ac5471ca --- /dev/null +++ b/BM_src/forestry/api/core/ForestryAPI.java @@ -0,0 +1,47 @@ +package forestry.api.core; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * Forestry's API is divided into several subcategories to make it easier to understand. + * + * If you need to distribute API files, try to only include the parts you are actually + * using to minimize conflicts due to API changes. + * + * .core - Miscallenous base classes and interfaces as well as some basics for tools, armor, game modes and stuff needed by biome mods. + * .fuels - Managers and classes to facilitate adding fuels to various engines and machines. + * .recipes - Managers and helpers to facilitate adding new recipes to various machines. + * .storage - Managers, events and interfaces for defining new backpacks and handling backpack behaviour. + * .mail - Anything related to handling letters and adding new mail carrier systems. + * .genetics - Shared code for all genetic subclasses. + * \ .apiculture - Bees. + * \ .arboriculture - Trees. + * \ .lepidopterology - Butterflies. + * + * Note that if Forestry is not present, all these references will be null. + */ +public class ForestryAPI { + + /** + * The main mod instance for Forestry. + */ + public static Object instance; + + /** + * A {@link ITextureManager} needed for some things in the API. + */ + @SideOnly(Side.CLIENT) + public static ITextureManager textureManager; + + /** + * The currently active {@link IGameMode}. + */ + public static IGameMode activeMode; + + /** + * Provides information on certain Forestry constants (Villager IDs, Chest gen keys, etc) + */ + public static IForestryConstants forestryConstants; + +} diff --git a/BM_src/forestry/api/core/ForestryEvent.java b/BM_src/forestry/api/core/ForestryEvent.java new file mode 100644 index 00000000..476d5342 --- /dev/null +++ b/BM_src/forestry/api/core/ForestryEvent.java @@ -0,0 +1,51 @@ +package forestry.api.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.event.Event; +import forestry.api.genetics.IAlleleSpecies; +import forestry.api.genetics.IBreedingTracker; +import forestry.api.genetics.IMutation; +import forestry.api.genetics.ISpeciesRoot; + +public abstract class ForestryEvent extends Event { + + private static abstract class BreedingEvent extends ForestryEvent { + public final ISpeciesRoot root; + public final IBreedingTracker tracker; + public final String username; + + private BreedingEvent(ISpeciesRoot root, String username, IBreedingTracker tracker) { + super(); + this.root = root; + this.username = username; + this.tracker = tracker; + } + } + + public static class SpeciesDiscovered extends BreedingEvent { + public final IAlleleSpecies species; + public SpeciesDiscovered(ISpeciesRoot root, String username, IAlleleSpecies species, IBreedingTracker tracker) { + super(root, username, tracker); + this.species = species; + } + } + + public static class MutationDiscovered extends BreedingEvent { + public final IMutation allele; + public MutationDiscovered(ISpeciesRoot root, String username, IMutation allele, IBreedingTracker tracker) { + super(root, username, tracker); + this.allele = allele; + } + } + + public static class SyncedBreedingTracker extends ForestryEvent { + public final IBreedingTracker tracker; + public final EntityPlayer player; + public SyncedBreedingTracker(IBreedingTracker tracker, EntityPlayer player) { + super(); + this.tracker = tracker; + this.player = player; + } + + } +} diff --git a/BM_src/forestry/api/core/GlobalManager.java b/BM_src/forestry/api/core/GlobalManager.java new file mode 100644 index 00000000..354d9e34 --- /dev/null +++ b/BM_src/forestry/api/core/GlobalManager.java @@ -0,0 +1,35 @@ +package forestry.api.core; + +import java.util.ArrayList; + +/** + * Used mostly by hives to determine whether they can spawn at a certain + * position. Rather limited and hackish. + * @depreciated there are better ways now + */ +@Deprecated +public class GlobalManager { + + /** + * @deprecated use Block.isGenMineableReplaceable(), anything that accepts + * dirt will be accepted + */ + @Deprecated + public static ArrayList dirtBlockIds = new ArrayList(); + /** + * @deprecated use Block.isGenMineableReplaceable(), anything that accepts + * sand will be accepted + */ + @Deprecated + public static ArrayList sandBlockIds = new ArrayList(); + /** + * @deprecated why is this needed? + */ + @Deprecated + public static ArrayList snowBlockIds = new ArrayList(); + /** + * @deprecated Ensure your block's isLeaves function returns true instead. + */ + @Deprecated + public static ArrayList leafBlockIds = new ArrayList(); +} diff --git a/BM_src/forestry/api/core/IArmorNaturalist.java b/BM_src/forestry/api/core/IArmorNaturalist.java new file mode 100644 index 00000000..893b7fc3 --- /dev/null +++ b/BM_src/forestry/api/core/IArmorNaturalist.java @@ -0,0 +1,20 @@ +package forestry.api.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IArmorNaturalist { + + /** + * Called when the naturalist's armor acts as spectacles for seeing pollinated tree leaves/flowers. + * + * @param player + * Player doing the viewing + * @param armor + * Armor item + * @param doSee + * Whether or not to actually do the side effects of viewing + * @return true if the armor actually allows the player to see pollination. + */ + public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee); +} diff --git a/BM_src/forestry/api/core/IForestryConstants.java b/BM_src/forestry/api/core/IForestryConstants.java new file mode 100644 index 00000000..1db60dc9 --- /dev/null +++ b/BM_src/forestry/api/core/IForestryConstants.java @@ -0,0 +1,19 @@ +package forestry.api.core; + +public interface IForestryConstants { + + /** + * @return The villager ID for the Apiarist Villager. + */ + public int getApicultureVillagerID(); + + /** + * @return The villager ID for the Arborist Villager. + */ + public int getArboricultureVillagerID(); + + /** + * @return The ChestGenHooks key for adding items to the Forestry Villager chest. + */ + public String getVillagerChestGenKey(); +} diff --git a/BM_src/forestry/api/core/IGameMode.java b/BM_src/forestry/api/core/IGameMode.java new file mode 100644 index 00000000..8b77983b --- /dev/null +++ b/BM_src/forestry/api/core/IGameMode.java @@ -0,0 +1,36 @@ +package forestry.api.core; + +import net.minecraft.item.ItemStack; + +public interface IGameMode { + + /** + * @return Human-readable identifier for the game mode. (i.e. 'EASY', 'NORMAL', 'HARD') + */ + String getIdentifier(); + + /** + * @param ident Identifier for the setting. (See the gamemode config.) + * @return Value of the requested setting, false if unknown setting. + */ + boolean getBooleanSetting(String ident); + + /** + * @param ident Identifier for the setting. (See the gamemode config.) + * @return Value of the requested setting, 0 if unknown setting. + */ + int getIntegerSetting(String ident); + + /** + * @param ident Identifier for the setting. (See the gamemode config.) + * @return Value of the requested setting, 0 if unknown setting. + */ + float getFloatSetting(String ident); + + /** + * @param ident Identifier for the setting. (See the gamemode config.) + * @return Value of the requested setting, an itemstack containing an apple if unknown setting. + */ + ItemStack getStackSetting(String ident); + +} diff --git a/BM_src/forestry/api/core/IIconProvider.java b/BM_src/forestry/api/core/IIconProvider.java new file mode 100644 index 00000000..9a868021 --- /dev/null +++ b/BM_src/forestry/api/core/IIconProvider.java @@ -0,0 +1,19 @@ +package forestry.api.core; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.util.Icon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** + * Provides icons, needed in some interfaces, most notably for bees and trees. + */ +public interface IIconProvider { + + @SideOnly(Side.CLIENT) + Icon getIcon(short texUID); + + @SideOnly(Side.CLIENT) + void registerIcons(IconRegister register); + +} diff --git a/BM_src/forestry/api/core/INBTTagable.java b/BM_src/forestry/api/core/INBTTagable.java new file mode 100644 index 00000000..c2e71ec5 --- /dev/null +++ b/BM_src/forestry/api/core/INBTTagable.java @@ -0,0 +1,9 @@ +package forestry.api.core; + +import net.minecraft.nbt.NBTTagCompound; + +public interface INBTTagable { + void readFromNBT(NBTTagCompound nbttagcompound); + + void writeToNBT(NBTTagCompound nbttagcompound); +} diff --git a/BM_src/forestry/api/core/IPlugin.java b/BM_src/forestry/api/core/IPlugin.java new file mode 100644 index 00000000..c0fdbd42 --- /dev/null +++ b/BM_src/forestry/api/core/IPlugin.java @@ -0,0 +1,32 @@ +package forestry.api.core; + +/** + * Optional way to hook into Forestry. + * + * Plugin classes can reside in any package, their class name however has to start with 'Plugin', i.e. 'PluginMyStuff'. + * + * @author SirSengir + */ +public interface IPlugin { + + /** + * @return true if the plugin is to be loaded. + */ + public boolean isAvailable(); + + /** + * Called during Forestry's @PreInit. + */ + public void preInit(); + + /** + * Called at the start of Forestry's @PostInit. + */ + public void doInit(); + + /** + * Called at the end of Forestry's @PostInit. + */ + public void postInit(); + +} diff --git a/BM_src/forestry/api/core/IStructureLogic.java b/BM_src/forestry/api/core/IStructureLogic.java new file mode 100644 index 00000000..500613a9 --- /dev/null +++ b/BM_src/forestry/api/core/IStructureLogic.java @@ -0,0 +1,15 @@ +package forestry.api.core; + +public interface IStructureLogic extends INBTTagable { + + /** + * @return String unique to the type of structure controlled by this structure logic. + */ + String getTypeUID(); + + /** + * Called by {@link ITileStructure}'s validateStructure(). + */ + void validateStructure(); + +} diff --git a/BM_src/forestry/api/core/ITextureManager.java b/BM_src/forestry/api/core/ITextureManager.java new file mode 100644 index 00000000..93347b35 --- /dev/null +++ b/BM_src/forestry/api/core/ITextureManager.java @@ -0,0 +1,15 @@ +package forestry.api.core; + +import net.minecraft.util.Icon; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ITextureManager { + + void registerIconProvider(IIconProvider provider); + + Icon getIcon(short texUID); + + Icon getDefault(String ident); +} diff --git a/BM_src/forestry/api/core/ITileStructure.java b/BM_src/forestry/api/core/ITileStructure.java new file mode 100644 index 00000000..f89fdc11 --- /dev/null +++ b/BM_src/forestry/api/core/ITileStructure.java @@ -0,0 +1,58 @@ +package forestry.api.core; + +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; + +/** + * The basis for multiblock components. + */ +public interface ITileStructure { + + /** + * @return String unique to the type of structure controlled by this structure logic. Should map to {@link IStructureLogic} + */ + String getTypeUID(); + + /** + * Should map to {@link IStructureLogic} + */ + void validateStructure(); + + /** + * Called when the structure resets. + */ + void onStructureReset(); + + /** + * @return TileEntity that is the master in this structure, null if no structure exists. + */ + ITileStructure getCentralTE(); + + /** + * Called to set the master TileEntity. Implementing TileEntity should keep track of the master's coordinates, not refer to the TE object itself. + * + * @param tile + */ + void setCentralTE(TileEntity tile); + + /** + * @return IInventory representing the TE's inventory. + */ + IInventory getInventory(); + + /** + * Only called on Forestry's own blocks. + */ + void makeMaster(); + + /** + * @return true if this TE is the master in a structure, false otherwise. + */ + boolean isMaster(); + + /** + * @return true if the TE is master or has a master. + */ + boolean isIntegratedIntoStructure(); + +} diff --git a/BM_src/forestry/api/core/IToolScoop.java b/BM_src/forestry/api/core/IToolScoop.java new file mode 100644 index 00000000..574a6edf --- /dev/null +++ b/BM_src/forestry/api/core/IToolScoop.java @@ -0,0 +1,8 @@ +package forestry.api.core; + +/** + * Marks a tool as a scoop. + */ +public interface IToolScoop { + +} diff --git a/BM_src/forestry/api/core/ItemInterface.java b/BM_src/forestry/api/core/ItemInterface.java new file mode 100644 index 00000000..1d669076 --- /dev/null +++ b/BM_src/forestry/api/core/ItemInterface.java @@ -0,0 +1,42 @@ +package forestry.api.core; + +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.FMLLog; +import java.lang.reflect.Method; + +/** + * This is going away someday, use FML's GameRegistry instead. + * @deprecated + */ +@Deprecated +public class ItemInterface { + + /** + * Get items here! + * + * Blocks currently not supported. + * + * @param ident + * @return ItemStack representing the item, null if not found. + */ + public static ItemStack getItem(String ident) { + ItemStack item = null; + + try { + String pack = ItemInterface.class.getPackage().getName(); + pack = pack.substring(0, pack.lastIndexOf('.')); + String itemClass = pack.substring(0, pack.lastIndexOf('.')) + ".core.config.ForestryItem"; + Object[] enums = Class.forName(itemClass).getEnumConstants(); + for (Object e : enums) { + if (e.toString().equals(ident)) { + Method m = e.getClass().getMethod("getItemStack"); + return (ItemStack) m.invoke(e); + } + } + } catch (Exception ex) { + FMLLog.warning("Could not retrieve Forestry item identified by: " + ident); + } + + return item; + } +} diff --git a/BM_src/forestry/api/core/PluginInfo.java b/BM_src/forestry/api/core/PluginInfo.java new file mode 100644 index 00000000..16827d9f --- /dev/null +++ b/BM_src/forestry/api/core/PluginInfo.java @@ -0,0 +1,49 @@ +package forestry.api.core; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Optional annotation to provide additional information on IPlugins. This information will be available via the "/forestry plugin info $pluginID" command ingame. + * + * @author SirSengir + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface PluginInfo { + + /** + * @return Unique identifier for the plugin, no spaces! + */ + String pluginID(); + + /** + * @return Nice and readable plugin name. + */ + String name(); + + /** + * @return Plugin author's name. + */ + String author() default ""; + + /** + * @return URL of plugin homepage. + */ + String url() default ""; + + /** + * @return Version of the plugin, if any. + */ + String version() default ""; + + /** + * @return Short description what the plugin does. + */ + String description() default ""; + + /** + * @return Not used (yet?). + */ + String help() default ""; + +} diff --git a/BM_src/forestry/api/core/Tabs.java b/BM_src/forestry/api/core/Tabs.java new file mode 100644 index 00000000..b43f7a4c --- /dev/null +++ b/BM_src/forestry/api/core/Tabs.java @@ -0,0 +1,14 @@ +package forestry.api.core; + +import net.minecraft.creativetab.CreativeTabs; + +/** + * References to the specialised tabs added by Forestry to creative inventory. + */ +public class Tabs { + + public static CreativeTabs tabApiculture; + public static CreativeTabs tabArboriculture; + public static CreativeTabs tabLepidopterology; + +} diff --git a/BM_src/forestry/api/core/package-info.java b/BM_src/forestry/api/core/package-info.java new file mode 100644 index 00000000..fde2e5f9 --- /dev/null +++ b/BM_src/forestry/api/core/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="Forestry", provides="ForestryAPI|core") +package forestry.api.core; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/farming/Farmables.java b/BM_src/forestry/api/farming/Farmables.java new file mode 100644 index 00000000..b307c378 --- /dev/null +++ b/BM_src/forestry/api/farming/Farmables.java @@ -0,0 +1,15 @@ +package forestry.api.farming; + +import java.util.Collection; +import java.util.HashMap; + +public class Farmables { + /** + * Can be used to add IFarmables to some of the vanilla farm logics. + * + * Identifiers: farmArboreal farmWheat farmGourd farmInfernal farmPoales farmSucculentes farmVegetables farmShroom + */ + public static HashMap> farmables = new HashMap>(); + + public static IFarmInterface farmInterface; +} diff --git a/BM_src/forestry/api/farming/ICrop.java b/BM_src/forestry/api/farming/ICrop.java new file mode 100644 index 00000000..bad171ae --- /dev/null +++ b/BM_src/forestry/api/farming/ICrop.java @@ -0,0 +1,16 @@ +package forestry.api.farming; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; + +public interface ICrop { + + /** + * Harvests this crop. Performs the necessary manipulations to set the crop into a "harvested" state. + * + * @return Products harvested. + */ + Collection harvest(); + +} diff --git a/BM_src/forestry/api/farming/IFarmComponent.java b/BM_src/forestry/api/farming/IFarmComponent.java new file mode 100644 index 00000000..bf30de49 --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmComponent.java @@ -0,0 +1,12 @@ +package forestry.api.farming; + +import forestry.api.core.ITileStructure; + +public interface IFarmComponent extends ITileStructure { + + boolean hasFunction(); + + void registerListener(IFarmListener listener); + + void removeListener(IFarmListener listener); +} diff --git a/BM_src/forestry/api/farming/IFarmHousing.java b/BM_src/forestry/api/farming/IFarmHousing.java new file mode 100644 index 00000000..a6895228 --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmHousing.java @@ -0,0 +1,68 @@ +package forestry.api.farming; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +public interface IFarmHousing { + + int[] getCoords(); + + int[] getArea(); + + int[] getOffset(); + + World getWorld(); + + /** + * Will run the work cycle on a master TE. Will do nothing on any other farm component. + * + * @return true if any work was done, false otherwise. + */ + boolean doWork(); + + boolean hasLiquid(FluidStack liquid); + + void removeLiquid(FluidStack liquid); + + boolean hasResources(ItemStack[] resources); + + void removeResources(ItemStack[] resources); + + /** + * Callback for {@link IFarmLogic}s to plant a sapling, seed, germling, stem. Will remove the appropriate germling from the farm's inventory. It's up to the + * logic to only call this on a valid location. + * + * @param farmable + * @param world + * @param x + * @param y + * @param z + * @return true if planting was successful, false otherwise. + */ + boolean plantGermling(IFarmable farmable, World world, int x, int y, int z); + + /* INTERACTION WITH HATCHES */ + boolean acceptsAsGermling(ItemStack itemstack); + + boolean acceptsAsResource(ItemStack itemstack); + + boolean acceptsAsFertilizer(ItemStack itemstack); + + /* LOGIC */ + /** + * Set a farm logic for the given direction. UP/DOWN/UNKNOWN are invalid! + * + * @param direction + * @param logic + */ + void setFarmLogic(ForgeDirection direction, IFarmLogic logic); + + /** + * Reset the farm logic for the given direction to default. UP/DOWN/UNKNOWN are invalid! + * + * @param direction + */ + void resetFarmLogic(ForgeDirection direction); +} diff --git a/BM_src/forestry/api/farming/IFarmInterface.java b/BM_src/forestry/api/farming/IFarmInterface.java new file mode 100644 index 00000000..d784876f --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmInterface.java @@ -0,0 +1,15 @@ +package forestry.api.farming; + +import forestry.api.core.IStructureLogic; + +public interface IFarmInterface { + + /** + * Creates {@link IStructureLogic} for use in farm components. + * + * @param structure + * {@link IFarmComponent} to create the logic for. + * @return {@link IStructureLogic} for use in farm components + */ + IStructureLogic createFarmStructureLogic(IFarmComponent structure); +} diff --git a/BM_src/forestry/api/farming/IFarmListener.java b/BM_src/forestry/api/farming/IFarmListener.java new file mode 100644 index 00000000..f3c1069b --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmListener.java @@ -0,0 +1,71 @@ +package forestry.api.farming; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.ForgeDirection; + +public interface IFarmListener { + + /** + * Called before a crop is harvested. + * + * @param crop + * ICrop about to be harvested. + * @return true to cancel further processing of this crop. + */ + boolean beforeCropHarvest(ICrop crop); + + /** + * Called after a crop has been harvested, but before harvested items are stowed in the farms inventory. + * + * @param harvested + * Collection of harvested stacks. May be manipulated. Ensure removal of stacks with 0 or less items! + * @param crop + * Harvested {@link ICrop} + */ + void afterCropHarvest(Collection harvested, ICrop crop); + + /** + * Called after the stack of collected items has been returned by the farm logic, but before it is added to the farm's pending queue. + * + * @param collected + * Collection of collected stacks. May be manipulated. Ensure removal of stacks with 0 or less items! + * @param logic + */ + void hasCollected(Collection collected, IFarmLogic logic); + + /** + * Called after farmland has successfully been cultivated by a farm logic. + * + * @param logic + * @param x + * @param y + * @param z + * @param direction + * @param extent + */ + void hasCultivated(IFarmLogic logic, int x, int y, int z, ForgeDirection direction, int extent); + + /** + * Called after the stack of harvested crops has been returned by the farm logic, but before it is added to the farm's pending queue. + * + * @param harvested + * @param logic + * @param x + * @param y + * @param z + * @param direction + * @param extent + */ + void hasScheduledHarvest(Collection harvested, IFarmLogic logic, int x, int y, int z, ForgeDirection direction, int extent); + + /** + * Can be used to cancel farm task on a per side/{@link IFarmLogic} basis. + * + * @param logic + * @param direction + * @return true to skip any work action on the given logic and direction for this work cycle. + */ + boolean cancelTask(IFarmLogic logic, ForgeDirection direction); +} diff --git a/BM_src/forestry/api/farming/IFarmLogic.java b/BM_src/forestry/api/farming/IFarmLogic.java new file mode 100644 index 00000000..7313a7ca --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmLogic.java @@ -0,0 +1,34 @@ +package forestry.api.farming; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.ForgeDirection; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public interface IFarmLogic { + + int getFertilizerConsumption(); + + int getWaterConsumption(float hydrationModifier); + + boolean isAcceptedResource(ItemStack itemstack); + + boolean isAcceptedGermling(ItemStack itemstack); + + Collection collect(); + + boolean cultivate(int x, int y, int z, ForgeDirection direction, int extent); + + Collection harvest(int x, int y, int z, ForgeDirection direction, int extent); + + @SideOnly(Side.CLIENT) + Icon getIcon(); + + ResourceLocation getSpriteSheet(); + + String getName(); +} diff --git a/BM_src/forestry/api/farming/IFarmable.java b/BM_src/forestry/api/farming/IFarmable.java new file mode 100644 index 00000000..e3110ca4 --- /dev/null +++ b/BM_src/forestry/api/farming/IFarmable.java @@ -0,0 +1,54 @@ +package forestry.api.farming; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * IGermling describes a crop or other harvestable object and can be used to inspect item stacks and blocks for matches. + */ +public interface IFarmable { + + /** + * @param world + * @param x + * @param y + * @param z + * @return true if the block at the given location is a "sapling" for this type, i.e. a non-harvestable immature version of the crop. + */ + boolean isSaplingAt(World world, int x, int y, int z); + + /** + * @param world + * @param x + * @param y + * @param z + * @return {@link ICrop} if the block at the given location is a harvestable and mature crop, null otherwise. + */ + ICrop getCropAt(World world, int x, int y, int z); + + /** + * @param itemstack + * @return true if the item is a valid germling (plantable sapling, seed, etc.) for this type. + */ + boolean isGermling(ItemStack itemstack); + + /** + * @param itemstack + * @return true if the item is something that can drop from this type without actually being harvested as a crop. (Apples or sapling from decaying leaves.) + */ + boolean isWindfall(ItemStack itemstack); + + /** + * Plants a sapling by manipulating the world. The {@link IFarmLogic} should have verified the given location as valid. Called by the {@link IFarmHousing} + * which handles resources. + * + * @param germling + * @param world + * @param x + * @param y + * @param z + * @return true on success, false otherwise. + */ + boolean plantSaplingAt(ItemStack germling, World world, int x, int y, int z); + +} diff --git a/BM_src/forestry/api/farming/package-info.java b/BM_src/forestry/api/farming/package-info.java new file mode 100644 index 00000000..bc3d2ce3 --- /dev/null +++ b/BM_src/forestry/api/farming/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|farming") +package forestry.api.farming; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/food/BeverageManager.java b/BM_src/forestry/api/food/BeverageManager.java new file mode 100644 index 00000000..35efb5d6 --- /dev/null +++ b/BM_src/forestry/api/food/BeverageManager.java @@ -0,0 +1,8 @@ +package forestry.api.food; + +public class BeverageManager { + public static IBeverageEffect[] effectList = new IBeverageEffect[128]; + + public static IInfuserManager infuserManager; + public static IIngredientManager ingredientManager; +} diff --git a/BM_src/forestry/api/food/IBeverageEffect.java b/BM_src/forestry/api/food/IBeverageEffect.java new file mode 100644 index 00000000..14b91b13 --- /dev/null +++ b/BM_src/forestry/api/food/IBeverageEffect.java @@ -0,0 +1,12 @@ +package forestry.api.food; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public interface IBeverageEffect { + int getId(); + + void doEffect(World world, EntityPlayer player); + + String getDescription(); +} diff --git a/BM_src/forestry/api/food/IInfuserManager.java b/BM_src/forestry/api/food/IInfuserManager.java new file mode 100644 index 00000000..87527731 --- /dev/null +++ b/BM_src/forestry/api/food/IInfuserManager.java @@ -0,0 +1,17 @@ +package forestry.api.food; + +import net.minecraft.item.ItemStack; + +public interface IInfuserManager { + + void addMixture(int meta, ItemStack ingredient, IBeverageEffect effect); + + void addMixture(int meta, ItemStack[] ingredients, IBeverageEffect effect); + + ItemStack getSeasoned(ItemStack base, ItemStack[] ingredients); + + boolean hasMixtures(ItemStack[] ingredients); + + ItemStack[] getRequired(ItemStack[] ingredients); + +} diff --git a/BM_src/forestry/api/food/IIngredientManager.java b/BM_src/forestry/api/food/IIngredientManager.java new file mode 100644 index 00000000..a7851c97 --- /dev/null +++ b/BM_src/forestry/api/food/IIngredientManager.java @@ -0,0 +1,11 @@ +package forestry.api.food; + +import net.minecraft.item.ItemStack; + +public interface IIngredientManager { + + String getDescription(ItemStack itemstack); + + void addIngredient(ItemStack ingredient, String description); + +} diff --git a/BM_src/forestry/api/food/package-info.java b/BM_src/forestry/api/food/package-info.java new file mode 100644 index 00000000..3731563a --- /dev/null +++ b/BM_src/forestry/api/food/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|food") +package forestry.api.food; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/fuels/EngineBronzeFuel.java b/BM_src/forestry/api/fuels/EngineBronzeFuel.java new file mode 100644 index 00000000..4a07e054 --- /dev/null +++ b/BM_src/forestry/api/fuels/EngineBronzeFuel.java @@ -0,0 +1,30 @@ +package forestry.api.fuels; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; + +public class EngineBronzeFuel { + /** + * Item that is valid fuel for a biogas engine. + */ + public final Fluid liquid; + /** + * Power produced by this fuel per work cycle of the engine. + */ + public final int powerPerCycle; + /** + * How many work cycles a single "stack" of this type lasts. + */ + public final int burnDuration; + /** + * By how much the normal heat dissipation rate of 1 is multiplied when using this fuel type. + */ + public final int dissipationMultiplier; + + public EngineBronzeFuel(Fluid liquid, int powerPerCycle, int burnDuration, int dissipationMultiplier) { + this.liquid = liquid; + this.powerPerCycle = powerPerCycle; + this.burnDuration = burnDuration; + this.dissipationMultiplier = dissipationMultiplier; + } +} diff --git a/BM_src/forestry/api/fuels/EngineCopperFuel.java b/BM_src/forestry/api/fuels/EngineCopperFuel.java new file mode 100644 index 00000000..bb2d817b --- /dev/null +++ b/BM_src/forestry/api/fuels/EngineCopperFuel.java @@ -0,0 +1,26 @@ +package forestry.api.fuels; + +import net.minecraft.item.ItemStack; + +public class EngineCopperFuel { + + /** + * Item that is valid fuel for a peat-fired engine. + */ + public final ItemStack fuel; + /** + * Power produced by this fuel per work cycle. + */ + public final int powerPerCycle; + /** + * Amount of work cycles this item lasts before being consumed. + */ + public final int burnDuration; + + public EngineCopperFuel(ItemStack fuel, int powerPerCycle, int burnDuration) { + this.fuel = fuel; + this.powerPerCycle = powerPerCycle; + this.burnDuration = burnDuration; + } + +} diff --git a/BM_src/forestry/api/fuels/FermenterFuel.java b/BM_src/forestry/api/fuels/FermenterFuel.java new file mode 100644 index 00000000..6d7cf379 --- /dev/null +++ b/BM_src/forestry/api/fuels/FermenterFuel.java @@ -0,0 +1,24 @@ +package forestry.api.fuels; + +import net.minecraft.item.ItemStack; + +public class FermenterFuel { + /** + * Item that is a valid fuel for the fermenter (i.e. fertilizer). + */ + public final ItemStack item; + /** + * How much is fermeted per work cycle, i.e. how much biomass is produced per cycle. + */ + public final int fermentPerCycle; + /** + * Amount of work cycles a single item of this fuel lasts before expiring. + */ + public final int burnDuration; + + public FermenterFuel(ItemStack item, int fermentPerCycle, int burnDuration) { + this.item = item; + this.fermentPerCycle = fermentPerCycle; + this.burnDuration = burnDuration; + } +} diff --git a/BM_src/forestry/api/fuels/FuelManager.java b/BM_src/forestry/api/fuels/FuelManager.java new file mode 100644 index 00000000..969fb872 --- /dev/null +++ b/BM_src/forestry/api/fuels/FuelManager.java @@ -0,0 +1,29 @@ +package forestry.api.fuels; + +import java.util.HashMap; + + +public class FuelManager { + /** + * Add new fuels for the fermenter here (i.e. fertilizer). Will accept Items, ItemStacks and Strings (Ore Dictionary) + */ + public static HashMap fermenterFuel; + /** + * Add new resources for the moistener here (i.e. wheat) + */ + public static HashMap moistenerResource; + /** + * Add new substrates for the rainmaker here + */ + public static HashMap rainSubstrate; + /** + * Add new fuels for EngineBronze (= biogas engine) here + */ + public static HashMap bronzeEngineFuel; + /** + * Add new fuels for EngineCopper (= peat-fired engine) here + */ + public static HashMap copperEngineFuel; + + // Generator fuel list in GeneratorFuel.class +} diff --git a/BM_src/forestry/api/fuels/GeneratorFuel.java b/BM_src/forestry/api/fuels/GeneratorFuel.java new file mode 100644 index 00000000..032f8e4c --- /dev/null +++ b/BM_src/forestry/api/fuels/GeneratorFuel.java @@ -0,0 +1,31 @@ +package forestry.api.fuels; + +import java.util.HashMap; + +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +public class GeneratorFuel { + + public static HashMap fuels = new HashMap(); + + /** + * LiquidStack representing the fuel type and amount consumed per triggered cycle. + */ + public final FluidStack fuelConsumed; + /** + * EU emitted per tick while this fuel is being consumed in the generator (i.e. biofuel = 32, biomass = 8). + */ + public final int eu; + /** + * Rate at which the fuel is consumed. 1 - Every tick 2 - Every second tick 3 - Every third tick etc. + */ + public final int rate; + + public GeneratorFuel(FluidStack fuelConsumed, int eu, int rate) { + this.fuelConsumed = fuelConsumed; + this.eu = eu; + this.rate = rate; + } + +} diff --git a/BM_src/forestry/api/fuels/MoistenerFuel.java b/BM_src/forestry/api/fuels/MoistenerFuel.java new file mode 100644 index 00000000..15bbb1b8 --- /dev/null +++ b/BM_src/forestry/api/fuels/MoistenerFuel.java @@ -0,0 +1,29 @@ +package forestry.api.fuels; + +import net.minecraft.item.ItemStack; + +public class MoistenerFuel { + /** + * The item to use + */ + public final ItemStack item; + /** + * The item that leaves the moistener's working slot (i.e. mouldy wheat, decayed wheat, mulch) + */ + public final ItemStack product; + /** + * How much this item contributes to the final product of the moistener (i.e. mycelium) + */ + public final int moistenerValue; + /** + * What stage this product represents. Resources with lower stage value will be consumed first. + */ + public final int stage; + + public MoistenerFuel(ItemStack item, ItemStack product, int stage, int moistenerValue) { + this.item = item; + this.product = product; + this.stage = stage; + this.moistenerValue = moistenerValue; + } +} diff --git a/BM_src/forestry/api/fuels/RainSubstrate.java b/BM_src/forestry/api/fuels/RainSubstrate.java new file mode 100644 index 00000000..7aac5bce --- /dev/null +++ b/BM_src/forestry/api/fuels/RainSubstrate.java @@ -0,0 +1,35 @@ +package forestry.api.fuels; + +import net.minecraft.item.ItemStack; + +public class RainSubstrate { + /** + * Rain substrate capable of activating the rainmaker. + */ + public ItemStack item; + /** + * Duration of the rain shower triggered by this substrate in Minecraft ticks. + */ + public int duration; + /** + * Speed of activation sequence triggered. + */ + public float speed; + + public boolean reverse; + + public RainSubstrate(ItemStack item, int duration, float speed) { + this(item, duration, speed, false); + } + + public RainSubstrate(ItemStack item, float speed) { + this(item, 0, speed, true); + } + + public RainSubstrate(ItemStack item, int duration, float speed, boolean reverse) { + this.item = item; + this.duration = duration; + this.speed = speed; + this.reverse = reverse; + } +} diff --git a/BM_src/forestry/api/fuels/package-info.java b/BM_src/forestry/api/fuels/package-info.java new file mode 100644 index 00000000..a1c1324b --- /dev/null +++ b/BM_src/forestry/api/fuels/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|fuels") +package forestry.api.fuels; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/genetics/AlleleManager.java b/BM_src/forestry/api/genetics/AlleleManager.java new file mode 100644 index 00000000..24fda425 --- /dev/null +++ b/BM_src/forestry/api/genetics/AlleleManager.java @@ -0,0 +1,24 @@ +package forestry.api.genetics; + +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + +/** + * Holds a static reference to the {@link IAlleleRegistry}. + */ +public class AlleleManager { + /** + * Main access point for all things related to genetics. See {@link IAlleleRegistry} for details. + */ + public static IAlleleRegistry alleleRegistry; + /** + * Translates plain leaf blocks into genetic data. Used by bees and butterflies to convert and pollinate foreign leaf blocks. + */ + public static HashMap ersatzSpecimen = new HashMap(); + /** + * Translates plain saplings into genetic data. Used by the treealyzer and the farm to convert foreign saplings. + */ + public static HashMap ersatzSaplings = new HashMap(); + +} diff --git a/BM_src/forestry/api/genetics/EnumTolerance.java b/BM_src/forestry/api/genetics/EnumTolerance.java new file mode 100644 index 00000000..a30f64f2 --- /dev/null +++ b/BM_src/forestry/api/genetics/EnumTolerance.java @@ -0,0 +1,11 @@ +package forestry.api.genetics; + +public enum EnumTolerance { + NONE, + + BOTH_1, BOTH_2, BOTH_3, BOTH_4, BOTH_5, + + UP_1, UP_2, UP_3, UP_4, UP_5, + + DOWN_1, DOWN_2, DOWN_3, DOWN_4, DOWN_5 +} diff --git a/BM_src/forestry/api/genetics/IAllele.java b/BM_src/forestry/api/genetics/IAllele.java new file mode 100644 index 00000000..1b03d6dc --- /dev/null +++ b/BM_src/forestry/api/genetics/IAllele.java @@ -0,0 +1,29 @@ +package forestry.api.genetics; + +/** + * An {@link IIndividual}'s {@link IGenome} is composed of {@link IChromosome}s consisting each of a primary and secondary {@link IAllele}. + * + * {@link IAllele}s hold all information regarding an {@link IIndividual}'s traits, from species to size, temperature tolerances, etc. + * + * Should be extended for different types of alleles. ISpeciesAllele, IBiomeAllele, etc. + * + * @author SirSengir + */ +public interface IAllele { + + /** + * @return A unique string identifier for this allele. + */ + String getUID(); + + /** + * @return true if the allele is dominant, false otherwise. + */ + boolean isDominant(); + + /** + * @return Localized short, human-readable identifier used in tooltips and beealyzer. + */ + String getName(); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleArea.java b/BM_src/forestry/api/genetics/IAlleleArea.java new file mode 100644 index 00000000..308d98ca --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleArea.java @@ -0,0 +1,10 @@ +package forestry.api.genetics; + +/** + * Simple interface to allow adding additional alleles containing float values. + */ +public interface IAlleleArea extends IAllele { + + int[] getValue(); + +} \ No newline at end of file diff --git a/BM_src/forestry/api/genetics/IAlleleBoolean.java b/BM_src/forestry/api/genetics/IAlleleBoolean.java new file mode 100644 index 00000000..a60c8e72 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleBoolean.java @@ -0,0 +1,11 @@ +package forestry.api.genetics; + +/** + * Simple interface to allow adding additional alleles containing float values. + */ +public interface IAlleleBoolean extends IAllele { + + boolean getValue(); + + +} diff --git a/BM_src/forestry/api/genetics/IAlleleEffect.java b/BM_src/forestry/api/genetics/IAlleleEffect.java new file mode 100644 index 00000000..3de0e4a8 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleEffect.java @@ -0,0 +1,21 @@ +package forestry.api.genetics; + +/** + * Basic effect allele. + */ +public interface IAlleleEffect extends IAllele { + /** + * @return true if this effect can combine with the effect on other allele (i.e. run before or after). combination can only occur if both effects are + * combinable. + */ + boolean isCombinable(); + + /** + * Returns the passed data storage if it is valid for this effect or a new one if the passed storage object was invalid for this effect. + * + * @param storedData + * @return {@link IEffectData} for the next cycle. + */ + IEffectData validateStorage(IEffectData storedData); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleFloat.java b/BM_src/forestry/api/genetics/IAlleleFloat.java new file mode 100644 index 00000000..2ace6d1d --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleFloat.java @@ -0,0 +1,10 @@ +package forestry.api.genetics; + +/** + * Simple interface to allow adding additional alleles containing float values. + */ +public interface IAlleleFloat extends IAllele { + + float getValue(); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleFlowers.java b/BM_src/forestry/api/genetics/IAlleleFlowers.java new file mode 100644 index 00000000..c35f485b --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleFlowers.java @@ -0,0 +1,11 @@ +package forestry.api.genetics; + + +public interface IAlleleFlowers extends IAllele { + + /** + * @return FlowerProvider + */ + IFlowerProvider getProvider(); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleHandler.java b/BM_src/forestry/api/genetics/IAlleleHandler.java new file mode 100644 index 00000000..593351b2 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleHandler.java @@ -0,0 +1,36 @@ +package forestry.api.genetics; + +/** + * @author Alex Binnie + * + * Handler for events that occur in IAlleleRegistry, such as registering alleles, branches etc. Useful for handling plugin specific behavior (i.e. + * creating a list of all bee species etc.) + * + */ +public interface IAlleleHandler { + + /** + * Called when an allele is registered with {@link IAlleleRegistry}. + * + * @param allele + * Allele which was registered. + */ + public void onRegisterAllele(IAllele allele); + + /** + * Called when a classification is registered with {@link IAlleleRegistry}. + * + * @param classification + * Classification which was registered. + */ + public void onRegisterClassification(IClassification classification); + + /** + * Called when a fruit family is registered with {@link IAlleleRegistry}. + * + * @param family + * Fruit family which was registered. + */ + public void onRegisterFruitFamily(IFruitFamily family); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleInteger.java b/BM_src/forestry/api/genetics/IAlleleInteger.java new file mode 100644 index 00000000..61e089e3 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleInteger.java @@ -0,0 +1,10 @@ +package forestry.api.genetics; + +/** + * Simple interface to allow adding additional alleles containing integer values. + */ +public interface IAlleleInteger extends IAllele { + + int getValue(); + +} diff --git a/BM_src/forestry/api/genetics/IAllelePlantType.java b/BM_src/forestry/api/genetics/IAllelePlantType.java new file mode 100644 index 00000000..345f4e7d --- /dev/null +++ b/BM_src/forestry/api/genetics/IAllelePlantType.java @@ -0,0 +1,11 @@ +package forestry.api.genetics; + +import java.util.EnumSet; + +import net.minecraftforge.common.EnumPlantType; + +public interface IAllelePlantType extends IAllele { + + public EnumSet getPlantTypes(); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleRegistry.java b/BM_src/forestry/api/genetics/IAlleleRegistry.java new file mode 100644 index 00000000..56ee2174 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleRegistry.java @@ -0,0 +1,221 @@ +package forestry.api.genetics; + +import java.util.Collection; +import java.util.Map; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import forestry.api.genetics.IClassification.EnumClassLevel; + +/** + * Manages {@link ISpeciesRoot}, {@link IAllele}s, {@link IFruitFamily}s, {@link IClassification}, the blacklist and allows creation of research notes. + * + * @author SirSengir + */ +public interface IAlleleRegistry { + + /* SPECIES ROOT CLASSES */ + /** + * Register a {@link ISpeciesRoot}. + * @param root {@link ISpeciesRoot} to register. + */ + void registerSpeciesRoot(ISpeciesRoot root); + + /** + * @return Map of all registered {@link ISpeciesRoot}. + */ + Map getSpeciesRoot(); + + /** + * Retrieve the {@link ISpeciesRoot} with the given uid. + * @param uid Unique id for the species class, i.e. "rootBees", "rootTrees", "rootButterflies". + * @return {@link ISpeciesRoot} if it exists, null otherwise. + */ + ISpeciesRoot getSpeciesRoot(String uid); + + /** + * Retrieve a matching {@link ISpeciesRoot} for the given itemstack. + * @param stack An itemstack possibly containing NBT data which can be converted by a species root. + * @return {@link ISpeciesRoot} if found, null otherwise. + */ + ISpeciesRoot getSpeciesRoot(ItemStack stack); + + /** + * Retrieve a matching {@link ISpeciesRoot} for the given {@link IIndividual}-class. + * @param clz Class extending {@link IIndividual}. + * @return {@link ISpeciesRoot} if found, null otherwise. + */ + ISpeciesRoot getSpeciesRoot(Class clz); + + /* INDIVIDUAL */ + /** + * Tests the itemstack for genetic information. + * + * @param stack + * @return true if the itemstack is an individual. + */ + boolean isIndividual(ItemStack stack); + + /** + * Retrieve genetic information from an itemstack. + * + * @param stack + * Stack to retrieve genetic information for. + * @return IIndividual containing genetic information, null if none could be extracted. + */ + IIndividual getIndividual(ItemStack stack); + + /* ALLELES */ + + /** + * @return HashMap of all currently registered alleles. + */ + Map getRegisteredAlleles(); + + /** + * Registers an allele. + * + * @param allele + * IAllele to register. + */ + void registerAllele(IAllele allele); + + /** + * @return HashMap of all registered deprecated alleles and their corresponding replacements + */ + Map getDeprecatedAlleleReplacements(); + + /** + * Registers an old allele UID and the new IAllele to replace instances of it with. + * + * @param deprecatedAlleleUID + * the old allele's UID + * @param replacement + * the IAllele that the deprecated Allele will be replaced with. + */ + void registerDeprecatedAlleleReplacement(String deprecatedAlleleUID, IAllele replacement); + + /** + * Gets an allele + * + * @param uid + * String based unique identifier of the allele to retrieve. + * @return IAllele if found or a replacement is found in the Deprecated Allele map, null otherwise. + */ + IAllele getAllele(String uid); + + /* THIS SHOULD BE PHASED OUT */ + @Deprecated + void reloadMetaMap(World world); + + @Deprecated + IAllele getFromMetaMap(int meta); + + @Deprecated + int getFromUIDMap(String uid); + + /* CLASSIFICATIONS */ + /** + * @return HashMap of all currently registered classifications. + */ + Map getRegisteredClassifications(); + + /** + * Registers a classification. + * + * @param classification + * IClassification to register. + */ + void registerClassification(IClassification classification); + + /** + * Creates and returns a classification. + * + * @param level + * EnumClassLevel of the classification to create. + * @param uid + * String based unique identifier. Implementation will throw an exception if the key is already taken. + * @param scientific + * Binomial for the given classification. + * @return Created {@link IClassification} for easier chaining. + */ + IClassification createAndRegisterClassification(EnumClassLevel level, String uid, String scientific); + + /** + * Gets a classification. + * + * @param uid + * String based unique identifier of the classification to retrieve. + * @return {@link IClassification} if found, null otherwise. + */ + IClassification getClassification(String uid); + + /* FRUIT FAMILIES */ + /** + * Get all registered fruit families. + * + * @return A map of registered fruit families and their UIDs. + */ + Map getRegisteredFruitFamilies(); + + /** + * Registers a new fruit family. + * + * @param family + */ + void registerFruitFamily(IFruitFamily family); + + /** + * Retrieves a fruit family identified by uid. + * + * @param uid + * @return {IFruitFamily} if found, false otherwise. + */ + IFruitFamily getFruitFamily(String uid); + + /* ALLELE HANDLERS */ + /** + * Registers a new IAlleleHandler + * + * @param handler + * IAlleleHandler to register. + */ + void registerAlleleHandler(IAlleleHandler handler); + + /* BLACKLIST */ + /** + * Blacklist an allele identified by its UID from mutation. + * + * @param uid + * UID of the allele to blacklist. + */ + void blacklistAllele(String uid); + + /** + * @return Current blacklisted alleles. + */ + Collection getAlleleBlacklist(); + + /** + * @param uid + * UID of the species to vet. + * @return true if the allele is blacklisted. + */ + boolean isBlacklisted(String uid); + + /* RESEARCH */ + /** + * @param researcher Username of the player who researched this note. + * @param species {@link IAlleleSpecies} to encode on the research note. + * @return An itemstack containing a research note with the given species encoded onto it. + */ + ItemStack getSpeciesNoteStack(String researcher, IAlleleSpecies species); + + /** + * @param researcher Username of the player who researched this note. + * @param mutation {@link IMutation} to encode on the research note. + * @return An itemstack containing a research note with the given mutation encoded onto it. + */ + ItemStack getMutationNoteStack(String researcher, IMutation mutation); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleSpecies.java b/BM_src/forestry/api/genetics/IAlleleSpecies.java new file mode 100644 index 00000000..5e6850d1 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleSpecies.java @@ -0,0 +1,106 @@ +package forestry.api.genetics; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; +import forestry.api.core.IIconProvider; + +/** + * Basic species allele. + */ +public interface IAlleleSpecies extends IAllele { + + /** + * @return the {@link ISpeciesRoot} associated with this species. + */ + ISpeciesRoot getRoot(); + + /** + * @return Localized short description of this species. (May be null.) + */ + String getDescription(); + + /** + * Binomial name of the species sans genus ("Apis"). Returning "humboldti" will have the bee species flavour name be "Apis humboldti". Feel free to use fun + * names or return null. + * + * @return flavour text (may be null) + */ + String getBinomial(); + + /** + * Authority for the binomial name, e.g. "Sengir" on species of base Forestry. + * + * @return flavour text (may be null) + */ + String getAuthority(); + + /** + * @return Branch this species is associated with. + */ + IClassification getBranch(); + + /* RESEARCH */ + /** + * Complexity determines the difficulty researching a species. The values of primary and secondary are + * added together (and rounded) to determine the amount of pairs needed for successful research. + * @return Values between 3 - 11 are useful. + */ + int getComplexity(); + + /** + * @param itemstack + * @return A float signifying the chance for the passed itemstack to yield a research success. + */ + float getResearchSuitability(ItemStack itemstack); + + /** + * @param world + * @param researcher + * @param individual + * @param bountyLevel + * @return Array of itemstacks representing the bounty for this research success. + */ + ItemStack[] getResearchBounty(World world, String researcher, IIndividual individual, int bountyLevel); + + /* CLIMATE */ + /** + * @return Preferred temperature + */ + EnumTemperature getTemperature(); + + /** + * @return Preferred humidity + */ + EnumHumidity getHumidity(); + + /* MISC */ + /** + * @return true if the species icon should have a glowing effect. + */ + boolean hasEffect(); + + /** + * @return true if the species should not be displayed in NEI or creative inventory. + */ + boolean isSecret(); + + /** + * @return true to have the species count against the species total. + */ + boolean isCounted(); + + /* APPEARANCE */ + /** + * @param renderPass Render pass to get the colour for. + * @return Colour to use for the render pass. + */ + int getIconColour(int renderPass); + + @SideOnly(Side.CLIENT) + IIconProvider getIconProvider(); + +} diff --git a/BM_src/forestry/api/genetics/IAlleleTolerance.java b/BM_src/forestry/api/genetics/IAlleleTolerance.java new file mode 100644 index 00000000..11d5c688 --- /dev/null +++ b/BM_src/forestry/api/genetics/IAlleleTolerance.java @@ -0,0 +1,10 @@ +package forestry.api.genetics; + +/** + * Simple interface to allow adding additional alleles containing float values. + */ +public interface IAlleleTolerance extends IAllele { + + EnumTolerance getValue(); + +} diff --git a/BM_src/forestry/api/genetics/IBreedingTracker.java b/BM_src/forestry/api/genetics/IBreedingTracker.java new file mode 100644 index 00000000..e51e58ba --- /dev/null +++ b/BM_src/forestry/api/genetics/IBreedingTracker.java @@ -0,0 +1,93 @@ +package forestry.api.genetics; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import forestry.api.apiculture.IBeekeepingMode; + +/** + * Keeps track of who bred and/or discovered which species in a world. + * + * @author SirSengir + */ +public interface IBreedingTracker { + + /** + * @return Name of the current {@link IBeekeepingMode}. + */ + String getModeName(); + + /** + * Set the current {@link IBeekeepingMode}. + */ + void setModeName(String name); + + /** + * @return Amount of species discovered. + */ + int getSpeciesBred(); + + /** + * Register the birth of an individual. Will mark it as discovered. + * + * @param individual + */ + void registerBirth(IIndividual individual); + + /** + * Register the pickup of an individual. + * + * @param individual + */ + void registerPickup(IIndividual individual); + + /** + * Marks a species as discovered. Should only be called from registerIndividual normally. + * + * @param species + */ + void registerSpecies(IAlleleSpecies species); + + /** + * Register a successful mutation. Will mark it as discovered. + */ + @Deprecated + void registerMutation(IAllele allele0, IAllele allele1); + + /** + * Register a successful mutation. Will mark it as discovered. + * + * @param mutation + */ + void registerMutation(IMutation mutation); + + /** + * Queries the tracker for discovered species. + * + * @param mutation + * Mutation to query for. + * @return true if the mutation has been discovered. + */ + boolean isDiscovered(IMutation mutation); + + /** + * Queries the tracker for discovered species. + * + * @param species + * Species to check. + * @return true if the species has been bred. + */ + boolean isDiscovered(IAlleleSpecies species); + + /** + * Synchronizes the tracker to the client side. Should be called before opening any gui needing that information. + * + * @param player + */ + void synchToPlayer(EntityPlayer player); + + /* LOADING & SAVING */ + void decodeFromNBT(NBTTagCompound nbttagcompound); + + void encodeToNBT(NBTTagCompound nbttagcompound); + +} diff --git a/BM_src/forestry/api/genetics/IChromosome.java b/BM_src/forestry/api/genetics/IChromosome.java new file mode 100644 index 00000000..1a6668a1 --- /dev/null +++ b/BM_src/forestry/api/genetics/IChromosome.java @@ -0,0 +1,20 @@ +package forestry.api.genetics; + +import forestry.api.core.INBTTagable; + +/** + * Implementations other than Forestry's default one are not supported! + * + * @author SirSengir + */ +public interface IChromosome extends INBTTagable { + + IAllele getPrimaryAllele(); + + IAllele getSecondaryAllele(); + + IAllele getInactiveAllele(); + + IAllele getActiveAllele(); + +} diff --git a/BM_src/forestry/api/genetics/IChromosomeType.java b/BM_src/forestry/api/genetics/IChromosomeType.java new file mode 100644 index 00000000..c0a27f8b --- /dev/null +++ b/BM_src/forestry/api/genetics/IChromosomeType.java @@ -0,0 +1,19 @@ +package forestry.api.genetics; + +/* + * Interface to be implemented by the enums representing the various chromosomes + */ +public interface IChromosomeType { + + /* + * Get class which all alleles on this chromosome must interface + */ + Class getAlleleClass(); + + String getName(); + + ISpeciesRoot getSpeciesRoot(); + + int ordinal(); + +} \ No newline at end of file diff --git a/BM_src/forestry/api/genetics/IClassification.java b/BM_src/forestry/api/genetics/IClassification.java new file mode 100644 index 00000000..56f15a0a --- /dev/null +++ b/BM_src/forestry/api/genetics/IClassification.java @@ -0,0 +1,102 @@ +package forestry.api.genetics; + +/** + * Biological classifications from domain down to genus. + * + * Used by the *alyzers to display hierarchies. + */ +public interface IClassification { + + public enum EnumClassLevel { + + DOMAIN(0x777fff, true), KINGDOM(0x77c3ff), PHYLUM(0x77ffb6, true), DIVISION(0x77ffb6, true), CLASS(0x7bff77), ORDER(0xbeff77), FAMILY(0xfffd77), + SUBFAMILY(0xfffd77), TRIBE(0xfffd77), GENUS(0xffba77); + + private int colour; + private boolean isDroppable; + + private EnumClassLevel(int colour) { + this(colour, false); + } + + private EnumClassLevel(int colour, boolean isDroppable) { + this.colour = colour; + this.isDroppable = isDroppable; + } + + /** + * @return Colour to use for displaying this classification. + */ + public int getColour() { + return colour; + } + + /** + * @return Indicates whether display of this classification level can be ommitted in case of space constraints. + */ + public boolean isDroppable() { + return isDroppable; + } + } + + /** + * @return Level inside the full hierarchy this particular classification is located at. + */ + EnumClassLevel getLevel(); + + /** + * @return Unique String identifier. + */ + String getUID(); + + /** + * @return Localized branch name for user display. + */ + String getName(); + + /** + * A branch approximates a "genus" in real life. Real life examples: "Micrapis", "Megapis" + * + * @return flavour text (may be null) + */ + String getScientific(); + + /** + * @return Localized description of this branch. (May be null.) + */ + String getDescription(); + + /** + * @return Member groups of this one. + */ + IClassification[] getMemberGroups(); + + /** + * Adds subgroups to this group. + */ + void addMemberGroup(IClassification group); + + /** + * @return Member species of this group. + */ + IAlleleSpecies[] getMemberSpecies(); + + /** + * Used by the allele registry to populate internal collection of branch members on the fly. + * + * @param species + */ + void addMemberSpecies(IAlleleSpecies species); + + /** + * @return Parent classification, null if this is root. + */ + IClassification getParent(); + + /** + * Only used internally by the AlleleRegistry if this classification has been added to another one. + * + * @param parent + */ + void setParent(IClassification parent); +} diff --git a/BM_src/forestry/api/genetics/IEffectData.java b/BM_src/forestry/api/genetics/IEffectData.java new file mode 100644 index 00000000..89c396ad --- /dev/null +++ b/BM_src/forestry/api/genetics/IEffectData.java @@ -0,0 +1,22 @@ +package forestry.api.genetics; + +import forestry.api.core.INBTTagable; + +/** + * Container to hold some temporary data for bee, tree and butterfly effects. + * + * @author SirSengir + */ +public interface IEffectData extends INBTTagable { + void setInteger(int index, int val); + + void setFloat(int index, float val); + + void setBoolean(int index, boolean val); + + int getInteger(int index); + + float getFloat(int index); + + boolean getBoolean(int index); +} diff --git a/BM_src/forestry/api/genetics/IFlowerProvider.java b/BM_src/forestry/api/genetics/IFlowerProvider.java new file mode 100644 index 00000000..dd7f4072 --- /dev/null +++ b/BM_src/forestry/api/genetics/IFlowerProvider.java @@ -0,0 +1,51 @@ +package forestry.api.genetics; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IFlowerProvider { + /** + * @param world + * @param individual + * @param x + * @param y + * @param z + * @return True if the block at the passed coordinates is a valid flower for the species. + */ + boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z); + + boolean isAcceptedPollinatable(World world, IPollinatable pollinatable); + + /** + * @param world + * @param individual + * @param x + * @param y + * @param z + * @return True if a flower was planted. + */ + boolean growFlower(World world, IIndividual individual, int x, int y, int z); + + /** + * @return Short, human-readable identifier used in the beealyzer. + */ + String getDescription(); + + /** + * Allows the flower provider to affect the produce at the given location. + * @param world + * @param individual + * @param x + * @param y + * @param z + * @param products + * @return Array of itemstacks being the (modified or unmodified) produce. + */ + ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products); + + /** + * @return Array of itemstacks representing valid flowers for the flower provider. The first in the array is for use as an icon Return null or an empty + * array if the flower does not have an itemstack + */ + ItemStack[] getItemStacks(); +} diff --git a/BM_src/forestry/api/genetics/IFruitBearer.java b/BM_src/forestry/api/genetics/IFruitBearer.java new file mode 100644 index 00000000..3db6c1c6 --- /dev/null +++ b/BM_src/forestry/api/genetics/IFruitBearer.java @@ -0,0 +1,45 @@ +package forestry.api.genetics; + +import java.util.Collection; + +import net.minecraft.item.ItemStack; + +/** + * Can be implemented by tile entities which can bear fruit. + * + * @author SirSengir + */ +public interface IFruitBearer { + + /** + * @return true if the actual tile can bear fruits. + */ + boolean hasFruit(); + + /** + * @return Family of the potential fruits on this tile. + */ + IFruitFamily getFruitFamily(); + + /** + * Picks the fruits of this tile, resetting it to unripe fruits. + * + * @param tool + * Tool used in picking the fruits. May be null. + * @return Picked fruits. + */ + Collection pickFruit(ItemStack tool); + + /** + * @return float indicating the ripeness of the fruit with >= 1.0f indicating full ripeness. + */ + float getRipeness(); + + /** + * Increases the ripeness of the fruit. + * + * @param add + * Float to add to the ripeness. Will truncate to valid values. + */ + void addRipeness(float add); +} diff --git a/BM_src/forestry/api/genetics/IFruitFamily.java b/BM_src/forestry/api/genetics/IFruitFamily.java new file mode 100644 index 00000000..10393b72 --- /dev/null +++ b/BM_src/forestry/api/genetics/IFruitFamily.java @@ -0,0 +1,27 @@ +package forestry.api.genetics; + +public interface IFruitFamily { + + /** + * @return Unique String identifier. + */ + String getUID(); + + /** + * @return Localized family name for user display. + */ + String getName(); + + /** + * A scientific-y name for this fruit family + * + * @return flavour text (may be null) + */ + String getScientific(); + + /** + * @return Localized description of this fruit family. (May be null.) + */ + String getDescription(); + +} diff --git a/BM_src/forestry/api/genetics/IGenome.java b/BM_src/forestry/api/genetics/IGenome.java new file mode 100644 index 00000000..866c0851 --- /dev/null +++ b/BM_src/forestry/api/genetics/IGenome.java @@ -0,0 +1,25 @@ +package forestry.api.genetics; + +import forestry.api.core.INBTTagable; + +/** + * Holds the {@link IChromosome}s which comprise the traits of a given individual. + * + * Only the default implementation is supported. + */ +public interface IGenome extends INBTTagable { + + IAlleleSpecies getPrimary(); + + IAlleleSpecies getSecondary(); + + IChromosome[] getChromosomes(); + + IAllele getActiveAllele(int chromosome); + + IAllele getInactiveAllele(int chromosome); + + boolean isGeneticEqual(IGenome other); + + ISpeciesRoot getSpeciesRoot(); +} diff --git a/BM_src/forestry/api/genetics/IHousing.java b/BM_src/forestry/api/genetics/IHousing.java new file mode 100644 index 00000000..fe59233c --- /dev/null +++ b/BM_src/forestry/api/genetics/IHousing.java @@ -0,0 +1,46 @@ +package forestry.api.genetics; + +import forestry.api.core.EnumHumidity; +import forestry.api.core.EnumTemperature; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Any housing, hatchery or nest which is a fixed location in the world. + */ +public interface IHousing { + + /** + * @return String containing the login of this housing's owner. + */ + String getOwnerName(); + + World getWorld(); + + int getXCoord(); + + int getYCoord(); + + int getZCoord(); + + int getBiomeId(); + + EnumTemperature getTemperature(); + + EnumHumidity getHumidity(); + + void setErrorState(int state); + + int getErrorOrdinal(); + + /** + * Adds products to the housing's inventory. + * + * @param product + * ItemStack with the product to add. + * @param all + * @return Boolean indicating success or failure. + */ + boolean addProduct(ItemStack product, boolean all); + +} diff --git a/BM_src/forestry/api/genetics/IIndividual.java b/BM_src/forestry/api/genetics/IIndividual.java new file mode 100644 index 00000000..f538036b --- /dev/null +++ b/BM_src/forestry/api/genetics/IIndividual.java @@ -0,0 +1,52 @@ +package forestry.api.genetics; + +import java.util.List; + +import forestry.api.core.INBTTagable; + +/** + * An actual individual with genetic information. + * + * Only the default implementation is supported. + */ +public interface IIndividual extends INBTTagable { + + String getIdent(); + + String getDisplayName(); + + void addTooltip(List list); + + /** + * Call to mark the IIndividual as analyzed. + * @return true if the IIndividual has not been analyzed previously. + */ + boolean analyze(); + + boolean isAnalyzed(); + + boolean hasEffect(); + + boolean isSecret(); + + IGenome getGenome(); + + /** + * Check whether the genetic makeup of two IIndividuals is identical. Ignores additional data like generations, irregular mating, etc.. + * @param other + * @return true if the given other IIndividual has the amount of chromosomes and their alleles are identical. + */ + boolean isGeneticEqual(IIndividual other); + + /** + * @return A deep copy of this individual. + */ + IIndividual copy(); + + /** + * @param chromosomeOrdinal Ordinal of the chromosome to check. + * @return true if both primary and secondary allele on the given chromosome match. + */ + boolean isPureBred(int chromosomeOrdinal); + +} diff --git a/BM_src/forestry/api/genetics/IIndividualLiving.java b/BM_src/forestry/api/genetics/IIndividualLiving.java new file mode 100644 index 00000000..093e9292 --- /dev/null +++ b/BM_src/forestry/api/genetics/IIndividualLiving.java @@ -0,0 +1,40 @@ +package forestry.api.genetics; + +import net.minecraft.world.World; + +public interface IIndividualLiving extends IIndividual { + + /** + * @return Genetic information of the mate, null if unmated. + */ + IGenome getMate(); + + /** + * @return Current health of the individual. + */ + int getHealth(); + + /** + * @return Maximum health of the individual. + */ + int getMaxHealth(); + + /** + * Age the individual. + * @param world + * @param ageModifier + */ + void age(World world, float ageModifier); + + /** + * Mate with the given individual. + * @param individual the {@link IIndividual} to mate this one with. + */ + void mate(IIndividual individual); + + /** + * @return true if the individual is among the living. + */ + boolean isAlive(); + +} diff --git a/BM_src/forestry/api/genetics/ILegacyHandler.java b/BM_src/forestry/api/genetics/ILegacyHandler.java new file mode 100644 index 00000000..18412e85 --- /dev/null +++ b/BM_src/forestry/api/genetics/ILegacyHandler.java @@ -0,0 +1,10 @@ +package forestry.api.genetics; + +/** + * AlleleManager.alleleRegistry can be cast to this type. + */ +public interface ILegacyHandler { + void registerLegacyMapping(int id, String uid); + + IAllele getFromLegacyMap(int id); +} diff --git a/BM_src/forestry/api/genetics/IMutation.java b/BM_src/forestry/api/genetics/IMutation.java new file mode 100644 index 00000000..5eb6dc51 --- /dev/null +++ b/BM_src/forestry/api/genetics/IMutation.java @@ -0,0 +1,63 @@ +package forestry.api.genetics; + +import java.util.Collection; + +/** + * Individuals can be seeded either as hive drops or as mutation results. + * + * {@link IAlleleRegistry} manages these. + * + * @author SirSengir + */ +public interface IMutation { + + /** + * @return {@link ISpeciesRoot} this mutation is associated with. + */ + ISpeciesRoot getRoot(); + + /** + * @return first of the alleles implementing IAlleleSpecies required for this mutation. + */ + IAllele getAllele0(); + + /** + * @return second of the alleles implementing IAlleleSpecies required for this mutation. + */ + IAllele getAllele1(); + + /** + * @return Array of {@link IAllele} representing the full default genome of the mutated side. + * + * Make sure to return a proper array for the species class. Returning an allele of the wrong type will cause cast errors on runtime. + */ + IAllele[] getTemplate(); + + /** + * @return Unmodified base chance for mutation to fire. + */ + float getBaseChance(); + + /** + * @return Collection of localized, human-readable strings describing special mutation conditions, if any. + */ + Collection getSpecialConditions(); + + /** + * @param allele + * @return true if the passed allele is one of the alleles participating in this mutation. + */ + boolean isPartner(IAllele allele); + + /** + * @param allele + * @return the other allele which was not passed as argument. + */ + IAllele getPartner(IAllele allele); + + /** + * @return true if the mutation should not be displayed in the beealyzer. + */ + boolean isSecret(); + +} diff --git a/BM_src/forestry/api/genetics/IPollinatable.java b/BM_src/forestry/api/genetics/IPollinatable.java new file mode 100644 index 00000000..6ce41959 --- /dev/null +++ b/BM_src/forestry/api/genetics/IPollinatable.java @@ -0,0 +1,43 @@ +package forestry.api.genetics; + +import java.util.EnumSet; + +import net.minecraftforge.common.EnumPlantType; + +/** + * Can be implemented by tile entities, if they wish to be pollinatable. + * + * @author SirSengir + */ +public interface IPollinatable { + + /** + * @return plant types this pollinatable is classified as. (Can be used by bees to determine whether to interact or not. + */ + EnumSet getPlantType(); + + /** + * @return IIndividual containing the genetic information of this IPollinatable + */ + IIndividual getPollen(); + + /** + * Checks whether this {@link IPollinatable} can mate with the given pollen. + * + * Must be the one to check genetic equivalency. + * + * @param pollen + * IIndividual representing the pollen. + * @return true if mating is possible, false otherwise. + */ + boolean canMateWith(IIndividual pollen); + + /** + * Pollinates this entity. + * + * @param pollen + * IIndividual representing the pollen. + */ + void mateWith(IIndividual pollen); + +} diff --git a/BM_src/forestry/api/genetics/ISpeciesRoot.java b/BM_src/forestry/api/genetics/ISpeciesRoot.java new file mode 100644 index 00000000..9e281a25 --- /dev/null +++ b/BM_src/forestry/api/genetics/ISpeciesRoot.java @@ -0,0 +1,160 @@ +package forestry.api.genetics; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; +import java.util.Random; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +/** + * Describes a class of species (i.e. bees, trees, butterflies), provides helper functions and access to common functionality. + */ +public interface ISpeciesRoot { + + /** + * @return A unique identifier for the species class. Should consist of "root" + a common name for the species class in camel-case, i.e. "rootBees", "rootTrees", "rootButterflies". + */ + String getUID(); + + /** + * @return Class of the sub-interface inheriting from {@link IIndividual}. + */ + Class getMemberClass(); + + /** + * @return Integer denoting the number of (counted) species of this type in the world. + */ + int getSpeciesCount(); + + /** + * Used to check whether a given itemstack contains genetic data corresponding to an {@link IIndividual} of this class. + * @param stack itemstack to check. + * @return true if the itemstack contains an {@link IIndividual} of this class, false otherwise. + */ + boolean isMember(ItemStack stack); + + /** + * Used to check whether a given itemstack contains genetic data corresponding to an {@link IIndividual} of this class and matches the given type. + * @param stack itemstack to check. + * @param type Integer denoting the type needed to match. (i.e. butterfly vs. butterfly serum; bee queens, princesses, drones; etc.) + * @return true if the itemstack contains an {@link IIndividual} of this class, false otherwise. + */ + boolean isMember(ItemStack stack, int type); + + /** + * Used to check whether the given {@link IIndividual} is member of this class. + * @param individual {@link IIndividual} to check. + * @return true if the individual is member of this class, false otherwise. + */ + boolean isMember(IIndividual individual); + + IIndividual getMember(ItemStack stack); + + IIndividual getMember(NBTTagCompound compound); + + ItemStack getMemberStack(IIndividual individual, int type); + + /* BREEDING TRACKER */ + IBreedingTracker getBreedingTracker(World world, String player); + + /* GENOME MANIPULATION */ + IIndividual templateAsIndividual(IAllele[] template); + + IIndividual templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive); + + IChromosome[] templateAsChromosomes(IAllele[] template); + + IChromosome[] templateAsChromosomes(IAllele[] templateActive, IAllele[] templateInactive); + + IGenome templateAsGenome(IAllele[] template); + + IGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive); + + /* TEMPLATES */ + /** + * Registers a bee template using the UID of the first allele as identifier. + * + * @param template + */ + void registerTemplate(IAllele[] template); + + /** + * Registers a bee template using the passed identifier. + * + * @param template + */ + void registerTemplate(String identifier, IAllele[] template); + + /** + * Retrieves a registered template using the passed identifier. + * + * @param identifier + * @return Array of {@link IAllele} representing a genome. + */ + IAllele[] getTemplate(String identifier); + + /** + * @return Default individual template for use when stuff breaks. + */ + IAllele[] getDefaultTemplate(); + + /** + * @param rand Random to use. + * @return A random template from the pool of registered species templates. + */ + IAllele[] getRandomTemplate(Random rand); + + Map getGenomeTemplates(); + ArrayList getIndividualTemplates(); + + /* MUTATIONS */ + /** + * Use to register mutations. + * + * @param mutation + */ + void registerMutation(IMutation mutation); + + /** + * @return All registered mutations. + */ + Collection getMutations(boolean shuffle); + + /** + * @param other Allele to match mutations against. + * @return All registered mutations the given allele is part of. + */ + Collection getCombinations(IAllele other); + + /** + * @param result {@link IAllele} to search for. + * @return All registered mutations the given {@link IAllele} is the result of. + */ + Collection getPaths(IAllele result, int chromosomeOrdinal); + + /* RESEARCH */ + /** + * @return List of generic catalysts which should be accepted for research by species of this class. + */ + Map getResearchCatalysts(); + + /** + * Sets an item stack as a valid (generic) research catalyst for this class. + * @param itemstack ItemStack to set as suitable. + * @param suitability Float between 0 and 1 to indicate suitability. + */ + void setResearchSuitability(ItemStack itemstack, float suitability); + + /** + * @return Array of {@link IChromosomeType} which are in this species genome + */ + IChromosomeType[] getKaryotype(); + + /** + * @return {@link IChromosomeType} which is the "key" for this species class, usually the species chromosome. + */ + IChromosomeType getKaryotypeKey(); +} diff --git a/BM_src/forestry/api/genetics/package-info.java b/BM_src/forestry/api/genetics/package-info.java new file mode 100644 index 00000000..b7663473 --- /dev/null +++ b/BM_src/forestry/api/genetics/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|genetics") +package forestry.api.genetics; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/lepidopterology/EnumButterflyChromosome.java b/BM_src/forestry/api/lepidopterology/EnumButterflyChromosome.java new file mode 100644 index 00000000..c019af21 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/EnumButterflyChromosome.java @@ -0,0 +1,93 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IAlleleArea; +import forestry.api.genetics.IAlleleBoolean; +import forestry.api.genetics.IAlleleFloat; +import forestry.api.genetics.IAlleleFlowers; +import forestry.api.genetics.IAlleleInteger; +import forestry.api.genetics.IAlleleTolerance; +import forestry.api.genetics.IChromosomeType; +import forestry.api.genetics.ISpeciesRoot; + +public enum EnumButterflyChromosome implements IChromosomeType { + /** + * Species of the bee. Alleles here must implement {@link IAlleleButterflySpecies}. + */ + SPECIES(IAlleleButterflySpecies.class), + /** + * Physical size. + */ + SIZE(IAlleleFloat.class), + /** + * Flight speed. + */ + SPEED(IAlleleFloat.class), + /** + * How long the butterfly can last without access to matching pollinatables. + */ + LIFESPAN(IAlleleInteger.class), + /** + * Species with a higher metabolism have a higher appetite and may cause more damage to their environment. + */ + METABOLISM(IAlleleInteger.class), + /** + * Determines likelyhood of caterpillars and length of caterpillar/pupation phase. Also: Number of max caterpillars after mating? + */ + FERTILITY(IAlleleInteger.class), + /** + * Not sure yet. + */ + TEMPERATURE_TOLERANCE(IAlleleTolerance.class), + /** + * Not sure yet. + */ + HUMIDITY_TOLERANCE(IAlleleTolerance.class), + /** + * Only nocturnal butterflys/moths will fly at night. Allows daylight activity for naturally nocturnal species. + */ + NOCTURNAL(IAlleleBoolean.class), + /** + * Only tolerant flyers will fly in the rain. + */ + TOLERANT_FLYER(IAlleleBoolean.class), + /** + * Fire resistance. + */ + FIRE_RESIST(IAlleleBoolean.class), + /** + * Required flowers/leaves. + */ + FLOWER_PROVIDER(IAlleleFlowers.class), + /** + * Extra effect to surroundings. (?) + */ + EFFECT(IAlleleButterflyEffect.class), + /** + * Not used yet + */ + TERRITORY(IAlleleArea.class), + ; + + Class clss; + + EnumButterflyChromosome(Class clss) { + this.clss = clss; + } + + @Override + public Class getAlleleClass() { + return clss; + } + + @Override + public String getName() { + return this.toString().toLowerCase(); + } + + @Override + public ISpeciesRoot getSpeciesRoot() { + return AlleleManager.alleleRegistry.getSpeciesRoot("rootButterflies"); + } +} diff --git a/BM_src/forestry/api/lepidopterology/EnumFlutterType.java b/BM_src/forestry/api/lepidopterology/EnumFlutterType.java new file mode 100644 index 00000000..b7f5f597 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/EnumFlutterType.java @@ -0,0 +1,10 @@ +package forestry.api.lepidopterology; + +public enum EnumFlutterType { + BUTTERFLY, + SERUM, + CATERPILLAR, + NONE; + + public static final EnumFlutterType[] VALUES = values(); +} \ No newline at end of file diff --git a/BM_src/forestry/api/lepidopterology/IAlleleButterflyEffect.java b/BM_src/forestry/api/lepidopterology/IAlleleButterflyEffect.java new file mode 100644 index 00000000..e7d76e64 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IAlleleButterflyEffect.java @@ -0,0 +1,16 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.IAlleleEffect; +import forestry.api.genetics.IEffectData; + +public interface IAlleleButterflyEffect extends IAlleleEffect { + + /** + * Used by butterflies to trigger effects in the world. + * @param butterfly {@link IEntityButterfly} + * @param storedData + * @return {@link forestry.api.genetics.IEffectData} for the next cycle. + */ + IEffectData doEffect(IEntityButterfly butterfly, IEffectData storedData); + +} diff --git a/BM_src/forestry/api/lepidopterology/IAlleleButterflySpecies.java b/BM_src/forestry/api/lepidopterology/IAlleleButterflySpecies.java new file mode 100644 index 00000000..fb0cbe6a --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IAlleleButterflySpecies.java @@ -0,0 +1,53 @@ +package forestry.api.lepidopterology; + +import java.util.EnumSet; +import java.util.Map; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.BiomeDictionary; + +import forestry.api.genetics.IAlleleSpecies; + +public interface IAlleleButterflySpecies extends IAlleleSpecies { + + /** + * @return the IBeeRoot + */ + IButterflyRoot getRoot(); + + /** + * @return Path of the texture to use for entity rendering. + */ + String getEntityTexture(); + + /** + * Allows butterflies to restrict random spawns beyond the restrictions set by getTemperature() and getHumidity(). + * + * @return EnumSet of biome tags this butterfly species can be spawned in. + */ + EnumSet getSpawnBiomes(); + + /** + * @return true if a prospective spawn biome must not match a biome tag outside of getSpawnBiomes. + */ + boolean strictSpawnMatch(); + + /** + * @return Float between 0 and 1 representing the rarity of the species, will affect spawn rate. + */ + float getRarity(); + + /** + * @return Float representing the distance below which this butterfly will take flight if it detects a player which is not sneaking. + */ + float getFlightDistance(); + + /** + * @return true if this species is only active at night. + */ + boolean isNocturnal(); + + Map getButterflyLoot(); + + Map getCaterpillarLoot(); +} diff --git a/BM_src/forestry/api/lepidopterology/IButterfly.java b/BM_src/forestry/api/lepidopterology/IButterfly.java new file mode 100644 index 00000000..c21f87a3 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IButterfly.java @@ -0,0 +1,71 @@ +package forestry.api.lepidopterology; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import forestry.api.genetics.IIndividualLiving; + +public interface IButterfly extends IIndividualLiving { + + IButterflyGenome getGenome(); + + /** + * @return Genetic information of the mate, null if unmated. + */ + IButterflyGenome getMate(); + + /** + * @return Physical size of the butterfly. + */ + float getSize(); + + /** + * @param world + * @param x + * @param y + * @param z + * @return true if the butterfly can naturally spawn at the given location at this time. (Used to auto-spawn butterflies from tree leaves.) + */ + boolean canSpawn(World world, double x, double y, double z); + + /** + * @param world + * @param x + * @param y + * @param z + * @return true if the butterfly can take flight at the given location at this time. (Used to auto-spawn butterflies from dropped items.) + */ + boolean canTakeFlight(World world, double x, double y, double z); + + /** + * @param world + * @param x + * @param y + * @param z + * @return true if the environment (temperature, humidity) is valid for the butterfly at the given location. + */ + boolean isAcceptedEnvironment(World world, double x, double y, double z); + + IButterfly spawnCaterpillar(IButterflyNursery nursery); + + /** + * @param entity + * @param playerKill Whether or not the butterfly was killed by a player. + * @param lootLevel Loot level according to the weapon used to kill the butterfly. + * @return Array of itemstacks to drop on death of the given entity. + */ + ItemStack[] getLootDrop(IEntityButterfly entity, boolean playerKill, int lootLevel); + + /** + * @param nursery + * @param playerKill Whether or not the nursery was broken by a player. + * @param lootLevel Fortune level. + * @return Array of itemstacks to drop on breaking of the nursery. + */ + ItemStack[] getCaterpillarDrop(IButterflyNursery nursery, boolean playerKill, int lootLevel); + + /** + * Create an exact copy of this butterfly. + */ + IButterfly copy(); + +} diff --git a/BM_src/forestry/api/lepidopterology/IButterflyGenome.java b/BM_src/forestry/api/lepidopterology/IButterflyGenome.java new file mode 100644 index 00000000..e7251d23 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IButterflyGenome.java @@ -0,0 +1,37 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.EnumTolerance; +import forestry.api.genetics.IFlowerProvider; +import forestry.api.genetics.IGenome; + +public interface IButterflyGenome extends IGenome { + + IAlleleButterflySpecies getPrimary(); + + IAlleleButterflySpecies getSecondary(); + + float getSize(); + + int getLifespan(); + + int getMetabolism(); + + int getFertility(); + + float getSpeed(); + + EnumTolerance getToleranceTemp(); + + EnumTolerance getToleranceHumid(); + + boolean getNocturnal(); + + boolean getTolerantFlyer(); + + boolean getFireResist(); + + IFlowerProvider getFlowerProvider(); + + IAlleleButterflyEffect getEffect(); + +} diff --git a/BM_src/forestry/api/lepidopterology/IButterflyMutation.java b/BM_src/forestry/api/lepidopterology/IButterflyMutation.java new file mode 100644 index 00000000..8bbb077e --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IButterflyMutation.java @@ -0,0 +1,9 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; + +public interface IButterflyMutation extends IMutation { + float getChance(IButterflyNursery housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1); +} diff --git a/BM_src/forestry/api/lepidopterology/IButterflyNursery.java b/BM_src/forestry/api/lepidopterology/IButterflyNursery.java new file mode 100644 index 00000000..ebffb1fb --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IButterflyNursery.java @@ -0,0 +1,16 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.IHousing; +import forestry.api.genetics.IIndividual; + +public interface IButterflyNursery extends IHousing { + + IButterfly getCaterpillar(); + + IIndividual getNanny(); + + void setCaterpillar(IButterfly butterfly); + + boolean canNurse(IButterfly butterfly); + +} diff --git a/BM_src/forestry/api/lepidopterology/IButterflyRoot.java b/BM_src/forestry/api/lepidopterology/IButterflyRoot.java new file mode 100644 index 00000000..2618faee --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IButterflyRoot.java @@ -0,0 +1,54 @@ +package forestry.api.lepidopterology; + +import java.util.ArrayList; +import java.util.Collection; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import forestry.api.genetics.IAllele; +import forestry.api.genetics.IIndividual; +import forestry.api.genetics.ISpeciesRoot; + +public interface IButterflyRoot extends ISpeciesRoot { + + boolean isMember(ItemStack stack); + + IButterfly getMember(ItemStack stack); + + IButterfly getMember(NBTTagCompound compound); + + ItemStack getMemberStack(IIndividual butterfly, int type); + + /* GENOME CONVERSION */ + IButterfly templateAsIndividual(IAllele[] template); + + IButterfly templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive); + + IButterflyGenome templateAsGenome(IAllele[] template); + + IButterflyGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive); + + /* BUTTERFLY SPECIFIC */ + ILepidopteristTracker getBreedingTracker(World world, String player); + + /** + * Spawns the given butterfly in the world. + * @param butterfly + * @return butterfly entity on success, null otherwise. + */ + EntityLiving spawnButterflyInWorld(World world, IButterfly butterfly, double x, double y, double z); + + /** + * @return true if passed item is mated. + */ + boolean isMated(ItemStack stack); + + /* TEMPLATES */ + ArrayList getIndividualTemplates(); + + /* MUTATIONS */ + Collection getMutations(boolean shuffle); + +} diff --git a/BM_src/forestry/api/lepidopterology/IEntityButterfly.java b/BM_src/forestry/api/lepidopterology/IEntityButterfly.java new file mode 100644 index 00000000..52ad6d77 --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/IEntityButterfly.java @@ -0,0 +1,23 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.IIndividual; +import net.minecraft.entity.EntityCreature; +import net.minecraft.entity.passive.IAnimals; + +public interface IEntityButterfly extends IAnimals { + + void changeExhaustion(int change); + + int getExhaustion(); + + IButterfly getButterfly(); + + /** + * @return The entity as an EntityCreature to save casting. + */ + EntityCreature getEntity(); + + IIndividual getPollen(); + + void setPollen(IIndividual pollen); +} diff --git a/BM_src/forestry/api/lepidopterology/ILepidopteristTracker.java b/BM_src/forestry/api/lepidopterology/ILepidopteristTracker.java new file mode 100644 index 00000000..78c9e2ca --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/ILepidopteristTracker.java @@ -0,0 +1,9 @@ +package forestry.api.lepidopterology; + +import forestry.api.genetics.IBreedingTracker; + +public interface ILepidopteristTracker extends IBreedingTracker { + + void registerCatch(IButterfly butterfly); + +} diff --git a/BM_src/forestry/api/lepidopterology/package-info.java b/BM_src/forestry/api/lepidopterology/package-info.java new file mode 100644 index 00000000..eae8648f --- /dev/null +++ b/BM_src/forestry/api/lepidopterology/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|lepidopterology") +package forestry.api.lepidopterology; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/mail/EnumPostage.java b/BM_src/forestry/api/mail/EnumPostage.java new file mode 100644 index 00000000..c61b703d --- /dev/null +++ b/BM_src/forestry/api/mail/EnumPostage.java @@ -0,0 +1,15 @@ +package forestry.api.mail; + +public enum EnumPostage { + P_0(0), P_1(1), P_2(2), P_5(5), P_10(10), P_20(20), P_50(50), P_100(100), P_200(200); + + private final int value; + + private EnumPostage(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } +} diff --git a/BM_src/forestry/api/mail/ILetter.java b/BM_src/forestry/api/mail/ILetter.java new file mode 100644 index 00000000..3541e138 --- /dev/null +++ b/BM_src/forestry/api/mail/ILetter.java @@ -0,0 +1,53 @@ +package forestry.api.mail; + +import java.util.List; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import forestry.api.core.INBTTagable; + +public interface ILetter extends IInventory, INBTTagable { + + ItemStack[] getPostage(); + + void setProcessed(boolean flag); + + boolean isProcessed(); + + boolean isMailable(); + + void setSender(MailAddress address); + + MailAddress getSender(); + + boolean hasRecipient(); + + void setRecipient(MailAddress address); + + MailAddress[] getRecipients(); + + String getRecipientString(); + + void setText(String text); + + String getText(); + + void addTooltip(List list); + + boolean isPostPaid(); + + int requiredPostage(); + + void invalidatePostage(); + + ItemStack[] getAttachments(); + + void addAttachment(ItemStack itemstack); + + void addAttachments(ItemStack[] itemstacks); + + int countAttachments(); + + void addStamps(ItemStack stamps); + +} diff --git a/BM_src/forestry/api/mail/ILetterHandler.java b/BM_src/forestry/api/mail/ILetterHandler.java new file mode 100644 index 00000000..2270ff68 --- /dev/null +++ b/BM_src/forestry/api/mail/ILetterHandler.java @@ -0,0 +1,8 @@ +package forestry.api.mail; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ILetterHandler { + IPostalState handleLetter(World world, String recipient, ItemStack letterStack, boolean doLodge); +} diff --git a/BM_src/forestry/api/mail/IPostOffice.java b/BM_src/forestry/api/mail/IPostOffice.java new file mode 100644 index 00000000..0c8c48fc --- /dev/null +++ b/BM_src/forestry/api/mail/IPostOffice.java @@ -0,0 +1,25 @@ +package forestry.api.mail; + +import java.util.Map; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IPostOffice { + + void collectPostage(ItemStack[] stamps); + + IPostalState lodgeLetter(World world, ItemStack itemstack, boolean doLodge); + + ItemStack getAnyStamp(int max); + + ItemStack getAnyStamp(EnumPostage postage, int max); + + ItemStack getAnyStamp(EnumPostage[] postages, int max); + + void registerTradeStation(ITradeStation trade); + + void deregisterTradeStation(ITradeStation trade); + + Map getActiveTradeStations(World world); +} diff --git a/BM_src/forestry/api/mail/IPostRegistry.java b/BM_src/forestry/api/mail/IPostRegistry.java new file mode 100644 index 00000000..5977d9e4 --- /dev/null +++ b/BM_src/forestry/api/mail/IPostRegistry.java @@ -0,0 +1,47 @@ +package forestry.api.mail; + +import java.util.Map; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IPostRegistry { + + /* POST OFFICE */ + IPostOffice getPostOffice(World world); + + /* LETTERS */ + boolean isLetter(ItemStack itemstack); + + ILetter createLetter(MailAddress sender, MailAddress recipient); + + ILetter getLetter(ItemStack itemstack); + + ItemStack createLetterStack(ILetter letter); + + /* CARRIERS */ + /** + * Registers a new {@link IPostalCarrier}. See {@link IPostalCarrier} for details. + * @param carrier {@link IPostalCarrier} to register. + */ + void registerCarrier(IPostalCarrier carrier); + + IPostalCarrier getCarrier(String uid); + + Map getRegisteredCarriers(); + + /* TRADE STATIONS */ + void deleteTradeStation(World world, String moniker); + + ITradeStation getOrCreateTradeStation(World world, String owner, String moniker); + + ITradeStation getTradeStation(World world, String moniker); + + boolean isAvailableTradeMoniker(World world, String moniker); + + boolean isValidTradeMoniker(World world, String moniker); + + /* PO BOXES */ + boolean isValidPOBox(World world, String username); + +} diff --git a/BM_src/forestry/api/mail/IPostalCarrier.java b/BM_src/forestry/api/mail/IPostalCarrier.java new file mode 100644 index 00000000..ee80e865 --- /dev/null +++ b/BM_src/forestry/api/mail/IPostalCarrier.java @@ -0,0 +1,42 @@ +package forestry.api.mail; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +/** + * Postal Carriers are systems which can be hooked into Forestry's mail system to handle mail delivery. + * + * The two available carriers in vanilla Forestry are + * "player" - Delivers mail to individual players. + * "trader" - Handles mail addressed to trade stations. + */ +public interface IPostalCarrier { + + /** + * @return A lower-case identifier without spaces. + */ + String getUID(); + + /** + * @return A human-readable name for this carrier. + */ + String getName(); + + @SideOnly(Side.CLIENT) + Icon getIcon(); + + /** + * Handle delivery of a letter addressed to this carrier. + * @param world The world the {@link IPostOffice} handles. + * @param office {link @IPostOffice} which received this letter and handed it to the carrier. + * @param recipient An identifier for the recipient as typed by the player into the address field. + * @param letterstack ItemStack representing the letter. See {@link IPostRegistry} for helper functions to validate and extract it. + * @param doDeliver Whether or not the letter is supposed to actually be delivered or if delivery is only to be simulated. + * @return {link IPostalState} holding information on success or failure for delivery. + */ + IPostalState deliverLetter(World world, IPostOffice office, String recipient, ItemStack letterstack, boolean doDeliver); + +} diff --git a/BM_src/forestry/api/mail/IPostalState.java b/BM_src/forestry/api/mail/IPostalState.java new file mode 100644 index 00000000..0d6d7e12 --- /dev/null +++ b/BM_src/forestry/api/mail/IPostalState.java @@ -0,0 +1,9 @@ +package forestry.api.mail; + +public interface IPostalState { + boolean isOk(); + + String getIdentifier(); + + int ordinal(); +} diff --git a/BM_src/forestry/api/mail/IStamps.java b/BM_src/forestry/api/mail/IStamps.java new file mode 100644 index 00000000..63201887 --- /dev/null +++ b/BM_src/forestry/api/mail/IStamps.java @@ -0,0 +1,9 @@ +package forestry.api.mail; + +import net.minecraft.item.ItemStack; + +public interface IStamps { + + EnumPostage getPostage(ItemStack itemstack); + +} diff --git a/BM_src/forestry/api/mail/ITradeStation.java b/BM_src/forestry/api/mail/ITradeStation.java new file mode 100644 index 00000000..caf8018d --- /dev/null +++ b/BM_src/forestry/api/mail/ITradeStation.java @@ -0,0 +1,19 @@ +package forestry.api.mail; + +import net.minecraft.inventory.IInventory; + +public interface ITradeStation extends ILetterHandler, IInventory { + + String getMoniker(); + + boolean isValid(); + + void invalidate(); + + void setVirtual(boolean isVirtual); + + boolean isVirtual(); + + TradeStationInfo getTradeInfo(); + +} diff --git a/BM_src/forestry/api/mail/MailAddress.java b/BM_src/forestry/api/mail/MailAddress.java new file mode 100644 index 00000000..c20596dc --- /dev/null +++ b/BM_src/forestry/api/mail/MailAddress.java @@ -0,0 +1,54 @@ +package forestry.api.mail; + +import net.minecraft.nbt.NBTTagCompound; +import forestry.api.core.INBTTagable; + +public class MailAddress implements INBTTagable { + private String type; + private String identifier; + + private MailAddress() { + } + + public MailAddress(String identifier) { + this(identifier, "player"); + } + + public MailAddress(String identifier, String type) { + this.identifier = identifier; + this.type = type; + } + + public String getType() { + return type; + } + + public String getIdentifier() { + return identifier; + } + + public boolean isPlayer() { + return "player".equals(type); + } + + @Override + public void readFromNBT(NBTTagCompound nbttagcompound) { + if(nbttagcompound.hasKey("TP")) + type = nbttagcompound.getString("TP"); + else + type = nbttagcompound.getShort("TYP") == 0 ? "player" : "trader"; + identifier = nbttagcompound.getString("ID"); + } + + @Override + public void writeToNBT(NBTTagCompound nbttagcompound) { + nbttagcompound.setString("TP", type); + nbttagcompound.setString("ID", identifier); + } + + public static MailAddress loadFromNBT(NBTTagCompound nbttagcompound) { + MailAddress address = new MailAddress(); + address.readFromNBT(nbttagcompound); + return address; + } +} diff --git a/BM_src/forestry/api/mail/PostManager.java b/BM_src/forestry/api/mail/PostManager.java new file mode 100644 index 00000000..b97735ac --- /dev/null +++ b/BM_src/forestry/api/mail/PostManager.java @@ -0,0 +1,6 @@ +package forestry.api.mail; + + +public class PostManager { + public static IPostRegistry postRegistry; +} diff --git a/BM_src/forestry/api/mail/TradeStationInfo.java b/BM_src/forestry/api/mail/TradeStationInfo.java new file mode 100644 index 00000000..00bd8d30 --- /dev/null +++ b/BM_src/forestry/api/mail/TradeStationInfo.java @@ -0,0 +1,19 @@ +package forestry.api.mail; + +import net.minecraft.item.ItemStack; + +public class TradeStationInfo { + public final String moniker; + public final String owner; + public final ItemStack tradegood; + public final ItemStack[] required; + public final IPostalState state; + + public TradeStationInfo(String moniker, String owner, ItemStack tradegood, ItemStack[] required, IPostalState state) { + this.moniker = moniker; + this.owner = owner; + this.tradegood = tradegood; + this.required = required; + this.state = state; + } +} diff --git a/BM_src/forestry/api/mail/package-info.java b/BM_src/forestry/api/mail/package-info.java new file mode 100644 index 00000000..e452a0a4 --- /dev/null +++ b/BM_src/forestry/api/mail/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|mail") +package forestry.api.mail; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/package-info.java b/BM_src/forestry/api/package-info.java new file mode 100644 index 00000000..9bce2166 --- /dev/null +++ b/BM_src/forestry/api/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="Forestry", provides="ForestryAPI|core") +package forestry.api; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/recipes/IBottlerManager.java b/BM_src/forestry/api/recipes/IBottlerManager.java new file mode 100644 index 00000000..79e166cc --- /dev/null +++ b/BM_src/forestry/api/recipes/IBottlerManager.java @@ -0,0 +1,34 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +/** + * Provides an interface to the recipe manager of the bottler. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * Note that this is untested with anything other than biofuel->fuelcan conversion. + * + * @author SirSengir + */ +public interface IBottlerManager extends ICraftingProvider { + /** + * Add a recipe to the bottler. + * The bottler will populate its recipe list dynamically from the LiquidContainerRegistry. Recipes added explicitely will take precedence. + * + * @param cyclesPerUnit + * Amount of work cycles required to run through the conversion once. + * @param input + * LiquidStack representing the input liquid. + * @param can + * ItemStack representing the cans, capsules and/or cells required + * @param bottled + * ItemStack representing the finished product + */ + @Deprecated + public void addRecipe(int cyclesPerUnit, FluidStack input, ItemStack can, ItemStack bottled); +} diff --git a/BM_src/forestry/api/recipes/ICarpenterManager.java b/BM_src/forestry/api/recipes/ICarpenterManager.java new file mode 100644 index 00000000..655a97b2 --- /dev/null +++ b/BM_src/forestry/api/recipes/ICarpenterManager.java @@ -0,0 +1,65 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraftforge.fluids.FluidStack; + +/** + * Provides an interface to the recipe manager of the carpenter. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * Only shaped recipes can be added currently. + * + * @author SirSengir + */ +public interface ICarpenterManager extends ICraftingProvider { + /** + * Add a shaped recipe to the carpenter. + * + * @param box + * ItemStack of one item representing the required box (carton, crate) for this recipe. May be null. + * @param product + * Crafting result. + * @param materials + * Materials needed in the crafting matrix. This gets passed directly to {@link ShapedRecipes}. Notation is the same. + */ + public void addRecipe(ItemStack box, ItemStack product, Object materials[]); + + /** + * Add a shaped recipe to the carpenter. + * + * @param packagingTime + * Number of work cycles required to craft the recipe once. + * @param box + * ItemStack of one item representing the required box (carton, crate) for this recipe. May be null. + * @param product + * Crafting result. + * @param materials + * Materials needed in the crafting matrix. This gets passed directly to {@link ShapedRecipes}. Notation is the same. + */ + public void addRecipe(int packagingTime, ItemStack box, ItemStack product, Object materials[]); + + /** + * Add a shaped recipe to the carpenter. + * + * @param packagingTime + * Number of work cycles required to craft the recipe once. + * @param liquid + * Liquid required in carpenter's tank. + * @param box + * ItemStack of one item representing the required box (carton, crate) for this recipe. May be null. + * @param product + * Crafting result. + * @param materials + * Materials needed in the crafting matrix. This gets passed directly to {@link ShapedRecipes}. Notation is the same. + */ + public void addRecipe(int packagingTime, FluidStack liquid, ItemStack box, ItemStack product, Object materials[]); + + public void addCrating(String toCrate, ItemStack unpack, ItemStack crated); + + public void addCrating(ItemStack itemStack); +} diff --git a/BM_src/forestry/api/recipes/ICentrifugeManager.java b/BM_src/forestry/api/recipes/ICentrifugeManager.java new file mode 100644 index 00000000..66020b1d --- /dev/null +++ b/BM_src/forestry/api/recipes/ICentrifugeManager.java @@ -0,0 +1,74 @@ +package forestry.api.recipes; + +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + +/** + * Provides an interface to the recipe manager of the centrifuge. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * @author SirSengir + */ +public interface ICentrifugeManager extends ICraftingProvider { + + /** + * Add a recipe to the centrifuge + * + * @param timePerItem + * Time to centrifugate one item of the given type + * @param resource + * ItemStack containing information on item id and damage. Stack size will be ignored. + * @param products + * HashMap specifying the possible products and the chances of them resulting from centrifugation. + */ + public void addRecipe(int timePerItem, ItemStack resource, HashMap products); + + /** + * Add a recipe to the centrifuge + * + * @param timePerItem + * Time to centrifugate one item of the given type + * @param resource + * ItemStack containing information on item id and damage. Stack size will be ignored. + * @param produce + * Array of ItemStacks that can be the result of this recipe. + * @param chances + * Array of integers corresponding and matching to produce providing the chance (0-100) for the ItemStack at the given index to be + * produced. + */ + public void addRecipe(int timePerItem, ItemStack resource, ItemStack[] produce, int[] chances); + + /** + * Add a recipe to the centrifuge + * + * @param timePerItem + * Time to centrifugate one item of the given type + * @param resource + * ItemStack containing information on item id and damage. Stack size will be ignored. + * @param primary + * Primary product produced by centrifugating one item. Yield 100 %. + * @param secondary + * Secondary product that may be produced when centrifugating the given item. May be null. + * @param chance + * Chance (1 - 100) for centrifugation to yield the secondary product. + */ + public void addRecipe(int timePerItem, ItemStack resource, ItemStack primary, ItemStack secondary, int chance); + + /** + * Add a recipe to the centrifuge + * + * @param timePerItem + * Time to centrifugate one item of the given type + * @param resource + * ItemStack containing information on item id and damage. Stack size will be ignored. + * @param primary + * Primary product produced by centrifugating one item. Yield 100 %. + */ + public void addRecipe(int timePerItem, ItemStack resource, ItemStack primary); + +} diff --git a/BM_src/forestry/api/recipes/ICraftingProvider.java b/BM_src/forestry/api/recipes/ICraftingProvider.java new file mode 100644 index 00000000..79af3c4e --- /dev/null +++ b/BM_src/forestry/api/recipes/ICraftingProvider.java @@ -0,0 +1,12 @@ +package forestry.api.recipes; + +import java.util.Map; + +public interface ICraftingProvider { + /** + * Access to the full list of recipes contained in the crafting provider. + * + * @return List of the given format where the first array represents inputs and the second outputs. Objects can be either ItemStack or LiquidStack. + */ + public Map getRecipes(); +} diff --git a/BM_src/forestry/api/recipes/IFabricatorManager.java b/BM_src/forestry/api/recipes/IFabricatorManager.java new file mode 100644 index 00000000..b48e04b7 --- /dev/null +++ b/BM_src/forestry/api/recipes/IFabricatorManager.java @@ -0,0 +1,12 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public interface IFabricatorManager extends ICraftingProvider { + + void addRecipe(ItemStack plan, FluidStack molten, ItemStack result, Object[] pattern); + + void addSmelting(ItemStack resource, FluidStack molten, int meltingPoint); + +} diff --git a/BM_src/forestry/api/recipes/IFermenterManager.java b/BM_src/forestry/api/recipes/IFermenterManager.java new file mode 100644 index 00000000..744f6ff3 --- /dev/null +++ b/BM_src/forestry/api/recipes/IFermenterManager.java @@ -0,0 +1,48 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +/** + * Provides an interface to the recipe manager of the fermenter. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * @author SirSengir + */ +public interface IFermenterManager extends ICraftingProvider { + + /** + * Add a recipe to the fermenter + * + * @param resource + * ItemStack representing the resource. + * @param fermentationValue + * Value of the given resource, i.e. how much needs to be fermented for the output to be deposited into the product tank. + * @param modifier + * Modifies the amount of liquid output per work cycle. (water = 1.0f, honey = 1.5f) + * @param output + * LiquidStack representing output liquid. Amount is determined by fermentationValue*modifier. + * @param liquid + * LiquidStack representing resource liquid and amount. + */ + public void addRecipe(ItemStack resource, int fermentationValue, float modifier, FluidStack output, FluidStack liquid); + + /** + * Add a recipe to the fermenter. Defaults to water as input liquid. + * + * @param resource + * ItemStack representing the resource. + * @param modifier + * Modifies the amount of liquid output per work cycle. (water = 1.0f, honey = 1.5f) + * @param fermentationValue + * Value of the given resource, i.e. how much needs to be fermented for the output to be deposited into the product tank. + * @param output + * LiquidStack representing output liquid. Amount is determined by fermentationValue*modifier. + */ + public void addRecipe(ItemStack resource, int fermentationValue, float modifier, FluidStack output); + +} diff --git a/BM_src/forestry/api/recipes/IGenericCrate.java b/BM_src/forestry/api/recipes/IGenericCrate.java new file mode 100644 index 00000000..814cb83a --- /dev/null +++ b/BM_src/forestry/api/recipes/IGenericCrate.java @@ -0,0 +1,11 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; + +public interface IGenericCrate { + + void setContained(ItemStack crate, ItemStack contained); + + ItemStack getContained(ItemStack crate); + +} diff --git a/BM_src/forestry/api/recipes/IMoistenerManager.java b/BM_src/forestry/api/recipes/IMoistenerManager.java new file mode 100644 index 00000000..4273102f --- /dev/null +++ b/BM_src/forestry/api/recipes/IMoistenerManager.java @@ -0,0 +1,28 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; + +/** + * Provides an interface to the recipe manager of the moistener. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * @author SirSengir + */ +public interface IMoistenerManager extends ICraftingProvider { + + /** + * Add a recipe to the moistener + * + * @param resource + * Item required in resource stack. Will be reduced by one per produced item. + * @param product + * Item to produce per resource processed. + * @param timePerItem + * Moistener runs at 1 - 4 time ticks per ingame tick depending on light level. For mycelium this value is currently 5000. + */ + public void addRecipe(ItemStack resource, ItemStack product, int timePerItem); +} diff --git a/BM_src/forestry/api/recipes/ISqueezerManager.java b/BM_src/forestry/api/recipes/ISqueezerManager.java new file mode 100644 index 00000000..b70e19fa --- /dev/null +++ b/BM_src/forestry/api/recipes/ISqueezerManager.java @@ -0,0 +1,45 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +/** + * Provides an interface to the recipe manager of the suqeezer. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * @author SirSengir + */ +public interface ISqueezerManager extends ICraftingProvider { + + /** + * Add a recipe to the squeezer. + * + * @param timePerItem + * Number of work cycles required to squeeze one set of resources. + * @param resources + * Array of item stacks representing the required resources for one process. Stack size will be taken into account. + * @param liquid + * {@link FluidStack} representing the output of this recipe. + * @param remnants + * Item stack representing the possible remnants from this recipe. + * @param chance + * Chance remnants will be produced by a single recipe cycle. + */ + public void addRecipe(int timePerItem, ItemStack[] resources, FluidStack liquid, ItemStack remnants, int chance); + + /** + * Add a recipe to the squeezer. + * + * @param timePerItem + * Number of work cycles required to squeeze one set of resources. + * @param resources + * Array of item stacks representing the required resources for one process. Stack size will be taken into account. + * @param liquid + * {@link FluidStack} representing the output of this recipe. + */ + public void addRecipe(int timePerItem, ItemStack[] resources, FluidStack liquid); +} diff --git a/BM_src/forestry/api/recipes/IStillManager.java b/BM_src/forestry/api/recipes/IStillManager.java new file mode 100644 index 00000000..75ed02bd --- /dev/null +++ b/BM_src/forestry/api/recipes/IStillManager.java @@ -0,0 +1,29 @@ +package forestry.api.recipes; + +import net.minecraftforge.fluids.FluidStack; + +/** + * Provides an interface to the recipe manager of the still. + * + * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even + * if your mod loads before Forestry. + * + * Accessible via {@link RecipeManagers} + * + * Note that this is untested with anything other than biomass->biofuel conversion. + * + * @author SirSengir + */ +public interface IStillManager extends ICraftingProvider { + /** + * Add a recipe to the still + * + * @param cyclesPerUnit + * Amount of work cycles required to run through the conversion once. + * @param input + * ItemStack representing the input liquid. + * @param output + * ItemStack representing the output liquid + */ + public void addRecipe(int cyclesPerUnit, FluidStack input, FluidStack output); +} diff --git a/BM_src/forestry/api/recipes/IVariableFermentable.java b/BM_src/forestry/api/recipes/IVariableFermentable.java new file mode 100644 index 00000000..ce51b1f6 --- /dev/null +++ b/BM_src/forestry/api/recipes/IVariableFermentable.java @@ -0,0 +1,16 @@ +package forestry.api.recipes; + +import net.minecraft.item.ItemStack; + +/** + * Fermenter checks any valid fermentation item for an implementation of this interface. + * This does not supersede adding a proper recipe to the fermenter! + */ +public interface IVariableFermentable { + + /** + * @param itemstack + * @return Float representing the modification to be applied to the matching recipe's biomass output. + */ + float getFermentationModifier(ItemStack itemstack); +} diff --git a/BM_src/forestry/api/recipes/RecipeManagers.java b/BM_src/forestry/api/recipes/RecipeManagers.java new file mode 100644 index 00000000..fbf68670 --- /dev/null +++ b/BM_src/forestry/api/recipes/RecipeManagers.java @@ -0,0 +1,44 @@ +package forestry.api.recipes; + +import java.util.Collection; + +/** + * Contains all available recipe managers for Forestry machines and items. + * + * @author SirSengir + */ +public class RecipeManagers { + + public static Collection craftingProviders; + + /** + * Allows you to add recipes to the bottler. See {@link IBottlerManager} for details. + */ + public static IBottlerManager bottlerManager; + /** + * Allows you to add recipes to the carpenter. See {@link ICarpenterManager} for details. + */ + public static ICarpenterManager carpenterManager; + /** + * Allows you to add recipes to the centrifuge. See {@link ICentrifugeManager} for details. + */ + public static ICentrifugeManager centrifugeManager; + /** + * Allows you to add recipes to the fermenter. See {@link IFermenterManager} for details. + */ + public static IFermenterManager fermenterManager; + /** + * Allows you to add recipes to the moistener. See {@link IMoistenerManager} for details. + */ + public static IMoistenerManager moistenerManager; + /** + * Allows you to add recipes to the squeezer. See {@link ISqueezerManager} for details. + */ + public static ISqueezerManager squeezerManager; + /** + * Allows you to add recipes to the still. See {@link IStillManager} for details. + */ + public static IStillManager stillManager; + + public static IFabricatorManager fabricatorManager; +} diff --git a/BM_src/forestry/api/recipes/package-info.java b/BM_src/forestry/api/recipes/package-info.java new file mode 100644 index 00000000..34b9abb9 --- /dev/null +++ b/BM_src/forestry/api/recipes/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|recipes") +package forestry.api.recipes; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/storage/BackpackEvent.java b/BM_src/forestry/api/storage/BackpackEvent.java new file mode 100644 index 00000000..83d06e70 --- /dev/null +++ b/BM_src/forestry/api/storage/BackpackEvent.java @@ -0,0 +1,18 @@ +package forestry.api.storage; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraftforge.event.Event; + +public abstract class BackpackEvent extends Event { + + public final EntityPlayer player; + public final IBackpackDefinition backpackDefinition; + public final IInventory backpackInventory; + + public BackpackEvent(EntityPlayer player, IBackpackDefinition backpackDefinition, IInventory backpackInventory) { + this.player = player; + this.backpackDefinition = backpackDefinition; + this.backpackInventory = backpackInventory; + } +} diff --git a/BM_src/forestry/api/storage/BackpackManager.java b/BM_src/forestry/api/storage/BackpackManager.java new file mode 100644 index 00000000..64af8cd0 --- /dev/null +++ b/BM_src/forestry/api/storage/BackpackManager.java @@ -0,0 +1,22 @@ +package forestry.api.storage; + +import java.util.ArrayList; +import java.util.HashMap; + +import net.minecraft.item.ItemStack; + +public class BackpackManager { + /** + * 0 - Miner's Backpack 1 - Digger's Backpack 2 - Forester's Backpack 3 - Hunter's Backpack 4 - Adventurer's Backpack + * + * Use IMC messages to achieve the same effect! + */ + public static ArrayList[] backpackItems; + + public static IBackpackInterface backpackInterface; + + /** + * Only use this if you know what you are doing. Prefer backpackInterface. + */ + public static HashMap definitions = new HashMap(); +} diff --git a/BM_src/forestry/api/storage/BackpackResupplyEvent.java b/BM_src/forestry/api/storage/BackpackResupplyEvent.java new file mode 100644 index 00000000..caa74377 --- /dev/null +++ b/BM_src/forestry/api/storage/BackpackResupplyEvent.java @@ -0,0 +1,18 @@ +package forestry.api.storage; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraftforge.event.Cancelable; + +/** + * Use @ForgeSubscribe on a method taking this event as an argument. Will fire whenever a backpack tries to resupply to a player inventory. Processing will stop + * if the event is canceled. + */ +@Cancelable +public class BackpackResupplyEvent extends BackpackEvent { + + public BackpackResupplyEvent(EntityPlayer player, IBackpackDefinition backpackDefinition, IInventory backpackInventory) { + super(player, backpackDefinition, backpackInventory); + } + +} diff --git a/BM_src/forestry/api/storage/BackpackStowEvent.java b/BM_src/forestry/api/storage/BackpackStowEvent.java new file mode 100644 index 00000000..94c837a3 --- /dev/null +++ b/BM_src/forestry/api/storage/BackpackStowEvent.java @@ -0,0 +1,21 @@ +package forestry.api.storage; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.Cancelable; + +/** + * Use @ForgeSubscribe on a method taking this event as an argument. Will fire whenever a backpack tries to store an item. Processing will stop if the stacksize + * of stackToStow drops to 0 or less or the event is canceled. + */ +@Cancelable +public class BackpackStowEvent extends BackpackEvent { + + public final ItemStack stackToStow; + + public BackpackStowEvent(EntityPlayer player, IBackpackDefinition backpackDefinition, IInventory backpackInventory, ItemStack stackToStow) { + super(player, backpackDefinition, backpackInventory); + this.stackToStow = stackToStow; + } +} diff --git a/BM_src/forestry/api/storage/EnumBackpackType.java b/BM_src/forestry/api/storage/EnumBackpackType.java new file mode 100644 index 00000000..13faf87b --- /dev/null +++ b/BM_src/forestry/api/storage/EnumBackpackType.java @@ -0,0 +1,5 @@ +package forestry.api.storage; + +public enum EnumBackpackType { + T1, T2 +} diff --git a/BM_src/forestry/api/storage/IBackpackDefinition.java b/BM_src/forestry/api/storage/IBackpackDefinition.java new file mode 100644 index 00000000..c05031e6 --- /dev/null +++ b/BM_src/forestry/api/storage/IBackpackDefinition.java @@ -0,0 +1,54 @@ +package forestry.api.storage; + +import java.util.Collection; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public interface IBackpackDefinition { + + /** + * @return A unique string identifier + */ + String getKey(); + + /** + * @return Human-readable name of the backpack. + */ + String getName(); + + /** + * @return Primary colour for the backpack icon. + */ + int getPrimaryColour(); + + /** + * @return Secondary colour for backpack icon. + */ + int getSecondaryColour(); + + /** + * Adds an item as valid for this backpack. + * + * @param validItem + */ + void addValidItem(ItemStack validItem); + + /** + * Returns an arraylist of all items valid for this backpack type. + * + * @param player + * @return Collection of itemstack which are valid items for this backpack type. May be empty or null and does not necessarily include all valid items. + */ + Collection getValidItems(EntityPlayer player); + + /** + * Returns true if the itemstack is a valid item for this backpack type. + * + * @param player + * @param itemstack + * @return true if the given itemstack is valid for this backpack, false otherwise. + */ + boolean isValidItem(EntityPlayer player, ItemStack itemstack); + +} \ No newline at end of file diff --git a/BM_src/forestry/api/storage/IBackpackInterface.java b/BM_src/forestry/api/storage/IBackpackInterface.java new file mode 100644 index 00000000..0012fab1 --- /dev/null +++ b/BM_src/forestry/api/storage/IBackpackInterface.java @@ -0,0 +1,19 @@ +package forestry.api.storage; + +import net.minecraft.item.Item; + +public interface IBackpackInterface { + + /** + * Adds a backpack with the given id, definition and type, returning the item. + * + * @param itemID + * Item id to use. + * @param definition + * Definition of backpack behaviour. + * @param type + * Type of backpack. (T1 or T2 (= Woven) + * @return Created backpack item. + */ + Item addBackpack(int itemID, IBackpackDefinition definition, EnumBackpackType type); +} diff --git a/BM_src/forestry/api/storage/package-info.java b/BM_src/forestry/api/storage/package-info.java new file mode 100644 index 00000000..8917b785 --- /dev/null +++ b/BM_src/forestry/api/storage/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|storage") +package forestry.api.storage; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/BM_src/forestry/api/world/ITreeGenData.java b/BM_src/forestry/api/world/ITreeGenData.java new file mode 100644 index 00000000..c43d8bb8 --- /dev/null +++ b/BM_src/forestry/api/world/ITreeGenData.java @@ -0,0 +1,18 @@ +package forestry.api.world; + +import net.minecraft.world.World; + +public interface ITreeGenData { + + int getGirth(World world, int x, int y, int z); + + float getHeightModifier(); + + boolean canGrow(World world, int x, int y, int z, int expectedGirth, int expectedHeight); + + void setLeaves(World world, String owner, int x, int y, int z); + + boolean allowsFruitBlocks(); + + boolean trySpawnFruitBlock(World world, int x, int y, int z); +} diff --git a/BM_src/forestry/api/world/IWorldGenInterface.java b/BM_src/forestry/api/world/IWorldGenInterface.java new file mode 100644 index 00000000..bff24664 --- /dev/null +++ b/BM_src/forestry/api/world/IWorldGenInterface.java @@ -0,0 +1,17 @@ +package forestry.api.world; + +import net.minecraft.world.gen.feature.WorldGenerator; + +public interface IWorldGenInterface { + + /** + * Retrieves generators for trees identified by a given string. + * + * Returned generator classes take an {@link ITreeGenData} in the constructor. + * + * @param ident + * Unique identifier for tree type. Forestry's convention is 'treeSpecies', i.e. 'treeBaobab', 'treeSequoia'. + * @return All generators matching the given ident. + */ + Class[] getTreeGenerators(String ident); +} diff --git a/BM_src/forestry/api/world/WorldGenManager.java b/BM_src/forestry/api/world/WorldGenManager.java new file mode 100644 index 00000000..b2147a64 --- /dev/null +++ b/BM_src/forestry/api/world/WorldGenManager.java @@ -0,0 +1,5 @@ +package forestry.api.world; + +public class WorldGenManager { + public static IWorldGenInterface worldgenInterface; +} diff --git a/BM_src/forestry/api/world/package-info.java b/BM_src/forestry/api/world/package-info.java new file mode 100644 index 00000000..bd377554 --- /dev/null +++ b/BM_src/forestry/api/world/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0", owner="ForestryAPI|core", provides="ForestryAPI|world") +package forestry.api.world; +import cpw.mods.fml.common.API; \ No newline at end of file From e159a6795c0f89b761240df1fce150e184247fb5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 26 Jan 2014 16:04:27 -0500 Subject: [PATCH 12/33] Added a new Forestry bee frame --- .../AlchemicalWizardry.java | 20 +++ .../BloodMagicConfiguration.java | 3 +- .../alchemicalWizardry/ModItems.java | 1 + .../common/items/forestry/ItemBloodFrame.java | 155 ++++++++++++++++++ .../rituals/RitualEffectApiaryOverclock.java | 84 ++++++++++ .../common/rituals/Rituals.java | 13 ++ .../textures/items/BloodFrame.png | Bin 0 -> 363 bytes 7 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java create mode 100644 resources/assets/alchemicalwizardry/textures/items/BloodFrame.png diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 928d464d..03c3d7a4 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -61,6 +61,7 @@ import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; import WayofTime.alchemicalWizardry.common.items.LifeBucket; +import WayofTime.alchemicalWizardry.common.items.forestry.ItemBloodFrame; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; import WayofTime.alchemicalWizardry.common.rituals.Rituals; @@ -140,6 +141,7 @@ public class AlchemicalWizardry public static int customPotionFlameCloakID; public static boolean isThaumcraftLoaded; + public static boolean isForestryLoaded; public static CreativeTabs tabBloodMagic = new CreativeTabs("tabBloodMagic") { @@ -267,6 +269,7 @@ public class AlchemicalWizardry public static int energyBazookaItemID; public static int itemBloodLightSigilItemID; public static int itemComplexSpellCrystalItemID; + public static int itemBloodFrameItemID; public static int testingBlockBlockID; public static int lifeEssenceFlowingBlockID; @@ -931,5 +934,22 @@ public class AlchemicalWizardry { this.isThaumcraftLoaded = false; } + + if(Loader.isModLoaded("Forestry")) + { + this.isForestryLoaded = true; + + ModItems.itemBloodFrame = new ItemBloodFrame(this.itemBloodFrameItemID).setUnlocalizedName("bloodFrame"); + + ItemStack provenFrame = GameRegistry.findItemStack("Forestry", "frameImpregnated", 1); + + if(provenFrame !=null) + { + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.itemBloodFrame), provenFrame, 3, 30000, 20, 20, false); + } + }else + { + this.isForestryLoaded = false; + } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 7f864162..4b55f0a4 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -174,7 +174,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.focusGravityWellItemID = config.getItem("FocusGravityWell", 17077).getInt(); AlchemicalWizardry.sigilOfMagnetismItemID = config.getItem("SigilOfMagnetism", 17080).getInt(); AlchemicalWizardry.itemComplexSpellCrystalItemID = config.getItem("ComplexSpellCrystal",17081).getInt(); - + AlchemicalWizardry.itemBloodFrameItemID = config.getItem("BloodFrame", 17082).getInt(); + } catch (Exception e) { diff --git a/BM_src/WayofTime/alchemicalWizardry/ModItems.java b/BM_src/WayofTime/alchemicalWizardry/ModItems.java index e7590fa7..8cb6a9a0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/ModItems.java +++ b/BM_src/WayofTime/alchemicalWizardry/ModItems.java @@ -104,6 +104,7 @@ public class ModItems public static Item energyBazooka; public static Item itemBloodLightSigil; public static Item itemComplexSpellCrystal; + public static Item itemBloodFrame; public static void init() { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java b/BM_src/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java new file mode 100644 index 00000000..ad82a08e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java @@ -0,0 +1,155 @@ +package WayofTime.alchemicalWizardry.common.items.forestry; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +import java.util.List; + +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IHiveFrame; + +public class ItemBloodFrame extends EnergyItems implements IHiveFrame +{ + public ItemBloodFrame(int id) + { + super(id); + this.maxStackSize = 1; + this.setMaxDamage(10); + //setMaxDamage(1000); + setEnergyUsed(3000); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Stirs bees into a frenzy."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodFrame"); + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if(par1ItemStack.getItemDamage()>0) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + par1ItemStack.setItemDamage(par1ItemStack.getItemDamage()-1); + } + + return par1ItemStack; + } + + @Override + public float getTerritoryModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) + { + // TODO Auto-generated method stub + return 0.0001f; + } + + @Override + public float getProductionModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public float getFloweringModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getGeneticDecay(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public boolean isSealed() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSelfLighted() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSunlightSimulated() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isHellish() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public ItemStack frameUsed(IBeeHousing housing, ItemStack frame, IBee queen, int wear) + { + // TODO Auto-generated method stub + if(EnergyItems.canSyphonInContainer(frame, getEnergyUsed()*wear)) + { + EnergyItems.syphonWhileInContainer(frame, getEnergyUsed()*wear); + return frame; + }else + { + frame.setItemDamage(frame.getItemDamage() + wear); + if(frame.getItemDamage()>=frame.getMaxDamage()) + { + return null; + } + return frame; + } + + } + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java b/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java new file mode 100644 index 00000000..ce3a324c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java @@ -0,0 +1,84 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import cpw.mods.fml.common.network.PacketDispatcher; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeekeepingLogic; + +public class RitualEffectApiaryOverclock extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.worldObj; + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + TileEntity tile = world.getBlockTileEntity(x, y+1, z); + + try{ + if(tile instanceof IBeeHousing && tile.getClass().getName().contains("Apiary")) + { + for (int i = 0; i < 10; i++) + { + PacketDispatcher.sendPacketToAllPlayers(TEAltar.getParticlePacket(x, y+1, z, (short) 3)); + } + + for(int i=0; i<9; i++) + { + tile.updateEntity(); + } + + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + }catch (Exception e) + { + + } + + + } + + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 10; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java b/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java index bb985ec6..dea3acc6 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java @@ -869,6 +869,18 @@ public class Rituals meteorRitual.add(new RitualComponent(-2, 4, -3, RitualComponent.FIRE)); meteorRitual.add(new RitualComponent(-3, 4, -2, RitualComponent.FIRE)); meteorRitual.add(new RitualComponent(-3, 4, -3, RitualComponent.FIRE)); + + ArrayList apiaryRitual = new ArrayList(); + apiaryRitual.add(new RitualComponent(1,0,0, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(1,0,1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(1,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,0, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(0,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(0,0,1, RitualComponent.DUSK)); + + ritualList.add(new Rituals(waterRitual, 1, 500, new RitualEffectWater(), "Ritual of the Full Spring")); ritualList.add(new Rituals(lavaRitual, 1, 10000, new RitualEffectLava(), "Serenade of the Nether")); ritualList.add(new Rituals(growthRitual, 1, 1000, new RitualEffectGrowth(), "Ritual of the Green Grove")); @@ -888,6 +900,7 @@ public class Rituals ritualList.add(new Rituals(biomeChangerRitual, 2, 1000000, new RitualEffectBiomeChanger(), "Ritual of Gaia's Transformation")); ritualList.add(new Rituals(flightRitual, 2, 1000000, new RitualEffectFlight(), "Reverence of the Condor")); ritualList.add(new Rituals(meteorRitual, 2, 1000000, new RitualEffectSummonMeteor(), "Mark of the Falling Tower")); + ritualList.add(new Rituals(apiaryRitual,1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); } public static int getCostForActivation(int ritualID) diff --git a/resources/assets/alchemicalwizardry/textures/items/BloodFrame.png b/resources/assets/alchemicalwizardry/textures/items/BloodFrame.png new file mode 100644 index 0000000000000000000000000000000000000000..717f240c4efc899a8ecc9f42eb85401d91a6cf03 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-|Z=1J6?)jj2E(+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vq_L)5S5w;`G%?hTex01ls1WKOzvc#EFZw@PyKi9W3pC8sGfW{y)pYLtLF*b`eLQ zb5v%s-p_NoF5JEf-g{rZ+wr`$`u&6Z?VX1m7H__pus~z!+3A^$j2(v^+7Gqgt8oIQQbtboYWWPhQ z?$OuWLDM>}FkD%;w6G;jYeMC3)_wPiSDh8>c3maqy3%jo#hFKIX8jYL^d+ Date: Fri, 31 Jan 2014 17:21:03 -0500 Subject: [PATCH 13/33] Working on small parts of the spell system --- .../AlchemicalWizardry.java | 3 +- .../common/block/BlockSpellEffect.java | 22 +++ .../common/items/ItemSpellEffectBlock.java | 6 +- .../spell/complex/effect/SpellEffectIce.java | 177 ++++++++++++++++++ .../spell/complex/effect/SpellHelper.java | 10 + .../ExtrapolatedMeleeEntityEffect.java | 33 +++- .../impactEffects/ice/MeleeOffensiveIce.java | 48 +++++ .../impactEffects/ice/SelfDefaultIce.java | 43 +++++ .../common/tileEntity/TESpellEffectBlock.java | 7 + 9 files changed, 339 insertions(+), 10 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeOffensiveIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefaultIce.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 03c3d7a4..5f6c4435 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -713,6 +713,7 @@ public class AlchemicalWizardry GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 0), "Crucible of Fire"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 1), "Ice Maker"); GameRegistry.registerBlock(ModBlocks.speedRune, "speedRune"); LanguageRegistry.addName(ModBlocks.speedRune, "Speed Rune"); @@ -759,7 +760,7 @@ public class AlchemicalWizardry GameRegistry.registerBlock(ModBlocks.spectralBlock, "spectralBlock"); GameRegistry.registerBlock(ModBlocks.blockBloodLight, "bloodLight"); GameRegistry.registerBlock(ModBlocks.blockConduit,"blockConduit"); - GameRegistry.registerBlock(ModBlocks.blockSpellEffect,"blockSpellEffect"); + //GameRegistry.registerBlock(ModBlocks.blockSpellEffect,"blockSpellEffect"); MinecraftForge.setBlockHarvestLevel(ModBlocks.bloodRune, "pickaxe", 2); MinecraftForge.setBlockHarvestLevel(ModBlocks.speedRune, "pickaxe", 2); MinecraftForge.setBlockHarvestLevel(ModBlocks.efficiencyRune, "pickaxe", 2); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java index dd940132..e3efbe58 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -1,7 +1,14 @@ package WayofTime.alchemicalWizardry.common.block; +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; @@ -18,4 +25,19 @@ public class BlockSpellEffect extends BlockOrientable { return new TESpellEffectBlock(); } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.blockID == ModBlocks.blockSpellEffect.blockID) + { + for(int i=0; i<2; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java index 4f3b6f20..3b2a6bd9 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java @@ -28,16 +28,16 @@ public class ItemSpellEffectBlock extends ItemBlock case 1: { - name = "fill"; + name = "ice"; break; } case 2: - name = "empty"; + name = "wind"; break; case 3: - name = "test"; + name = "water"; break; default: diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java new file mode 100644 index 00000000..07348780 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -0,0 +1,177 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; + +public class SpellEffectIce extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefaultIce(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); + + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + return (int)(20*(this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index d9bf5e50..f7eda404 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; import net.minecraft.world.World; public class SpellHelper @@ -43,4 +44,13 @@ public class SpellHelper { return d * ((rand.nextFloat() - 0.5D)); } + + public static Vec3 getEntityBlockVector(Entity entity) + { + int posX = (int) Math.round(entity.posX - 0.5f); + int posY = (int) entity.posY; + int posZ = (int) Math.round(entity.posZ - 0.5f); + + return entity.getLookVec().createVectorHelper(posX, posY, posZ); + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java index fffd0f2b..2d21bba3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java @@ -13,11 +13,19 @@ public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntity { protected float range; protected float radius; + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + protected int maxHit; - public ExtrapolatedMeleeEntityEffect(int range, int radius) + public ExtrapolatedMeleeEntityEffect(int power, int potency, int cost) { - this.range = range; - this.radius = radius; + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + this.range = 2; + this.radius = 2; + this.maxHit = 1; } @Override @@ -25,21 +33,29 @@ public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntity { Vec3 lookVec = entityPlayer.getLook(range); double x = entityPlayer.posX + lookVec.xCoord; - double y = entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord; + double y = entityPlayer.posY + lookVec.yCoord; double z = entityPlayer.posZ + lookVec.zCoord; List entities = world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(x-0.5f, y-0.5f, z-0.5f, x + 0.5f, y + 0.5f, z + 0.5f).expand(radius, radius, radius)); + int hit = 0; if(entities!=null) { for(Entity entity : entities) { - this.entityEffect(world, entity); + if(hit Date: Sat, 1 Feb 2014 12:30:03 -0500 Subject: [PATCH 14/33] 5/12 Finished for SpellEffectIce --- .../spell/complex/effect/SpellEffectIce.java | 20 ++++---- .../spell/complex/effect/SpellHelper.java | 42 ++++++++++++++++ .../ExtrapolatedMeleeEntityEffect.java | 8 ++-- .../impactEffects/MeleeSpellWorldEffect.java | 21 ++++++++ .../impactEffects/ice/MeleeDefaultIce.java | 27 +++++++++++ .../impactEffects/ice/MeleeDefensiveIce.java | 48 +++++++++++++++++++ .../impactEffects/ice/MeleeOffensiveIce.java | 8 ++-- .../ice/SelfEnvironmentalIce.java | 46 ++++++++++++++++++ .../tileEntity/TESpellModifierBlock.java | 11 +++++ 9 files changed, 211 insertions(+), 20 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellWorldEffect.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfEnvironmentalIce.java diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java index 07348780..eb82567d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -3,8 +3,10 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfEnvironmentalIce; public class SpellEffectIce extends SpellEffect { @@ -60,8 +62,7 @@ public class SpellEffectIce extends SpellEffect @Override public void environmentalModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -80,8 +81,7 @@ public class SpellEffectIce extends SpellEffect @Override public void defensiveModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -142,29 +142,25 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForEnvironmentSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(10*(1.5*potencyEnhancement+1)*(3*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForDefaultMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForOffenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(25*(1.5*potencyEnhancement+1)*Math.pow(1.5, powerEnhancement)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForDefenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(10*(0.5*potencyEnhancement+1)*(0.7*powerEnhancement+1)*(0.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index f7eda404..629c2417 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -11,10 +11,12 @@ import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; public class SpellHelper { public static Random rand = new Random(); + public static final double root2 = Math.sqrt(2); public static void smeltBlockInWorld(World world, int posX, int posY, int posZ) { @@ -53,4 +55,44 @@ public class SpellHelper return entity.getLookVec().createVectorHelper(posX, posY, posZ); } + + public static ForgeDirection getDirectionForLookVector(Vec3 lookVec) + { + double distance = lookVec.lengthVector(); + + if(lookVec.yCoord>distance*0.9) + { + return ForgeDirection.UP; + } + if(lookVec.yCoordradius*1/root2) + { + return ForgeDirection.SOUTH; + } + if(lookVec.zCoord<-radius*1/root2) + { + return ForgeDirection.NORTH; + } + if(lookVec.xCoord>radius*1/root2) + { + return ForgeDirection.EAST; + } + if(lookVec.xCoord<-radius*1/root2) + { + return ForgeDirection.WEST; + } + + return ForgeDirection.EAST; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java index 2d21bba3..aca6b077 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java @@ -23,8 +23,8 @@ public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntity this.powerUpgrades = power; this.potencyUpgrades = potency; this.costUpgrades = cost; - this.range = 2; - this.radius = 2; + this.range = 0; + this.radius = 0; this.maxHit = 1; } @@ -33,7 +33,7 @@ public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntity { Vec3 lookVec = entityPlayer.getLook(range); double x = entityPlayer.posX + lookVec.xCoord; - double y = entityPlayer.posY + lookVec.yCoord; + double y = entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord; double z = entityPlayer.posZ + lookVec.zCoord; List entities = world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(x-0.5f, y-0.5f, z-0.5f, x + 0.5f, y + 0.5f, z + 0.5f).expand(radius, radius, radius)); @@ -43,7 +43,7 @@ public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntity { for(Entity entity : entities) { - if(hit0) + { + entity.hurtResistantTime = Math.max(0, -(potencyUpgrades+1)+entity.hurtResistantTime); + } + + return true; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java new file mode 100644 index 00000000..81a6ae8e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java @@ -0,0 +1,48 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellWorldEffect; + +public class MeleeDefensiveIce extends MeleeSpellWorldEffect +{ + public MeleeDefensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onWorldEffect(World world, EntityPlayer entityPlayer) + { + ForgeDirection look = SpellHelper.getCompassDirectionForLookVector(entityPlayer.getLookVec()); + + int width = this.powerUpgrades; + int height = this.powerUpgrades + 2; + + int xOffset = look.offsetX; + int zOffset = look.offsetZ; + + int range = this.potencyUpgrades + 1; + + Vec3 lookVec = SpellHelper.getEntityBlockVector(entityPlayer); + + int xStart = (int)(lookVec.xCoord) + range * xOffset; + int zStart = (int)(lookVec.zCoord) + range * zOffset; + int yStart = (int)(lookVec.yCoord); + + for(int i=-width; i<=width; i++) + { + for(int j=0; j Date: Sun, 2 Feb 2014 08:48:11 -0500 Subject: [PATCH 15/33] Few more ice effects --- .../common/block/BlockSpellParadigm.java | 132 +++++++++++++++++- .../spell/complex/effect/SpellEffectIce.java | 13 +- .../spell/complex/effect/SpellHelper.java | 10 ++ .../impactEffects/ProjectileUpdateEffect.java | 15 ++ .../ice/ProjectileDefensiveIce.java | 49 +++++++ .../ice/ProjectileEnvironmentalIce.java | 39 ++++++ .../ice/ProjectileOffensiveIce.java | 32 +++++ .../common/tileEntity/TEOrientable.java | 9 ++ 8 files changed, 292 insertions(+), 7 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java index ad69671d..e022e4c5 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -1,17 +1,25 @@ package WayofTime.alchemicalWizardry.common.block; +import java.util.Arrays; import java.util.List; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Icon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import WayofTime.alchemicalWizardry.ModBlocks; -import WayofTime.alchemicalWizardry.common.items.BlankSpell; import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; import cpw.mods.fml.relauncher.Side; @@ -19,12 +27,16 @@ import cpw.mods.fml.relauncher.SideOnly; public class BlockSpellParadigm extends BlockOrientable { + public static final float minPos = (3f/16f); + public static final float maxPos = (13f/16f); + Icon[] projectileIcons = new Icon[7]; public BlockSpellParadigm(int id) { super(id); setUnlocalizedName("blockSpellParadigm"); + //setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, maxPos); } @Override @@ -86,4 +98,122 @@ public class BlockSpellParadigm extends BlockOrientable return super.onBlockActivated(world, x, y, z, player, side, what, these, are); } + +// @Override +// public boolean isOpaqueCube() +// { +// return false; +// } +// +// @Override +// public boolean renderAsNormalBlock() +// { +// return false; +// } + +// @Override +// public int getRenderType() +// { +// return -1; +// } + + //TODO Need to make a renderer for the paradigm blocks and other spell blocks. + /* + @Override + public void addCollisionBoxesToList(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List arraylist, Entity par7Entity) + { + + setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + + + TileEntity tile1 = world.getBlockTileEntity(i, j, k); + if (tile1 instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileG = (TESpellParadigmBlock) tile1; + + + if (tileG.isSideRendered(ForgeDirection.WEST)) + { + setBlockBounds(0.0F, minPos, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.EAST)) + { + setBlockBounds(minPos, minPos, minPos, 1.0F, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.DOWN)) + { + setBlockBounds(minPos, 0.0F, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.UP)) + { + setBlockBounds(minPos, minPos, minPos, maxPos, 1.0F, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.NORTH)) + { + setBlockBounds(minPos, minPos, 0.0F, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.SOUTH)) + { + setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, 1.0F); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + +// float facadeThickness = TransportConstants.FACADE_THICKNESS; +// +// +// if (tileG.hasFacade(ForgeDirection.EAST)) { +// setBlockBounds(1 - facadeThickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.WEST)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, facadeThickness, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.UP)) { +// setBlockBounds(0.0F, 1 - facadeThickness, 0.0F, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.DOWN)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, facadeThickness, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.SOUTH)) { +// setBlockBounds(0.0F, 0.0F, 1 - facadeThickness, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.NORTH)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, facadeThickness); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } + } + setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + */ } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java index eb82567d..b33e632f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -5,6 +5,9 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileEnvironmentalIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileOffensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfEnvironmentalIce; @@ -20,29 +23,27 @@ public class SpellEffectIce extends SpellEffect @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.damage+=2; + parad.addImpactEffect(new ProjectileOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub + parad.addImpactEffect(new ProjectileDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addUpdateEffect(new ProjectileEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defaultModificationSelf(SpellParadigmSelf parad) { parad.addSelfSpellEffect(new SelfDefaultIce(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); - } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 629c2417..fba4bbb6 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -95,4 +95,14 @@ public class SpellHelper return ForgeDirection.EAST; } + + public static void freezeWaterBlock(World world, int posX, int posY, int posZ) + { + int id = world.getBlockId(posX, posY, posZ); + + if(id == Block.waterStill.blockID || id == Block.waterMoving.blockID) + { + world.setBlock(posX, posY, posZ, Block.ice.blockID); + } + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java new file mode 100644 index 00000000..c65b4eff --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +public abstract class ProjectileUpdateEffect implements IProjectileUpdateEffect +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public ProjectileUpdateEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java new file mode 100644 index 00000000..6b922b8a --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileDefensiveIce extends ProjectileImpactEffect +{ + public ProjectileDefensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop) + { + return; + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + int horizRadius = this.powerUpgrades+1; + int vertRadius = this.potencyUpgrades; + + int posX = mop.blockX; + int posY = mop.blockY; + int posZ = mop.blockZ; + + for(int i=-horizRadius; i<=horizRadius; i++) + { + for(int k=-horizRadius; k<=horizRadius; k++) + { + for(int j=-vertRadius; j<=vertRadius; j++) + { + SpellHelper.freezeWaterBlock(world, posX+i, posY+j, posZ+k); + + if(world.isAirBlock(posX+i, posY+j, posZ+k)&&!world.isAirBlock(posX+i, posY+j-1, posZ+k)) + { + world.setBlock(posX+i, posY+j, posZ+k, Block.snow.blockID); + } + } + } + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java new file mode 100644 index 00000000..0bfdee95 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileUpdateEffect; + +public class ProjectileEnvironmentalIce extends ProjectileUpdateEffect +{ + + public ProjectileEnvironmentalIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onUpdateEffect(Entity projectile) + { + Vec3 posVec = SpellHelper.getEntityBlockVector(projectile); + + int horizRange = this.powerUpgrades+1; + int vertRange = this.potencyUpgrades+1; + + int posX = (int)(posVec.xCoord); + int posY = (int)(posVec.yCoord); + int posZ = (int)(posVec.zCoord); + + for(int i=-horizRange; i<=horizRange; i++) + { + for(int j=-vertRange; j<=vertRange; j++) + { + for(int k=-horizRange; k<=horizRange; k++) + { + SpellHelper.freezeWaterBlock(projectile.worldObj, posX+i, posY+j, posZ+k); + } + } + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java new file mode 100644 index 00000000..dbc4ac1c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java @@ -0,0 +1,32 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileOffensiveIce extends ProjectileImpactEffect +{ + public ProjectileOffensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop) + { + if(mop instanceof EntityLivingBase) + { + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id,60*(this.powerUpgrades+1),this.potencyUpgrades)); + } + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + return; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java index 1933a411..6c22e269 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -90,4 +90,13 @@ public class TEOrientable extends TileEntity implements IOrientable { return PacketHandler.getBlockOrientationPacket(this); } + + public boolean isSideRendered(ForgeDirection side) + { + if(side.equals(this.getInputDirection()) || side.equals(this.getOutputDirection())) + { + return true; + } + return false; + } } From 456d4990bf1d11845a907654839bf00c409fec0f Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 6 Feb 2014 22:17:22 -0500 Subject: [PATCH 16/33] Added some spell block rendering --- .../client/ClientProxy.java | 59 +++- .../common/block/BlockSpellEffect.java | 18 ++ .../block/RenderSpellEffectBlock.java | 49 +++ .../itemRender/TEConduitItemRenderer.java | 98 ++++++ .../TESpellEffectBlockItemRenderer.java | 107 +++++++ .../renderer/model/ModelSpellEffectBlock.java | 287 ++++++++++++++++++ .../common/tileEntity/TEOrientable.java | 10 +- .../common/tileEntity/TESpellEffectBlock.java | 12 + .../tileEntity/TESpellParadigmBlock.java | 2 + .../textures/models/BlockSpellEffect.png | Bin 0 -> 985 bytes .../textures/models/SpellEffectFire.png | Bin 0 -> 1258 bytes 11 files changed, 633 insertions(+), 9 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java create mode 100644 resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png diff --git a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java index 9fadd55d..c3c18cac 100644 --- a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -1,26 +1,66 @@ package WayofTime.alchemicalWizardry.client; +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.common.CommonProxy; import WayofTime.alchemicalWizardry.common.EntityAirElemental; -import WayofTime.alchemicalWizardry.common.entity.mob.*; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityEarthElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFireElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityHolyElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade; +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.entity.projectile.EnergyBlastProjectile; import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; -import WayofTime.alchemicalWizardry.common.renderer.block.*; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderConduit; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderPedestal; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderPlinth; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderWritingTable; +import WayofTime.alchemicalWizardry.common.renderer.block.TEAltarRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEAltarItemRenderer; -import WayofTime.alchemicalWizardry.common.renderer.mob.*; -import WayofTime.alchemicalWizardry.common.renderer.model.*; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEConduitItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEffectBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBileDemon; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBoulderFist; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderElemental; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderFallenAngel; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderIceDemon; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderLowerGuardian; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderShade; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderSmallEarthGolem; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderWingedFireDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBileDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBoulderFist; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelElemental; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelFallenAngel; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelIceDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelLowerGuardian; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelShade; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSmallEarthGolem; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelWingedFireDemon; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBazookaMainProjectile; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBlastProjectile; import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderMeteor; import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; -import WayofTime.alchemicalWizardry.common.tileEntity.*; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; -import net.minecraft.world.World; -import net.minecraftforge.client.MinecraftForgeClient; public class ClientProxy extends CommonProxy { @@ -67,6 +107,11 @@ public class ClientProxy extends CommonProxy ClientRegistry.bindTileEntitySpecialRenderer(TEPlinth.class, new RenderPlinth()); ClientRegistry.bindTileEntitySpecialRenderer(TEWritingTable.class, new RenderWritingTable()); ClientRegistry.bindTileEntitySpecialRenderer(TEConduit.class, new RenderConduit()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellEffectBlock.class, new RenderSpellEffectBlock()); + + //Item Renderer stuff + MinecraftForgeClient.registerItemRenderer(ModBlocks.blockConduit.blockID, new TEConduitItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellEffect.blockID, new TESpellEffectBlockItemRenderer()); //RenderingRegistry.registerEntityRenderingHandler(FireProjectile.class, new RenderFireProjectile()); //RenderingRegistry.registerBlockHandler(new AltarRenderer()); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java index e3efbe58..2130e46c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -26,6 +26,24 @@ public class BlockSpellEffect extends BlockOrientable return new TESpellEffectBlock(); } + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java new file mode 100644 index 00000000..b750b2a3 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellEffectBlock extends TileEntitySpecialRenderer +{ + private ModelSpellEffectBlock modelSpellEffectBlock = new ModelSpellEffectBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellEffectBlock) + { + TESpellEffectBlock tileSpellBlock = (TESpellEffectBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellEffect.png"); + int meta = tileEntity.worldObj.getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellEffectBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java new file mode 100644 index 00000000..cf062cfa --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java @@ -0,0 +1,98 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.client.FMLClientHandler; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelConduit; + +public class TEConduitItemRenderer implements IItemRenderer +{ + private ModelConduit modelConduit = new ModelConduit(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockConduit; + Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/Conduit.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelConduit.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.UP, ForgeDirection.DOWN); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java new file mode 100644 index 00000000..340f18c2 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEffectBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellEffectBlockItemRenderer implements IItemRenderer +{ + private ModelSpellEffectBlock modelSpellBlock = new ModelSpellEffectBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.UP, ForgeDirection.DOWN); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + } + return ""; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java new file mode 100644 index 00000000..af9f1d6a --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java @@ -0,0 +1,287 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.ForgeDirection; + +public class ModelSpellEffectBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer frame1; + ModelRenderer frame2; + ModelRenderer frame3; + ModelRenderer frame4; + ModelRenderer frame5; + ModelRenderer frame6; + ModelRenderer frame7; + ModelRenderer frame8; + ModelRenderer frame9; + ModelRenderer frame10; + ModelRenderer frame11; + ModelRenderer frame12; + ModelRenderer inputSpacer1; + ModelRenderer inputFace; + ModelRenderer inputSpacer2; + ModelRenderer inputSpacer3; + ModelRenderer inputSpacer4; + ModelRenderer outputFace; + + public ModelSpellEffectBlock() + { + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + frame1 = new ModelRenderer(this, 16, 18); + frame1.addBox(3F, -3F, -5F, 2, 6, 2); + frame1.setRotationPoint(0F, 16F, 0F); + frame1.setTextureSize(64, 64); + frame1.mirror = true; + setRotation(frame1, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 0, 18); + frame2.addBox(-5F, -3F, -5F, 2, 6, 2); + frame2.setRotationPoint(0F, 16F, 0F); + frame2.setTextureSize(64, 64); + frame2.mirror = true; + setRotation(frame2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 13); + frame3.addBox(-5F, -5F, -5F, 10, 2, 2); + frame3.setRotationPoint(0F, 16F, 0F); + frame3.setTextureSize(64, 64); + frame3.mirror = true; + setRotation(frame3, 0F, 0F, 0F); + frame4 = new ModelRenderer(this, 0, 27); + frame4.addBox(-5F, 3F, -5F, 10, 2, 2); + frame4.setRotationPoint(0F, 16F, 0F); + frame4.setTextureSize(64, 64); + frame4.mirror = true; + setRotation(frame4, 0F, 0F, 0F); + frame5 = new ModelRenderer(this, 0, 34); + frame5.addBox(-5F, -5F, 3F, 10, 2, 2); + frame5.setRotationPoint(0F, 16F, 0F); + frame5.setTextureSize(64, 64); + frame5.mirror = true; + setRotation(frame5, 0F, 0F, 0F); + frame6 = new ModelRenderer(this, 0, 48); + frame6.addBox(-5F, 3F, 3F, 10, 2, 2); + frame6.setRotationPoint(0F, 16F, 0F); + frame6.setTextureSize(64, 64); + frame6.mirror = true; + setRotation(frame6, 0F, 0F, 0F); + frame7 = new ModelRenderer(this, 16, 39); + frame7.addBox(-5F, -3F, 3F, 2, 6, 2); + frame7.setRotationPoint(0F, 16F, 0F); + frame7.setTextureSize(64, 64); + frame7.mirror = true; + setRotation(frame7, 0F, 0F, 0F); + frame8 = new ModelRenderer(this, 0, 39); + frame8.addBox(3F, -3F, 3F, 2, 6, 2); + frame8.setRotationPoint(0F, 16F, 0F); + frame8.setTextureSize(64, 64); + frame8.mirror = true; + setRotation(frame8, 0F, 0F, 0F); + frame9 = new ModelRenderer(this, 25, 9); + frame9.addBox(-5F, 3F, -3F, 2, 2, 6); + frame9.setRotationPoint(0F, 16F, 0F); + frame9.setTextureSize(64, 64); + frame9.mirror = true; + setRotation(frame9, 0F, 0F, 0F); + frame10 = new ModelRenderer(this, 25, 0); + frame10.addBox(-5F, -5F, -3F, 2, 2, 6); + frame10.setRotationPoint(0F, 16F, 0F); + frame10.setTextureSize(64, 64); + frame10.mirror = true; + setRotation(frame10, 0F, 0F, 0F); + frame11 = new ModelRenderer(this, 42, 0); + frame11.addBox(3F, -5F, -3F, 2, 2, 6); + frame11.setRotationPoint(0F, 16F, 0F); + frame11.setTextureSize(64, 64); + frame11.mirror = true; + setRotation(frame11, 0F, 0F, 0F); + frame12 = new ModelRenderer(this, 42, 9); + frame12.addBox(3F, 3F, -3F, 2, 2, 6); + frame12.setRotationPoint(0F, 16F, 0F); + frame12.setTextureSize(64, 64); + frame12.mirror = true; + setRotation(frame12, 0F, 0F, 0F); + inputSpacer1 = new ModelRenderer(this, 25, 27); + inputSpacer1.addBox(3F, -5F, -8F, 2, 2, 2); + inputSpacer1.setRotationPoint(0F, 16F, 0F); + inputSpacer1.setTextureSize(64, 64); + inputSpacer1.mirror = true; + setRotation(inputSpacer1, 0F, 0F, 0F); + inputFace = new ModelRenderer(this, 34, 27); + inputFace.addBox(-2F, -2F, -8F, 4, 4, 2); + inputFace.setRotationPoint(0F, 16F, 0F); + inputFace.setTextureSize(64, 64); + inputFace.mirror = true; + setRotation(inputFace, 0F, 0F, 0F); + inputSpacer2 = new ModelRenderer(this, 25, 27); + inputSpacer2.addBox(-5F, -5F, -8F, 2, 2, 2); + inputSpacer2.setRotationPoint(0F, 16F, 0F); + inputSpacer2.setTextureSize(64, 64); + inputSpacer2.mirror = true; + setRotation(inputSpacer2, 0F, 0F, 0F); + inputSpacer3 = new ModelRenderer(this, 25, 27); + inputSpacer3.addBox(3F, 3F, -8F, 2, 2, 2); + inputSpacer3.setRotationPoint(0F, 16F, 0F); + inputSpacer3.setTextureSize(64, 64); + inputSpacer3.mirror = true; + setRotation(inputSpacer3, 0F, 0F, 0F); + inputSpacer4 = new ModelRenderer(this, 25, 27); + inputSpacer4.addBox(-5F, 3F, -8F, 2, 2, 2); + inputSpacer4.setRotationPoint(0F, 16F, 0F); + inputSpacer4.setTextureSize(64, 64); + inputSpacer4.mirror = true; + setRotation(inputSpacer4, 0F, 0F, 0F); + outputFace = new ModelRenderer(this, 34, 34); + outputFace.addBox(6F, -2F, -2F, 2, 4, 4); + outputFace.setRotationPoint(0F, 16F, 0F); + outputFace.setTextureSize(64, 64); + outputFace.mirror = true; + setRotation(outputFace, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputFace, xInputRot, yInputRot, zInputRot); + this.setRotation(outputFace, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(inputSpacer1, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer2, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer3, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer4, xInputRot, yInputRot, zInputRot); + + core.render(f5); + frame1.render(f5); + frame2.render(f5); + frame3.render(f5); + frame4.render(f5); + frame5.render(f5); + frame6.render(f5); + frame7.render(f5); + frame8.render(f5); + frame9.render(f5); + frame10.render(f5); + frame11.render(f5); + frame12.render(f5); + inputSpacer1.render(f5); + inputFace.render(f5); + inputSpacer2.render(f5); + inputSpacer3.render(f5); + inputSpacer4.render(f5); + outputFace.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java index 6c22e269..741d7f42 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -1,11 +1,12 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import WayofTime.alchemicalWizardry.common.PacketHandler; -import WayofTime.alchemicalWizardry.common.block.IOrientable; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.block.IOrientable; public class TEOrientable extends TileEntity implements IOrientable { @@ -99,4 +100,9 @@ public class TEOrientable extends TileEntity implements IOrientable } return false; } + + public String getResourceLocationForMeta(int meta) + { + return ""; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java index d12bc579..389d3399 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.common.tileEntity; +import net.minecraft.util.ResourceLocation; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; @@ -23,4 +24,15 @@ public class TESpellEffectBlock extends TESpellBlock } return new SpellEffectFire(); } + + @Override + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + } + return ""; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java index 73b39124..c612a1f3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java @@ -70,4 +70,6 @@ public class TESpellParadigmBlock extends TESpellBlock } } + + } diff --git a/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png b/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png new file mode 100644 index 0000000000000000000000000000000000000000..e22b9c40349441ae1673097274da3d2b689e1af9 GIT binary patch literal 985 zcmV;~119{5P)VGd000McNliru-U0^#01KC)vA_TT17=A? zK~#9!?U>I}+g23De^aX>er zR)X9SV4xL1JGA`@dyvdPs|d>*D6Wb}7y!z>>$UOE;S9MyTQ7l=Lc9q69(eoEZQ9M} z_rYn~j+q8ije!KHXZ)Ps2i1Y_1!QWF+_G)CUFdkw^*|qjo4hCE+7JLxn+K-@jW0pJ zJ=@mK+W)Qt#sRN!4GHLGpyR{LKlTl`<{)J5jK0BO>*H5Nc(s6U!T@b$UvD4y&wN!dV@>xYJ>3By$XpfO()| zH}4-pdjX=QUa8xJP6<*CnKxD!+F7W62T2}u3v&P3zVUr%-Ug=*{_%8(qpGZ6nls>5 zz->Ub0%;MV2ataW;cKXV1F8;w1ZeRIubx;P33tB-s1x856 zi#F#ofR}*t2BP~={2jbw=w@xA_&X33K{r5GAiE9zD@f+S1VG#V@>@V`t4J^f0;$6n zkd*92sz9eOvkl!@sL$Cb$Zgw_sOr6b0R(^BRMBnV2vieHkNZvunjtvdDIj3}xBieZ zPy(t7Ism4?G9`|JUy082%d?=Kaxl$hQ1|5$^f7Ygx;*6md8|#g_+97(ZwgKg#)+Z0 z2q%U^4fZ929x?ewNN|%=U}UCb6sAT*Z~{cIU*yzB-{hx`mk1C7ga9Ex2oOw?5xNNF zOU^vV2wlc3onJ@!|NY7oBQ(yh!H=1xVe1(FywMmeiGWF2h(v(kCX~SmJYTr+DWFfq z=kdtPppo+cDT7xpgC`hv+&$`(COtCIkwejIB7z@?+@(b9Q^$XH0w!f4t9^R3Iz*(D zq<|101PB3w>;E+q)@s&mP1Y4-n00000NkvXX Hu0mjfAnLK& literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png new file mode 100644 index 0000000000000000000000000000000000000000..ea5baeffe9833577d1fd9d2319b8fcbead6287d2 GIT binary patch literal 1258 zcmVVGd000McNliru-U0^$3pmP0V=4du1b0b9 zK~#9!?V8PR8$}q#fBRvtKjJvCi4>HiL{RY&B#!(894f_UPFy%3RqDNGdhb0Fw_dow zh08|$AAkd>ssIti5CSbNuH&!xW9{KEyTqQ@@j5oKHABj`)0~kq6U* z>N+^b5PJr_mVEfkGcY^SFn&s;F>gnaLrAWVowI121h9lbbo9a#EXhI@MzR-Qm> z9a68L-UG7@}R!q-*sm)$LI*i0VVnH&P(X5L1n|2 zx&!Fu!LuR$T=GIE0p<6gnE|^k7X_et8(Ob}*#M_@rW6aU0;M~M))H7HuudUS0xt`d zw;}T@r2m5QJ76@xseqRPs|6?TpM`(oH%WxeZD=k-`VSci-YTqrGdZ(g=@u|Ou-ek= z&M$JmTNT-9RiwmuNl3qd@&}MQfOyS+@G4lxKpd*?LaYIX0AYb`fER&8$gZwK<`CjQ ztO@3GsN9C^_YkW=FCjOIa|EfZWPG~>i6S_ELNf;<1$5*qa|l$WilibykaqfKXy#?Z zGi1`URD|9NG*)F4B#TlKjfQWRg4FMFtJodj1dJ94f9<<@Xr;mIUHs*HiezoiV*zsC zo!_GZ@<7>uE`V5Oi##W(Z>bE}Wmq$w@FLPO7+f4ZLfrjYN=L!>PSKZ>Kv0f8cL{6) zyW-Q~vJ_@7&LR<-76Ym97axzlfs6X0od`V|JWPy3un<8c1YT4Vlz^RQmBjpSiBNw? z_g||BYo`&_dcd>^#VnGVdBD8!5ukcb#W+t+JAUpF(4UR%xh`ru42F%{bE6@fhFVio zF|Nio?Rd=ri?9Iq3Wb5hL2ZXkXNS$BNiZUEs1qU8lcREO^(>&;1^ru}4k5qKe8SxH z+Yc_V39za3KbS44UWx?6o*5#O2&rBj6#>KS#zoA&>lzPzsl3lazuuIi63qT{e%N}zb*c?43`5T?0<;cj8I%Z0W8>saCBTcwZ>l>BBbl?_0@q32 z!opTPKTiKu1-Q%bhzaH$nh-78VQ3QXUZ#kuWpDx+44@`WXE!WnDuec@vw$v&-VoTM z&h!1h>|CZE5O)0BQ3SDDD2UxcK@>r#?J%J~Y+TS@coHn?qUgfMS|DquQW#gpQFM=z^K|lR3pKh)N7Y1qH1VpXlQ6?XlQ6?Xe=831?s&_ Uy{>IGc>n+a07*qoM6N<$f-B`dd;kCd literal 0 HcmV?d00001 From 1fbaf9a3f4917eccc12984652c77e4f8c7d52976 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 7 Feb 2014 16:22:08 -0500 Subject: [PATCH 17/33] Ice spell effect solidly 9/12 done Added some models to the spell effect blocks. Texturing needs work. --- .../AlchemicalWizardry.java | 4 ++ .../BloodMagicConfiguration.java | 1 + .../common/AlchemicalWizardryEventHooks.java | 47 +++++++++++++++--- .../common/PotionIceCloak.java | 18 +++++++ .../itemRender/TEConduitItemRenderer.java | 2 +- .../TESpellEffectBlockItemRenderer.java | 2 +- .../spell/complex/effect/SpellEffectIce.java | 21 ++++---- .../impactEffects/ice/SelfDefensiveIce.java | 21 ++++++++ .../textures/models/SpellEffectIce.png | Bin 0 -> 953 bytes 9 files changed, 95 insertions(+), 21 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/PotionIceCloak.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 5f6c4435..c102848d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -32,6 +32,7 @@ import WayofTime.alchemicalWizardry.common.PotionBoost; import WayofTime.alchemicalWizardry.common.PotionDrowning; import WayofTime.alchemicalWizardry.common.PotionFlameCloak; import WayofTime.alchemicalWizardry.common.PotionFlight; +import WayofTime.alchemicalWizardry.common.PotionIceCloak; import WayofTime.alchemicalWizardry.common.PotionInhibit; import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; import WayofTime.alchemicalWizardry.common.PotionReciprocation; @@ -131,6 +132,7 @@ public class AlchemicalWizardry public static Potion customPotionFlight; public static Potion customPotionReciprocation; public static Potion customPotionFlameCloak; + public static Potion customPotionIceCloak; public static int customPotionDrowningID; public static int customPotionBoostID; @@ -139,6 +141,7 @@ public class AlchemicalWizardry public static int customPotionFlightID; public static int customPotionReciprocationID; public static int customPotionFlameCloakID; + public static int customPotionIceCloakID; public static boolean isThaumcraftLoaded; public static boolean isForestryLoaded; @@ -557,6 +560,7 @@ public class AlchemicalWizardry customPotionFlight = (new PotionFlight(customPotionFlightID, false, 0)).setIconIndex(0, 0).setPotionName("Flight"); customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); + customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); //All items registered go here //LanguageRegistry.addName(orbOfTesting, "Orb of Testing"); LanguageRegistry.addName(ModItems.weakBloodOrb, "Weak Blood Orb"); diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 4b55f0a4..22676828 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -45,6 +45,7 @@ public class BloodMagicConfiguration AlchemicalWizardry.customPotionFlightID = config.get("Potion ID", "Flight", 104).getInt(); AlchemicalWizardry.customPotionReciprocationID = config.get("Potion ID", "Reciprocation", 105).getInt(); AlchemicalWizardry.customPotionFlameCloakID = config.get("Potion ID","FlameCloak",106).getInt(); + AlchemicalWizardry.customPotionIceCloakID = config.get("Potion ID","IceCloak",107).getInt(); MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index 7848d707..a36c67cc 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -1,10 +1,11 @@ package WayofTime.alchemicalWizardry.common; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import cpw.mods.fml.common.ObfuscationReflectionHelper; -import cpw.mods.fml.relauncher.ReflectionHelper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; @@ -14,12 +15,16 @@ import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.potion.Potion; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; - -import java.util.*; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import cpw.mods.fml.common.ObfuscationReflectionHelper; +import cpw.mods.fml.relauncher.ReflectionHelper; public class AlchemicalWizardryEventHooks { @@ -81,6 +86,11 @@ public class AlchemicalWizardryEventHooks double x = entityLiving.posX; double y = entityLiving.posY; double z = entityLiving.posZ; + + Vec3 blockVector = SpellHelper.getEntityBlockVector(entityLiving); + int xPos = (int)(blockVector.xCoord); + int yPos = (int)(blockVector.yCoord); + int zPos = (int)(blockVector.zCoord); if (entityLiving instanceof EntityPlayer && entityLiving.worldObj.isRemote) { @@ -248,6 +258,29 @@ public class AlchemicalWizardryEventHooks } } } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionIceCloak)) + { + if(entityLiving.worldObj.getWorldTime()%2==0) + entityLiving.worldObj.spawnParticle("reddust", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0x74,0xbb,0xfb); + int r = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionIceCloak).getAmplifier(); + int horizRange = r+1; + int vertRange = 1; + + if(!entityLiving.worldObj.isRemote) + { + for(int i=-horizRange; i<=horizRange;i++) + { + for(int k=-horizRange; k<=horizRange;k++) + { + for(int j=-vertRange-1; j<=vertRange-1; j++) + { + SpellHelper.freezeWaterBlock(entityLiving.worldObj, xPos+i, yPos+j, zPos+k); + } + } + } + } + } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PotionIceCloak.java b/BM_src/WayofTime/alchemicalWizardry/common/PotionIceCloak.java new file mode 100644 index 00000000..18eba799 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/PotionIceCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionIceCloak extends Potion +{ + public PotionIceCloak(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java index cf062cfa..d35ab929 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java @@ -42,7 +42,7 @@ public class TEConduitItemRenderer implements IItemRenderer GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); //A reference to your Model file. Again, very important. - this.modelConduit.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.UP, ForgeDirection.DOWN); + this.modelConduit.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); //Tell it to stop rendering for both the PushMatrix's GL11.glPopMatrix(); GL11.glPopMatrix(); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java index 340f18c2..d313a2bc 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java @@ -41,7 +41,7 @@ public class TESpellEffectBlockItemRenderer implements IItemRenderer GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); //A reference to your Model file. Again, very important. - this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.UP, ForgeDirection.DOWN); + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); //Tell it to stop rendering for both the PushMatrix's GL11.glPopMatrix(); GL11.glPopMatrix(); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java index b33e632f..8603fbee 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -3,12 +3,14 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefaultIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileEnvironmentalIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileOffensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfEnvironmentalIce; public class SpellEffectIce extends SpellEffect @@ -56,7 +58,7 @@ public class SpellEffectIce extends SpellEffect @Override public void defensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub + parad.addSelfSpellEffect(new SelfDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @@ -69,8 +71,7 @@ public class SpellEffectIce extends SpellEffect @Override public void defaultModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addEntityEffect(new MeleeDefaultIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -102,22 +103,19 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)((60)*(this.powerEnhancement+1)*(3*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForDefenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(75*(2*this.powerEnhancement+1)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(200*(2*this.powerEnhancement+1)*(2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override @@ -136,8 +134,7 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForDefenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(200*(3*powerEnhancement+1)*(2*potencyEnhancement + 1)*Math.pow(0.85, costEnhancement)); } @Override @@ -149,7 +146,7 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForDefaultMelee() { - return (int)(100*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + return (int)(125*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java new file mode 100644 index 00000000..0345fb8e --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfDefensiveIce extends SelfSpellEffect +{ + public SelfDefensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionIceCloak.id,300*(2*this.powerUpgrades+1),this.potencyUpgrades)); + } +} diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png new file mode 100644 index 0000000000000000000000000000000000000000..090b082a02e7712b141f1ce1e79ea3936d66d837 GIT binary patch literal 953 zcmV;q14jIbP)VGd000McNliru-U0^{3?ztd99IAU14c;abb;u8Je?oyeYxfQXGGzAL?3q1u%ih&8`WyTM zGIVKxY>oTK3w<~)JNPc4X;PvrA(m`@fFaSmqeb5FyW`0M2FP8!dfAhoOnn&Ab!GDF z{*DkxiPx=`RNK8Mdhjtq%lFT$8rO9FL)s0L8rIcno=Tah{R2RKb`Q{hV;*A!sebK- zK8!j_k1)}~Yt#GP!W%VlGO;{~XdLWio4mJ&PHvp~xJfDr(AD#riDb~6I@RTNZOOvSqxFAnh zQ8d?-32!R*p#0#n_=!+(M{>LX{{Rfg^+Q?=?yoA7T&2bM1>iA#KLYTb7On!|QCUck ztsc^T=61zlgpsoEN3?KNx5T6fiBQ;oF|8nhbpSsFO;0|-Hr8<=zDzo`+{K1C!TCZY zLTAU2`yX2XfEI<5CWVt0%e;@kGA!5Zr3*WSOoSL8-b7ZxxV}<*z}Ycm8UIv~fa=ofy$)A7kFwSSvL+OHBsKFuu=F0FTTVxkC9~?!-2<3a znPK&|3ru>hy2UsR#vm!R%&PA>pa=`lIM|y=9Q3wpDry?XlVC~0p-+T#OWJa7{Vbr% zasT#P!%LTUbne)q_F;?+V@vBlgvgx((!%x3P?|(Yx2nwpOmayc(~BZ;G_EkBjUy_! zw8{P0*kVfNzBr@H-aUFQo)D<#eAjxwBGm>8!_af{03Qc@7#xF3V@csnC&0At;+)|U zGV|U7ixl2m5$cvtivM~9*tZl#d0b;cRJ6lT8tcwdMD<}XMHpo0Nz?rU%Ur`?Xgdq| zqUe$!w4LYGH#@V`16=jzz5s(x*ZO*E(CGpW&u`RASrKYa@lo4CQu(f@FN!WZ2l%3> zFN*rppxKgfMNya1S<%k`nMiPv{z@a%KS#NEfUP!AR!<1hT5Xmhs)vV%hlhuUhlhuU bN73*fYjDdAI_6fb00000NkvXXu0mjfrUA3L literal 0 HcmV?d00001 From 0716155b7dceb7954f1847917d0e8c834acae04d Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 7 Feb 2014 17:20:26 -0500 Subject: [PATCH 18/33] Finished the ice spell effect --- .../spell/complex/effect/SpellEffectIce.java | 30 +++++------ .../ice/MeleeEnvironmentalIce.java | 38 ++++++++++++++ .../ice/ProjectileDefaultIce.java | 41 +++++++++++++++ .../impactEffects/ice/SelfOffensiveIce.java | 52 +++++++++++++++++++ 4 files changed, 144 insertions(+), 17 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java index 8603fbee..f11d92b0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -5,21 +5,24 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefaultIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeEnvironmentalIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefaultIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileEnvironmentalIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileOffensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefensiveIce; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfEnvironmentalIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfOffensiveIce; public class SpellEffectIce extends SpellEffect { @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileDefaultIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -51,15 +54,13 @@ public class SpellEffectIce extends SpellEffect @Override public void offensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationSelf(SpellParadigmSelf parad) { parad.addSelfSpellEffect(new SelfDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - } @Override @@ -89,15 +90,13 @@ public class SpellEffectIce extends SpellEffect @Override public void environmentalModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addEntityEffect(new MeleeEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)((30)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override @@ -127,8 +126,7 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForOffenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(2*this.powerEnhancement+1)*(2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override @@ -146,26 +144,24 @@ public class SpellEffectIce extends SpellEffect @Override protected int getCostForDefaultMelee() { - return (int)(125*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + return (int)(250*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForOffenseMelee() { - return (int)(25*(1.5*potencyEnhancement+1)*Math.pow(1.5, powerEnhancement)*Math.pow(0.85, costEnhancement)); + return (int)(40*(1.5*potencyEnhancement+1)*Math.pow(1.5, powerEnhancement)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForDefenseMelee() { - return (int)(10*(0.5*potencyEnhancement+1)*(0.7*powerEnhancement+1)*(0.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + return (int)(50*(0.5*potencyEnhancement+1)*(0.7*powerEnhancement+1)*(0.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } @Override protected int getCostForEnvironmentMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(20*(0.5*potencyEnhancement+1)*(0*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); } - } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java new file mode 100644 index 00000000..1399084f --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java @@ -0,0 +1,38 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.projectile.EntitySnowball; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeEnvironmentalIce extends ExtrapolatedMeleeEntityEffect +{ + public MeleeEnvironmentalIce(int power, int potency, int cost) + { + super(power, potency, cost); + this.setMaxNumberHit(1+potency); + this.setRadius(2); + this.setRange(3); + } + + @Override + protected boolean entityEffect(World world, Entity entity) + { + for(int i=0;i<=this.powerUpgrades;i++) + { + double randX = (world.rand.nextDouble()-world.rand.nextDouble())*3; + double randY = -world.rand.nextDouble()*3; + double randZ = (world.rand.nextDouble()-world.rand.nextDouble())*3; + + EntitySnowball snowball = new EntitySnowball(world, entity.posX-3*randX, entity.posY-3*randY, entity.posZ-3*randZ); + snowball.motionX = randX; + snowball.motionY = randY; + snowball.motionZ = randZ; + + world.spawnEntityInWorld(snowball); + } + + return true; + } + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java new file mode 100644 index 00000000..41e0291d --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java @@ -0,0 +1,41 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileDefaultIce extends ProjectileImpactEffect +{ + public ProjectileDefaultIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop) + { + return; + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + int horizRadius = this.powerUpgrades+1; + int vertRadius = this.potencyUpgrades; + + ForgeDirection sideHit = ForgeDirection.getOrientation(mop.sideHit); + + int posX = mop.blockX + sideHit.offsetX; + int posY = mop.blockY + sideHit.offsetY; + int posZ = mop.blockZ + sideHit.offsetZ; + + if(world.isAirBlock(posX, posY, posZ)) + { + world.setBlock(posX, posY, posZ, Block.ice.blockID); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java new file mode 100644 index 00000000..abbc5fd1 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java @@ -0,0 +1,52 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfOffensiveIce extends SelfSpellEffect +{ + public SelfOffensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + double horizRadius = this.powerUpgrades+1; + double vertRadius = 0.5*this.powerUpgrades+1; + + List entities = SpellHelper.getEntitiesInRange(world, player.posX, player.posY, player.posZ,horizRadius, vertRadius); + + if(entities==null) + { + return; + } + + int i=0; + int number = this.powerUpgrades+1; + + for(Entity entity : entities) + { + if(i>=number) + { + continue; + } + + if(entity instanceof EntityLivingBase && !entity.equals(player)) + { + ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id,60*(1+this.powerUpgrades),this.potencyUpgrades)); + + i++; + } + } + } +} From 92e097eaa29513f2b353bae1c4188fe8a81fb92b Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 9 Feb 2014 12:20:02 -0500 Subject: [PATCH 19/33] Working away at the spell blocks --- .../AlchemicalWizardry.java | 2 + .../common/block/BlockSpellEffect.java | 2 +- .../TESpellEffectBlockItemRenderer.java | 2 + .../renderer/model/ModelSpellEffectBlock.java | 273 ++++++++++-------- .../spell/complex/EntitySpellProjectile.java | 13 + .../complex/effect/SpellEffectEarth.java | 176 +++++++++++ .../spell/complex/effect/SpellEffectWind.java | 176 +++++++++++ .../common/tileEntity/TESpellEffectBlock.java | 7 +- .../textures/models/SpellEffectFire.png | Bin 1258 -> 1718 bytes .../textures/models/SpellEffectWind.png | Bin 0 -> 1210 bytes 10 files changed, 535 insertions(+), 116 deletions(-) create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index c102848d..55d672ab 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -718,6 +718,8 @@ public class AlchemicalWizardry GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 0), "Crucible of Fire"); LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 1), "Ice Maker"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 2), "Wind Generator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 3), "Earth Former"); GameRegistry.registerBlock(ModBlocks.speedRune, "speedRune"); LanguageRegistry.addName(ModBlocks.speedRune, "Speed Rune"); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java index 2130e46c..079104f0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -49,7 +49,7 @@ public class BlockSpellEffect extends BlockOrientable { if (this.blockID == ModBlocks.blockSpellEffect.blockID) { - for(int i=0; i<2; i++) + for(int i=0; i<4; i++) { par3List.add(new ItemStack(par1, 1, i)); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java index d313a2bc..b400c142 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java @@ -101,6 +101,8 @@ public class TESpellEffectBlockItemRenderer implements IItemRenderer { case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEffectWind.png"; + case 3: return "alchemicalwizardry:textures/models/SpellEffectEarth.png"; } return ""; } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java index af9f1d6a..75621bca 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java @@ -27,126 +27,161 @@ public class ModelSpellEffectBlock extends ModelBase ModelRenderer inputSpacer3; ModelRenderer inputSpacer4; ModelRenderer outputFace; + ModelRenderer outputPlug; + ModelRenderer outputSpacer1; + ModelRenderer outputSpacer2; + ModelRenderer outputSpacer3; + ModelRenderer outputSpacer4; public ModelSpellEffectBlock() { textureWidth = 64; textureHeight = 64; - core = new ModelRenderer(this, 0, 0); - core.addBox(-3F, -3F, -3F, 6, 6, 6); - core.setRotationPoint(0F, 16F, 0F); - core.setTextureSize(64, 64); - core.mirror = true; - setRotation(core, 0F, 0F, 0F); - frame1 = new ModelRenderer(this, 16, 18); - frame1.addBox(3F, -3F, -5F, 2, 6, 2); - frame1.setRotationPoint(0F, 16F, 0F); - frame1.setTextureSize(64, 64); - frame1.mirror = true; - setRotation(frame1, 0F, 0F, 0F); - frame2 = new ModelRenderer(this, 0, 18); - frame2.addBox(-5F, -3F, -5F, 2, 6, 2); - frame2.setRotationPoint(0F, 16F, 0F); - frame2.setTextureSize(64, 64); - frame2.mirror = true; - setRotation(frame2, 0F, 0F, 0F); - frame3 = new ModelRenderer(this, 0, 13); - frame3.addBox(-5F, -5F, -5F, 10, 2, 2); - frame3.setRotationPoint(0F, 16F, 0F); - frame3.setTextureSize(64, 64); - frame3.mirror = true; - setRotation(frame3, 0F, 0F, 0F); - frame4 = new ModelRenderer(this, 0, 27); - frame4.addBox(-5F, 3F, -5F, 10, 2, 2); - frame4.setRotationPoint(0F, 16F, 0F); - frame4.setTextureSize(64, 64); - frame4.mirror = true; - setRotation(frame4, 0F, 0F, 0F); - frame5 = new ModelRenderer(this, 0, 34); - frame5.addBox(-5F, -5F, 3F, 10, 2, 2); - frame5.setRotationPoint(0F, 16F, 0F); - frame5.setTextureSize(64, 64); - frame5.mirror = true; - setRotation(frame5, 0F, 0F, 0F); - frame6 = new ModelRenderer(this, 0, 48); - frame6.addBox(-5F, 3F, 3F, 10, 2, 2); - frame6.setRotationPoint(0F, 16F, 0F); - frame6.setTextureSize(64, 64); - frame6.mirror = true; - setRotation(frame6, 0F, 0F, 0F); - frame7 = new ModelRenderer(this, 16, 39); - frame7.addBox(-5F, -3F, 3F, 2, 6, 2); - frame7.setRotationPoint(0F, 16F, 0F); - frame7.setTextureSize(64, 64); - frame7.mirror = true; - setRotation(frame7, 0F, 0F, 0F); - frame8 = new ModelRenderer(this, 0, 39); - frame8.addBox(3F, -3F, 3F, 2, 6, 2); - frame8.setRotationPoint(0F, 16F, 0F); - frame8.setTextureSize(64, 64); - frame8.mirror = true; - setRotation(frame8, 0F, 0F, 0F); - frame9 = new ModelRenderer(this, 25, 9); - frame9.addBox(-5F, 3F, -3F, 2, 2, 6); - frame9.setRotationPoint(0F, 16F, 0F); - frame9.setTextureSize(64, 64); - frame9.mirror = true; - setRotation(frame9, 0F, 0F, 0F); - frame10 = new ModelRenderer(this, 25, 0); - frame10.addBox(-5F, -5F, -3F, 2, 2, 6); - frame10.setRotationPoint(0F, 16F, 0F); - frame10.setTextureSize(64, 64); - frame10.mirror = true; - setRotation(frame10, 0F, 0F, 0F); - frame11 = new ModelRenderer(this, 42, 0); - frame11.addBox(3F, -5F, -3F, 2, 2, 6); - frame11.setRotationPoint(0F, 16F, 0F); - frame11.setTextureSize(64, 64); - frame11.mirror = true; - setRotation(frame11, 0F, 0F, 0F); - frame12 = new ModelRenderer(this, 42, 9); - frame12.addBox(3F, 3F, -3F, 2, 2, 6); - frame12.setRotationPoint(0F, 16F, 0F); - frame12.setTextureSize(64, 64); - frame12.mirror = true; - setRotation(frame12, 0F, 0F, 0F); - inputSpacer1 = new ModelRenderer(this, 25, 27); - inputSpacer1.addBox(3F, -5F, -8F, 2, 2, 2); - inputSpacer1.setRotationPoint(0F, 16F, 0F); - inputSpacer1.setTextureSize(64, 64); - inputSpacer1.mirror = true; - setRotation(inputSpacer1, 0F, 0F, 0F); - inputFace = new ModelRenderer(this, 34, 27); - inputFace.addBox(-2F, -2F, -8F, 4, 4, 2); - inputFace.setRotationPoint(0F, 16F, 0F); - inputFace.setTextureSize(64, 64); - inputFace.mirror = true; - setRotation(inputFace, 0F, 0F, 0F); - inputSpacer2 = new ModelRenderer(this, 25, 27); - inputSpacer2.addBox(-5F, -5F, -8F, 2, 2, 2); - inputSpacer2.setRotationPoint(0F, 16F, 0F); - inputSpacer2.setTextureSize(64, 64); - inputSpacer2.mirror = true; - setRotation(inputSpacer2, 0F, 0F, 0F); - inputSpacer3 = new ModelRenderer(this, 25, 27); - inputSpacer3.addBox(3F, 3F, -8F, 2, 2, 2); - inputSpacer3.setRotationPoint(0F, 16F, 0F); - inputSpacer3.setTextureSize(64, 64); - inputSpacer3.mirror = true; - setRotation(inputSpacer3, 0F, 0F, 0F); - inputSpacer4 = new ModelRenderer(this, 25, 27); - inputSpacer4.addBox(-5F, 3F, -8F, 2, 2, 2); - inputSpacer4.setRotationPoint(0F, 16F, 0F); - inputSpacer4.setTextureSize(64, 64); - inputSpacer4.mirror = true; - setRotation(inputSpacer4, 0F, 0F, 0F); - outputFace = new ModelRenderer(this, 34, 34); - outputFace.addBox(6F, -2F, -2F, 2, 4, 4); - outputFace.setRotationPoint(0F, 16F, 0F); - outputFace.setTextureSize(64, 64); - outputFace.mirror = true; - setRotation(outputFace, 0F, 0F, 0F); + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + frame1 = new ModelRenderer(this, 16, 18); + frame1.addBox(3F, -3F, -5F, 2, 6, 2); + frame1.setRotationPoint(0F, 16F, 0F); + frame1.setTextureSize(64, 64); + frame1.mirror = true; + setRotation(frame1, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 0, 18); + frame2.addBox(-5F, -3F, -5F, 2, 6, 2); + frame2.setRotationPoint(0F, 16F, 0F); + frame2.setTextureSize(64, 64); + frame2.mirror = true; + setRotation(frame2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 13); + frame3.addBox(-5F, -5F, -5F, 10, 2, 2); + frame3.setRotationPoint(0F, 16F, 0F); + frame3.setTextureSize(64, 64); + frame3.mirror = true; + setRotation(frame3, 0F, 0F, 0F); + frame4 = new ModelRenderer(this, 0, 27); + frame4.addBox(-5F, 3F, -5F, 10, 2, 2); + frame4.setRotationPoint(0F, 16F, 0F); + frame4.setTextureSize(64, 64); + frame4.mirror = true; + setRotation(frame4, 0F, 0F, 0F); + frame5 = new ModelRenderer(this, 0, 34); + frame5.addBox(-5F, -5F, 3F, 10, 2, 2); + frame5.setRotationPoint(0F, 16F, 0F); + frame5.setTextureSize(64, 64); + frame5.mirror = true; + setRotation(frame5, 0F, 0F, 0F); + frame6 = new ModelRenderer(this, 0, 48); + frame6.addBox(-5F, 3F, 3F, 10, 2, 2); + frame6.setRotationPoint(0F, 16F, 0F); + frame6.setTextureSize(64, 64); + frame6.mirror = true; + setRotation(frame6, 0F, 0F, 0F); + frame7 = new ModelRenderer(this, 16, 39); + frame7.addBox(-5F, -3F, 3F, 2, 6, 2); + frame7.setRotationPoint(0F, 16F, 0F); + frame7.setTextureSize(64, 64); + frame7.mirror = true; + setRotation(frame7, 0F, 0F, 0F); + frame8 = new ModelRenderer(this, 0, 39); + frame8.addBox(3F, -3F, 3F, 2, 6, 2); + frame8.setRotationPoint(0F, 16F, 0F); + frame8.setTextureSize(64, 64); + frame8.mirror = true; + setRotation(frame8, 0F, 0F, 0F); + frame9 = new ModelRenderer(this, 25, 9); + frame9.addBox(-5F, 3F, -3F, 2, 2, 6); + frame9.setRotationPoint(0F, 16F, 0F); + frame9.setTextureSize(64, 64); + frame9.mirror = true; + setRotation(frame9, 0F, 0F, 0F); + frame10 = new ModelRenderer(this, 25, 0); + frame10.addBox(-5F, -5F, -3F, 2, 2, 6); + frame10.setRotationPoint(0F, 16F, 0F); + frame10.setTextureSize(64, 64); + frame10.mirror = true; + setRotation(frame10, 0F, 0F, 0F); + frame11 = new ModelRenderer(this, 42, 0); + frame11.addBox(3F, -5F, -3F, 2, 2, 6); + frame11.setRotationPoint(0F, 16F, 0F); + frame11.setTextureSize(64, 64); + frame11.mirror = true; + setRotation(frame11, 0F, 0F, 0F); + frame12 = new ModelRenderer(this, 42, 9); + frame12.addBox(3F, 3F, -3F, 2, 2, 6); + frame12.setRotationPoint(0F, 16F, 0F); + frame12.setTextureSize(64, 64); + frame12.mirror = true; + setRotation(frame12, 0F, 0F, 0F); + inputSpacer1 = new ModelRenderer(this, 25, 27); + inputSpacer1.addBox(3F, -5F, -8F, 2, 2, 3); + inputSpacer1.setRotationPoint(0F, 16F, 0F); + inputSpacer1.setTextureSize(64, 64); + inputSpacer1.mirror = true; + setRotation(inputSpacer1, 0F, 0F, 0F); + inputFace = new ModelRenderer(this, 38, 27); + inputFace.addBox(-2F, -2F, -8F, 4, 4, 5); + inputFace.setRotationPoint(0F, 16F, 0F); + inputFace.setTextureSize(64, 64); + inputFace.mirror = true; + setRotation(inputFace, 0F, 0F, 0F); + inputSpacer2 = new ModelRenderer(this, 25, 27); + inputSpacer2.addBox(-5F, -5F, -8F, 2, 2, 3); + inputSpacer2.setRotationPoint(0F, 16F, 0F); + inputSpacer2.setTextureSize(64, 64); + inputSpacer2.mirror = true; + setRotation(inputSpacer2, 0F, 0F, 0F); + inputSpacer3 = new ModelRenderer(this, 25, 27); + inputSpacer3.addBox(3F, 3F, -8F, 2, 2, 3); + inputSpacer3.setRotationPoint(0F, 16F, 0F); + inputSpacer3.setTextureSize(64, 64); + inputSpacer3.mirror = true; + setRotation(inputSpacer3, 0F, 0F, 0F); + inputSpacer4 = new ModelRenderer(this, 25, 27); + inputSpacer4.addBox(-5F, 3F, -8F, 2, 2, 3); + inputSpacer4.setRotationPoint(0F, 16F, 0F); + inputSpacer4.setTextureSize(64, 64); + inputSpacer4.mirror = true; + setRotation(inputSpacer4, 0F, 0F, 0F); + outputFace = new ModelRenderer(this, 38, 37); + outputFace.addBox(6F, -2F, -2F, 2, 4, 4); + outputFace.setRotationPoint(0F, 16F, 0F); + outputFace.setTextureSize(64, 64); + outputFace.mirror = true; + setRotation(outputFace, 0F, 0F, 0F); + outputPlug = new ModelRenderer(this, 36, 48); + outputPlug.addBox(3F, -3F, -3F, 2, 6, 6); + outputPlug.setRotationPoint(0F, 16F, 0F); + outputPlug.setTextureSize(64, 64); + outputPlug.mirror = true; + setRotation(outputPlug, 0F, 0F, 0F); + outputSpacer1 = new ModelRenderer(this, 25, 48); + outputSpacer1.addBox(5F, -5F, -5F, 3, 2, 2); + outputSpacer1.setRotationPoint(0F, 16F, 0F); + outputSpacer1.setTextureSize(64, 64); + outputSpacer1.mirror = true; + setRotation(outputSpacer1, 0F, 0F, 0F); + outputSpacer2 = new ModelRenderer(this, 25, 48); + outputSpacer2.addBox(5F, -5F, 3F, 3, 2, 2); + outputSpacer2.setRotationPoint(0F, 16F, 0F); + outputSpacer2.setTextureSize(64, 64); + outputSpacer2.mirror = true; + setRotation(outputSpacer2, 0F, 0F, 0F); + outputSpacer3 = new ModelRenderer(this, 25, 48); + outputSpacer3.addBox(5F, 3F, -5F, 3, 2, 2); + outputSpacer3.setRotationPoint(0F, 16F, 0F); + outputSpacer3.setTextureSize(64, 64); + outputSpacer3.mirror = true; + setRotation(outputSpacer3, 0F, 0F, 0F); + outputSpacer4 = new ModelRenderer(this, 25, 48); + outputSpacer4.addBox(5F, 3F, 3F, 3, 2, 2); + outputSpacer4.setRotationPoint(0F, 16F, 0F); + outputSpacer4.setTextureSize(64, 64); + outputSpacer4.mirror = true; + setRotation(outputSpacer4, 0F, 0F, 0F); } public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) @@ -250,6 +285,11 @@ public class ModelSpellEffectBlock extends ModelBase this.setRotation(inputSpacer2, xInputRot, yInputRot, zInputRot); this.setRotation(inputSpacer3, xInputRot, yInputRot, zInputRot); this.setRotation(inputSpacer4, xInputRot, yInputRot, zInputRot); + this.setRotation(outputPlug, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer4, xOutputRot, yOutputRot, zOutputRot); core.render(f5); frame1.render(f5); @@ -270,6 +310,11 @@ public class ModelSpellEffectBlock extends ModelBase inputSpacer3.render(f5); inputSpacer4.render(f5); outputFace.render(f5); + outputPlug.render(f5); + outputSpacer1.render(f5); + outputSpacer2.render(f5); + outputSpacer3.render(f5); + outputSpacer4.render(f5); } private void setRotation(ModelRenderer model, float x, float y, float z) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index b4dcd944..33d7baab 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -46,6 +46,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile private boolean penetration = false; public List updateEffectList = new ArrayList(); public List spellEffectList = new LinkedList(); + private int blocksBroken = 0; public EntitySpellProjectile(World par1World) { @@ -286,6 +287,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile // } par1NBTTagCompound.setTag("Effects", effectList); + par1NBTTagCompound.setInteger("blocksBroken", blocksBroken); } /** @@ -300,6 +302,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile inTile = par1NBTTagCompound.getByte("inTile") & 255; inData = par1NBTTagCompound.getByte("inData") & 255; inGround = par1NBTTagCompound.getByte("inGround") == 1; + blocksBroken = par1NBTTagCompound.getInteger("blocksBroken"); NBTTagList tagList = par1NBTTagCompound.getTagList("Effects"); @@ -567,4 +570,14 @@ public class EntitySpellProjectile extends Entity implements IProjectile { this.spellEffectList = list; } + + public int getBlocksBroken() + { + return this.blocksBroken; + } + + public void setBlocksBroken(int blocksBroken) + { + this.blocksBroken = blocksBroken; + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java new file mode 100644 index 00000000..ee98c2d2 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -0,0 +1,176 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; + +public class SpellEffectEarth extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java new file mode 100644 index 00000000..0b9f2623 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -0,0 +1,176 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; + +public class SpellEffectWind extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java index 389d3399..a2b9a4be 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java @@ -1,10 +1,11 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import net.minecraft.util.ResourceLocation; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectWind; public class TESpellEffectBlock extends TESpellBlock { @@ -21,6 +22,8 @@ public class TESpellEffectBlock extends TESpellBlock { case 0: return new SpellEffectFire(); case 1: return new SpellEffectIce(); + case 2: return new SpellEffectWind(); + case 3: return new SpellEffectEarth(); } return new SpellEffectFire(); } @@ -32,6 +35,8 @@ public class TESpellEffectBlock extends TESpellBlock { case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEffectWind.png"; + case 3: return "alchemicalwizardry:textures/models/SpellEffectEarth.png"; } return ""; } diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png index ea5baeffe9833577d1fd9d2319b8fcbead6287d2..767fb339f418d25edb6806f59ef8a8696a6e41a3 100644 GIT binary patch delta 1696 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 u!JO1p diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d75155adae472016881033fffdc69e346e9439 GIT binary patch literal 1210 zcmV;r1V#IaP)VGd000McNliru-U0{$0}hmh2HF4s1V>3k zK~#9!?V3MtBSjd-f3w-O9Xm1c#lBdOd;vZHSJ4J3sgWp=K#D|jRch$3f{yM={?xWm zYMT21oJ5601UiUwan9KB-yMqAo3+=w&Teca>tr4&if8=JXlLGM-uIbztq6hskWbXn zvtIz%DuZP~rw!e<7}y!G)}Vjo4|@Jekq`%mhkCMIuhs5+4lA@*v4!nGeiH_LS*&Hr zAAs$EZNt+KAXi|OVTZ2&H-5x+e!$7V*VdD%|UI;~K?%-V@Xy<*u_c^n{@5}MM zV|U#CW{!=A-N5%@W9~W##=SGFj1UTXHHraYb~iDmUaP4Wh*yt!F)p|qkLl+*Tg}+` z#hIY(^`kF^3D)F2KW;tXA=L&_BU0{-0VWTaG$`;&V>hL@U;s?|E-p6Wq|9X>frpgd zVoTwm=WojY!3+?^7;oNCL6o-3P!jLnrig0NV1hL0At;*s2i8kXgLdRyz!XIv2kfY# z=H#25B%V(?{@ypBzTb#^y;a|D#CqKvIxb;hQm@^nh-zS9U|?WiU|?WiV30Qa Y55)yHzEITXx&QzG07*qoM6N<$f^ Date: Fri, 14 Feb 2014 15:20:20 -0500 Subject: [PATCH 20/33] 1.7.2 commit --- .../AlchemicalWizardry.java | 804 ++++++++++++ .../BloodMagicConfiguration.java | 209 ++++ .../alchemicalWizardry/ModBlocks.java | 117 ++ .../alchemicalWizardry/ModItems.java | 274 +++++ .../client/ClientProxy.java | 132 ++ .../common/AlchemicalWizardryEventHooks.java | 298 +++++ .../common/AlchemicalWizardryFuelHandler.java | 71 ++ .../common/AlchemicalWizardryTickHandler.java | 47 + .../common/ArmourComponent.java | 23 + .../common/ArmourUpgrade.java | 15 + .../common/CommonProxy.java | 91 ++ .../common/EntityAIFly.java | 5 + .../common/EntityAITargetAggro.java | 24 + .../common/EntityAirElemental.java | 33 + .../alchemicalWizardry/common/IBindable.java | 5 + .../common/IBindingAgent.java | 6 + .../alchemicalWizardry/common/ICatalyst.java | 8 + .../alchemicalWizardry/common/IDemon.java | 10 + .../common/IFillingAgent.java | 6 + .../common/LifeBucketHandler.java | 42 + .../common/LifeEssence.java | 28 + .../common/LifeEssenceNetwork.java | 26 + .../common/ModLivingDropsEvent.java | 36 + .../common/NewPacketHandler.java | 686 +++++++++++ .../common/PacketHandler.java | 966 +++++++++++++++ .../common/PlinthComponent.java | 37 + .../common/PotionBoost.java | 18 + .../common/PotionDrowning.java | 18 + .../common/PotionFlameCloak.java | 18 + .../common/PotionFlight.java | 18 + .../common/PotionIceCloak.java | 18 + .../common/PotionInhibit.java | 18 + .../common/PotionProjectileProtect.java | 18 + .../common/PotionReciprocation.java | 18 + .../AlchemicalPotionCreationHandler.java | 108 ++ .../AlchemyPotionHandlerComponent.java | 52 + .../common/alchemy/AlchemyPotionHelper.java | 76 ++ .../common/alchemy/AlchemyRecipe.java | 181 +++ .../common/alchemy/AlchemyRecipeRegistry.java | 85 ++ .../altarRecipeRegistry/AltarRecipe.java | 70 ++ .../AltarRecipeRegistry.java | 100 ++ .../common/block/ArmourForge.java | 335 +++++ .../common/block/BlockAltar.java | 279 +++++ .../common/block/BlockBloodLightSource.java | 75 ++ .../common/block/BlockConduit.java | 101 ++ .../common/block/BlockHomHeart.java | 101 ++ .../common/block/BlockMasterStone.java | 72 ++ .../common/block/BlockOrientable.java | 252 ++++ .../common/block/BlockPedestal.java | 193 +++ .../common/block/BlockPlinth.java | 193 +++ .../common/block/BlockSocket.java | 163 +++ .../common/block/BlockSpellEffect.java | 62 + .../common/block/BlockSpellEnhancement.java | 46 + .../common/block/BlockSpellModifier.java | 45 + .../common/block/BlockSpellParadigm.java | 211 ++++ .../common/block/BlockTeleposer.java | 321 +++++ .../common/block/BlockWritingTable.java | 181 +++ .../common/block/BloodRune.java | 112 ++ .../common/block/BloodStoneBrick.java | 27 + .../common/block/EfficiencyRune.java | 31 + .../common/block/EmptySocket.java | 34 + .../common/block/IOrientable.java | 14 + .../common/block/ImperfectRitualStone.java | 143 +++ .../common/block/LargeBloodStoneBrick.java | 27 + .../common/block/LifeEssenceBlock.java | 58 + .../common/block/RitualStone.java | 122 ++ .../common/block/RuneOfSacrifice.java | 31 + .../common/block/RuneOfSelfSacrifice.java | 31 + .../common/block/SpectralBlock.java | 104 ++ .../common/block/SpeedRune.java | 31 + .../bloodAltarUpgrade/AltarComponent.java | 60 + .../AltarUpgradeComponent.java | 93 ++ .../bloodAltarUpgrade/UpgradedAltars.java | 296 +++++ .../common/entity/mob/EntityBileDemon.java | 493 ++++++++ .../common/entity/mob/EntityBoulderFist.java | 499 ++++++++ .../common/entity/mob/EntityDemon.java | 94 ++ .../entity/mob/EntityEarthElemental.java | 28 + .../common/entity/mob/EntityElemental.java | 750 ++++++++++++ .../common/entity/mob/EntityFallenAngel.java | 507 ++++++++ .../entity/mob/EntityFireElemental.java | 26 + .../entity/mob/EntityHolyElemental.java | 28 + .../common/entity/mob/EntityIceDemon.java | 529 ++++++++ .../entity/mob/EntityLowerGuardian.java | 491 ++++++++ .../common/entity/mob/EntityShade.java | 498 ++++++++ .../entity/mob/EntityShadeElemental.java | 27 + .../entity/mob/EntitySmallEarthGolem.java | 505 ++++++++ .../entity/mob/EntityWaterElemental.java | 25 + .../entity/mob/EntityWingedFireDemon.java | 508 ++++++++ .../projectile/EnergyBlastProjectile.java | 508 ++++++++ .../EntityBloodLightProjectile.java | 137 +++ .../EntityEnergyBazookaMainProjectile.java | 100 ++ ...ntityEnergyBazookaSecondaryProjectile.java | 508 ++++++++ .../entity/projectile/EntityMeteor.java | 64 + .../projectile/ExplosionProjectile.java | 134 ++ .../entity/projectile/FireProjectile.java | 115 ++ .../entity/projectile/HolyProjectile.java | 117 ++ .../entity/projectile/IceProjectile.java | 123 ++ .../projectile/LightningBoltProjectile.java | 126 ++ .../entity/projectile/MudProjectile.java | 131 ++ .../entity/projectile/TeleportProjectile.java | 205 ++++ .../entity/projectile/WaterProjectile.java | 107 ++ .../entity/projectile/WindGustProjectile.java | 110 ++ .../common/items/AWBaseItems.java | 44 + .../common/items/ActivationCrystal.java | 135 +++ .../common/items/AirScribeTool.java | 20 + .../common/items/ApprenticeBloodOrb.java | 21 + .../common/items/ArchmageBloodOrb.java | 21 + .../common/items/ArmourInhibitor.java | 215 ++++ .../common/items/BlankSpell.java | 114 ++ .../common/items/BloodShard.java | 73 ++ .../common/items/BloodboundSword.java | 103 ++ .../common/items/BoundArmour.java | 588 +++++++++ .../common/items/BoundAxe.java | 381 ++++++ .../common/items/BoundPickaxe.java | 394 ++++++ .../common/items/BoundShovel.java | 388 ++++++ .../common/items/CheatyItem.java | 254 ++++ .../common/items/DaggerOfSacrifice.java | 268 ++++ .../common/items/DemonPlacer.java | 277 +++++ .../items/DemonicTelepositionFocus.java | 47 + .../common/items/DuskScribeTool.java | 20 + .../common/items/EarthScribeTool.java | 20 + .../common/items/EnergyBattery.java | 255 ++++ .../common/items/EnergyBazooka.java | 219 ++++ .../common/items/EnergyBlast.java | 214 ++++ .../common/items/EnergyItems.java | 388 ++++++ .../common/items/EnergySword.java | 238 ++++ .../items/EnhancedTelepositionFocus.java | 46 + .../common/items/FireScribeTool.java | 20 + .../common/items/ItemBloodRuneBlock.java | 59 + .../common/items/ItemComplexSpellCrystal.java | 108 ++ .../common/items/ItemDiabloKey.java | 128 ++ .../common/items/ItemRitualDiviner.java | 301 +++++ .../common/items/ItemSpellEffectBlock.java | 59 + .../items/ItemSpellEnhancementBlock.java | 99 ++ .../common/items/ItemSpellModifierBlock.java | 55 + .../common/items/ItemSpellParadigmBlock.java | 54 + .../common/items/LavaCrystal.java | 114 ++ .../common/items/LifeBucket.java | 23 + .../common/items/MagicianBloodOrb.java | 21 + .../common/items/MasterBloodOrb.java | 21 + .../common/items/OrbOfTesting.java | 47 + .../items/ReinforcedTelepositionFocus.java | 47 + .../common/items/SacrificialDagger.java | 137 +++ .../common/items/ScribeTool.java | 53 + .../common/items/TelepositionFocus.java | 124 ++ .../common/items/WaterScribeTool.java | 22 + .../common/items/forestry/ItemBloodFrame.java | 151 +++ .../common/items/potion/AlchemyFlask.java | 435 +++++++ .../common/items/potion/AlchemyReagent.java | 120 ++ .../potion/AverageLengtheningCatalyst.java | 20 + .../items/potion/AveragePowerCatalyst.java | 20 + .../items/potion/EnhancedFillingAgent.java | 57 + .../potion/GreaterLengtheningCatalyst.java | 20 + .../items/potion/GreaterPowerCatalyst.java | 20 + .../items/potion/LengtheningCatalyst.java | 64 + .../potion/MundaneLengtheningCatalyst.java | 20 + .../items/potion/MundanePowerCatalyst.java | 20 + .../common/items/potion/PowerCatalyst.java | 64 + .../items/potion/StandardBindingAgent.java | 66 + .../items/potion/StandardFillingAgent.java | 39 + .../common/items/potion/WeakBindingAgent.java | 27 + .../common/items/potion/WeakFillingAgent.java | 85 ++ .../common/items/sigil/AirSigil.java | 106 ++ .../common/items/sigil/DivinationSigil.java | 96 ++ .../items/sigil/ItemBloodLightSigil.java | 144 +++ .../common/items/sigil/LavaSigil.java | 285 +++++ .../items/sigil/SigilOfElementalAffinity.java | 172 +++ .../common/items/sigil/SigilOfGrowth.java | 302 +++++ .../common/items/sigil/SigilOfHaste.java | 198 +++ .../common/items/sigil/SigilOfHolding.java | 362 ++++++ .../common/items/sigil/SigilOfMagnetism.java | 222 ++++ .../common/items/sigil/SigilOfTheBridge.java | 312 +++++ .../items/sigil/SigilOfTheFastMiner.java | 194 +++ .../common/items/sigil/SigilOfWind.java | 196 +++ .../common/items/sigil/VoidSigil.java | 239 ++++ .../common/items/sigil/WaterSigil.java | 261 ++++ .../common/items/thaumcraft/FocusBase.java | 169 +++ .../items/thaumcraft/FocusBloodBlast.java | 191 +++ .../items/thaumcraft/FocusGravityWell.java | 263 ++++ .../items/thaumcraft/ItemSanguineArmour.java | 93 ++ .../alchemicalWizardry/common/mcmod.info | 22 + .../common/renderer/block/RenderConduit.java | 43 + .../common/renderer/block/RenderPedestal.java | 252 ++++ .../common/renderer/block/RenderPlinth.java | 256 ++++ .../block/RenderSpellEffectBlock.java | 49 + .../renderer/block/RenderWritingTable.java | 333 +++++ .../renderer/block/TEAltarRenderer.java | 241 ++++ .../block/itemRender/TEAltarItemRenderer.java | 81 ++ .../itemRender/TEConduitItemRenderer.java | 95 ++ .../TESpellEffectBlockItemRenderer.java | 108 ++ .../TEWritingTableItemRenderer.java | 82 ++ .../common/renderer/mob/RenderBileDemon.java | 27 + .../renderer/mob/RenderBoulderFist.java | 27 + .../common/renderer/mob/RenderElemental.java | 63 + .../renderer/mob/RenderFallenAngel.java | 30 + .../common/renderer/mob/RenderIceDemon.java | 27 + .../renderer/mob/RenderLowerGuardian.java | 27 + .../common/renderer/mob/RenderShade.java | 27 + .../renderer/mob/RenderSmallEarthGolem.java | 27 + .../renderer/mob/RenderWingedFireDemon.java | 27 + .../common/renderer/model/ModelBileDemon.java | 181 +++ .../renderer/model/ModelBloodAltar.java | 72 ++ .../renderer/model/ModelBoulderFist.java | 153 +++ .../common/renderer/model/ModelConduit.java | 287 +++++ .../common/renderer/model/ModelElemental.java | 81 ++ .../ModelEnergyBazookaMainProjectile.java | 122 ++ .../renderer/model/ModelFallenAngel.java | 113 ++ .../common/renderer/model/ModelIceDemon.java | 197 +++ .../renderer/model/ModelLowerGuardian.java | 207 ++++ .../common/renderer/model/ModelMeteor.java | 90 ++ .../common/renderer/model/ModelPedestal.java | 58 + .../common/renderer/model/ModelPlinth.java | 90 ++ .../common/renderer/model/ModelShade.java | 86 ++ .../renderer/model/ModelSmallEarthGolem.java | 127 ++ .../renderer/model/ModelSpellEffectBlock.java | 332 +++++ .../renderer/model/ModelWingedFireDemon.java | 203 ++++ .../renderer/model/ModelWritingTable.java | 138 +++ .../RenderEnergyBazookaMainProjectile.java | 39 + .../RenderEnergyBlastProjectile.java | 91 ++ .../projectile/RenderFireProjectile.java | 41 + .../renderer/projectile/RenderMeteor.java | 39 + .../common/rituals/RitualComponent.java | 43 + .../common/rituals/RitualEffect.java | 15 + .../rituals/RitualEffectAnimalGrowth.java | 93 ++ .../rituals/RitualEffectApiaryOverclock.java | 81 ++ .../rituals/RitualEffectBiomeChanger.java | 318 +++++ .../rituals/RitualEffectContainment.java | 102 ++ .../common/rituals/RitualEffectCrushing.java | 159 +++ .../rituals/RitualEffectFeatheredEarth.java | 90 ++ .../rituals/RitualEffectFeatheredKnife.java | 141 +++ .../common/rituals/RitualEffectFlight.java | 88 ++ .../common/rituals/RitualEffectGrowth.java | 84 ++ .../common/rituals/RitualEffectHealing.java | 126 ++ .../rituals/RitualEffectInterdiction.java | 94 ++ .../common/rituals/RitualEffectJumping.java | 99 ++ .../common/rituals/RitualEffectLava.java | 67 + .../common/rituals/RitualEffectLeap.java | 139 +++ .../common/rituals/RitualEffectMagnetic.java | 121 ++ .../common/rituals/RitualEffectSoulBound.java | 209 ++++ .../rituals/RitualEffectSummonMeteor.java | 91 ++ .../common/rituals/RitualEffectUnbinding.java | 166 +++ .../common/rituals/RitualEffectWater.java | 64 + .../rituals/RitualEffectWellOfSuffering.java | 135 +++ .../common/rituals/Rituals.java | 1079 +++++++++++++++++ .../spell/complex/EntitySpellProjectile.java | 611 ++++++++++ .../common/spell/complex/SpellModifier.java | 21 + .../spell/complex/SpellModifierDefault.java | 9 + .../spell/complex/SpellModifierDefensive.java | 9 + .../complex/SpellModifierEnvironmental.java | 9 + .../spell/complex/SpellModifierOffensive.java | 9 + .../common/spell/complex/SpellParadigm.java | 157 +++ .../spell/complex/SpellParadigmMelee.java | 70 ++ .../complex/SpellParadigmProjectile.java | 99 ++ .../spell/complex/SpellParadigmSelf.java | 58 + .../spell/complex/effect/SpellEffect.java | 221 ++++ .../complex/effect/SpellEffectEarth.java | 176 +++ .../spell/complex/effect/SpellEffectFire.java | 178 +++ .../spell/complex/effect/SpellEffectIce.java | 167 +++ .../spell/complex/effect/SpellEffectWind.java | 176 +++ .../spell/complex/effect/SpellHelper.java | 184 +++ .../ExtrapolatedMeleeEntityEffect.java | 74 ++ .../IMeleeSpellEntityEffect.java | 9 + .../impactEffects/IMeleeSpellWorldEffect.java | 10 + .../IProjectileImpactEffect.java | 11 + .../IProjectileUpdateEffect.java | 8 + .../impactEffects/ISelfSpellEffect.java | 9 + .../impactEffects/MeleeSpellWorldEffect.java | 21 + .../impactEffects/ProjectileImpactEffect.java | 15 + .../impactEffects/ProjectileUpdateEffect.java | 15 + .../effect/impactEffects/SelfSpellEffect.java | 18 + .../fire/ProjectileDefaultFire.java | 44 + .../impactEffects/fire/SelfDefaultFire.java | 22 + .../impactEffects/fire/SelfDefensiveFire.java | 24 + .../fire/SelfEnvironmentalFire.java | 56 + .../impactEffects/fire/SelfOffensiveFire.java | 21 + .../impactEffects/ice/MeleeDefaultIce.java | 27 + .../impactEffects/ice/MeleeDefensiveIce.java | 48 + .../ice/MeleeEnvironmentalIce.java | 38 + .../impactEffects/ice/MeleeOffensiveIce.java | 45 + .../ice/ProjectileDefaultIce.java | 40 + .../ice/ProjectileDefensiveIce.java | 50 + .../ice/ProjectileEnvironmentalIce.java | 39 + .../ice/ProjectileOffensiveIce.java | 32 + .../impactEffects/ice/SelfDefaultIce.java | 43 + .../impactEffects/ice/SelfDefensiveIce.java | 21 + .../ice/SelfEnvironmentalIce.java | 46 + .../impactEffects/ice/SelfOffensiveIce.java | 52 + .../complex/enhancement/SpellEnhancement.java | 20 + .../enhancement/SpellEnhancementCost.java | 10 + .../enhancement/SpellEnhancementPotency.java | 10 + .../enhancement/SpellEnhancementPower.java | 10 + .../common/spell/simple/HomSpell.java | 143 +++ .../spell/simple/HomSpellComponent.java | 26 + .../common/spell/simple/HomSpellRegistry.java | 55 + .../common/spell/simple/ISimpleSpell.java | 16 + .../common/spell/simple/SpellEarthBender.java | 199 +++ .../common/spell/simple/SpellExplosions.java | 116 ++ .../common/spell/simple/SpellFireBurst.java | 174 +++ .../common/spell/simple/SpellFrozenWater.java | 208 ++++ .../common/spell/simple/SpellHolyBlast.java | 200 +++ .../spell/simple/SpellLightningBolt.java | 141 +++ .../common/spell/simple/SpellTeleport.java | 289 +++++ .../common/spell/simple/SpellWateryGrave.java | 180 +++ .../common/spell/simple/SpellWindGust.java | 219 ++++ .../summoning/SummoningFallenAngel.java | 19 + .../common/summoning/SummoningHelper.java | 98 ++ .../common/summoning/SummoningRegistry.java | 70 ++ .../summoning/SummoningRegistryComponent.java | 231 ++++ .../summoning/meteor/MeteorParadigm.java | 86 ++ .../meteor/MeteorParadigmComponent.java | 54 + .../summoning/meteor/MeteorRegistry.java | 61 + .../common/tileEntity/TEAltar.java | 1024 ++++++++++++++++ .../common/tileEntity/TEConduit.java | 40 + .../common/tileEntity/TEHomHeart.java | 167 +++ .../common/tileEntity/TEHomHeartRenderer.java | 13 + .../tileEntity/TEImperfectRitualStone.java | 11 + .../common/tileEntity/TEMasterStone.java | 193 +++ .../common/tileEntity/TEOrientable.java | 107 ++ .../common/tileEntity/TEPedestal.java | 267 ++++ .../common/tileEntity/TEPlinth.java | 689 +++++++++++ .../common/tileEntity/TESocket.java | 254 ++++ .../common/tileEntity/TESpellBlock.java | 48 + .../common/tileEntity/TESpellEffectBlock.java | 43 + .../tileEntity/TESpellEnhancementBlock.java | 102 ++ .../tileEntity/TESpellModifierBlock.java | 30 + .../tileEntity/TESpellParadigmBlock.java | 72 ++ .../common/tileEntity/TETeleposer.java | 373 ++++++ .../common/tileEntity/TEWritingTable.java | 745 ++++++++++++ .../tileEntity/container/ContainerAltar.java | 96 ++ .../container/ContainerTeleposer.java | 106 ++ .../container/ContainerWritingTable.java | 106 ++ .../common/tileEntity/gui/GuiHandler.java | 73 ++ .../common/tileEntity/gui/GuiTeleposer.java | 47 + .../tileEntity/gui/GuiWritingTable.java | 45 + 1.7.2/java/WayofTime/mcmod.info | 22 + .../assets/alchemicalwizardry/altar.png | Bin 0 -> 59034 bytes .../assets/alchemicalwizardry/bloodaltar.obj | 262 ++++ .../assets/alchemicalwizardry/bloodlevel.obj | 64 + .../alchemicalwizardry/gui/Teleposer.png | Bin 0 -> 986 bytes .../alchemicalwizardry/gui/WritingTable.png | Bin 0 -> 1186 bytes .../alchemicalwizardry/gui/nei/alchemy.png | Bin 0 -> 1400 bytes .../models/armor/armor - Shortcut.lnk | Bin 0 -> 1926 bytes .../armor/boundArmour_invisible_layer_1.png | Bin 0 -> 3785 bytes .../armor/boundArmour_invisible_layer_2.png | Bin 0 -> 3149 bytes .../models/armor/boundArmour_layer_1.png | Bin 0 -> 3830 bytes .../models/armor/boundArmour_layer_2.png | Bin 0 -> 3178 bytes .../models/armor/sanguineArmour_layer_1.png | Bin 0 -> 7932 bytes .../models/bloodaltar-fixeUV.obj | 262 ++++ .../alchemicalwizardry/models/bloodaltar.obj | 262 ++++ .../alchemicalwizardry/models/bloodlevel.obj | 64 + .../textures/blocks/AirRitualStone.png | Bin 0 -> 706 bytes .../textures/blocks/AlchemicChemistrySet.png | Bin 0 -> 450 bytes .../textures/blocks/AltarCapacityRune.png | Bin 0 -> 761 bytes .../textures/blocks/ArcanePedestal.png | Bin 0 -> 428 bytes .../textures/blocks/ArcanePlinth.png | Bin 0 -> 497 bytes .../textures/blocks/BlankRune.png | Bin 0 -> 693 bytes .../textures/blocks/BlockBloodLight.png | Bin 0 -> 220 bytes .../textures/blocks/BloodAltar_Bottom.png | Bin 0 -> 1731 bytes .../textures/blocks/BloodAltar_SideType1.png | Bin 0 -> 1384 bytes .../textures/blocks/BloodAltar_SideType2.png | Bin 0 -> 1435 bytes .../textures/blocks/BloodAltar_Top.png | Bin 0 -> 2261 bytes .../textures/blocks/BloodSocket.png | Bin 0 -> 481 bytes .../textures/blocks/BloodStoneBrick.png | Bin 0 -> 459 bytes .../textures/blocks/DislocationRune.png | Bin 0 -> 741 bytes .../textures/blocks/DuskRitualStone.png | Bin 0 -> 762 bytes .../textures/blocks/EarthRitualStone.png | Bin 0 -> 736 bytes .../textures/blocks/EfficiencyRune.png | Bin 0 -> 738 bytes .../textures/blocks/EmptySocket.png | Bin 0 -> 271 bytes .../textures/blocks/FireRitualStone.png | Bin 0 -> 779 bytes .../textures/blocks/HomHeart_bottom.png | Bin 0 -> 680 bytes .../textures/blocks/HomHeart_side.png | Bin 0 -> 734 bytes .../textures/blocks/HomHeart_top.png | Bin 0 -> 622 bytes .../textures/blocks/HomHeart_top1.png | Bin 0 -> 197 bytes .../textures/blocks/ImperfectRitualStone.png | Bin 0 -> 617 bytes .../textures/blocks/LargeBloodStoneBrick.png | Bin 0 -> 493 bytes .../textures/blocks/MasterStone.png | Bin 0 -> 624 bytes .../textures/blocks/OrbCapacityRune.png | Bin 0 -> 733 bytes .../textures/blocks/RitualStone.png | Bin 0 -> 630 bytes .../textures/blocks/RuneOfSacrifice.png | Bin 0 -> 741 bytes .../textures/blocks/RuneOfSelfSacrifice.png | Bin 0 -> 830 bytes .../textures/blocks/SoulForge.png | Bin 0 -> 632 bytes .../textures/blocks/SpectralBlock.png | Bin 0 -> 629 bytes .../textures/blocks/SpeedRune.png | Bin 0 -> 797 bytes .../textures/blocks/Teleposer_Side.png | Bin 0 -> 719 bytes .../textures/blocks/Teleposer_Top.png | Bin 0 -> 696 bytes .../textures/blocks/Testing.png | Bin 0 -> 815 bytes .../textures/blocks/WaterRitualStone.png | Bin 0 -> 745 bytes .../textures/blocks/fireEffectBlock_blank.png | Bin 0 -> 311 bytes .../textures/blocks/fireEffectBlock_input.png | Bin 0 -> 342 bytes .../blocks/fireEffectBlock_output.png | Bin 0 -> 314 bytes .../blocks/fireEffectBlock_upArrow.png | Bin 0 -> 329 bytes .../textures/blocks/lifeEssenceFlowing.png | Bin 0 -> 576 bytes .../textures/blocks/lifeEssenceStill.png | Bin 0 -> 507 bytes .../entities/energyBlastProjectile.png | Bin 0 -> 302 bytes .../textures/entities/explosionProjectile.png | Bin 0 -> 383 bytes .../textures/entities/fireProjectile.png | Bin 0 -> 268 bytes .../textures/entities/holyProjectile.png | Bin 0 -> 271 bytes .../textures/entities/iceProjectile.png | Bin 0 -> 327 bytes .../textures/entities/lightningProjectile.png | Bin 0 -> 241 bytes .../textures/entities/mudProjectile.png | Bin 0 -> 345 bytes .../textures/entities/waterProjectile.png | Bin 0 -> 384 bytes .../textures/entities/windGustProjectile.png | Bin 0 -> 3540 bytes .../textures/gui/GuiTrap.png | Bin 0 -> 3677 bytes .../textures/items/8wWtY8d.png | Bin 0 -> 319 bytes .../textures/items/Aether.png | Bin 0 -> 3540 bytes .../textures/items/AirScribeTool.png | Bin 0 -> 1167 bytes .../textures/items/AirSigil.png | Bin 0 -> 500 bytes .../textures/items/AlchemyFlask.png | Bin 0 -> 361 bytes .../textures/items/ApprenticeBloodOrb.png | Bin 0 -> 831 bytes .../textures/items/Aquasalus.png | Bin 0 -> 471 bytes .../textures/items/ArchmageBloodOrb.png | Bin 0 -> 590 bytes .../items/ArmourInhibitor_activated.png | Bin 0 -> 544 bytes .../items/ArmourInhibitor_deactivated.png | Bin 0 -> 556 bytes .../items/AverageLengtheningCatalyst.png | Bin 0 -> 405 bytes .../textures/items/AveragePowerCatalyst.png | Bin 0 -> 387 bytes .../textures/items/BlankSlate.png | Bin 0 -> 554 bytes .../textures/items/BlankSpell.png | Bin 0 -> 339 bytes .../textures/items/BloodFrame.png | Bin 0 -> 363 bytes .../textures/items/BloodLightSigil.png | Bin 0 -> 536 bytes .../textures/items/BoundAxe_activated.png | Bin 0 -> 397 bytes .../textures/items/BoundBoots.png | Bin 0 -> 255 bytes .../textures/items/BoundHelmet.png | Bin 0 -> 253 bytes .../textures/items/BoundLeggings.png | Bin 0 -> 231 bytes .../textures/items/BoundPickaxe_activated.png | Bin 0 -> 394 bytes .../items/BoundPickaxe_deactivated.png | Bin 0 -> 457 bytes .../textures/items/BoundPlate.png | Bin 0 -> 282 bytes .../textures/items/BoundShovel_activated.png | Bin 0 -> 390 bytes .../textures/items/BoundSword_activated.png | Bin 0 -> 386 bytes .../textures/items/BridgeSigil_activated.png | Bin 0 -> 632 bytes .../items/BridgeSigil_deactivated.png | Bin 0 -> 534 bytes .../textures/items/CeremonialDagger.png | Bin 0 -> 321 bytes .../textures/items/Crepitous.png | Bin 0 -> 408 bytes .../textures/items/Crystallos.png | Bin 0 -> 391 bytes .../textures/items/DaggerOfSacrifice.png | Bin 0 -> 476 bytes .../textures/items/DemonBloodShard.png | Bin 0 -> 457 bytes .../textures/items/DemonPlacer.png | Bin 0 -> 399 bytes .../textures/items/DemonSlate.png | Bin 0 -> 571 bytes .../textures/items/DemonicTeleposerFocus.png | Bin 0 -> 603 bytes .../textures/items/DiabloKey.png | Bin 0 -> 328 bytes .../textures/items/DivinationSigil.png | Bin 0 -> 625 bytes .../textures/items/DuskScribeTool.png | Bin 0 -> 659 bytes .../textures/items/EarthScribeTool.png | Bin 0 -> 1078 bytes .../textures/items/ElementalInkAir.png | Bin 0 -> 439 bytes .../textures/items/ElementalInkEarth.png | Bin 0 -> 442 bytes .../textures/items/ElementalInkFire.png | Bin 0 -> 430 bytes .../textures/items/ElementalInkWater.png | Bin 0 -> 429 bytes .../items/ElementalSigil_activated.png | Bin 0 -> 659 bytes .../items/ElementalSigil_deactivated.png | Bin 0 -> 598 bytes .../textures/items/EnergyBattery.png | Bin 0 -> 845 bytes .../items/EnergyBazooka_activated.png | Bin 0 -> 696 bytes .../items/EnergyBlaster_activated.png | Bin 0 -> 525 bytes .../textures/items/EnhancedFillingAgent.png | Bin 0 -> 606 bytes .../textures/items/EnhancedTeleposerFocus.png | Bin 0 -> 498 bytes .../textures/items/FireScribeTool.png | Bin 0 -> 1050 bytes .../items/GreaterLengtheningCatalyst.png | Bin 0 -> 491 bytes .../textures/items/GreaterPowerCatalyst.png | Bin 0 -> 432 bytes .../textures/items/GrowthSigil_activated.png | Bin 0 -> 546 bytes .../items/GrowthSigil_deactivated.png | Bin 0 -> 531 bytes .../textures/items/HasteSigil_activated.png | Bin 0 -> 546 bytes .../textures/items/HasteSigil_deactivated.png | Bin 0 -> 562 bytes .../textures/items/IceSigil_activated.png | Bin 0 -> 557 bytes .../textures/items/IceSigil_deactivated.png | Bin 0 -> 562 bytes .../textures/items/Incendium.png | Bin 0 -> 352 bytes .../textures/items/InfusedSlate.png | Bin 0 -> 605 bytes .../textures/items/LavaCrystal.png | Bin 0 -> 585 bytes .../textures/items/LavaSigil.png | Bin 0 -> 573 bytes .../textures/items/LifeBucket.png | Bin 0 -> 659 bytes .../textures/items/Magicales.png | Bin 0 -> 408 bytes .../textures/items/MagicianBloodOrb.png | Bin 0 -> 727 bytes .../textures/items/MasterBloodOrb.png | Bin 0 -> 699 bytes .../textures/items/MiningSigil_activated.png | Bin 0 -> 670 bytes .../items/MiningSigil_deactivated.png | Bin 0 -> 649 bytes .../items/MundaneLengtheningCatalyst.png | Bin 0 -> 211 bytes .../textures/items/MundanePowerCatalyst.png | Bin 0 -> 206 bytes .../textures/items/PotionFlask.png | Bin 0 -> 325 bytes .../textures/items/ReinforcedSlate.png | Bin 0 -> 709 bytes .../items/ReinforcedTeleposerFocus.png | Bin 0 -> 552 bytes .../textures/items/RitualDiviner.png | Bin 0 -> 382 bytes .../textures/items/SacrificialDagger.png | Bin 0 -> 50724 bytes .../textures/items/Sanctus.png | Bin 0 -> 491 bytes .../textures/items/SanguineHelmet.png | Bin 0 -> 292 bytes .../textures/items/SheathedItem.png | Bin 0 -> 457 bytes .../textures/items/SigilOfHolding.png | Bin 0 -> 697 bytes .../items/SigilOfMagnetism_activated.png | Bin 0 -> 578 bytes .../items/SigilOfMagnetism_deactivated.png | Bin 0 -> 594 bytes .../textures/items/SimpleCatalyst.png | Bin 0 -> 420 bytes .../textures/items/StandardBindingAgent.png | Bin 0 -> 654 bytes .../textures/items/StandardFillingAgent.png | Bin 0 -> 610 bytes .../textures/items/TeleposerFocus.png | Bin 0 -> 530 bytes .../textures/items/Tennebrae.png | Bin 0 -> 397 bytes .../textures/items/Terrae.png | Bin 0 -> 460 bytes .../textures/items/UntamedCrystal.png | Bin 0 -> 239 bytes .../textures/items/VoidSigil.png | Bin 0 -> 679 bytes .../textures/items/WarriorSigil_activated.png | Bin 0 -> 682 bytes .../items/WarriorSigil_deactivated.png | Bin 0 -> 616 bytes .../textures/items/WaterScribeTool.png | Bin 0 -> 1086 bytes .../textures/items/WaterSigil.png | Bin 0 -> 590 bytes .../textures/items/WeakBindingAgent.png | Bin 0 -> 402 bytes .../textures/items/WeakBloodShard.png | Bin 0 -> 473 bytes .../textures/items/WeakFillingAgent.png | Bin 0 -> 582 bytes .../textures/items/WindSigil_activated.png | Bin 0 -> 624 bytes .../textures/items/WindSigil_deactivated.png | Bin 0 -> 503 bytes .../items/activationCrystalAwakened.png | Bin 0 -> 689 bytes .../textures/items/activationCrystalWeak.png | Bin 0 -> 765 bytes .../textures/items/bloodBlastOrn.png | Bin 0 -> 178 bytes .../textures/items/focusBloodBlastOrn.png | Bin 0 -> 178 bytes .../textures/items/tYf5ft9.png | Bin 0 -> 291 bytes .../textures/models/AirFloatingBeacon.png | Bin 0 -> 480 bytes .../textures/models/BileDemon.png | Bin 0 -> 7737 bytes .../textures/models/Bird.png | Bin 0 -> 3007 bytes .../textures/models/BlockSpellEffect.png | Bin 0 -> 985 bytes .../textures/models/BoulderFist.png | Bin 0 -> 4025 bytes .../textures/models/Conduit.png | Bin 0 -> 1867 bytes .../textures/models/DarkFloatingBeacon.png | Bin 0 -> 488 bytes .../textures/models/EarthFloatingBeacon.png | Bin 0 -> 554 bytes .../models/EnergyBazookaMainProjectile.png | Bin 0 -> 1948 bytes .../textures/models/FireFloatingBeacon.png | Bin 0 -> 805 bytes .../textures/models/FloatingBeacon.png | Bin 0 -> 805 bytes .../textures/models/HolyFloatingBeacon.png | Bin 0 -> 553 bytes .../textures/models/IceDemon.png | Bin 0 -> 3537 bytes .../textures/models/LowerGuardian.png | Bin 0 -> 4228 bytes .../textures/models/Meteor.png | Bin 0 -> 950 bytes .../textures/models/Pedestal.png | Bin 0 -> 1219 bytes .../textures/models/Plinth.png | Bin 0 -> 2404 bytes .../textures/models/ShadeMob.png | Bin 0 -> 2495 bytes .../textures/models/SmallEarthGolem.png | Bin 0 -> 765 bytes .../textures/models/SpellEffectEarth.png | Bin 0 -> 1833 bytes .../textures/models/SpellEffectFire.png | Bin 0 -> 1721 bytes .../textures/models/SpellEffectIce.png | Bin 0 -> 1481 bytes .../textures/models/SpellEffectWind.png | Bin 0 -> 1679 bytes .../textures/models/WaterFloatingBeacon.png | Bin 0 -> 543 bytes .../textures/models/WingedAngel.png | Bin 0 -> 3549 bytes .../textures/models/WingedFireDemon.png | Bin 0 -> 5121 bytes .../textures/models/WritingTable.png | Bin 0 -> 1851 bytes .../textures/models/altar.png | Bin 0 -> 59034 bytes .../textures/models/blood.png | Bin 0 -> 576 bytes 1.7.2/resources/assets/forge/lang/en_US.lang | 5 + 1.7.2/resources/assets/forge/lang/es_ES.lang | 5 + 1.7.2/resources/assets/forge/lang/fr_FR.lang | 5 + 1.7.2/resources/mcmod.info | 16 + .../complex/effect/SpellEffectEarth.java | 3 +- .../spell/complex/effect/SpellEffectWind.java | 3 +- .../earth/ProjectileEnvironmentalEarth.java | 66 + .../wind/ProjectileEnvironmentalWind.java | 52 + .../textures/models/SpellEffectEarth.png | Bin 0 -> 1833 bytes .../textures/models/SpellEffectFire.png | Bin 1718 -> 1721 bytes .../textures/models/SpellEffectIce.png | Bin 953 -> 1481 bytes .../textures/models/SpellEffectWind.png | Bin 1210 -> 1679 bytes 548 files changed, 46982 insertions(+), 2 deletions(-) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourUpgrade.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/IBindable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/ICatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/IDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssence.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssenceNetwork.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PacketHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemicalPotionCreationHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHelper.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipeRegistry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/mcmod.info create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IMeleeSpellEntityEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IMeleeSpellWorldEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileUpdateEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ISelfSpellEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellWorldEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/SelfSpellEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefaultFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeOffensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefaultIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfEnvironmentalIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelper.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistryComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellModifierBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java create mode 100644 1.7.2/java/WayofTime/mcmod.info create mode 100644 1.7.2/resources/assets/alchemicalwizardry/altar.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/bloodaltar.obj create mode 100644 1.7.2/resources/assets/alchemicalwizardry/bloodlevel.obj create mode 100644 1.7.2/resources/assets/alchemicalwizardry/gui/Teleposer.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/gui/WritingTable.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/gui/nei/alchemy.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/armor - Shortcut.lnk create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/armor/sanguineArmour_layer_1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/bloodaltar-fixeUV.obj create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/bloodaltar.obj create mode 100644 1.7.2/resources/assets/alchemicalwizardry/models/bloodlevel.obj create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/AirRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/AlchemicChemistrySet.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/AltarCapacityRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/ArcanePedestal.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/ArcanePlinth.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BlankRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Bottom.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_SideType1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_SideType2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Top.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodSocket.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodStoneBrick.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DislocationRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DuskRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/EarthRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/EfficiencyRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/EmptySocket.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/FireRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_bottom.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_side.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/ImperfectRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/LargeBloodStoneBrick.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/MasterStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/OrbCapacityRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSacrifice.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSelfSacrifice.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/SoulForge.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/SpectralBlock.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/SpeedRune.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Side.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Top.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Testing.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/WaterRitualStone.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_input.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_upArrow.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceFlowing.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceStill.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/energyBlastProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/explosionProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/fireProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/holyProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/lightningProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/mudProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/waterProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/entities/windGustProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/gui/GuiTrap.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/8wWtY8d.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Aether.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/AirScribeTool.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/AirSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/AlchemyFlask.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ApprenticeBloodOrb.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Aquasalus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ArchmageBloodOrb.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ArmourInhibitor_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ArmourInhibitor_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/AverageLengtheningCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/AveragePowerCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BlankSlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BlankSpell.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BloodFrame.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BloodLightSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundAxe_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundBoots.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundHelmet.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundLeggings.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundShovel_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundSword_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/CeremonialDagger.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Crepitous.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Crystallos.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DaggerOfSacrifice.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonBloodShard.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonPlacer.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonSlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonicTeleposerFocus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DiabloKey.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DivinationSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/DuskScribeTool.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EarthScribeTool.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkAir.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkEarth.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkFire.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkWater.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBattery.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBazooka_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBlaster_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedFillingAgent.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedTeleposerFocus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/FireScribeTool.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/GreaterLengtheningCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/GreaterPowerCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/GrowthSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/GrowthSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/HasteSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/HasteSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/IceSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/IceSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Incendium.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/InfusedSlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/LavaCrystal.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/LavaSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/LifeBucket.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Magicales.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MagicianBloodOrb.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MasterBloodOrb.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MundaneLengtheningCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/MundanePowerCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/PotionFlask.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ReinforcedSlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/ReinforcedTeleposerFocus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/RitualDiviner.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SacrificialDagger.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Sanctus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SanguineHelmet.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SigilOfHolding.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SigilOfMagnetism_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SigilOfMagnetism_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/SimpleCatalyst.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/StandardBindingAgent.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/StandardFillingAgent.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/TeleposerFocus.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Tennebrae.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/Terrae.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/UntamedCrystal.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/VoidSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WarriorSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WarriorSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WaterScribeTool.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WaterSigil.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBindingAgent.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBloodShard.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakFillingAgent.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_activated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_deactivated.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalAwakened.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalWeak.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/bloodBlastOrn.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/focusBloodBlastOrn.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/tYf5ft9.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/AirFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/BileDemon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/Bird.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/BoulderFist.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/Conduit.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/DarkFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/EarthFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/FireFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/FloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/HolyFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/IceDemon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/LowerGuardian.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/Meteor.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/Pedestal.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/Plinth.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/ShadeMob.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SmallEarthGolem.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/WaterFloatingBeacon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedAngel.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedFireDemon.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/WritingTable.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/altar.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/blood.png create mode 100644 1.7.2/resources/assets/forge/lang/en_US.lang create mode 100644 1.7.2/resources/assets/forge/lang/es_ES.lang create mode 100644 1.7.2/resources/assets/forge/lang/fr_FR.lang create mode 100644 1.7.2/resources/mcmod.info create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java new file mode 100644 index 00000000..6adbc972 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -0,0 +1,804 @@ +package WayofTime.alchemicalWizardry; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import net.minecraft.block.Block; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.item.ItemArmor.ArmorMaterial; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraftforge.common.ChestGenHooks; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks; +import WayofTime.alchemicalWizardry.common.AlchemicalWizardryFuelHandler; +import WayofTime.alchemicalWizardry.common.AlchemicalWizardryTickHandler; +import WayofTime.alchemicalWizardry.common.CommonProxy; +import WayofTime.alchemicalWizardry.common.EntityAirElemental; +import WayofTime.alchemicalWizardry.common.LifeBucketHandler; +import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.PotionBoost; +import WayofTime.alchemicalWizardry.common.PotionDrowning; +import WayofTime.alchemicalWizardry.common.PotionFlameCloak; +import WayofTime.alchemicalWizardry.common.PotionFlight; +import WayofTime.alchemicalWizardry.common.PotionIceCloak; +import WayofTime.alchemicalWizardry.common.PotionInhibit; +import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; +import WayofTime.alchemicalWizardry.common.PotionReciprocation; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemicalPotionCreationHandler; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegistry; +import WayofTime.alchemicalWizardry.common.block.ArmourForge; +import WayofTime.alchemicalWizardry.common.block.LifeEssenceBlock; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityEarthElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFireElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityHolyElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade; +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.items.ItemBloodRuneBlock; +import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.items.LifeBucket; +import WayofTime.alchemicalWizardry.common.items.forestry.ItemBloodFrame; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; +import WayofTime.alchemicalWizardry.common.rituals.Rituals; +import WayofTime.alchemicalWizardry.common.spell.simple.HomSpellRegistry; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellEarthBender; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellExplosions; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellFireBurst; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellFrozenWater; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellHolyBlast; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellLightningBolt; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellTeleport; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellWateryGrave; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellWindGust; +import WayofTime.alchemicalWizardry.common.summoning.SummoningHelper; +import WayofTime.alchemicalWizardry.common.summoning.SummoningRegistry; +import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorRegistry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import WayofTime.alchemicalWizardry.common.tileEntity.gui.GuiHandler; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.LanguageRegistry; +import cpw.mods.fml.relauncher.Side; + +@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.8.0") +//@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {"BloodAltar", "particle", "SetLifeEssence", "GetLifeEssence", "Ritual", "GetAltarEssence", "TESocket", "TEWritingTable", "CustomParticle", "SetPlayerVel", "SetPlayerPos", "TEPedestal", "TEPlinth", "TETeleposer", "InfiniteLPPath", "TEOrientor"}, packetHandler = PacketHandler.class) + +public class AlchemicalWizardry +{ + public static boolean doMeteorsDestroyBlocks = true; + public static String[] diamondMeteorArray; + public static int diamondMeteorRadius; + public static String[] stoneMeteorArray; + public static int stoneMeteorRadius; + public static String[] ironBlockMeteorArray; + public static int ironBlockMeteorRadius; + public static String[] netherStarMeteorArray; + public static int netherStarMeteorRadius; + + public static Potion customPotionDrowning; + public static Potion customPotionBoost; + public static Potion customPotionProjProt; + public static Potion customPotionInhibit; + public static Potion customPotionFlight; + public static Potion customPotionReciprocation; + public static Potion customPotionFlameCloak; + public static Potion customPotionIceCloak; + + public static int customPotionDrowningID; + public static int customPotionBoostID; + public static int customPotionProjProtID; + public static int customPotionInhibitID; + public static int customPotionFlightID; + public static int customPotionReciprocationID; + public static int customPotionFlameCloakID; + public static int customPotionIceCloakID; + + public static boolean isThaumcraftLoaded; + public static boolean isForestryLoaded; + + public static CreativeTabs tabBloodMagic = new CreativeTabs("tabBloodMagic") + { + @Override + public ItemStack getIconItemStack() + { + return new ItemStack(ModItems.weakBloodOrb, 1, 0); + } + + @Override + public Item getTabIconItem() + { + return ModItems.weakBloodOrb; + } + }; + + public static ToolMaterial bloodBoundToolMaterial = EnumHelper.addToolMaterial("BoundBlood", 4, 1000, 12.0f, 8.0f, 50); + public static ArmorMaterial sanguineArmourArmourMaterial = EnumHelper.addArmorMaterial("SanguineArmour", 1000, new int[]{3, 6, 5, 2}, 30); + + //Dungeon loot chances + public static int standardBindingAgentDungeonChance; + public static int mundanePowerCatalystDungeonChance; + public static int averagePowerCatalystDungeonChance; + public static int greaterPowerCatalystDungeonChance; + public static int mundaneLengtheningCatalystDungeonChance; + public static int averageLengtheningCatalystDungeonChance; + public static int greaterLengtheningCatalystDungeonChance; + + //Mob IDs + public static int entityFallenAngelID = 20; + public static int entityLowerGuardianID = 21; + public static int entityBileDemonID = 22; + public static int entityWingedFireDemonID = 23; + public static int entitySmallEarthGolemID = 24; + public static int entityIceDemonID = 25; + public static int entityBoulderFistID = 26; + public static int entityShadeID = 27; + public static int entityAirElementalID = 28; + public static int entityWaterElementalID = 29; + public static int entityEarthElementalID = 30; + public static int entityFireElementalID = 31; + public static int entityShadeElementalID = 32; + public static int entityHolyElementalID = 33; + + + public static Fluid lifeEssenceFluid; + + // The instance of your mod that Forge uses. + @Instance("AWWayofTime") + public static AlchemicalWizardry instance; + + // Says where the client and server 'proxy' code is loaded. + @SidedProxy(clientSide = "WayofTime.alchemicalWizardry.client.ClientProxy", serverSide = "WayofTime.alchemicalWizardry.common.CommonProxy") + public static CommonProxy proxy; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) + { + MinecraftForge.EVENT_BUS.register(new LifeBucketHandler()); + BloodMagicConfiguration.init(new File(event.getModConfigurationDirectory(), "AWWayofTime.cfg")); + + //Custom config stuff goes here + + + Potion[] potionTypes = null; + + for (Field f : Potion.class.getDeclaredFields()) + { + f.setAccessible(true); + + try + { + if (f.getName().equals("potionTypes") || f.getName().equals("field_76425_a")) + { + Field modfield = Field.class.getDeclaredField("modifiers"); + modfield.setAccessible(true); + modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL); + potionTypes = (Potion[]) f.get(null); + final Potion[] newPotionTypes = new Potion[256]; + System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length); + f.set(null, newPotionTypes); + } + } catch (Exception e) + { + System.err.println("Severe error, please report this to the mod author:"); + System.err.println(e); + } + } + ModBlocks.init(); + ModItems.init(); + + ModItems.registerItems(); + + FMLCommonHandler.instance().bus().register(new AlchemicalWizardryEventHooks()); + NewPacketHandler.INSTANCE.ordinal(); + } + + @EventHandler + public void load(FMLInitializationEvent event) + { + int craftingConstant = OreDictionary.WILDCARD_VALUE; + //TickRegistry.registerTickHandler(new AlchemicalWizardryTickHandler(), Side.SERVER); + + ModBlocks.registerBlocks(); + + //blocks + + + proxy.registerRenderers(); + proxy.registerEntities(); + //ItemStacks used for crafting go here + ItemStack lavaBucketStack = new ItemStack(Items.lava_bucket); + ItemStack cobblestoneStack = new ItemStack(Blocks.cobblestone); + ItemStack glassStack = new ItemStack(Blocks.glass, 1, craftingConstant); + ItemStack ironStack = new ItemStack(Items.iron_ingot); + ItemStack diamondStack = new ItemStack(Items.diamond, 1, craftingConstant); + ItemStack woolStack = new ItemStack(Blocks.wool); + ItemStack goldNuggetStack = new ItemStack(Items.gold_nugget); + ItemStack stoneStack = new ItemStack(Blocks.stone, 1, craftingConstant); + ItemStack redstoneStack = new ItemStack(Items.redstone); + ItemStack glowstoneBlockStack = new ItemStack(Blocks.glowstone); + ItemStack ironBlockStack = new ItemStack(Blocks.iron_block); + ItemStack waterBucketStack = new ItemStack(Items.water_bucket); + ItemStack emptyBucketStack = new ItemStack(Items.bucket); + ItemStack magmaCreamStack = new ItemStack(Items.magma_cream); + ItemStack stringStack = new ItemStack(Items.string); + ItemStack obsidianStack = new ItemStack(Blocks.obsidian); + ItemStack diamondSwordStack = new ItemStack(Items.diamond_sword); + ItemStack goldIngotStack = new ItemStack(Items.gold_ingot); + ItemStack cauldronStack = new ItemStack(Blocks.cauldron); + ItemStack furnaceStack = new ItemStack(Blocks.furnace); + ItemStack sugarStack = new ItemStack(Items.sugar); + ItemStack featherStack = new ItemStack(Items.feather); + ItemStack ghastTearStack = new ItemStack(Items.ghast_tear); + ItemStack ironPickaxeStack = new ItemStack(Items.iron_pickaxe); + ItemStack ironAxeStack = new ItemStack(Items.iron_axe); + ItemStack ironShovelStack = new ItemStack(Items.iron_shovel); + ItemStack glowstoneDustStack = new ItemStack(Items.glowstone_dust); + ItemStack saplingStack = new ItemStack(Blocks.sapling); + ItemStack reedStack = new ItemStack(Items.reeds); + ItemStack blankSlateStack = new ItemStack(ModItems.blankSlate, 1, craftingConstant); + //ItemStack glassShardStack = new ItemStack(glassShard); + ItemStack weakBloodOrbStackCrafted = new ItemStack(ModItems.weakBloodOrb); + //ItemStack bloodiedShardStack = new ItemStack(bloodiedShard); + ItemStack reinforcedSlateStack = new ItemStack(ModItems.reinforcedSlate, 1, craftingConstant); + ItemStack weakBloodOrbStack = new ItemStack(ModItems.weakBloodOrb, 1, craftingConstant); + ItemStack imbuedSlateStack = new ItemStack(ModItems.imbuedSlate, 1, craftingConstant); + ItemStack demonSlateStack = new ItemStack(ModItems.demonicSlate, 1, craftingConstant); + ItemStack apprenticeBloodOrbStack = new ItemStack(ModItems.apprenticeBloodOrb, 1, craftingConstant); + ItemStack magicianBloodOrbStack = new ItemStack(ModItems.magicianBloodOrb, 1, craftingConstant); + ItemStack waterSigilStackCrafted = new ItemStack(ModItems.waterSigil); + ItemStack lavaSigilStackCrafted = new ItemStack(ModItems.lavaSigil); + ItemStack voidSigilStackCrafted = new ItemStack(ModItems.voidSigil); + ItemStack airSigilStack = new ItemStack(ModItems.airSigil); + ItemStack lavaCrystalStackCrafted = new ItemStack(ModItems.lavaCrystal); + ItemStack lavaCrystalStack = new ItemStack(ModItems.lavaCrystal); + ItemStack energySwordStack = new ItemStack(ModItems.energySword); + ItemStack energyBlasterStack = new ItemStack(ModItems.energyBlaster); + ItemStack sacrificialDaggerStack = new ItemStack(ModItems.sacrificialDagger); + ItemStack bloodAltarStack = new ItemStack(ModBlocks.blockAltar); + ItemStack bloodRuneCraftedStack = new ItemStack(ModBlocks.bloodRune, 1); + ItemStack bloodRuneStack = new ItemStack(ModBlocks.bloodRune); + ItemStack speedRuneStack = new ItemStack(ModBlocks.speedRune); + ItemStack efficiencyRuneStack = new ItemStack(ModBlocks.efficiencyRune); + ItemStack runeOfSacrificeStack = new ItemStack(ModBlocks.runeOfSacrifice); + ItemStack runeOfSelfSacrificeStack = new ItemStack(ModBlocks.runeOfSelfSacrifice); + ItemStack miningSigilStackCrafted = new ItemStack(ModItems.sigilOfTheFastMiner); + ItemStack divinationSigilStackCrafted = new ItemStack(ModItems.divinationSigil); +// ItemStack elementalInkWaterStack = new ItemStack(elementalInkWater); +// ItemStack elementalInkFireStack = new ItemStack(elementalInkFire); +// ItemStack elementalInkEarthStack = new ItemStack(elementalInkEarth); +// ItemStack elementalInkAirStack = new ItemStack(elementalInkAir); + ItemStack waterScribeToolStack = new ItemStack(ModItems.waterScribeTool); + ItemStack fireScribeToolStack = new ItemStack(ModItems.fireScribeTool); + ItemStack earthScribeToolStack = new ItemStack(ModItems.earthScribeTool); + ItemStack airScribeToolStack = new ItemStack(ModItems.airScribeTool); + ItemStack ritualStoneStackCrafted = new ItemStack(ModBlocks.ritualStone, 4); + ItemStack ritualStoneStack = new ItemStack(ModBlocks.ritualStone); + ItemStack masterRitualStoneStack = new ItemStack(ModBlocks.blockMasterStone); + ItemStack imperfectRitualStoneStack = new ItemStack(ModBlocks.imperfectRitualStone); + ItemStack sigilOfElementalAffinityStackCrafted = new ItemStack(ModItems.sigilOfElementalAffinity); + ItemStack lavaSigilStack = new ItemStack(ModItems.lavaSigil); + ItemStack waterSigilStack = new ItemStack(ModItems.waterSigil); + ItemStack sigilOfHoldingStack = new ItemStack(ModItems.sigilOfHolding); + ItemStack weakBloodShardStack = new ItemStack(ModItems.weakBloodShard); + ItemStack emptySocketStack = new ItemStack(ModBlocks.emptySocket); + ItemStack bloodSocketStack = new ItemStack(ModBlocks.bloodSocket); + ItemStack armourForgeStack = new ItemStack(ModBlocks.armourForge); + ItemStack largeBloodStoneBrickStackCrafted = new ItemStack(ModBlocks.largeBloodStoneBrick, 32); + ItemStack largeBloodStoneBrickStack = new ItemStack(ModBlocks.largeBloodStoneBrick); + ItemStack bloodStoneBrickStackCrafted = new ItemStack(ModBlocks.bloodStoneBrick, 4); + ItemStack growthSigilStack = new ItemStack(ModItems.growthSigil); + ItemStack blockHomHeartStack = new ItemStack(ModBlocks.blockHomHeart); + ItemStack redWoolStack = new ItemStack(Blocks.wool, 1, 14); + ItemStack zombieHead = new ItemStack(Items.skull, 1, 2); + ItemStack simpleCatalystStack = new ItemStack(ModItems.simpleCatalyst); + ItemStack duskRitualDivinerStack = new ItemStack(ModItems.itemRitualDiviner); + ((ItemRitualDiviner) duskRitualDivinerStack.getItem()).setMaxRuneDisplacement(duskRitualDivinerStack, 1); + //weakBloodOrbStackCrafted.setItemDamage(weakBloodOrbStackCrafted.getMaxDamage()); + waterSigilStackCrafted.setItemDamage(waterSigilStackCrafted.getMaxDamage()); + lavaSigilStackCrafted.setItemDamage(lavaSigilStackCrafted.getMaxDamage()); + voidSigilStackCrafted.setItemDamage(voidSigilStackCrafted.getMaxDamage()); + lavaCrystalStackCrafted.setItemDamage(lavaCrystalStackCrafted.getMaxDamage()); + miningSigilStackCrafted.setItemDamage(miningSigilStackCrafted.getMaxDamage()); + sigilOfElementalAffinityStackCrafted.setItemDamage(sigilOfElementalAffinityStackCrafted.getMaxDamage()); + ItemStack archmageBloodOrbStack = new ItemStack(ModItems.archmageBloodOrb); + ItemStack sanctusStack = new ItemStack(ModItems.sanctus); + ItemStack aetherStack = new ItemStack(ModItems.aether); + ItemStack terraeStack = new ItemStack(ModItems.terrae); + ItemStack incendiumStack = new ItemStack(ModItems.incendium); + ItemStack tennebraeStack = new ItemStack(ModItems.tennebrae); + ItemStack aquasalusStack = new ItemStack(ModItems.aquasalus); + ItemStack crystallosStack = new ItemStack(ModItems.crystallos); + ItemStack crepitousStack = new ItemStack(ModItems.crepitous); + ItemStack magicalesStack = new ItemStack(ModItems.magicales); + //All crafting goes here + // GameRegistry.addRecipe(orbOfTestingStack, "x x", " ", "x x", 'x', cobblestoneStack); + //GameRegistry.addRecipe(glassShardStack, " x", "y ", 'x', ironStack, 'y', glassStack); + //GameRegistry.addRecipe(weakBloodOrbStackCrafted, "xxx", "xdx", "www", 'x', bloodiedShardStack, 'd', diamondStack, 'w', woolStack); + GameRegistry.addRecipe(sacrificialDaggerStack, "ggg", " dg", "i g", 'g', glassStack, 'd', goldIngotStack, 'i', ironStack); + //GameRegistry.addRecipe(blankSlateStack, "sgs", "gig", "sgs", 's', stoneStack, 'g', goldNuggetStack, 'i', ironStack); + //GameRegistry.addRecipe(reinforcedSlateStack, "rir", "ibi", "gig", 'r', redstoneStack, 'i', ironStack, 'b', blankSlateStack, 'g', glowstoneBlockStack); + GameRegistry.addRecipe(lavaCrystalStackCrafted, "glg", "lbl", "odo", 'g', glassStack, 'l', lavaBucketStack, 'b', weakBloodOrbStack, 'd', diamondStack, 'o', obsidianStack); + GameRegistry.addRecipe(waterSigilStackCrafted, "www", "wbw", "wow", 'w', waterBucketStack, 'b', blankSlateStack, 'o', weakBloodOrbStack); + GameRegistry.addRecipe(lavaSigilStackCrafted, "lml", "lbl", "lcl", 'l', lavaBucketStack, 'b', blankSlateStack, 'm', magmaCreamStack, 'c', lavaCrystalStack); + GameRegistry.addRecipe(voidSigilStackCrafted, "ese", "ere", "eoe", 'e', emptyBucketStack, 'r', reinforcedSlateStack, 'o', apprenticeBloodOrbStack, 's', stringStack); + GameRegistry.addRecipe(bloodAltarStack, "s s", "scs", "gdg", 's', stoneStack, 'c', furnaceStack, 'd', diamondStack, 'g', goldIngotStack); + //GameRegistry.addRecipe(energySwordStack, " o ", " o ", " s ", 'o', weakBloodOrbStack, 's', diamondSwordStack); + //GameRegistry.addRecipe(energyBlasterStack, "oi ", "gdi", " rd", 'o', weakBloodOrbStack, 'i', ironStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); + GameRegistry.addRecipe(bloodRuneCraftedStack, "sss", "ror", "sss", 's', stoneStack, 'o', weakBloodOrbStack, 'r', blankSlateStack); + GameRegistry.addRecipe(speedRuneStack, "sbs", "uru", "sbs", 'u', sugarStack, 's', stoneStack, 'r', bloodRuneStack, 'b', blankSlateStack); + //GameRegistry.addRecipe(efficiencyRuneStack, "sbs", "rur", "sbs", 'r', redstoneStack, 's', stoneStack, 'u', bloodRuneStack,'b',blankSlateStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.bloodRune, 1, 1), "sbs", "bob", "srs", 's', stoneStack, 'o', magicianBloodOrbStack, 'b', emptyBucketStack, 'r', new ItemStack(ModItems.imbuedSlate)); + GameRegistry.addRecipe(new ItemStack(ModBlocks.bloodRune, 1, 2), "sbs", "bob", "srs", 's', stoneStack, 'o', magicianBloodOrbStack, 'b', waterBucketStack, 'r', new ItemStack(ModItems.imbuedSlate)); + GameRegistry.addRecipe(new ItemStack(ModBlocks.bloodRune, 1, 3), "sws", "ror", "sws", 's', stoneStack, 'o', new ItemStack(ModItems.masterBloodOrb), 'w', weakBloodOrbStack, 'r', new ItemStack(ModItems.demonicSlate)); + GameRegistry.addRecipe(airSigilStack, "fgf", "fsf", "fof", 'f', featherStack, 'g', ghastTearStack, 's', reinforcedSlateStack, 'o', apprenticeBloodOrbStack); + GameRegistry.addRecipe(miningSigilStackCrafted, "sps", "hra", "sos", 'o', apprenticeBloodOrbStack, 's', stoneStack, 'p', ironPickaxeStack, 'h', ironShovelStack, 'a', ironAxeStack, 'r', reinforcedSlateStack); + GameRegistry.addRecipe(runeOfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', goldIngotStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack); + GameRegistry.addRecipe(runeOfSelfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', glowstoneDustStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack); + GameRegistry.addRecipe(divinationSigilStackCrafted, "ggg", "gsg", "gog", 'g', glassStack, 's', blankSlateStack, 'o', weakBloodOrbStack); +// 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); + GameRegistry.addRecipe(ritualStoneStackCrafted, "srs", "ror", "srs", 's', obsidianStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack); + GameRegistry.addRecipe(masterRitualStoneStack, "brb", "ror", "brb", 'b', obsidianStack, 'o', magicianBloodOrbStack, 'r', ritualStoneStack); + GameRegistry.addRecipe(imperfectRitualStoneStack, "bsb", "sos", "bsb", 's', stoneStack, 'b', obsidianStack, 'o', weakBloodOrbStack); + GameRegistry.addRecipe(sigilOfElementalAffinityStackCrafted, "oao", "wsl", "oro", 'o', obsidianStack, 'a', airSigilStack, 'w', waterSigilStack, 'l', lavaSigilStack, 'r', magicianBloodOrbStack, 's', imbuedSlateStack); + GameRegistry.addRecipe(sigilOfHoldingStack, "asa", "srs", "aoa", 'a', blankSlateStack, 's', stoneStack, 'r', imbuedSlateStack, 'o', magicianBloodOrbStack); + GameRegistry.addRecipe(emptySocketStack, "bgb", "gdg", "bgb", 'b', weakBloodShardStack, 'g', glassStack, 'd', diamondStack); + GameRegistry.addRecipe(armourForgeStack, "sfs", "fof", "sfs", 'f', bloodSocketStack, 's', stoneStack, 'o', magicianBloodOrbStack); + GameRegistry.addShapelessRecipe(largeBloodStoneBrickStackCrafted, weakBloodShardStack, stoneStack); + GameRegistry.addRecipe(bloodStoneBrickStackCrafted, "bb", "bb", 'b', largeBloodStoneBrickStack); + GameRegistry.addRecipe(growthSigilStack, "srs", "rer", "sos", 's', saplingStack, 'r', reedStack, 'o', apprenticeBloodOrbStack, 'e', reinforcedSlateStack); + GameRegistry.addRecipe(blockHomHeartStack, "www", "srs", "sos", 'w', redWoolStack, 's', stoneStack, 'r', bloodRuneStack, 'o', apprenticeBloodOrbStack); + GameRegistry.addShapelessRecipe(new ItemStack(Items.skull, 1, 2), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.rotten_flesh), new ItemStack(Items.iron_ingot), new ItemStack(Items.leather)); + GameRegistry.addShapelessRecipe(new ItemStack(Items.skull, 1, 0), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.bow, 1, 0), new ItemStack(Items.arrow, 1, 0), new ItemStack(Items.bone)); + GameRegistry.addShapelessRecipe(new ItemStack(Items.skull, 1, 4), new ItemStack(Items.skull, 1, 1), new ItemStack(Items.gunpowder), new ItemStack(Blocks.dirt), new ItemStack(Blocks.sand)); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockWritingTable), " s ", "ror", 's', new ItemStack(Items.brewing_stand), 'r', obsidianStack, 'o', weakBloodOrbStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockPedestal), "ooo", " c ", "ooo", 'o', obsidianStack, 'c', weakBloodShardStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockPlinth), "iii", " p ", "iii", 'i', ironBlockStack, 'p', new ItemStack(ModBlocks.blockPedestal)); + GameRegistry.addShapelessRecipe(new ItemStack(ModItems.alchemyFlask, 1, 0), new ItemStack(ModItems.alchemyFlask, 1, craftingConstant), new ItemStack(Items.nether_wart), redstoneStack, glowstoneDustStack); + GameRegistry.addRecipe(new ItemStack(ModItems.sigilOfHaste), "csc", "sts", "ror", 'c', new ItemStack(Items.cookie), 's', new ItemStack(Items.sugar), 't', ModItems.demonicSlate, 'r', obsidianStack, 'o', new ItemStack(ModItems.masterBloodOrb)); + GameRegistry.addRecipe(new ItemStack(ModItems.sigilOfWind), "faf", "grg", "fof", 'f', featherStack, 'g', ghastTearStack, 'a', new ItemStack(ModItems.airSigil), 'o', new ItemStack(ModItems.masterBloodOrb), 'r', ModItems.demonicSlate); + GameRegistry.addShapelessRecipe(new ItemStack(ModItems.weakBloodShard, 5, 0), new ItemStack(ModItems.masterBloodOrb), new ItemStack(ModItems.weakBloodShard), imbuedSlateStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockTeleposer), "ggg", "efe", "ggg", 'g', goldIngotStack, 'f', new ItemStack(ModItems.telepositionFocus), 'e', new ItemStack(Items.ender_pearl)); + GameRegistry.addShapelessRecipe(new ItemStack(ModItems.reinforcedTelepositionFocus), new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.weakBloodShard)); + GameRegistry.addShapelessRecipe(new ItemStack(ModItems.demonicTelepositionFocus), new ItemStack(ModItems.reinforcedTelepositionFocus), new ItemStack(ModItems.demonBloodShard)); + GameRegistry.addRecipe(new ItemStack(ModItems.sigilOfTheBridge), "nnn", "nsn", "ror", 'n', stoneStack, 'r', new ItemStack(Blocks.soul_sand), 's', imbuedSlateStack, 'o', magicianBloodOrbStack); + GameRegistry.addRecipe(new ItemStack(ModItems.armourInhibitor), " gg", "gsg", "gg ", 'g', goldIngotStack, 's', new ItemStack(ModItems.weakBloodShard)); + GameRegistry.addRecipe(new ItemStack(ModItems.itemRitualDiviner), "d1d", "2e3", "d4d", '1', new ItemStack(ModItems.airScribeTool), '2', new ItemStack(ModItems.waterScribeTool), '3', new ItemStack(ModItems.fireScribeTool), '4', new ItemStack(ModItems.earthScribeTool), 'd', diamondStack, 'e', new ItemStack(Items.emerald)); + GameRegistry.addRecipe(duskRitualDivinerStack, " d ", "srs", " d ", 'd', new ItemStack(ModItems.duskScribeTool), 's', new ItemStack(ModItems.demonicSlate), 'r', new ItemStack(ModItems.itemRitualDiviner)); + GameRegistry.addRecipe(new ItemStack(ModItems.sigilOfMagnetism), "bgb", "gsg", "bob", 'b', new ItemStack(Blocks.iron_block), 'g', goldIngotStack, 's', new ItemStack(ModItems.imbuedSlate), 'o', magicianBloodOrbStack); + GameRegistry.addRecipe(new ItemStack(ModItems.energyBazooka), "Ocd", "cb ", "d w", 'O', archmageBloodOrbStack, 'c', crepitousStack, 'b', new ItemStack(ModItems.energyBlaster), 'd', diamondStack, 'w', new ItemStack(ModItems.weakBloodShard)); + GameRegistry.addRecipe(new ItemStack(ModItems.itemBloodLightSigil), "btb", "sss", "bob", 'o', magicianBloodOrbStack, 'b', glowstoneBlockStack, 't', new ItemStack(Blocks.torch), 's', imbuedSlateStack); + GameRegistry.addRecipe(new ItemStack(ModItems.itemKeyOfDiablo), " gw", "gdg", "wg ", 'w', weakBloodShardStack, 'g', goldIngotStack, 'd', diamondStack); + customPotionDrowning = (new PotionDrowning(customPotionDrowningID, true, 0)).setIconIndex(0, 0).setPotionName("Drowning"); + customPotionBoost = (new PotionBoost(customPotionBoostID, false, 0)).setIconIndex(0, 0).setPotionName("Boost"); + customPotionProjProt = (new PotionProjectileProtect(customPotionProjProtID, false, 0)).setIconIndex(0, 0).setPotionName("Whirlwind"); + customPotionInhibit = (new PotionInhibit(customPotionInhibitID, false, 0)).setIconIndex(0, 0).setPotionName("Inhibit"); + customPotionFlight = (new PotionFlight(customPotionFlightID, false, 0)).setIconIndex(0, 0).setPotionName("Flight"); + customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); + customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); + customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); + //All items registered go here + //LanguageRegistry.addName(orbOfTesting, "Orb of Testing"); + LanguageRegistry.addName(ModItems.weakBloodOrb, "Weak Blood Orb"); + LanguageRegistry.addName(ModItems.apprenticeBloodOrb, "Apprentice Blood Orb"); + LanguageRegistry.addName(ModItems.magicianBloodOrb, "Magician's Blood Orb"); + LanguageRegistry.addName(ModItems.archmageBloodOrb, "Archmage's Blood Orb"); + LanguageRegistry.addName(ModItems.energyBlaster, "Energy Blaster"); + LanguageRegistry.addName(ModItems.energySword, "Bound Blade"); + LanguageRegistry.addName(ModItems.lavaCrystal, "Lava Crystal"); + LanguageRegistry.addName(ModItems.waterSigil, "Water Sigil"); + LanguageRegistry.addName(ModItems.lavaSigil, "Lava Sigil"); + LanguageRegistry.addName(ModItems.voidSigil, "Void Sigil"); + //LanguageRegistry.addName(glassShard, "Glass Shard"); + //LanguageRegistry.addName(bloodiedShard, "Bloodied Shard"); + LanguageRegistry.addName(ModItems.blankSlate, "Blank Slate"); + LanguageRegistry.addName(ModItems.reinforcedSlate, "Reinforced Slate"); + LanguageRegistry.addName(ModItems.sacrificialDagger, "Sacrificial Knife"); + LanguageRegistry.addName(ModItems.daggerOfSacrifice, "Dagger of Sacrifice"); + LanguageRegistry.addName(ModItems.airSigil, "Air Sigil"); + LanguageRegistry.addName(ModItems.sigilOfTheFastMiner, "Sigil of the Fast Miner"); + LanguageRegistry.addName(ModItems.sigilOfElementalAffinity, "Sigil of Elemental Affinity"); + LanguageRegistry.addName(ModItems.sigilOfHaste, "Sigil of Haste"); + LanguageRegistry.addName(ModItems.sigilOfHolding, "Sigil of Holding"); + LanguageRegistry.addName(ModItems.growthSigil, "Sigil of the Green Grove"); +// LanguageRegistry.addName(elementalInkWater, "Elemental Ink: Water"); +// LanguageRegistry.addName(elementalInkFire, "Elemental Ink: Fire"); +// LanguageRegistry.addName(elementalInkEarth, "Elemental Ink: Earth"); +// LanguageRegistry.addName(elementalInkAir, "Elemental Ink: Air"); + LanguageRegistry.addName(ModItems.divinationSigil, "Divination Sigil"); + LanguageRegistry.addName(new ItemStack(ModItems.activationCrystal, 1, 0), "Weak Activation Crystal"); + LanguageRegistry.addName(new ItemStack(ModItems.activationCrystal, 1, 1), "Awakened Activation Crystal"); + LanguageRegistry.addName(ModItems.waterScribeTool, "Elemental Inscription Tool: Water"); + LanguageRegistry.addName(ModItems.fireScribeTool, "Elemental Inscription Tool: Fire"); + LanguageRegistry.addName(ModItems.earthScribeTool, "Elemental Inscription Tool: Earth"); + LanguageRegistry.addName(ModItems.airScribeTool, "Elemental Inscription Tool: Air"); + LanguageRegistry.addName(ModItems.boundPickaxe, "Bound Pickaxe"); + LanguageRegistry.addName(ModItems.boundAxe, "Bound Axe"); + LanguageRegistry.addName(ModItems.boundShovel, "Bound Shovel"); + LanguageRegistry.addName(ModItems.boundHelmet, "Bound Helmet"); + LanguageRegistry.addName(ModItems.boundPlate, "Bound Chestplate"); + LanguageRegistry.addName(ModItems.boundLeggings, "Bound Leggings"); + LanguageRegistry.addName(ModItems.boundBoots, "Bound Boots"); + LanguageRegistry.addName(ModItems.weakBloodShard, "Weak Blood Shard"); + LanguageRegistry.addName(ModItems.blankSpell, "Unbound Crystal"); + LanguageRegistry.addName(ModItems.masterBloodOrb, "Master Blood Orb"); + LanguageRegistry.addName(ModItems.alchemyFlask, "Potion Flask"); + LanguageRegistry.addName(ModItems.mundanePowerCatalyst, "Mundane Power Catalyst"); + LanguageRegistry.addName(ModItems.averagePowerCatalyst, "Average Power Catalyst"); + LanguageRegistry.addName(ModItems.greaterPowerCatalyst, "Greater Power Catalyst"); + LanguageRegistry.addName(ModItems.mundaneLengtheningCatalyst, "Mundane Lengthening Catalyst"); + LanguageRegistry.addName(ModItems.averageLengtheningCatalyst, "Average Lengthening Catalyst"); + LanguageRegistry.addName(ModItems.greaterLengtheningCatalyst, "Greater Lengthening Catalyst"); + LanguageRegistry.addName(ModItems.standardBindingAgent, "Standard Binding Agent"); + LanguageRegistry.addName(ModItems.incendium, "Incendium"); + LanguageRegistry.addName(ModItems.magicales, "Magicales"); + LanguageRegistry.addName(ModItems.sanctus, "Sanctus"); + LanguageRegistry.addName(ModItems.aether, "Aether"); + LanguageRegistry.addName(ModItems.simpleCatalyst, "Simple Catalyst"); + LanguageRegistry.addName(ModItems.crepitous, "Crepitous"); + LanguageRegistry.addName(ModItems.crystallos, "Crystallos"); + LanguageRegistry.addName(ModItems.terrae, "Terrae"); + LanguageRegistry.addName(ModItems.aquasalus, "Aquasalus"); + LanguageRegistry.addName(ModItems.tennebrae, "Tennebrae"); + LanguageRegistry.addName(ModItems.sigilOfWind, "Sigil of the Whirlwind"); + LanguageRegistry.addName(ModItems.telepositionFocus, "Teleposition Focus"); + LanguageRegistry.addName(ModItems.enhancedTelepositionFocus, "Enhanced Teleposition Focus"); + LanguageRegistry.addName(ModItems.reinforcedTelepositionFocus, "Reinforced Teleposition Focus"); + LanguageRegistry.addName(ModItems.demonicTelepositionFocus, "Demonic Teleposition Focus"); + LanguageRegistry.addName(ModItems.imbuedSlate, "Imbued Slate"); + LanguageRegistry.addName(ModItems.demonicSlate, "Demonic Slate"); + LanguageRegistry.addName(ModItems.duskScribeTool, "Elemental Inscription Tool: Dusk"); + LanguageRegistry.addName(ModItems.sigilOfTheBridge, "Sigil of the Phantom Bridge"); + LanguageRegistry.addName(ModItems.armourInhibitor, "Armour Inhibitor"); + LanguageRegistry.addName(ModItems.creativeFiller, "Orb of Testing"); + LanguageRegistry.addName(ModItems.weakFillingAgent, "Weak Filling Agent"); + LanguageRegistry.addName(ModItems.standardFillingAgent, "Standard Filling Agent"); + LanguageRegistry.addName(ModItems.enhancedFillingAgent, "Enhanced Filling Agent"); + LanguageRegistry.addName(ModItems.weakBindingAgent, "Weak Binding Agent"); + LanguageRegistry.addName(ModItems.itemRitualDiviner, "Ritual Diviner"); + LanguageRegistry.addName(ModItems.sigilOfMagnetism, "Sigil of Magnetism"); + LanguageRegistry.addName(ModItems.itemKeyOfDiablo, "Key of Binding"); + LanguageRegistry.addName(ModItems.energyBazooka, "Energy Bazooka"); + LanguageRegistry.addName(ModItems.itemBloodLightSigil, "Sigil of the Blood Lamp"); + LanguageRegistry.addName(ModItems.demonBloodShard, "Demon Blood Shard"); + //FluidStack lifeEssenceFluidStack = new FluidStack(lifeEssenceFluid, 1); + //LiquidStack lifeEssence = new LiquidStack(lifeEssenceFlowing, 1); + //LiquidDictionary.getOrCreateLiquid("Life Essence", lifeEssence); + FluidRegistry.registerFluid(lifeEssenceFluid); + ModBlocks.blockLifeEssence = new LifeEssenceBlock(); +// ModBlocks.blockLifeEssence.setUnlocalizedName("lifeEssenceBlock"); + FluidContainerRegistry.registerFluidContainer(lifeEssenceFluid, new ItemStack(ModItems.bucketLife), FluidContainerRegistry.EMPTY_BUCKET); + FluidRegistry.registerFluid(lifeEssenceFluid); + //lifeEssenceFluid.setUnlocalizedName("lifeEssence"); + //LiquidContainerRegistry.registerLiquid(new LiquidContainerData(LiquidDictionary.getLiquid("Life Essence", LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(AlchemicalWizardry.bucketLife), new ItemStack(Item.bucketEmpty))); + //GameRegistry.registerBlock(testingBlock, "testingBlock"); + //LanguageRegistry.addName(testingBlock, "Testing Block"); + //(testingBlock, "pickaxe", 0); + LanguageRegistry.addName(ModBlocks.blockAltar, "Blood Altar"); + LanguageRegistry.addName(ModBlocks.blockLifeEssence, "Life Essence"); + ModBlocks.blockAltar.setHarvestLevel("pickaxe", 1); + //Register Tile Entity + GameRegistry.registerTileEntity(TEAltar.class, "containerAltar"); + GameRegistry.registerTileEntity(TEMasterStone.class, "containerMasterStone"); + GameRegistry.registerTileEntity(TESocket.class, "containerSocket"); + GameRegistry.registerTileEntity(TEWritingTable.class, "containerWritingTable"); + GameRegistry.registerTileEntity(TEHomHeart.class, "containerHomHeart"); + GameRegistry.registerTileEntity(TEPedestal.class, "containerPedestal"); + GameRegistry.registerTileEntity(TEPlinth.class, "containerPlinth"); + GameRegistry.registerTileEntity(TETeleposer.class, "containerTeleposer"); + GameRegistry.registerTileEntity(TEConduit.class, "containerConduit"); + GameRegistry.registerTileEntity(TEOrientable.class, "containerOrientable"); + GameRegistry.registerTileEntity(TESpellParadigmBlock.class, "containerSpellParadigmBlock"); + GameRegistry.registerTileEntity(TESpellEffectBlock.class, "containerSpellEffectBlock"); + GameRegistry.registerTileEntity(TESpellModifierBlock.class, "containerSpellModifierBlock"); + GameRegistry.registerTileEntity(TESpellEnhancementBlock.class, "containerSpellEnhancementBlock"); + // + LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 0), "Blood Rune"); + LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 1), "Rune of Augmented Capacity"); + LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 2), "Rune of Dislocation"); + LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 3), "Rune of the Orb"); + //TODO + + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 0), "Particle Generator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 1), "Self Augmentator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 2), "Melee Aggregator"); + + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 0), "Unstable Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 1), "Standard Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 2), "Reinforced Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 3), "Imbued Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 4), "Demonic Spell Empowerer"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 5), "Unstable Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 6), "Standard Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 7), "Reinforced Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 8), "Imbued Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 9), "Demonic Spell Dampener"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 10), "Unstable Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 11), "Standard Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 12), "Reinforced Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 13), "Imbued Spell Augmenter"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 14), "Demonic Spell Augmenter"); + + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 0), "Default Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 1), "Offensive Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 2), "Defensive Spell Modifier"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 3), "Environmental Spell Modifier"); + + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 0), "Crucible of Fire"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 1), "Ice Maker"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 2), "Wind Generator"); + LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 3), "Earth Former"); + + LanguageRegistry.addName(ModBlocks.speedRune, "Speed Rune"); + LanguageRegistry.addName(ModBlocks.efficiencyRune, "Efficiency Rune"); + LanguageRegistry.addName(ModBlocks.runeOfSacrifice, "Rune of Sacrifice"); + LanguageRegistry.addName(ModBlocks.runeOfSelfSacrifice, "Rune of Self-sacrifice"); +// GameRegistry.registerBlock(lifeEssenceStill, "lifeEssenceStill"); +// GameRegistry.registerBlock(lifeEssenceFlowing, "lifeEssenceFlowing"); + //LanguageRegistry.addName(lifeEssenceStill, "Life Essence"); + LanguageRegistry.addName(ModItems.bucketLife, "Bucket of Life"); + LanguageRegistry.addName(ModBlocks.blockMasterStone, "Master Ritual Stone"); + LanguageRegistry.addName(ModBlocks.imperfectRitualStone, "Imperfect Ritual Stone"); + LanguageRegistry.addName(ModBlocks.ritualStone, "Ritual Stone"); + LanguageRegistry.addName(ModBlocks.armourForge, "Soul Armour Forge"); + LanguageRegistry.addName(ModBlocks.emptySocket, "Empty Socket"); + LanguageRegistry.addName(ModBlocks.bloodSocket, "Filled Socket"); + LanguageRegistry.addName(ModBlocks.bloodStoneBrick, "Bloodstone Brick"); + LanguageRegistry.addName(ModBlocks.largeBloodStoneBrick, "Large Bloodstone Brick"); + LanguageRegistry.addName(ModBlocks.blockHomHeart, "Spell Table"); + LanguageRegistry.addName(ModBlocks.blockPedestal, "Arcane Pedestal"); + LanguageRegistry.addName(ModBlocks.blockPlinth, "Arcane Plinth"); + LanguageRegistry.addName(ModBlocks.blockWritingTable, "Alchemic Chemistry Set"); + LanguageRegistry.addName(ModBlocks.blockTeleposer, "Teleposer"); + LanguageRegistry.addName(ModBlocks.spectralBlock, "Spectral Block"); + LanguageRegistry.addName(ModBlocks.blockBloodLight, "Blood Light"); + LanguageRegistry.addName(ModBlocks.blockConduit, "Spell Conduit"); + //TODO + + //GameRegistry.registerBlock(ModBlocks.blockSpellEffect,"blockSpellEffect"); + ModBlocks.bloodRune.setHarvestLevel("pickaxe", 2); + ModBlocks.speedRune.setHarvestLevel("pickaxe", 2); + ModBlocks.efficiencyRune.setHarvestLevel("pickaxe", 2); + ModBlocks.runeOfSacrifice.setHarvestLevel("pickaxe", 2); + ModBlocks.runeOfSelfSacrifice.setHarvestLevel("pickaxe", 2); + ModBlocks.ritualStone.setHarvestLevel("pickaxe", 2); + ModBlocks.bloodSocket.setHarvestLevel("pickaxe", 2); + ModBlocks.ritualStone.setHarvestLevel("pickaxe", 2); + ModBlocks.imperfectRitualStone.setHarvestLevel("pickaxe", 2); + ModBlocks.blockMasterStone.setHarvestLevel("pickaxe", 2); + ModBlocks.emptySocket.setHarvestLevel("pickaxe", 2); + ModBlocks.bloodStoneBrick.setHarvestLevel("pickaxe", 0); + ModBlocks.largeBloodStoneBrick.setHarvestLevel("pickaxe", 0); + ModBlocks.blockWritingTable.setHarvestLevel("pickaxe", 1); + ModBlocks.blockHomHeart.setHarvestLevel("pickaxe", 1); + ModBlocks.blockPedestal.setHarvestLevel("pickaxe", 2); + ModBlocks.blockPlinth.setHarvestLevel("pickaxe", 2); + ModBlocks.blockTeleposer.setHarvestLevel("pickaxe", 2); + //Fuel handler + GameRegistry.registerFuelHandler(new AlchemicalWizardryFuelHandler()); + //EntityRegistry.registerModEntity(EnergyBlastProjectile.class, "BlasterProj", 0, this, 128, 5, true); + proxy.registerEntityTrackers(); + //Gui registration + // NetworkRegistry.instance().registerGuiHandler(this, new GuiHandlerAltar()); + Rituals.loadRituals(); + UpgradedAltars.loadAltars(); + SigilOfHolding.initiateSigilOfHolding(); + ArmourForge.initializeRecipes(); + TEPlinth.initialize(); + AlchemicalPotionCreationHandler.initializePotions(); + AltarRecipeRegistry.initRecipes(); + //MinecraftForge.setToolClass(ModItems.boundPickaxe, "pickaxe", 5); + //MinecraftForge.setToolClass(ModItems.boundAxe, "axe", 5); + //MinecraftForge.setToolClass(ModItems.boundShovel, "shovel", 5); + FMLCommonHandler.instance().bus().register(new ModLivingDropsEvent()); + proxy.InitRendering(); + NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); +// ItemStack[] comp = new ItemStack[5]; +// for(int i=0;i<5;i++) +// { +// comp[i] = redstoneStack; +// } +// AlchemyRecipeRegistry.registerRecipe(glowstoneDustStack, 2, comp, 2); + //TODO NEW RECIPES! + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.weakBindingAgent), 10, new ItemStack[]{simpleCatalystStack, simpleCatalystStack, new ItemStack(Items.clay_ball)}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.standardBindingAgent), 15, new ItemStack[]{new ItemStack(ModItems.weakBindingAgent), sanctusStack, new ItemStack(ModItems.crystallos)}, 3); + AlchemyRecipeRegistry.registerRecipe(simpleCatalystStack, 2, new ItemStack[]{sugarStack, redstoneStack, redstoneStack, glowstoneDustStack, new ItemStack(Items.gunpowder)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.incendium), 5, new ItemStack[]{lavaBucketStack, new ItemStack(Items.blaze_powder), new ItemStack(Items.blaze_powder), new ItemStack(Blocks.netherrack), simpleCatalystStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.aether), 5, new ItemStack[]{featherStack, featherStack, glowstoneDustStack, ghastTearStack, simpleCatalystStack}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.sanctus), 5, new ItemStack[]{glowstoneDustStack, new ItemStack(Items.gold_nugget), glowstoneDustStack, glassStack, simpleCatalystStack}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.crepitous), 5, new ItemStack[]{new ItemStack(Items.gunpowder), new ItemStack(Items.gunpowder), cobblestoneStack, cobblestoneStack, simpleCatalystStack}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.crystallos), 5, new ItemStack[]{new ItemStack(Blocks.ice), new ItemStack(Blocks.ice), new ItemStack(Blocks.snow), new ItemStack(Blocks.snow), simpleCatalystStack}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.terrae), 5, new ItemStack[]{new ItemStack(Blocks.dirt), new ItemStack(Blocks.sand), obsidianStack, obsidianStack, simpleCatalystStack}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.aquasalus), 5, new ItemStack[]{simpleCatalystStack, new ItemStack(Items.dye, 1, 0), new ItemStack(Items.potionitem, 1, 0), new ItemStack(Items.potionitem, 1, 0), new ItemStack(Items.potionitem, 1, 0)}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.tennebrae), 5, new ItemStack[]{simpleCatalystStack, new ItemStack(Items.coal), new ItemStack(Items.coal), new ItemStack(Blocks.obsidian), new ItemStack(Items.clay_ball)}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.magicales), 5, new ItemStack[]{redstoneStack, simpleCatalystStack, new ItemStack(Items.gunpowder), new ItemStack(Items.glowstone_dust), new ItemStack(Items.glowstone_dust)}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.mundanePowerCatalyst), 10, new ItemStack[]{glowstoneDustStack, glowstoneDustStack, glowstoneDustStack, new ItemStack(ModItems.weakBindingAgent), simpleCatalystStack}, 3); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.mundaneLengtheningCatalyst), 10, new ItemStack[]{redstoneStack, redstoneStack, redstoneStack, new ItemStack(ModItems.weakBindingAgent), simpleCatalystStack}, 3); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.averagePowerCatalyst), 20, new ItemStack[]{new ItemStack(ModItems.mundanePowerCatalyst), new ItemStack(ModItems.mundanePowerCatalyst), new ItemStack(ModItems.standardBindingAgent)}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.averageLengtheningCatalyst), 20, new ItemStack[]{new ItemStack(ModItems.mundaneLengtheningCatalyst), new ItemStack(ModItems.mundaneLengtheningCatalyst), new ItemStack(ModItems.standardBindingAgent)}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.greaterPowerCatalyst), 30, new ItemStack[]{new ItemStack(ModItems.averagePowerCatalyst), new ItemStack(ModItems.averagePowerCatalyst), new ItemStack(ModItems.incendium)}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.greaterLengtheningCatalyst), 30, new ItemStack[]{new ItemStack(ModItems.averageLengtheningCatalyst), new ItemStack(ModItems.averageLengtheningCatalyst), new ItemStack(ModItems.aquasalus)}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.weakFillingAgent), 5, new ItemStack[]{simpleCatalystStack, new ItemStack(Items.nether_wart), redstoneStack, glowstoneDustStack}, 3); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.standardFillingAgent), 10, new ItemStack[]{new ItemStack(ModItems.weakFillingAgent), new ItemStack(ModItems.terrae)}, 3); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.enhancedFillingAgent), 25, new ItemStack[]{new ItemStack(ModItems.standardFillingAgent), new ItemStack(ModItems.aquasalus), new ItemStack(ModItems.magicales)}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.activationCrystal, 1, 1), 100, new ItemStack[]{new ItemStack(ModItems.activationCrystal, 1, 0), new ItemStack(ModItems.demonBloodShard), incendiumStack, aquasalusStack, aetherStack}, 4); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.activationCrystal, 1, 1), 100, new ItemStack[]{new ItemStack(ModItems.activationCrystal, 1, 0), new ItemStack(Items.nether_star), incendiumStack, aquasalusStack, aetherStack}, 4); + HomSpellRegistry.registerBasicSpell(new ItemStack(Items.flint_and_steel), new SpellFireBurst()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Blocks.ice), new SpellFrozenWater()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Blocks.tnt), new SpellExplosions()); + HomSpellRegistry.registerBasicSpell(new ItemStack(ModItems.apprenticeBloodOrb), new SpellHolyBlast()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Items.ghast_tear), new SpellWindGust()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Items.glowstone_dust), new SpellLightningBolt()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Items.water_bucket), new SpellWateryGrave()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Blocks.obsidian), new SpellEarthBender()); + HomSpellRegistry.registerBasicSpell(new ItemStack(Items.ender_pearl), new SpellTeleport()); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityFallenAngelID), new ItemStack[]{sanctusStack, sanctusStack, sanctusStack, aetherStack, tennebraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityLowerGuardianID), new ItemStack[]{cobblestoneStack, cobblestoneStack, terraeStack, tennebraeStack, new ItemStack(Items.iron_ingot), new ItemStack(Items.gold_nugget)}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityBileDemonID), new ItemStack[]{new ItemStack(Items.poisonous_potato), tennebraeStack, terraeStack, new ItemStack(Items.porkchop), new ItemStack(Items.egg), new ItemStack(Items.beef)}, new ItemStack[]{crepitousStack, crepitousStack, terraeStack, ironBlockStack, ironBlockStack, diamondStack}, new ItemStack[]{}, 0, 5); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityWingedFireDemonID), new ItemStack[]{aetherStack, incendiumStack, incendiumStack, incendiumStack, tennebraeStack, new ItemStack(Blocks.netherrack)}, new ItemStack[]{diamondStack, new ItemStack(Blocks.gold_block), magicalesStack, magicalesStack, new ItemStack(Items.fire_charge), new ItemStack(Blocks.coal_block)}, new ItemStack[]{}, 0, 5); + SummoningRegistry.registerSummon(new SummoningHelper(this.entitySmallEarthGolemID), new ItemStack[]{new ItemStack(Items.clay_ball), terraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityIceDemonID), new ItemStack[]{crystallosStack, crystallosStack, aquasalusStack, crystallosStack, sanctusStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityBoulderFistID), new ItemStack[]{terraeStack, sanctusStack, tennebraeStack, new ItemStack(Items.bone), new ItemStack(Items.cooked_beef), new ItemStack(Items.cooked_beef)}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityShadeID), new ItemStack[]{tennebraeStack, tennebraeStack, tennebraeStack, aetherStack, glassStack, new ItemStack(Items.glass_bottle)}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityAirElementalID), new ItemStack[]{aetherStack, aetherStack, aetherStack, aetherStack, aetherStack, aetherStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityWaterElementalID), new ItemStack[]{aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityEarthElementalID), new ItemStack[]{terraeStack, terraeStack, terraeStack, terraeStack, terraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityFireElementalID), new ItemStack[]{incendiumStack, incendiumStack, incendiumStack, incendiumStack, incendiumStack, incendiumStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + //TODO SummoningRegistry.registerSummon(new SummoningHelper(this.entityShadeElementalID), new ItemStack[]{tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelper(this.entityHolyElementalID), new ItemStack[]{sanctusStack, sanctusStack, sanctusStack, sanctusStack, sanctusStack, sanctusStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + //Custom mobs + EntityRegistry.registerModEntity(EntityFallenAngel.class, "FallenAngel", this.entityFallenAngelID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityLowerGuardian.class, "LowerGuardian", this.entityLowerGuardianID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityBileDemon.class, "BileDemon", this.entityBileDemonID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityWingedFireDemon.class, "WingedFireDemon", this.entityWingedFireDemonID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntitySmallEarthGolem.class, "SmallEarthGolem", this.entitySmallEarthGolemID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityIceDemon.class, "IceDemon", this.entityIceDemonID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityBoulderFist.class, "BoulderFist", this.entityBoulderFistID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityShade.class, "Shade", this.entityShadeID, this, 80, 3, true); + EntityRegistry.registerModEntity(EntityAirElemental.class, "AirElemental", this.entityAirElementalID, this, 120, 3, true); + EntityRegistry.registerModEntity(EntityWaterElemental.class, "WaterElemental", this.entityWaterElementalID, this, 120, 3, true); + EntityRegistry.registerModEntity(EntityEarthElemental.class, "EarthElemental", this.entityEarthElementalID, this, 120, 3, true); + EntityRegistry.registerModEntity(EntityFireElemental.class, "FireElemental", this.entityFireElementalID, this, 120, 3, true); + EntityRegistry.registerModEntity(EntityShadeElemental.class, "ShadeElemental", this.entityShadeElementalID, this, 120, 3, true); + EntityRegistry.registerModEntity(EntityHolyElemental.class, "HolyElemental", this.entityHolyElementalID, this, 120, 3, true); + //EntityRegistry.addSpawn(EntityFallenAngel.class, 5, 1, 5, EnumCreatureType.creature, BiomeGenBase.biomeList); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.FallenAngel.name", "en_US", "Fallen Angel"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.LowerGuardian.name", "en_US", "Lower Stone Guardian"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.BileDemon.name", "en_US", "Bile Demon"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.WingedFireDemon.name", "en_US", "Winged Fire Demon"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.SmallEarthGolem.name", "en_US", "Small Earth Golem"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.IceDemon.name", "en_US", "Ice Demon"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.BoulderFist.name", "en_US", "Boulder Fist"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.Shade.name", "en_US", "Shade"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.AirElemental.name", "en_US", "Air Elemental"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.WaterElemental.name", "en_US", "Water Elemental"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.EarthElemental.name", "en_US", "Earth Elemental"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.FireElemental.name", "en_US", "Fire Elemental"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.ShadeElemental.name", "en_US", "Shade Elemental"); + LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.HolyElemental.name", "en_US", "Holy Elemental"); + LanguageRegistry.instance().addStringLocalization("itemGroup.tabBloodMagic", "en_US", "Blood Magic"); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.standardBindingAgent), 1, 3, this.standardBindingAgentDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.mundanePowerCatalyst), 1, 1, this.mundanePowerCatalystDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.mundaneLengtheningCatalyst), 1, 1, this.mundaneLengtheningCatalystDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.averagePowerCatalyst), 1, 1, this.averagePowerCatalystDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.averageLengtheningCatalyst), 1, 1, this.averageLengtheningCatalystDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.greaterPowerCatalyst), 1, 1, this.greaterPowerCatalystDungeonChance)); + ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.greaterLengtheningCatalyst), 1, 1, this.greaterLengtheningCatalystDungeonChance)); + //Ore Dictionary Registration + OreDictionary.registerOre("oreCoal", Blocks.coal_ore); + MeteorRegistry.registerMeteorParadigm(diamondStack, diamondMeteorArray, diamondMeteorRadius); + MeteorRegistry.registerMeteorParadigm(stoneStack, this.stoneMeteorArray, this.stoneMeteorRadius); + MeteorRegistry.registerMeteorParadigm(ironBlockStack, this.ironBlockMeteorArray, this.ironBlockMeteorRadius); + MeteorRegistry.registerMeteorParadigm(new ItemStack(Items.nether_star), this.netherStarMeteorArray, this.netherStarMeteorRadius); +// sanguineHelmet = new ItemSanguineArmour(sanguineHelmetItemID).setUnlocalizedName("sanguineHelmet"); +// +// LanguageRegistry.addName(sanguineHelmet,"Sanguine Helmet"); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) + { + //TODO Thaumcraft Integration + if (Loader.isModLoaded("Thaumcraft")) + { + this.isThaumcraftLoaded = true; + +// try +// { +// //do stuff +// ModItems.sanguineHelmet = new ItemSanguineArmour(sanguineHelmetItemID).setUnlocalizedName("sanguineHelmet"); +// LanguageRegistry.addName(ModItems.sanguineHelmet, "Sanguine Helmet"); +//// focusBloodBlast = new FocusBloodBlast(focusBloodBlastItemID); +//// LanguageRegistry.addName(focusBloodBlast,"Wand Focus: Blood Blast"); +//// +//// focusGravityWell = new FocusGravityWell(focusGravityWellItemID); +//// LanguageRegistry.addName(focusGravityWell,"Wand Focus: Gravity Well"); +// ItemStack itemGoggles = ItemApi.getItem("itemGoggles", 0); +// +// if (itemGoggles != null) +// { +// //GameRegistry.addShapelessRecipe(new ItemStack(this.sanguineHelmet), itemGoggles); +// } +// +// //LogHelper.log(Level.INFO, "Loaded RP2 World addon"); +// } catch (Exception e) +// { +// //LogHelper.log(Level.SEVERE, "Could not load RP2 World addon"); +// e.printStackTrace(System.err); +// } + } else + { + this.isThaumcraftLoaded = false; + } + + if(Loader.isModLoaded("Forestry")) + { + this.isForestryLoaded = true; + +// ModItems.itemBloodFrame = new ItemBloodFrame(this.itemBloodFrameItemID).setUnlocalizedName("bloodFrame"); +// +// ItemStack provenFrame = GameRegistry.findItemStack("Forestry", "frameImpregnated", 1); +// +// if(provenFrame !=null) +// { +// AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.itemBloodFrame), provenFrame, 3, 30000, 20, 20, false); +// } + }else + { + this.isForestryLoaded = false; + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java new file mode 100644 index 00000000..59b4e98a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -0,0 +1,209 @@ +package WayofTime.alchemicalWizardry; + +import java.io.File; +import java.util.logging.Level; + +import net.minecraftforge.common.config.Configuration; +import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorParadigm; +import cpw.mods.fml.common.FMLLog; + +/** + * Created with IntelliJ IDEA. + * User: Pokefenn + * Date: 17/01/14 + * Time: 19:50 + */ +public class BloodMagicConfiguration +{ + + + public static Configuration config; + public static final String CATEGORY_GAMEPLAY = "gameplay"; + + + public static void init(File configFile) + { + + config = new Configuration(configFile); + + try + { + + config.load(); + + AlchemicalWizardry.standardBindingAgentDungeonChance = config.get("Dungeon Loot Chances", "standardBindingAgent", 30).getInt(); + AlchemicalWizardry.mundanePowerCatalystDungeonChance = config.get("Dungeon Loot Chances", "mundanePowerCatalyst", 20).getInt(); + AlchemicalWizardry.averagePowerCatalystDungeonChance = config.get("Dungeon Loot Chances", "averagePowerCatalyst", 10).getInt(); + AlchemicalWizardry.greaterPowerCatalystDungeonChance = config.get("Dungeon Loot Chances", "greaterPowerCatalyst", 05).getInt(); + AlchemicalWizardry.mundaneLengtheningCatalystDungeonChance = config.get("Dungeon Loot Chances", "mundaneLengtheningCatalyst", 20).getInt(); + AlchemicalWizardry.averageLengtheningCatalystDungeonChance = config.get("Dungeon Loot Chances", "averageLengtheningCatalyst", 10).getInt(); + AlchemicalWizardry.greaterLengtheningCatalystDungeonChance = config.get("Dungeon Loot Chances", "greaterLengtheningCatalyst", 05).getInt(); + AlchemicalWizardry.customPotionDrowningID = config.get("Potion ID", "Drowning", 100).getInt(); + AlchemicalWizardry.customPotionBoostID = config.get("Potion ID", "Boost", 101).getInt(); + AlchemicalWizardry.customPotionProjProtID = config.get("Potion ID", "ProjProt", 102).getInt(); + AlchemicalWizardry.customPotionInhibitID = config.get("Potion ID", "Inhibit", 103).getInt(); + AlchemicalWizardry.customPotionFlightID = config.get("Potion ID", "Flight", 104).getInt(); + AlchemicalWizardry.customPotionReciprocationID = config.get("Potion ID", "Reciprocation", 105).getInt(); + AlchemicalWizardry.customPotionFlameCloakID = config.get("Potion ID","FlameCloak",106).getInt(); + AlchemicalWizardry.customPotionIceCloakID = config.get("Potion ID","IceCloak",107).getInt(); + + MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); + AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); + AlchemicalWizardry.diamondMeteorArray = config.get("meteor", "diamondMeteor", new String[]{"oreDiamond", "100", "oreEmerald", "75", "oreCinnabar", "200", "oreAmber", "200"}).getStringList(); + AlchemicalWizardry.diamondMeteorRadius = config.get("meteor", "diamondMeteorRadius", 5).getInt(); + AlchemicalWizardry.stoneMeteorArray = config.get("meteor", "stoneBlockMeteor", new String[]{"oreCoal", "150", "oreApatite", "50", "oreIron", "50"}).getStringList(); + AlchemicalWizardry.stoneMeteorRadius = config.get("meteor", "stoneMeteorRadius", 16).getInt(); + AlchemicalWizardry.ironBlockMeteorArray = config.get("meteor", "ironBlockMeteor", new String[]{"oreIron", "400", "oreGold", "30", "oreCopper", "200", "oreTin", "140", "oreSilver", "70", "oreLead", "80", "oreLapis", "60", "oreRedstone", "100"}).getStringList(); + AlchemicalWizardry.ironBlockMeteorRadius = config.get("meteor", "ironBlockMeteorRadius", 7).getInt(); + AlchemicalWizardry.netherStarMeteorArray = config.get("meteor", "netherStarMeteor", new String[]{"oreDiamond", "150", "oreEmerald", "100", "oreQuartz", "250", "oreSunstone", "5", "oreMoonstone", "50", "oreIridium", "5", "oreCertusQuartz", "150"}).getStringList(); + AlchemicalWizardry.netherStarMeteorRadius = config.get("meteor", "netherStarMeteorRadius", 3).getInt(); + +// AlchemicalWizardry.testingBlockBlockID = config.getBlock("TestingBlock", 1400).getInt(); +// AlchemicalWizardry.lifeEssenceFlowingBlockID = config.getBlock("LifeEssenceFlowing", 1401).getInt(); +// AlchemicalWizardry.lifeEssenceStillBlockID = config.getBlock("LifeEssenceStill", 1402).getInt(); +// AlchemicalWizardry.blockAltarBlockID = config.getBlock("BloodAltar", 1403).getInt(); +// AlchemicalWizardry.bloodRuneBlockID = config.getBlock("BloodRune", 1404).getInt(); +// AlchemicalWizardry.speedRuneBlockID = config.getBlock("SpeedRune", 1405).getInt(); +// AlchemicalWizardry.efficiencyRuneBlockID = config.getBlock("EfficiencyRune", 1406).getInt(); +// AlchemicalWizardry.lifeEssenceFluidID = config.getBlock("LifeEssenceFluid", 1407).getInt(); +// AlchemicalWizardry.runeOfSacrificeBlockID = config.getBlock("RuneOfSacrifice", 1408).getInt(); +// AlchemicalWizardry.runeOfSelfSacrificeBlockID = config.getBlock("RuneOfSelfSacrifice", 1409).getInt(); +// AlchemicalWizardry.ritualStoneBlockID = config.getBlock("RitualStone", 1410).getInt(); +// AlchemicalWizardry.blockMasterStoneBlockID = config.getBlock("MasterStone", 1411).getInt(); +// AlchemicalWizardry.imperfectRitualStoneBlockID = config.getBlock("ImperfectRitualStone", 1412).getInt(); +// AlchemicalWizardry.emptySocketBlockID = config.getBlock("EmptySocket", 1413).getInt(); +// AlchemicalWizardry.bloodSocketBlockID = config.getBlock("BloodSocket", 1414).getInt(); +// AlchemicalWizardry.armourForgeBlockID = config.getBlock("ArmourForge", 1415).getInt(); +// AlchemicalWizardry.largeBloodStoneBrickBlockID = config.getBlock("LargeBloodStoneBrick", 1416).getInt(); +// AlchemicalWizardry.bloodStoneBrickBlockID = config.getBlock("BloodStoneBrick", 1417).getInt(); +// AlchemicalWizardry.blockWritingTableBlockID = config.getBlock("BlockWritingTable", 1418).getInt(); +// AlchemicalWizardry.blockHomHeartBlockID = config.getBlock("BlockHomHeart", 1419).getInt(); +// AlchemicalWizardry.blockPedestalBlockID = config.getBlock("BlockPedestal", 1420).getInt(); +// AlchemicalWizardry.blockPlinthBlockID = config.getBlock("BlockPlinth", 1421).getInt(); +// AlchemicalWizardry.blockTeleposerBlockID = config.getBlock("BlockTeleposer", 1422).getInt(); +// AlchemicalWizardry.spectralBlockBlockID = config.getBlock("SpectralBlock", 1423).getInt(); +// AlchemicalWizardry.blockBloodLightBlockID = config.getBlock("BloodLight", 1424).getInt(); +// AlchemicalWizardry.blockConduitBlockID = config.getBlock("BlockConduit", 1425).getInt(); +// AlchemicalWizardry.blockSpellEffectBlockID = config.getBlock("BlockSpellEffect", 1426).getInt(); +// AlchemicalWizardry.blockSpellParadigmBlockID = config.getBlock("BlockSpellParadigm", 1427).getInt(); +// AlchemicalWizardry.blockSpellModifierBlockID = config.getBlock("BlockSpellModifier", 1428).getInt(); +// AlchemicalWizardry.blockSpellEnhancementBlockID = config.getBlock("BlockSpellEnhancement", 1429).getInt(); +// //Items +// AlchemicalWizardry.weakBloodOrbItemID = config.getItem("WeakBloodOrb", 17000).getInt(); +// AlchemicalWizardry.energyBlasterItemID = config.getItem("EnergyBlaster", 17001).getInt(); +// AlchemicalWizardry.energySwordItemID = config.getItem("EnergySword", 17002).getInt(); +// AlchemicalWizardry.lavaCrystalItemID = config.getItem("LavaCrystal", 17003).getInt(); +// AlchemicalWizardry.waterSigilItemID = config.getItem("WaterSigil", 17004).getInt(); +// AlchemicalWizardry.lavaSigilItemID = config.getItem("LavaSigil", 17005).getInt(); +// AlchemicalWizardry.voidSigilItemID = config.getItem("VoidSigil", 17006).getInt(); +// AlchemicalWizardry.blankSlateItemID = config.getItem("BlankSlate", 17007).getInt(); +// AlchemicalWizardry.reinforcedSlateItemID = config.getItem("ReinforcedSlate", 17008).getInt(); +// AlchemicalWizardry.sacrificialDaggerItemID = config.getItem("SacrificialDagger", 17009).getInt(); +// AlchemicalWizardry.bucketLifeItemID = config.getItem("BucketLife", 17010).getInt(); +// AlchemicalWizardry.apprenticeBloodOrbItemID = config.getItem("ApprenticeBloodOrb", 17011).getInt(); +// AlchemicalWizardry.daggerOfSacrificeItemID = config.getItem("DaggerOfSacrifice", 17012).getInt(); +// AlchemicalWizardry.airSigilItemID = config.getItem("AirSigil", 17013).getInt(); +// AlchemicalWizardry.sigilOfTheFastMinerItemID = config.getItem("SigilOfTheFastMiner", 17014).getInt(); +//// elementalInkWaterItemID = config.getItem("ElementalInkWater", 17015).getInt(); +//// elementalInkFireItemID = config.getItem("ElementalInkFire", 17016).getInt(); +//// elementalInkEarthItemID = config.getItem("ElementalInkEarth", 17017).getInt(); +//// elementalInkAirItemID = config.getItem("ElementalInkAir", 17018).getInt(); +// AlchemicalWizardry.duskScribeToolItemID = config.getItem("DuskScribeTool", 17015).getInt(); +// AlchemicalWizardry.demonPlacerItemID = config.getItem("DemonPlacer", 17016).getInt(); +// AlchemicalWizardry.itemBloodRuneBlockItemID = config.getItem("ItemBloodRuneBlock", 17017).getInt(); +// AlchemicalWizardry.armourInhibitorItemID = config.getItem("ArmourInhibitor", 17018).getInt(); +// AlchemicalWizardry.divinationSigilItemID = config.getItem("DivinationSigin", 17019).getInt(); +// AlchemicalWizardry.waterScribeToolItemID = config.getItem("WaterScribeTool", 17020).getInt(); +// AlchemicalWizardry.fireScribeToolItemID = config.getItem("FireScribeTool", 17021).getInt(); +// AlchemicalWizardry.earthScribeToolItemID = config.getItem("EarthScribeTool", 17022).getInt(); +// AlchemicalWizardry.airScribeToolItemID = config.getItem("AirScribeTool", 17023).getInt(); +// AlchemicalWizardry.weakActivationCrystalItemID = config.getItem("WeakActivationCrystal", 17024).getInt(); +// AlchemicalWizardry.magicianBloodOrbItemID = config.getItem("MagicianBloodOrb", 17025).getInt(); +// AlchemicalWizardry.sigilOfElementalAffinityItemID = config.getItem("SigilOfElementalAffinity", 17026).getInt(); +// AlchemicalWizardry.sigilOfHasteItemID = config.getItem("SigilOfHaste", 17027).getInt(); +// AlchemicalWizardry.sigilOfHoldingItemID = config.getItem("SigilOfHolding", 17028).getInt(); +// AlchemicalWizardry.boundPickaxeItemID = config.getItem("BoundPickaxe", 17029).getInt(); +// AlchemicalWizardry.boundAxeItemID = config.getItem("BoundAxe", 17030).getInt(); +// AlchemicalWizardry.boundShovelItemID = config.getItem("BoundShovel", 17031).getInt(); +// AlchemicalWizardry.boundHelmetItemID = config.getItem("BoundHelmet", 17032).getInt(); +// AlchemicalWizardry.boundPlateItemID = config.getItem("BoundPlate", 17033).getInt(); +// AlchemicalWizardry.boundLeggingsItemID = config.getItem("BoundLeggings", 17034).getInt(); +// AlchemicalWizardry.boundBootsItemID = config.getItem("BoundBoots", 17035).getInt(); +// AlchemicalWizardry.weakBloodShardItemID = config.getItem("WeakBloodShard", 17036).getInt(); +// AlchemicalWizardry.growthSigilItemID = config.getItem("SigilOfGrowth", 17037).getInt(); +// AlchemicalWizardry.masterBloodOrbItemID = config.getItem("MasterBloodOrb", 17038).getInt(); +// AlchemicalWizardry.blankSpellItemID = config.getItem("BlankSpell", 17039).getInt(); +// AlchemicalWizardry.alchemyFlaskItemID = config.getItem("AlchemyFlask", 17040).getInt(); +// AlchemicalWizardry.standardBindingAgentItemID = config.getItem("StandardBindingAgent", 17041).getInt(); +// AlchemicalWizardry.mundanePowerCatalystItemID = config.getItem("MundanePowerCatalyst", 17042).getInt(); +// AlchemicalWizardry.averagePowerCatalystItemID = config.getItem("AveragePowerCatalyst", 17043).getInt(); +// AlchemicalWizardry.greaterPowerCatalystItemID = config.getItem("GreaterPowerCatalyst", 17044).getInt(); +// AlchemicalWizardry.mundaneLengtheningCatalystItemID = config.getItem("MundaneLengtheningCatalyst", 17045).getInt(); +// AlchemicalWizardry.averageLengtheningCatalystItemID = config.getItem("AverageLengtheningCatalyst", 17046).getInt(); +// AlchemicalWizardry.greaterLengtheningCatalystItemID = config.getItem("GreaterLengtheningCatalyst", 17047).getInt(); +// AlchemicalWizardry.demonBloodShardItemID = config.getItem("DemonBloodShard", 17048).getInt(); +// AlchemicalWizardry.archmageBloodOrbItemID = config.getItem("ArchmageBloodOrb", 17049).getInt(); +// AlchemicalWizardry.sigilOfWindItemID = config.getItem("SigilOfWind", 17050).getInt(); +// AlchemicalWizardry.telepositionFocusItemID = config.getItem("TelepositionFocusItemID", 17051).getInt(); +// AlchemicalWizardry.enhancedTelepositionFocusItemID = config.getItem("EnhancedTelepositionFocus", 17052).getInt(); +// AlchemicalWizardry.reinforcedTelepositionFocusItemID = config.getItem("ReinforcedTelepositionFocus", 17053).getInt(); +// AlchemicalWizardry.demonicTelepositionFocusItemID = config.getItem("DemonicTelepositionFocus", 17054).getInt(); +// AlchemicalWizardry.imbuedSlateItemID = config.getItem("ImbuedSlate", 17055).getInt(); +// AlchemicalWizardry.demonicSlateItemID = config.getItem("DemonicSlate", 17056).getInt(); +// AlchemicalWizardry.sigilOfTheBridgeItemID = config.getItem("SigilOfTheBridge", 17057).getInt(); +// AlchemicalWizardry.creativeFillerItemID = config.getItem("CreativeFiller", 17058).getInt(); +// AlchemicalWizardry.itemRitualDivinerItemID = config.getItem("ItemRitualDiviner", 17059).getInt(); +// AlchemicalWizardry.itemKeyOfDiabloItemID = config.getItem("ItemKeyOfDiablo", 17081).getInt(); +// AlchemicalWizardry.energyBazookaItemID = config.getItem("EnergyBazooka", 17082).getInt(); +// AlchemicalWizardry.itemBloodLightSigilItemID = config.getItem("BloodLightSigil", 17083).getInt(); +// AlchemicalWizardry.simpleCatalystItemID = config.getItem("SimpleCatalyst", 17060).getInt(); +// AlchemicalWizardry.incendiumItemID = config.getItem("Incendium", 17061).getInt(); +// AlchemicalWizardry.magicalesItemID = config.getItem("Magicales", 17062).getInt(); +// AlchemicalWizardry.sanctusItemID = config.getItem("Sanctus", 17063).getInt(); +// AlchemicalWizardry.aetherItemID = config.getItem("Aether", 17064).getInt(); +// AlchemicalWizardry.crepitousItemID = config.getItem("Crepitous", 17065).getInt(); +// AlchemicalWizardry.crystallosItemID = config.getItem("Crystallos", 17066).getInt(); +// +// AlchemicalWizardry.terraeItemID = config.getItem("Terrae", 17067).getInt(); +// AlchemicalWizardry.aquasalusItemID = config.getItem("Aquasalus", 17068).getInt(); +// AlchemicalWizardry.tennebraeItemID = config.getItem("Tennebrae", 17069).getInt(); +// AlchemicalWizardry.weakBindingAgentItemID = config.getItem("WeakBindingAgent", 17070).getInt(); +// AlchemicalWizardry.weakFillingAgentItemID = config.getItem("WeakFillingAgent", 17072).getInt(); +// AlchemicalWizardry.standardFillingAgentItemID = config.getItem("StandardFillingAgent", 17073).getInt(); +// AlchemicalWizardry.enhancedFillingAgentItemID = config.getItem("EnhancedFillingAgent", 17074).getInt(); +// AlchemicalWizardry.sanguineHelmetItemID = config.getItem("SanguineHelmet", 17075).getInt(); +// AlchemicalWizardry.focusBloodBlastItemID = config.getItem("FocusBloodBlast", 17076).getInt(); +// AlchemicalWizardry.focusGravityWellItemID = config.getItem("FocusGravityWell", 17077).getInt(); +// AlchemicalWizardry.sigilOfMagnetismItemID = config.getItem("SigilOfMagnetism", 17080).getInt(); +// AlchemicalWizardry.itemComplexSpellCrystalItemID = config.getItem("ComplexSpellCrystal",17081).getInt(); +// AlchemicalWizardry.itemBloodFrameItemID = config.getItem("BloodFrame", 17082).getInt(); + + } catch (Exception e) + { + + //TODO Log + //FMLLog.log(Level.SEVERE, e, "Blood Magic" + " has had a problem loading its configuration, go ask on the forums :p"); + + } finally + { + config.save(); + } + } + + public static void set(String categoryName, String propertyName, String newValue) + { + + config.load(); + if (config.getCategoryNames().contains(categoryName)) + { + if (config.getCategory(categoryName).containsKey(propertyName)) + { + config.getCategory(categoryName).get(propertyName).set(newValue); + } + } + config.save(); + + + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java new file mode 100644 index 00000000..c92f9dd5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java @@ -0,0 +1,117 @@ +package WayofTime.alchemicalWizardry; + +import cpw.mods.fml.common.registry.GameRegistry; +import WayofTime.alchemicalWizardry.common.LifeEssence; +import WayofTime.alchemicalWizardry.common.block.*; +import WayofTime.alchemicalWizardry.common.items.ItemBloodRuneBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; + +/** + * Created with IntelliJ IDEA. + * User: Pokefenn + * Date: 17/01/14 + * Time: 19:48 + */ +public class ModBlocks +{ + + public static Block testingBlock; + public static Block bloodStoneBrick; + public static Block largeBloodStoneBrick; + // public static Block lifeEssenceStill; +// public static Block lifeEssenceFlowing; + public static BlockAltar blockAltar; + public static BloodRune bloodRune; + public static SpeedRune speedRune; + public static EfficiencyRune efficiencyRune; + public static RuneOfSacrifice runeOfSacrifice; + public static RuneOfSelfSacrifice runeOfSelfSacrifice; + public static Block blockMasterStone; + public static Block ritualStone; + public static Block imperfectRitualStone; + public static Block bloodSocket; + public static Block emptySocket; + public static Block armourForge; + public static Block blockWritingTable; + public static Block blockHomHeart; + public static Block blockPedestal; + public static Block blockPlinth; + public static Block blockLifeEssence; + public static Block blockTeleposer; + public static Block spectralBlock; + public static Block blockConduit; + public static Block blockBloodLight; + public static Block blockSpellEffect; + public static Block blockSpellParadigm; + public static Block blockSpellModifier; + public static Block blockSpellEnhancement; + + public static void init() + { + blockAltar = new BlockAltar(); + bloodRune = new BloodRune(); + speedRune = new SpeedRune(); + efficiencyRune = new EfficiencyRune(); + runeOfSacrifice = new RuneOfSacrifice(); + runeOfSelfSacrifice = new RuneOfSelfSacrifice(); + AlchemicalWizardry.lifeEssenceFluid = new LifeEssence("Life Essence"); + blockTeleposer = new BlockTeleposer(); + spectralBlock = new SpectralBlock(); + ritualStone = new RitualStone(); + blockMasterStone = new BlockMasterStone(); + imperfectRitualStone = new ImperfectRitualStone(); + bloodSocket = new BlockSocket(); + armourForge = new ArmourForge(); + emptySocket = new EmptySocket(); + largeBloodStoneBrick = new LargeBloodStoneBrick(); + bloodStoneBrick = new BloodStoneBrick(); + blockWritingTable = new BlockWritingTable(); + blockHomHeart = new BlockHomHeart(); + blockPedestal = new BlockPedestal(); + blockPlinth = new BlockPlinth(); + blockConduit = new BlockConduit(); + blockBloodLight = new BlockBloodLightSource(); + blockSpellEffect = new BlockSpellEffect(); + blockSpellParadigm = new BlockSpellParadigm(); + blockSpellModifier = new BlockSpellModifier(); + blockSpellEnhancement = new BlockSpellEnhancement(); + } + + public static void registerBlocks() + { + GameRegistry.registerBlock(ModBlocks.bloodRune, ItemBloodRuneBlock.class, "AlchemicalWizardry" + (ModBlocks.bloodRune.getUnlocalizedName().substring(5))); + GameRegistry.registerBlock(ModBlocks.blockAltar, "bloodAltar"); + GameRegistry.registerBlock(ModBlocks.blockLifeEssence, "lifeEssence"); + GameRegistry.registerBlock(ModBlocks.blockSpellParadigm, ItemSpellParadigmBlock.class, "AlchemicalWizardry" + (ModBlocks.blockSpellParadigm.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellEnhancement, ItemSpellEnhancementBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEnhancement.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellModifier, ItemSpellModifierBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellModifier.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.speedRune, "speedRune"); + GameRegistry.registerBlock(ModBlocks.efficiencyRune, "efficiencyRune"); + GameRegistry.registerBlock(ModBlocks.runeOfSacrifice, "runeOfSacrifice"); + GameRegistry.registerBlock(ModBlocks.runeOfSelfSacrifice, "runeOfSelfSacrifice"); + GameRegistry.registerBlock(ModBlocks.ritualStone, "ritualStone"); + GameRegistry.registerBlock(ModBlocks.blockMasterStone, "masterStone"); + GameRegistry.registerBlock(ModBlocks.bloodSocket, "bloodSocket"); + GameRegistry.registerBlock(ModBlocks.imperfectRitualStone, "imperfectRitualStone"); + + GameRegistry.registerBlock(ModBlocks.armourForge, "armourForge"); + GameRegistry.registerBlock(ModBlocks.emptySocket, "emptySocket"); + GameRegistry.registerBlock(ModBlocks.bloodStoneBrick, "bloodStoneBrick"); + GameRegistry.registerBlock(ModBlocks.largeBloodStoneBrick, "largeBloodStoneBrick"); + GameRegistry.registerBlock(ModBlocks.blockWritingTable, "blockWritingTable"); + GameRegistry.registerBlock(ModBlocks.blockHomHeart, "blockHomHeart"); + GameRegistry.registerBlock(ModBlocks.blockPedestal, "blockPedestal"); + GameRegistry.registerBlock(ModBlocks.blockPlinth, "blockPlinth"); + GameRegistry.registerBlock(ModBlocks.blockTeleposer, "blockTeleposer"); + GameRegistry.registerBlock(ModBlocks.spectralBlock, "spectralBlock"); + GameRegistry.registerBlock(ModBlocks.blockBloodLight, "bloodLight"); + GameRegistry.registerBlock(ModBlocks.blockConduit,"blockConduit"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java new file mode 100644 index 00000000..f5c8bd83 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java @@ -0,0 +1,274 @@ +package WayofTime.alchemicalWizardry; + +import cpw.mods.fml.common.event.FMLEvent; +import cpw.mods.fml.common.registry.GameRegistry; +import WayofTime.alchemicalWizardry.common.items.*; +import WayofTime.alchemicalWizardry.common.items.potion.*; +import WayofTime.alchemicalWizardry.common.items.sigil.*; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Items; +import net.minecraft.item.Item; + +/** + * Created with IntelliJ IDEA. + * User: Pokefenn + * Date: 17/01/14 + * Time: 19:48 + */ +public class ModItems +{ + public static Item weakBloodOrb; + public static Item apprenticeBloodOrb; + public static Item magicianBloodOrb; + public static Item energyBlaster; + public static Item energySword; + public static Item lavaCrystal; + public static Item waterSigil; + public static Item lavaSigil; + public static Item voidSigil; + public static Item blankSlate; + public static Item reinforcedSlate; + public static Item sacrificialDagger; + public static Item daggerOfSacrifice; + public static Item airSigil; + public static Item sigilOfTheFastMiner; + public static Item sigilOfElementalAffinity; + public static Item sigilOfHaste; + public static Item sigilOfHolding; + public static Item divinationSigil; + public static Item waterScribeTool; + public static Item fireScribeTool; + public static Item earthScribeTool; + public static Item airScribeTool; + public static Item activationCrystal; + public static Item boundPickaxe; + public static Item boundAxe; + public static Item boundShovel; + public static Item boundHelmet; + public static Item boundPlate; + public static Item boundLeggings; + public static Item boundBoots; + public static Item weakBloodShard; + public static Item growthSigil; + public static Item blankSpell; + public static Item masterBloodOrb; + public static Item alchemyFlask; + public static Item standardBindingAgent; + public static Item mundanePowerCatalyst; + public static Item averagePowerCatalyst; + public static Item greaterPowerCatalyst; + public static Item mundaneLengtheningCatalyst; + public static Item averageLengtheningCatalyst; + public static Item greaterLengtheningCatalyst; + public static Item incendium; + public static Item magicales; + public static Item sanctus; + public static Item aether; + public static Item simpleCatalyst; + public static Item crepitous; + public static Item crystallos; + public static Item terrae; + public static Item aquasalus; + public static Item tennebrae; + public static Item demonBloodShard; + public static Item archmageBloodOrb; + public static Item sigilOfWind; + public static Item telepositionFocus; + public static Item enhancedTelepositionFocus; + public static Item reinforcedTelepositionFocus; + public static Item demonicTelepositionFocus; + public static Item imbuedSlate; + public static Item demonicSlate; + public static Item duskScribeTool; + public static Item sigilOfTheBridge; + public static Item armourInhibitor; + public static Item creativeFiller; + public static Item demonPlacer; + + public static Item weakFillingAgent; + public static Item standardFillingAgent; + public static Item enhancedFillingAgent; + public static Item weakBindingAgent; + public static Item itemRitualDiviner; + public static Item sanguineHelmet; + public static Item focusBloodBlast; + public static Item focusGravityWell; + public static Item sigilOfMagnetism; + public static Item itemKeyOfDiablo; + public static Item energyBazooka; + public static Item itemBloodLightSigil; + public static Item itemComplexSpellCrystal; + public static Item itemBloodFrame; + + public static Item bucketLife; + + public static void init() + { + weakBloodOrb = new EnergyBattery(5000).setUnlocalizedName("weakBloodOrb"); + apprenticeBloodOrb = new ApprenticeBloodOrb(25000).setUnlocalizedName("apprenticeBloodOrb"); + magicianBloodOrb = new MagicianBloodOrb(150000).setUnlocalizedName("magicianBloodOrb"); + masterBloodOrb = new MasterBloodOrb(1000000).setUnlocalizedName("masterBloodOrb"); + archmageBloodOrb = new ArchmageBloodOrb(10000000).setUnlocalizedName("archmageBloodOrb"); + energyBlaster = new EnergyBlast().setUnlocalizedName("energyBlast"); + energySword = new EnergySword().setUnlocalizedName("energySword"); + lavaCrystal = new LavaCrystal().setUnlocalizedName("lavaCrystal"); + waterSigil = new WaterSigil().setUnlocalizedName("waterSigil"); + lavaSigil = new LavaSigil().setUnlocalizedName("lavaSigil"); + voidSigil = new VoidSigil().setUnlocalizedName("voidSigil"); + blankSlate = new AWBaseItems().setUnlocalizedName("blankSlate"); + reinforcedSlate = new AWBaseItems().setUnlocalizedName("reinforcedSlate"); + sacrificialDagger = new SacrificialDagger().setUnlocalizedName("sacrificialDagger"); + daggerOfSacrifice = new DaggerOfSacrifice().setUnlocalizedName("daggerOfSacrifice"); + airSigil = new AirSigil().setUnlocalizedName("airSigil"); + sigilOfTheFastMiner = new SigilOfTheFastMiner().setUnlocalizedName("sigilOfTheFastMiner"); + sigilOfElementalAffinity = new SigilOfElementalAffinity().setUnlocalizedName("sigilOfElementalAffinity"); + sigilOfHaste = new SigilOfHaste().setUnlocalizedName("sigilOfHaste"); + sigilOfHolding = new SigilOfHolding().setUnlocalizedName("sigilOfHolding"); + divinationSigil = new DivinationSigil().setUnlocalizedName("divinationSigil"); + waterScribeTool = new WaterScribeTool().setUnlocalizedName("waterScribeTool"); + fireScribeTool = new FireScribeTool().setUnlocalizedName("fireScribeTool"); + earthScribeTool = new EarthScribeTool().setUnlocalizedName("earthScribeTool"); + airScribeTool = new AirScribeTool().setUnlocalizedName("airScribeTool"); + activationCrystal = new ActivationCrystal(); + boundPickaxe = new BoundPickaxe().setUnlocalizedName("boundPickaxe"); + boundAxe = new BoundAxe().setUnlocalizedName("boundAxe"); + boundShovel = new BoundShovel().setUnlocalizedName("boundShovel"); + boundHelmet = new BoundArmour(0).setUnlocalizedName("boundHelmet"); + boundPlate = new BoundArmour(1).setUnlocalizedName("boundPlate"); + boundLeggings = new BoundArmour(2).setUnlocalizedName("boundLeggings"); + boundBoots = new BoundArmour(3).setUnlocalizedName("boundBoots"); + weakBloodShard = new BloodShard().setUnlocalizedName("weakBloodShard"); + growthSigil = new SigilOfGrowth().setUnlocalizedName("growthSigil"); + blankSpell = new BlankSpell().setUnlocalizedName("blankSpell"); + alchemyFlask = new AlchemyFlask().setUnlocalizedName("alchemyFlask"); + standardBindingAgent = new StandardBindingAgent().setUnlocalizedName("standardBindingAgent"); + mundanePowerCatalyst = new MundanePowerCatalyst().setUnlocalizedName("mundanePowerCatalyst"); + averagePowerCatalyst = new AveragePowerCatalyst().setUnlocalizedName("averagePowerCatalyst"); + greaterPowerCatalyst = new GreaterPowerCatalyst().setUnlocalizedName("greaterPowerCatalyst"); + mundaneLengtheningCatalyst = new MundaneLengtheningCatalyst().setUnlocalizedName("mundaneLengtheningCatalyst"); + averageLengtheningCatalyst = new AverageLengtheningCatalyst().setUnlocalizedName("averageLengtheningCatalyst"); + greaterLengtheningCatalyst = new GreaterLengtheningCatalyst().setUnlocalizedName("greaterLengtheningCatalyst"); + incendium = new AlchemyReagent().setUnlocalizedName("incendium"); + magicales = new AlchemyReagent().setUnlocalizedName("magicales"); + sanctus = new AlchemyReagent().setUnlocalizedName("sanctus"); + aether = new AlchemyReagent().setUnlocalizedName("aether"); + simpleCatalyst = new AlchemyReagent().setUnlocalizedName("simpleCatalyst"); + crepitous = new AlchemyReagent().setUnlocalizedName("crepitous"); + crystallos = new AlchemyReagent().setUnlocalizedName("crystallos"); + terrae = new AlchemyReagent().setUnlocalizedName("terrae"); + aquasalus = new AlchemyReagent().setUnlocalizedName("aquasalus"); + tennebrae = new AlchemyReagent().setUnlocalizedName("tennebrae"); + demonBloodShard = new BloodShard().setUnlocalizedName("demonBloodShard"); + sigilOfWind = new SigilOfWind().setUnlocalizedName("sigilOfWind"); + telepositionFocus = new TelepositionFocus(1).setUnlocalizedName("telepositionFocus"); + enhancedTelepositionFocus = new EnhancedTelepositionFocus().setUnlocalizedName("enhancedTelepositionFocus"); + reinforcedTelepositionFocus = new ReinforcedTelepositionFocus().setUnlocalizedName("reinforcedTelepositionFocus"); + demonicTelepositionFocus = new DemonicTelepositionFocus().setUnlocalizedName("demonicTelepositionFocus"); + imbuedSlate = new AWBaseItems().setUnlocalizedName("imbuedSlate"); + demonicSlate = new AWBaseItems().setUnlocalizedName("demonicSlate"); + duskScribeTool = new DuskScribeTool().setUnlocalizedName("duskScribeTool"); + sigilOfTheBridge = new SigilOfTheBridge().setUnlocalizedName("sigilOfTheBridge"); + armourInhibitor = new ArmourInhibitor().setUnlocalizedName("armourInhibitor"); + creativeFiller = new CheatyItem().setUnlocalizedName("cheatyItem"); + demonPlacer = new DemonPlacer().setUnlocalizedName("demonPlacer"); + weakFillingAgent = new WeakFillingAgent().setUnlocalizedName("weakFillingAgent"); + standardFillingAgent = new StandardFillingAgent().setUnlocalizedName("standardFillingAgent"); + enhancedFillingAgent = new EnhancedFillingAgent().setUnlocalizedName("enhancedFillingAgent"); + weakBindingAgent = new WeakBindingAgent().setUnlocalizedName("weakBindingAgent"); + itemRitualDiviner = new ItemRitualDiviner().setUnlocalizedName("ritualDiviner"); + sigilOfMagnetism = new SigilOfMagnetism().setUnlocalizedName("sigilOfMagnetism"); + itemKeyOfDiablo = new ItemDiabloKey().setUnlocalizedName("itemDiabloKey"); + energyBazooka = new EnergyBazooka().setUnlocalizedName("energyBazooka"); + itemBloodLightSigil = new ItemBloodLightSigil().setUnlocalizedName("bloodLightSigil"); + itemComplexSpellCrystal = new ItemComplexSpellCrystal().setUnlocalizedName("itemComplexSpellCrystal"); + bucketLife = (new LifeBucket(ModBlocks.blockLifeEssence)).setUnlocalizedName("bucketLife").setContainerItem(Items.bucket).setCreativeTab(CreativeTabs.tabMisc); + } + + public static void registerItems() + { + GameRegistry.registerItem(ModItems.weakBloodOrb, "weakBloodOrb"); + GameRegistry.registerItem(ModItems.apprenticeBloodOrb, "apprenticeBloodOrb"); + GameRegistry.registerItem(ModItems.magicianBloodOrb, "magicianBloodOrb"); + GameRegistry.registerItem(ModItems.energyBlaster, "energyBlaster"); + + GameRegistry.registerItem(ModItems.energySword, "energySword"); + GameRegistry.registerItem(ModItems.lavaCrystal, "lavaCrystal"); + GameRegistry.registerItem(ModItems.waterSigil, "waterSigil"); + GameRegistry.registerItem(ModItems.lavaSigil, "lavaSigil"); + GameRegistry.registerItem(ModItems.voidSigil, "voidSigil"); + GameRegistry.registerItem(ModItems.blankSlate, "blankSlate"); + GameRegistry.registerItem(ModItems.reinforcedSlate, "reinforcedSlate"); + GameRegistry.registerItem(ModItems.sacrificialDagger, "sacrificialKnife"); + GameRegistry.registerItem(ModItems.daggerOfSacrifice, "daggerOfSacrifice"); + GameRegistry.registerItem(ModItems.airSigil, "airSigil"); + GameRegistry.registerItem(ModItems.sigilOfTheFastMiner, "sigilOfTheFastMiner"); + GameRegistry.registerItem(ModItems.sigilOfElementalAffinity, "sigilOfElementalAffinity"); + GameRegistry.registerItem(ModItems.sigilOfHaste, "sigilOfHaste"); + GameRegistry.registerItem(ModItems.sigilOfHolding, "sigilOfHolding"); + GameRegistry.registerItem(ModItems.divinationSigil, "divinationSigil"); + GameRegistry.registerItem(ModItems.waterScribeTool, "waterScribeTool"); + GameRegistry.registerItem(ModItems.fireScribeTool, "fireScribeTool"); + GameRegistry.registerItem(ModItems.earthScribeTool, "earthScribeTool"); + GameRegistry.registerItem(ModItems.airScribeTool, "airScribeTool"); + GameRegistry.registerItem(ModItems.activationCrystal, "activationCrystal"); + GameRegistry.registerItem(ModItems.boundPickaxe, "boundPickaxe"); + GameRegistry.registerItem(ModItems.boundAxe, "boundAxe"); + GameRegistry.registerItem(ModItems.boundShovel, "boundShovel"); + GameRegistry.registerItem(ModItems.boundHelmet, "boundHelmet"); + GameRegistry.registerItem(ModItems.boundPlate, "boundPlate"); + GameRegistry.registerItem(ModItems.boundLeggings, "boundLeggings"); + GameRegistry.registerItem(ModItems.boundBoots, "boundBoots"); + GameRegistry.registerItem(ModItems.weakBloodShard, "weakBloodShard"); + GameRegistry.registerItem(ModItems.growthSigil, "growthSigil"); + GameRegistry.registerItem(ModItems.blankSpell, "blankSpell"); + GameRegistry.registerItem(ModItems.masterBloodOrb, "masterBloodOrb"); + GameRegistry.registerItem(ModItems.alchemyFlask, "alchemyFlask"); + GameRegistry.registerItem(ModItems.standardBindingAgent, "standardBindingAgent"); + GameRegistry.registerItem(ModItems.mundanePowerCatalyst, "mundanePowerCatalyst"); + GameRegistry.registerItem(ModItems.averagePowerCatalyst, "averagePowerCatalyst"); + GameRegistry.registerItem(ModItems.greaterPowerCatalyst, "greaterPowerCatalyst"); + GameRegistry.registerItem(ModItems.mundaneLengtheningCatalyst, "mundaneLengtheningCatalyst"); + GameRegistry.registerItem(ModItems.averageLengtheningCatalyst, "averageLengtheningCatalyst"); + GameRegistry.registerItem(ModItems.greaterLengtheningCatalyst, "greaterLengtheningCatalyst"); + GameRegistry.registerItem(ModItems.incendium, "incendium"); + GameRegistry.registerItem(ModItems.magicales, "magicales"); + GameRegistry.registerItem(ModItems.sanctus, "sanctus"); + GameRegistry.registerItem(ModItems.aether, "aether"); + GameRegistry.registerItem(ModItems.simpleCatalyst, "simpleCatalyst"); + GameRegistry.registerItem(ModItems.crepitous, "crepitous"); + GameRegistry.registerItem(ModItems.crystallos, "crystallos"); + GameRegistry.registerItem(ModItems.terrae, "terrae"); + GameRegistry.registerItem(ModItems.aquasalus, "aquasalus"); + GameRegistry.registerItem(ModItems.tennebrae, "tennebrae"); + GameRegistry.registerItem(ModItems.demonBloodShard, "demonBloodShard"); + GameRegistry.registerItem(ModItems.archmageBloodOrb, "archmageBloodOrb"); + GameRegistry.registerItem(ModItems.sigilOfWind, "sigilOfWind"); + GameRegistry.registerItem(ModItems.telepositionFocus, "telepositionFocus"); + GameRegistry.registerItem(ModItems.enhancedTelepositionFocus, "enhancedTelepositionFocus"); + GameRegistry.registerItem(ModItems.reinforcedTelepositionFocus, "reinforcedTelepositionFocus"); + GameRegistry.registerItem(ModItems.demonicTelepositionFocus, "demonicTelepositionFocus"); + GameRegistry.registerItem(ModItems.imbuedSlate, "imbuedSlate"); + GameRegistry.registerItem(ModItems.demonicSlate, "demonicSlate"); + GameRegistry.registerItem(ModItems.duskScribeTool, "duskScribeTool"); + GameRegistry.registerItem(ModItems.sigilOfTheBridge, "sigilOfTheBridge"); + GameRegistry.registerItem(ModItems.armourInhibitor, "armourInhibitor"); + GameRegistry.registerItem(ModItems.creativeFiller, "creativeFiller"); + GameRegistry.registerItem(ModItems.demonPlacer, "demonPlacer"); + + GameRegistry.registerItem(ModItems.weakFillingAgent, "weakFillingAgent"); + GameRegistry.registerItem(ModItems.standardFillingAgent, "standardFillingAgent"); + GameRegistry.registerItem(ModItems.enhancedFillingAgent, "enhancedFillingAgent"); + GameRegistry.registerItem(ModItems.weakBindingAgent, "weakBindingAgent"); + GameRegistry.registerItem(ModItems.itemRitualDiviner, "itemRitualDiviner"); + //GameRegistry.registerItem(ModItems.sanguineHelmet, "sanguineHelmet"); + //GameRegistry.registerItem(ModItems.focusBloodBlast, "focusBloodBlast"); + //GameRegistry.registerItem(ModItems.focusGravityWell, "focusGravityWell"); + GameRegistry.registerItem(ModItems.sigilOfMagnetism, "sigilOfMagnetism"); + GameRegistry.registerItem(ModItems.itemKeyOfDiablo, "itemKeyOfDiablo"); + GameRegistry.registerItem(ModItems.energyBazooka, "energyBazooka"); + GameRegistry.registerItem(ModItems.itemBloodLightSigil, "itemBloodLightSigil"); + GameRegistry.registerItem(ModItems.itemComplexSpellCrystal, "itemComplexSpellCrystal"); + GameRegistry.registerItem(ModItems.bucketLife, "bucketLife"); + //GameRegistry.registerItem(ModItems.itemBloodFrame, "itemBloodFrame"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java new file mode 100644 index 00000000..e9bf768f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -0,0 +1,132 @@ +package WayofTime.alchemicalWizardry.client; + +import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.CommonProxy; +import WayofTime.alchemicalWizardry.common.EntityAirElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityEarthElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFireElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityHolyElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade; +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.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderConduit; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderPedestal; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderPlinth; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderWritingTable; +import WayofTime.alchemicalWizardry.common.renderer.block.TEAltarRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEAltarItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEConduitItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEffectBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBileDemon; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBoulderFist; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderElemental; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderFallenAngel; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderIceDemon; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderLowerGuardian; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderShade; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderSmallEarthGolem; +import WayofTime.alchemicalWizardry.common.renderer.mob.RenderWingedFireDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBileDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBoulderFist; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelElemental; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelFallenAngel; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelIceDemon; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelLowerGuardian; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelShade; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSmallEarthGolem; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelWingedFireDemon; +import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBazookaMainProjectile; +import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderEnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.renderer.projectile.RenderMeteor; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; + +public class ClientProxy extends CommonProxy +{ + public static int renderPass; + public static int altarRenderType; + + @Override + public void registerRenderers() + { + //altarRenderType = RenderingRegistry.getNextAvailableRenderId(); + RenderingRegistry.registerEntityRenderingHandler(EnergyBlastProjectile.class, new RenderEnergyBlastProjectile()); + RenderingRegistry.registerEntityRenderingHandler(EntityEnergyBazookaMainProjectile.class, new RenderEnergyBazookaMainProjectile()); + RenderingRegistry.registerEntityRenderingHandler(EntitySpellProjectile.class, new RenderEnergyBlastProjectile()); + RenderingRegistry.registerEntityRenderingHandler(EntityMeteor.class, new RenderMeteor()); + //EntityRegistry.registerGlobalEntityID(EntityFallenAngel.class, "AlchemicalWizardry.FallenAngel", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityFallenAngel.class, new RenderFallenAngel(new ModelFallenAngel(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityLowerGuardian.class, "AlchemicalWizardry.LowerGuardian", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityLowerGuardian.class, new RenderLowerGuardian(new ModelLowerGuardian(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityBileDemon.class, "AlchemicalWizardry.BileDemon", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityBileDemon.class, new RenderBileDemon(new ModelBileDemon(), 1.5F)); + //EntityRegistry.registerGlobalEntityID(EntityWingedFireDemon.class, "AlchemicalWizardry.WingedFireDemon", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityWingedFireDemon.class, new RenderWingedFireDemon(new ModelWingedFireDemon(), 1.0F)); + //EntityRegistry.registerGlobalEntityID(EntitySmallEarthGolem.class, "AlchemicalWizardry.SmallEarthGolem", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntitySmallEarthGolem.class, new RenderSmallEarthGolem(new ModelSmallEarthGolem(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityIceDemon.class, "AlchemicalWizardry.IceDemon", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityIceDemon.class, new RenderIceDemon(new ModelIceDemon(), 0.5F)); + // EntityRegistry.registerGlobalEntityID(EntityBoulderFist.class, "AlchemicalWizardry.BoulderFist", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityBoulderFist.class, new RenderBoulderFist(new ModelBoulderFist(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityShade.class, "AlchemicalWizardry.Shade", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityShade.class, new RenderShade(new ModelShade(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityAirElemental.class, "AlchemicalWizardry.AirElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityAirElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityWaterElemental.class, "AlchemicalWizardry.WaterElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityWaterElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityEarthElemental.class, "AlchemicalWizardry.EarthElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityEarthElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityFireElemental.class, "AlchemicalWizardry.FireElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityFireElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityShadeElemental.class, "AlchemicalWizardry.ShadeElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityShadeElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + //EntityRegistry.registerGlobalEntityID(EntityHolyElemental.class, "AlchemicalWizardry.HolyElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); + RenderingRegistry.registerEntityRenderingHandler(EntityHolyElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + ClientRegistry.bindTileEntitySpecialRenderer(TEPedestal.class, new RenderPedestal()); + ClientRegistry.bindTileEntitySpecialRenderer(TEPlinth.class, new RenderPlinth()); + ClientRegistry.bindTileEntitySpecialRenderer(TEWritingTable.class, new RenderWritingTable()); + ClientRegistry.bindTileEntitySpecialRenderer(TEConduit.class, new RenderConduit()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellEffectBlock.class, new RenderSpellEffectBlock()); + + //Item Renderer stuff + //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockConduit.blockID, new TEConduitItemRenderer()); + //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellEffect.blockID, new TESpellEffectBlockItemRenderer()); + //RenderingRegistry.registerEntityRenderingHandler(FireProjectile.class, new RenderFireProjectile()); + //RenderingRegistry.registerBlockHandler(new AltarRenderer()); + } + + @Override + public World getClientWorld() + { + return FMLClientHandler.instance().getClient().theWorld; + } + + @Override + public void InitRendering() + { + ClientRegistry.bindTileEntitySpecialRenderer(TEAltar.class, new TEAltarRenderer()); + //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockAltar.blockID, new TEAltarItemRenderer()); + //MinecraftForgeClient.registerItemRenderer(AlchemicalWizardry.blockWritingTable.blockID, new TEWritingTableItemRenderer()); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java new file mode 100644 index 00000000..d84a11dd --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -0,0 +1,298 @@ +package WayofTime.alchemicalWizardry.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerCapabilities; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.potion.Potion; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import cpw.mods.fml.common.ObfuscationReflectionHelper; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; +import cpw.mods.fml.common.gameevent.TickEvent.Type; +import cpw.mods.fml.relauncher.ReflectionHelper; + +public class AlchemicalWizardryEventHooks +{ + public static Map playerFlightBuff = new HashMap(); + public static Map playerBoostStepHeight = new HashMap(); + public static List playersWith1Step = new ArrayList(); + + @SubscribeEvent + public void onLivingJumpEvent(LivingJumpEvent event) + { + if (event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionBoost)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionBoost).getAmplifier(); + event.entityLiving.motionY += (0.1f) * (2 + i); + } + } + + @SubscribeEvent + public void onEntityDamaged(LivingAttackEvent event) + { + EntityLivingBase entityAttacked = event.entityLiving; + + if (entityAttacked.isPotionActive(AlchemicalWizardry.customPotionReciprocation)) + { + Entity entityAttacking = event.source.getSourceOfDamage(); + + if (entityAttacking != null && entityAttacking instanceof EntityLivingBase) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionReciprocation).getAmplifier(); + float damageRecieve = event.ammount / 2 * (i + 1); + ((EntityLivingBase) entityAttacking).attackEntityFrom(DamageSource.generic, damageRecieve); + } + } + + if(entityAttacked.isPotionActive(AlchemicalWizardry.customPotionFlameCloak)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFlameCloak).getAmplifier(); + + Entity entityAttacking = event.source.getSourceOfDamage(); + + if(entityAttacking != null && entityAttacking instanceof EntityLivingBase && !entityAttacking.isImmuneToFire() && !((EntityLivingBase)entityAttacking).isPotionActive(Potion.fireResistance)) + { + entityAttacking.attackEntityFrom(DamageSource.inFire, 2*i+2); + entityAttacking.setFire(3); + } + } + } + +// @ForgeSubscribe +// public void onFOVUpdate(FOVUpdateEvent event) +// { +// event.setResult(Result.DEFAULT); +// } + + @SubscribeEvent + public void onPlayerTickEnd(PlayerTickEvent event) + { + if(event.type.equals(Type.PLAYER) && event.phase.equals(TickEvent.Phase.END)) + { + ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, event.player.capabilities, Float.valueOf(0.1f), new String[]{"walkSpeed", "g", "field_75097_g"}); + } + } + + @SubscribeEvent + public void onEntityUpdate(LivingUpdateEvent event) + { + EntityLivingBase entityLiving = event.entityLiving; + double x = entityLiving.posX; + double y = entityLiving.posY; + double z = entityLiving.posZ; + + Vec3 blockVector = SpellHelper.getEntityBlockVector(entityLiving); + int xPos = (int)(blockVector.xCoord); + int yPos = (int)(blockVector.yCoord); + int zPos = (int)(blockVector.zCoord); + + if (entityLiving instanceof EntityPlayer && entityLiving.worldObj.isRemote) + { + EntityPlayer entityPlayer = (EntityPlayer) entityLiving; + boolean highStepListed = playersWith1Step.contains(entityPlayer.getDisplayName()); + boolean hasHighStep = entityPlayer.isPotionActive(AlchemicalWizardry.customPotionBoost); + + if (hasHighStep && !highStepListed) + { + playersWith1Step.add(SpellHelper.getUsername(entityPlayer)); + } + + if (!hasHighStep && highStepListed) + { + playersWith1Step.remove(SpellHelper.getUsername(entityPlayer)); + entityPlayer.stepHeight = 0.5F; + } + } + + if (event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionDrowning)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionDrowning).getAmplifier(); + + if (event.entityLiving.worldObj.getWorldTime() % ((int) (20 / (i + 1))) == 0) + { + event.entityLiving.attackEntityFrom(DamageSource.drown, 2); + event.entityLiving.hurtResistantTime = Math.min(event.entityLiving.hurtResistantTime, 20 / (i + 1)); + } + } + + if (event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionBoost)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionBoost).getAmplifier(); + EntityLivingBase entity = event.entityLiving; + //if(!entity.isSneaking()) + { + double percentIncrease = (i + 1) * 0.03d; + + if (event.entityLiving instanceof EntityPlayer) + { + EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; + entityPlayer.stepHeight = 1.0f; + + if (!entityPlayer.worldObj.isRemote) + { + float speed = ((Float) ReflectionHelper.getPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, new String[]{"walkSpeed", "g", "field_75097_g"})).floatValue(); + ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(speed + (float) percentIncrease), new String[]{"walkSpeed", "g", "field_75097_g"}); //CAUTION + } + } + } + } + + if (event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionProjProt)) + { + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionProjProt).getAmplifier(); + EntityLivingBase entity = event.entityLiving; + int posX = (int) Math.round(entity.posX - 0.5f); + int posY = (int) Math.round(entity.posY); + int posZ = (int) Math.round(entity.posZ - 0.5f); + int d0 = i; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB(posX - 0.5, posY - 0.5, posZ - 0.5, posX + 0.5, posY + 0.5, posZ + 0.5).expand(d0, d0, d0); + List list = event.entityLiving.worldObj.getEntitiesWithinAABB(Entity.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityLivingBase livingEntity; + + while (iterator.hasNext()) + { + Entity projectile = (Entity) iterator.next(); + + if (projectile == null) + { + continue; + } + + if (!(projectile instanceof IProjectile)) + { + continue; + } + + if (projectile instanceof EntityArrow) + { + if (((EntityArrow) projectile).shootingEntity == null) + { + } else if (!(((EntityArrow) projectile).shootingEntity == null) && ((EntityArrow) projectile).shootingEntity.equals(entity)) + { + break; + } + } else if (projectile instanceof EnergyBlastProjectile) + { + if (!(((EnergyBlastProjectile) projectile).shootingEntity == null) && ((EnergyBlastProjectile) projectile).shootingEntity.equals(entity)) + { + break; + } + } + + double delX = projectile.posX - entity.posX; + double delY = projectile.posY - entity.posY; + double delZ = projectile.posZ - entity.posZ; + double curVel = Math.sqrt(delX * delX + delY * delY + delZ * delZ); + //NOTE: It appears that it constantly reverses the direction. + //Any way to do it only once? Or find the shooting entity? + delX /= curVel; + delY /= curVel; + delZ /= curVel; + double newVel = Math.sqrt(projectile.motionX * projectile.motionX + projectile.motionY * projectile.motionY + projectile.motionZ * projectile.motionZ); + projectile.motionX = newVel * delX; + projectile.motionY = newVel * delY; + projectile.motionZ = newVel * delZ; + //TODO make this not affect player's projectiles + } + } + + if (event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionFlight)) + { + if (event.entityLiving instanceof EntityPlayer) + { + EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; + String ownerName = SpellHelper.getUsername(entityPlayer); + playerFlightBuff.put(ownerName, true); + entityPlayer.capabilities.allowFlying = true; + //entityPlayer.sendPlayerAbilities(); + } + } else + { + if (event.entityLiving instanceof EntityPlayer) + { + EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; + String ownerName = SpellHelper.getUsername(entityPlayer); + + if (!playerFlightBuff.containsKey(ownerName)) + { + playerFlightBuff.put(ownerName, false); + } + + if (playerFlightBuff.get(ownerName)) + { + playerFlightBuff.put(ownerName, false); + + if (!entityPlayer.capabilities.isCreativeMode) + { + entityPlayer.capabilities.allowFlying = false; + entityPlayer.capabilities.isFlying = false; + entityPlayer.sendPlayerAbilities(); + } + } + } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionFlameCloak)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFlameCloak).getAmplifier(); + double range = i*0.5; + + List entities = SpellHelper.getEntitiesInRange(entityLiving.worldObj, x, y, z, range, range); + if(entities!=null) + { + for(Entity entity : entities) + { + if(!entity.equals(entityLiving)&&!entity.isImmuneToFire()&&!(entity instanceof EntityLivingBase && ((EntityLivingBase)entity).isPotionActive(Potion.fireResistance))) + { + entity.setFire(3); + } + } + } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionIceCloak)) + { + if(entityLiving.worldObj.getWorldTime()%2==0) + entityLiving.worldObj.spawnParticle("reddust", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0x74,0xbb,0xfb); + + int r = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionIceCloak).getAmplifier(); + int horizRange = r+1; + int vertRange = 1; + + if(!entityLiving.worldObj.isRemote) + { + for(int i=-horizRange; i<=horizRange;i++) + { + for(int k=-horizRange; k<=horizRange;k++) + { + for(int j=-vertRange-1; j<=vertRange-1; j++) + { + SpellHelper.freezeWaterBlock(entityLiving.worldObj, xPos+i, yPos+j, zPos+k); + } + } + } + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java new file mode 100644 index 00000000..ab5ddad9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java @@ -0,0 +1,71 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +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; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.items.LavaCrystal; +import cpw.mods.fml.common.IFuelHandler; + +public class AlchemicalWizardryFuelHandler implements IFuelHandler +{ + @Override + public int getBurnTime(ItemStack fuel) + { + ItemStack itemStack = fuel; + if(itemStack == null) + { + return 0; + } + + Item fuelItem = itemStack.getItem(); + + if (fuelItem.equals(ModItems.lavaCrystal)) + { + /*ItemStack newItem = new ItemStack(AlchemicalWizardry.lavaCrystal); + newItem.getItem().setDamage(newItem, 50); + fuel.getItem().setContainerItem(((LavaCrystal)newItem.getItem()).change()); + */ + LavaCrystal item = (LavaCrystal) fuel.getItem(); + + if (item.hasEnoughEssence(fuel)) + { + return 200; + } else + { + NBTTagCompound tag = itemStack.stackTagCompound; + + if (tag == null) + { + return 0; + } + + if (MinecraftServer.getServer() == null) + { + return 0; + } + + if (MinecraftServer.getServer().getConfigurationManager() == null) + { + return 0; + } + + EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(tag.getString("ownerName")); + + if (owner == null) + { + return 0; + } + + owner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + return 0; + } + } + + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java new file mode 100644 index 00000000..40eaf0f1 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java @@ -0,0 +1,47 @@ +package WayofTime.alchemicalWizardry.common; + +import java.util.EnumSet; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.PlayerCapabilities; +import net.minecraft.server.MinecraftServer; +import cpw.mods.fml.common.ObfuscationReflectionHelper; + +@Deprecated +public class AlchemicalWizardryTickHandler //implements ITickHandler +{ +// public void tickStart(EnumSet type, Object... tickData) +// { +// } +// +// public EnumSet ticks() +// { +// return EnumSet.of(TickType.PLAYER); +// } +// +// public String getLabel() +// { +// return "BloodMagic"; +// } +// +// public void tickEnd(EnumSet type, Object... tickData) +// { +// String[] usernames = MinecraftServer.getServer().getAllUsernames(); +// +// if (usernames == null) +// { +// return; +// } +// +// for (String userName : usernames) +// { +// EntityPlayer entityPlayer = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(userName); +// +// if (entityPlayer != null) +// { +// ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(0.1f), new String[]{"walkSpeed", "g", "field_75097_g"}); +// //entityPlayer.sendPlayerAbilities(); +// } +// } +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java new file mode 100644 index 00000000..fb4f155b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java @@ -0,0 +1,23 @@ +package WayofTime.alchemicalWizardry.common; + +public class ArmourComponent +{ + private int xOff; + private int zOff; + + public ArmourComponent(int xOff, int zOff) + { + this.xOff = xOff; + this.zOff = zOff; + } + + public int getXOff() + { + return xOff; + } + + public int getZOff() + { + return zOff; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourUpgrade.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourUpgrade.java new file mode 100644 index 00000000..ce14e417 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/ArmourUpgrade.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ArmourUpgrade +{ + //Called when the armour ticks + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack); + + public boolean isUpgrade(); + + public int getEnergyForTenSeconds(); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java new file mode 100644 index 00000000..43c7b129 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java @@ -0,0 +1,91 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityBloodLightProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaSecondaryProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; +import WayofTime.alchemicalWizardry.common.entity.projectile.ExplosionProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.FireProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.IceProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.LightningBoltProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.MudProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.TeleportProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WaterProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WindGustProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.common.registry.GameRegistry; + +public class CommonProxy +{ + public static String ITEMS_PNG = "/WayofTime/alchemicalWizardry/items.png"; + public static String BLOCK_PNG = "/WayofTime/alchemicalWizardry/block.png"; + + // Client stuff + public void registerRenderers() + { + // Nothing here as the server doesn't render graphics! + } + + public void registerEntities() + { + } + + public World getClientWorld() + { + return null; + } + + public void registerActions() + { + } + + public void registerEvents() + { + } + + public void registerSoundHandler() + { + // Nothing here as this is a server side proxy + } + + public void registerTileEntities() + { + GameRegistry.registerTileEntity(TEAltar.class, "containerAltar"); + GameRegistry.registerTileEntity(TEMasterStone.class, "containerMasterStone"); + } + + public void registerEntityTrackers() + { + EntityRegistry.registerModEntity(EnergyBlastProjectile.class, "energyBlastProjectile", 0, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(FireProjectile.class, "fireProjectile", 1, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(IceProjectile.class, "iceProjectile", 2, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(ExplosionProjectile.class, "explosionProjectile", 3, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(HolyProjectile.class, "holyProjectile", 4, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(WindGustProjectile.class, "windGustProjectile", 5, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(LightningBoltProjectile.class, "lightningBoltProjectile", 6, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(WaterProjectile.class, "waterProjectile", 7, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(MudProjectile.class, "mudProjectile", 8, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(TeleportProjectile.class, "teleportProjectile", 9, AlchemicalWizardry.instance, 128, 5, true); + EntityRegistry.registerModEntity(EntityEnergyBazookaMainProjectile.class, "energyBazookaMain", 10, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntityEnergyBazookaSecondaryProjectile.class, "energyBazookaSecondary", 11, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntityBloodLightProjectile.class, "bloodLightProjectile", 12, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntityMeteor.class, "Meteor", 13, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntitySpellProjectile.class, "spellProjectile", 14, AlchemicalWizardry.instance, 128, 3, true); + } + + public void registerTickHandlers() + { + } + + public void InitRendering() + { + // TODO Auto-generated method stub + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java new file mode 100644 index 00000000..dffc65cf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java @@ -0,0 +1,5 @@ +package WayofTime.alchemicalWizardry.common; + +public class EntityAIFly +{ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java new file mode 100644 index 00000000..2b6fb25a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java @@ -0,0 +1,24 @@ +package WayofTime.alchemicalWizardry.common; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityDemon; +import net.minecraft.entity.ai.EntityAINearestAttackableTarget; + +public class EntityAITargetAggro extends EntityAINearestAttackableTarget +{ + private EntityDemon theCreature; + + public EntityAITargetAggro(EntityDemon par1EntityDemon, Class par2Class, int par3, boolean par4) + { + super(par1EntityDemon, par2Class, par3, par4); + this.theCreature = par1EntityDemon; + } + + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean shouldExecute() + { + return theCreature.isAggro() && super.shouldExecute(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java new file mode 100644 index 00000000..cc5ab8ed --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common; + +import ibxm.Player; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityElemental; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class EntityAirElemental extends EntityElemental implements IMob +{ + public EntityAirElemental(World world) + { + super(world, AlchemicalWizardry.entityAirElementalID); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityPlayer) + { + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)target, target.motionX, target.motionY + 3, target.motionZ); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + } else if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).motionY += 3.0D; + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindable.java new file mode 100644 index 00000000..5ecb1f5b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindable.java @@ -0,0 +1,5 @@ +package WayofTime.alchemicalWizardry.common; + +public interface IBindable +{ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java new file mode 100644 index 00000000..534d4b68 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.common; + +public interface IBindingAgent +{ + public abstract float getSuccessRateForPotionNumber(int potionEffects); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/ICatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/ICatalyst.java new file mode 100644 index 00000000..230cd51c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/ICatalyst.java @@ -0,0 +1,8 @@ +package WayofTime.alchemicalWizardry.common; + +public interface ICatalyst +{ + public abstract int getCatalystLevel(); + + public abstract boolean isConcentration(); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/IDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/IDemon.java new file mode 100644 index 00000000..eab1d15e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/IDemon.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common; + +public interface IDemon +{ + public abstract void setSummonedConditions(); + + public boolean isAggro(); + + public void setAggro(boolean aggro); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java new file mode 100644 index 00000000..2202a20d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.common; + +public interface IFillingAgent +{ + public abstract int getFilledAmountForPotionNumber(int potionEffects); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java new file mode 100644 index 00000000..472d5302 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java @@ -0,0 +1,42 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.event.entity.player.FillBucketEvent; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.ModItems; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class LifeBucketHandler +{ + @SubscribeEvent + public void onBucketFill(FillBucketEvent event) + { + ItemStack result = fillCustomBucket(event.world, event.target); + + if (result == null) + { + return; + } + + event.result = result; + event.setResult(Result.ALLOW); + } + + public ItemStack fillCustomBucket(World world, MovingObjectPosition pos) + { + Block block = world.getBlock(pos.blockX, pos.blockY, pos.blockZ); + + if (block!=null && (block.equals(ModBlocks.blockLifeEssence)) && world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ) == 0) + { + world.setBlock(pos.blockX, pos.blockY, pos.blockZ, block); + return new ItemStack(ModItems.bucketLife); + } else + { + return null; + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssence.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssence.java new file mode 100644 index 00000000..22ede879 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssence.java @@ -0,0 +1,28 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraftforge.fluids.Fluid; + +public class LifeEssence extends Fluid +{ + public LifeEssence(String fluidName) + { + super(fluidName); + //setUnlocalizedName("lifeEssence"); + //setBlockID(id); + this.setDensity(2000); + this.setViscosity(2000); + //this.setFlowingIcon(flowingIcon) + } + + @Override + public int getColor() + { + return 0xEEEEEE; + } + + @Override + public String getLocalizedName() + { + return "Life Essence"; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssenceNetwork.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssenceNetwork.java new file mode 100644 index 00000000..3eadeea0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/LifeEssenceNetwork.java @@ -0,0 +1,26 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.nbt.NBTTagCompound; + +public class LifeEssenceNetwork extends net.minecraft.world.WorldSavedData +{ + public int currentEssence; + + public LifeEssenceNetwork(String par1Str) + { + super(par1Str); + currentEssence = 0; + } + + @Override + public void readFromNBT(NBTTagCompound nbttagcompound) + { + currentEssence = nbttagcompound.getInteger("currentEssence"); + } + + @Override + public void writeToNBT(NBTTagCompound nbttagcompound) + { + nbttagcompound.setInteger("currentEssence", currentEssence); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java new file mode 100644 index 00000000..3659dbfe --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java @@ -0,0 +1,36 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import WayofTime.alchemicalWizardry.ModItems; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class ModLivingDropsEvent +{ + public static double rand; + + @SubscribeEvent + public void onEntityDrop(LivingDropsEvent event) + { + if (event.source.getDamageType().equals("player")) + { + rand = Math.random(); + + if (!(event.entityLiving instanceof EntityAnimal)) + { + PotionEffect effect = event.entityLiving.getActivePotionEffect(Potion.weakness); + + if (effect != null) + { + if (effect.getAmplifier() >= 2) + if (rand < 0.50d) + { + event.entityLiving.dropItem(ModItems.weakBloodShard, 1); + } + } + } + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java new file mode 100644 index 00000000..9f95230f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java @@ -0,0 +1,686 @@ +package WayofTime.alchemicalWizardry.common; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.EnumMap; + +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** +* Handles the packet wrangling for IronChest +* @author cpw +* +*/ +public enum NewPacketHandler +{ + INSTANCE; + + /** + * Our channel "pair" from {@link NetworkRegistry} + */ + private EnumMap channels; + + + /** + * Make our packet handler, and add an {@link IronChestCodec} always + */ + private NewPacketHandler() + { + // request a channel pair for IronChest from the network registry + // Add the IronChestCodec as a member of both channel pipelines + this.channels = NetworkRegistry.INSTANCE.newChannel("BloodMagic", new TEAltarCodec(), new TEOrientableCodec(), new TEPedestalCodec(), new TEPlinthCodec(), new TESocketCodec()); + if (FMLCommonHandler.instance().getSide() == Side.CLIENT) + { + addClientHandler(); + } + } + + + /** + * This is only called on the client side - it adds an + * {@link IronChestMessageHandler} to the client side pipeline, since the + * only place we expect to handle messages is on the client. + */ + @SideOnly(Side.CLIENT) + private void addClientHandler() + { + FMLEmbeddedChannel clientChannel = this.channels.get(Side.CLIENT); + // These two lines find the existing codec (Ironchestcodec) and insert our message handler after it + // in the pipeline + String tileAltarCodec = clientChannel.findChannelHandlerNameForType(TEAltarCodec.class); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEAltarHandler", new TEAltarMessageHandler()); + + String tileOrientableCodec = clientChannel.findChannelHandlerNameForType(TEOrientableCodec.class); + clientChannel.pipeline().addAfter(tileOrientableCodec, "TEOrientableHandler", new TEOrientableMessageHandler()); + + String tilePedestalCodec = clientChannel.findChannelHandlerNameForType(TEPedestalCodec.class); + clientChannel.pipeline().addAfter(tilePedestalCodec, "TEPedestalHandler", new TEPedestalMessageHandler()); + + String tilePlinthCodec = clientChannel.findChannelHandlerNameForType(TEPlinthCodec.class); + clientChannel.pipeline().addAfter(tilePlinthCodec, "TEPlinthHandler", new TEPlinthMessageHandler()); + + String tileSocketCodec = clientChannel.findChannelHandlerNameForType(TESocketCodec.class); + clientChannel.pipeline().addAfter(tileSocketCodec, "TESocketHandler", new TESocketMessageHandler()); + } + + + /** + * This class simply handles the {@link IronChestMessage} when it's received + * at the client side It can contain client only code, because it's only run + * on the client. + * + * @author cpw + * + */ + private static class TEAltarMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TEAltarMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TEAltar) + { + TEAltar altar = (TEAltar) te; + + altar.handlePacketData(msg.items, msg.fluids, msg.capacity); + } + } + } + + private static class TEOrientableMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TEOrientableMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TEOrientable) + { + TEOrientable tile = (TEOrientable)te; + + ((TEOrientable) te).setInputDirection(ForgeDirection.getOrientation(msg.input)); + ((TEOrientable) te).setOutputDirection(ForgeDirection.getOrientation(msg.output)); + } + } + } + + private static class TEPedestalMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TEPedestalMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TEPedestal) + { + TEPedestal pedestal = (TEPedestal) te; + + pedestal.handlePacketData(msg.items); + } + } + } + + private static class TEPlinthMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TEPlinthMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TEPlinth) + { + TEPlinth Plinth = (TEPlinth) te; + + Plinth.handlePacketData(msg.items); + } + } + } + + private static class TESocketMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TESocketMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TESocket) + { + TESocket Socket = (TESocket) te; + + Socket.handlePacketData(msg.items); + } + } + } + + private static class TETeleposerMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TETeleposerMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TETeleposer) + { + TETeleposer Teleposer = (TETeleposer) te; + + Teleposer.handlePacketData(msg.items); + } + } + } + + private static class TEWritingTableMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, TEWritingTableMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); + if (te instanceof TEWritingTable) + { + TEWritingTable WritingTable = (TEWritingTable) te; + + WritingTable.handlePacketData(msg.items); + } + } + } + + public static class TEAltarMessage + { + int x; + int y; + int z; + + int[] items; + int[] fluids; + int capacity; + } + + public static class TEOrientableMessage + { + int x; + int y; + int z; + + int input; + int output; + } + + public static class TEPedestalMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TEPlinthMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TESocketMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TETeleposerMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TEWritingTableMessage + { + int x; + int y; + int z; + + int[] items; + } + + private class TEAltarCodec extends FMLIndexedMessageToMessageCodec + { + public TEAltarCodec() + { + addDiscriminator(0, TEAltarMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TEAltarMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + if(msg.fluids != null) + { + int[] fluids = msg.fluids; + for (int j = 0; j < fluids.length; j++) + { + int i = fluids[j]; + target.writeInt(i); + } + } + + target.writeInt(msg.capacity); + } + + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEAltarMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TEAltar.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TEAltar.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + + msg.fluids = new int[6]; + for (int i = 0; i < msg.fluids.length; i++) + { + msg.fluids[i] = dat.readInt(); + } + + msg.capacity = dat.readInt(); + } + } + + private class TEOrientableCodec extends FMLIndexedMessageToMessageCodec + { + public TEOrientableCodec() + { + addDiscriminator(0, TEOrientableMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TEOrientableMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeInt(msg.input); + target.writeInt(msg.output); + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEOrientableMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + + msg.input = dat.readInt(); + msg.output = dat.readInt(); + } + } + + private class TEPedestalCodec extends FMLIndexedMessageToMessageCodec + { + public TEPedestalCodec() + { + addDiscriminator(0, TEPedestalMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TEPedestalMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPedestalMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TEPedestal.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TEPedestal.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + } + } + + private class TEPlinthCodec extends FMLIndexedMessageToMessageCodec + { + public TEPlinthCodec() + { + addDiscriminator(0, TEPlinthMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TEPlinthMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPlinthMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TEPlinth.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TEPlinth.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + } + } + + private class TESocketCodec extends FMLIndexedMessageToMessageCodec + { + public TESocketCodec() + { + addDiscriminator(0, TESocketMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TESocketMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TESocketMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TESocket.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TESocket.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + } + } + + private class TETeleposerCodec extends FMLIndexedMessageToMessageCodec + { + public TETeleposerCodec() + { + addDiscriminator(0, TETeleposerMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TETeleposerMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TETeleposerMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TETeleposer.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TETeleposer.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + } + } + + private class TEWritingTableCodec extends FMLIndexedMessageToMessageCodec + { + public TEWritingTableCodec() + { + addDiscriminator(0, TEWritingTableMessage.class); + } + + @Override + public void encodeInto(ChannelHandlerContext ctx, TEWritingTableMessage msg, ByteBuf target) throws Exception + { + target.writeInt(msg.x); + target.writeInt(msg.y); + target.writeInt(msg.z); + + target.writeBoolean(msg.items != null); + if (msg.items != null) + { + int[] items = msg.items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEWritingTableMessage msg) + { + msg.x = dat.readInt(); + msg.y = dat.readInt(); + msg.z = dat.readInt(); + int typDat = dat.readByte(); + boolean hasStacks = dat.readBoolean(); + + msg.items = new int[TEWritingTable.sizeInv*3]; + if (hasStacks) + { + msg.items = new int[TEWritingTable.sizeInv*3]; + for (int i = 0; i < msg.items.length; i++) + { + msg.items[i] = dat.readInt(); + } + } + } + } + + //Packets to be obtained + public static Packet getPacket(TEAltar tileAltar) + { + TEAltarMessage msg = new TEAltarMessage(); + msg.x = tileAltar.xCoord; + msg.y = tileAltar.yCoord; + msg.z = tileAltar.zCoord; + msg.items = tileAltar.buildIntDataList(); + msg.fluids = tileAltar.buildFluidList(); + msg.capacity = tileAltar.getCapacity(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TEOrientable tileOrientable) + { + TEOrientableMessage msg = new TEOrientableMessage(); + msg.x = tileOrientable.xCoord; + msg.y = tileOrientable.yCoord; + msg.z = tileOrientable.zCoord; + msg.input = tileOrientable.getIntForForgeDirection(tileOrientable.getInputDirection()); + msg.output = tileOrientable.getIntForForgeDirection(tileOrientable.getOutputDirection()); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TEPedestal tilePedestal) + { + TEPedestalMessage msg = new TEPedestalMessage(); + msg.x = tilePedestal.xCoord; + msg.y = tilePedestal.yCoord; + msg.z = tilePedestal.zCoord; + msg.items = tilePedestal.buildIntDataList(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TEPlinth tilePlinth) + { + TEPlinthMessage msg = new TEPlinthMessage(); + msg.x = tilePlinth.xCoord; + msg.y = tilePlinth.yCoord; + msg.z = tilePlinth.zCoord; + msg.items = tilePlinth.buildIntDataList(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TESocket tileSocket) + { + TESocketMessage msg = new TESocketMessage(); + msg.x = tileSocket.xCoord; + msg.y = tileSocket.yCoord; + msg.z = tileSocket.zCoord; + msg.items = tileSocket.buildIntDataList(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TETeleposer tileTeleposer) + { + TETeleposerMessage msg = new TETeleposerMessage(); + msg.x = tileTeleposer.xCoord; + msg.y = tileTeleposer.yCoord; + msg.z = tileTeleposer.zCoord; + msg.items = tileTeleposer.buildIntDataList(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getPacket(TEWritingTable tileWritingTable) + { + TEWritingTableMessage msg = new TEWritingTableMessage(); + msg.x = tileWritingTable.xCoord; + msg.y = tileWritingTable.yCoord; + msg.z = tileWritingTable.zCoord; + msg.items = tileWritingTable.buildIntDataList(); + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PacketHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PacketHandler.java new file mode 100644 index 00000000..48642e37 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PacketHandler.java @@ -0,0 +1,966 @@ +package WayofTime.alchemicalWizardry.common; + +import ibxm.Player; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteStreams; +import com.jcraft.jogg.Packet; + +public class PacketHandler //implements IPacketHandler +{ +// @Override +// public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) +// { +// if (packet.channel.equals("BloodAltar")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[1 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// int fluidIDMain = dat.readInt(); +// int fluidAmountMain = dat.readInt(); +// int fluidIDOutput = dat.readInt(); +// int fluidAmountOutput = dat.readInt(); +// int fluidIDInput = dat.readInt(); +// int fluidAmountInput = dat.readInt(); +// int capacity = dat.readInt(); +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TEAltar) +// { +// TEAltar tileEntityAltar = (TEAltar) tileEntity; +// FluidStack flMain = new FluidStack(fluidIDMain, fluidAmountMain); +// FluidStack flOutput = new FluidStack(fluidIDOutput, fluidAmountOutput); +// FluidStack flInput = new FluidStack(fluidIDInput, fluidAmountInput); +// tileEntityAltar.handlePacketData(items, flMain, flOutput, flInput, capacity); +// } +// } else if (packet.channel.equals("FallReset")) +// { +// if (player instanceof EntityPlayer) +// { +// ((EntityPlayer) player).fallDistance = 0; +// } +// } else if (packet.channel.equals("particle")) +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// Random rand = new Random(); +// +// try +// { +// double x = din.readDouble(); +// double y = din.readDouble(); +// double z = din.readDouble(); +// short particleType = din.readShort(); +// World world = ((EntityPlayer) player).worldObj; +// +// if (particleType == 1) +// { +// world.spawnParticle("mobSpell", x + 0.5D + rand.nextGaussian() / 8, y + 1.1D, z + 0.5D + rand.nextGaussian() / 8, 0.5117D, 0.0117D, 0.0117D); +// } +// +// if (particleType == 2) +// { +// world.spawnParticle("reddust", x + 0.5D + rand.nextGaussian() / 8, y + 1.1D, z + 0.5D + rand.nextGaussian() / 8, 0.82D, 0.941D, 0.91D); +// } +// +// if (particleType == 3) +// { +// world.spawnParticle("mobSpell", x + 0.5D + rand.nextGaussian() / 8, y + 1.1D, z + 0.5D + rand.nextGaussian() / 8, 1.0D, 0.371D, 0.371D); +// } +// +// if (particleType == 4) +// { +// float f = (float) 1.0F; +// float f1 = f * 0.6F + 0.4F; +// float f2 = f * f * 0.7F - 0.5F; +// float f3 = f * f * 0.6F - 0.7F; +// +// for (int l = 0; l < 8; ++l) +// { +// world.spawnParticle("reddust", x + Math.random() - Math.random(), y + Math.random() - Math.random(), z + Math.random() - Math.random(), f1, f2, f3); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("CustomParticle")) +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// Random rand = new Random(); +// +// try +// { +// World world = ((EntityPlayer) player).worldObj; +// int size = din.readInt(); +// String str = ""; +// +// for (int i = 0; i < size; i++) +// { +// str = str + din.readChar(); +// } +// +// double x = din.readDouble(); +// double y = din.readDouble(); +// double z = din.readDouble(); +// double xVel = din.readDouble(); +// double yVel = din.readDouble(); +// double zVel = din.readDouble(); +// world.spawnParticle(str, x, y, z, xVel, yVel, zVel); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("SetLifeEssence")) //Sets the data for the character +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// +// try +// { +// EntityPlayer user = (EntityPlayer) player; +// int length = din.readInt(); +// String ownerName = ""; +// +// for (int i = 0; i < length; i++) +// { +// ownerName = ownerName + din.readChar(); +// } +// +// int addedEssence = din.readInt(); +// int maxEssence = din.readInt(); +// World world = MinecraftServer.getServer().worldServers[0]; +// LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); +// +// if (data == null) +// { +// data = new LifeEssenceNetwork(ownerName); +// world.setItemData(ownerName, data); +// } +// +// if (addedEssence > 0) +// { +// if (data.currentEssence < maxEssence) +// { +// data.currentEssence = Math.min(maxEssence, data.currentEssence + addedEssence); +// data.markDirty(); +// } +// +// if (!user.capabilities.isCreativeMode) +// { +// for (int i = 0; i < ((addedEssence + 99) / 100); i++) +// { +// //player.setEntityHealth((player.getHealth()-1)); +// user.setHealth((user.getHealth() - 1)); +// +// if (user.getHealth() <= 0.5f) +// { +// //user.inventory.dropAllItems(); +// user.onDeath(DamageSource.generic); +// return; +// } +// } +// } +// } else +// { +// int removedEssence = -addedEssence; +// +// if ((data.currentEssence - removedEssence) >= 0) +// { +// data.currentEssence -= removedEssence; +// data.markDirty(); +// } else +// { +// if (removedEssence >= 100) +// { +// for (int i = 0; i < ((removedEssence + 99) / 100); i++) +// { +// //player.setEntityHealth((player.getHealth()-1)); +// user.setHealth((user.getHealth() - 1)); +// +// if (user.getHealth() <= 0.5f) +// { +// //user.inventory.dropAllItems(); +// user.onDeath(DamageSource.generic); +// return; +// } +// } +// } else +// { +// if (user.worldObj.rand.nextInt(100) <= removedEssence) +// { +// user.setHealth((user.getHealth() - 1)); +// +// if (user.getHealth() <= 0.5f) +// { +// //user.inventory.dropAllItems(); +// user.onDeath(DamageSource.generic); +// return; +// } +// } +// } +// } +// } +// +// //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPacket(ownerName), (Player)user); +//// data.currentEssence = addedEssence; +//// data.markDirty(); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("InfiniteLPPath")) +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// +// try +// { +// EntityPlayer user = (EntityPlayer) player; +// int length = din.readInt(); +// String ownerName = ""; +// +// for (int i = 0; i < length; i++) +// { +// ownerName = ownerName + din.readChar(); +// } +// +// boolean fill = din.readBoolean(); +// World world = MinecraftServer.getServer().worldServers[0]; +// LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); +// +// if (data == null) +// { +// data = new LifeEssenceNetwork(ownerName); +// world.setItemData(ownerName, data); +// } +// +// if (fill) +// { +// data.currentEssence += 1000000; +// data.markDirty(); +// } else +// { +// data.currentEssence = 0; +// data.markDirty(); +// } +// +// //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPacket(ownerName), (Player)user); +//// data.currentEssence = addedEssence; +//// data.markDirty(); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("GetLifeEssence")) +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// +// try +// { +// int length = din.readInt(); +// String ownerName = ""; +// +// for (int i = 0; i < length; i++) +// { +// ownerName = ownerName + din.readChar(); +// } +// +// World world = MinecraftServer.getServer().worldServers[0]; +// LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); +// +// if (data == null) +// { +// data = new LifeEssenceNetwork(ownerName); +// world.setItemData(ownerName, data); +// } +// +// if (player instanceof EntityPlayer) +// { +// EntityPlayer owner = (EntityPlayer) player; +// ChatMessageComponent chatmessagecomponent = new ChatMessageComponent(); +// //chatmessagecomponent.func_111072_b("Current Essence: " + data.currentEssence + "LP"); +// chatmessagecomponent.addText("Current Essence: " + data.currentEssence + "LP"); +// owner.sendChatToPlayer(chatmessagecomponent); +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("GetAltarEssence")) +// { +// ByteArrayInputStream bin = new ByteArrayInputStream(packet.data); +// DataInputStream din = new DataInputStream(bin); +// +// try +// { +// int x = din.readInt(); +// int y = din.readInt(); +// int z = din.readInt(); +// +// if (player instanceof EntityPlayer) +// { +// EntityPlayer owner = (EntityPlayer) player; +// World world = owner.worldObj; +// TEAltar tileEntity = (TEAltar) world.getBlockTileEntity(x, y, z); +// +// if (tileEntity != null) +// { +// int level = UpgradedAltars.isAltarValid(world, x, y, z); +// ChatMessageComponent chatmessagecomponent = new ChatMessageComponent(); +// chatmessagecomponent.addText("Altar's Current Essence: " + tileEntity.getFluidAmount() + "LP" + "\n" + "Altar's Current Tier: " + level + "\nCapacity: " + tileEntity.getCapacity() + "LP"); +// //chatmessagecomponent.addText(); +// owner.sendChatToPlayer(chatmessagecomponent); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// } else if (packet.channel.equals("TESocket")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[1 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TESocket) +// { +// TESocket tileEntityAltar = (TESocket) tileEntity; +// tileEntityAltar.handlePacketData(items); +// } +// } else if (packet.channel.equals("TEWritingTable")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[7 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TEWritingTable) +// { +// TEWritingTable tileEntityAltar = (TEWritingTable) tileEntity; +// tileEntityAltar.handlePacketData(items); +// } +// } else if (packet.channel.equals("TEOrientor")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TEOrientable) +// { +// TEOrientable tileEntityOrientable = (TEOrientable) tileEntity; +// tileEntityOrientable.setInputDirection(ForgeDirection.getOrientation(dat.readInt())); +// tileEntityOrientable.setOutputDirection(ForgeDirection.getOrientation(dat.readInt())); +// world.markBlockForRenderUpdate(x, y, z); +// } +// } else if (packet.channel.equals("TEPedestal")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[1 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TEPedestal) +// { +// TEPedestal tileEntityAltar = (TEPedestal) tileEntity; +// tileEntityAltar.handlePacketData(items); +// } +// } else if (packet.channel.equals("TEPlinth")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[1 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TEPlinth) +// { +// TEPlinth tileEntityAltar = (TEPlinth) tileEntity; +// tileEntityAltar.handlePacketData(items); +// } +// } else if (packet.channel.equals("TETeleposer")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// int x = dat.readInt(); +// int y = dat.readInt(); +// int z = dat.readInt(); +// boolean hasStacks = dat.readByte() != 0; +// int[] items = new int[0]; +// +// if (hasStacks) +// { +// items = new int[1 * 3]; +// +// for (int i = 0; i < items.length; i++) +// { +// items[i] = dat.readInt(); +// } +// } +// +// World world = AlchemicalWizardry.proxy.getClientWorld(); +// TileEntity tileEntity = world.getBlockTileEntity(x, y, z); +// +// if (tileEntity instanceof TETeleposer) +// { +// TETeleposer tileEntityAltar = (TETeleposer) tileEntity; +// tileEntityAltar.handlePacketData(items); +// } +// } else if (packet.channel.equals("SetPlayerVel")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// double xVel = dat.readDouble(); +// double yVel = dat.readDouble(); +// double zVel = dat.readDouble(); +// ((EntityPlayer) player).setVelocity(xVel, yVel, zVel); +// } else if (packet.channel.equals("SetPlayerPos")) +// { +// ByteArrayDataInput dat = ByteStreams.newDataInput(packet.data); +// double xVel = dat.readDouble(); +// double yVel = dat.readDouble(); +// double zVel = dat.readDouble(); +// ((EntityPlayer) player).setPosition(xVel, yVel, zVel); +// } +// } +// +// public static Packet getPacket(TEAltar tileEntity) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// +// FluidStack flMain = tileEntity.getFluid(); +// +// if (flMain == null) +// { +// dos.writeInt(AlchemicalWizardry.lifeEssenceFluid.getBlockID()); +// dos.writeInt(0); +// } else +// { +// dos.writeInt(flMain.fluidID); +// dos.writeInt(flMain.amount); +// } +// +// FluidStack flOut = tileEntity.getOutputFluid(); +// +// if (flOut == null) +// { +// dos.writeInt(AlchemicalWizardry.lifeEssenceFluid.getBlockID()); +// dos.writeInt(0); +// } else +// { +// dos.writeInt(flOut.fluidID); +// dos.writeInt(flOut.amount); +// } +// +// FluidStack flIn = tileEntity.getInputFluid(); +// +// if (flIn == null) +// { +// dos.writeInt(AlchemicalWizardry.lifeEssenceFluid.getBlockID()); +// dos.writeInt(0); +// } else +// { +// dos.writeInt(flIn.fluidID); +// dos.writeInt(flIn.amount); +// } +// +// dos.writeInt(tileEntity.capacity); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "BloodAltar"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(TESocket tileEntity) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TESocket"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(String ownerName, int addedEssence, int maxEssence) +// //Packet to be sent to server to change essence +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(ownerName.length()); +// dos.writeChars(ownerName); +// dos.writeInt(addedEssence); +// dos.writeInt(maxEssence); //Used for Blood Orbs, but does nothing for other items +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "SetLifeEssence"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// //pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(String ownerName) //stores the current essence in the player's NBT +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(ownerName.length()); +// dos.writeChars(ownerName); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "GetLifeEssence"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// //pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getAltarPacket(int x, int y, int z) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(x); +// dos.writeInt(y); +// dos.writeInt(z); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "GetAltarEssence"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// //pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(TEWritingTable tileEntity) +// { +// // TODO Auto-generated method stub +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3 * 7; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TEWritingTable"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(TEPedestal tileEntity) +// { +// // TODO Auto-generated method stub +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3 * 1; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TEPedestal"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(TEPlinth tileEntity) +// { +// // TODO Auto-generated method stub +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3 * 1; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TEPlinth"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getPacket(TETeleposer tileEntity) +// { +// // TODO Auto-generated method stub +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// int[] items = tileEntity.buildIntDataList(); +// boolean hasStacks = (items != null); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeByte(hasStacks ? 1 : 0); +// +// if (hasStacks) +// { +// for (int i = 0; i < 3 * 1; i++) +// { +// dos.writeInt(items[i]); +// } +// } +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TETeleposer"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +// +// public static Packet getCustomParticlePacket(String str, double x, double y, double z, double xVel, double yVel, double zVel) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(str.length()); +// dos.writeChars(str); +// dos.writeDouble(x); +// dos.writeDouble(y); +// dos.writeDouble(z); +// dos.writeDouble(xVel); +// dos.writeDouble(yVel); +// dos.writeDouble(zVel); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "CustomParticle"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = false; +// return pkt; +// } +// +// public static Packet getPlayerVelocitySettingPacket(double xVel, double yVel, double zVel) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeDouble(xVel); +// dos.writeDouble(yVel); +// dos.writeDouble(zVel); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "SetPlayerVel"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = false; +// return pkt; +// } +// +// public static Packet getPlayerPositionSettingPacket(double xVel, double yVel, double zVel) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeDouble(xVel); +// dos.writeDouble(yVel); +// dos.writeDouble(zVel); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "SetPlayerPos"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = false; +// return pkt; +// } +// +// public static Packet getCreativeCheatPacket(String ownerName, boolean isFill) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(ownerName.length()); +// dos.writeChars(ownerName); +// dos.writeBoolean(isFill); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "InfiniteLPPath"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = false; +// return pkt; +// } +// +// public static Packet getBlockOrientationPacket(TEOrientable tileEntity) +// { +// ByteArrayOutputStream bos = new ByteArrayOutputStream(140); +// DataOutputStream dos = new DataOutputStream(bos); +// +// try +// { +// dos.writeInt(tileEntity.xCoord); +// dos.writeInt(tileEntity.yCoord); +// dos.writeInt(tileEntity.zCoord); +// dos.writeInt(tileEntity.getIntForForgeDirection(tileEntity.getInputDirection())); +// dos.writeInt(tileEntity.getIntForForgeDirection(tileEntity.getOutputDirection())); +// } catch (IOException e) +// { +// e.printStackTrace(); +// } +// +// Packet250CustomPayload pkt = new Packet250CustomPayload(); +// pkt.channel = "TEOrientor"; +// pkt.data = bos.toByteArray(); +// pkt.length = bos.size(); +// pkt.isChunkDataPacket = true; +// return pkt; +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java new file mode 100644 index 00000000..6232828a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java @@ -0,0 +1,37 @@ +package WayofTime.alchemicalWizardry.common; + +public class PlinthComponent +{ + public int xOffset; + public int yOffset; + public int zOffset; + public int ring; + + public PlinthComponent(int xOffset, int yOffset, int zOffset, int ring) + { + this.xOffset = xOffset; + this.yOffset = yOffset; + this.zOffset = zOffset; + this.ring = ring; + } + + public int getXOffset() + { + return xOffset; + } + + public int getYOffset() + { + return yOffset; + } + + public int getZOffset() + { + return zOffset; + } + + public int getRing() + { + return ring; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java new file mode 100644 index 00000000..ce4de5f2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionBoost extends Potion +{ + public PotionBoost(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java new file mode 100644 index 00000000..26efc6af --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionDrowning extends Potion +{ + public PotionDrowning(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java new file mode 100644 index 00000000..e25a7c06 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionFlameCloak extends Potion +{ + public PotionFlameCloak(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java new file mode 100644 index 00000000..9b7940d0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionFlight extends Potion +{ + public PotionFlight(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java new file mode 100644 index 00000000..18eba799 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionIceCloak extends Potion +{ + public PotionIceCloak(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java new file mode 100644 index 00000000..0014b9c3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionInhibit extends Potion +{ + public PotionInhibit(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java new file mode 100644 index 00000000..b3c70c6b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionProjectileProtect extends Potion +{ + public PotionProjectileProtect(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java new file mode 100644 index 00000000..2f105b23 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionReciprocation extends Potion +{ + public PotionReciprocation(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemicalPotionCreationHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemicalPotionCreationHandler.java new file mode 100644 index 00000000..55085785 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemicalPotionCreationHandler.java @@ -0,0 +1,108 @@ +package WayofTime.alchemicalWizardry.common.alchemy; + +import java.util.ArrayList; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; + +public class AlchemicalPotionCreationHandler +{ + public static ArrayList registeredPotionEffects = new ArrayList(); + + public static void initializePotions() + { + addPotion(new ItemStack(Items.ghast_tear), Potion.regeneration.id, 450); + addPotion(new ItemStack(Items.golden_carrot), Potion.nightVision.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.magma_cream), Potion.fireResistance.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.sugar), Potion.moveSpeed.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.speckled_melon), Potion.heal.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.spider_eye), Potion.poison.id, 450); + addPotion(new ItemStack(Items.fermented_spider_eye), Potion.weakness.id, 450); + addPotion(new ItemStack(Items.blaze_powder), Potion.damageBoost.id, 2 * 60 * 20); + addPotion(new ItemStack(ModItems.aether), Potion.jump.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.clay_ball), Potion.moveSlowdown.id, 450); + addPotion(new ItemStack(Items.redstone), Potion.digSpeed.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.potionitem, 1, 0), AlchemicalWizardry.customPotionDrowning.id, 450); + //addPotion(new ItemStack(Item.goldenCarrot),Potion.nightVision.id,2*60*20); + addPotion(new ItemStack(Items.glass_bottle), Potion.invisibility.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.diamond), Potion.resistance.id, 2 * 60 * 20); + addPotion(new ItemStack(Items.poisonous_potato), Potion.field_76443_y.id, 2); //saturation + addPotion(new ItemStack(ModItems.demonBloodShard), Potion.field_76434_w.id, 4 * 60 * 20); //health boost + addPotion(new ItemStack(ModItems.weakBloodShard), Potion.field_76444_x.id, 4 * 60 * 20); //Absorption + addPotion(new ItemStack(ModItems.terrae), AlchemicalWizardry.customPotionBoost.id, 1 * 60 * 20); + addPotion(new ItemStack(Items.feather), AlchemicalWizardry.customPotionFlight.id, 1 * 60 * 20); + addPotion(new ItemStack(Items.arrow), AlchemicalWizardry.customPotionReciprocation.id, 1 * 60 * 20); + } + + public static void addPotion(ItemStack itemStack, int potionID, int tickDuration) + { + registeredPotionEffects.add(new AlchemyPotionHandlerComponent(itemStack, potionID, tickDuration)); + } + + public static int getPotionIDForStack(ItemStack itemStack) + { + for (AlchemyPotionHandlerComponent aphc : registeredPotionEffects) + { + if (aphc.compareItemStack(itemStack)) + { + return aphc.getPotionID(); + } + } + + return -1; + } + + public static int getPotionTickDurationForStack(ItemStack itemStack) + { + { + for (AlchemyPotionHandlerComponent aphc : registeredPotionEffects) + { + if (aphc.compareItemStack(itemStack)) + { + return aphc.getTickDuration(); + } + } + + return -1; + } + } + + public static boolean containsRegisteredPotionIngredient(ItemStack[] stackList) + { + for (ItemStack is : stackList) + { + for (AlchemyPotionHandlerComponent aphc : registeredPotionEffects) + { + if (aphc.compareItemStack(is)) + { + return true; + } + } + } + + return false; + } + + public static int getRegisteredPotionIngredientPosition(ItemStack[] stackList) + { + int i = 0; + + for (ItemStack is : stackList) + { + for (AlchemyPotionHandlerComponent aphc : registeredPotionEffects) + { + if (aphc.compareItemStack(is)) + { + return i; + } + } + + i++; + } + + return -1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java new file mode 100644 index 00000000..58c6120e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java @@ -0,0 +1,52 @@ +package WayofTime.alchemicalWizardry.common.alchemy; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class AlchemyPotionHandlerComponent +{ + private ItemStack itemStack; + private int potionID; + private int tickDuration; + + public AlchemyPotionHandlerComponent(ItemStack itemStack, int potionID, int tickDuration) + { + this.itemStack = itemStack; + this.potionID = potionID; + this.tickDuration = tickDuration; + } + + public boolean compareItemStack(ItemStack comparedStack) + { + if (comparedStack != null && itemStack != null) + { + if (comparedStack.getItem() instanceof ItemBlock) + { + if (itemStack.getItem() instanceof ItemBlock) + { + return comparedStack.equals(itemStack) && comparedStack.getItemDamage() == itemStack.getItemDamage(); + } + } else if (!(itemStack.getItem() instanceof ItemBlock)) + { + return comparedStack.equals(itemStack) && comparedStack.getItemDamage() == itemStack.getItemDamage(); + } + } + + return false; + } + + public ItemStack getItemStack() + { + return itemStack; + } + + public int getPotionID() + { + return this.potionID; + } + + public int getTickDuration() + { + return this.tickDuration; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHelper.java new file mode 100644 index 00000000..47bcd609 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHelper.java @@ -0,0 +1,76 @@ +package WayofTime.alchemicalWizardry.common.alchemy; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; + +public class AlchemyPotionHelper +{ + private int potionID; + private int tickDuration; + private int concentration; + private int durationFactor; + + public AlchemyPotionHelper(int potionID, int tickDuration, int concentration, int durationFactor) + { + this.potionID = potionID; + this.tickDuration = tickDuration; + this.concentration = concentration; + this.durationFactor = durationFactor; + } + + public void setConcentration(int concentration) + { + this.concentration = concentration; + } + + public void setDurationFactor(int durationFactor) + { + this.durationFactor = durationFactor; + } + + public int getPotionID() + { + return this.potionID; + } + + public int getTickDuration() + { + return this.tickDuration; + } + + public int getConcentration() + { + return this.concentration; + } + + public int getdurationFactor() + { + return this.durationFactor; + } + + public PotionEffect getPotionEffect() + { + if (potionID == Potion.heal.id || potionID == Potion.harm.id) + { + return (new PotionEffect(potionID, 1, concentration)); + } + + return (new PotionEffect(potionID, (int) (tickDuration * Math.pow(0.5f, concentration) * Math.pow(8.0f / 3.0f, durationFactor)), concentration)); + } + + public static AlchemyPotionHelper readEffectFromNBT(NBTTagCompound tagCompound) + { + return new AlchemyPotionHelper(tagCompound.getInteger("potionID"), tagCompound.getInteger("tickDuration"), tagCompound.getInteger("concentration"), tagCompound.getInteger("durationFactor")); + } + + public static NBTTagCompound setEffectToNBT(AlchemyPotionHelper aph) + { + NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setInteger("potionID", aph.getPotionID()); + tagCompound.setInteger("tickDuration", aph.getTickDuration()); + tagCompound.setInteger("concentration", aph.getConcentration()); + tagCompound.setInteger("durationFactor", aph.getdurationFactor()); + return tagCompound; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java new file mode 100644 index 00000000..a3423fa3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java @@ -0,0 +1,181 @@ +package WayofTime.alchemicalWizardry.common.alchemy; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class AlchemyRecipe +{ + private ItemStack output; + private ItemStack[] recipe; + private int bloodOrbLevel; + private int amountNeeded; + + public AlchemyRecipe(ItemStack output, int amountNeeded, ItemStack[] recipe, int bloodOrbLevel) + { + this.output = output; + this.recipe = recipe; + this.amountNeeded = amountNeeded; + this.bloodOrbLevel = bloodOrbLevel; + } + + public boolean doesRecipeMatch(ItemStack[] items, int slottedBloodOrbLevel) + { + if (slottedBloodOrbLevel < bloodOrbLevel) + { + return false; + } + + ItemStack[] recipe = new ItemStack[5]; + + if (items.length < 5) + { + return false; + } + + if (this.recipe.length != 5) + { + ItemStack[] newRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + if (i + 1 > this.recipe.length) + { + newRecipe[i] = null; + } else + { + newRecipe[i] = this.recipe[i]; + } + } + + recipe = newRecipe; + } else + { + recipe = this.recipe; + } + + boolean[] checkList = new boolean[5]; + + for (int i = 0; i < 5; i++) + { + checkList[i] = false; + } + + for (int i = 0; i < 5; i++) + { + ItemStack recipeItemStack = recipe[i]; + + if (recipeItemStack == null) + { + continue; + } + + boolean test = false; + + for (int j = 0; j < 5; j++) + { + if (checkList[j]) + { + continue; + } + + ItemStack checkedItemStack = items[j]; + + if (checkedItemStack == null) + { + continue; + } + + boolean quickTest = false; + + if (recipeItemStack.getItem() instanceof ItemBlock) + { + if (checkedItemStack.getItem() instanceof ItemBlock) + { + quickTest = true; + } + } else if (!(checkedItemStack.getItem() instanceof ItemBlock)) + { + quickTest = true; + } + + if (!quickTest) + { + continue; + } + + if ((checkedItemStack.getItemDamage() == recipeItemStack.getItemDamage() || OreDictionary.WILDCARD_VALUE == recipeItemStack.getItemDamage()) && checkedItemStack.equals(recipeItemStack)) + { + test = true; + checkList[j] = true; + break; + } + } + + if (!test) + { + return false; + } + } + + return true; +// if(slottedBloodOrbLevel recipes = new ArrayList(); + + public static void registerRecipe(ItemStack output, int amountNeeded, ItemStack[] recipe, int bloodOrbLevel) + { + recipes.add(new AlchemyRecipe(output, amountNeeded, recipe, bloodOrbLevel)); + } + + public static ItemStack getResult(ItemStack[] recipe, ItemStack bloodOrb) + { + if (bloodOrb == null) + { + return null; + } + + if (!(bloodOrb.getItem() instanceof EnergyBattery)) + { + return null; + } + + int bloodOrbLevel = ((EnergyBattery) bloodOrb.getItem()).getOrbLevel(); + + for (AlchemyRecipe ar : recipes) + { + if (ar.doesRecipeMatch(recipe, bloodOrbLevel)) + { + return (ar.getResult()); + } + } + + return null; + } + + public static int getAmountNeeded(ItemStack[] recipe, ItemStack bloodOrb) + { + if (bloodOrb == null) + { + return 0; + } + + if (!(bloodOrb.getItem() instanceof EnergyBattery)) + { + return 0; + } + + int bloodOrbLevel = ((EnergyBattery) bloodOrb.getItem()).getOrbLevel(); + + for (AlchemyRecipe ar : recipes) + { + if (ar.doesRecipeMatch(recipe, bloodOrbLevel)) + { + return (ar.getAmountNeeded()); + } + } + + return 0; + } + + public static ItemStack[] getRecipeForItemStack(ItemStack itemStack) + { + for (AlchemyRecipe ar : recipes) + { + ItemStack result = ar.getResult(); + + if (result != null) + { + if (result.isItemEqual(itemStack)) + { + return ar.getRecipe(); + } + } + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java new file mode 100644 index 00000000..a7599f70 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipe.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.common.altarRecipeRegistry; + +import net.minecraft.item.ItemStack; + +public class AltarRecipe +{ + public int minTier; + public int liquidRequired; + public boolean canBeFilled; //Tells the system that the item is an orb + public int consumptionRate; + public int drainRate; + public ItemStack requiredItem; + public ItemStack result; + + public AltarRecipe(ItemStack result, ItemStack requiredItem, int minTier, int liquidRequired, int consumptionRate, int drainRate, boolean canBeFilled) + { + this.result = result; + this.requiredItem = requiredItem; + this.minTier = minTier; + this.liquidRequired = liquidRequired; + this.consumptionRate = consumptionRate; + this.drainRate = drainRate; + this.canBeFilled = canBeFilled; + } + + public ItemStack getResult() + { + return this.result; + } + + public ItemStack getRequiredItem() + { + return this.requiredItem; + } + + public boolean doesRequiredItemMatch(ItemStack comparedStack, int tierCheck) + { + if(comparedStack == null || this.requiredItem == null) + { + return false; + } + + return tierCheck>=minTier && this.requiredItem.isItemEqual(comparedStack); + } + + public int getMinTier() + { + return this.minTier; + } + + public int getLiquidRequired() + { + return this.liquidRequired; + } + + public int getConsumptionRate() + { + return this.consumptionRate; + } + + public int getDrainRate() + { + return this.drainRate; + } + + public boolean getCanBeFilled() + { + return this.canBeFilled; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java new file mode 100644 index 00000000..88ef593b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -0,0 +1,100 @@ +package WayofTime.alchemicalWizardry.common.altarRecipeRegistry; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.ModItems; + +public class AltarRecipeRegistry +{ + public static List altarRecipes = new LinkedList(); + + public static void registerAltarRecipe(ItemStack result, ItemStack requiredItem, int minTier, int liquidRequired, int consumptionRate, int drainRate, boolean canBeFilled) + { + altarRecipes.add(new AltarRecipe(result, requiredItem, minTier, liquidRequired, consumptionRate, drainRate, canBeFilled)); + } + + public static void registerAltarOrbRecipe(ItemStack orbStack, int minTier, int consumptionRate) + { + registerAltarRecipe(null, orbStack, minTier, 0, consumptionRate, 0, true); + } + + public static void initRecipes() + { + registerAltarRecipe(new ItemStack(ModItems.weakBloodOrb), new ItemStack(Items.diamond),1,2000,2,1,false); + registerAltarRecipe(new ItemStack(ModItems.apprenticeBloodOrb), new ItemStack(Items.emerald),2,5000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.magicianBloodOrb), new ItemStack(Blocks.gold_block),3,25000,20,20,false); + registerAltarRecipe(new ItemStack(ModItems.masterBloodOrb), new ItemStack(ModItems.weakBloodShard),4,40000,30,50,false); + registerAltarRecipe(new ItemStack(ModItems.archmageBloodOrb), new ItemStack(ModItems.demonBloodShard),5,75000,50,100,false); + + registerAltarOrbRecipe(new ItemStack(ModItems.weakBloodOrb),1,2); + registerAltarOrbRecipe(new ItemStack(ModItems.apprenticeBloodOrb),2,5); + registerAltarOrbRecipe(new ItemStack(ModItems.magicianBloodOrb),3,15); + registerAltarOrbRecipe(new ItemStack(ModItems.masterBloodOrb),4,25); + registerAltarOrbRecipe(new ItemStack(ModItems.archmageBloodOrb),5,50); + + registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Items.ender_pearl),4,2000,10,10,false); + registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); + registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); + registerAltarRecipe(new ItemStack(ModItems.duskScribeTool), new ItemStack(Blocks.coal_block),4,2000,20,10,false); + registerAltarRecipe(new ItemStack(ModBlocks.bloodSocket), new ItemStack(ModBlocks.emptySocket),3,30000,40,10,false); + registerAltarRecipe(new ItemStack(ModItems.earthScribeTool), new ItemStack(Blocks.obsidian),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.waterScribeTool), new ItemStack(Blocks.lapis_block),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.blankSpell), new ItemStack(Blocks.glass),2,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.blankSlate), new ItemStack(Blocks.stone),1,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.activationCrystal), new ItemStack(ModItems.lavaCrystal),3,10000,20,10,false); + registerAltarRecipe(new ItemStack(ModItems.fireScribeTool), new ItemStack(Items.magma_cream),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.airScribeTool), new ItemStack(Items.ghast_tear),3,1000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.reinforcedSlate),3,5000,15,10,false); + registerAltarRecipe(new ItemStack(ModItems.daggerOfSacrifice), new ItemStack(Items.iron_sword),2,3000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.alchemyFlask), new ItemStack(Items.glass_bottle),2,2000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.reinforcedSlate), new ItemStack(ModItems.blankSlate),2,2000,5,5,false); + registerAltarRecipe(new ItemStack(ModItems.bucketLife), new ItemStack(Items.bucket),1,1000,5,0,false); + } + + public static boolean isRequiredItemValid(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return true; + } + } + + return false; + } + + public static ItemStack getItemForItemAndTier(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return recipe.getResult(); + } + } + + return null; + } + + public static AltarRecipe getAltarRecipeForItemAndTier(ItemStack testItem, int currentTierAltar) + { + for(AltarRecipe recipe : altarRecipes) + { + if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) + { + return recipe; + } + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java new file mode 100644 index 00000000..1c4a7fdf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java @@ -0,0 +1,335 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourComponent; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.BoundArmour; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ArmourForge extends Block +{ + public static List helmetList = new ArrayList(); + public static List plateList = new ArrayList(); + public static List leggingsList = new ArrayList(); + public static List bootsList = new ArrayList(); + + public ArmourForge() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("armourForge"); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:SoulForge"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + if (world.isRemote) + { + return false; + } + + int armourType = getArmourType(world, x, y, z); + + if (armourType == -1) + { + return false; + } + + int direction = getDirectionForArmourType(world, x, y, z, armourType); + + if (!isParadigmValid(armourType, direction, world, x, y, z)) + { + return false; + } + + List list = null; + ItemStack armourPiece = null; + + switch (armourType) + { + case 0: + list = plateList; + armourPiece = new ItemStack(ModItems.boundPlate, 1, 0); + break; + + case 1: + list = leggingsList; + armourPiece = new ItemStack(ModItems.boundLeggings, 1, 0); + break; + + case 2: + list = helmetList; + armourPiece = new ItemStack(ModItems.boundHelmet, 1, 0); + break; + + case 3: + list = bootsList; + armourPiece = new ItemStack(ModItems.boundBoots, 1, 0); + break; + } + + if (list == null) + { + return false; + } + + if (armourPiece == null) + { + return false; + } + + if (armourPiece.stackTagCompound == null) + { + armourPiece.setTagCompound(new NBTTagCompound()); + } + + for (ArmourComponent ac : list) + { + int xOff = ac.getXOff(); + int zOff = ac.getZOff(); + TileEntity tileEntity; + + switch (direction) + { + case 1: + tileEntity = world.getTileEntity(x + xOff, y, z - zOff); + break; + + case 2: + tileEntity = world.getTileEntity(x + zOff, y, z + xOff); + break; + + case 3: + tileEntity = world.getTileEntity(x - xOff, y, z + zOff); + break; + + case 4: + tileEntity = world.getTileEntity(x - zOff, y, z - xOff); + break; + + case 5: + tileEntity = world.getTileEntity(x + xOff, y + zOff, z); + break; + + case 6: + tileEntity = world.getTileEntity(x, y + zOff, z + xOff); + break; + + default: + tileEntity = null; + } + + if (tileEntity instanceof TESocket) + { + ItemStack itemStack = ((TESocket) tileEntity).getStackInSlot(0); + int xCoord = tileEntity.xCoord; + int yCoord = tileEntity.yCoord; + int zCoord = tileEntity.zCoord; + ((TESocket) tileEntity).setInventorySlotContents(0, null); + world.setBlockToAir(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + + for (int i = 0; i < 8; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 20, world.provider.dimensionId, TEAltar.getParticlePacket(xCoord, yCoord, zCoord, (short) 1)); + SpellHelper.sendIndexedParticleToAllAround(world, xCoord, yCoord, zCoord, 20, world.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (itemStack != null) + { + Item item = itemStack.getItem(); + + if (item instanceof ArmourUpgrade) + { + ((BoundArmour) armourPiece.getItem()).hasAddedToInventory(armourPiece, itemStack.copy()); + ((TESocket) tileEntity).setInventorySlotContents(0, null); + } + } + } + } + + if (armourPiece != null) + { + int xOff = (world.rand.nextInt(11) - 5); + int zOff = (int) (Math.sqrt(25 - xOff * xOff) * (world.rand.nextInt(2) - 0.5) * 2); + world.addWeatherEffect(new EntityLightningBolt(world, x + xOff, y + 5, z + zOff)); + world.spawnEntityInWorld(new EntityItem(world, x, y + 1, z, armourPiece)); + } + + return true; + } + + //0 for plate, 1 for leggings, 2 for helmet, 3 for boots + public int getArmourType(World world, int x, int y, int z) + { + for (int i = 0; i <= 3; i++) + { + if (getDirectionForArmourType(world, x, y, z, i) != -1) + { + return i; + } + } + + return -1; + } + + public int getDirectionForArmourType(World world, int x, int y, int z, int armourType) + { + for (int i = 1; i <= 6; i++) + { + if (isParadigmValid(armourType, i, world, x, y, z)) + { + return i; + } + } + + return -1; + } + + public boolean isParadigmValid(int armourType, int direction, World world, int x, int y, int z) + { + List list = null; + + switch (armourType) + { + case 0: + list = plateList; + break; + + case 1: + list = leggingsList; + break; + + case 2: + list = helmetList; + break; + + case 3: + list = bootsList; + break; + } + + if (list == null) + { + return false; + } + + for (ArmourComponent ac : list) + { + int xOff = ac.getXOff(); + int zOff = ac.getZOff(); + + switch (direction) + { + case 1: + if (!(world.getTileEntity(x + xOff, y, z - zOff) instanceof TESocket)) + { + return false; + } + + break; + + case 2: + if (!(world.getTileEntity(x + zOff, y, z + xOff) instanceof TESocket)) + { + return false; + } + + break; + + case 3: + if (!(world.getTileEntity(x - xOff, y, z + zOff) instanceof TESocket)) + { + return false; + } + + break; + + case 4: + if (!(world.getTileEntity(x - zOff, y, z - xOff) instanceof TESocket)) + { + return false; + } + + break; + + case 5: + if (!(world.getTileEntity(x + xOff, y + zOff, z) instanceof TESocket)) + { + return false; + } + + break; + + case 6: + if (!(world.getTileEntity(x, y + zOff, z + xOff) instanceof TESocket)) + { + return false; + } + + break; + + default: + return false; + } + } + + return true; + } + + public static void initializeRecipes() + { + helmetList.add(new ArmourComponent(-1, 1)); + helmetList.add(new ArmourComponent(0, 1)); + helmetList.add(new ArmourComponent(1, 1)); + helmetList.add(new ArmourComponent(-1, 0)); + helmetList.add(new ArmourComponent(1, 0)); + bootsList.add(new ArmourComponent(-1, 1)); + bootsList.add(new ArmourComponent(1, 1)); + bootsList.add(new ArmourComponent(-1, 0)); + bootsList.add(new ArmourComponent(1, 0)); + plateList.add(new ArmourComponent(-1, 0)); + plateList.add(new ArmourComponent(1, 0)); + plateList.add(new ArmourComponent(-1, -1)); + plateList.add(new ArmourComponent(0, -1)); + plateList.add(new ArmourComponent(1, -1)); + plateList.add(new ArmourComponent(-1, -2)); + plateList.add(new ArmourComponent(0, -2)); + plateList.add(new ArmourComponent(1, -2)); + leggingsList.add(new ArmourComponent(-1, 1)); + leggingsList.add(new ArmourComponent(0, 1)); + leggingsList.add(new ArmourComponent(1, 1)); + leggingsList.add(new ArmourComponent(-1, 0)); + leggingsList.add(new ArmourComponent(1, 0)); + leggingsList.add(new ArmourComponent(-1, -1)); + leggingsList.add(new ArmourComponent(1, -1)); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java new file mode 100644 index 00000000..7bf2d6c7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java @@ -0,0 +1,279 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockAltar extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockAltar() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("blockAltar"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_Top"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType1"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType2"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_Bottom"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TEAltar tileEntity = (TEAltar) world.getTileEntity(x, y, z); + +// world.scheduleBlockUpdate(x, y, z, this.blockID, 0); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem != null) + { + if (playerItem.getItem().equals(ModItems.divinationSigil)) + { + if (player.worldObj.isRemote) + { + world.markBlockForUpdate(x, y, z); + } + + return true; + } else if (playerItem.getItem().equals(ModItems.sigilOfHolding)) + { + ItemStack item = ((SigilOfHolding) playerItem.getItem()).getCurrentItem(playerItem); + + if (item != null && item.getItem().equals(ModItems.divinationSigil)) + { + if (player.worldObj.isRemote) + { + world.markBlockForUpdate(x, y, z); + } + + return true; + } + } + } + + if (tileEntity.getStackInSlot(0) == null && playerItem != null) + { + ItemStack newItem = playerItem.copy(); + newItem.stackSize = 1; +// if(newItem.getMaxDamage()==0) +// { +// newItem.setItemDamage(0); +// } + --playerItem.stackSize; + tileEntity.setInventorySlotContents(0, newItem); + tileEntity.startCycle(); + } else if (tileEntity.getStackInSlot(0) != null && playerItem == null) + { + /**stub method + * Add the item that is in the slot to the player's inventory, and + * then set the slot to null. + */ + player.inventory.addItemStackToInventory(tileEntity.getStackInSlot(0)); + tileEntity.setInventorySlotContents(0, null); + tileEntity.setActive(); + } + + world.markBlockForUpdate(x, y, z); + //player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + //PacketDispatcher.sendPacketToServer(tileEntity.getDescriptionPacket()); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, + x + rx, y + ry, z + rz, + new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity() + { + return true; + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random rand) + { + TEAltar tileEntity = (TEAltar) world.getTileEntity(x, y, z); + + if (!tileEntity.isActive()) + { + return; + } + + if (rand.nextInt(3) != 0) + { + return; + } + } + +// @Override +// public int isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) +// { +// return 1; +// } + + @Override + public boolean canProvidePower() + { + return true; + } + + @Override + public int isProvidingWeakPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) + { + TileEntity tile = par1IBlockAccess.getTileEntity(par2, par3, par4); + + if (tile instanceof TEAltar) + { +// if(tile.worldObj.isRemote) +// { +// return 0; +// } + ItemStack stack = ((TEAltar) tile).getStackInSlot(0); + + if (stack != null && stack.getItem() instanceof EnergyBattery) + { + EnergyBattery bloodOrb = (EnergyBattery) stack.getItem(); + int maxEssence = bloodOrb.getMaxEssence(); + int currentEssence = bloodOrb.getCurrentEssence(stack); + int level = currentEssence * 15 / maxEssence; + return ((int) (Math.min(15, level))) % 16; + } + } + + return 0; + } + + @Override + public TileEntity createNewTileEntity(World var1, int var2) + { + return new TEAltar(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java new file mode 100644 index 00000000..6e63f4b5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java @@ -0,0 +1,75 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockBloodLightSource extends Block +{ + public BlockBloodLightSource() + { + super(Material.cloth); + //setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //this.setUnlocalizedName("blockBloodLightSource"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:BlockBloodLight"); + } + + @Override + public int getLightValue(IBlockAccess world, int x, int y, int z) + { + return 15; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public void randomDisplayTick(World world, int x, int y, int z, Random rand) + { + if (rand.nextInt(3) != 0) + { + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + world.spawnParticle("reddust", x + 0.5D + rand.nextGaussian() / 8, y + 0.5D, z + 0.5D + rand.nextGaussian() / 8, f1, f2, f3); + } + } + + @Override + + public void addCollisionBoxesToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) + { + this.setBlockBounds(0.40F, 0.40F, 0.40F, 0.60F, 0.60F, 0.60F); + //super.addCollisionBoxesToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); + } + + public int quantityDropped(Random par1Random) + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java new file mode 100644 index 00000000..82fc993f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java @@ -0,0 +1,101 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockConduit extends BlockOrientable +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockConduit() + { + super(); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("blockConduit"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_Top"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType1"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType2"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_Bottom"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + //dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + @Override + public TileEntity createNewTileEntity(World world, int noClue) + { + return new TEConduit(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity() + { + return true; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java new file mode 100644 index 00000000..8ecb2e93 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java @@ -0,0 +1,101 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.BlankSpell; +import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockHomHeart extends BlockContainer +{ + public IIcon bottomIcon; + public IIcon topIcon; + public IIcon sideIcon; + + public BlockHomHeart() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("blockHomHeart"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:HomHeart_top"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:HomHeart_bottom"); + this.sideIcon = iconRegister.registerIcon("AlchemicalWizardry:HomHeart_side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TEHomHeart tileEntity = (TEHomHeart) world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem != null) + { + if (playerItem.getItem() instanceof BlankSpell) + { + if (playerItem.stackTagCompound == null) + { + playerItem.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound itemTag = playerItem.stackTagCompound; + itemTag.setInteger("xCoord", x); + itemTag.setInteger("yCoord", y); + itemTag.setInteger("zCoord", z); + itemTag.setInteger("dimensionId", world.provider.dimensionId); + return true; + } + } + + return false; + } + + @Override + public TileEntity createNewTileEntity(World world, int metaMaybe) + { + return new TEHomHeart(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java new file mode 100644 index 00000000..1a1d63b6 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java @@ -0,0 +1,72 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.ActivationCrystal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockMasterStone extends BlockContainer +{ + public BlockMasterStone() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("blockMasterStone"); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:MasterStone"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TEMasterStone tileEntity = (TEMasterStone) world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem == null) + { + return false; + } + + Item item = playerItem.getItem(); + + if (!(item instanceof ActivationCrystal)) + { + return false; + } + + ActivationCrystal acItem = (ActivationCrystal) item; + tileEntity.setOwner(acItem.getOwnerName(playerItem)); + tileEntity.activateRitual(world, acItem.getCrystalLevel(playerItem)); + world.markBlockForUpdate(x, y, z); + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TEMasterStone(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java new file mode 100644 index 00000000..4af2d1f6 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -0,0 +1,252 @@ +package WayofTime.alchemicalWizardry.common.block; + +import javax.swing.Icon; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockOrientable extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon[] fireIcons; + + public BlockOrientable() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodSocket"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.fireIcons = this.registerIconsWithString(iconRegister, "fireEffectBlock"); + } + + @SideOnly(Side.CLIENT) + public static IIcon[] registerIconsWithString(IIconRegister iconRegister, String blockString) + { + IIcon[] icons = new IIcon[7]; + + icons[0] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_input"); + icons[1] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_output"); + icons[2] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_upArrow"); + icons[3] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_downArrow"); + icons[4] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_leftArrow"); + icons[5] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_rightArrow"); + icons[6] = iconRegister.registerIcon("AlchemicalWizardry:" + blockString + "_blank"); + + return icons; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + IIcon[] icons = this.getIconsForMeta(meta); + switch (side) + { + case 4: return icons[1]; + default: return icons[6]; + } + } + +// @Override +// public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) +// { +// return false; +// } + + @SideOnly(Side.CLIENT) + + /** + * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side + */ + public IIcon getBlockTexture(IBlockAccess par1IBlockAccess, int x, int y, int z, int side) + { + TileEntity tile = par1IBlockAccess.getTileEntity(x, y, z); + int meta = par1IBlockAccess.getBlockMetadata(x, y, z); + + if(tile instanceof TEOrientable) + { + ForgeDirection input = ((TEOrientable)tile).getInputDirection(); + ForgeDirection output = ((TEOrientable)tile).getOutputDirection(); + + return this.getIconsForMeta(meta)[this.getTextureIndexForSideAndOrientation(side, input, output)]; + } + + return this.getIcon(side, meta); + } + + @Override + public TileEntity createNewTileEntity(World world, int dunno) + { + return new TEOrientable(); + } + + public IIcon[] getIconsForMeta(int metadata) + { + return this.fireIcons; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) + { + //Right-click orients the output face. Shift-right-click orients the input face. + if (world.isRemote) + { + return false; + } + + ForgeDirection sideClicked = ForgeDirection.getOrientation(side); + TileEntity tile = world.getTileEntity(x, y, z); + + if (tile instanceof TEOrientable) + { + TEOrientable newTile = (TEOrientable)tile; + if(player.isSneaking()) + { + int nextSide = TEOrientable.getIntForForgeDirection(newTile.getInputDirection())+1; + + if(nextSide>5) + { + nextSide = 0; + } + if(ForgeDirection.getOrientation(nextSide)==newTile.getOutputDirection()) + { + nextSide++; + if(nextSide>5) + { + nextSide = 0; + } + } + + newTile.setInputDirection(ForgeDirection.getOrientation(nextSide)); + }else + { + int nextSide = TEOrientable.getIntForForgeDirection(newTile.getOutputDirection())+1; + + if(nextSide>5) + { + nextSide = 0; + } + if(ForgeDirection.getOrientation(nextSide)==newTile.getInputDirection()) + { + nextSide++; + if(nextSide>5) + { + nextSide = 0; + } + } + + newTile.setOutputDirection(ForgeDirection.getOrientation(nextSide)); + } + } + + world.markBlockForUpdate(x, y, z); + return true; + } + + public int getTextureIndexForSideAndOrientation(int side, ForgeDirection input, ForgeDirection output) + { + if(ForgeDirection.getOrientation(side) == input) + { + return 0; + } + if(ForgeDirection.getOrientation(side) == output) + { + return 1; + } + if(ForgeDirection.getOrientation(side) == output.getOpposite()) + { + return 6; + } + + switch(side) + { + case 0: //BOTTOM + switch(output) + { + case NORTH: return 2; //UP + case SOUTH: return 3; //DOWN + case EAST: return 4; //LEFT + case WEST: return 5; //RIGHT + default: break; + } + break; + case 1: //TOP + switch(output) + { + case NORTH: return 2; //UP + case SOUTH: return 3; //DOWN + case EAST: return 5; + case WEST: return 4; + default: break; + } + break; + case 2: //NORTH + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case EAST: return 4; + case WEST: return 5; + default: break; + } + break; + case 3: //SOUTH + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case EAST: return 5; + case WEST: return 4; + default: break; + } + break; + case 4: //WEST + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case NORTH: return 5; + case SOUTH: return 4; + default: break; + } + break; + case 5: //EAST + switch(output) + { + case DOWN: return 3; + case UP: return 2; + case NORTH: return 4; + case SOUTH: return 5; + default: break; + } + break; + } + + return 0; + } + + @Override + public int damageDropped(int metadata) + { + return metadata; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java new file mode 100644 index 00000000..5d48942d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java @@ -0,0 +1,193 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockPedestal extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockPedestal() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodPedestal"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:ArcanePedestal"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TEPedestal tileEntity = (TEPedestal) world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (tileEntity.getStackInSlot(0) == null && playerItem != null) + { + ItemStack newItem = playerItem.copy(); + newItem.stackSize = 1; + --playerItem.stackSize; + tileEntity.setInventorySlotContents(0, newItem); + } else if (tileEntity.getStackInSlot(0) != null && playerItem == null) + { + /**stub method + * Add the item that is in the slot to the player's inventory, and + * then set the slot to null. + */ + player.inventory.addItemStackToInventory(tileEntity.getStackInSlot(0)); + tileEntity.setInventorySlotContents(0, null); + tileEntity.setActive(); + } + + world.markBlockForUpdate(x, y, z); + //player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + //PacketDispatcher.sendPacketToServer(tileEntity.getDescriptionPacket()); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, x + rx, y + ry, z + rz, new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TEPedestal(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity() + { + return true; + } + + @Override + public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) + { + float f = 0.3125F; + this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.6F, 0.5F + f); + return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java new file mode 100644 index 00000000..9392b33d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java @@ -0,0 +1,193 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockPlinth extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockPlinth() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodPlinth"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:ArcanePlinth"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TEPlinth tileEntity = (TEPlinth) world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (tileEntity.getStackInSlot(0) == null && playerItem != null) + { + ItemStack newItem = playerItem.copy(); + newItem.stackSize = 1; + --playerItem.stackSize; + tileEntity.setInventorySlotContents(0, newItem); + } else if (tileEntity.getStackInSlot(0) != null && playerItem == null) + { + /**stub method + * Add the item that is in the slot to the player's inventory, and + * then set the slot to null. + */ + player.inventory.addItemStackToInventory(tileEntity.getStackInSlot(0)); + tileEntity.setInventorySlotContents(0, null); + tileEntity.setActive(); + } + + world.markBlockForUpdate(x, y, z); + //player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + //PacketDispatcher.sendPacketToServer(tileEntity.getDescriptionPacket()); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, x + rx, y + ry, z + rz, new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TEPlinth(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity() + { + return true; + } + + @Override + public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) + { + float f = 0.0625F; + this.setBlockBounds(f, 0.0F, f, 1.0f - f, 0.875f, 1.0f - f); + return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java new file mode 100644 index 00000000..647ed05f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java @@ -0,0 +1,163 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSocket extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockSocket() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodSocket"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodSocket"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TESocket tileEntity = (TESocket) world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (tileEntity.getStackInSlot(0) == null && playerItem != null) + { + if (playerItem.getItem() instanceof ArmourUpgrade) + { + ItemStack newItem = playerItem.copy(); + newItem.stackSize = 1; + --playerItem.stackSize; + tileEntity.setInventorySlotContents(0, newItem); + } + } else if (tileEntity.getStackInSlot(0) != null && playerItem == null) + { + /**stub method + * Add the item that is in the slot to the player's inventory, and + * then set the slot to null. + */ + player.inventory.addItemStackToInventory(tileEntity.getStackInSlot(0)); + tileEntity.setInventorySlotContents(0, null); + tileEntity.setActive(); + } + + world.markBlockForUpdate(x, y, z); + //player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + //PacketDispatcher.sendPacketToServer(tileEntity.getDescriptionPacket()); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, x + rx, y + ry, z + rz, new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TESocket(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java new file mode 100644 index 00000000..6e42c5c7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java @@ -0,0 +1,62 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; + + +public class BlockSpellEffect extends BlockOrientable +{ + public BlockSpellEffect() + { + super(); + //setUnlocalizedName("blockSpellEffect"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TESpellEffectBlock(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.equals(ModBlocks.blockSpellEffect)) + { + for(int i=0; i<4; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java new file mode 100644 index 00000000..6c9f968b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java @@ -0,0 +1,46 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; + + +public class BlockSpellEnhancement extends BlockOrientable +{ + public BlockSpellEnhancement() + { + super(); + //setUnlocalizedName("blockSpellEnhancement"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TESpellEnhancementBlock(); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.equals(ModBlocks.blockSpellEnhancement)) + { + for(int i=0; i<15; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java new file mode 100644 index 00000000..c8f865ff --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; + + +public class BlockSpellModifier extends BlockOrientable +{ + public BlockSpellModifier() + { + super(); + //setUnlocalizedName("blockSpellModifier"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TESpellModifierBlock(); + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.equals(ModBlocks.blockSpellModifier)) + { + for(int i=0; i<4; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java new file mode 100644 index 00000000..00299ae5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -0,0 +1,211 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSpellParadigm extends BlockOrientable +{ + public static final float minPos = (3f/16f); + public static final float maxPos = (13f/16f); + + IIcon[] projectileIcons = new IIcon[7]; + + public BlockSpellParadigm() + { + super(); + //setUnlocalizedName("blockSpellParadigm"); + //setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, maxPos); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.projectileIcons = this.registerIconsWithString(iconRegister, "projectileParadigmBlock"); + } + +// @Override +// public Icon[] getIconsForMeta(int metadata) +// { +// return this.projectileIcons; +// } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TESpellParadigmBlock(); + } + + @SideOnly(Side.CLIENT) + + /** + * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) + */ + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.equals(ModBlocks.blockSpellParadigm)) + { + par3List.add(new ItemStack(par1, 1, 0)); + par3List.add(new ItemStack(par1, 1, 1)); + par3List.add(new ItemStack(par1, 1, 2)); + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float what, float these, float are) + { + ItemStack stack = player.getCurrentEquippedItem(); + + if(stack != null && stack.getItem() instanceof ItemComplexSpellCrystal) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound itemTag = stack.stackTagCompound; + itemTag.setInteger("xCoord", x); + itemTag.setInteger("yCoord", y); + itemTag.setInteger("zCoord", z); + itemTag.setInteger("dimensionId", world.provider.dimensionId); + return true; + } + + return super.onBlockActivated(world, x, y, z, player, side, what, these, are); + } + +// @Override +// public boolean isOpaqueCube() +// { +// return false; +// } +// +// @Override +// public boolean renderAsNormalBlock() +// { +// return false; +// } + +// @Override +// public int getRenderType() +// { +// return -1; +// } + + //TODO Need to make a renderer for the paradigm blocks and other spell blocks. + /* + @Override + public void addCollisionBoxesToList(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List arraylist, Entity par7Entity) + { + + setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + + + TileEntity tile1 = world.getBlockTileEntity(i, j, k); + if (tile1 instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileG = (TESpellParadigmBlock) tile1; + + + if (tileG.isSideRendered(ForgeDirection.WEST)) + { + setBlockBounds(0.0F, minPos, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.EAST)) + { + setBlockBounds(minPos, minPos, minPos, 1.0F, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.DOWN)) + { + setBlockBounds(minPos, 0.0F, minPos, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.UP)) + { + setBlockBounds(minPos, minPos, minPos, maxPos, 1.0F, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.NORTH)) + { + setBlockBounds(minPos, minPos, 0.0F, maxPos, maxPos, maxPos); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + + if (tileG.isSideRendered(ForgeDirection.SOUTH)) + { + setBlockBounds(minPos, minPos, minPos, maxPos, maxPos, 1.0F); + super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); + } + + +// float facadeThickness = TransportConstants.FACADE_THICKNESS; +// +// +// if (tileG.hasFacade(ForgeDirection.EAST)) { +// setBlockBounds(1 - facadeThickness, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.WEST)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, facadeThickness, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.UP)) { +// setBlockBounds(0.0F, 1 - facadeThickness, 0.0F, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.DOWN)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, facadeThickness, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.SOUTH)) { +// setBlockBounds(0.0F, 0.0F, 1 - facadeThickness, 1.0F, 1.0F, 1.0F); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } +// +// +// if (tileG.hasFacade(ForgeDirection.NORTH)) { +// setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, facadeThickness); +// super.addCollisionBoxesToList(world, i, j, k, axisalignedbb, arraylist, par7Entity); +// } + } + setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + */ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java new file mode 100644 index 00000000..e604dee2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java @@ -0,0 +1,321 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockMobSpawner; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +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.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.TelepositionFocus; +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockTeleposer extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockTeleposer() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodTeleposer"); + //func_111022_d("AlchemicalWizardry:blocks"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:Teleposer_Top"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:Teleposer_Side"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:Teleposer_Side"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:Teleposer_Side"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + TETeleposer tileEntity = (TETeleposer) world.getTileEntity(x, y, z); + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem != null) + { + if (playerItem.getItem() instanceof TelepositionFocus) + { + if (playerItem.stackTagCompound == null) + { + playerItem.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound itemTag = playerItem.stackTagCompound; + itemTag.setInteger("xCoord", x); + itemTag.setInteger("yCoord", y); + itemTag.setInteger("zCoord", z); + itemTag.setInteger("dimensionId", world.provider.dimensionId); + return true; + } + } + + player.openGui(AlchemicalWizardry.instance, 1, world, x, y, z); +// this.swapBlocks(world, x, y+1, z, x, y+2, z); +// +// world.markBlockForUpdate(x, y, z); + //player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + //PacketDispatcher.sendPacketToServer(tileEntity.getDescriptionPacket()); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, x + rx, y + ry, z + rz, new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TETeleposer(); + } + + public static boolean swapBlocks(World worldI, World worldF, int xi, int yi, int zi, int xf, int yf, int zf) + { + //TODO Fix sapling duplication glitch + TileEntity tileEntityI = worldI.getTileEntity(xi, yi, zi); + TileEntity tileEntityF = worldF.getTileEntity(xf, yf, zf); + TileEntity tileI; + TileEntity tileF; +// ItemStack[] inv1 = new ItemStack[0]; +// ItemStack[] inv2 = new ItemStack[0]; + NBTTagCompound nbttag1 = new NBTTagCompound(); + NBTTagCompound nbttag2 = new NBTTagCompound(); + + if (tileEntityI != null) + { + //NBTTagCompound nbttag1 = new NBTTagCompound(); +// tileEntityI.xCoord=xf; +// tileEntityI.yCoord=yf; +// tileEntityI.zCoord=zf; + tileEntityI.writeToNBT(nbttag1); + //tileEntityI.readFromNBT(new NBTTagCompound()); + } + +// if(tileEntityI instanceof IInventory) +// { +// int size = ((IInventory)tileEntityI).getSizeInventory(); +// inv1 = new ItemStack[size]; +// for(int i=0; i0) +// { +// for(int i=0;i<((IInventory)tileI).getSizeInventory();i++) +// { +// ((IInventory)tileI).setInventorySlotContents(i, inv2[i]); +// } +// } +// +// if(tileF instanceof IInventory && inv1.length>0) +// { +// for(int i=0;i<((IInventory)tileF).getSizeInventory();i++) +// { +// ((IInventory)tileF).setInventorySlotContents(i, inv1[i]); +// } +// } +// worldI.markBlockForUpdate(xi, yi, zi); +// worldF.markBlockForUpdate(xf, yf, zf); + return true; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java new file mode 100644 index 00000000..4475618f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java @@ -0,0 +1,181 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockWritingTable extends BlockContainer +{ + @SideOnly(Side.CLIENT) + private static IIcon topIcon; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon1; + @SideOnly(Side.CLIENT) + private static IIcon sideIcon2; + @SideOnly(Side.CLIENT) + private static IIcon bottomIcon; + + public BlockWritingTable() + { + super(Material.wood); + setHardness(2.0F); + setResistance(5.0F); + //setUnlocalizedName("blockWritingTable"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.topIcon = iconRegister.registerIcon("AlchemicalWizardry:AlchemicChemistrySet"); + this.sideIcon1 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType1"); + this.sideIcon2 = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_SideType2"); + this.bottomIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodAltar_Bottom"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (side) + { + case 0: + return bottomIcon; + + case 1: + return topIcon; + + //case 2: return sideIcon1; + //case 3: return sideIcon1; + //case 4: return sideIcon2; + //case 5: return sideIcon2; + default: + return sideIcon2; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int metadata, float what, float these, float are) + { + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (tileEntity == null || player.isSneaking()) + { + return false; + } + + //code to open gui explained later + player.openGui(AlchemicalWizardry.instance, 0, world, x, y, z); + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block par5, int par6) + { + dropItems(world, x, y, z); + super.breakBlock(world, x, y, z, par5, par6); + } + + private void dropItems(World world, int x, int y, int z) + { + Random rand = new Random(); + TileEntity tileEntity = world.getTileEntity(x, y, z); + + if (!(tileEntity instanceof IInventory)) + { + return; + } + + IInventory inventory = (IInventory) tileEntity; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + ItemStack item = inventory.getStackInSlot(i); + + if (item != null && item.stackSize > 0) + { + float rx = rand.nextFloat() * 0.8F + 0.1F; + float ry = rand.nextFloat() * 0.8F + 0.1F; + float rz = rand.nextFloat() * 0.8F + 0.1F; + EntityItem entityItem = new EntityItem(world, + x + rx, y + ry, z + rz, + new ItemStack(item.getItem(), item.stackSize, item.getItemDamage())); + + if (item.hasTagCompound()) + { + entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy()); + } + + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian() * factor; + entityItem.motionY = rand.nextGaussian() * factor + 0.2F; + entityItem.motionZ = rand.nextGaussian() * factor; + world.spawnEntityInWorld(entityItem); + item.stackSize = 0; + } + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TEWritingTable(); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity() + { + return true; + } + + @Override + public void addCollisionBoxesToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) + { + this.setBlockBounds(0.4375F, 0.0F, 0.4375F, 0.5625F, 0.9375F, 0.5625F); + super.addCollisionBoxesToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); + this.setBlockBoundsForItemRender(); + super.addCollisionBoxesToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); + } + + public void setBlockBoundsForItemRender() + { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java new file mode 100644 index 00000000..8646c022 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java @@ -0,0 +1,112 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BloodRune extends Block +{ + //private Icon bloodRuneIcon; + private IIcon altarCapacityRuneIcon; + private IIcon dislocationRuneIcon; + private IIcon orbCapacityRuneIcon; + + public BloodRune() + { + super(Material.iron); + //setUnlocalizedName("bloodRune"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:BlankRune"); + this.altarCapacityRuneIcon = iconRegister.registerIcon("AlchemicalWizardry:AltarCapacityRune"); + this.dislocationRuneIcon = iconRegister.registerIcon("AlchemicalWizardry:DislocationRune"); + this.orbCapacityRuneIcon = iconRegister.registerIcon("AlchemicalWizardry:OrbCapacityRune"); + } + + public int getRuneEffect(int metaData) + { + switch (metaData) + { + case 0: + return 0; + + case 1: //Altar Capacity rune + return 5; + + case 2: //Filling/emptying rune + return 6; + + case 3: //Orb Capacity rune + return 7; + } + + return 0; + } + + @SideOnly(Side.CLIENT) + + /** + * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) + */ + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + if (this.equals(ModBlocks.bloodRune)) + { + par3List.add(new ItemStack(par1, 1, 0)); + par3List.add(new ItemStack(par1, 1, 1)); + par3List.add(new ItemStack(par1, 1, 2)); + par3List.add(new ItemStack(par1, 1, 3)); + } else + { + super.getSubBlocks(par1, par2CreativeTabs, par3List); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (meta) + { + case 0: + return blockIcon; + + case 1: + return altarCapacityRuneIcon; + + case 2: + return dislocationRuneIcon; + + case 3: + return this.orbCapacityRuneIcon; + + default: + return blockIcon; + } + } + + @Override + public int damageDropped(int metadata) + { + return metadata; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java new file mode 100644 index 00000000..33652470 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BloodStoneBrick extends Block +{ + public BloodStoneBrick() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("bloodStoneBrick"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodStoneBrick"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java new file mode 100644 index 00000000..1b247c24 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java @@ -0,0 +1,31 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EfficiencyRune extends BloodRune +{ + public EfficiencyRune() + { + super(); + //setUnlocalizedName("efficiencyRune"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:EfficiencyRune"); + } + + @Override + public int getRuneEffect(int metaData) + { + return 2; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java new file mode 100644 index 00000000..844eba08 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java @@ -0,0 +1,34 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EmptySocket extends Block +{ + public EmptySocket() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("emptySocket"); + // TODO Auto-generated constructor stub + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:EmptySocket"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java new file mode 100644 index 00000000..93b170b0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java @@ -0,0 +1,14 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface IOrientable +{ + public ForgeDirection getInputDirection(); + + public ForgeDirection getOutputDirection(); + + public void setInputDirection(ForgeDirection direction); + + public void setOutputDirection(ForgeDirection direction); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java new file mode 100644 index 00000000..cb1bf106 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java @@ -0,0 +1,143 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ImperfectRitualStone extends Block +{ + public ImperfectRitualStone() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("imperfectRitualStone"); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:ImperfectRitualStone"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float xOff, float yOff, float zOff) + { + //ItemStack ist = player.getItemInUse(); + //if (!world.isRemote) + { + Block block = world.getBlock(x, y + 1, z); + + if (block == Blocks.water) + { + if (!player.capabilities.isCreativeMode && world.isRemote) + { + + //PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(SpellHelper.getUsername(player) , -5000, 0)); + } + + if (!world.isRemote) + { + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 2, z)); +// if (!player.capabilities.isCreativeMode) +// { +// PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(player.getEntityName(), -5000, 0)); +// } + } + + world.getWorldInfo().setRaining(true); + + if (world.isRemote) + { + world.setRainStrength(1.0F); + } + + world.setThunderStrength(1.0f); + world.getWorldInfo().setThunderTime(0); + world.getWorldInfo().setThundering(true); + return true; + } else if (block == Blocks.coal_block) + { + if (!player.capabilities.isCreativeMode && world.isRemote) + { + EnergyItems.drainPlayerNetwork(player, 5000); + } + + //EntityFallenAngel zomb = new EntityFallenAngel(world); + EntityZombie zomb = new EntityZombie(world); + zomb.setPosition(x + 0.5, y + 2, z + 0.5); + // zomb.setCurrentItemOrArmor(4, new ItemStack(Item.helmetIron.itemID,1,0)); + // zomb.setCurrentItemOrArmor(3, new ItemStack(Item.plateIron.itemID,1,0)); + // zomb.setCurrentItemOrArmor(2, new ItemStack(Item.legsIron.itemID,1,0)); + // zomb.setCurrentItemOrArmor(1, new ItemStack(Item.bootsIron.itemID,1,0)); + //zomb.setCurrentItemOrArmor(0, new ItemStack(AlchemicalWizardry.energySword.itemID,1,0)); + zomb.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 2000)); + zomb.addPotionEffect(new PotionEffect(Potion.damageBoost.id, 20000, 7)); + zomb.addPotionEffect(new PotionEffect(Potion.resistance.id, 20000, 3)); + + if (!world.isRemote) + { + world.spawnEntityInWorld(zomb); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 2, z)); +// if (!player.capabilities.isCreativeMode) +// { +// PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(player.getEntityName(), -5000, 0)); +// } + } + + return true; + } else if (block== Blocks.lapis_block) + { + if (!player.capabilities.isCreativeMode && world.isRemote) + { + EnergyItems.drainPlayerNetwork(player, 5000); + } + + if (!world.isRemote) + { + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 2, z)); + world.setWorldTime((world.getWorldTime() / 24000) * 24000 + 13800); +// if (!player.capabilities.isCreativeMode) +// { +// PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(player.getEntityName(), -5000, 0)); +// } + } + } else if (block == Blocks.bedrock) + { + if (!player.capabilities.isCreativeMode && world.isRemote) + { + EnergyItems.drainPlayerNetwork(player, 5000); + } + + if (!world.isRemote) + { + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 2, z)); + //world.setWorldTime((world.getWorldTime()/24000)*24000+13800); +// if (!player.capabilities.isCreativeMode) +// { +// PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(player.getEntityName(), -5000, 0)); +// } + } + + player.addPotionEffect(new PotionEffect(Potion.resistance.id, 60 * 20, 1)); + } + } + return false; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java new file mode 100644 index 00000000..1b304938 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class LargeBloodStoneBrick extends Block +{ + public LargeBloodStoneBrick() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setUnlocalizedName("largeBloodStoneBrick"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:LargeBloodStoneBrick"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java new file mode 100644 index 00000000..3407b8c2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidClassic; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class LifeEssenceBlock extends BlockFluidClassic +{ + public LifeEssenceBlock() + { + super(AlchemicalWizardry.lifeEssenceFluid, Material.water); + AlchemicalWizardry.lifeEssenceFluid.setBlock(this); + //setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:lifeEssenceStill"); + this.getFluid().setIcons(blockIcon); + } + + @Override + public boolean canDisplace(IBlockAccess world, int x, int y, int z) + { + if (world.getBlock(x, y, z).getMaterial().isLiquid()) + { + return false; + } + + return super.canDisplace(world, x, y, z); + } + + @Override + public boolean displaceIfPossible(World world, int x, int y, int z) + { + if (world.getBlock(x, y, z).getMaterial().isLiquid()) + { + return false; + } + + return super.displaceIfPossible(world, x, y, z); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java new file mode 100644 index 00000000..b818b064 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java @@ -0,0 +1,122 @@ +package WayofTime.alchemicalWizardry.common.block; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.ScribeTool; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class RitualStone extends Block +{ + @SideOnly(Side.CLIENT) + private static IIcon blankIcon; + @SideOnly(Side.CLIENT) + private static IIcon waterStoneIcon; + @SideOnly(Side.CLIENT) + private static IIcon fireStoneIcon; + @SideOnly(Side.CLIENT) + private static IIcon earthStoneIcon; + @SideOnly(Side.CLIENT) + private static IIcon airStoneIcon; + @SideOnly(Side.CLIENT) + private static IIcon duskStoneIcon; + + public RitualStone() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + //setUnlocalizedName("ritualStone"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blankIcon = iconRegister.registerIcon("AlchemicalWizardry:RitualStone"); + this.waterStoneIcon = iconRegister.registerIcon("AlchemicalWizardry:WaterRitualStone"); + this.fireStoneIcon = iconRegister.registerIcon("AlchemicalWizardry:FireRitualStone"); + this.earthStoneIcon = iconRegister.registerIcon("AlchemicalWizardry:EarthRitualStone"); + this.airStoneIcon = iconRegister.registerIcon("AlchemicalWizardry:AirRitualStone"); + this.duskStoneIcon = iconRegister.registerIcon("AlchemicalWizardry:DuskRitualStone"); + } + + @Override + public int damageDropped(int metadata) + { + return 0; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem == null) + { + return false; + } + + Item item = playerItem.getItem(); + + if (!(item instanceof ScribeTool)) + { + return false; + } + + if (playerItem.getMaxDamage() <= playerItem.getItemDamage() && !(playerItem.getMaxDamage() == 0)) + { + return false; + } + + ScribeTool scribeTool = (ScribeTool) item; + + if (!player.capabilities.isCreativeMode) + { + playerItem.setItemDamage(playerItem.getItemDamage() + 1); + } + + world.setBlockMetadataWithNotify(x, y, z, scribeTool.getType(), 3); + world.markBlockForUpdate(x, y, z); + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) + { + switch (metadata) + { + case 0: + return blankIcon; + + case 1: + return waterStoneIcon; + + case 2: + return fireStoneIcon; + + case 3: + return earthStoneIcon; + + case 4: + return airStoneIcon; + + case 5: + return duskStoneIcon; + + default: + return blankIcon; + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java new file mode 100644 index 00000000..147c1c7e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java @@ -0,0 +1,31 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class RuneOfSacrifice extends BloodRune +{ + public RuneOfSacrifice() + { + super(); + //setUnlocalizedName("runeOfSacrifice"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:RuneOfSacrifice"); + } + + @Override + public int getRuneEffect(int metaData) + { + return 3; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java new file mode 100644 index 00000000..54244e07 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java @@ -0,0 +1,31 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class RuneOfSelfSacrifice extends BloodRune +{ + public RuneOfSelfSacrifice() + { + super(); + //setUnlocalizedName("runeOfSelfSacrifice"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:RuneOfSelfSacrifice"); + } + + @Override + public int getRuneEffect(int metaData) + { + return 4; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java new file mode 100644 index 00000000..0bbab952 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java @@ -0,0 +1,104 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SpectralBlock extends Block +{ + public SpectralBlock() + { + super(Material.rock); + //this.setUnlocalizedName("spectralBlock"); + } + +// @Override +// public int tickRate(World par1World) +// { +// return 10; +// } + + /** + * Ticks the block if it's been scheduled + */ + @Override + public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) + { + //if(!par1World.isRemote) + par1World.setBlockToAir(par2, par3, par4); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:SpectralBlock"); + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public int quantityDropped(Random par1Random) + { + return 0; + } + + @SideOnly(Side.CLIENT) + /** + * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha + */ + public int getRenderBlockPass() + { + return 1; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int idk, float what, float these, float are) + { + //TEAltar tileEntity = (TEAltar)world.getBlockTileEntity(x, y, z); + if (player.isSneaking()) + { + return false; + } + + ItemStack playerItem = player.getCurrentEquippedItem(); + + if (playerItem != null) + { + if (playerItem.getItem() instanceof ItemBlock) + { + world.setBlock(x, y, z, ((ItemBlock)(playerItem.getItem())).field_150939_a, playerItem.getItemDamage(), 3); + + if (!player.capabilities.isCreativeMode) + { + playerItem.stackSize--; + } + + return true; + } else + { + return false; + } + } + + return true; + } + + @Override + public void onBlockAdded(World par1World, int par2, int par3, int par4) + { + par1World.scheduleBlockUpdate(par2, par3, par4, this, 100); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java new file mode 100644 index 00000000..5f4a71d5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java @@ -0,0 +1,31 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SpeedRune extends BloodRune +{ + public SpeedRune() + { + super(); + //setUnlocalizedName("speedRune"); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:SpeedRune"); + } + + @Override + public int getRuneEffect(int metaData) + { + return 1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java new file mode 100644 index 00000000..4aeb4e75 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java @@ -0,0 +1,60 @@ +package WayofTime.alchemicalWizardry.common.bloodAltarUpgrade; + +import net.minecraft.block.Block; + +public class AltarComponent +{ + private int x; + private int y; + private int z; + private Block block; + private int metadata; + private boolean isBloodRune; + private boolean isUpgradeSlot; + + public AltarComponent(int x, int y, int z, Block block, int metadata, boolean isBloodRune, boolean isUpgradeSlot) + { + this.x = x; + this.y = y; + this.z = z; + this.block = block; + this.metadata = metadata; + this.isBloodRune = isBloodRune; + this.isUpgradeSlot = isUpgradeSlot; + } + + public int getX() + { + return x; + } + + public int getY() + { + return y; + } + + public int getZ() + { + return z; + } + + public Block getBlock() + { + return block; + } + + public int getMetadata() + { + return metadata; + } + + public boolean isBloodRune() + { + return isBloodRune; + } + + public boolean isUpgradeSlot() + { + return isUpgradeSlot; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java new file mode 100644 index 00000000..acdede16 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java @@ -0,0 +1,93 @@ +package WayofTime.alchemicalWizardry.common.bloodAltarUpgrade; + +public class AltarUpgradeComponent +{ + private int speedUpgrades; + private int efficiencyUpgrades; + private int sacrificeUpgrades; + private int selfSacrificeUpgrades; + private int displacementUpgrades; + private int altarCapacitiveUpgrades; + private int orbCapacitiveUpgrades; + + public AltarUpgradeComponent() + { + speedUpgrades = 0; + efficiencyUpgrades = 0; + sacrificeUpgrades = 0; + selfSacrificeUpgrades = 0; + displacementUpgrades = 0; + altarCapacitiveUpgrades = 0; + orbCapacitiveUpgrades = 0; + } + + public void addSpeedUpgrade() + { + speedUpgrades++; + } + + public void addEfficiencyUpgrade() + { + efficiencyUpgrades++; + } + + public void addSacrificeUpgrade() + { + sacrificeUpgrades++; + } + + public void addSelfSacrificeUpgrade() + { + selfSacrificeUpgrades++; + } + + public void addDisplacementUpgrade() + { + displacementUpgrades++; + } + + public void addaltarCapacitiveUpgrade() + { + altarCapacitiveUpgrades++; + } + + public void addorbCapacitiveUpgrade() + { + orbCapacitiveUpgrades++; + } + + public int getSpeedUpgrades() + { + return speedUpgrades; + } + + public int getEfficiencyUpgrades() + { + return efficiencyUpgrades; + } + + public int getSacrificeUpgrades() + { + return sacrificeUpgrades; + } + + public int getSelfSacrificeUpgrades() + { + return selfSacrificeUpgrades; + } + + public int getDisplacementUpgrades() + { + return displacementUpgrades; + } + + public int getAltarCapacitiveUpgrades() + { + return this.altarCapacitiveUpgrades; + } + + public int getOrbCapacitiveUpgrades() + { + return this.orbCapacitiveUpgrades; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java new file mode 100644 index 00000000..d5db3638 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java @@ -0,0 +1,296 @@ +package WayofTime.alchemicalWizardry.common.bloodAltarUpgrade; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.block.BloodRune; + +public class UpgradedAltars +{ + public static List secondTierAltar = new ArrayList(); + public static List thirdTierAltar = new ArrayList(); + public static List fourthTierAltar = new ArrayList(); + public static List fifthTierAltar = new ArrayList(); + public static int highestAltar = 5; + + public static int isAltarValid(World world, int x, int y, int z) + { + for (int i = highestAltar; i >= 2; i--) + { + if (checkAltarIsValid(world, x, y, z, i)) + { + return i; + } + } + + return 1; + } + + public static boolean checkAltarIsValid(World world, int x, int y, int z, int altarTier) + { + switch (altarTier) + { + case 1: + return true; + + case 2: + for (AltarComponent ac : secondTierAltar) + { + if (ac.isBloodRune()) + { + Block testBlock = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (!(testBlock instanceof BloodRune)) + { + return false; + } + } else + { + Block block = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + int metadata = world.getBlockMetadata(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (((ac.getBlock() != block) || (ac.getMetadata() != metadata)) && !(ac.getBlock() == Blocks.stonebrick && !world.isAirBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()))) + { + return false; + } + } + } + + return true; + + case 3: + for (AltarComponent ac : thirdTierAltar) + { + if (ac.isBloodRune()) + { + Block testBlock = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (!(testBlock instanceof BloodRune)) + { + return false; + } + } else + { + Block block = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + int metadata = world.getBlockMetadata(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (((ac.getBlock() != block) || (ac.getMetadata() != metadata)) && !(ac.getBlock() == Blocks.stonebrick && !world.isAirBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()))) + { + return false; + } + } + } + + return true; + + case 4: + for (AltarComponent ac : fourthTierAltar) + { + if (ac.isBloodRune()) + { + Block testBlock = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (!(testBlock instanceof BloodRune)) + { + return false; + } + } else + { + Block block = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + int metadata = world.getBlockMetadata(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (((ac.getBlock() != block) || (ac.getMetadata() != metadata)) && !(ac.getBlock() == Blocks.stonebrick && !world.isAirBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()))) + { + return false; + } + } + } + + return true; + + case 5: + for (AltarComponent ac : fifthTierAltar) + { + if (ac.isBloodRune()) + { + Block testBlock = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (!(testBlock instanceof BloodRune)) + { + return false; + } + } else + { + Block block = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + int metadata = world.getBlockMetadata(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (((ac.getBlock() != block) || (ac.getMetadata() != metadata)) && !(ac.getBlock() == Blocks.stonebrick && !world.isAirBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()))) + { + return false; + } + } + } + + return true; + + default: + return false; + } + } + + public static AltarUpgradeComponent getUpgrades(World world, int x, int y, int z, int altarTier) + { + AltarUpgradeComponent upgrades = new AltarUpgradeComponent(); + List list = UpgradedAltars.getAltarUpgradeListForTier(altarTier); + + for (AltarComponent ac : list) + { + if (ac.isUpgradeSlot()) + { + //Currently checks the getRuneEffect. + //TODO Change so that it uses the metadata instead, with the BlockID. + Block testBlock = world.getBlock(x + ac.getX(), y + ac.getY(), z + ac.getZ()); + + if (testBlock instanceof BloodRune) + { + if (!world.isRemote) + { + switch (((BloodRune) testBlock).getRuneEffect(world.getBlockMetadata(x + ac.getX(), y + ac.getY(), z + ac.getZ()))) + { + case 1: + upgrades.addSpeedUpgrade(); + break; + + case 2: + upgrades.addEfficiencyUpgrade(); + break; + + case 3: + upgrades.addSacrificeUpgrade(); + break; + + case 4: + upgrades.addSelfSacrificeUpgrade(); + break; + + case 5: + upgrades.addaltarCapacitiveUpgrade(); + break; + + case 6: + upgrades.addDisplacementUpgrade(); + break; + + case 7: + upgrades.addorbCapacitiveUpgrade(); + break; + } + } + } + } + } + + return upgrades; + } + + public static void loadAltars() + { + secondTierAltar.add(new AltarComponent(-1, -1, -1, ModBlocks.bloodRune, 0, true, false)); + secondTierAltar.add(new AltarComponent(0, -1, -1, ModBlocks.bloodRune, 0, true, true)); + secondTierAltar.add(new AltarComponent(1, -1, -1, ModBlocks.bloodRune, 0, true, false)); + secondTierAltar.add(new AltarComponent(-1, -1, 0, ModBlocks.bloodRune, 0, true, true)); + secondTierAltar.add(new AltarComponent(1, -1, 0, ModBlocks.bloodRune, 0, true, true)); + secondTierAltar.add(new AltarComponent(-1, -1, 1, ModBlocks.bloodRune, 0, true, false)); + secondTierAltar.add(new AltarComponent(0, -1, 1, ModBlocks.bloodRune, 0, true, true)); + secondTierAltar.add(new AltarComponent(1, -1, 1, ModBlocks.bloodRune, 0, true, false)); + thirdTierAltar.add(new AltarComponent(-1, -1, -1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(0, -1, -1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(1, -1, -1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(-1, -1, 0, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(1, -1, 0, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(-1, -1, 1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(0, -1, 1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(1, -1, 1, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(-3, -1, -3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(-3, 0, -3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, -1, -3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, 0, -3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(-3, -1, 3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(-3, 0, 3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, -1, 3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, 0, 3, Blocks.stonebrick, 0, false, false)); + thirdTierAltar.add(new AltarComponent(-3, 1, -3, Blocks.glowstone, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, 1, -3, Blocks.glowstone, 0, false, false)); + thirdTierAltar.add(new AltarComponent(-3, 1, 3, Blocks.glowstone, 0, false, false)); + thirdTierAltar.add(new AltarComponent(3, 1, 3, Blocks.glowstone, 0, false, false)); + + for (int i = -2; i <= 2; i++) + { + thirdTierAltar.add(new AltarComponent(3, -2, i, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(-3, -2, i, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(i, -2, 3, ModBlocks.bloodRune, 0, true, true)); + thirdTierAltar.add(new AltarComponent(i, -2, -3, ModBlocks.bloodRune, 0, true, true)); + } + + fourthTierAltar.addAll(thirdTierAltar); + + for (int i = -3; i <= 3; i++) + { + fourthTierAltar.add(new AltarComponent(5, -3, i, ModBlocks.bloodRune, 0, true, true)); + fourthTierAltar.add(new AltarComponent(-5, -3, i, ModBlocks.bloodRune, 0, true, true)); + fourthTierAltar.add(new AltarComponent(i, -3, 5, ModBlocks.bloodRune, 0, true, true)); + fourthTierAltar.add(new AltarComponent(i, -3, -5, ModBlocks.bloodRune, 0, true, true)); + } + + for (int i = -2; i <= 1; i++) + { + fourthTierAltar.add(new AltarComponent(5, i, 5, Blocks.stonebrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(5, i, -5, Blocks.stonebrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(-5, i, -5, Blocks.stonebrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(-5, i, 5, Blocks.stonebrick, 0, false, false)); + } + + fourthTierAltar.add(new AltarComponent(5, 2, 5, ModBlocks.largeBloodStoneBrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(5, 2, -5, ModBlocks.largeBloodStoneBrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(-5, 2, -5, ModBlocks.largeBloodStoneBrick, 0, false, false)); + fourthTierAltar.add(new AltarComponent(-5, 2, 5, ModBlocks.largeBloodStoneBrick, 0, false, false)); + fifthTierAltar.addAll(fourthTierAltar); + fifthTierAltar.add(new AltarComponent(-8, -3, 8, Blocks.beacon, 0, false, false)); + fifthTierAltar.add(new AltarComponent(-8, -3, -8, Blocks.beacon, 0, false, false)); + fifthTierAltar.add(new AltarComponent(8, -3, 8, Blocks.beacon, 0, false, false)); + fifthTierAltar.add(new AltarComponent(8, -3, 8, Blocks.beacon, 0, false, false)); + + for (int i = -6; i <= 6; i++) + { + fifthTierAltar.add(new AltarComponent(8, -4, i, ModBlocks.bloodRune, 0, true, true)); + fifthTierAltar.add(new AltarComponent(-8, -4, i, ModBlocks.bloodRune, 0, true, true)); + fifthTierAltar.add(new AltarComponent(i, -4, 8, ModBlocks.bloodRune, 0, true, true)); + fifthTierAltar.add(new AltarComponent(i, -4, -8, ModBlocks.bloodRune, 0, true, true)); + } + } + + public static List getAltarUpgradeListForTier(int tier) + { + switch (tier) + { + case 2: + return secondTierAltar; + + case 3: + return thirdTierAltar; + + case 4: + return fourthTierAltar; + + case 5: + return fifthTierAltar; + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java new file mode 100644 index 00000000..f394162d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java @@ -0,0 +1,493 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.ai.EntityAIFollowOwner; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; +import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; + +public class EntityBileDemon extends EntityDemon +{ + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 100.0F; + private static float maxUntamedHealth = 200.0F; + private int attackTimer; + + public EntityBileDemon(World par1World) + { + super(par1World, AlchemicalWizardry.entityBileDemonID); + this.setSize(1.3F, 2.0F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(2, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(3, this.aiSit); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + attackTimer = 0; + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.20000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + par1NBTTagCompound.setByte("attackTimer", (byte) attackTimer); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + attackTimer = par1NBTTagCompound.getByte("attackTimer"); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.irongolem.hit"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.irongolem.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 1.0F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + + if (attackTimer > 0) + { + attackTimer--; + } + } + + public int getAttackTimer() + { + return attackTimer; + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + this.attackTimer = 10; + this.worldObj.setEntityState(this, (byte) 4); + boolean flag = par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) (7 + this.rand.nextInt(15))); + + if (flag) + { + par1Entity.motionY += 0.4000000059604645D; + } + + this.playSound("mob.irongolem.throw", 1.0F, 1.0F); + return flag; + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + @Override + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityBileDemon) + { + EntityBileDemon entitywolf = (EntityBileDemon) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java new file mode 100644 index 00000000..cc0f18c3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java @@ -0,0 +1,499 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.*; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityBoulderFist extends EntityDemon +{ + //private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 40, 40, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 60.0F; + private static float maxUntamedHealth = 50.0F; + + public EntityBoulderFist(World par1World) + { + super(par1World, AlchemicalWizardry.entityBoulderFistID); + this.setSize(0.8F, 1.2F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + //TODO change sounds + return this.isAngry() ? "mob.wolf.growl" : (this.rand.nextInt(3) == 0 ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.wolf.hurt"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.wolf.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 6 : 7; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + @Override + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityBoulderFist) + { + EntityBoulderFist entitywolf = (EntityBoulderFist) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + HolyProjectile hol = new HolyProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 5, 600); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + //this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiAttackOnCollide); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java new file mode 100644 index 00000000..f28cbb75 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java @@ -0,0 +1,94 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.passive.EntityTameable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.IDemon; +import WayofTime.alchemicalWizardry.common.items.DemonPlacer; + +public class EntityDemon extends EntityTameable implements IDemon +{ + private boolean isAggro; + private int demonID; + + public EntityDemon(World par1World, int demonID) + { + super(par1World); + this.demonID = demonID; + } + + @Override + public void setSummonedConditions() + { + this.setAggro(true); + } + + @Override + public boolean isAggro() + { + return this.isAggro; + } + + @Override + public void setAggro(boolean aggro) + { + this.isAggro = aggro; + } + + @Override + public EntityAgeable createChild(EntityAgeable entityageable) + { + // TODO Auto-generated method stub + return null; + } + + protected void dropFewItems(boolean par1, int par2) + { + ItemStack drop = new ItemStack(ModItems.demonPlacer, 1, this.getDemonID()); + DemonPlacer.setOwnerName(drop, this.getOwnerName()); + + if (this.hasCustomNameTag()) + { + drop.setStackDisplayName(this.getCustomNameTag()); + } + + this.entityDropItem(drop, 0.0f); + } + + public void onLivingUpdate() + { + super.onLivingUpdate(); + + if (!this.isAggro() && worldObj.getWorldTime() % 100 == 0) + { + this.heal(1); + } + } + + public void sendSittingMessageToPlayer(EntityPlayer owner, boolean isSitting) + { + if (owner != null && owner.worldObj.isRemote) + { + ChatComponentText chatmessagecomponent; + + if (isSitting) + { + chatmessagecomponent = new ChatComponentText("I will stay here for now, Master."); + } else + { + chatmessagecomponent = new ChatComponentText("I shall follow and protect you!"); + } + + owner.addChatComponentMessage(chatmessagecomponent); + } + } + + public int getDemonID() + { + return this.demonID; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java new file mode 100644 index 00000000..5d7b5045 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java @@ -0,0 +1,28 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityEarthElemental extends EntityElemental implements IMob +{ + public EntityEarthElemental(World world) + { + super(world, AlchemicalWizardry.entityEarthElementalID); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).attackEntityFrom(DamageSource.causeMobDamage(this), 10); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 4)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java new file mode 100644 index 00000000..f07dc92c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java @@ -0,0 +1,750 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import java.util.List; + +public class EntityElemental extends EntityDemon +{ + //private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 40, 40, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 100.0F; + private static float maxUntamedHealth = 100.0F; + + public EntityElemental(World par1World, int demonID) + { + super(par1World, demonID); + this.setSize(0.5F, 1.0F); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + public int courseChangeCooldown; + public double waypointX; + public double waypointY; + public double waypointZ; + private Entity targetedEntity; + + /** + * Cooldown time between target loss and new target aquirement. + */ + private int aggroCooldown; + public int prevAttackCounter; + public int attackCounter; + + /** + * The explosion radius of spawned fireballs. + */ + //private int explosionStrength = 1; +// +// private int heightOffsetUpdateTime; +// private float heightOffset = 0.5F; +// private int field_70846_g; + protected void dropFewItems(boolean par1, int par2) + { + if (worldObj.rand.nextFloat() < (1 - Math.pow(0.6f, par2 + 1))) + { + this.entityDropItem(new ItemStack(ModItems.demonBloodShard, 1, 0), 0.0f); + } + } + + protected void fall(float par1) + { + } + + /** + * Takes in the distance the entity has fallen this tick and whether its on the ground to update the fall distance + * and deal fall damage if landing on the ground. Args: distanceFallenThisTick, onGround + */ + protected void updateFallState(double par1, boolean par3) + { + } + + /** + * Moves the entity based on the specified heading. Args: strafe, forward + */ + public void moveEntityWithHeading(float par1, float par2) + { + if (this.isInWater()) + { + this.moveFlying(par1, par2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.800000011920929D; + this.motionY *= 0.800000011920929D; + this.motionZ *= 0.800000011920929D; + } else if (this.handleLavaMovement()) + { + this.moveFlying(par1, par2, 0.02F); + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.5D; + this.motionY *= 0.5D; + this.motionZ *= 0.5D; + } else + { + float f2 = 0.91F; + + if (this.onGround) + { + f2 = 0.54600006F; + Block i = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + + if (i != null) + { + f2 = i.slipperiness * 0.91F; + } + } + + float f3 = 0.16277136F / (f2 * f2 * f2); + this.moveFlying(par1, par2, this.onGround ? 0.1F * f3 : 0.02F); + f2 = 0.91F; + + if (this.onGround) + { + f2 = 0.54600006F; + Block j = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)); + + if (j != null) + { + f2 = j.slipperiness * 0.91F; + } + } + + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= (double) f2; + this.motionY *= (double) f2; + this.motionZ *= (double) f2; + } + + double d0 = this.posX - this.prevPosX; + double d1 = this.posZ - this.prevPosZ; + float f4 = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; + + if (f4 > 1.0F) + { + f4 = 1.0F; + } + } + + /** + * returns true if this entity is by a ladder, false otherwise + */ + public boolean isOnLadder() + { + return false; + } + + @SideOnly(Side.CLIENT) + public boolean func_110182_bF() + { + return this.dataWatcher.getWatchableObjectByte(25) != 0; + } + + protected void updateEntityActionState() + { +// if (!this.worldObj.isRemote && this.worldObj.difficultySetting == 0) +// { +// this.setDead(); +// } + + //this.despawnEntity(); + if (this.getHealth() <= this.getMaxHealth() / 2.0f && worldObj.rand.nextInt(200) == 0) + { + this.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionReciprocation.id, 100, 1)); + } + + this.prevAttackCounter = this.attackCounter; + double d0 = this.waypointX - this.posX; + double d1 = this.waypointY - this.posY; + double d2 = this.waypointZ - this.posZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + + if (d3 < 1.0D || d3 > 3600.0D) + { + this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointY = this.posY + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + } + + if (this.courseChangeCooldown-- <= 0) + { + this.courseChangeCooldown += this.rand.nextInt(5) + 2; + d3 = (double) MathHelper.sqrt_double(d3); + + if (this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, d3)) + { + this.motionX += d0 / d3 * 0.1D; + this.motionY += d1 / d3 * 0.1D; + this.motionZ += d2 / d3 * 0.1D; + } else + { + this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointY = this.posY + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + } + } + + if (this.targetedEntity != null && this.targetedEntity.isDead) + { + this.targetedEntity = null; + } + + if (this.targetedEntity == null || this.aggroCooldown-- <= 0) + { + this.targetedEntity = getClosestVulnerableMonsterToEntity(this, 100.0D); + + if (this.targetedEntity != null) + { + this.aggroCooldown = 20; + } + } + + double d4 = 64.0D; + + if (this.targetedEntity != null && this.targetedEntity.getDistanceSqToEntity(this) < d4 * d4) + { + double d5 = this.targetedEntity.posX - this.posX; + double d6 = this.targetedEntity.boundingBox.minY + (double) (this.targetedEntity.height / 2.0F) - (this.posY + (double) (this.height / 2.0F)); + double d7 = this.targetedEntity.posZ - this.posZ; + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(d5, d7)) * 180.0F / (float) Math.PI; + + if (this.courseChangeCooldown <= 0) + { + if (isCourseTraversable(this.targetedEntity.posX, this.targetedEntity.posY, this.targetedEntity.posZ, Math.sqrt(d5 * d5 + d6 * d6 + d7 * d7))) + { + this.waypointX = this.targetedEntity.posX; + this.waypointY = this.targetedEntity.posY; + this.waypointZ = this.targetedEntity.posZ; + this.motionX += d5 / d3 * 0.1D; + this.motionY += d6 / d3 * 0.1D; + this.motionZ += d7 / d3 * 0.1D; + } else + { + this.waypointX = this.posX + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointY = this.posY + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.waypointZ = this.posZ + (double) ((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F); + this.motionX += d5 / d3 * 0.1D; + this.motionY += d6 / d3 * 0.1D; + this.motionZ += d7 / d3 * 0.1D; + } + } + + if (this.canEntityBeSeen(this.targetedEntity)) + { + if (Math.sqrt(d5 * d5 + d6 * d6 + d7 * d7) < 4) + { +// if (this.attackCounter == 10) +// { +// this.worldObj.playAuxSFXAtEntity((EntityPlayer)null, 1007, (int)this.posX, (int)this.posY, (int)this.posZ, 0); +// } + ++this.attackCounter; + + if (this.attackCounter >= 10) + { + this.worldObj.playAuxSFXAtEntity((EntityPlayer) null, 1008, (int) this.posX, (int) this.posY, (int) this.posZ, 0); + this.inflictEffectOnEntity(this.targetedEntity); + this.attackCounter = -40; + } + } + } else if (this.attackCounter > 0) + { + --this.attackCounter; + } + } else + { + this.renderYawOffset = this.rotationYaw = -((float) Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float) Math.PI; + + if (this.attackCounter > 0) + { + --this.attackCounter; + } + } + + if (!this.worldObj.isRemote) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(25); + byte b1 = (byte) (this.attackCounter > 10 ? 1 : 0); + + if (b0 != b1) + { + this.dataWatcher.updateObject(25, Byte.valueOf(b1)); + } + } + } + + /** + * True if the ghast has an unobstructed line of travel to the waypoint. + */ + private boolean isCourseTraversable(double par1, double par3, double par5, double par7) + { + double d4 = (this.waypointX - this.posX) / par7; + double d5 = (this.waypointY - this.posY) / par7; + double d6 = (this.waypointZ - this.posZ) / par7; + AxisAlignedBB axisalignedbb = this.boundingBox.copy(); + + for (int i = 1; (double) i < par7; ++i) + { + axisalignedbb.offset(d4, d5, d6); + + if (!this.worldObj.getCollidingBoundingBoxes(this, axisalignedbb).isEmpty()) + { + return false; + } + } + + return true; + } + + /** + * Will return how many at most can spawn in a chunk at once. + */ + public int getMaxSpawnedInChunk() + { + return 1; + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return false; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + this.dataWatcher.addObject(25, Byte.valueOf((byte) 0)); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + //TODO change sounds + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "none"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 6 : 7; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + @Override + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityBoulderFist) + { + EntityBoulderFist entitywolf = (EntityBoulderFist) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + //return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer)par2EntityLivingBase).func_96122_a((EntityPlayer)par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse)par1EntityLivingBase).func_110248_bS(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + //this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiAttackOnCollide); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionDrowning.id, 100, 0)); + } + } + + public static Entity getClosestVulnerableMonsterToEntity(Entity par1Entity, double par2) + { + double d4 = -1.0D; + double par1 = par1Entity.posX; + double par3 = par1Entity.posY; + double par5 = par1Entity.posZ; + + EntityLivingBase entityLiving = null; + World world = par1Entity.worldObj; + + double range = Math.sqrt(par2); + double verticalRange = Math.sqrt(par2); + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(par1 - 0.5f, par3 - 0.5f, par5 - 0.5f, par1 + 0.5f, par3 + 0.5f, par5 + 0.5f).expand(range, verticalRange, range)); + if (entities == null) + { + return null; + } + + for (int i = 0; i < entities.size(); ++i) + { + EntityLivingBase entityLiving1 = entities.get(i); + + if (!(entityLiving1 instanceof EntityPlayer && ((EntityPlayer) entityLiving1).capabilities.disableDamage) && entityLiving1.isEntityAlive()) + { + double d5 = entityLiving1.getDistanceSq(par1, par3, par5); + double d6 = par2; + + if (entityLiving1.isSneaking()) + { + d6 = par2 * 0.800000011920929D; + } + + if (entityLiving1.isInvisible()) + { + float f = entityLiving1 instanceof EntityPlayer ? ((EntityPlayer) entityLiving1).getArmorVisibility() : 1.0f; + + if (f < 0.1F) + { + f = 0.1F; + } + + d6 *= (double) (0.7F * f); + } + + if ((par2 < 0.0D || d5 < d6 * d6) && (d4 == -1.0D || d5 < d4)) + { + if (par1Entity != entityLiving1) + { + d4 = d5; + entityLiving = entityLiving1; + } + } + } + } + + return entityLiving; + } + + @Override + public int getTotalArmorValue() //TODO + { + return 10; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java new file mode 100644 index 00000000..dc250f44 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java @@ -0,0 +1,507 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IRangedAttackMob; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIArrowAttack; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.ai.EntityAIFollowOwner; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; +import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; + +public class EntityFallenAngel extends EntityDemon implements IRangedAttackMob +{ + private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 40, 40, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 50.0F; + private static float maxUntamedHealth = 50.0F; + + public EntityFallenAngel(World par1World) + { + super(par1World, AlchemicalWizardry.entityFallenAngelID); + this.setSize(0.7F, 1.8F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + //this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + //TODO change sounds + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.wolf.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 4 : 2; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityFallenAngel) + { + EntityFallenAngel entitywolf = (EntityFallenAngel) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + HolyProjectile hol = new HolyProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 5, 600); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiArrowAttack); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java new file mode 100644 index 00000000..a599be7c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java @@ -0,0 +1,26 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +public class EntityFireElemental extends EntityElemental implements IMob +{ + public EntityFireElemental(World world) + { + super(world, AlchemicalWizardry.entityFireElementalID); + this.isImmuneToFire = true; + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).setFire(10); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java new file mode 100644 index 00000000..c4c626a0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java @@ -0,0 +1,28 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityHolyElemental extends EntityElemental implements IMob +{ + public EntityHolyElemental(World world) + { + super(world, AlchemicalWizardry.entityHolyElementalID); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).attackEntityFrom(DamageSource.causeMobDamage(this), 15); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.poison.id, 100, 1)); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java new file mode 100644 index 00000000..99f6f7c3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java @@ -0,0 +1,529 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IRangedAttackMob; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIArrowAttack; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.ai.EntityAIFollowOwner; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; +import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.IceProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class EntityIceDemon extends EntityDemon implements IRangedAttackMob +{ + private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 30, 50, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 50.0F; + private static float maxUntamedHealth = 30.0F; + + public EntityIceDemon(World par1World) + { + super(par1World, AlchemicalWizardry.entityIceDemonID); + this.setSize(0.5F, 2.0F); + //this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + //this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.40000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.irongolem.hit"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.irongolem.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + int range = 2; + + Vec3 blockVector = SpellHelper.getEntityBlockVector(this); + + int xCoord = (int)(blockVector.xCoord); + int yCoord = (int)(blockVector.yCoord); + int zCoord = (int)(blockVector.zCoord); + + for (int i = -range; i <= range; i++) + { + for (int j = -range; j <= range; j++) + { + for (int k = -range; k <= range; k++) + { + if (worldObj.rand.nextFloat() < 0.25f) + { + SpellHelper.freezeWaterBlock(worldObj, xCoord + i, yCoord + j, zCoord + k); + } + } + } + } + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 4 : 2; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityIceDemon) + { + EntityIceDemon entitywolf = (EntityIceDemon) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + IceProjectile hol = new IceProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 3, 600); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiArrowAttack); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java new file mode 100644 index 00000000..0522cc1c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java @@ -0,0 +1,491 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.*; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityLowerGuardian extends EntityDemon +{ + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 50.0F; + private static float maxUntamedHealth = 30.0F; + private int attackTimer; + private boolean isAggro; + + public EntityLowerGuardian(World par1World) + { + super(par1World, AlchemicalWizardry.entityLowerGuardianID); + this.setSize(0.7F, 1.8F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(2, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(3, this.aiSit); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + this.setTamed(false); + attackTimer = 0; + //isAggro = false; + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + par1NBTTagCompound.setByte("attackTimer", (byte) attackTimer); + par1NBTTagCompound.setBoolean("isAggro", this.isAggro()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + attackTimer = par1NBTTagCompound.getByte("attackTimer"); + isAggro = par1NBTTagCompound.getBoolean("isAggro"); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.irongolem.hit"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.irongolem.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 1.0F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + + if (attackTimer > 0) + { + attackTimer--; + } + } + + public int getAttackTimer() + { + return attackTimer; + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + this.attackTimer = 10; + this.worldObj.setEntityState(this, (byte) 4); + boolean flag = par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) (7 + this.rand.nextInt(15))); + + if (flag) + { + par1Entity.motionY += 0.4000000059604645D; + } + + this.playSound("mob.irongolem.throw", 1.0F, 1.0F); + return flag; + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityLowerGuardian) + { + EntityLowerGuardian entitywolf = (EntityLowerGuardian) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java new file mode 100644 index 00000000..2171bb9f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java @@ -0,0 +1,498 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.*; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +public class EntityShade extends EntityDemon +{ + //private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 40, 40, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 50.0F; + private static float maxUntamedHealth = 100.0F; + + public EntityShade(World par1World) + { + super(par1World, AlchemicalWizardry.entityShadeID); + this.setSize(0.8F, 2.0F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + //TODO change sounds + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "none"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 6 : 7; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityBoulderFist) + { + EntityBoulderFist entitywolf = (EntityBoulderFist) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + HolyProjectile hol = new HolyProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 5, 600); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + //this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiAttackOnCollide); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java new file mode 100644 index 00000000..004fcce4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +public class EntityShadeElemental extends EntityElemental implements IMob +{ + public EntityShadeElemental(World world) + { + super(world, AlchemicalWizardry.entityShadeElementalID); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 1)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(Potion.nightVision.id, 100, 0)); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java new file mode 100644 index 00000000..0a6d5f98 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java @@ -0,0 +1,505 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IRangedAttackMob; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIArrowAttack; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.ai.EntityAIFollowOwner; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; +import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.MudProjectile; + +public class EntitySmallEarthGolem extends EntityDemon implements IRangedAttackMob +{ + private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 25, 25, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 20.0F; + private static float maxUntamedHealth = 10.0F; + + public EntitySmallEarthGolem(World par1World) + { + super(par1World, AlchemicalWizardry.entitySmallEarthGolemID); + this.setSize(0.2F, 1.0F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + //this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + //this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.40000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + return "none"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.irongolem.hit"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.irongolem.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 4 : 2; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntitySmallEarthGolem) + { + EntitySmallEarthGolem entitywolf = (EntitySmallEarthGolem) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + MudProjectile hol = new MudProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 3, 600, false); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiArrowAttack); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java new file mode 100644 index 00000000..ab141887 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java @@ -0,0 +1,25 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.IMob; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; + +public class EntityWaterElemental extends EntityElemental implements IMob +{ + public EntityWaterElemental(World world) + { + super(world, AlchemicalWizardry.entityWaterElementalID); + } + + public void inflictEffectOnEntity(Entity target) + { + if (target instanceof EntityLivingBase) + { + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionDrowning.id, 100, 2)); + ((EntityLivingBase) target).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 150, 0)); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java new file mode 100644 index 00000000..f0e0aa65 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java @@ -0,0 +1,508 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import net.minecraft.block.BlockColored; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IRangedAttackMob; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.EntityAIArrowAttack; +import net.minecraft.entity.ai.EntityAIAttackOnCollide; +import net.minecraft.entity.ai.EntityAIFollowOwner; +import net.minecraft.entity.ai.EntityAIHurtByTarget; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAIOwnerHurtByTarget; +import net.minecraft.entity.ai.EntityAIOwnerHurtTarget; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.pathfinding.PathEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.entity.projectile.FireProjectile; + +public class EntityWingedFireDemon extends EntityDemon implements IRangedAttackMob +{ + private EntityAIArrowAttack aiArrowAttack = new EntityAIArrowAttack(this, 1.0D, 40, 40, 15.0F); + private EntityAIAttackOnCollide aiAttackOnCollide = new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.2D, false); + + private static float maxTamedHealth = 100.0F; + private static float maxUntamedHealth = 200.0F; + + public EntityWingedFireDemon(World par1World) + { + super(par1World, AlchemicalWizardry.entityWingedFireDemonID); + this.setSize(0.7F, 1.8F); + this.getNavigator().setAvoidsWater(true); + this.tasks.addTask(1, new EntityAISwimming(this)); + this.tasks.addTask(2, this.aiSit); + //this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F)); + //this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true)); + this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); + //this.tasks.addTask(6, new EntityAIMate(this, 1.0D)); + this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); + //this.tasks.addTask(8, new EntityAIBeg(this, 8.0F)); + this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(9, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); + this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); + this.targetTasks.addTask(3, new EntityAIHurtByTarget(this, true)); + this.targetTasks.addTask(4, new EntityAITargetAggro(this, EntityPlayer.class, 0, false)); + this.setAggro(false); + //this.targetTasks.addTask(4, new EntityAITargetNonTamed(this, EntitySheep.class, 200, false)); + this.setTamed(false); + + if (par1World != null && !par1World.isRemote) + { + this.setCombatTask(); + } + + this.isImmuneToFire = true; + } + + @Override + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + //This line affects the speed of the monster + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); + + //My guess is that this will alter the max health + if (this.isTamed()) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + + //this.func_110148_a(SharedMonsterAttributes.field_111267_a).func_111128_a(10.0D); + } + + /** + * Returns true if the newer Entity AI code should be run + */ + public boolean isAIEnabled() + { + return true; + } + + /** + * Sets the active target the Task system uses for tracking + */ + public void setAttackTarget(EntityLivingBase par1EntityLivingBase) + { + super.setAttackTarget(par1EntityLivingBase); + + if (par1EntityLivingBase == null) + { + this.setAngry(false); + } else if (!this.isTamed()) + { + this.setAngry(true); + } + } + + /** + * main AI tick function, replaces updateEntityActionState + */ + protected void updateAITick() + { + this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth())); + } + + protected void entityInit() + { + super.entityInit(); + this.dataWatcher.addObject(18, new Float(this.getHealth())); + this.dataWatcher.addObject(19, new Byte((byte) 0)); + //this.dataWatcher.addObject(20, new Byte((byte) BlockColored.getBlockFromDye(1))); + } + + /** + * Plays step sound at given x, y, z for the entity + */ + protected void playStepSound(int par1, int par2, int par3, int par4) + { + this.playSound("mob.zombie.step", 0.15F, 1.0F); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("Angry", this.isAngry()); + par1NBTTagCompound.setByte("CollarColor", (byte) this.getCollarColor()); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + this.setAngry(par1NBTTagCompound.getBoolean("Angry")); + + if (par1NBTTagCompound.hasKey("CollarColor")) + { + this.setCollarColor(par1NBTTagCompound.getByte("CollarColor")); + } + + this.setCombatTask(); + } + + /** + * Returns the sound this mob makes while it's alive. + */ + protected String getLivingSound() + { + return "mob.blaze.breathe"; + } + + /** + * Returns the sound this mob makes when it is hurt. + */ + protected String getHurtSound() + { + return "mob.blaze.hit"; + } + + /** + * Returns the sound this mob makes on death. + */ + protected String getDeathSound() + { + return "mob.blaze.death"; + } + + /** + * Returns the volume for the sounds this mob makes. + */ + protected float getSoundVolume() + { + return 0.4F; + } + + /** + * Returns the item ID for the item the mob drops on death. + */ + protected int getDropItemId() + { + return -1; + } + + /** + * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons + * use this to react to sunlight and start to burn. + */ + public void onLivingUpdate() + { + super.onLivingUpdate(); + } + + /** + * Called to update the entity's position/logic. + */ + public void onUpdate() + { + super.onUpdate(); + } + + public float getEyeHeight() + { + return this.height * 0.8F; + } + + /** + * The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently + * use in wolves. + */ + public int getVerticalFaceSpeed() + { + return this.isSitting() ? 20 : super.getVerticalFaceSpeed(); + } + + /** + * Called when the entity is attacked. + */ + public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) + { + if (this.isEntityInvulnerable()) + { + return false; + } else + { + Entity entity = par1DamageSource.getEntity(); + this.aiSit.setSitting(false); + + if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow)) + { + par2 = (par2 + 1.0F) / 2.0F; + } + + return super.attackEntityFrom(par1DamageSource, par2); + } + } + + public boolean attackEntityAsMob(Entity par1Entity) + { + int i = this.isTamed() ? 4 : 2; + return par1Entity.attackEntityFrom(DamageSource.causeMobDamage(this), (float) i); + } + + public void setTamed(boolean par1) + { + super.setTamed(par1); + + if (par1) + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxTamedHealth); + } else + { + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(this.maxUntamedHealth); + } + } + + /** + * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. + */ + @Override + public boolean interact(EntityPlayer par1EntityPlayer) + { + ItemStack itemstack = par1EntityPlayer.inventory.getCurrentItem(); + + if (this.isTamed()) + { + if (itemstack != null) + { + if (itemstack.getItem() instanceof ItemFood) + { + ItemFood itemfood = (ItemFood) itemstack.getItem(); + + if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < this.maxTamedHealth) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + this.heal((float) itemfood.func_150905_g(itemstack)); + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + return true; + } + } + } + + if (par1EntityPlayer.getCommandSenderName().equalsIgnoreCase(this.getOwnerName()) && !this.isBreedingItem(itemstack)) + { + if (!this.worldObj.isRemote) + { + this.aiSit.setSitting(!this.isSitting()); + this.isJumping = false; + this.setPathToEntity((PathEntity) null); + this.setTarget((Entity) null); + this.setAttackTarget((EntityLivingBase) null); + } + + this.sendSittingMessageToPlayer(par1EntityPlayer, !this.isSitting()); + } + } else if (itemstack != null && itemstack.getItem().equals(ModItems.weakBloodOrb) && !this.isAngry()) + { + if (!par1EntityPlayer.capabilities.isCreativeMode) + { + --itemstack.stackSize; + } + + if (itemstack.stackSize <= 0) + { + par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack) null); + } + + if (!this.worldObj.isRemote) + { + if (this.rand.nextInt(1) == 0) + { + this.setTamed(true); + this.setPathToEntity((PathEntity) null); + this.setAttackTarget((EntityLivingBase) null); + this.aiSit.setSitting(true); + this.setHealth(this.maxTamedHealth); + this.setOwner(par1EntityPlayer.getCommandSenderName()); + this.playTameEffect(true); + this.worldObj.setEntityState(this, (byte) 7); + } else + { + this.playTameEffect(false); + this.worldObj.setEntityState(this, (byte) 6); + } + } + + return true; + } + + return super.interact(par1EntityPlayer); + } + + + /** + * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on + * the animal type) + */ + public boolean isBreedingItem(ItemStack par1ItemStack) + { + return false; + //return par1ItemStack == null ? false : (!(Item.itemsList[par1ItemStack.itemID] instanceof ItemFood) ? false : ((ItemFood)Item.itemsList[par1ItemStack.itemID]).isWolfsFavoriteMeat()); + } + + /** + * Determines whether this wolf is angry or not. + */ + public boolean isAngry() + { + return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0; + } + + /** + * Sets whether this wolf is angry or not. + */ + public void setAngry(boolean par1) + { + byte b0 = this.dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 | 2))); + } else + { + this.dataWatcher.updateObject(16, Byte.valueOf((byte) (b0 & -3))); + } + } + + /** + * Return this wolf's collar color. + */ + public int getCollarColor() + { + return this.dataWatcher.getWatchableObjectByte(20) & 15; + } + + /** + * Set this wolf's collar color. + */ + public void setCollarColor(int par1) + { + this.dataWatcher.updateObject(20, Byte.valueOf((byte) (par1 & 15))); + } + + /** + * This function is used when two same-species animals in 'love mode' breed to generate the new baby animal. + */ + public EntityWolf spawnBabyAnimal(EntityAgeable par1EntityAgeable) + { + return null; + } + + public void func_70918_i(boolean par1) + { + if (par1) + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 1)); + } else + { + this.dataWatcher.updateObject(19, Byte.valueOf((byte) 0)); + } + } + + /** + * Returns true if the mob is currently able to mate with the specified mob. + */ + public boolean canMateWith(EntityAnimal par1EntityAnimal) + { + return false; + } + + public boolean func_70922_bv() + { + return this.dataWatcher.getWatchableObjectByte(19) == 1; + } + + /** + * Determines if an entity can be despawned, used on idle far away entities + */ + protected boolean canDespawn() + { + //return !this.isTamed() && this.ticksExisted > 2400; + return false; + } + + public boolean func_142018_a(EntityLivingBase par1EntityLivingBase, EntityLivingBase par2EntityLivingBase) + { + if (!(par1EntityLivingBase instanceof EntityCreeper) && !(par1EntityLivingBase instanceof EntityGhast)) + { + if (par1EntityLivingBase instanceof EntityWingedFireDemon) + { + EntityWingedFireDemon entitywolf = (EntityWingedFireDemon) par1EntityLivingBase; + + if (entitywolf.isTamed() && entitywolf.getOwner() == par2EntityLivingBase) + { + return false; + } + } + + return par1EntityLivingBase instanceof EntityPlayer && par2EntityLivingBase instanceof EntityPlayer && !((EntityPlayer) par2EntityLivingBase).canAttackPlayer((EntityPlayer) par1EntityLivingBase) ? false : !(par1EntityLivingBase instanceof EntityHorse) || !((EntityHorse) par1EntityLivingBase).isTame(); + } else + { + return false; + } + } + + public EntityAgeable createChild(EntityAgeable par1EntityAgeable) + { + return this.spawnBabyAnimal(par1EntityAgeable); + } + + /** + * Attack the specified entity using a ranged attack. + */ + public void attackEntityWithRangedAttack(EntityLivingBase par1EntityLivingBase, float par2) + { + double xCoord; + double yCoord; + double zCoord; + this.worldObj.playAuxSFXAtEntity((EntityPlayer) null, 1009, (int) this.posX, (int) this.posY, (int) this.posZ, 0); + FireProjectile hol = new FireProjectile(worldObj, this, par1EntityLivingBase, 1.8f, 0f, 20, 600); + this.worldObj.spawnEntityInWorld(hol); + } + + /** + * sets this entity's combat AI. + */ + public void setCombatTask() + { + this.tasks.removeTask(this.aiAttackOnCollide); + this.tasks.removeTask(this.aiArrowAttack); + ItemStack itemstack = this.getHeldItem(); + this.tasks.addTask(4, this.aiArrowAttack); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java new file mode 100644 index 00000000..49460c52 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java @@ -0,0 +1,508 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +//Shamelessly ripped off from x3n0ph0b3 +public class EnergyBlastProjectile extends Entity implements IProjectile +{ + protected int xTile = -1; + protected int yTile = -1; + protected int zTile = -1; + protected int inTile = 0; + protected int inData = 0; + protected boolean inGround = false; + /** + * The owner of this arrow. + */ + public EntityLivingBase shootingEntity; + protected int ticksInAir = 0; + protected int maxTicksInAir = 600; + private int ricochetCounter = 0; + private boolean scheduledForDeath = false; + protected int projectileDamage; + + public EnergyBlastProjectile(World par1World) + { + super(par1World); + this.setSize(0.5F, 0.5F); + } + + public EnergyBlastProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World); + this.setSize(0.5F, 0.5F); + this.setPosition(par2, par4, par6); + yOffset = 0.0F; + } + + public EnergyBlastProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World); + shootingEntity = par2EntityPlayer; + float par3 = 0.8F; + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(par2EntityPlayer.posX, par2EntityPlayer.posY + par2EntityPlayer.getEyeHeight(), par2EntityPlayer.posZ, par2EntityPlayer.rotationYaw, par2EntityPlayer.rotationPitch); + posX -= MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + posY -= 0.2D; + posZ -= MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(posX, posY, posZ); + yOffset = 0.0F; + motionX = -MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionZ = MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionY = -MathHelper.sin(rotationPitch / 180.0F * (float) Math.PI); + this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + this.projectileDamage = damage; + this.maxTicksInAir = 600; + } + + public EnergyBlastProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World); + shootingEntity = par2EntityPlayer; + float par3 = 0.8F; + this.setSize(0.5F, 0.5F); + this.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); + posX -= MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + posY -= 0.2D; + posZ -= MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(posX, posY, posZ); + yOffset = 0.0F; + motionX = -MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionZ = MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionY = -MathHelper.sin(rotationPitch / 180.0F * (float) Math.PI); + this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + this.projectileDamage = damage; + this.maxTicksInAir = maxTicksInAir; + } + + public EnergyBlastProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir) + { + super(par1World); + this.renderDistanceWeight = 10.0D; + this.shootingEntity = par2EntityLivingBase; + this.posY = par2EntityLivingBase.posY + (double) par2EntityLivingBase.getEyeHeight() - 0.10000000149011612D; + double d0 = par3EntityLivingBase.posX - par2EntityLivingBase.posX; + double d1 = par3EntityLivingBase.boundingBox.minY + (double) (par3EntityLivingBase.height / 1.5F) - this.posY; + double d2 = par3EntityLivingBase.posZ - par2EntityLivingBase.posZ; + double d3 = (double) MathHelper.sqrt_double(d0 * d0 + d2 * d2); + + if (d3 >= 1.0E-7D) + { + float f2 = (float) (Math.atan2(d2, d0) * 180.0D / Math.PI) - 90.0F; + float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / Math.PI)); + double d4 = d0 / d3; + double d5 = d2 / d3; + this.setLocationAndAngles(par2EntityLivingBase.posX + d4, this.posY, par2EntityLivingBase.posZ + d5, f2, f3); + this.yOffset = 0.0F; + float f4 = (float) d3 * 0.2F; + this.setThrowableHeading(d0, d1, d2, par4, par5); + } + + this.projectileDamage = damage; + this.maxTicksInAir = maxTicksInAir; + } + + @Override + protected void entityInit() + { + dataWatcher.addObject(16, Byte.valueOf((byte) 0)); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z + * direction. + */ + @Override + public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) + { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= var9; + var3 /= var9; + var5 /= var9; + var1 += rand.nextGaussian() * 0.007499999832361937D * var8; + var3 += rand.nextGaussian() * 0.007499999832361937D * var8; + var5 += rand.nextGaussian() * 0.007499999832361937D * var8; + var1 *= var7; + var3 *= var7; + var5 *= var7; + motionX = var1; + motionY = var3; + motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + prevRotationYaw = rotationYaw = (float) (Math.atan2(var1, var5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(var3, var10) * 180.0D / Math.PI); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, + * posY, posZ, yaw, pitch + */ + public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9) + { + this.setPosition(par1, par3, par5); + this.setRotation(par7, par8); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the velocity to the args. Args: x, y, z + */ + public void setVelocity(double par1, double par3, double par5) + { + motionX = par1; + motionY = par3; + motionZ = par5; + + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) + { + float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + prevRotationYaw = rotationYaw = (float) (Math.atan2(par1, par5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(par3, var7) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch; + prevRotationYaw = rotationYaw; + this.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() + { + super.onUpdate(); + + if (ticksInAir > maxTicksInAir) + { + this.setDead(); + } + + if (shootingEntity == null) + { + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX - 1, posY - 1, posZ - 1, posX + 1, posY + 1, posZ + 1)); + Iterator i = players.iterator(); + double closestDistance = Double.MAX_VALUE; + EntityPlayer closestPlayer = null; + + while (i.hasNext()) + { + EntityPlayer e = (EntityPlayer) i.next(); + double distance = e.getDistanceToEntity(this); + + if (distance < closestDistance) + { + closestPlayer = e; + } + } + + if (closestPlayer != null) + { + shootingEntity = closestPlayer; + } + } + + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) + { + float var1 = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + prevRotationYaw = rotationYaw = (float) (Math.atan2(motionX, motionZ) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(motionY, var1) * 180.0D / Math.PI); + } + + Block var16 = worldObj.getBlock(xTile, yTile, zTile); + + if (var16 != null) + { + var16.setBlockBoundsBasedOnState(worldObj, xTile, yTile, zTile); + AxisAlignedBB var2 = var16.getCollisionBoundingBoxFromPool(worldObj, xTile, yTile, zTile); + + if (var2 != null && var2.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ))) + { + inGround = true; + } + } + + if (inGround) + { + Block var18 = worldObj.getBlock(xTile, yTile, zTile); + int var19 = worldObj.getBlockMetadata(xTile, yTile, zTile); + + if (var18.equals(Block.getBlockById(inTile)) && var19 == inData) + { + // this.groundImpact(); + // this.setDead(); + } + } else + { + ++ticksInAir; + + if (ticksInAir > 1 && ticksInAir < 3) + { + //worldObj.spawnParticle("flame", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0D, 0D, 0D); + for (int particles = 0; particles < 3; particles++) + { + this.doFiringParticles(); + } + } + + Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = worldObj.getWorldVec3Pool().getVecFromPool(var4.hitVec.xCoord, var4.hitVec.yCoord, var4.hitVec.zCoord); + } + + Entity var5 = null; + List var6 = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox.addCoord(motionX, motionY, motionZ).expand(1.0D, 1.0D, 1.0D)); + double var7 = 0.0D; + Iterator var9 = var6.iterator(); + float var11; + + while (var9.hasNext()) + { + Entity var10 = (Entity) var9.next(); + + if (var10.canBeCollidedWith() && (var10 != shootingEntity || ticksInAir >= 5)) + { + var11 = 0.3F; + AxisAlignedBB var12 = var10.boundingBox.expand(var11, var11, var11); + MovingObjectPosition var13 = var12.calculateIntercept(var17, var3); + + if (var13 != null) + { + double var14 = var17.distanceTo(var13.hitVec); + + if (var14 < var7 || var7 == 0.0D) + { + var5 = var10; + var7 = var14; + } + } + } + } + + if (var5 != null) + { + var4 = new MovingObjectPosition(var5); + } + + if (var4 != null) + { + this.onImpact(var4); + + if (scheduledForDeath) + { + this.setDead(); + } + } + + posX += motionX; + posY += motionY; + posZ += motionZ; + MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + this.setPosition(posX, posY, posZ); + //this.doBlockCollisions(); + } + } + + public void doFiringParticles() + { + worldObj.spawnParticle("mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + worldObj.spawnParticle("flame", posX, posY, posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + par1NBTTagCompound.setShort("xTile", (short) xTile); + par1NBTTagCompound.setShort("yTile", (short) yTile); + par1NBTTagCompound.setShort("zTile", (short) zTile); + par1NBTTagCompound.setByte("inTile", (byte) inTile); + par1NBTTagCompound.setByte("inData", (byte) inData); + par1NBTTagCompound.setByte("inGround", (byte) (inGround ? 1 : 0)); + par1NBTTagCompound.setInteger("ticksInAir", ticksInAir); + par1NBTTagCompound.setInteger("maxTicksInAir", maxTicksInAir); + par1NBTTagCompound.setInteger("projectileDamage", this.projectileDamage); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + xTile = par1NBTTagCompound.getShort("xTile"); + yTile = par1NBTTagCompound.getShort("yTile"); + zTile = par1NBTTagCompound.getShort("zTile"); + inTile = par1NBTTagCompound.getByte("inTile") & 255; + inData = par1NBTTagCompound.getByte("inData") & 255; + inGround = par1NBTTagCompound.getByte("inGround") == 1; + ticksInAir = par1NBTTagCompound.getInteger("ticksInAir"); + maxTicksInAir = par1NBTTagCompound.getInteger("maxTicksInAir"); + projectileDamage = par1NBTTagCompound.getInteger("projectileDamage"); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they + * walk on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() + { + return 0.0F; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + public void setKnockbackStrength(int par1) + { + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + @Override + public boolean canAttackWithItem() + { + return false; + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public void setIsCritical(boolean par1) + { + byte var2 = dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + dataWatcher.updateObject(16, Byte.valueOf((byte) (var2 | 1))); + } else + { + dataWatcher.updateObject(16, Byte.valueOf((byte) (var2 & -2))); + } + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public boolean getIsCritical() + { + byte var1 = dataWatcher.getWatchableObjectByte(16); + return (var1 & 1) != 0; + } + + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + worldObj.createExplosion(shootingEntity, this.posX, this.posY, this.posZ, (float) (0.1), true); + this.setDead(); + } + } + + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 2)); + } + + doDamage(projectileDamage, mop); + worldObj.createExplosion(shootingEntity, this.posX, this.posY, this.posZ, (float) (0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + private int d6() + { + return rand.nextInt(6) + 1; + } + + protected void spawnHitParticles(String string, int i) + { + for (int particles = 0; particles < i; particles++) + { + worldObj.spawnParticle(string, posX, posY - (string == "portal" ? 1 : 0), posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + } + + protected void doDamage(int i, Entity mop) + { + mop.attackEntityFrom(this.getDamageSource(), i); + } + + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + public double smallGauss(double d) + { + return (worldObj.rand.nextFloat() - 0.5D) * d; + } + + public double gaussian(double d) + { + return d + d * ((rand.nextFloat() - 0.5D) / 4); + } + + private int getRicochetMax() + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java new file mode 100644 index 00000000..51934b4c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java @@ -0,0 +1,137 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; + + +public class EntityBloodLightProjectile extends EnergyBlastProjectile +{ + public EntityBloodLightProjectile(World par1World) + { + super(par1World); + } + + public EntityBloodLightProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public EntityBloodLightProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public EntityBloodLightProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + public EntityBloodLightProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir) + { + super(par1World, par2EntityLivingBase, par3EntityLivingBase, par4, par5, damage, maxTicksInAir); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int sideHit = mop.sideHit; + int blockX = mop.blockX; + int blockY = mop.blockY; + int blockZ = mop.blockZ; + + if (sideHit == 0 && this.worldObj.isAirBlock(blockX, blockY - 1, blockZ)) + { + this.worldObj.setBlock(blockX, blockY - 1, blockZ, ModBlocks.blockBloodLight); + } + + if (sideHit == 1 && this.worldObj.isAirBlock(blockX, blockY + 1, blockZ)) + { + this.worldObj.setBlock(blockX, blockY + 1, blockZ, ModBlocks.blockBloodLight); + } + + if (sideHit == 2 && this.worldObj.isAirBlock(blockX, blockY, blockZ - 1)) + { + this.worldObj.setBlock(blockX, blockY, blockZ - 1, ModBlocks.blockBloodLight); + } + + if (sideHit == 3 && this.worldObj.isAirBlock(blockX, blockY, blockZ + 1)) + { + this.worldObj.setBlock(blockX, blockY, blockZ + 1, ModBlocks.blockBloodLight); + } + + if (sideHit == 4 && this.worldObj.isAirBlock(blockX - 1, blockY, blockZ)) + { + this.worldObj.setBlock(blockX - 1, blockY, blockZ, ModBlocks.blockBloodLight); + } + + if (sideHit == 5 && this.worldObj.isAirBlock(blockX + 1, blockY, blockZ)) + { + this.worldObj.setBlock(blockX + 1, blockY, blockZ, ModBlocks.blockBloodLight); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + ((EntityLivingBase) mop).setFire(50); + ((EntityLivingBase) mop).setRevengeTarget(shootingEntity); + + if (((EntityLivingBase) mop).isPotionActive(Potion.fireResistance) || ((EntityLivingBase) mop).isImmuneToFire()) + { + ((EntityLivingBase) mop).attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + } else + { + doDamage(projectileDamage, mop); + ((EntityLivingBase) mop).hurtResistantTime = 0; + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + if (worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) + { + worldObj.setBlock((int) this.posX, (int) this.posY, (int) this.posZ, Blocks.fire); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..9c55f452 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java @@ -0,0 +1,100 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class EntityEnergyBazookaMainProjectile extends EnergyBlastProjectile +{ + public EntityEnergyBazookaMainProjectile(World par1World) + { + super(par1World); + } + + public EntityEnergyBazookaMainProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public EntityEnergyBazookaMainProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public EntityEnergyBazookaMainProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + public EntityEnergyBazookaMainProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir) + { + super(par1World, par2EntityLivingBase, par3EntityLivingBase, par4, par5, damage, maxTicksInAir); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + worldObj.createExplosion(this.shootingEntity, this.posX, this.posY, this.posZ, (float) (5.0f), false); + this.spawnSecondaryProjectiles(); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + spawnSecondaryProjectiles(); + } + + worldObj.createExplosion(this.shootingEntity, this.posX, this.posY, this.posZ, (float) (5.0f), false); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + public void spawnSecondaryProjectiles() + { + for (int i = 0; i < 20; i++) + { + EntityEnergyBazookaSecondaryProjectile secProj = new EntityEnergyBazookaSecondaryProjectile(worldObj, this.posX, this.posY, this.posZ, 15); + secProj.shootingEntity = this.shootingEntity; + float xVel = rand.nextFloat() - rand.nextFloat(); + float yVel = rand.nextFloat() - rand.nextFloat(); + float zVel = rand.nextFloat() - rand.nextFloat(); + float wantedVel = 0.5f; + secProj.motionX = xVel * wantedVel; + secProj.motionY = yVel * wantedVel; + secProj.motionZ = zVel * wantedVel; + worldObj.spawnEntityInWorld(secProj); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java new file mode 100644 index 00000000..950bfbf0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java @@ -0,0 +1,508 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.*; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.List; + +public class EntityEnergyBazookaSecondaryProjectile extends EnergyBlastProjectile implements IProjectile +{ + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private int inTile = 0; + private int inData = 0; + private boolean inGround = false; + /** + * The owner of this arrow. + */ + public EntityLivingBase shootingEntity; + private int ticksInAir = 0; + private int ricochetCounter = 0; + private boolean scheduledForDeath = false; + public int damage; + + public EntityEnergyBazookaSecondaryProjectile(World par1World) + { + super(par1World); + this.setSize(0.5F, 0.5F); + damage = 5; + } + + public EntityEnergyBazookaSecondaryProjectile(World par1World, double par2, double par4, double par6, int damage) + { + super(par1World); + this.setSize(0.5F, 0.5F); + this.setPosition(par2, par4, par6); + yOffset = 0.0F; + this.damage = damage; + } + + public EntityEnergyBazookaSecondaryProjectile(World par1World, EntityPlayer par2EntityPlayer, int damage) + { + super(par1World); + shootingEntity = par2EntityPlayer; + float par3 = 0.8F; + this.setSize(0.1F, 0.1F); + this.setLocationAndAngles(par2EntityPlayer.posX, par2EntityPlayer.posY + par2EntityPlayer.getEyeHeight(), par2EntityPlayer.posZ, par2EntityPlayer.rotationYaw, par2EntityPlayer.rotationPitch); + posX -= MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + posY -= 0.2D; + posZ -= MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * 0.16F; + this.setPosition(posX, posY, posZ); + yOffset = 0.0F; + motionX = -MathHelper.sin(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionZ = MathHelper.cos(rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float) Math.PI); + motionY = -MathHelper.sin(rotationPitch / 180.0F * (float) Math.PI); + this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + this.damage = damage; + } + + @Override + protected void entityInit() + { + dataWatcher.addObject(16, Byte.valueOf((byte) 0)); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z + * direction. + */ + @Override + public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) + { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= var9; + var3 /= var9; + var5 /= var9; + var1 += rand.nextGaussian() * 0.007499999832361937D * var8; + var3 += rand.nextGaussian() * 0.007499999832361937D * var8; + var5 += rand.nextGaussian() * 0.007499999832361937D * var8; + var1 *= var7; + var3 *= var7; + var5 *= var7; + motionX = var1; + motionY = var3; + motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + prevRotationYaw = rotationYaw = (float) (Math.atan2(var1, var5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(var3, var10) * 180.0D / Math.PI); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, + * posY, posZ, yaw, pitch + */ + public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9) + { + this.setPosition(par1, par3, par5); + this.setRotation(par7, par8); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the velocity to the args. Args: x, y, z + */ + public void setVelocity(double par1, double par3, double par5) + { + motionX = par1; + motionY = par3; + motionZ = par5; + + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) + { + float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + prevRotationYaw = rotationYaw = (float) (Math.atan2(par1, par5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(par3, var7) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch; + prevRotationYaw = rotationYaw; + this.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() + { + super.onUpdate(); + + if (ticksInAir > maxTicksInAir) + { + this.setDead(); + } + + if (shootingEntity == null) + { + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX - 1, posY - 1, posZ - 1, posX + 1, posY + 1, posZ + 1)); + Iterator i = players.iterator(); + double closestDistance = Double.MAX_VALUE; + EntityPlayer closestPlayer = null; + + while (i.hasNext()) + { + EntityPlayer e = (EntityPlayer) i.next(); + double distance = e.getDistanceToEntity(this); + + if (distance < closestDistance) + { + closestPlayer = e; + } + } + + if (closestPlayer != null) + { + shootingEntity = closestPlayer; + } + } + + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) + { + float var1 = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + prevRotationYaw = rotationYaw = (float) (Math.atan2(motionX, motionZ) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float) (Math.atan2(motionY, var1) * 180.0D / Math.PI); + } + + Block var16 = worldObj.getBlock(xTile, yTile, zTile); + + if (var16 != null) + { + var16.setBlockBoundsBasedOnState(worldObj, xTile, yTile, zTile); + AxisAlignedBB var2 = var16.getCollisionBoundingBoxFromPool(worldObj, xTile, yTile, zTile); + + if (var2 != null && var2.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ))) + { + inGround = true; + } + } + + if (inGround) + { + Block var18 = worldObj.getBlock(xTile, yTile, zTile); + int var19 = worldObj.getBlockMetadata(xTile, yTile, zTile); + + if (var18.equals(Block.getBlockById(inTile)) && var19 == inData) + { + // this.groundImpact(); + // this.setDead(); + } + } else + { + ++ticksInAir; + + if (ticksInAir > 1 && ticksInAir < 3) + { + //worldObj.spawnParticle("flame", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0D, 0D, 0D); + for (int particles = 0; particles < 3; particles++) + { + this.doFiringParticles(); + } + } + + Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = worldObj.getWorldVec3Pool().getVecFromPool(var4.hitVec.xCoord, var4.hitVec.yCoord, var4.hitVec.zCoord); + } + + Entity var5 = null; + List var6 = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox.addCoord(motionX, motionY, motionZ).expand(1.0D, 1.0D, 1.0D)); + double var7 = 0.0D; + Iterator var9 = var6.iterator(); + float var11; + + while (var9.hasNext()) + { + Entity var10 = (Entity) var9.next(); + + if (var10.canBeCollidedWith() && (var10 != shootingEntity || ticksInAir >= 5)) + { + var11 = 0.3F; + AxisAlignedBB var12 = var10.boundingBox.expand(var11, var11, var11); + MovingObjectPosition var13 = var12.calculateIntercept(var17, var3); + + if (var13 != null) + { + double var14 = var17.distanceTo(var13.hitVec); + + if (var14 < var7 || var7 == 0.0D) + { + var5 = var10; + var7 = var14; + } + } + } + } + + if (var5 != null) + { + var4 = new MovingObjectPosition(var5); + } + + if (var4 != null) + { + this.onImpact(var4); + + if (scheduledForDeath) + { + this.setDead(); + } + } + + posX += motionX; + posY += motionY; + posZ += motionZ; + MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + this.setPosition(posX, posY, posZ); + //this.doBlockCollisions(); + } + } + + public void doFiringParticles() + { + worldObj.spawnParticle("mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + worldObj.spawnParticle("flame", posX, posY, posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + par1NBTTagCompound.setShort("xTile", (short) xTile); + par1NBTTagCompound.setShort("yTile", (short) yTile); + par1NBTTagCompound.setShort("zTile", (short) zTile); + par1NBTTagCompound.setByte("inTile", (byte) inTile); + par1NBTTagCompound.setByte("inData", (byte) inData); + par1NBTTagCompound.setByte("inGround", (byte) (inGround ? 1 : 0)); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + xTile = par1NBTTagCompound.getShort("xTile"); + yTile = par1NBTTagCompound.getShort("yTile"); + zTile = par1NBTTagCompound.getShort("zTile"); + inTile = par1NBTTagCompound.getByte("inTile") & 255; + inData = par1NBTTagCompound.getByte("inData") & 255; + inGround = par1NBTTagCompound.getByte("inGround") == 1; + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they + * walk on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() + { + return 0.0F; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + public void setKnockbackStrength(int par1) + { + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + @Override + public boolean canAttackWithItem() + { + return false; + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public void setIsCritical(boolean par1) + { + byte var2 = dataWatcher.getWatchableObjectByte(16); + + if (par1) + { + dataWatcher.updateObject(16, Byte.valueOf((byte) (var2 | 1))); + } else + { + dataWatcher.updateObject(16, Byte.valueOf((byte) (var2 & -2))); + } + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public boolean getIsCritical() + { + byte var1 = dataWatcher.getWatchableObjectByte(16); + return (var1 & 1) != 0; + } + + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + this.groundImpact(mop.sideHit); + worldObj.createExplosion(shootingEntity, posX, posY, posZ, 2, false); + } + } + + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + doDamage(this.damage + d6(), mop); + worldObj.createExplosion(shootingEntity, posX, posY, posZ, 2, false); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + private int d6() + { + return rand.nextInt(6) + 1; + } + + public void spawnHitParticles(String string, int i) + { + for (int particles = 0; particles < i; particles++) + { + worldObj.spawnParticle(string, posX, posY - (string == "portal" ? 1 : 0), posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + } + + public void doDamage(int i, Entity mop) + { + mop.attackEntityFrom(this.getDamageSource(), i); + } + + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + public void groundImpact(int sideHit) + { + this.ricochet(sideHit); + } + + public double smallGauss(double d) + { + return (worldObj.rand.nextFloat() - 0.5D) * d; + } + + public double gaussian(double d) + { + return d + d * ((rand.nextFloat() - 0.5D) / 4); + } + + private void ricochet(int sideHit) + { + switch (sideHit) + { + case 0: + case 1: + // topHit, bottomHit, reflect Y + motionY = motionY * -1; + break; + + case 2: + case 3: + // westHit, eastHit, reflect Z + motionZ = motionZ * -1; + break; + + case 4: + case 5: + // southHit, northHit, reflect X + motionX = motionX * -1; + break; + } + + ricochetCounter++; + + if (ricochetCounter > this.getRicochetMax()) + { + scheduledForDeath = true; + + for (int particles = 0; particles < 4; particles++) + { + switch (sideHit) + { + case 0: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), -gaussian(0.1D), gaussian(0.1D)); + break; + + case 1: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + + case 2: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), -gaussian(0.1D)); + break; + + case 3: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + + case 4: + worldObj.spawnParticle("smoke", posX, posY, posZ, -gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + + case 5: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + } + } + } + } + + private int getRicochetMax() + { + return 3; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java new file mode 100644 index 00000000..221dc58a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java @@ -0,0 +1,64 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorRegistry; + +public class EntityMeteor extends EnergyBlastProjectile +{ + private int meteorID; + + public EntityMeteor(World par1World) + { + super(par1World); + this.meteorID = 0; + } + + public EntityMeteor(World par1World, double par2, double par4, double par6, int meteorID) + { + super(par1World, par2, par4, par6); + this.meteorID = meteorID; + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.fallingBlock; + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (worldObj.isRemote) + { + return; + } + + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + MeteorRegistry.createMeteorImpact(worldObj, mop.blockX, mop.blockY, mop.blockZ, this.meteorID); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + MeteorRegistry.createMeteorImpact(worldObj, (int) this.posX, (int) this.posY, (int) this.posZ, meteorID); + } + + this.setDead(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java new file mode 100644 index 00000000..569aaf0b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java @@ -0,0 +1,134 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ExplosionProjectile extends EnergyBlastProjectile +{ + protected boolean causesEnvDamage; + + public ExplosionProjectile(World par1World) + { + super(par1World); + } + + public ExplosionProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public ExplosionProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, boolean flag) + { + super(par1World, par2EntityPlayer, damage); + causesEnvDamage = flag; + } + + public ExplosionProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch, boolean flag) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + causesEnvDamage = flag; + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float) (2), causesEnvDamage); + //this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { +// for(int i=-1;i<=1;i++) +// { +// for(int j=-1;j<=1;j++) +// { +// for(int k=-1;k<=1;k++) +// { +// if(worldObj.isAirBlock((int)this.posX+i, (int)this.posY+j, (int)this.posZ+k)) +// { +// worldObj.setBlock( (int)this.posX+i, (int)this.posY+j, (int)this.posZ+k,Block.fire.blockID); +// } +// } +// } +// } + worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float) (2), causesEnvDamage); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); + if (((EntityLivingBase) mop).isImmuneToFire()) + { + doDamage((int) (projectileDamage), mop); + } else + { + doDamage(projectileDamage, mop); + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + if (worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) + { + //worldObj.setBlock((int)this.posX, (int)this.posY, (int)this.posZ,Block.fire.blockID); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + worldObj.spawnParticle("mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + worldObj.spawnParticle("explode", posX, posY, posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("causesEnvDamage", causesEnvDamage); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + causesEnvDamage = par1NBTTagCompound.getBoolean("causesEnvDamage"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java new file mode 100644 index 00000000..7ab8f052 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java @@ -0,0 +1,115 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class FireProjectile extends EnergyBlastProjectile +{ + public FireProjectile(World par1World) + { + super(par1World); + } + + public FireProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public FireProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public FireProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + public FireProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir) + { + super(par1World, par2EntityLivingBase, par3EntityLivingBase, par4, par5, damage, maxTicksInAir); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + for (int k = -1; k <= 1; k++) + { + if (worldObj.isAirBlock((int) this.posX + i, (int) this.posY + j, (int) this.posZ + k)) + { + worldObj.setBlock((int) this.posX + i, (int) this.posY + j, (int) this.posZ + k, Blocks.fire); + } + } + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + ((EntityLivingBase) mop).setFire(50); + ((EntityLivingBase) mop).setRevengeTarget(shootingEntity); + + if (((EntityLivingBase) mop).isPotionActive(Potion.fireResistance) || ((EntityLivingBase) mop).isImmuneToFire()) + { + ((EntityLivingBase) mop).attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + } else + { + doDamage(projectileDamage, mop); + ((EntityLivingBase) mop).hurtResistantTime = 0; + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + if (worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) + { + worldObj.setBlock((int) this.posX, (int) this.posY, (int) this.posZ, Blocks.fire); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java new file mode 100644 index 00000000..062ccbf7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java @@ -0,0 +1,117 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class HolyProjectile extends EnergyBlastProjectile +{ + public HolyProjectile(World par1World) + { + super(par1World); + } + + public HolyProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public HolyProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public HolyProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + public HolyProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir) + { + super(par1World, par2EntityLivingBase, par3EntityLivingBase, par4, par5, damage, maxTicksInAir); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { +// for(int i=-1;i<=1;i++) +// { +// for(int j=-1;j<=1;j++) +// { +// for(int k=-1;k<=1;k++) +// { +// if(worldObj.isAirBlock((int)this.posX+i, (int)this.posY+j, (int)this.posZ+k)) +// { +// worldObj.setBlock( (int)this.posX+i, (int)this.posY+j, (int)this.posZ+k,Block.fire.blockID); +// } +// } +// } +// } + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); + if (((EntityLivingBase) mop).isEntityUndead()) + { + doDamage((int) (projectileDamage * 2), mop); + } else + { + doDamage(projectileDamage, mop); + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + if (worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) + { + //worldObj.setBlock((int)this.posX, (int)this.posY, (int)this.posZ,Block.fire.blockID); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpell", posX, posY, posZ, 1.0F, 1.0F, 1.0F); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java new file mode 100644 index 00000000..06867d81 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java @@ -0,0 +1,123 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class IceProjectile extends EnergyBlastProjectile +{ + public IceProjectile(World par1World) + { + super(par1World); + } + + public IceProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public IceProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public IceProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + public IceProjectile(World worldObj, EntityIceDemon entityIceDemon, EntityLivingBase par1EntityLivingBase, float f, float g, int i, int j) + { + super(worldObj, entityIceDemon, par1EntityLivingBase, f, g, i, j); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { +// for(int i=-1;i<=1;i++) +// { +// for(int j=-1;j<=1;j++) +// { +// for(int k=-1;k<=1;k++) +// { +// if(worldObj.isAirBlock((int)this.posX+i, (int)this.posY+j, (int)this.posZ+k)) +// { +// worldObj.setBlock( (int)this.posX+i, (int)this.posY+j, (int)this.posZ+k,Block.fire.blockID); +// } +// } +// } +// } + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); + if (((EntityLivingBase) mop).isImmuneToFire()) + { + doDamage((int) (projectileDamage * 2), mop); + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 2)); + } else + { + doDamage(projectileDamage, mop); + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 1)); + } + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + if (worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) + { + //worldObj.setBlock((int)this.posX, (int)this.posY, (int)this.posZ,Block.fire.blockID); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "explode", posX, posY, posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java new file mode 100644 index 00000000..106cf420 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java @@ -0,0 +1,126 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class LightningBoltProjectile extends EnergyBlastProjectile +{ + private boolean causeLightning; + + public LightningBoltProjectile(World par1World) + { + super(par1World); + } + + public LightningBoltProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public LightningBoltProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, boolean flag) + { + super(par1World, par2EntityPlayer, damage); + causeLightning = flag; + } + + public LightningBoltProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch, boolean flag) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + causeLightning = flag; + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + if (causeLightning) + { + this.worldObj.addWeatherEffect(new EntityLightningBolt(this.worldObj, this.posX, this.posY, this.posZ)); + } + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + //shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); +// if(((EntityLivingBase)mop).isEntityUndead()) +// { +// doDamage((int)(projectileDamage*2),mop); +// }else +// { +// doDamage(projectileDamage, mop); +// } + if (causeLightning) + { + this.worldObj.addWeatherEffect(new EntityLightningBolt(this.worldObj, ((EntityLivingBase) mop).posX, ((EntityLivingBase) mop).posY, ((EntityLivingBase) mop).posZ)); + } else + { + doDamage(projectileDamage, mop); + } + + //((EntityLivingBase)mop).setVelocity(this.motionX*2, ((EntityLivingBase)mop).motionY+1.5, this.motionZ*2); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpell", posX, posY, posZ, 1.0F, 1.0F, 1.0F); + } + + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("causeLightning", causeLightning); + } + + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + causeLightning = par1NBTTagCompound.getBoolean("causeLightning"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java new file mode 100644 index 00000000..2c944959 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java @@ -0,0 +1,131 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class MudProjectile extends EnergyBlastProjectile +{ + private boolean doesBlindness; //True for when it applies blindness, false for slowness + + public MudProjectile(World par1World) + { + super(par1World); + } + + public MudProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public MudProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, boolean flag) + { + super(par1World, par2EntityPlayer, damage); + doesBlindness = flag; + } + + public MudProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch, boolean flag) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + doesBlindness = flag; + } + + public MudProjectile(World par1World, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase, float par4, float par5, int damage, int maxTicksInAir, boolean flag) + { + super(par1World, par2EntityLivingBase, par3EntityLivingBase, par4, par5, damage, maxTicksInAir); + doesBlindness = flag; + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + //shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); +// if(((EntityLivingBase)mop).isEntityUndead()) +// { +// doDamage((int)(projectileDamage*2),mop); +// }else +// { +// doDamage(projectileDamage, mop); +// } + if (doesBlindness) + { + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.blindness.id, 100, 0)); + } else + { + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 100, 2)); + } + + doDamage(projectileDamage, mop); + //((EntityLivingBase)mop).setVelocity(this.motionX*2, ((EntityLivingBase)mop).motionY+1.5, this.motionZ*2); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpell", posX, posY, posZ, 0.5F, 0.297F, 0.0664F); + } + + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("doesBlindness", doesBlindness); + } + + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + doesBlindness = par1NBTTagCompound.getBoolean("doesBlindness"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java new file mode 100644 index 00000000..c448fadf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java @@ -0,0 +1,205 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellTeleport; + +public class TeleportProjectile extends EnergyBlastProjectile +{ + private boolean isEntityTeleport; //True if the entity firing teleports on hit + + public TeleportProjectile(World par1World) + { + super(par1World); + this.motionX *= 3; + this.motionY *= 3; + this.motionZ *= 3; + } + + public TeleportProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + this.motionX *= 3; + this.motionY *= 3; + this.motionZ *= 3; + } + + public TeleportProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, boolean flag) + { + super(par1World, par2EntityPlayer, damage); + isEntityTeleport = flag; + this.motionX *= 3; + this.motionY *= 3; + this.motionZ *= 3; + } + + public TeleportProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch, boolean flag) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + isEntityTeleport = flag; + this.motionX *= 3; + this.motionY *= 3; + this.motionZ *= 3; + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + if (isEntityTeleport) + { + if (shootingEntity != null && shootingEntity instanceof EntityPlayerMP) + { + EntityPlayerMP entityplayermp = (EntityPlayerMP) shootingEntity; + + if(entityplayermp.worldObj == this.worldObj) + //if (!entityplayermp.playerNetServerHandler.connectionClosed && entityplayermp.worldObj == this.worldObj) + { + EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, this.posX, this.posY, this.posZ, 5.0F); + + if (!MinecraftForge.EVENT_BUS.post(event)) + { + if (shootingEntity.isRiding()) + { + shootingEntity.mountEntity((Entity) null); + } + + shootingEntity.setPositionAndUpdate(event.targetX, event.targetY, event.targetZ); +// this.getThrower().fallDistance = 0.0F; +// this.getThrower().attackEntityFrom(DamageSource.fall, event.attackDamage); + } + } + } + } + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + //shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); +// if(((EntityLivingBase)mop).isEntityUndead()) +// { +// doDamage((int)(projectileDamage*2),mop); +// }else +// { +// doDamage(projectileDamage, mop); +// } + if (isEntityTeleport) + { + if (shootingEntity != null && shootingEntity instanceof EntityPlayerMP) + { + EntityPlayerMP entityplayermp = (EntityPlayerMP) shootingEntity; + + if(entityplayermp.worldObj == this.worldObj) + //if (!entityplayermp.playerNetServerHandler.connectionClosed && entityplayermp.worldObj == this.worldObj) + { + EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, this.posX, this.posY, this.posZ, 5.0F); + + if (!MinecraftForge.EVENT_BUS.post(event)) + { + if (shootingEntity.isRiding()) + { + shootingEntity.mountEntity((Entity) null); + } + + shootingEntity.setPositionAndUpdate(event.targetX, event.targetY, event.targetZ); +// this.getThrower().fallDistance = 0.0F; +// this.getThrower().attackEntityFrom(DamageSource.fall, event.attackDamage); + } + } + } + } else + { +// int x = (int)this.posX + mop.worldObj.rand.nextInt(100) - mop.worldObj.rand.nextInt(100); +// int y = (int)this.posY + mop.worldObj.rand.nextInt(10) - mop.worldObj.rand.nextInt(10); +// int z = (int)this.posZ + mop.worldObj.rand.nextInt(100) - mop.worldObj.rand.nextInt(100); +// +// boolean bool = false; +// int i = 0; +// +// while(!bool&&i<100) +// { +// if(worldObj.isAirBlock(x, y, z)||worldObj.isAirBlock(x, y+1, z)) +// { +// ((EntityLivingBase) mop).setPositionAndUpdate(x, y, z); +// bool=true; +// }else +// { +// x = (int)this.posX + mop.worldObj.rand.nextInt(100) - mop.worldObj.rand.nextInt(100); +// y = (int)this.posY + mop.worldObj.rand.nextInt(10) - mop.worldObj.rand.nextInt(10); +// z = (int)this.posZ + mop.worldObj.rand.nextInt(100) - mop.worldObj.rand.nextInt(100); +// i++; +// } +// } + SpellTeleport.teleportRandomly((EntityLivingBase) mop, 64); + } + + //doDamage(projectileDamage, mop); + //((EntityLivingBase)mop).setVelocity(this.motionX*2, ((EntityLivingBase)mop).motionY+1.5, this.motionZ*2); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "portal", posX, posY, posZ, -motionX, -motionY, -motionZ); + } + + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeEntityToNBT(par1NBTTagCompound); + par1NBTTagCompound.setBoolean("isEntityTeleport", isEntityTeleport); + } + + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readEntityFromNBT(par1NBTTagCompound); + isEntityTeleport = par1NBTTagCompound.getBoolean("isEntityTeleport"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java new file mode 100644 index 00000000..8fa7704c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class WaterProjectile extends EnergyBlastProjectile +{ + public WaterProjectile(World par1World) + { + super(par1World); + } + + public WaterProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public WaterProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public WaterProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + //shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); +// if(((EntityLivingBase)mop).isEntityUndead()) +// { +// doDamage((int)(projectileDamage*2),mop); +// }else +// { +// doDamage(projectileDamage, mop); +// } + if (((EntityLivingBase) mop).isImmuneToFire()) + { + doDamage(projectileDamage * 2, mop); + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionDrowning.id, 80, 1)); + } else + { + doDamage(projectileDamage, mop); + ((EntityLivingBase) mop).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionDrowning.id, 80, 0)); + } + + //((EntityLivingBase)mop).setVelocity(this.motionX*2, ((EntityLivingBase)mop).motionY+1.5, this.motionZ*2); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "portal", posX, posY, posZ, -motionX, -motionY, -motionZ); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java new file mode 100644 index 00000000..46fa01d7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java @@ -0,0 +1,110 @@ +package WayofTime.alchemicalWizardry.common.entity.projectile; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class WindGustProjectile extends EnergyBlastProjectile +{ + public WindGustProjectile(World par1World) + { + super(par1World); + } + + public WindGustProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World, par2, par4, par6); + } + + public WindGustProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) + { + super(par1World, par2EntityPlayer, damage); + } + + public WindGustProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage, int maxTicksInAir, double posX, double posY, double posZ, float rotationYaw, float rotationPitch) + { + super(par1World, par2EntityPlayer, damage, maxTicksInAir, posX, posY, posZ, rotationYaw, rotationPitch); + } + + @Override + public DamageSource getDamageSource() + { + return DamageSource.causeMobDamage(shootingEntity); + } + + @Override + public void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) + { + return; + } + + this.onImpact(mop.entityHit); + } else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { +// for(int i=-1;i<=1;i++) +// { +// for(int j=-1;j<=1;j++) +// { +// for(int k=-1;k<=1;k++) +// { +// if(worldObj.isAirBlock((int)this.posX+i, (int)this.posY+j, (int)this.posZ+k)) +// { +// worldObj.setBlock( (int)this.posX+i, (int)this.posY+j, (int)this.posZ+k,Block.fire.blockID); +// } +// } +// } +// } + } + + this.setDead(); + } + + @Override + public void onImpact(Entity mop) + { + if (mop == shootingEntity && ticksInAir > 3) + { + //shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } else + { + //doDamage(8 + d6(), mop); + if (mop instanceof EntityLivingBase) + { + //((EntityLivingBase)mop).addPotionEffect(new PotionEffect(Potion.weakness.id, 60,2)); + //((EntityLivingBase)mop).setFire(50); + //((EntityLivingBase)mop).setRevengeTarget(shootingEntity); +// if(((EntityLivingBase)mop).isEntityUndead()) +// { +// doDamage((int)(projectileDamage*2),mop); +// }else +// { +// doDamage(projectileDamage, mop); +// } + ((EntityLivingBase) mop).motionX = this.motionX * 2; + ((EntityLivingBase) mop).motionY = 1.5; + ((EntityLivingBase) mop).motionZ = this.motionZ * 2; + //((EntityLivingBase)mop).setVelocity(this.motionX*2, ((EntityLivingBase)mop).motionY+1.5, this.motionZ*2); + } + + //worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)(0.1), true); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } + + @Override + public void doFiringParticles() + { + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + SpellHelper.sendParticleToAllAround(worldObj, posX, posY, posZ, 30, worldObj.provider.dimensionId, "mobSpell", posX, posY, posZ, 1.0F, 1.0F, 1.0F); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java new file mode 100644 index 00000000..dd3e4a69 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java @@ -0,0 +1,44 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; + +public class AWBaseItems extends Item +{ + public AWBaseItems() + { + super(); + setMaxStackSize(64); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + public void registerIcons(IIconRegister iconRegister) + { + if (this.equals(ModItems.blankSlate)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BlankSlate"); + } else if (this.equals(ModItems.reinforcedSlate)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:ReinforcedSlate"); + } else if (this.equals(ModItems.imbuedSlate)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:InfusedSlate"); + } else if (this.equals(ModItems.demonicSlate)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DemonSlate"); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Infused stone inside of"); + par3List.add("a blood altar"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java new file mode 100644 index 00000000..1ee98d4e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java @@ -0,0 +1,135 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ActivationCrystal extends EnergyItems +{ + private static final String[] ACTIVATION_CRYSTAL_NAMES = new String[]{"Weak", "Awakened"}; + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public ActivationCrystal() + { + super(); + this.maxStackSize = 1; + setEnergyUsed(100); + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + icons = new IIcon[ACTIVATION_CRYSTAL_NAMES.length]; + + for (int i = 0; i < ACTIVATION_CRYSTAL_NAMES.length; ++i) + { + icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "activationCrystal" + ACTIVATION_CRYSTAL_NAMES[i]); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + switch (par1ItemStack.getItemDamage()) + { + case 0: + { + par3List.add("Activates low-level rituals"); + break; + } + + case 1: + { + par3List.add("Activates more powerful rituals"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + + break; + } + } + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + return par1ItemStack; + } + + public int getCrystalLevel(ItemStack itemStack) + { + return itemStack.getItemDamage() + 1; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + //This is what will do all the localisation things on the alchemy components so you dont have to set it :D + int meta = MathHelper.clamp_int(itemStack.getItemDamage(), 0, ACTIVATION_CRYSTAL_NAMES.length - 1); + return ("" + "item.activationCrystal" + ACTIVATION_CRYSTAL_NAMES[meta]); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) + { + int j = MathHelper.clamp_int(meta, 0, ACTIVATION_CRYSTAL_NAMES.length - 1); + return icons[j]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + for (int meta = 0; meta < ACTIVATION_CRYSTAL_NAMES.length; ++meta) + { + list.add(new ItemStack(id, 1, meta)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java new file mode 100644 index 00000000..9f20b743 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AirScribeTool extends ScribeTool +{ + public AirScribeTool() + { + super(4); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:AirScribeTool"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java new file mode 100644 index 00000000..3bc4a2eb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ApprenticeBloodOrb extends EnergyBattery +{ + public ApprenticeBloodOrb(int damage) + { + super(damage); + orbLevel = 2; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:ApprenticeBloodOrb"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java new file mode 100644 index 00000000..6bd83098 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ArchmageBloodOrb extends EnergyBattery +{ + public ArchmageBloodOrb(int damage) + { + super(damage); + orbLevel = 5; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:ArchmageBloodOrb"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java new file mode 100644 index 00000000..1b42a0de --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java @@ -0,0 +1,215 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ArmourInhibitor extends EnergyItems +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private int tickDelay = 200; + + public ArmourInhibitor() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(0); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used to suppress a soul's"); + par3List.add("unnatural abilities."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:ArmourInhibitor_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:ArmourInhibitor_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:ArmourInhibitor_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + +// @Override +// public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) +// { +// +// if(applyBonemeal(par1ItemStack,par3World,par4,par5,par6,par2EntityPlayer)) +// { +// if (par3World.isRemote) +// { +// par3World.playAuxSFX(2005, par4, par5, par6, 0); +// EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); +// return true; +// } +// return true; +// } +// return false; +// } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % tickDelay); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + //EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (par2World.getWorldTime() % tickDelay == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par3Entity instanceof EntityPlayer) + { + //EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer)par3Entity, getEnergyUsed()); + } + + //TODO Do stuff + par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionInhibit.id, 2, 0)); + } + + return; + } + +// @Override +// public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) { +// +// int range = 5; +// int verticalRange = 2; +// int posX = (int)Math.round(player.posX-0.5f); +// int posY = (int)player.posY; +// int posZ = (int)Math.round(player.posZ-0.5f); +// +// for(int ix=posX-range;ix<=posX+range;ix++) +// { +// for(int iz=posZ-range;iz<=posZ+range;iz++) +// { +// for(int iy=posY-verticalRange;iy<=posY+verticalRange;iy++) +// { +// int id = world.getBlockId(ix, iy, iz); +// Block block = Block.blocksList[id]; +// if(block instanceof IPlantable) +// { +// if(world.rand.nextInt(10)==0) +// block.updateTick(world, ix, iy, iz, world.rand); +// } +// } +// } +// } +// +// } + +// @Override +// public boolean isUpgrade() { +// // TODO Auto-generated method stub +// return true; +// } +// +// @Override +// public int getEnergyForTenSeconds() { +// // TODO Auto-generated method stub +// return 50; +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java new file mode 100644 index 00000000..58c004d3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java @@ -0,0 +1,114 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlankSpell extends EnergyItems +{ + public BlankSpell() + { + super(); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BlankSpell"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Crystal of infinite possibilities."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par2World.isRemote) + { + //World world = MinecraftServer.getServer().worldServers[getDimensionID(par1ItemStack)]; + World world = DimensionManager.getWorld(getDimensionID(par1ItemStack)); + + if (world != null) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + TileEntity tileEntity = world.getTileEntity(itemTag.getInteger("xCoord"), itemTag.getInteger("yCoord"), itemTag.getInteger("zCoord")); + + if (tileEntity instanceof TEHomHeart) + { + TEHomHeart homHeart = (TEHomHeart) tileEntity; + + if (homHeart.canCastSpell(par1ItemStack, par2World, par3EntityPlayer)) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, homHeart.castSpell(par1ItemStack, par2World, par3EntityPlayer)); + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); +// if (!par2World.isRemote) +// { +// //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); +// par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 10)); +// } + return par1ItemStack; + } + + public int getDimensionID(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.stackTagCompound.getInteger("dimensionId"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java new file mode 100644 index 00000000..2c40e314 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java @@ -0,0 +1,73 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BloodShard extends Item implements ArmourUpgrade +{ + public BloodShard() + { + super(); + this.maxStackSize = 64; + //setEnergyUsed(100); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + if (this.equals(ModItems.weakBloodShard)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WeakBloodShard"); + return; + } + + if (this.equals(ModItems.demonBloodShard)) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DemonBloodShard"); + return; + } + } + + public int getBloodShardLevel() + { + if (this.equals(ModItems.weakBloodShard)) + { + return 1; + } else if (this.equals(ModItems.demonBloodShard)) + { + return 2; + } + + return 0; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + // TODO Auto-generated method stub + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java new file mode 100644 index 00000000..07b4ac20 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java @@ -0,0 +1,103 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BloodboundSword extends EnergyItems +{ + private float weaponDamage; + //private int maxMode = 3; + private NBTTagCompound data; + + public BloodboundSword(int id) + { + super(); + this.maxStackSize = 1; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setEnergyUsed(100); + setFull3D(); + weaponDamage = 10.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergySword"); + } + + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (par3EntityLivingBase instanceof EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, (EntityPlayer) par3EntityLivingBase); + + if (!this.syphonBatteries(par1ItemStack, (EntityPlayer) par3EntityLivingBase, this.getEnergyUsed())) + { + //this.damagePlayer(null, (EntityPlayer)par3EntityLivingBase, (this.getEnergyUsed() + 99) / 100); + } + } + + return true; + } + + /* + public int getDamageVsEntity(Entity par1Entity) + { + return this.weaponDamage; + } + */ + + public float func_82803_g() + { + return 4.0F; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Caution: may cause"); + par3List.add("a bad day..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + public float getDigSpeed(ItemStack par1ItemStack, Block par2Block, int meta) + { + if (par2Block.equals(Blocks.web)) + { + return 15.0F; + } else + { + Material material = par2Block.getMaterial(); + return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.gourd ? 1.0F : 1.5F; + } + } + + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return false; + } + +// public Multimap func_111205_h() +// { +// Multimap multimap = super.func_111205_h(); +// multimap.put(SharedMonsterAttributes.field_111264_e.func_111108_a(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)this.weaponDamage, 0)); +// return multimap; +// } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java new file mode 100644 index 00000000..d69a25a4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java @@ -0,0 +1,588 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.potion.Potion; +import net.minecraft.util.DamageSource; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.ISpecialArmor; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.IBindable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//,IRevealer, IGoggles +{ + private static int invSize = 9; + private static IIcon helmetIcon; + private static IIcon plateIcon; + private static IIcon leggingsIcon; + private static IIcon bootsIcon; + + public BoundArmour(int armorType) + { + super(ItemArmor.ArmorMaterial.GOLD, 0, armorType); + setMaxDamage(1000); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + this.helmetIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundHelmet"); + this.plateIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundPlate"); + this.leggingsIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundLeggings"); + this.bootsIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundBoots"); + } + + @SideOnly(Side.CLIENT) + + public IIcon getIconFromDamage(int par1) + { + if (this.equals(ModItems.boundHelmet)) + { + return this.helmetIcon; + } + + if (this.equals(ModItems.boundPlate)) + { + return this.plateIcon; + } + + if (this.equals(ModItems.boundLeggings)) + { + return this.leggingsIcon; + } + + if (this.equals(ModItems.boundBoots)) + { + return this.bootsIcon; + } + + return this.itemIcon; + } + + @Override + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return false; + } + + @Override + public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) + { + if (source.equals(DamageSource.drown)) + { + return new ArmorProperties(-1, 0, 0); + } + + if (source.equals(DamageSource.outOfWorld)) + { + if (isImmuneToVoid(armor)) + { + return new ArmorProperties(-1, 3, 100000); + } else + { + return new ArmorProperties(-1, 0, 0); + } + } + + ItemStack helmet = player.getEquipmentInSlot(4); + ItemStack plate = player.getEquipmentInSlot(3); + ItemStack leggings = player.getEquipmentInSlot(2); + ItemStack boots = player.getEquipmentInSlot(1); + + if (helmet == null || plate == null || leggings == null || boots == null) + { + return new ArmorProperties(-1, 0, 0); + } + + if (helmet.equals(ModItems.boundHelmet) || plate.equals(ModItems.boundPlate) || leggings.equals(ModItems.boundLeggings) || boots.equals(ModItems.boundBoots)) + { + if (source.isUnblockable()) + { + return new ArmorProperties(-1, 3, 3); + } + + return new ArmorProperties(-1, 3, 100000); + } + + return new ArmorProperties(-1, 0, 0); + } + + @Override + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) + { + if (armor.equals(ModItems.boundHelmet)) + { + return 3; + } + + if (armor.equals(ModItems.boundPlate)) + { + return 8; + } + + if (armor.equals(ModItems.boundLeggings)) + { + return 6; + } + + if (armor.equals(ModItems.boundBoots)) + { + return 3; + } + + return 5; + } + + @Override + public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) + { + if (entity instanceof EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(stack, (EntityPlayer) entity); + + if (((EntityPlayer) entity).capabilities.isCreativeMode) + { + return; + } + + //EnergyItems.syphonBatteries(stack, (EntityPlayer)entity, 200); + } + + stack.setItemDamage(stack.getItemDamage() + damage); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Devilish Protection"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + ItemStack[] inv = getInternalInventory(par1ItemStack); + + if (inv == null) + { + return; + } + + for (int i = 0; i < invSize; i++) + { + if (inv[i] != null) + { + par3List.add("Item in slot " + i + ": " + inv[i].getDisplayName()); + } + } + } + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) + { + //TODO Make the armour invisible when the player has Invisibility on. + if (entity instanceof EntityLivingBase) + { + if (((EntityLivingBase) entity).isPotionActive(Potion.invisibility.id)) + { + if (this== ModItems.boundHelmet || this == ModItems.boundPlate || this == ModItems.boundBoots) + { + return "alchemicalwizardry:models/armor/boundArmour_invisible_layer_1.png"; + } + + if (this == ModItems.boundLeggings) + { + return "alchemicalwizardry:models/armor/boundArmour_invisible_layer_2.png"; + } + } + } + + if (this == ModItems.boundHelmet || this == ModItems.boundPlate || this == ModItems.boundBoots) + { + return "alchemicalwizardry:models/armor/boundArmour_layer_1.png"; + } + + if (this == ModItems.boundLeggings) + { + return "alchemicalwizardry:models/armor/boundArmour_layer_2.png"; + } else + { + return null; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + return super.onItemRightClick(par1ItemStack, par2World, par3EntityPlayer); + } + + @Override + public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + int maxBloodLevel = getMaxBloodShardLevel(itemStack); + ItemStack[] inv = getInternalInventory(itemStack); + + if (inv != null) + { + int iSize = 0; + int iBlood = 0; + } + + if (!player.isPotionActive(AlchemicalWizardry.customPotionInhibit)) + { + tickInternalInventory(itemStack, world, player, 0, false); + } + + if (itemStack.getItemDamage() > 0) + { + EnergyItems.checkAndSetItemOwner(itemStack, player); + + if (!player.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(itemStack, player, itemStack.getItemDamage() * 75); + itemStack.setItemDamage(0); + } + } + + return; + } + + public void tickInternalInventory(ItemStack par1ItemStack, World par2World, EntityPlayer par3Entity, int par4, boolean par5) + { + ItemStack[] inv = getInternalInventory(par1ItemStack); + + if (inv == null) + { + return; + } + + int blood = getMaxBloodShardLevel(par1ItemStack); + + //int blood = 1; + for (int i = 0; i < invSize; i++) + { + if (inv[i] == null) + { + continue; + } + + if (inv[i].getItem() instanceof ArmourUpgrade && blood > 0) + { + if (((ArmourUpgrade) inv[i].getItem()).isUpgrade()) + { + ((ArmourUpgrade) inv[i].getItem()).onArmourUpdate(par2World, par3Entity, inv[i]); + blood--; + } + + if (par2World.getWorldTime() % 200 == 0) + { + if (getUpgradeCostMultiplier(par1ItemStack) > 0.02f) + { + EnergyItems.syphonBatteries(par1ItemStack, par3Entity, (int) (((ArmourUpgrade) inv[i].getItem()).getEnergyForTenSeconds() * getUpgradeCostMultiplier(par1ItemStack))); + } + } + } + } + } + + public int getMaxBloodShardLevel(ItemStack armourStack) + { + ItemStack[] inv = getInternalInventory(armourStack); + + if (inv == null) + { + return 0; + } + + int max = 0; + + for (int i = 0; i < invSize; i++) + { + ItemStack itemStack = inv[i]; + + if (itemStack != null) + { + if (itemStack.equals(ModItems.weakBloodShard)) + { + max = Math.max(max, 1); + } + + if (itemStack.equals(ModItems.demonBloodShard)) + { + max = Math.max(max, 2); + } + } + } + + return max; + } + + public boolean hasAddedToInventory(ItemStack sigilItemStack, ItemStack addedItemStack) + { + ItemStack[] inv = getInternalInventory(sigilItemStack); + + if (inv == null) + { + return false; + } + + if (addedItemStack == null) + { + return false; + } + + Item item = addedItemStack.getItem(); + int candidateSlot = -1; + + for (int i = invSize - 1; i >= 0; i--) + { + ItemStack nextItem = inv[i]; + + if (nextItem == null) + { + candidateSlot = i; + continue; + } + } + + if (candidateSlot == -1) + { + return false; + } + + if (addedItemStack.getItem() instanceof ArmourUpgrade) + { + inv[candidateSlot] = addedItemStack; + saveInternalInventory(sigilItemStack, inv); + return true; + } + + return false; + } + + public ItemStack[] getInternalInventory(ItemStack itemStack) + { + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + return null; + } + + ItemStack[] inv = new ItemStack[9]; + NBTTagList tagList = itemTag.getTagList("Inventory",0); + + if (tagList == null) + { + return null; + } + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = new NBTTagCompound(); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < invSize) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + tagList.appendTag(tag); + } + + return inv; + } + + public void saveInternalInventory(ItemStack itemStack, ItemStack[] inventory) + { + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < invSize; i++) + { + ItemStack stack = inventory[i]; + + if (inventory[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inventory[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + itemTag.setTag("Inventory", itemList); + } + + public boolean isImmuneToVoid(ItemStack itemStack) + { + ItemStack[] inv = getInternalInventory(itemStack); + + if (inv == null) + { + return false; + } + + for (ItemStack item : inv) + { + if (item == null) + { + continue; + } + + if (item.equals(ModItems.voidSigil)) + { + return true; + } + } + + return false; + } + +// @Override +// public boolean hasIRevealer(ItemStack itemStack) +// { +// ItemStack[] inv = getInternalInventory(itemStack); +// +// if (inv == null) +// { +// return false; +// } +// +// for (ItemStack item : inv) +// { +// if (item == null) +// { +// continue; +// } +// +// if (item.getItem() instanceof IRevealer) +// { +// return true; +// } +// } +// +// return false; +// } +// +// @Override +// public boolean hasIGoggles(ItemStack itemStack) +// { +// ItemStack[] inv = getInternalInventory(itemStack); +// +// if (inv == null) +// { +// return false; +// } +// +// for (ItemStack item : inv) +// { +// if (item == null) +// { +// continue; +// } +// +// if (item.getItem() instanceof IGoggles) +// { +// return true; +// } +// } +// +// return false; +// } + + public float getUpgradeCostMultiplier(ItemStack itemStack) + { + ItemStack[] inv = getInternalInventory(itemStack); + + if (inv == null) + { + return 1.0f; + } + + for (ItemStack item : inv) + { + if (item == null) + { + continue; + } + + if (item.equals(ModItems.weakBloodOrb)) + { + return 0.75f; + } + + if (item.equals(ModItems.apprenticeBloodOrb)) + { + return 0.50f; + } + + if (item.equals(ModItems.magicianBloodOrb)) + { + return 0.25f; + } + + if (item.equals(ModItems.masterBloodOrb)) + { + return 0.0f; + } + + if (item.equals(ModItems.archmageBloodOrb)) + { + return 0.0f; + } + } + + return 1.0f; + } + + public int getItemEnchantability() + { + return 0; + } + +// @Override +// public boolean showNodes(ItemStack itemstack, EntityLivingBase player) +// { +// return this.hasIRevealer(itemstack); +// } +// +// @Override +// public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) +// { +// return this.hasIGoggles(itemstack); +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java new file mode 100644 index 00000000..f8adfe61 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java @@ -0,0 +1,381 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLeavesBase; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemAxe; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BoundAxe extends ItemAxe implements IBindable +{ + /** + * Array of blocks the tool has extra effect against. + */ + public static final Block[] blocksEffectiveAgainst = new Block[]{Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.chest, Blocks.stone_slab, Blocks.pumpkin, Blocks.lit_pumpkin}; + + public float efficiencyOnProperMaterial = 12.0F; + + /** + * Damage versus entities. + */ + public float damageVsEntity; + + private static IIcon activeIcon; + private static IIcon passiveIcon; + + private int energyUsed; + + public BoundAxe() + { + super(AlchemicalWizardry.bloodBoundToolMaterial); + this.maxStackSize = 1; + //this.setMaxDamage(par3EnumToolMaterial.getMaxUses()); + this.efficiencyOnProperMaterial = 12.0F; + this.damageVsEntity = 5; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setEnergyUsed(5); + } + + public void setEnergyUsed(int i) + { + energyUsed = i; + } + + public int getEnergyUsed() + { + return this.energyUsed; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Axe me about my puns!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundAxe_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundAxe_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + if (par3EntityPlayer.isPotionActive(AlchemicalWizardry.customPotionInhibit)) + { + return par1ItemStack; + } + + int posX = (int) par3EntityPlayer.posX; + int posY = (int) par3EntityPlayer.posY; + int posZ = (int) par3EntityPlayer.posZ; + boolean silkTouch = false; + int so = Enchantment.silkTouch.effectId; + int fortune = Enchantment.fortune.effectId; + int fortuneLvl = 0; + NBTTagList enchants = par1ItemStack.getEnchantmentTagList(); + + if (enchants != null) + { + for (int i = 0; i < enchants.tagCount(); i++) + { + if (enchants.getCompoundTagAt(i) instanceof NBTTagCompound) + { + NBTTagCompound nbt = (NBTTagCompound) enchants.getCompoundTagAt(i); + int id = nbt.getShort("id"); + + if (id == so) + { + silkTouch = true; + } + + if (id == fortune) + { + fortuneLvl = nbt.getShort("lvl"); + } + } + } + } + + for (int i = -5; i <= 5; i++) + { + for (int j = 0; j <= 10; j++) + { + for (int k = -5; k <= 5; k++) + { + Block block = par2World.getBlock(posX + i, posY + j, posZ + k); + int meta = par2World.getBlockMetadata(posX + i, posY + j, posZ + k); + + if (block != null) + { + float str = func_150893_a(par1ItemStack, block); + + if (str > 1.1f || block instanceof BlockLeavesBase && par2World.canMineBlock(par3EntityPlayer, posX + i, posY + j, posZ + k)) + { + //par1ItemStack.getEnchantmentTagList(); + if (silkTouch) + { + ItemStack droppedItem = new ItemStack(block, 1, meta); + + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); + } + } else + { + ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); + + if (itemDropList != null) + { + for (ItemStack item : itemDropList) + { + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); + } + } + } + } + + par2World.setBlockToAir(posX + i, posY + j, posZ + k); + } + } + } + } + } + + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 10000); + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 20); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + + /** + * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if + * sword + */ + @Override + public float func_150893_a(ItemStack par1ItemStack, Block par2Block) + { + if (!getActivated(par1ItemStack)) + { + return 0.0F; + } + + return super.func_150893_a(par1ItemStack, par2Block); + } + + /** + * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise + * the damage on the stack. + */ + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (!getActivated(par1ItemStack)) + { + return false; + } + + //par1ItemStack.damageItem(2, par3EntityLivingBase); + return true; + } + + public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block par3, int par4, int par5, int par6, EntityLivingBase par7EntityLivingBase) + { + if ((double) par3.getBlockHardness(par2World, par4, par5, par6) != 0.0D) + { + //par1ItemStack.damageItem(1, par7EntityLivingBase); + } + + return true; + } + + @SideOnly(Side.CLIENT) + + /** + * Returns True is the item is renderer in full 3D when hold. + */ + public boolean isFull3D() + { + return true; + } + + /** + * Return the enchantability factor of the item, most of the time is based on material. + */ + @Override + public int getItemEnchantability() + { + return 30; + } + + /** + * Return whether this item is repairable in an anvil. + */ +// public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) +// { +// return true; +// } + + /** + * FORGE: Overridden to allow custom tool effectiveness + */ + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) + { + if (!getActivated(stack)) + { + return 0.0F; + } + + if (ForgeHooks.isToolEffective(stack, block, meta)) + { + return efficiencyOnProperMaterial; + } + + return func_150893_a(stack, block); + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) + { + return !getActivated(stack); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + if("axe".equals(toolClass)) + { + return 5; + } + + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java new file mode 100644 index 00000000..eae60f68 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java @@ -0,0 +1,394 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindable; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BoundPickaxe extends ItemPickaxe implements IBindable +{ + /** + * Array of blocks the tool has extra effect against. + */ + // public static final Block[] blocksEffectiveAgainst = new Block[]{Blocks.cobblestone, Blocks.stoneDoubleSlab, Blocks.stoneSingleSlab, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockIron, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.netherrack, Block.oreLapis, Block.blockLapis, Block.oreRedstone, Block.oreRedstoneGlowing, Block.rail, Block.railDetector, Block.railPowered, Block.railActivator}; + + public float efficiencyOnProperMaterial = 12.0F; + + /** + * Damage versus entities. + */ + public float damageVsEntity; + + private static IIcon activeIcon; + private static IIcon passiveIcon; + + private int energyUsed; + + public BoundPickaxe() + { + super(AlchemicalWizardry.bloodBoundToolMaterial); + this.maxStackSize = 1; + //this.setMaxDamage(par3EnumToolMaterial.getMaxUses()); + this.efficiencyOnProperMaterial = 12.0F; + this.damageVsEntity = 5; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setEnergyUsed(5); + } + + public void setEnergyUsed(int i) + { + energyUsed = i; + } + + public int getEnergyUsed() + { + return this.energyUsed; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("The Souls of the Damned"); + par3List.add("do not like stone..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundPickaxe_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundPickaxe_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + if (par3EntityPlayer.isPotionActive(AlchemicalWizardry.customPotionInhibit)) + { + return par1ItemStack; + } + + int posX = (int) par3EntityPlayer.posX; + int posY = (int) par3EntityPlayer.posY; + int posZ = (int) par3EntityPlayer.posZ; + boolean silkTouch = false; + int so = Enchantment.silkTouch.effectId; + int fortune = Enchantment.fortune.effectId; + int fortuneLvl = 0; + NBTTagList enchants = par1ItemStack.getEnchantmentTagList(); + + if (enchants != null) + { + for (int i = 0; i < enchants.tagCount(); i++) + { + if (enchants.getCompoundTagAt(i) instanceof NBTTagCompound) + { + NBTTagCompound nbt = (NBTTagCompound) enchants.getCompoundTagAt(i); + int id = nbt.getShort("id"); + + if (id == so) + { + silkTouch = true; + } + + if (id == fortune) + { + fortuneLvl = nbt.getShort("lvl"); + } + } + } + } + + for (int i = -5; i <= 5; i++) + { + for (int j = -5; j <= 5; j++) + { + for (int k = -5; k <= 5; k++) + { + Block block = par2World.getBlock(posX + i, posY + j, posZ + k); + int meta = par2World.getBlockMetadata(posX + i, posY + j, posZ + k); + + if (block != null && block.getBlockHardness(par2World, posX + i, posY + j, posZ + k) != -1) + { + float str = func_150893_a(par1ItemStack, block); + + if (str > 1.1f && par2World.canMineBlock(par3EntityPlayer, posX + i, posY + j, posZ + k)) + { + //par1ItemStack.getEnchantmentTagList(); + if (silkTouch) + { + ItemStack droppedItem = new ItemStack(block, 1, meta); + + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); + } + } else + { + ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); + + if (itemDropList != null) + { + for (ItemStack item : itemDropList) + { + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); + } + } + } + } + + par2World.setBlockToAir(posX + i, posY + j, posZ + k); + } + } + } + } + } + + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 10000); + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 20); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + + /** + * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if + * sword + */ + @Override + public float func_150893_a(ItemStack par1ItemStack, Block par2Block) //getStrVsBlock + { + if (!getActivated(par1ItemStack)) + { + return 0.0F; + } + + return super.func_150893_a(par1ItemStack, par2Block); + } + + /** + * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise + * the damage on the stack. + */ + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (!getActivated(par1ItemStack)) + { + return false; + } + + //par1ItemStack.damageItem(2, par3EntityLivingBase); + return true; + } + + @Override + public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, Block par3, int par4, int par5, int par6, EntityLivingBase par7EntityLivingBase) + { + + if (par7EntityLivingBase instanceof EntityPlayer) + { + EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par7EntityLivingBase, getEnergyUsed()); + } + + //TODO Possibly add better functionality for the items? + //par7EntityLivingBase.getLookVec(); + return true; + } + + @SideOnly(Side.CLIENT) + + /** + * Returns True is the item is renderer in full 3D when hold. + */ + public boolean isFull3D() + { + return true; + } + + /** + * Return the enchantability factor of the item, most of the time is based on material. + */ + @Override + public int getItemEnchantability() + { + return 30; + } + + /** + * Return whether this item is repairable in an anvil. + */ +// public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) +// { +// return false; +// } + + /** + * FORGE: Overridden to allow custom tool effectiveness + */ + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) + { + if (!getActivated(stack)) + { + return 0.0F; + } + + if (ForgeHooks.isToolEffective(stack, block, meta)) + { + return efficiencyOnProperMaterial; + } + + return func_150893_a(stack, block); + } + +// @Override +// +// /** +// * Returns if the item (tool) can harvest results from the block type. +// */ +// public boolean func_150897_b(Block par1Block) //canHarvestBlock +// { +// return par1Block == Blocks.obsidian ? true : (par1Block != Blocks.diamond_block && par1Block != Blocks.diamond_ore ? (par1Block != Blocks.emerald_ore && par1Block != Blocks.emerald_block ? (par1Block != Blocks.gold_block && par1Block != Blocks.gold_ore ? (par1Block != Blocks.iron_block && par1Block != Blocks.iron_ore ? (par1Block != Blocks.lapis_block && par1Block != Blocks.lapis_ore ? (par1Block != Blocks.redstone_ore && par1Block != Blocks.oreRedstoneGlowing ? (par1Block.getMaterial() == Material.rock ? true : (par1Block.blockMaterial == Material.iron ? true : par1Block.blockMaterial == Material.anvil)) : true) : true) : true) : true) : true) : true); +// } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) + { + return !getActivated(stack); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + if("pickaxe".equals(toolClass)) + { + return 5; + } + + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java new file mode 100644 index 00000000..c13f2ddd --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java @@ -0,0 +1,388 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindable; + +import com.google.common.collect.Multimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BoundShovel extends ItemSpade implements IBindable +{ + /** + * Array of blocks the tool has extra effect against. + */ + //public static final Block[] blocksEffectiveAgainst = new Block[]{Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay, Block.tilledField, Block.slowSand, Block.mycelium}; + + public float efficiencyOnProperMaterial = 12.0F; + + /** + * Damage versus entities. + */ + public float damageVsEntity; + + private static IIcon activeIcon; + private static IIcon passiveIcon; + + private int energyUsed; + + public BoundShovel() + { + super(AlchemicalWizardry.bloodBoundToolMaterial); + this.maxStackSize = 1; + //this.setMaxDamage(par3EnumToolMaterial.getMaxUses()); + this.efficiencyOnProperMaterial = 12.0F; + this.damageVsEntity = 5; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setEnergyUsed(5); + } + + public void setEnergyUsed(int i) + { + energyUsed = i; + } + + public int getEnergyUsed() + { + return this.energyUsed; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("No, not that type of spade."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundShovel_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundShovel_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + if (par3EntityPlayer.isPotionActive(AlchemicalWizardry.customPotionInhibit)) + { + return par1ItemStack; + } + + int posX = (int) par3EntityPlayer.posX; + int posY = (int) par3EntityPlayer.posY; + int posZ = (int) par3EntityPlayer.posZ; + boolean silkTouch = false; + int so = Enchantment.silkTouch.effectId; + int fortune = Enchantment.fortune.effectId; + int fortuneLvl = 0; + NBTTagList enchants = par1ItemStack.getEnchantmentTagList(); + + if (enchants != null) + { + for (int i = 0; i < enchants.tagCount(); i++) + { + if (enchants.getCompoundTagAt(i) instanceof NBTTagCompound) + { + NBTTagCompound nbt = (NBTTagCompound) enchants.getCompoundTagAt(i); + int id = nbt.getShort("id"); + + if (id == so) + { + silkTouch = true; + } + + if (id == fortune) + { + fortuneLvl = nbt.getShort("lvl"); + } + } + } + } + + for (int i = -5; i <= 5; i++) + { + for (int j = 0; j <= 10; j++) + { + for (int k = -5; k <= 5; k++) + { + Block block = par2World.getBlock(posX + i, posY + j, posZ + k); + int meta = par2World.getBlockMetadata(posX + i, posY + j, posZ + k); + + if (block != null) + { + float str = func_150893_a(par1ItemStack, block); + + if (str > 1.1f && par2World.canMineBlock(par3EntityPlayer, posX + i, posY + j, posZ + k)) + { + //par1ItemStack.getEnchantmentTagList(); + if (silkTouch) + { + ItemStack droppedItem = new ItemStack(block, 1, meta); + + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); + } + } else + { + ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); + + if (itemDropList != null) + { + for (ItemStack item : itemDropList) + { + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); + } + } + } + } + + par2World.setBlockToAir(posX + i, posY + j, posZ + k); + } + } + } + } + } + + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 10000); + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 20); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + + /** + * Returns the strength of the stack against a given block. 1.0F base, (Quality+1)*2 if correct blocktype, 1.5F if + * sword + */ + @Override + public float func_150893_a(ItemStack par1ItemStack, Block par2Block) + { + if (!getActivated(par1ItemStack)) + { + return 0.0F; + } + + return super.func_150893_a(par1ItemStack, par2Block); + } + + /** + * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise + * the damage on the stack. + */ + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (!getActivated(par1ItemStack)) + { + return false; + } + + //par1ItemStack.damageItem(2, par3EntityLivingBase); + return true; + } + + public boolean onBlockDestroyed(ItemStack par1ItemStack, World par2World, int par3, int par4, int par5, int par6, EntityLivingBase par7EntityLivingBase) + { + return true; + } + + @SideOnly(Side.CLIENT) + + /** + * Returns True is the item is renderer in full 3D when hold. + */ + public boolean isFull3D() + { + return true; + } + + /** + * Return the enchantability factor of the item, most of the time is based on material. + */ + public int getItemEnchantability() + { + return 30; + } + + /** + * Return whether this item is repairable in an anvil. + */ +// public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) +// { +// return false; +// } + @Override + public Multimap getItemAttributeModifiers() + { + Multimap multimap = super.getItemAttributeModifiers(); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", (double) this.damageVsEntity, 0)); + return multimap; + } + + /** + * FORGE: Overridden to allow custom tool effectiveness + */ + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) + { + if (!getActivated(stack)) + { + return 0.0F; + } + + if (ForgeHooks.isToolEffective(stack, block, meta)) + { + return efficiencyOnProperMaterial; + } + + return func_150893_a(stack, block); + } +// +// public boolean canHarvestBlock(Block par1Block) +// { +// return par1Block == Block.snow ? true : par1Block == Block.blockSnow; +// } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) + { + return !getActivated(stack); + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + if("shovel".equals(toolClass)) + { + return 5; + } + + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java new file mode 100644 index 00000000..4596e507 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java @@ -0,0 +1,254 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class CheatyItem extends Item implements IBindable +{ + // private int maxEssence; + //protected int orbLevel; + + public CheatyItem() + { + super(); + DamageSource damageSource = DamageSource.generic; + setMaxStackSize(1); + //setMaxDamage(damage); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setFull3D(); + //maxEssence = damage; + //orbLevel = 1; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBattery"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Creative only"); + par3List.add("Right-click to fill network,"); + par3List.add("shift-right to empty."); + + //par3List.add("LP: " + (this.getMaxDamage() - this.getDamage(par1ItemStack))); + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); +// EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(par1ItemStack.stackTagCompound.getString("ownerName")); +// if(owner!=null) +// { +// NBTTagCompound tag = owner.getEntityData(); +// par3List.add("LP: " + tag.getInteger("currentEssence")); +// } + } + + //par3List.add("LP: " + par2EntityPlayer.getEntityData().getInteger("currentEssence")); + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + World world = par3EntityPlayer.worldObj; + + if (par3EntityPlayer instanceof FakePlayer) + { + return par1ItemStack; + } + + if (world != null) + { + double posX = par3EntityPlayer.posX; + double posY = par3EntityPlayer.posY; + double posZ = par3EntityPlayer.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 4, posX, posY, posZ); + } + + if (!par3EntityPlayer.worldObj.isRemote) + { + return par1ItemStack; + } + + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return par1ItemStack; + } + + if (par3EntityPlayer.isSneaking()) + { + EnergyItems.setCurrentEssence(itemTag.getString("ownerName"), 0); + } else + { + EnergyItems.addEssenceToMaximum(itemTag.getString("ownerName"), 1000000, Integer.MAX_VALUE); + } + + //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPacket(itemTag.getString("ownerName")), (Player)par3EntityPlayer); +// EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(itemTag.getString("ownerName")); +// if(owner==null){return par1ItemStack;} +// NBTTagCompound ownerTag = owner.getEntityData(); +// if(ownerTag.getInteger("currentEssence")<=this.maxEssence) +// { +// damagePlayer(par2World, par3EntityPlayer,2); +// ownerTag.setInteger("currentEssence", Math.min(this.maxEssence, ownerTag.getInteger("currentEssence")+200/2)); +// } + return par1ItemStack; + } + + /* + * @return the damage that was not deducted + */ + public int damageItem(ItemStack par1ItemStack, int par2int) + { + if (par2int == 0) + { + return 0; + } + + int before = this.getDamage(par1ItemStack); + this.setDamage(par1ItemStack, this.getDamage(par1ItemStack) + par2int); + return par2int - (this.getDamage(par1ItemStack) - before); + } + + protected void damagePlayer(World world, EntityPlayer player, int damage) + { + if (world != null) + { + double posX = player.posX; + double posY = player.posY; + double posZ = player.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + + for (int l = 0; l < 8; ++l) + { + world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); + } + } + + if (!player.capabilities.isCreativeMode) + { + for (int i = 0; i < damage; i++) + { + player.setHealth((player.getHealth() - 1)); + //player.setEntityHealth(player.func_110143_aJ() - 1); + } + } + + if (player.getHealth() <= 0) + { + player.inventory.dropAllItems(); + } + } + +// public int getMaxEssence() +// { +// return this.maxEssence; +// } +// +// public int getOrbLevel() +// { +// return orbLevel; +// } +// +// @Override +// public void onArmourUpdate(World world, EntityPlayer player, +// ItemStack thisItemStack) { +// // TODO Auto-generated method stub +// +// } +// +// @Override +// public boolean isUpgrade() +// { +// // TODO Auto-generated method stub +// return false; +// } +// +// @Override +// public int getEnergyForTenSeconds() +// { +// // TODO Auto-generated method stub +// return 0; +// } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + //if(!syphonBatteries(itemStack, null, 10)) + { + //syphonWhileInContainer(itemStack, this.getEnergyUsed()); +// ItemStack copiedStack = itemStack.copy(); +// copiedStack.setItemDamage(copiedStack.getItemDamage()); +// copiedStack.stackSize = 1; +// return copiedStack; + } + return itemStack; + } + + @Override + public boolean hasContainerItem() + { + return true; + } + + //@SideOnly(Side.SERVER) + public int getCurrentEssence(ItemStack par1ItemStack) + { + if (par1ItemStack == null) + { + return 0; + } + + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return 0; + } + + String owner = itemTag.getString("ownerName"); + 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; + return (currentEssence); + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack itemStack) + { + return false; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java new file mode 100644 index 00000000..361a95dc --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java @@ -0,0 +1,268 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.boss.IBossDisplayData; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.monster.EntitySlime; +import net.minecraft.entity.passive.EntityAnimal; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + +import com.google.common.collect.Multimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DaggerOfSacrifice extends EnergyItems +{ + private float weaponDamage; + + public DaggerOfSacrifice() + { + super(); + this.maxStackSize = 1; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setEnergyUsed(100); + setFull3D(); + setMaxDamage(100); + weaponDamage = 1.0F; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DaggerOfSacrifice"); + } + + @Override + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (par3EntityLivingBase == null || par2EntityLivingBase == null || par3EntityLivingBase.worldObj.isRemote || !(par3EntityLivingBase.getClass().equals(EntityPlayerMP.class))) + { + return false; + } + + //EntityWither d; + if (par2EntityLivingBase.isChild() || par2EntityLivingBase instanceof EntityWither || par2EntityLivingBase instanceof EntityDragon || par2EntityLivingBase instanceof EntityPlayer || par2EntityLivingBase instanceof IBossDisplayData) + { + return false; + } + + World world = par2EntityLivingBase.worldObj; + + if (par2EntityLivingBase.isDead || par2EntityLivingBase.getHealth() < 0.5f) + { + return false; + } + + if (par2EntityLivingBase instanceof EntityVillager && !par2EntityLivingBase.isChild()) + { + if (findAndFillAltar(par2EntityLivingBase.worldObj, par2EntityLivingBase, 2000)) + { + double posX = par2EntityLivingBase.posX; + double posY = par2EntityLivingBase.posY; + double posZ = par2EntityLivingBase.posZ; + + + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 1, posX, posY, posZ); + } + + par2EntityLivingBase.setHealth(-1); + par2EntityLivingBase.onDeath(DamageSource.generic); + return false; + } + } + + if (par2EntityLivingBase instanceof EntitySlime && !par2EntityLivingBase.isChild()) + { + if (findAndFillAltar(par2EntityLivingBase.worldObj, par2EntityLivingBase, 150)) + { + double posX = par2EntityLivingBase.posX; + double posY = par2EntityLivingBase.posY; + double posZ = par2EntityLivingBase.posZ; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 1, posX, posY, posZ); + } + + par2EntityLivingBase.setHealth(-1); + par2EntityLivingBase.onDeath(DamageSource.generic); + return false; + } + } + + if (par2EntityLivingBase instanceof EntityEnderman && !par2EntityLivingBase.isChild()) + { + if (findAndFillAltar(par2EntityLivingBase.worldObj, par2EntityLivingBase, 200)) + { + double posX = par2EntityLivingBase.posX; + double posY = par2EntityLivingBase.posY; + double posZ = par2EntityLivingBase.posZ; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 1, posX, posY, posZ); + } + + par2EntityLivingBase.setHealth(-1); + par2EntityLivingBase.onDeath(DamageSource.generic); + return false; + } + } + + if (par2EntityLivingBase instanceof EntityAnimal && !par2EntityLivingBase.isChild()) + { + if (findAndFillAltar(par2EntityLivingBase.worldObj, par2EntityLivingBase, 250)) + { + double posX = par2EntityLivingBase.posX; + double posY = par2EntityLivingBase.posY; + double posZ = par2EntityLivingBase.posZ; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 1, posX, posY, posZ); + } + + par2EntityLivingBase.setHealth(-1); + par2EntityLivingBase.onDeath(DamageSource.generic); + return false; + } + } + + if (findAndFillAltar(par2EntityLivingBase.worldObj, par2EntityLivingBase, 500)) + { + double posX = par2EntityLivingBase.posX; + double posY = par2EntityLivingBase.posY; + double posZ = par2EntityLivingBase.posZ; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 1, posX, posY, posZ); + } + + par2EntityLivingBase.setHealth(-1); + par2EntityLivingBase.onDeath(DamageSource.generic); + return false; + } + + return false; + } + + public float func_82803_g() + { + return 4.0F; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Caution: may cause"); + par3List.add("a bad day..."); + } + + @Override + public float func_150893_a(ItemStack par1ItemStack, Block par2Block) + { + if (par2Block == Blocks.web) + { + return 15.0F; + } else + { + Material material = par2Block.getMaterial(); + return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.gourd ? 1.0F : 1.5F; + } + } + + @Override + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return false; + } + + @Override + + public Multimap getItemAttributeModifiers() + { + Multimap multimap = super.getItemAttributeModifiers(); + multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", 1.0d, 0)); + return multimap; + } + + public boolean findAndFillAltar(World world, EntityLivingBase sacrifice, int amount) + { + int posX = (int) Math.round(sacrifice.posX - 0.5f); + int posY = (int) sacrifice.posY; + int posZ = (int) Math.round(sacrifice.posZ - 0.5f); + TEAltar altarEntity = this.getAltar(world, posX, posY, posZ); + + if (altarEntity == null) + { + return false; + } + + altarEntity.sacrificialDaggerCall(amount, true); + altarEntity.startCycle(); + return true; + } + + public TEAltar getAltar(World world, int x, int y, int z) + { + TileEntity tileEntity = null; + + for (int i = -2; i <= 2; i++) + { + for (int j = -2; j <= 2; j++) + { + for (int k = -2; k <= 1; k++) + { + tileEntity = world.getTileEntity(i + x, k + y, j + z); + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java new file mode 100644 index 00000000..68596a3f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java @@ -0,0 +1,277 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Facing; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityDemon; +import WayofTime.alchemicalWizardry.common.summoning.SummoningRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DemonPlacer extends Item +{ + @SideOnly(Side.CLIENT) + private IIcon theIcon; + + public DemonPlacer() + { + super(); + this.setHasSubtypes(true); + this.setCreativeTab(CreativeTabs.tabMisc); + this.maxStackSize = 1; + } + + public String getItemDisplayName(ItemStack par1ItemStack) + { +// String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); +// String s1 = EntityList.getStringFromID(par1ItemStack.getItemDamage()); +// +// if (s1 != null) +// { +// s = s + " " + StatCollector.translateToLocal("entity." + s1 + ".name"); +// } +// +// return s; + return "Demon Crystal"; + } + + @SideOnly(Side.CLIENT) + public int getColorFromItemStack(ItemStack par1ItemStack, int par2) + { + EntityEggInfo entityegginfo = (EntityEggInfo) EntityList.entityEggs.get(Integer.valueOf(par1ItemStack.getItemDamage())); + return entityegginfo != null ? (par2 == 0 ? entityegginfo.primaryColor : entityegginfo.secondaryColor) : 16777215; + } + + /** + * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return + * True if something happen and false if it don't. This is for ITEMS, not BLOCKS + */ + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + if (par3World.isRemote) + { + return true; + } else + { + Block i1 = par3World.getBlock(par4, par5, par6); + par4 += Facing.offsetsXForSide[par7]; + par5 += Facing.offsetsYForSide[par7]; + par6 += Facing.offsetsZForSide[par7]; + double d0 = 0.0D; + + if (par7 == 1 && i1 != null && i1.getRenderType() == 11) + { + d0 = 0.5D; + } + + Entity entity = spawnCreature(par3World, par1ItemStack.getItemDamage(), (double) par4 + 0.5D, (double) par5 + d0, (double) par6 + 0.5D, par1ItemStack); + + if (entity != null) + { + if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) + { + ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName()); + } + + if (!par2EntityPlayer.capabilities.isCreativeMode) + { + --par1ItemStack.stackSize; + } + } + + return true; + } + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer + */ + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (par2World.isRemote) + { + return par1ItemStack; + } else + { + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, true); + + if (movingobjectposition == null) + { + return par1ItemStack; + } else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) + { + return par1ItemStack; + } + + if (par2World.getBlock(i, j, k).getMaterial() == Material.water) + { + Entity entity = spawnCreature(par2World, par1ItemStack.getItemDamage(), (double) i, (double) j, (double) k, par1ItemStack); + + if (entity != null) + { + if (entity instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) + { + ((EntityLiving) entity).setCustomNameTag(par1ItemStack.getDisplayName()); + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + --par1ItemStack.stackSize; + } + } + } + } + + return par1ItemStack; + } + } + } + + /** + * Spawns the creature specified by the egg's type in the location specified by the last three parameters. + * Parameters: world, entityID, x, y, z. + */ + public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6, ItemStack itemStack) + { +// if (!EntityList.entityEggs.containsKey(Integer.valueOf(par1))) +// { +// return null; +// } +// else + { + Entity entity = null; + + for (int j = 0; j < 1; ++j) + { + entity = SummoningRegistry.getEntityWithID(par0World, par1); + + if (entity != null && entity instanceof EntityLivingBase) + { + EntityLiving entityliving = (EntityLiving) entity; + entity.setLocationAndAngles(par2, par4, par6, MathHelper.wrapAngleTo180_float(par0World.rand.nextFloat() * 360.0F), 0.0F); + entityliving.rotationYawHead = entityliving.rotationYaw; + entityliving.renderYawOffset = entityliving.rotationYaw; + + //entityliving.onSpawnWithEgg((EntityLivingData)null); + if (entityliving instanceof EntityDemon) + { + ((EntityDemon) entityliving).setOwner(DemonPlacer.getOwnerName(itemStack)); + + if (!DemonPlacer.getOwnerName(itemStack).equals("")) + { + ((EntityDemon) entityliving).setTamed(true); + } + } + + par0World.spawnEntityInWorld(entity); + entityliving.playLivingSound(); + } + } + + return entity; + } + } + +// @SideOnly(Side.CLIENT) +// public boolean requiresMultipleRenderPasses() +// { +// return true; +// } + +// @SideOnly(Side.CLIENT) +// +// /** +// * Gets an icon index based on an item's damage value and the given render pass +// */ +// public Icon getIconFromDamageForRenderPass(int par1, int par2) +// { +// return par2 > 0 ? this.theIcon : super.getIconFromDamageForRenderPass(par1, par2); +// } + +// @SideOnly(Side.CLIENT) +// +// /** +// * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) +// */ +// public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) +// { +// Iterator iterator = EntityList.entityEggs.values().iterator(); +// +// while (iterator.hasNext()) +// { +// EntityEggInfo entityegginfo = (EntityEggInfo)iterator.next(); +// par3List.add(new ItemStack(par1, 1, entityegginfo.spawnedID)); +// } +// } + + public static void setOwnerName(ItemStack par1ItemStack, String ownerName) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setString("ownerName", ownerName); + } + + public static String getOwnerName(ItemStack par1ItemStack) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return par1ItemStack.stackTagCompound.getString("ownerName"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used to spawn demons."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Demon's Owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DemonPlacer"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java new file mode 100644 index 00000000..d26de12d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java @@ -0,0 +1,47 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DemonicTelepositionFocus extends TelepositionFocus +{ + public DemonicTelepositionFocus() + { + super(4); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + //TODO + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DemonicTeleposerFocus"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("A stronger version of the focus,"); + par3List.add("using a demonic shard"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java new file mode 100644 index 00000000..ddbdbfe9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DuskScribeTool extends ScribeTool +{ + public DuskScribeTool() + { + super(5); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DuskScribeTool"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java new file mode 100644 index 00000000..290c6f91 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EarthScribeTool extends ScribeTool +{ + public EarthScribeTool() + { + super(3); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EarthScribeTool"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java new file mode 100644 index 00000000..2e5b2307 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java @@ -0,0 +1,255 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnergyBattery extends Item implements ArmourUpgrade, IBindable +{ + private int maxEssence; + protected int orbLevel; + + public EnergyBattery(int damage) + { + super(); + DamageSource damageSource = DamageSource.generic; + setMaxStackSize(1); + //setMaxDamage(damage); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + //setFull3D(); + maxEssence = damage; + orbLevel = 1; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBattery"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Stores raw Life Essence"); + + //par3List.add("LP: " + (this.getMaxDamage() - this.getDamage(par1ItemStack))); + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); +// EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(par1ItemStack.stackTagCompound.getString("ownerName")); +// if(owner!=null) +// { +// NBTTagCompound tag = owner.getEntityData(); +// par3List.add("LP: " + tag.getInteger("currentEssence")); +// } + } + + //par3List.add("LP: " + par2EntityPlayer.getEntityData().getInteger("currentEssence")); + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + World world = par3EntityPlayer.worldObj; + + if (par3EntityPlayer instanceof FakePlayer || par3EntityPlayer instanceof EntityPlayerMP) + { + return par1ItemStack; + } + + if (world != null) + { + double posX = par3EntityPlayer.posX; + double posY = par3EntityPlayer.posY; + double posZ = par3EntityPlayer.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 4, posX, posY, posZ); + } + + if (!(par3EntityPlayer.getClass().equals(EntityPlayerMP.class))) + { + return par1ItemStack; + } + + + +// if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) +// { +// return par1ItemStack; +// } + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return par1ItemStack; + } + + if(world.isRemote) + { + return par1ItemStack; + } + + EnergyItems.addEssenceToMaximum(itemTag.getString("ownerName"), 200, this.getMaxEssence()); + EnergyItems.hurtPlayer(par3EntityPlayer, 200); + //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPacket(itemTag.getString("ownerName")), (Player)par3EntityPlayer); +// EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(itemTag.getString("ownerName")); +// if(owner==null){return par1ItemStack;} +// NBTTagCompound ownerTag = owner.getEntityData(); +// if(ownerTag.getInteger("currentEssence")<=this.maxEssence) +// { +// damagePlayer(par2World, par3EntityPlayer,2); +// ownerTag.setInteger("currentEssence", Math.min(this.maxEssence, ownerTag.getInteger("currentEssence")+200/2)); +// } + return par1ItemStack; + } + + /* + * @return the damage that was not deducted + */ + public int damageItem(ItemStack par1ItemStack, int par2int) + { + if (par2int == 0) + { + return 0; + } + + int before = this.getDamage(par1ItemStack); + this.setDamage(par1ItemStack, this.getDamage(par1ItemStack) + par2int); + return par2int - (this.getDamage(par1ItemStack) - before); + } + + protected void damagePlayer(World world, EntityPlayer player, int damage) + { + if (world != null) + { + double posX = player.posX; + double posY = player.posY; + double posZ = player.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + + for (int l = 0; l < 8; ++l) + { + world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); + } + } + + if (!player.capabilities.isCreativeMode) + { + for (int i = 0; i < damage; i++) + { + player.setHealth((player.getHealth() - 1)); + //player.setEntityHealth(player.func_110143_aJ() - 1); + } + } + + if (player.getHealth() <= 0) + { + player.inventory.dropAllItems(); + } + } + + public int getMaxEssence() + { + return this.maxEssence; + } + + public int getOrbLevel() + { + return orbLevel; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + } + + @Override + public boolean isUpgrade() + { + return false; + } + + @Override + public int getEnergyForTenSeconds() + { + return 0; + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + //if(!syphonBatteries(itemStack, null, 10)) + { + //syphonWhileInContainer(itemStack, this.getEnergyUsed()); +// ItemStack copiedStack = itemStack.copy(); +// copiedStack.setItemDamage(copiedStack.getItemDamage()); +// copiedStack.stackSize = 1; +// return copiedStack; + } + return itemStack; + } + + @Override + public boolean hasContainerItem() + { + return true; + } + + //@SideOnly(Side.SERVER) + public int getCurrentEssence(ItemStack par1ItemStack) + { + if (par1ItemStack == null) + { + return 0; + } + + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return 0; + } + + String owner = itemTag.getString("ownerName"); + 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; + return (currentEssence); + } + + @Override + public boolean doesContainerItemLeaveCraftingGrid(ItemStack itemStack) + { + return false; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java new file mode 100644 index 00000000..be0eddc2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java @@ -0,0 +1,219 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnergyBazooka extends EnergyItems +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private static int damage; + //private static int delay; + private static final int maxDelay = 150; + + public EnergyBazooka() + { + super(); + setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setFull3D(); + setMaxDamage(250); + this.setEnergyUsed(20000); + damage = 12; + //delay = 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBazooka_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBazooka_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 100); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + if (this.getDelay(par1ItemStack) > 0) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + this.syphonBatteries(par1ItemStack, par3EntityPlayer, this.getEnergyUsed()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EntityEnergyBazookaMainProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new EntityEnergyBazookaMainProjectile(par2World, par3EntityPlayer, damage)); + this.setDelay(par1ItemStack, maxDelay); + } + + Vec3 vec = par3EntityPlayer.getLookVec(); + double wantedVelocity = 3.0f; + par3EntityPlayer.motionX = -vec.xCoord * wantedVelocity; + par3EntityPlayer.motionY = -vec.yCoord * wantedVelocity; + par3EntityPlayer.motionZ = -vec.zCoord * wantedVelocity; + par2World.playSoundEffect((double) ((float) par3EntityPlayer.posX + 0.5F), (double) ((float) par3EntityPlayer.posY + 0.5F), (double) ((float) par3EntityPlayer.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (par2World.rand.nextFloat() - par2World.rand.nextFloat()) * 0.8F); + par3EntityPlayer.fallDistance = 0; + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + int delay = this.getDelay(par1ItemStack); + + if (!par2World.isRemote && delay > 0) + { + this.setDelay(par1ItemStack, delay - 1); + } + + if (par2World.getWorldTime() % 100 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 50); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Boom."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + + public void setDelay(ItemStack par1ItemStack, int newDelay) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setInteger("delay", newDelay); + } + + public int getDelay(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getInteger("delay"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java new file mode 100644 index 00000000..298c950d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java @@ -0,0 +1,214 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnergyBlast extends EnergyItems +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private static int damage; + //private static int delay; + private static final int maxDelay = 15; + + public EnergyBlast() + { + super(); + setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setUnlocalizedName("energyBlaster"); + setFull3D(); + setMaxDamage(250); + this.setEnergyUsed(150); + damage = 12; + //delay = 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBlaster_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:EnergyBlaster_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 100); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + if (this.getDelay(par1ItemStack) > 0) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + this.syphonBatteries(par1ItemStack, par3EntityPlayer, this.getEnergyUsed()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + this.setDelay(par1ItemStack, maxDelay); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + int delay = this.getDelay(par1ItemStack); + + if (!par2World.isRemote && delay > 0) + { + this.setDelay(par1ItemStack, delay - 1); + } + + if (par2World.getWorldTime() % 100 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 50); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used to fire devastating"); + par3List.add("projectiles."); + par3List.add("Damage: " + damage); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + + public void setDelay(ItemStack par1ItemStack, int newDelay) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setInteger("delay", newDelay); + } + + public int getDelay(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getInteger("delay"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java new file mode 100644 index 00000000..c01c414d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java @@ -0,0 +1,388 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + +public class EnergyItems extends Item implements IBindable +{ + private int energyUsed; + + public EnergyItems() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + protected void setEnergyUsed(int par1int) + { + this.energyUsed = par1int; + } + + protected int getEnergyUsed() + { + return this.energyUsed; + } + //Heals the player using the item. If the player is at full health, or if the durability cannot be used any more, + //the item is not used. + + protected void damagePlayer(World world, EntityPlayer player, int damage) + { + if (world != null) + { + double posX = player.posX; + double posY = player.posY; + double posZ = player.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + + for (int l = 0; l < 8; ++l) + { + world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); + } + } + + for (int i = 0; i < damage; i++) + { + //player.setEntityHealth((player.getHealth()-1)); + player.setHealth((player.getHealth() - 1)); + + if (player.getHealth() <= 0) + { + player.inventory.dropAllItems(); + } + } + } + +// public static boolean syphonBatteriesWithoutParticles(ItemStack ist, EntityPlayer player, int damageToBeDone, boolean particles) +// { +// if (!player.capabilities.isCreativeMode) +// { +// NBTTagCompound itemTag = ist.stackTagCompound; +// +// if (itemTag == null || itemTag.getString("ownerName").equals("")) +// { +// return false; +// } +// +// World world = player.worldObj; +// +// if (world != null) +// { +// double posX = player.posX; +// double posY = player.posY; +// double posZ = player.posZ; +// +// if (particles) +// { +// SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 4, posX, posY, posZ); +// world.playSoundEffect((double) ((float) player.posX + 0.5F), (double) ((float) player.posY + 0.5F), (double) ((float) player.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); +// } +// } +// +// if (!player.worldObj.isRemote) +// { +// return false; +// } +// +// PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(itemTag.getString("ownerName"), -damageToBeDone, 0)); +// return true; +// } else +// { +// return true; +// } +// } + + public static boolean syphonBatteries(ItemStack ist, EntityPlayer player, int damageToBeDone) + { + if (!player.worldObj.isRemote) + { + return syphonAndDamageWhileInContainer(ist, player, damageToBeDone); + } else + { + World world = player.worldObj; + + if (world != null) + { + double posX = player.posX; + double posY = player.posY; + double posZ = player.posZ; + //if(particles) + { + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 4, posX, posY, posZ); + world.playSoundEffect((double) ((float) player.posX + 0.5F), (double) ((float) player.posY + 0.5F), (double) ((float) player.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + } + } + } + + return true; + //return syphonBatteriesWithoutParticles(ist, player, damageToBeDone, true); + } + + public static boolean syphonWhileInContainer(ItemStack ist, int damageToBeDone) + { + if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals(""))) + { + String ownerName = ist.getTagCompound().getString("ownerName"); + + if (MinecraftServer.getServer() == null) + { + return false; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + if (data.currentEssence >= damageToBeDone) + { + data.currentEssence -= damageToBeDone; + data.markDirty(); + return true; + } + +// EntityPlayer ownerEntity = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(ist.getTagCompound().getString("ownerName")); +// if(ownerEntity==null){return false;} +// NBTTagCompound tag = ownerEntity.getEntityData(); +// int currentEssence = tag.getInteger("currentEssence"); +// if(currentEssence>=damageToBeDone) +// { +// tag.setInteger("currentEssence", currentEssence-damageToBeDone); +// return true; +// } + } + + return false; + } + + public static boolean canSyphonInContainer(ItemStack ist, int damageToBeDone) + { + if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals(""))) + { + String ownerName = ist.getTagCompound().getString("ownerName"); + + if (MinecraftServer.getServer() == null) + { + return false; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + return data.currentEssence >= damageToBeDone; +// EntityPlayer ownerEntity = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(ist.getTagCompound().getString("ownerName")); +// if(ownerEntity==null){return false;} +// NBTTagCompound tag = ownerEntity.getEntityData(); +// int currentEssence = tag.getInteger("currentEssence"); +// if(currentEssence>=damageToBeDone) +// { +// tag.setInteger("currentEssence", currentEssence-damageToBeDone); +// return true; +// } + } + + return false; + } + + public static void hurtPlayer(EntityPlayer user, int energySyphoned) + { + if (energySyphoned < 100 && energySyphoned > 0) + { + if (!user.capabilities.isCreativeMode) + { + //player.setEntityHealth((player.getHealth()-1)); + user.setHealth((user.getHealth() - 1)); + + if (user.getHealth() <= 0.1f) + { + user.onDeath(DamageSource.generic); + } + } + } else if (energySyphoned >= 100) + { + if (!user.capabilities.isCreativeMode) + { + for (int i = 0; i < ((energySyphoned + 99) / 100); i++) + { + //player.setEntityHealth((player.getHealth()-1)); + user.setHealth((user.getHealth() - 1)); + + if (user.getHealth() <= 0.1f) + { + user.onDeath(DamageSource.generic); + } + } + } + } + } + + public static boolean syphonAndDamageWhileInContainer(ItemStack ist, EntityPlayer player, int damageToBeDone) + { + if (!syphonWhileInContainer(ist, damageToBeDone)) + { + hurtPlayer(player, damageToBeDone); + } + + return true; + } + + //Global static methods + public static void checkAndSetItemOwner(ItemStack item, EntityPlayer player) + { + if (item.stackTagCompound == null) + { + item.setTagCompound(new NBTTagCompound()); + } + + if (item.stackTagCompound.getString("ownerName").equals("")) + { + item.stackTagCompound.setString("ownerName", SpellHelper.getUsername(player)); + } + + initializePlayer(player); + } + + public static void checkAndSetItemOwner(ItemStack item, String ownerName) + { + if (item.stackTagCompound == null) + { + item.setTagCompound(new NBTTagCompound()); + } + + if (item.stackTagCompound.getString("ownerName").equals("")) + { + item.stackTagCompound.setString("ownerName", ownerName); + } + } + + public static void initializePlayer(EntityPlayer player) + { + NBTTagCompound tag = player.getEntityData(); + + if (tag.getInteger("currentEssence") == 0) + { + tag.setInteger("currentEssence", 0); + } + } + + public String getOwnerName(ItemStack item) + { + if (item.stackTagCompound == null) + { + item.setTagCompound(new NBTTagCompound()); + } + + return item.stackTagCompound.getString("ownerName"); + } + + public static void drainPlayerNetwork(EntityPlayer player, int damageToBeDone) + { + String ownerName = SpellHelper.getUsername(player); + + if (MinecraftServer.getServer() == null) + { + // + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + if (data.currentEssence >= damageToBeDone) + { + data.currentEssence -= damageToBeDone; + data.markDirty(); + }else + { + hurtPlayer(player, damageToBeDone); + } + } + + public static int getCurrentEssence(String ownerName) + { + if (MinecraftServer.getServer() == null) + { + return 0; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + return data.currentEssence; + } + + public static void setCurrentEssence(String ownerName, int amount) + { + if (MinecraftServer.getServer() == null) + { + return; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + data.currentEssence = amount; + data.markDirty(); + } + + public static void addEssenceToMaximum(String ownerName, int amount, int maximum) + { + if (MinecraftServer.getServer() == null) + { + return; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + data.currentEssence = Math.min(maximum, data.currentEssence + amount); + data.markDirty(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java new file mode 100644 index 00000000..a4578599 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java @@ -0,0 +1,238 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemSword; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnergySword extends ItemSword +{ + //private float weaponDamaged; + //private int maxMode = 3; + private NBTTagCompound data; + + private static IIcon activeIcon; + private static IIcon passiveIcon; + + private int energyUsed; + + public EnergySword() + { + super(AlchemicalWizardry.bloodBoundToolMaterial); + this.maxStackSize = 1; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setEnergyUsed(50); + setFull3D(); + setMaxDamage(100); + //weaponDamaged = 12.0F; + } + + public void setEnergyUsed(int i) + { + energyUsed = i; + } + + public int getEnergyUsed() + { + return this.energyUsed; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundSword_activated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundSword_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) + { + return !getActivated(stack); + } + + @Override + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + if (par3EntityLivingBase instanceof EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, (EntityPlayer) par3EntityLivingBase); + + if (!EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par3EntityLivingBase, this.getEnergyUsed())) + { + //this.damagePlayer(null, (EntityPlayer)par3EntityLivingBase, (this.getEnergyUsed() + 99) / 100); + } + } + + par2EntityLivingBase.addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 2)); + return true; + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); + par1ItemStack.stackTagCompound.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 100); + return par1ItemStack; + } + + if (!getActivated(par1ItemStack)) + { + return par1ItemStack; + } + + return par1ItemStack; + } + + @Override + public int getItemEnchantability() + { + return 30; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + +// if(par1ItemStack.stackTagCompound.getBoolean("isActive")) +// { +// EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 1); +// } + + if (par2World.getWorldTime() % 100 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 50); + } + } + + par1ItemStack.setItemDamage(0); + return; + } + + public void setActivated(ItemStack par1ItemStack, boolean newActivated) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + itemTag.setBoolean("isActive", newActivated); + } + + public boolean getActivated(ItemStack par1ItemStack) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getBoolean("isActive"); + } + +// public int getDamageVsEntity(Entity par1Entity) +// { +// return (int) this.weaponDamage; +// } + + public float func_82803_g() + { + return 4.0F; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Caution: may cause"); + par3List.add("a bad day..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + @Override + public float func_150893_a(ItemStack par1ItemStack, Block par2Block) + { + if (par2Block == Blocks.web) + { + return 15.0F; + } else + { + Material material = par2Block.getMaterial(); + return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.gourd ? 1.0F : 1.5F; + } + } + +// public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) +// { +// return false; +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java new file mode 100644 index 00000000..4753fc05 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java @@ -0,0 +1,46 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnhancedTelepositionFocus extends TelepositionFocus +{ + public EnhancedTelepositionFocus() + { + super(2); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + //TODO + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnhancedTeleposerFocus"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("A focus further enhanced in an altar"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java new file mode 100644 index 00000000..18fc3a52 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class FireScribeTool extends ScribeTool +{ + public FireScribeTool() + { + super(2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:FireScribeTool"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java new file mode 100644 index 00000000..420cc8c5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java @@ -0,0 +1,59 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemBloodRuneBlock extends ItemBlock + +{ + public ItemBloodRuneBlock(Block block) + { + super(block); + setHasSubtypes(true); +// this.setUnlocalizedName("itemBloodRuneBlock"); +// setCreativeTab(AlchemicalWizardry.tabBloodMagic); + + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "blank"; + break; + } + + case 1: + { + name = "fill"; + break; + } + + case 2: + name = "empty"; + break; + + case 3: + name = "test"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java new file mode 100644 index 00000000..f5cc3455 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java @@ -0,0 +1,108 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemComplexSpellCrystal extends EnergyItems +{ + public ItemComplexSpellCrystal() + { + super(); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BlankSpell"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Crystal of infinite possibilities."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par2World.isRemote) + { + //World world = MinecraftServer.getServer().worldServers[getDimensionID(par1ItemStack)]; + World world = DimensionManager.getWorld(getDimensionID(par1ItemStack)); + + if (world != null) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + TileEntity tileEntity = world.getTileEntity(itemTag.getInteger("xCoord"), itemTag.getInteger("yCoord"), itemTag.getInteger("zCoord")); + + if (tileEntity instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileParad = (TESpellParadigmBlock) tileEntity; + + tileParad.castSpell(par2World, par3EntityPlayer, par1ItemStack); + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + } else + { + return par1ItemStack; + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); +// if (!par2World.isRemote) +// { +// //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); +// par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 10)); +// } + return par1ItemStack; + } + + public int getDimensionID(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.stackTagCompound.getInteger("dimensionId"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java new file mode 100644 index 00000000..b4d5b989 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java @@ -0,0 +1,128 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemDiabloKey extends EnergyItems +{ + public ItemDiabloKey() + { + super(); + DamageSource damageSource = DamageSource.generic; + setMaxStackSize(1); + //setMaxDamage(damage); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setEnergyUsed(1000); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DiabloKey"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Binds other items to the owner's network"); + + //par3List.add("LP: " + (this.getMaxDamage() - this.getDamage(par1ItemStack))); + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + //par3List.add("LP: " + par2EntityPlayer.getEntityData().getInteger("currentEssence")); + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + World world = par3EntityPlayer.worldObj; + + if (par3EntityPlayer instanceof FakePlayer || par3EntityPlayer instanceof EntityPlayerMP) + { + return par1ItemStack; + } + + if (world != null) + { + double posX = par3EntityPlayer.posX; + double posY = par3EntityPlayer.posY; + double posZ = par3EntityPlayer.posZ; + world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + SpellHelper.sendIndexedParticleToAllAround(world, posX, posY, posZ, 20, world.provider.dimensionId, 4, posX, posY, posZ); + } + + if (!par3EntityPlayer.worldObj.isRemote && !(par3EntityPlayer.getClass().equals(EntityPlayerMP.class))) + { + return par1ItemStack; + } + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return par1ItemStack; + } + + String ownerName = itemTag.getString("ownerName"); + ItemStack[] inv = par3EntityPlayer.inventory.mainInventory; + + for (ItemStack itemStack : inv) + { + if (itemStack == null) + { + continue; + } + + Item item = itemStack.getItem(); + + if (item instanceof ItemDiabloKey) + { + continue; + } + + if (item instanceof IBindable) + { + EnergyItems.checkAndSetItemOwner(itemStack, ownerName); + } + } + + return par1ItemStack; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + list.add(new ItemStack(ModItems.itemKeyOfDiablo)); + ItemStack boundKey = new ItemStack(ModItems.itemKeyOfDiablo); + EnergyItems.checkAndSetItemOwner(boundKey, "Server-wide Soul Network"); + list.add(boundKey); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java new file mode 100644 index 00000000..b3cf576c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java @@ -0,0 +1,301 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.common.rituals.Rituals; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemRitualDiviner extends EnergyItems +{ + private int maxMetaData; + + public ItemRitualDiviner() + { + super(); + this.maxStackSize = 1; + setEnergyUsed(100); + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.maxMetaData = 4; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:RitualDiviner"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used to explore new types of rituals"); + + if (this.getMaxRuneDisplacement(par1ItemStack) == 1) + { + par3List.add("Can place Dusk runes"); + } else + { + par3List.add("Can not place Dusk runes"); + } + + if (!(par1ItemStack.stackTagCompound == null)) + { + int ritualID = this.getCurrentRitual(par1ItemStack); + //TODO + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + par3List.add("RitualID: " + (ritualID + 1)); + List ritualList = Rituals.getRitualList(this.getCurrentRitual(par1ItemStack) + 1); + int blankStones = 0; + int airStones = 0; + int waterStones = 0; + int fireStones = 0; + int earthStones = 0; + int duskStones = 0; + + for (RitualComponent rc : ritualList) + { + switch (rc.getStoneType()) + { + case RitualComponent.BLANK: + blankStones++; + break; + + case RitualComponent.AIR: + airStones++; + break; + + case RitualComponent.WATER: + waterStones++; + break; + + case RitualComponent.FIRE: + fireStones++; + break; + + case RitualComponent.EARTH: + earthStones++; + break; + + case RitualComponent.DUSK: + duskStones++; + break; + } + } + + par3List.add("Blank stones: " + blankStones); + par3List.add(EnumChatFormatting.AQUA + "Air stones: " + airStones); + par3List.add(EnumChatFormatting.BLUE + "Water stones: " + waterStones); + par3List.add(EnumChatFormatting.RED + "Fire stones: " + fireStones); + par3List.add(EnumChatFormatting.DARK_GREEN + "Earth stones: " + earthStones); + par3List.add(EnumChatFormatting.BOLD + "Dusk stones: " + duskStones); + //par3List.add("Ritual Name: " + Rituals.getNameOfRitual(ritualID)); + } + } + + @Override + public String getItemStackDisplayName(ItemStack par1ItemStack) + { + if (!(par1ItemStack.stackTagCompound == null)) + { + int ritualID = this.getCurrentRitual(par1ItemStack); + return "Ritual: " + Rituals.getNameOfRitual(ritualID); + //par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } else + { + return super.getItemStackDisplayName(par1ItemStack); + } + } + + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + ItemStack[] playerInventory = par2EntityPlayer.inventory.mainInventory; + TileEntity tileEntity = par3World.getTileEntity(par4, par5, par6); + + if (tileEntity instanceof TEMasterStone) + { + TEMasterStone masterStone = (TEMasterStone) tileEntity; + List ritualList = Rituals.getRitualList(this.getCurrentRitual(par1ItemStack) + 1); + int playerInvRitualStoneLocation = -1; + + for (int i = 0; i < playerInventory.length; i++) + { + if (playerInventory[i] == null) + { + continue; + } + + if (new ItemStack(ModBlocks.ritualStone).isItemEqual(playerInventory[i])) + { + playerInvRitualStoneLocation = i; + break; + } + } + + for (RitualComponent rc : ritualList) + { + if (par3World.isAirBlock(par4 + rc.getX(), par5 + rc.getY(), par6 + rc.getZ())) + { + if (playerInvRitualStoneLocation >= 0) + { + if (rc.getStoneType() > this.maxMetaData + this.getMaxRuneDisplacement(par1ItemStack)) + { + par3World.playAuxSFX(200, par4, par5 + 1, par6, 0); + return true; + } + + if (!par2EntityPlayer.capabilities.isCreativeMode) + { + par2EntityPlayer.inventory.decrStackSize(playerInvRitualStoneLocation, 1); + } + + par3World.setBlock(par4 + rc.getX(), par5 + rc.getY(), par6 + rc.getZ(), ModBlocks.ritualStone, rc.getStoneType(), 3); + + if (par3World.isRemote) + { + par3World.playAuxSFX(2005, par4, par5 + 1, par6, 0); + EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); + return true; + } + + return true; + } + } else + { + Block block = par3World.getBlock(par4 + rc.getX(), par5 + rc.getY(), par6 + rc.getZ()); + + if (block == ModBlocks.ritualStone) + { + int metadata = par3World.getBlockMetadata(par4 + rc.getX(), par5 + rc.getY(), par6 + rc.getZ()); + + if (metadata != rc.getStoneType()) + { + if (rc.getStoneType() > this.maxMetaData + this.getMaxRuneDisplacement(par1ItemStack)) + { + par3World.playAuxSFX(200, par4, par5 + 1, par6, 0); + return true; + } + + par3World.setBlockMetadataWithNotify(par4 + rc.getX(), par5 + rc.getY(), par6 + rc.getZ(), rc.getStoneType(), 3); + EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); + return true; + } + } else + { + par3World.playAuxSFX(0000, par4, par5 + 1, par6, 0); + return true; + } + } + } + +// if (par3World.isRemote) +// { +// par3World.playAuxSFX(2005, par4, par5, par6, 0); +// EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); +// return true; +// } +// return true; + } + + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + int maxRitualID = Rituals.getNumberOfRituals(); + int currentRitualID = this.getCurrentRitual(par1ItemStack); + + if (currentRitualID + 1 >= maxRitualID) + { + this.setCurrentRitual(par1ItemStack, 0); + } else + { + this.setCurrentRitual(par1ItemStack, currentRitualID + 1); + } + + if (par2World.isRemote) + { + IChatComponent chatmessagecomponent = new ChatComponentText("Current Ritual: " + Rituals.getNameOfRitual(this.getCurrentRitual(par1ItemStack))); + //chatmessagecomponent.func_111072_b("Current Essence: " + data.currentEssence + "LP"); + //chatmessagecomponent.addText("Current Ritual: " + Rituals.getNameOfRitual(this.getCurrentRitual(par1ItemStack))); + par3EntityPlayer.addChatComponentMessage(chatmessagecomponent); + } + } + + return par1ItemStack; + } + + public int getCurrentRitual(ItemStack par1ItemStack) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return par1ItemStack.stackTagCompound.getInteger("ritualID"); + } + + public void setCurrentRitual(ItemStack par1ItemStack, int ritualID) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setInteger("ritualID", ritualID); + } + + public int getMaxRuneDisplacement(ItemStack par1ItemStack) //0 indicates the starting 4 runes, 1 indicates it can use Dusk runes + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return par1ItemStack.stackTagCompound.getInteger("maxRuneDisplacement"); + } + + public void setMaxRuneDisplacement(ItemStack par1ItemStack, int displacement) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setInteger("maxRuneDisplacement", displacement); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + list.add(new ItemStack(ModItems.itemRitualDiviner)); + ItemStack duskRitualDivinerStack = new ItemStack(ModItems.itemRitualDiviner); + ((ItemRitualDiviner) duskRitualDivinerStack.getItem()).setMaxRuneDisplacement(duskRitualDivinerStack, 1); + list.add(duskRitualDivinerStack); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java new file mode 100644 index 00000000..5b06e576 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java @@ -0,0 +1,59 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellEffectBlock extends ItemBlock + +{ + public ItemSpellEffectBlock(Block par1) + { + super(par1); + setHasSubtypes(true); +// this.setUnlocalizedName("itemSpellEffectBlock"); +// setCreativeTab(AlchemicalWizardry.tabBloodMagic); + + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "fire"; + break; + } + + case 1: + { + name = "ice"; + break; + } + + case 2: + name = "wind"; + break; + + case 3: + name = "water"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java new file mode 100644 index 00000000..670cbce8 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java @@ -0,0 +1,99 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellEnhancementBlock extends ItemBlock + +{ + public ItemSpellEnhancementBlock(Block par1) + { + super(par1); + setHasSubtypes(true); +// this.setUnlocalizedName("itemSpellEnhancementBlock"); +// setCreativeTab(AlchemicalWizardry.tabBloodMagic); + + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + name = "power1"; + break; + + case 1: + name = "power2"; + break; + + case 2: + name = "power3"; + break; + + case 3: + name = "power4"; + break; + + case 4: + name = "power5"; + break; + + case 5: + name = "cost1"; + break; + + case 6: + name = "cost2"; + break; + + case 7: + name = "cost3"; + break; + + case 8: + name = "cost4"; + break; + + case 9: + name = "cost5"; + break; + + case 10: + name = "potency1"; + break; + + case 11: + name = "potency2"; + break; + + case 12: + name = "potency3"; + break; + + case 13: + name = "potency4"; + break; + + case 14: + name = "potency5"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java new file mode 100644 index 00000000..5be244a4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java @@ -0,0 +1,55 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellModifierBlock extends ItemBlock + +{ + public ItemSpellModifierBlock(Block par1) + { + super(par1); + setHasSubtypes(true); +// this.setUnlocalizedName("itemSpellModifierBlock"); +// setCreativeTab(AlchemicalWizardry.tabBloodMagic); + + } + + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "power"; + break; + } + + case 1: + { + name = "efficiency"; + break; + } + + case 2: + name = "potency"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java new file mode 100644 index 00000000..44cb8e57 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java @@ -0,0 +1,54 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemSpellParadigmBlock extends ItemBlock + +{ + public ItemSpellParadigmBlock(Block par1) + { + super(par1); + setHasSubtypes(true); + //this.setUnlocalizedName("itemSpellParadigmBlock"); + } + + @Override + public String getUnlocalizedName(ItemStack itemstack) + + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + { + name = "projectile"; + break; + } + + case 1: + { + name = "self"; + break; + } + + case 2: + name = "melee"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + @Override + public int getMetadata(int par1) + { + return par1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java new file mode 100644 index 00000000..d6159472 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java @@ -0,0 +1,114 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class LavaCrystal extends EnergyItems +{ + public LavaCrystal() + { + super(); + //setMaxDamage(1000); + setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setUnlocalizedName("lavaCrystal"); + setEnergyUsed(25); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:LavaCrystal"); + } + + /* + * Used to have the item contain itself. + */ + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + //if(!syphonBatteries(itemStack, null, 10)) + { + syphonWhileInContainer(itemStack, this.getEnergyUsed()); + ItemStack copiedStack = itemStack.copy(); + copiedStack.setItemDamage(copiedStack.getItemDamage()); + copiedStack.stackSize = 1; + return copiedStack; + } + //return itemStack; + } + + @Override + public boolean hasContainerItem() + { + return true; + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + int damage = this.getDamage(par1ItemStack); + return par1ItemStack; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Store life to smelt"); + par3List.add("stuff in the furnace."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + public boolean hasEnoughEssence(ItemStack itemStack) + { + if (itemStack.getTagCompound() != null && !(itemStack.getTagCompound().getString("ownerName").equals(""))) + { + String ownerName = itemStack.getTagCompound().getString("ownerName"); + + if (MinecraftServer.getServer() == null) + { + return false; + } + + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + if (data.currentEssence >= this.getEnergyUsed()) + { + return true; + } + +// EntityPlayer ownerEntity = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(ist.getTagCompound().getString("ownerName")); +// if(ownerEntity==null){return false;} +// NBTTagCompound tag = ownerEntity.getEntityData(); +// int currentEssence = tag.getInteger("currentEssence"); +// if(currentEssence>=damageToBeDone) +// { +// tag.setInteger("currentEssence", currentEssence-damageToBeDone); +// return true; +// } + } + + return false; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java new file mode 100644 index 00000000..80a29ed3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java @@ -0,0 +1,23 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemBucket; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class LifeBucket extends ItemBucket +{ + public LifeBucket(Block block) + { + super(block); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:LifeBucket"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java new file mode 100644 index 00000000..e6081180 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MagicianBloodOrb extends EnergyBattery +{ + public MagicianBloodOrb(int damage) + { + super(damage); + orbLevel = 3; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:MagicianBloodOrb"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java new file mode 100644 index 00000000..5e9c19c7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MasterBloodOrb extends EnergyBattery +{ + public MasterBloodOrb(int damage) + { + super(damage); + orbLevel = 4; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:MasterBloodOrb"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java new file mode 100644 index 00000000..06482ac3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java @@ -0,0 +1,47 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class OrbOfTesting extends EnergyItems +{ + public OrbOfTesting() + { + super(); + setMaxStackSize(1); + setCreativeTab(CreativeTabs.tabMisc); + setUnlocalizedName("orbOfTesting"); + setMaxDamage(100); + setFull3D(); + this.setEnergyUsed(100); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Untitled"); + } + + //Heals the player using the item. If the player is at full health, or if the durability cannot be used any more, + //the item is not used. + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (!par3EntityPlayer.shouldHeal()) + { + return par1ItemStack; + } + + if (this.syphonBatteries(par1ItemStack, par3EntityPlayer, this.getEnergyUsed())) + { + par3EntityPlayer.heal(1); + } + + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java new file mode 100644 index 00000000..37134dbc --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java @@ -0,0 +1,47 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ReinforcedTelepositionFocus extends TelepositionFocus +{ + public ReinforcedTelepositionFocus() + { + super(3); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + //TODO + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:ReinforcedTeleposerFocus"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("A stronger version of the focus,"); + par3List.add("using a weak shard"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java new file mode 100644 index 00000000..3c280fb4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java @@ -0,0 +1,137 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SacrificialDagger extends Item +{ + public SacrificialDagger() + { + super(); + this.maxStackSize = 1; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setFull3D(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("alchemicalwizardry:SacrificialDagger"); + } + + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Just a prick of the"); + par3List.add("finger will suffice..."); + } + + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + par3EntityPlayer.setHealth(par3EntityPlayer.getHealth() - 2); + } + + if (par3EntityPlayer instanceof FakePlayer) + { + return par1ItemStack; + } + + double posX = par3EntityPlayer.posX; + double posY = par3EntityPlayer.posY; + double posZ = par3EntityPlayer.posZ; + par2World.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (par2World.rand.nextFloat() - par2World.rand.nextFloat()) * 0.8F); + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + + for (int l = 0; l < 8; ++l) + { + par2World.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); + } + + if (!par2World.isRemote && !(par3EntityPlayer.getClass().equals(EntityPlayerMP.class))) + { + return par1ItemStack; + } + + findAndFillAltar(par2World, par3EntityPlayer, 200); + + if (par3EntityPlayer.getHealth() <= 0.5f) + { + //par3EntityPlayer.inventory.dropAllItems(); + par3EntityPlayer.onDeath(DamageSource.generic); + } + + return par1ItemStack; + } + + public void findAndFillAltar(World world, EntityPlayer player, int amount) + { + int posX = (int) Math.round(player.posX - 0.5f); + int posY = (int) player.posY; + int posZ = (int) Math.round(player.posZ - 0.5f); + TEAltar altarEntity = getAltar(world, posX, posY, posZ); + + if (altarEntity == null) + { + return; + } + + altarEntity.sacrificialDaggerCall(amount, false); + altarEntity.startCycle(); + } + + public TEAltar getAltar(World world, int x, int y, int z) + { + TileEntity tileEntity = null; + + for (int i = -2; i <= 2; i++) + { + for (int j = -2; j <= 2; j++) + { + for (int k = -2; k <= 1; k++) + { + tileEntity = world.getTileEntity(i + x, k + y, j + z); + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + } + + if ((tileEntity instanceof TEAltar)) + { + return (TEAltar) tileEntity; + } + + return null; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java new file mode 100644 index 00000000..0dd3cd63 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java @@ -0,0 +1,53 @@ +package WayofTime.alchemicalWizardry.common.items; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.List; + +public class ScribeTool extends EnergyItems +{ + private int meta; + + public ScribeTool(int inkType) + { + super(); + setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setMaxDamage(10); + setEnergyUsed(10); + this.meta = inkType; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("The writing is on the wall..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par1ItemStack.getItemDamage() > 0) + { + par1ItemStack.setItemDamage(par1ItemStack.getItemDamage() - 1); + syphonBatteries(par1ItemStack, par3EntityPlayer, this.getEnergyUsed()); + } + + return par1ItemStack; + } + + public int getType() + { + return this.meta; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java new file mode 100644 index 00000000..192f34f4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java @@ -0,0 +1,124 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class TelepositionFocus extends EnergyItems +{ + private int focusLevel; + + public TelepositionFocus(int focusLevel) + { + super(); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.focusLevel = focusLevel; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + //TODO + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:TeleposerFocus"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("An Enderpearl imbued with blood"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + par3List.add("Coords: " + itemTag.getInteger("xCoord") + ", " + itemTag.getInteger("yCoord") + ", " + itemTag.getInteger("zCoord")); + par3List.add("Bound Dimension: " + getDimensionID(par1ItemStack)); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + +// if (!par2World.isRemote) +// { +// //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); +// par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 10)); +// } + return par1ItemStack; + } + + public int getDimensionID(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.stackTagCompound.getInteger("dimensionId"); + } + + public World getWorld(ItemStack itemStack) + { + return DimensionManager.getWorld(getDimensionID(itemStack)); + } + + public int xCoord(ItemStack itemStack) + { + if (!(itemStack.stackTagCompound == null)) + { + return itemStack.stackTagCompound.getInteger("xCoord"); + } else + { + return 0; + } + } + + public int yCoord(ItemStack itemStack) + { + if (!(itemStack.stackTagCompound == null)) + { + return itemStack.stackTagCompound.getInteger("yCoord"); + } else + { + return 0; + } + } + + public int zCoord(ItemStack itemStack) + { + if (!(itemStack.stackTagCompound == null)) + { + return itemStack.stackTagCompound.getInteger("zCoord"); + } else + { + return 0; + } + } + + public int getFocusLevel() + { + return this.focusLevel; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java new file mode 100644 index 00000000..86132c84 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java @@ -0,0 +1,22 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WaterScribeTool extends ScribeTool +{ + public WaterScribeTool() + { + super(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WaterScribeTool"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java new file mode 100644 index 00000000..32da83be --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java @@ -0,0 +1,151 @@ +package WayofTime.alchemicalWizardry.common.items.forestry; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemBloodFrame extends EnergyItems //implements IHiveFrame +{ + public ItemBloodFrame() + { + super(); + this.maxStackSize = 1; + this.setMaxDamage(10); + //setMaxDamage(1000); + setEnergyUsed(3000); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Stirs bees into a frenzy."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodFrame"); + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if(par1ItemStack.getItemDamage()>0) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + par1ItemStack.setItemDamage(par1ItemStack.getItemDamage()-1); + } + + return par1ItemStack; + } + + /**TODO Bee Stuff + @Override + public float getTerritoryModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) + { + // TODO Auto-generated method stub + return 0.0001f; + } + + @Override + public float getProductionModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public float getFloweringModifier(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public float getGeneticDecay(IBeeGenome genome, float currentModifier) + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public boolean isSealed() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSelfLighted() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isSunlightSimulated() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isHellish() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public ItemStack frameUsed(IBeeHousing housing, ItemStack frame, IBee queen, int wear) + { + // TODO Auto-generated method stub + if(EnergyItems.canSyphonInContainer(frame, getEnergyUsed()*wear)) + { + EnergyItems.syphonWhileInContainer(frame, getEnergyUsed()*wear); + return frame; + }else + { + frame.setItemDamage(frame.getItemDamage() + wear); + if(frame.getItemDamage()>=frame.getMaxDamage()) + { + return null; + } + return frame; + } + + } + + */ + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java new file mode 100644 index 00000000..2e625415 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java @@ -0,0 +1,435 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttribute; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityPotion; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyPotionHelper; + +import com.google.common.collect.HashMultimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AlchemyFlask extends Item +{ + private int maxPotionAmount = 20; + + public AlchemyFlask() + { + super(); + this.setMaxDamage(8); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:PotionFlask"); + } + + public static ArrayList getEffects(ItemStack par1ItemStack) + { + if (par1ItemStack.hasTagCompound() && par1ItemStack.getTagCompound().hasKey("CustomFlaskEffects")) + { + ArrayList arraylist = new ArrayList(); + NBTTagList nbttaglist = par1ItemStack.getTagCompound().getTagList("CustomFlaskEffects", Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < nbttaglist.tagCount(); ++i) + { + NBTTagCompound nbttagcompound = (NBTTagCompound) nbttaglist.getCompoundTagAt(i); + arraylist.add(AlchemyPotionHelper.readEffectFromNBT(nbttagcompound)); + } + + return arraylist; + } else + { + return null; + } + } + + public static ArrayList getPotionEffects(ItemStack par1ItemStack) + { + ArrayList list = AlchemyFlask.getEffects(par1ItemStack); + + if (list != null) + { + ArrayList newList = new ArrayList(); + + for (AlchemyPotionHelper aph : list) + { + newList.add(aph.getPotionEffect()); + } + + return newList; + } else + { + return null; + } + } + + public void setEffects(ItemStack par1ItemStack, ArrayList list) + { + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagList nbttaglist = new NBTTagList(); + + for (AlchemyPotionHelper aph : list) + { + nbttaglist.appendTag(AlchemyPotionHelper.setEffectToNBT(aph)); + } + + par1ItemStack.stackTagCompound.setTag("CustomFlaskEffects", nbttaglist); + } + + public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + par1ItemStack.setItemDamage(par1ItemStack.getItemDamage() + 1); + } + + if (!par2World.isRemote) + { + ArrayList list = this.getEffects(par1ItemStack); + + if (list != null) + { + for (AlchemyPotionHelper aph : list) + { + PotionEffect pe = aph.getPotionEffect(); + + if (pe != null) + { + //if(pe.get) + par3EntityPlayer.addPotionEffect(pe); + } + } + } + } + + return par1ItemStack; + } + + /** + * How long it takes to use or consume an item + */ + public int getMaxItemUseDuration(ItemStack par1ItemStack) + { + return 32; + } + + /** + * returns the action that specifies what animation to play when the items is being used + */ + public EnumAction getItemUseAction(ItemStack par1ItemStack) + { + if (this.isPotionThrowable(par1ItemStack)) + { + return EnumAction.none; + } + + return EnumAction.drink; + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer + */ + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { +// if(par3EntityPlayer.isSneaking()) +// { +// this.setIsPotionThrowable(true, par1ItemStack); +// return par1ItemStack; +// } + if (par1ItemStack.getItemDamage() < par1ItemStack.getMaxDamage()) + { + if (this.isPotionThrowable(par1ItemStack)) + { + if (!par2World.isRemote) + { + EntityPotion entityPotion = this.getEntityPotion(par1ItemStack, par2World, par3EntityPlayer); + + if (entityPotion != null) + { + float velocityChange = 2.0f; + entityPotion.motionX *= velocityChange; + entityPotion.motionY *= velocityChange; + entityPotion.motionZ *= velocityChange; + par2World.spawnEntityInWorld(entityPotion); + par1ItemStack.setItemDamage(par1ItemStack.getItemDamage() + 1); + } + } + + return par1ItemStack; + } + + par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); + } + + return par1ItemStack; + } + + public void setConcentrationOfPotion(ItemStack par1ItemStack, int potionID, int concentration) + { + ArrayList list = this.getEffects(par1ItemStack); + + if (list != null) + { + for (AlchemyPotionHelper aph : list) + { + if (aph.getPotionID() == potionID) + { + aph.setConcentration(concentration); + break; + } + } + + this.setEffects(par1ItemStack, list); + } + } + + public void setDurationFactorOfPotion(ItemStack par1ItemStack, int potionID, int durationFactor) + { + ArrayList list = this.getEffects(par1ItemStack); + + if (list != null) + { + for (AlchemyPotionHelper aph : list) + { + if (aph.getPotionID() == potionID) + { + aph.setDurationFactor(durationFactor); + break; + } + } + + this.setEffects(par1ItemStack, list); + } + } + + public boolean hasPotionEffect(ItemStack par1ItemStack, int potionID) + { + return false; + } + + public int getNumberOfPotionEffects(ItemStack par1ItemStack) + { + if (getEffects(par1ItemStack) != null) + { + return getEffects(par1ItemStack).size(); + } else + { + return 0; + } + } + + public boolean addPotionEffect(ItemStack par1ItemStack, int potionID, int tickDuration) + { + int i = 0; + ArrayList list = this.getEffects(par1ItemStack); + + if (list != null) + { + for (AlchemyPotionHelper aph : list) + { + if (aph.getPotionID() == potionID) + { + return false; + } + + i++; + } + + //if(i 0) + { + Iterator iterator1 = map.entrySet().iterator(); + + while (iterator1.hasNext()) + { + Entry entry = (Entry) iterator1.next(); + AttributeModifier attributemodifier = (AttributeModifier) entry.getValue(); + AttributeModifier attributemodifier1 = new AttributeModifier(attributemodifier.getName(), potion.func_111183_a(potioneffect.getAmplifier(), attributemodifier), attributemodifier.getOperation()); + hashmultimap.put(((IAttribute)entry.getKey()).getAttributeUnlocalizedName(), attributemodifier1); + } + } + + if (potioneffect.getAmplifier() > 0) + { + s = s + " " + StatCollector.translateToLocal("potion.potency." + potioneffect.getAmplifier()).trim(); + } + + if (potioneffect.getDuration() > 20) + { + s = s + " (" + Potion.getDurationString(potioneffect) + ")"; + } + + if (potion.isBadEffect()) + { + par3List.add(EnumChatFormatting.RED + s); + } else + { + par3List.add(EnumChatFormatting.GRAY + s); + } + } + } else + { + String s1 = StatCollector.translateToLocal("potion.empty").trim(); + par3List.add(EnumChatFormatting.GRAY + s1); + } + + if (!hashmultimap.isEmpty()) + { + par3List.add(""); + par3List.add(EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("potion.effects.whenDrank")); + iterator = hashmultimap.entries().iterator(); + + while (iterator.hasNext()) + { + Entry entry1 = (Entry) iterator.next(); + AttributeModifier attributemodifier2 = (AttributeModifier) entry1.getValue(); + double d0 = attributemodifier2.getAmount(); + double d1; + + if (attributemodifier2.getOperation() != 1 && attributemodifier2.getOperation() != 2) + { + d1 = attributemodifier2.getAmount(); + } else + { + d1 = attributemodifier2.getAmount() * 100.0D; + } + + if (d0 > 0.0D) + { + par3List.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus." + attributemodifier2.getOperation(), new Object[]{ItemStack.field_111284_a.format(d1), StatCollector.translateToLocal("attribute.name." + (String) entry1.getKey())})); + } else if (d0 < 0.0D) + { + d1 *= -1.0D; + par3List.add(EnumChatFormatting.RED + StatCollector.translateToLocalFormatted("attribute.modifier.take." + attributemodifier2.getOperation(), new Object[]{ItemStack.field_111284_a.format(d1), StatCollector.translateToLocal("attribute.name." + (String) entry1.getKey())})); + } + } + } + } + + public boolean isPotionThrowable(ItemStack par1ItemStack) + { + if (par1ItemStack.hasTagCompound() && par1ItemStack.getTagCompound().getBoolean("throwable")) + { + return true; + } else + { + return false; + } + + //return false; + } + + public void setIsPotionThrowable(boolean flag, ItemStack par1ItemStack) + { + if (!par1ItemStack.hasTagCompound()) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setBoolean("throwable", flag); + } + + public EntityPotion getEntityPotion(ItemStack par1ItemStack, World worldObj, EntityLivingBase entityLivingBase) + { + ItemStack potionStack = new ItemStack(Items.potionitem, 1, 0); + potionStack.setTagCompound(new NBTTagCompound()); + ArrayList potionList = this.getPotionEffects(par1ItemStack); + + if (potionList == null) + { + return null; + } + + NBTTagList nbttaglist = new NBTTagList(); + + for (PotionEffect pe : potionList) + { + NBTTagCompound d = new NBTTagCompound(); + d.setByte("Id", (byte) pe.getPotionID()); + d.setByte("Amplifier", (byte) pe.getAmplifier()); + //byte b1 = par0NBTTagCompound.getByte("Amplifier"); + d.setInteger("Duration", pe.getDuration()); + //int i = par0NBTTagCompound.getInteger("Duration"); + d.setBoolean("Ambient", pe.getIsAmbient()); + // boolean flag = par0NBTTagCompound.getBoolean("Ambient"); + nbttaglist.appendTag(d); + } + + potionStack.stackTagCompound.setTag("CustomPotionEffects", nbttaglist); + EntityPotion entityPotion = new EntityPotion(worldObj, entityLivingBase, potionStack); + return entityPotion; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java new file mode 100644 index 00000000..93338041 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java @@ -0,0 +1,120 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AlchemyReagent extends Item +{ + public AlchemyReagent() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setMaxStackSize(64); + // TODO Auto-generated constructor stub + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + if (this == ModItems.incendium) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Incendium"); + return; + } + + if (this == ModItems.magicales) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Magicales"); + return; + } + + if (this == ModItems.sanctus) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Sanctus"); + return; + } + + if (this == ModItems.aether) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Aether"); + return; + } + + if (this == ModItems.simpleCatalyst) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SimpleCatalyst"); + return; + } + + if (this == ModItems.crepitous) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Crepitous"); + return; + } + + if (this == ModItems.crystallos) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Crystallos"); + return; + } + + if (this == ModItems.terrae) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Terrae"); + return; + } + + if (this == ModItems.aquasalus) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Aquasalus"); + return; + } + + if (this == ModItems.tennebrae) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:Tennebrae"); + return; + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java new file mode 100644 index 00000000..841a9729 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AverageLengtheningCatalyst extends LengtheningCatalyst +{ + public AverageLengtheningCatalyst() + { + super(2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:AverageLengtheningCatalyst"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java new file mode 100644 index 00000000..3ce2cde9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AveragePowerCatalyst extends PowerCatalyst +{ + public AveragePowerCatalyst() + { + super(2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:AveragePowerCatalyst"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java new file mode 100644 index 00000000..ecbad19d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java @@ -0,0 +1,57 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import java.util.Random; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnhancedFillingAgent extends WeakFillingAgent +{ + public EnhancedFillingAgent() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public int getFilledAmountForPotionNumber(int potionEffects) + { + Random rand = new Random(); + + if (potionEffects == 0) + { + return 8; + } + + //if(potionEffects >=1 && potionEffects<=5) + { + switch (potionEffects) + { + case 1: + return 6; + + case 2: + return 4; + + case 3: + return 3; + + case 4: + return 2; + + case 5: + return 2; + } + } + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:EnhancedFillingAgent"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java new file mode 100644 index 00000000..65bb052e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class GreaterLengtheningCatalyst extends LengtheningCatalyst +{ + public GreaterLengtheningCatalyst() + { + super(3); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:GreaterLengtheningCatalyst"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java new file mode 100644 index 00000000..e5dd6d47 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class GreaterPowerCatalyst extends PowerCatalyst +{ + public GreaterPowerCatalyst() + { + super(3); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:GreaterPowerCatalyst"); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java new file mode 100644 index 00000000..d149e8de --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java @@ -0,0 +1,64 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ICatalyst; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import org.lwjgl.input.Keyboard; + +import java.util.List; + +public class LengtheningCatalyst extends Item implements ICatalyst +{ + private int catalystStrength; + + public LengtheningCatalyst(int catalystStrength) + { + super(); + this.catalystStrength = catalystStrength; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public int getCatalystLevel() + { + return catalystStrength; + } + + @Override + public boolean isConcentration() + { + return false; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java new file mode 100644 index 00000000..e945ed22 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MundaneLengtheningCatalyst extends LengtheningCatalyst +{ + public MundaneLengtheningCatalyst() + { + super(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:MundaneLengtheningCatalyst"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java new file mode 100644 index 00000000..86291dec --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MundanePowerCatalyst extends PowerCatalyst +{ + public MundanePowerCatalyst() + { + super(1); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:MundanePowerCatalyst"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java new file mode 100644 index 00000000..d73c6cc2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java @@ -0,0 +1,64 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ICatalyst; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import org.lwjgl.input.Keyboard; + +import java.util.List; + +public class PowerCatalyst extends Item implements ICatalyst +{ + private int catalystStrength; + + public PowerCatalyst(int catalystStrength) + { + super(); + this.catalystStrength = catalystStrength; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public int getCatalystLevel() + { + return catalystStrength; + } + + @Override + public boolean isConcentration() + { + return true; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java new file mode 100644 index 00000000..4cdf979a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java @@ -0,0 +1,66 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IBindingAgent; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class StandardBindingAgent extends Item implements IBindingAgent +{ + public StandardBindingAgent() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public float getSuccessRateForPotionNumber(int potions) + { + return (float) Math.pow(0.65, potions); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:StandardBindingAgent"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java new file mode 100644 index 00000000..0cc4c9a8 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class StandardFillingAgent extends WeakFillingAgent +{ + public StandardFillingAgent() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public int getFilledAmountForPotionNumber(int potionEffects) + { + //Random rand = new Random(); + if (potionEffects == 0) + { + return 8; + } + + if (potionEffects >= 1 && potionEffects <= 3) + { + return (int) (4 * (Math.pow(0.5f, potionEffects - 1) + 0.01f)); + } + + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:StandardFillingAgent"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java new file mode 100644 index 00000000..24ee6f0b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import net.minecraft.client.renderer.texture.IIconRegister; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WeakBindingAgent extends StandardBindingAgent +{ + public WeakBindingAgent() + { + super(); + // TODO Auto-generated constructor stub + } + + @Override + public float getSuccessRateForPotionNumber(int potions) + { + return (float) Math.pow(0.4, potions); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WeakBindingAgent"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java new file mode 100644 index 00000000..82a5f856 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java @@ -0,0 +1,85 @@ +package WayofTime.alchemicalWizardry.common.items.potion; + +import java.util.List; +import java.util.Random; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.IFillingAgent; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WeakFillingAgent extends Item implements IFillingAgent +{ + public WeakFillingAgent() + { + super(); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public int getFilledAmountForPotionNumber(int potionEffects) + { + Random rand = new Random(); + + if (potionEffects == 0) + { + return 8; + } + + if (potionEffects == 1 || potionEffects == 2) + { + if (rand.nextFloat() > 0.5f) + { + return (4 - potionEffects); + } else + { + return 3 - potionEffects; + } + } + + return 0; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WeakFillingAgent"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java new file mode 100644 index 00000000..166fe2cf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java @@ -0,0 +1,106 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class AirSigil extends EnergyItems implements ArmourUpgrade +{ + private int energyUsed; + + public AirSigil() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(50); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("I feel lighter already..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:AirSigil"); + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + Vec3 vec = par3EntityPlayer.getLookVec(); + double wantedVelocity = 1.7; + + if (par3EntityPlayer.isPotionActive(AlchemicalWizardry.customPotionBoost)) + { + int i = par3EntityPlayer.getActivePotionEffect(AlchemicalWizardry.customPotionBoost).getAmplifier(); + wantedVelocity += (1 + i) * (0.35); + } + + par3EntityPlayer.motionX = vec.xCoord * wantedVelocity; + par3EntityPlayer.motionY = vec.yCoord * wantedVelocity; + par3EntityPlayer.motionZ = vec.zCoord * wantedVelocity; + par2World.playSoundEffect((double) ((float) par3EntityPlayer.posX + 0.5F), (double) ((float) par3EntityPlayer.posY + 0.5F), (double) ((float) par3EntityPlayer.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (par2World.rand.nextFloat() - par2World.rand.nextFloat()) * 0.8F); + par3EntityPlayer.fallDistance = 0; + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } else + { + return par1ItemStack; + } + + return par1ItemStack; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, + ItemStack thisItemStack) + { + // TODO Auto-generated method stub + player.fallDistance = 0; + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 50; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java new file mode 100644 index 00000000..082a5472 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java @@ -0,0 +1,96 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class DivinationSigil extends Item implements ArmourUpgrade +{ + public DivinationSigil() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:DivinationSigil"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Peer into the soul to"); + par3List.add("get the current essence"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.worldObj.isRemote) + { + return par1ItemStack; + } + + NBTTagCompound itemTag = par1ItemStack.stackTagCompound; + + if (itemTag == null || itemTag.getString("ownerName").equals("")) + { + return par1ItemStack; + } + + String ownerName = itemTag.getString("ownerName"); + //PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(ownerName)); + int currentEssence = EnergyItems.getCurrentEssence(ownerName); + + par3EntityPlayer.addChatMessage(new ChatComponentText("Current Essence: " + 0)); + + return par1ItemStack; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + // TODO Auto-generated method stub + player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 400, 9)); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 25; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java new file mode 100644 index 00000000..2eed1e0b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java @@ -0,0 +1,144 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityBloodLightProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemBloodLightSigil extends EnergyItems +{ + private int tickDelay = 100; + + public ItemBloodLightSigil() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(10); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + // TODO Auto-generated constructor stub + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("I see a light!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodLightSigil"); + } + + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); + + if (par3World.isRemote) + { + return true; + } + + if (par7 == 0 && par3World.isAirBlock(par4, par5 - 1, par6)) + { + par3World.setBlock(par4, par5 - 1, par6, ModBlocks.blockBloodLight); + } + + if (par7 == 1 && par3World.isAirBlock(par4, par5 + 1, par6)) + { + par3World.setBlock(par4, par5 + 1, par6, ModBlocks.blockBloodLight); + } + + if (par7 == 2 && par3World.isAirBlock(par4, par5, par6 - 1)) + { + par3World.setBlock(par4, par5, par6 - 1, ModBlocks.blockBloodLight); + } + + if (par7 == 3 && par3World.isAirBlock(par4, par5, par6 + 1)) + { + par3World.setBlock(par4, par5, par6 + 1, ModBlocks.blockBloodLight); + } + + if (par7 == 4 && par3World.isAirBlock(par4 - 1, par5, par6)) + { + par3World.setBlock(par4 - 1, par5, par6, ModBlocks.blockBloodLight); + } + + if (par7 == 5 && par3World.isAirBlock(par4 + 1, par5, par6)) + { + par3World.setBlock(par4 + 1, par5, par6, ModBlocks.blockBloodLight); + } + + return true; + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed() * 5); + + if (!par2World.isRemote) + { + par2World.spawnEntityInWorld(new EntityBloodLightProjectile(par2World, par3EntityPlayer, 10)); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (par2World.getWorldTime() % tickDelay == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par3Entity instanceof EntityPlayer) + { + EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par3Entity, getEnergyUsed()); + } + } + + return; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java new file mode 100644 index 00000000..61829765 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java @@ -0,0 +1,285 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class LavaSigil extends ItemBucket implements ArmourUpgrade +{ + /** + * field for checking if the bucket has been filled. + */ + private Block isFull = Blocks.lava; + private int energyUsed; + + public LavaSigil() + { + super(Blocks.lava); + this.maxStackSize = 1; + //setMaxDamage(2000); + setEnergyUsed(1000); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:LavaSigil"); + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + ItemStack copiedStack = itemStack.copy(); + copiedStack.setItemDamage(copiedStack.getItemDamage() + getEnergyUsed()); + copiedStack.stackSize = 1; + return copiedStack; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Contact with liquid is"); + par3List.add("highly unrecommended."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer + */ + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + float f = 1.0F; + double d0 = par3EntityPlayer.prevPosX + (par3EntityPlayer.posX - par3EntityPlayer.prevPosX) * (double) f; + double d1 = par3EntityPlayer.prevPosY + (par3EntityPlayer.posY - par3EntityPlayer.prevPosY) * (double) f + 1.62D - (double) par3EntityPlayer.yOffset; + double d2 = par3EntityPlayer.prevPosZ + (par3EntityPlayer.posZ - par3EntityPlayer.prevPosZ) * (double) f; + + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, false); + + if (movingobjectposition == null) + { + return par1ItemStack; + } else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) + { + return par1ItemStack; + } + + //if (this.isFull == 0) + { + //Empty + } //else + { + if (movingobjectposition.sideHit == 0) + { + --j; + } + + if (movingobjectposition.sideHit == 1) + { + ++j; + } + + if (movingobjectposition.sideHit == 2) + { + --k; + } + + if (movingobjectposition.sideHit == 3) + { + ++k; + } + + if (movingobjectposition.sideHit == 4) + { + --i; + } + + if (movingobjectposition.sideHit == 5) + { + ++i; + } + + if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) + { + return par1ItemStack; + } + + if (this.tryPlaceContainedLiquid(par2World, d0, d1, d2, i, j, k) && !par3EntityPlayer.capabilities.isCreativeMode) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } else + { + return par1ItemStack; + } + } + } + } + + return par1ItemStack; + } + } + + /** + * Attempts to place the liquid contained inside the bucket. + */ + public boolean tryPlaceContainedLiquid(World par1World, double par2, double par4, double par6, int par8, int par9, int par10) + { + //if (this.isFull <= 0) + { + //return false; + } if (!par1World.isAirBlock(par8, par9, par10) && par1World.getBlock(par8, par9, par10).getMaterial().isSolid()) + { + return false; + } else if ((par1World.getBlock(par8, par9, par10) == Blocks.lava || par1World.getBlock(par8, par9, par10) == Blocks.flowing_lava) && par1World.getBlockMetadata(par8, par9, par10) == 0) + { + return false; + } else + { + par1World.setBlock(par8, par9, par10, this.isFull, 0, 3); + return true; + } + } + + protected void setEnergyUsed(int par1int) + { + this.energyUsed = par1int; + } + + protected int getEnergyUsed() + { + return this.energyUsed; + } + //Heals the player using the item. If the player is at full health, or if the durability cannot be used any more, + //the item is not used. + + // protected void damagePlayer(World world, EntityPlayer player, int damage) +// { +// if (world != null) +// { +// double posX = player.posX; +// double posY = player.posY; +// double posZ = player.posZ; +// world.playSoundEffect((double)((float)posX + 0.5F), (double)((float)posY + 0.5F), (double)((float)posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); +// float f = (float)1.0F; +// float f1 = f * 0.6F + 0.4F; +// float f2 = f * f * 0.7F - 0.5F; +// float f3 = f * f * 0.6F - 0.7F; +// +// for (int l = 0; l < 8; ++l) +// { +// world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); +// } +// } +// +// for (int i = 0; i < damage; i++) +// { +// //player.setEntityHealth((player.getHealth()-1)); +// player.setEntityHealth(player.func_110143_aJ() - 1); +// +// if (player.func_110143_aJ() <= 0) +// { +// player.inventory.dropAllItems(); +// } +// } +// } + protected boolean syphonBatteries(ItemStack ist, EntityPlayer player, int damageToBeDone) + { + if (!player.capabilities.isCreativeMode) + { + boolean usedBattery = false; + IInventory inventory = player.inventory; + + for (int slot = 0; slot < inventory.getSizeInventory(); slot++) + { + ItemStack stack = inventory.getStackInSlot(slot); + + if (stack == null) + { + continue; + } + + if (stack.getItem() instanceof EnergyBattery && !usedBattery) + { + if (stack.getItemDamage() <= stack.getMaxDamage() - damageToBeDone) + { + stack.setItemDamage(stack.getItemDamage() + damageToBeDone); + usedBattery = true; + } + } + } + + if (!usedBattery) + { + return false; + } + + return true; + } else + { + return true; + } + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, + ItemStack thisItemStack) + { + // TODO Auto-generated method stub + player.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 2, 9)); + player.extinguish(); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 100; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java new file mode 100644 index 00000000..3b1bd3cf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java @@ -0,0 +1,172 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfElementalAffinity extends EnergyItems +{ + @SideOnly(Side.CLIENT) + private static IIcon activeIcon; + @SideOnly(Side.CLIENT) + private static IIcon passiveIcon; + + public SigilOfElementalAffinity() + { + super(); + this.maxStackSize = 1; + setMaxDamage(100); + setEnergyUsed(200); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Perfect for a fire-breathing fish"); + par3List.add("who is afraid of heights!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfTheFastMiner"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:ElementalSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:ElementalSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 2, 0, true)); + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 2, 0, true)); + + //Test with added health boost + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3EntityPlayer.fallDistance = 0; + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 2, 0, true)); + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 2, 0, true)); + } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + return; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java new file mode 100644 index 00000000..30103e0e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java @@ -0,0 +1,302 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockCocoa; +import net.minecraft.block.BlockCrops; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.BlockMushroom; +import net.minecraft.block.BlockSapling; +import net.minecraft.block.BlockStem; +import net.minecraft.block.IGrowable; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.BonemealEvent; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfGrowth extends EnergyItems implements ArmourUpgrade +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private int tickDelay = 100; + + public SigilOfGrowth() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(150); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + // TODO Auto-generated constructor stub + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Who needs a green thumb when"); + par3List.add("you have a green slate?"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:GrowthSigil_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:GrowthSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:GrowthSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + + if (applyBonemeal(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer)) + { + EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); + + if (par3World.isRemote) + { + par3World.playAuxSFX(2005, par4, par5, par6, 0); + return true; + } + + return true; + } + + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % tickDelay); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (par2World.getWorldTime() % tickDelay == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par3Entity instanceof EntityPlayer) + { + EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par3Entity, getEnergyUsed()); + } + + int range = 5; + int verticalRange = 2; + int posX = (int) Math.round(par3Entity.posX - 0.5f); + int posY = (int) par3Entity.posY; + int posZ = (int) Math.round(par3Entity.posZ - 0.5f); + + for (int ix = posX - range; ix <= posX + range; ix++) + { + for (int iz = posZ - range; iz <= posZ + range; iz++) + { + for (int iy = posY - verticalRange; iy <= posY + verticalRange; iy++) + { + Block block = par2World.getBlock(ix, iy, iz); + + + if (block instanceof IPlantable) + { + if (par2World.rand.nextInt(20) == 0) + { + block.updateTick(par2World, ix, iy, iz, par2World.rand); + } + } + } + } + } + } + + return; + } + + public static boolean applyBonemeal(ItemStack p_150919_0_, World p_150919_1_, int p_150919_2_, int p_150919_3_, int p_150919_4_, EntityPlayer player) + { + Block block = p_150919_1_.getBlock(p_150919_2_, p_150919_3_, p_150919_4_); + + BonemealEvent event = new BonemealEvent(player, p_150919_1_, block, p_150919_2_, p_150919_3_, p_150919_4_); + if (MinecraftForge.EVENT_BUS.post(event)) + { + return false; + } + + if (event.getResult() == Result.ALLOW) + { + if (!p_150919_1_.isRemote) + { + p_150919_0_.stackSize--; + } + return true; + } + + if (block instanceof IGrowable) + { + IGrowable igrowable = (IGrowable)block; + + if (igrowable.func_149851_a(p_150919_1_, p_150919_2_, p_150919_3_, p_150919_4_, p_150919_1_.isRemote)) + { + if (!p_150919_1_.isRemote) + { + if (igrowable.func_149852_a(p_150919_1_, p_150919_1_.rand, p_150919_2_, p_150919_3_, p_150919_4_)) + { + igrowable.func_149853_b(p_150919_1_, p_150919_1_.rand, p_150919_2_, p_150919_3_, p_150919_4_); + } + + --p_150919_0_.stackSize; + } + + return true; + } + } + + return false; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + int range = 5; + int verticalRange = 2; + int posX = (int) Math.round(player.posX - 0.5f); + int posY = (int) player.posY; + int posZ = (int) Math.round(player.posZ - 0.5f); + + for (int ix = posX - range; ix <= posX + range; ix++) + { + for (int iz = posZ - range; iz <= posZ + range; iz++) + { + for (int iy = posY - verticalRange; iy <= posY + verticalRange; iy++) + { + Block block = world.getBlock(ix, iy, iz); + + + if (block instanceof IPlantable) + { + if (world.rand.nextInt(10) == 0) + { + block.updateTick(world, ix, iy, iz, world.rand); + } + } + } + } + } + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 50; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java new file mode 100644 index 00000000..aa84d0e0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java @@ -0,0 +1,198 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfHaste extends EnergyItems implements ArmourUpgrade +{ + @SideOnly(Side.CLIENT) + private static IIcon activeIcon; + @SideOnly(Side.CLIENT) + private static IIcon passiveIcon; + + public SigilOfHaste() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(100); + setEnergyUsed(250); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("One dose of caffeine later..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:HasteSigil_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:HasteSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:HasteSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionBoost.id, 3, 1)); + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 2, 2)); + + //Test with added health boost + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionBoost.id, 3, 1)); + } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionBoost.id, 205, 1)); + + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 205, 2)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + return; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionBoost.id, 3, 1)); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 150; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java new file mode 100644 index 00000000..9cc9dcd3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java @@ -0,0 +1,362 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfHolding extends EnergyItems +{ + private int invSize = 4; + + public static List allowedSigils = new ArrayList(); + + public SigilOfHolding() + { + super(); + this.maxStackSize = 1; + //setEnergyUsed(100); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfHolding"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (!(stack.stackTagCompound == null)) + { + ItemStack[] inv = getInternalInventory(stack); + + if (inv == null) + { + return this.itemIcon; + } + + ItemStack item = inv[stack.stackTagCompound.getInteger("selectedSlot")]; + + if (item != null) + { + return item.getIconIndex(); + } + } + + return this.itemIcon; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used to hold several Sigils!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); +// par3List.add("Current slot: " + par1ItemStack.stackTagCompound.getInteger("selectedSlot")); + ItemStack[] inv = getInternalInventory(par1ItemStack); + + if (inv == null) + { + return; + } + + ItemStack item = inv[par1ItemStack.stackTagCompound.getInteger("selectedSlot")]; + + if (item != null) + { + par3List.add("Current item: " + item.getDisplayName()); + } + + for (int i = 0; i < invSize; i++) + { + if (inv[i] != null) + { + par3List.add("Item in slot " + i + ": " + inv[i].getDisplayName()); + } + } + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + //TODO Might be a good idea to have this item need to be in the player's first slot + //for it to search and consume sigils on right click. Might avoid confusion? At least + //will avoid the need to add a button just for it... + this.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + if (this.addSigilToInventory(par1ItemStack, par3EntityPlayer)) + { + return par1ItemStack; + } + + selectNextSlot(par1ItemStack); + return par1ItemStack; + } + + int currentSlot = this.getSelectedSlot(par1ItemStack); + ItemStack[] inv = getInternalInventory(par1ItemStack); + + if (inv == null) + { + return par1ItemStack; + } + + ItemStack itemUsed = inv[currentSlot]; + + if (itemUsed == null) + { + return par1ItemStack; + } + + itemUsed.getItem().onItemRightClick(itemUsed, par2World, par3EntityPlayer); + saveInternalInventory(par1ItemStack, inv); + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par1ItemStack.stackTagCompound == null)) + { + this.tickInternalInventory(par1ItemStack, par2World, par3Entity, par4, par5); + } + } + + public ItemStack[] getInternalInventory(ItemStack itemStack) + { + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + ItemStack[] inv = new ItemStack[9]; + NBTTagList tagList = itemTag.getTagList("Inventory", Constants.NBT.TAG_COMPOUND); + + if (tagList == null) + { + return null; + } + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < invSize) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + return inv; + } + + public void saveInternalInventory(ItemStack itemStack, ItemStack[] inventory) + { + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < invSize; i++) + { + ItemStack stack = inventory[i]; + + if (inventory[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inventory[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + itemTag.setTag("Inventory", itemList); + } + + public void tickInternalInventory(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + ItemStack[] inv = getInternalInventory(par1ItemStack); + + if (inv == null) + { + return; + } + + for (int i = 0; i < invSize; i++) + { + if (inv[i] == null) + { + continue; + } + + inv[i].getItem().onUpdate(inv[i], par2World, par3Entity, par4, par5); + } + } + + public int getSelectedSlot(ItemStack itemStack) + { + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemTag.getInteger("selectedSlot"); + } + + public void selectNextSlot(ItemStack itemStack) + { + ItemStack[] inv = getInternalInventory(itemStack); + int filledSlots = 0; + + for (int i = 0; i < invSize; i++) + { + if (inv[i] != null) + { + filledSlots++; + } else + { + break; + } + } + + NBTTagCompound itemTag = itemStack.stackTagCompound; + + if (itemTag == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + if (getSelectedSlot(itemStack) + 1 < filledSlots) + { + itemTag.setInteger("selectedSlot", itemTag.getInteger("selectedSlot") + 1); + } else + { + itemTag.setInteger("selectedSlot", 0); + } + } + + public boolean hasAddedToInventory(ItemStack sigilItemStack, ItemStack addedItemStack) + { + ItemStack[] inv = getInternalInventory(sigilItemStack); + + if (inv == null) + { + return false; + } + + if (addedItemStack == null) + { + return false; + } + + Item item = addedItemStack.getItem(); + int candidateSlot = -1; + + for (int i = invSize - 1; i >= 0; i--) + { + ItemStack nextItem = inv[i]; + + if (nextItem == null) + { + candidateSlot = i; + continue; + } + + if (item == nextItem.getItem()) + { + return false; + } + } + + if (candidateSlot == -1) + { + return false; + } + + for (ItemStack i : allowedSigils) + { + if (i != null && i.getItem() == item) + { + inv[candidateSlot] = addedItemStack; + saveInternalInventory(sigilItemStack, inv); + return true; + } + } + + return false; + } + + public boolean addSigilToInventory(ItemStack sigilItemStack, EntityPlayer player) + { + ItemStack[] playerInventory = player.inventory.mainInventory; + + for (int i = 0; i < 36; i++) + { + if (this.hasAddedToInventory(sigilItemStack, playerInventory[i])) + { + player.inventory.consumeInventoryItem(playerInventory[i].getItem()); + //playerInventory[i].stackSize--; + return true; + } + } + + return false; + } + + public static void initiateSigilOfHolding() + { + allowedSigils.add(new ItemStack(ModItems.waterSigil)); + allowedSigils.add(new ItemStack(ModItems.lavaSigil)); + allowedSigils.add(new ItemStack(ModItems.voidSigil)); + allowedSigils.add(new ItemStack(ModItems.airSigil)); + allowedSigils.add(new ItemStack(ModItems.sigilOfTheFastMiner)); + allowedSigils.add(new ItemStack(ModItems.divinationSigil)); + allowedSigils.add(new ItemStack(ModItems.sigilOfElementalAffinity)); + allowedSigils.add(new ItemStack(ModItems.growthSigil)); + allowedSigils.add(new ItemStack(ModItems.sigilOfHaste)); + allowedSigils.add(new ItemStack(ModItems.sigilOfWind)); + } + + public ItemStack getCurrentItem(ItemStack sigilItemStack) + { + ItemStack[] items = this.getInternalInventory(sigilItemStack); + + if (items == null) + { + return null; + } + + return items[this.getSelectedSlot(sigilItemStack)]; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java new file mode 100644 index 00000000..5be81fa4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java @@ -0,0 +1,222 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfMagnetism extends EnergyItems implements ArmourUpgrade +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private int tickDelay = 300; + + public SigilOfMagnetism() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(50); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + // TODO Auto-generated constructor stub + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("I have a very magnetic personality!"); +// par3List.add("you have a green slate?"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfMagnetism_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfMagnetism_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfMagnetism_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + +// @Override +// public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) +// { +// EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); +// if(applyBonemeal(par1ItemStack,par3World,par4,par5,par6,par2EntityPlayer)) +// { +// if (par3World.isRemote) +// { +// par3World.playAuxSFX(2005, par4, par5, par6, 0); +// EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); +// return true; +// } +// return true; +// } +// return false; +// } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % tickDelay); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (par2World.getWorldTime() % tickDelay == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par3Entity instanceof EntityPlayer) + { + EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par3Entity, getEnergyUsed()); + } + + int range = 5; + int verticalRange = 5; + float posX = Math.round(par3Entity.posX); + float posY = (float) (par3Entity.posY - par3Entity.getEyeHeight()); + float posZ = Math.round(par3Entity.posZ); + List entities = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(posX - 0.5f, posY - 0.5f, posZ - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(range, verticalRange, range)); + + for (EntityItem entity : entities) + { + if (entity != null && !par2World.isRemote) + { + entity.onCollideWithPlayer(par3EntityPlayer); + } + } + } + + return; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + int range = 5; + int verticalRange = 5; + float posX = Math.round(player.posX); + float posY = (float) (player.posY - player.getEyeHeight()); + float posZ = Math.round(player.posZ); + List entities = player.worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(posX - 0.5f, posY - 0.5f, posZ - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(range, verticalRange, range)); + + for (EntityItem entity : entities) + { + if (entity != null && !world.isRemote) + { + entity.onCollideWithPlayer(player); + } + } + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 25; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java new file mode 100644 index 00000000..69327b4b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java @@ -0,0 +1,312 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfTheBridge extends EnergyItems implements ArmourUpgrade +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private int tickDelay = 200; + + public SigilOfTheBridge() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(100); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + // TODO Auto-generated constructor stub + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Activate to create a bridge"); + par3List.add("beneath your feet."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BridgeSigil_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:BridgeSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:BridgeSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + +// @Override +// public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) +// { +// +// if(applyBonemeal(par1ItemStack,par3World,par4,par5,par6,par2EntityPlayer)) +// { +// if (par3World.isRemote) +// { +// par3World.playAuxSFX(2005, par4, par5, par6, 0); +// EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); +// return true; +// } +// return true; +// } +// return false; +// } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % tickDelay); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + if (par2World.getWorldTime() % tickDelay == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par3Entity instanceof EntityPlayer) + { + EnergyItems.syphonBatteries(par1ItemStack, (EntityPlayer) par3Entity, this.getLPUsed(par1ItemStack)); + this.setLPUsed(par1ItemStack, 0); + } + +// if(par2World.isRemote) +// { +// return; +// } + if (!par3EntityPlayer.onGround && !par3EntityPlayer.isSneaking()) + { + return; + } + + int range = 2; + int verticalOffset = -1; + + if (par3EntityPlayer.isSneaking()) + { + verticalOffset--; + } + + if (par2World.isRemote) + { + verticalOffset--; + } + + int posX = (int) Math.round(par3Entity.posX - 0.5f); + int posY = (int) par3Entity.posY; + int posZ = (int) Math.round(par3Entity.posZ - 0.5f); + int incremented = 0; + + for (int ix = posX - range; ix <= posX + range; ix++) + { + for (int iz = posZ - range; iz <= posZ + range; iz++) + { + //for(int iy=posY-verticalRange;iy<=posY+verticalRange;iy++) + { + Block block = par2World.getBlock(ix, posY + verticalOffset, iz); + + + if (par2World.isAirBlock(ix, posY + verticalOffset, iz)) + { + par2World.setBlock(ix, posY + verticalOffset, iz, ModBlocks.spectralBlock, 0, 3); + + if (par2World.rand.nextInt(2) == 0) + { + incremented++; + } + } + } + } + } + + this.incrimentLPUSed(par1ItemStack, incremented); + } + + return; + } + + public int getLPUsed(ItemStack par1ItemStack) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return par1ItemStack.stackTagCompound.getInteger("LPUsed"); + } + + public void incrimentLPUSed(ItemStack par1ItemStack, int addedLP) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setInteger("LPUsed", par1ItemStack.stackTagCompound.getInteger("LPUsed") + addedLP); + } + + public void setLPUsed(ItemStack par1ItemStack, int newLP) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setInteger("LPUsed", newLP); + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + if (!player.onGround && !player.isSneaking()) + { + return; + } + + int range = 2; + int verticalOffset = -1; + + if (player.isSneaking()) + { + verticalOffset--; + } + + int posX = (int) Math.round(player.posX - 0.5f); + int posY = (int) player.posY; + int posZ = (int) Math.round(player.posZ - 0.5f); + + //int incremented = 0; + + for (int ix = posX - range; ix <= posX + range; ix++) + { + for (int iz = posZ - range; iz <= posZ + range; iz++) + { + //for(int iy=posY-verticalRange;iy<=posY+verticalRange;iy++) + { + Block block = world.getBlock(ix, posY + verticalOffset, iz); + + + if (world.isAirBlock(ix, posY + verticalOffset, iz)) + { + world.setBlock(ix, posY + verticalOffset, iz, ModBlocks.spectralBlock, 0, 3); + } + } + } + } + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 100; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java new file mode 100644 index 00000000..277e8bc6 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java @@ -0,0 +1,194 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfTheFastMiner extends EnergyItems implements ArmourUpgrade +{ + @SideOnly(Side.CLIENT) + private static IIcon activeIcon; + @SideOnly(Side.CLIENT) + private static IIcon passiveIcon; + + public SigilOfTheFastMiner() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(100); + setEnergyUsed(100); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Keep going and going and going..."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfTheFastMiner"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:MiningSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:MiningSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 2, 1, true)); + + //Test with added health boost + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 2, 1, true)); + } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + return; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + player.addPotionEffect(new PotionEffect(Potion.digSpeed.id, 3, 1, true)); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 50; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java new file mode 100644 index 00000000..dc6ddb90 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java @@ -0,0 +1,196 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class SigilOfWind extends EnergyItems implements ArmourUpgrade +{ + @SideOnly(Side.CLIENT) + private static IIcon activeIcon; + @SideOnly(Side.CLIENT) + private static IIcon passiveIcon; + + public SigilOfWind() + { + super(); + this.maxStackSize = 1; + //setMaxDamage(100); + setEnergyUsed(250); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Best not to wear a skirt."); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WindSigil_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:WindSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:WindSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 2, 1)); + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 2, 2)); + + //Test with added health boost + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 2, 1)); + } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionBoost.id, 205, 1)); + + //par3EntityPlayer.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 205, 2)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + return; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionProjProt.id, 3, 1)); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 150; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java new file mode 100644 index 00000000..4bb65354 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java @@ -0,0 +1,239 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.MaterialLiquid; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.FillBucketEvent; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class VoidSigil extends ItemBucket implements ArmourUpgrade +{ + private int isFull; + private int energyUsed; + + public VoidSigil() + { + super(null); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(50); + isFull = 0; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:VoidSigil"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Better than a Swiffer!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + ItemStack copiedStack = itemStack.copy(); + copiedStack.setItemDamage(copiedStack.getItemDamage() + getEnergyUsed()); + copiedStack.stackSize = 1; + return copiedStack; + } + + protected void setEnergyUsed(int par1int) + { + this.energyUsed = par1int; + } + + protected int getEnergyUsed() + { + return this.energyUsed; + } + + // protected void damagePlayer(World world, EntityPlayer player, int damage) +// { +// if (world != null) +// { +// double posX = player.posX; +// double posY = player.posY; +// double posZ = player.posZ; +// world.playSoundEffect((double)((float)posX + 0.5F), (double)((float)posY + 0.5F), (double)((float)posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); +// float f = (float)1.0F; +// float f1 = f * 0.6F + 0.4F; +// float f2 = f * f * 0.7F - 0.5F; +// float f3 = f * f * 0.6F - 0.7F; +// +// for (int l = 0; l < 8; ++l) +// { +// world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); +// } +// } +// +// for (int i = 0; i < damage; i++) +// { +// //player.setEntityHealth((player.getHealth()-1)); +// player.setEntityHealth(player.func_110143_aJ() - 1); +// } +// +// if (player.func_110143_aJ() <= 0) +// { +// player.inventory.dropAllItems(); +// } +// } + protected boolean syphonBatteries(ItemStack ist, EntityPlayer player, int damageToBeDone) + { + if (!player.capabilities.isCreativeMode) + { + boolean usedBattery = false; + IInventory inventory = player.inventory; + + for (int slot = 0; slot < inventory.getSizeInventory(); slot++) + { + ItemStack stack = inventory.getStackInSlot(slot); + + if (stack == null) + { + continue; + } + + if (stack.getItem() instanceof EnergyBattery && !usedBattery) + { + if (stack.getItemDamage() <= stack.getMaxDamage() - damageToBeDone) + { + stack.setItemDamage(stack.getItemDamage() + damageToBeDone); + usedBattery = true; + } + } + } + + if (!usedBattery) + { + return false; + } + + return true; + } else + { + return true; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + float f = 1.0F; + double d0 = par3EntityPlayer.prevPosX + (par3EntityPlayer.posX - par3EntityPlayer.prevPosX) * (double) f; + double d1 = par3EntityPlayer.prevPosY + (par3EntityPlayer.posY - par3EntityPlayer.prevPosY) * (double) f + 1.62D - (double) par3EntityPlayer.yOffset; + double d2 = par3EntityPlayer.prevPosZ + (par3EntityPlayer.posZ - par3EntityPlayer.prevPosZ) * (double) f; + boolean flag = this.isFull == 0; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, flag); + + if (movingobjectposition == null) + { + return par1ItemStack; + } else + { + FillBucketEvent event = new FillBucketEvent(par3EntityPlayer, par1ItemStack, par2World, movingobjectposition); + + if (MinecraftForge.EVENT_BUS.post(event)) + { + return par1ItemStack; + } + + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) + { + return par1ItemStack; + } + + if (this.isFull == 0) + { + if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) + { + return par1ItemStack; + } + + if (par2World.getBlock(i, j, k).getMaterial() instanceof MaterialLiquid) + { + par2World.setBlockToAir(i, j, k); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } else + { + return par1ItemStack; + } + } + } + } + + return par1ItemStack; + } + } + + /** + * Attempts to place the liquid contained inside the bucket. + */ + public boolean tryPlaceContainedLiquid(World par1World, double par2, double par4, double par6, int par8, int par9, int par10) + { + return false; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, + ItemStack thisItemStack) + { + // TODO Auto-generated method stub + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 25; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java new file mode 100644 index 00000000..474d519c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java @@ -0,0 +1,261 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class WaterSigil extends ItemBucket implements ArmourUpgrade +{ + /** + * field for checking if the bucket has been filled. + */ + private Block isFull = Blocks.water; + private int energyUsed; + + public WaterSigil() + { + super(Blocks.water); + this.maxStackSize = 1; + //setMaxDamage(1000); + setEnergyUsed(100); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void onCreated(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WaterSigil"); + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + ItemStack copiedStack = itemStack.copy(); + copiedStack.setItemDamage(copiedStack.getItemDamage() + 1); + copiedStack.stackSize = 1; + return copiedStack; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Infinite water, anyone?"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + /** + * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer + */ + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + float f = 1.0F; + double d0 = par3EntityPlayer.prevPosX + (par3EntityPlayer.posX - par3EntityPlayer.prevPosX) * (double) f; + double d1 = par3EntityPlayer.prevPosY + (par3EntityPlayer.posY - par3EntityPlayer.prevPosY) * (double) f + 1.62D - (double) par3EntityPlayer.yOffset; + double d2 = par3EntityPlayer.prevPosZ + (par3EntityPlayer.posZ - par3EntityPlayer.prevPosZ) * (double) f; + //boolean flag = this.isFull == 0; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, false); + + if (movingobjectposition == null) + { + return par1ItemStack; + } else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!par2World.canMineBlock(par3EntityPlayer, i, j, k)) + { + return par1ItemStack; + } + + + { + if (movingobjectposition.sideHit == 0) + { + --j; + } + + if (movingobjectposition.sideHit == 1) + { + ++j; + } + + if (movingobjectposition.sideHit == 2) + { + --k; + } + + if (movingobjectposition.sideHit == 3) + { + ++k; + } + + if (movingobjectposition.sideHit == 4) + { + --i; + } + + if (movingobjectposition.sideHit == 5) + { + ++i; + } + + if (!par3EntityPlayer.canPlayerEdit(i, j, k, movingobjectposition.sideHit, par1ItemStack)) + { + return par1ItemStack; + } + + if (this.tryPlaceContainedLiquid(par2World, d0, d1, d2, i, j, k) && !par3EntityPlayer.capabilities.isCreativeMode) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } else + { + return par1ItemStack; + } + } + } + } + + return par1ItemStack; + } + } + + /** + * Attempts to place the liquid contained inside the bucket. + */ + public boolean tryPlaceContainedLiquid(World par1World, double par2, double par4, double par6, int par8, int par9, int par10) + { + if (!par1World.isAirBlock(par8, par9, par10) && par1World.getBlock(par8, par9, par10).getMaterial().isSolid()) + { + return false; + } else if ((par1World.getBlock(par8, par9, par10) == Blocks.water || par1World.getBlock(par8, par9, par10) == Blocks.flowing_water) && par1World.getBlockMetadata(par8, par9, par10) == 0) + { + return false; + } else + { + if (par1World.provider.isHellWorld) + { + par1World.playSoundEffect(par2 + 0.5D, par4 + 0.5D, par6 + 0.5D, "random.fizz", 0.5F, 2.6F + (par1World.rand.nextFloat() - par1World.rand.nextFloat()) * 0.8F); + + for (int l = 0; l < 8; ++l) + { + par1World.spawnParticle("largesmoke", (double) par8 + Math.random(), (double) par9 + Math.random(), (double) par10 + Math.random(), 0.0D, 0.0D, 0.0D); + } + } else + { + par1World.setBlock(par8, par9, par10, this.isFull, 0, 3); + } + + return true; + } + } + + protected void setEnergyUsed(int par1int) + { + this.energyUsed = par1int; + } + + protected int getEnergyUsed() + { + return this.energyUsed; + } + //Heals the player using the item. If the player is at full health, or if the durability cannot be used any more, + //the item is not used. + +// protected void damagePlayer(World world, EntityPlayer player, int damage) +// { +// if (world != null) +// { +// double posX = player.posX; +// double posY = player.posY; +// double posZ = player.posZ; +// world.playSoundEffect((double)((float)posX + 0.5F), (double)((float)posY + 0.5F), (double)((float)posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); +// float f = (float)1.0F; +// float f1 = f * 0.6F + 0.4F; +// float f2 = f * f * 0.7F - 0.5F; +// float f3 = f * f * 0.6F - 0.7F; +// +// for (int l = 0; l < 8; ++l) +// { +// world.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); +// } +// } +// +// for (int i = 0; i < damage; i++) +// { +// //player.setEntityHealth((player.getHealth()-1)); +// player.setEntityHealth(player.func_110143_aJ() - 1); +// } +// +// if (player.func_110143_aJ() <= 0) +// { +// player.inventory.dropAllItems(); +// } +// } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, + ItemStack thisItemStack) + { + // TODO Auto-generated method stub + //PotionEffect effect = new PotionEffect(Potion.waterBreathing.id, 2,9); + player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 2, 9)); + } + + @Override + public boolean isUpgrade() + { + // TODO Auto-generated method stub + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + // TODO Auto-generated method stub + return 50; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java new file mode 100644 index 00000000..469c0ff6 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java @@ -0,0 +1,169 @@ +package WayofTime.alchemicalWizardry.common.items.thaumcraft; + +import java.util.List; + +import javax.swing.Icon; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public abstract class FocusBase extends EnergyItems //implements IWandFocus +{ + protected IIcon ornament, depth; + + public FocusBase() + { + super(); + setMaxDamage(1); + setNoRepair(); + setMaxStackSize(1); + } + + boolean hasOrnament() + { + return false; + } + + boolean hasDepth() + { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + super.registerIcons(iconRegister); +// if(hasOrnament()) +// { +// ornament = iconRegister.registerIcon("AlchemicalWizardry:" + this.getUnlocalizedName() + "Orn"); +// } +// if(hasDepth()) +// { +// depth = iconRegister.registerIcon("AlchemicalWizardry:" + this.getUnlocalizedName() + "Depth"); +// } + } + + @Override + public boolean isItemTool(ItemStack par1ItemStack) + { + return true; + } + +/*erride + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + AspectList cost = getVisCost(); + + if (cost != null && cost.size() > 0) + { + par3List.add(StatCollector.translateToLocal(isVisCostPerTick() ? "item.Focus.cost2" : "item.Focus.cost1")); + + for (Aspect aspect : cost.getAspectsSorted()) + { + float amount = cost.getAmount(aspect) / 100.0F; + par3List.add(" " + '\u00a7' + aspect.getChatcolor() + aspect.getName() + '\u00a7' + "r x " + amount); + } + } + } + + @Override + public int getItemEnchantability() + { + return 5; + } + + @Override + public EnumRarity getRarity(ItemStack itemstack) + { + return EnumRarity.rare; + } + + @Override + public Icon getOrnament() + { + return ornament; + } + + @Override + public Icon getFocusDepthLayerIcon() + { + return depth; + } + + @Override + public WandFocusAnimation getAnimation() + { + return WandFocusAnimation.WAVE; + } + + @Override + public boolean isVisCostPerTick() + { + return false; + } + + public boolean isUseItem() + { + return isVisCostPerTick(); + } + + @Override + public ItemStack onFocusRightClick(ItemStack paramItemStack, World paramWorld, EntityPlayer paramEntityPlayer, MovingObjectPosition paramMovingObjectPosition) + { + if (isUseItem()) + { + paramEntityPlayer.setItemInUse(paramItemStack, Integer.MAX_VALUE); + } + + return paramItemStack; + } + + @Override + public void onUsingFocusTick(ItemStack paramItemStack, EntityPlayer paramEntityPlayer, int paramInt) + { + // NO-OP + } + + @Override + public void onPlayerStoppedUsingFocus(ItemStack paramItemStack, World paramWorld, EntityPlayer paramEntityPlayer, int paramInt) + { + // NO-OP + } + + @Override + public String getSortingHelper(ItemStack paramItemStack) + { + return "00"; + } + + @Override + public boolean onFocusBlockStartBreak(ItemStack paramItemStack, int paramInt1, int paramInt2, int paramInt3, EntityPlayer paramEntityPlayer) + { + return false; + } + + @Override + public boolean acceptsEnchant(int id) + { + if (id == ThaumcraftApi.enchantFrugal || + id == ThaumcraftApi.enchantPotency) + { + return true; + } + + return false; + } + + */ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java new file mode 100644 index 00000000..8d377041 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java @@ -0,0 +1,191 @@ +package WayofTime.alchemicalWizardry.common.items.thaumcraft; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class FocusBloodBlast extends FocusBase +{ + //private static final AspectList visUsage = new AspectList().add(Aspect.AIR, 15).add(Aspect.ENTROPY, 45); + + private final int maxCooldown = 7; + + public static Map playerCooldown = new HashMap(); + + public FocusBloodBlast() + { + super(); + this.setUnlocalizedName("focusBloodBlast"); + this.setEnergyUsed(100); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + super.registerIcons(iconRegister); + + if (hasOrnament()) + { + ornament = iconRegister.registerIcon("AlchemicalWizardry:" + "focusBloodBlast" + "Orn"); + } + + if (hasDepth()) + { + depth = iconRegister.registerIcon("AlchemicalWizardry:" + "focusBloodBlast" + "Depth"); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + //super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + if (!(par1ItemStack.stackTagCompound == null)) + { + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + /* + @Override + public void onUsingFocusTick(ItemStack stack, EntityPlayer par3EntityPlayer, int ticks) + { + if (AlchemicalWizardry.isThaumcraftLoaded) + { + Item item = stack.getItem(); + Class clazz = item.getClass(); + + while (!clazz.getName().equals("thaumcraft.common.items.wands.ItemWandCasting")) + { + if (clazz == Object.class) + { + return; + } + + clazz = clazz.getSuperclass(); + } + + //Item testItem = item.set + + //Method consumeAllVis = null; + try + { + if (!playerCooldown.containsKey(par3EntityPlayer.username)) + { + playerCooldown.put(par3EntityPlayer.username, 0); + } + + Method getFocusItem = clazz.getMethod("getFocusItem", ItemStack.class); + ItemStack focusStack = (ItemStack) getFocusItem.invoke(item, stack); + //int potency = EnchantmentHelper.getEnchantmentLevel(ThaumcraftApi.enchantPotency, focusStack); + int cooldown = playerCooldown.get(par3EntityPlayer.username) + 1; + playerCooldown.put(par3EntityPlayer.username, cooldown); + + if (cooldown >= this.maxCooldown) + { + Method consumeAllVis = clazz.getMethod("consumeAllVis", ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class); + + if ((Boolean) consumeAllVis.invoke(item, stack, par3EntityPlayer, getVisCost(), true)) + { + playerCooldown.put(par3EntityPlayer.username, 0); + EnergyItems.checkAndSetItemOwner(focusStack, par3EntityPlayer); + World world = par3EntityPlayer.worldObj; + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + this.syphonBatteries(focusStack, par3EntityPlayer, 100); + } + + //world.playSoundAtEntity(par3EntityPlayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + world.playSoundAtEntity(par3EntityPlayer, "thaumcraft:wand", 0.5F, 1F); + + if (!world.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + world.spawnEntityInWorld(new EnergyBlastProjectile(world, par3EntityPlayer, (int) (5))); + //this.setDelay(par1ItemStack, maxDelay); + } + } + } + } catch (NoSuchMethodException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (SecurityException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalAccessException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + @Override + public void onPlayerStoppedUsingFocus(ItemStack paramItemStack, World paramWorld, EntityPlayer paramEntityPlayer, int paramInt) + { + playerCooldown.put(paramEntityPlayer.username, 0); + } + + @Override + public String getSortingHelper(ItemStack itemstack) + { + return "BLOODBLAST"; + } + + @Override + public int getFocusColor() + { + return 0x8A0707; + } + + @Override + public AspectList getVisCost() + { + return visUsage; + } + + @Override + public boolean isVisCostPerTick() + { + return true; + } + + @Override + public WandFocusAnimation getAnimation() + { + return WandFocusAnimation.WAVE; + } + + boolean hasOrnament() + { + return true; + } + */ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java new file mode 100644 index 00000000..8a0e3678 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java @@ -0,0 +1,263 @@ +package WayofTime.alchemicalWizardry.common.items.thaumcraft; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class FocusGravityWell extends FocusBase +{ + //private static final AspectList visUsage = new AspectList().add(Aspect.AIR, 5).add(Aspect.ORDER, 5); + + private final int maxCooldown = 1; + + public static Map playerCooldown = new HashMap(); + + public FocusGravityWell() + { + super(); + this.setUnlocalizedName("focusGravityWell"); + this.setEnergyUsed(100); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + super.registerIcons(iconRegister); + + if (hasOrnament()) + { + ornament = iconRegister.registerIcon("AlchemicalWizardry:" + "focusGravityWell" + "Orn"); + } + + if (hasDepth()) + { + depth = iconRegister.registerIcon("AlchemicalWizardry:" + "focusGravityWell" + "Depth"); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + //super.addInformation(par1ItemStack, par2EntityPlayer, par3List, par4); + if (!(par1ItemStack.stackTagCompound == null)) + { + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + } + + /* + @Override + public void onUsingFocusTick(ItemStack stack, EntityPlayer par3EntityPlayer, int ticks) + { + if (AlchemicalWizardry.isThaumcraftLoaded) + { + Item item = stack.getItem(); + Class clazz = item.getClass(); + + while (!clazz.getName().equals("thaumcraft.common.items.wands.ItemWandCasting")) + { + if (clazz == Object.class) + { + return; + } + + clazz = clazz.getSuperclass(); + } + + //Item testItem = item.set + + //Method consumeAllVis = null; + try + { + if (!playerCooldown.containsKey(par3EntityPlayer.username)) + { + playerCooldown.put(par3EntityPlayer.username, 0); + } + + Method getFocusItem = clazz.getMethod("getFocusItem", ItemStack.class); + ItemStack focusStack = (ItemStack) getFocusItem.invoke(item, stack); + //int potency = EnchantmentHelper.getEnchantmentLevel(ThaumcraftApi.enchantPotency, focusStack); + int cooldown = playerCooldown.get(par3EntityPlayer.username) + 1; + playerCooldown.put(par3EntityPlayer.username, cooldown); + //if(cooldown>=this.maxCooldown) + { + Method consumeAllVis = clazz.getMethod("consumeAllVis", ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class); + + if ((Boolean) consumeAllVis.invoke(item, stack, par3EntityPlayer, getVisCost(), true)) + { + playerCooldown.put(par3EntityPlayer.username, 0); + EnergyItems.checkAndSetItemOwner(focusStack, par3EntityPlayer); + Vec3 vector = par3EntityPlayer.getLookVec(); + float distance = 2; + //if(par3EntityPlayer.worldObj.isRemote) + { + List entities = par3EntityPlayer.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(par3EntityPlayer.posX + vector.xCoord * distance - 0.5f, par3EntityPlayer.posY + vector.yCoord * distance - 0.5f, par3EntityPlayer.posZ + vector.zCoord * distance - 0.5f, par3EntityPlayer.posX + vector.xCoord * distance + 0.5f, par3EntityPlayer.posY + vector.yCoord * distance + 0.5f, par3EntityPlayer.posZ + vector.zCoord * distance + 0.5f).expand(1, 1, 1)); + + for (Entity entity : entities) + { + if (entity.getEntityName() == par3EntityPlayer.username) + { + continue; + } + + entity.motionX = par3EntityPlayer.posX + vector.xCoord * distance - entity.posX; + entity.motionY = par3EntityPlayer.posY + vector.yCoord * distance - entity.posY; + entity.motionZ = par3EntityPlayer.posZ + vector.zCoord * distance - entity.posZ; + //entity.setVelocity(par3EntityPlayer.posX+vector.xCoord*distance-entity.posX, par3EntityPlayer.posY+vector.yCoord*distance-entity.posY, par3EntityPlayer.posZ+vector.zCoord*distance-entity.posZ); + } + } + World world = par3EntityPlayer.worldObj; + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + this.syphonBatteriesWithoutParticles(focusStack, par3EntityPlayer, 10, false); + } + } + } + } catch (NoSuchMethodException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (SecurityException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalAccessException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + @Override + public void onPlayerStoppedUsingFocus(ItemStack stack, World paramWorld, EntityPlayer par3EntityPlayer, int paramInt) + { + playerCooldown.put(par3EntityPlayer.username, 0); + + if (AlchemicalWizardry.isThaumcraftLoaded) + { + Item item = stack.getItem(); + Class clazz = item.getClass(); + + while (!clazz.getName().equals("thaumcraft.common.items.wands.ItemWandCasting")) + { + if (clazz == Object.class) + { + return; + } + + clazz = clazz.getSuperclass(); + } + + //Item testItem = item.set + + //Method consumeAllVis = null; + try + { + Method getFocusItem = clazz.getMethod("getFocusItem", ItemStack.class); + ItemStack focusStack = (ItemStack) getFocusItem.invoke(item, stack); + int potency = EnchantmentHelper.getEnchantmentLevel(ThaumcraftApi.enchantPotency, focusStack); + + if (potency > 0) + { + EnergyItems.checkAndSetItemOwner(focusStack, par3EntityPlayer); + Vec3 vector = par3EntityPlayer.getLookVec(); + float distance = 2; + //if(par3EntityPlayer.worldObj.isRemote) + { + List entities = par3EntityPlayer.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(par3EntityPlayer.posX + vector.xCoord * distance - 0.5f, par3EntityPlayer.posY + vector.yCoord * distance - 0.5f, par3EntityPlayer.posZ + vector.zCoord * distance - 0.5f, par3EntityPlayer.posX + vector.xCoord * distance + 0.5f, par3EntityPlayer.posY + vector.yCoord * distance + 0.5f, par3EntityPlayer.posZ + vector.zCoord * distance + 0.5f).expand(1, 1, 1)); + + for (Entity entity : entities) + { + if (entity.getEntityName() == par3EntityPlayer.username) + { + continue; + } + + float speed = 1.0F * potency; + entity.motionX = vector.xCoord * speed; + entity.motionY = vector.yCoord * speed; + entity.motionZ = vector.zCoord * speed; + //entity.setVelocity(par3EntityPlayer.posX+vector.xCoord*distance-entity.posX, par3EntityPlayer.posY+vector.yCoord*distance-entity.posY, par3EntityPlayer.posZ+vector.zCoord*distance-entity.posZ); + } + } + } + } catch (NoSuchMethodException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (SecurityException e1) + { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalAccessException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalArgumentException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + @Override + public String getSortingHelper(ItemStack itemstack) + { + return "BLOODBLAST"; + } + + @Override + public int getFocusColor() + { + return 0x8A0707; + } + + @Override + public AspectList getVisCost() + { + return visUsage; + } + + @Override + public boolean isVisCostPerTick() + { + return true; + } + + @Override + public WandFocusAnimation getAnimation() + { + return WandFocusAnimation.WAVE; + } + + boolean hasOrnament() + { + return false; + } + */ +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java new file mode 100644 index 00000000..7551bddf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java @@ -0,0 +1,93 @@ +package WayofTime.alchemicalWizardry.common.items.thaumcraft; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemSanguineArmour extends ItemArmor implements ArmourUpgrade//, IGoggles, IVisDiscounter, IRevealer +{ + private static IIcon helmetIcon; + + public ItemSanguineArmour() + { + super(AlchemicalWizardry.sanguineArmourArmourMaterial, 4, 0); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + //this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SanguineHelmet"); + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) + { + //if(AlchemicalWizardry.isThaumcraftLoaded) + { + if (this == ModItems.sanguineHelmet) + { + return "alchemicalwizardry:models/armor/sanguineArmour_layer_1.png"; + } + } + return null; + } + +// @Override +// public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) +// { +// par3List.add("A pair of goggles imbued with power"); +// par3List.add("Vis discount: " + this.getVisDiscount() + "%"); +// } + + +// @Override +// public boolean showNodes(ItemStack itemstack, EntityLivingBase player) +// { +// return true; +// } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + return; + } + + @Override + public boolean isUpgrade() + { + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + return 0; + } + +// @Override +// public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) +// { +// return true; +// } +// +// @Override +// public int getVisDiscount() +// { +// return 10; +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/mcmod.info b/1.7.2/java/WayofTime/alchemicalWizardry/common/mcmod.info new file mode 100644 index 00000000..cd89dc4c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/mcmod.info @@ -0,0 +1,22 @@ +[ +{ + "modid": "AWWayofTime", + "name": "Blood Magic: Alchemical Wizardry", + "description": "Gruesome? Probably. Worth it? Definately!", + "version": "0.2.1c", + "url": "", + "updateUrl": "", + "logoFile": "", + "mcversion": "1.6.2", + "authorList": [ + "WayofTime" + ], + "credits": "", + "screenshots": [ + ], + "parent": "", + "dependencies": [ + ] +} +] + diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java new file mode 100644 index 00000000..6c93e00e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class RenderConduit extends TileEntitySpecialRenderer +{ + private ModelConduit modelConduit = new ModelConduit(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TEConduit) + { + TEConduit tileConduit = (TEConduit) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/Conduit.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelConduit.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileConduit.getInputDirection(), tileConduit.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java new file mode 100644 index 00000000..b1f5b4ec --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java @@ -0,0 +1,252 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderPedestal extends TileEntitySpecialRenderer +{ + private ModelPedestal modelPedestal = new ModelPedestal(); + private final RenderItem customRenderItem; + + public RenderPedestal() + { + customRenderItem = new RenderItem() + { + @Override + public boolean shouldBob() + { + return false; + } + }; + customRenderItem.setRenderManager(RenderManager.instance); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TEPedestal) + { + TEPedestal tileAltar = (TEPedestal) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/Pedestal.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelPedestal.render((Entity) null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + + if (tileAltar.getStackInSlot(0) != null) + { + float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(0)); + float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); + ghostEntityItem.hoverStart = 0.0F; + ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(0)); + //translateGhostItemByOrientation(ghostEntityItem.getEntityItem(), d0, d1, d2, ForgeDirection.DOWN); + float displacement = 0.2F; + + if (ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock) + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.7F, (float) d2 + 0.5F); + } else + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.6F, (float) d2 + 0.5F); + } + + //GL11.glTranslatef((float) tileAltar.xCoord + 0.5F, (float) tileAltar.yCoord + 2.7F, (float) tileAltar.zCoord + 0.5F); + GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); + GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F); + customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0); + } + + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } + + private float getGhostItemScaleFactor(ItemStack itemStack) + { + float scaleFactor = 1.0F; + + if (itemStack != null) + { + if (itemStack.getItem() instanceof ItemBlock) + { + switch (customRenderItem.getMiniBlockCount(itemStack,(byte)1)) + { + case 1: + return 0.90F; + + case 2: + return 0.90F; + + case 3: + return 0.90F; + + case 4: + return 0.90F; + + case 5: + return 0.80F; + + default: + return 0.90F; + } + } else + { + switch (customRenderItem.getMiniItemCount(itemStack,(byte)1)) + { + case 1: + return 0.65F; + + case 2: + return 0.65F; + + case 3: + return 0.65F; + + case 4: + return 0.65F; + + default: + return 0.65F; + } + } + } + + return scaleFactor; + } + + private void translateGhostItemByOrientation(ItemStack ghostItemStack, double x, double y, double z, ForgeDirection forgeDirection) + { + if (ghostItemStack != null) + { + if (ghostItemStack.getItem() instanceof ItemBlock) + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 2.7F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.25F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } else + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.6F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.20F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java new file mode 100644 index 00000000..14063a37 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java @@ -0,0 +1,256 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderPlinth extends TileEntitySpecialRenderer +{ + private ModelPlinth modelPlinth = new ModelPlinth(); + private final RenderItem customRenderItem; + + public RenderPlinth() + { + customRenderItem = new RenderItem() + { + @Override + public boolean shouldBob() + { + return false; + } + }; + customRenderItem.setRenderManager(RenderManager.instance); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TEPlinth) + { + TEPlinth tileAltar = (TEPlinth) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/Plinth.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelPlinth.render((Entity) null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glPushMatrix(); + + if (tileAltar.getStackInSlot(0) != null) + { + float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(0)); + EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); + ghostEntityItem.hoverStart = 0.0F; + ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(0)); + //translateGhostItemByOrientation(ghostEntityItem.getEntityItem(), d0, d1, d2, ForgeDirection.DOWN); + float displacement = 0.2F; + + if (ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock) + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.7F, (float) d2 + 0.5F); + } else + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 10.4f / 16.0f, (float) d2 + 0.5F - 0.1875f); + } + + //GL11.glTranslatef((float) tileAltar.xCoord + 0.5F, (float) tileAltar.yCoord + 2.7F, (float) tileAltar.zCoord + 0.5F); + GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); + + if (!(ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock)) + { + GL11.glRotatef(90f, 1.0f, 0.0f, 0.0F); + } + + customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0); + } + + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } + + private float getGhostItemScaleFactor(ItemStack itemStack) + { + float scaleFactor = 2.0F / 0.9F; + + if (itemStack != null) + { + if (itemStack.getItem() instanceof ItemBlock) + { + switch (customRenderItem.getMiniBlockCount(itemStack, (byte) 1)) + { + case 1: + return 0.90F * scaleFactor / 2; + + case 2: + return 0.90F * scaleFactor / 2; + + case 3: + return 0.90F * scaleFactor / 2; + + case 4: + return 0.90F * scaleFactor / 2; + + case 5: + return 0.80F * scaleFactor / 2; + + default: + return 0.90F * scaleFactor / 2; + } + } else + { + switch (customRenderItem.getMiniItemCount(itemStack, (byte) 1)) + { + case 1: + return 0.65F * scaleFactor; + + case 2: + return 0.65F * scaleFactor; + + case 3: + return 0.65F * scaleFactor; + + case 4: + return 0.65F * scaleFactor; + + default: + return 0.65F * scaleFactor; + } + } + } + + return scaleFactor; + } + + private void translateGhostItemByOrientation(ItemStack ghostItemStack, double x, double y, double z, ForgeDirection forgeDirection) + { + if (ghostItemStack != null) + { + if (ghostItemStack.getItem() instanceof ItemBlock) + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 2.7F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.25F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } else + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.6F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.20F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java new file mode 100644 index 00000000..134a3f98 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellEffectBlock extends TileEntitySpecialRenderer +{ + private ModelSpellEffectBlock modelSpellEffectBlock = new ModelSpellEffectBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellEffectBlock) + { + TESpellEffectBlock tileSpellBlock = (TESpellEffectBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellEffect.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellEffectBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java new file mode 100644 index 00000000..ef098839 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java @@ -0,0 +1,333 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelWritingTable; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderWritingTable extends TileEntitySpecialRenderer +{ + private ModelWritingTable modelWritingTable = new ModelWritingTable(); + private final RenderItem customRenderItem; +// private final RenderItem customRenderItem1; +// private final RenderItem customRenderItem2; +// private final RenderItem customRenderItem3; +// private final RenderItem customRenderItem4; +// private final RenderItem customRenderItem5; + + public RenderWritingTable() + { + customRenderItem = new RenderItem() + { + @Override + public boolean shouldBob() + { + return false; + } + }; + customRenderItem.setRenderManager(RenderManager.instance); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TEWritingTable) + { + TEWritingTable tileAltar = (TEWritingTable) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/WritingTable.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelWritingTable.render((Entity) null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + + for (int i = 1; i <= 6; i++) + { + GL11.glPushMatrix(); + + if (tileAltar.getStackInSlot(i) != null) + { + float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(i)); + float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); + ghostEntityItem.hoverStart = 0.0F; + ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(i)); + //translateGhostItemByOrientation(ghostEntityItem.getEntityItem(), d0, d1, d2, ForgeDirection.DOWN); + float displacementX = getXDisplacementForSlot(i); + float displacementY = getYDisplacementForSlot(i); + float displacementZ = getZDisplacementForSlot(i); + + if (ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock) + { + GL11.glTranslatef((float) d0 + 0.5F + displacementX, (float) d1 + displacementY + 0.7F, (float) d2 + 0.5F + displacementZ); + } else + { + GL11.glTranslatef((float) d0 + 0.5F + displacementX, (float) d1 + displacementY + 0.6F, (float) d2 + 0.5F + displacementZ); + } + + //GL11.glTranslatef((float) tileAltar.xCoord + 0.5F, (float) tileAltar.yCoord + 2.7F, (float) tileAltar.zCoord + 0.5F); + GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); + GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F); + customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0); + } + + GL11.glPopMatrix(); + } + + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } + + private float getGhostItemScaleFactor(ItemStack itemStack) + { + float scaleFactor = 0.8F; + + if (itemStack != null) + { + if (itemStack.getItem() instanceof ItemBlock) + { + switch (customRenderItem.getMiniBlockCount(itemStack,(byte)1)) + { + case 1: + return 0.90F * scaleFactor; + + case 2: + return 0.90F * scaleFactor; + + case 3: + return 0.90F * scaleFactor; + + case 4: + return 0.90F * scaleFactor; + + case 5: + return 0.80F * scaleFactor; + + default: + return 0.90F * scaleFactor; + } + } else + { + switch (customRenderItem.getMiniItemCount(itemStack,(byte)1)) + { + case 1: + return 0.65F * scaleFactor; + + case 2: + return 0.65F * scaleFactor; + + case 3: + return 0.65F * scaleFactor; + + case 4: + return 0.65F * scaleFactor; + + default: + return 0.65F * scaleFactor; + } + } + } + + return scaleFactor; + } + + private float getXDisplacementForSlot(int slot) + { + switch (slot) + { + case 0: + return 0.0f; + + case 1: + return -0.375f; + + case 2: + return -0.125f; + + case 3: + return 0.3125f; + + case 4: + return 0.3125f; + + case 5: + return -0.125f; + + default: + return 0.0f; + } + } + + private float getYDisplacementForSlot(int slot) + { + switch (slot) + { + case 0: + return 0.4f; + + case 1: + return -0.35f; + + case 6: + return 0.4f; + + default: + return -0.35f; + } + } + + private float getZDisplacementForSlot(int slot) + { + switch (slot) + { + case 0: + return 0.0f; + + case 1: + return 0.0f; + + case 2: + return 0.375f; + + case 3: + return 0.25f; + + case 4: + return -0.25f; + + case 5: + return -0.375f; + + default: + return 0.0f; + } + } + + private void translateGhostItemByOrientation(ItemStack ghostItemStack, double x, double y, double z, ForgeDirection forgeDirection) + { + if (ghostItemStack != null) + { + if (ghostItemStack.getItem() instanceof ItemBlock) + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 2.7F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.25F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } else + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.6F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.20F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java new file mode 100644 index 00000000..20353e77 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java @@ -0,0 +1,241 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBloodAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + +public class TEAltarRenderer extends TileEntitySpecialRenderer +{ + private ModelBloodAltar modelBloodAltar = new ModelBloodAltar(); + private final RenderItem customRenderItem; + + public TEAltarRenderer() + { + customRenderItem = new RenderItem() + { + @Override + public boolean shouldBob() + { + return false; + } + }; + customRenderItem.setRenderManager(RenderManager.instance); + } + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + modelBloodAltar.renderBloodAltar((TEAltar) tileEntity, d0, d1, d2); + modelBloodAltar.renderBloodLevel((TEAltar) tileEntity, d0, d1, d2); + + if (tileEntity instanceof TEAltar) + { + TEAltar tileAltar = (TEAltar) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + + if (tileAltar.getStackInSlot(0) != null) + { + float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(0)); + float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); + ghostEntityItem.hoverStart = 0.0F; + ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(0)); + //translateGhostItemByOrientation(ghostEntityItem.getEntityItem(), d0, d1, d2, ForgeDirection.DOWN); + float displacement = 0.2F; + + if (ghostEntityItem.getEntityItem().getItem() instanceof ItemBlock) + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.7F, (float) d2 + 0.5F); + } else + { + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + displacement + 0.6F, (float) d2 + 0.5F); + } + + //GL11.glTranslatef((float) tileAltar.xCoord + 0.5F, (float) tileAltar.yCoord + 2.7F, (float) tileAltar.zCoord + 0.5F); + GL11.glScalef(scaleFactor, scaleFactor, scaleFactor); + GL11.glRotatef(rotationAngle, 0.0F, 1.0F, 0.0F); + customRenderItem.doRender(ghostEntityItem, 0, 0, 0, 0, 0); + } + + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } + + private float getGhostItemScaleFactor(ItemStack itemStack) + { + float scaleFactor = 1.0F; + + if (itemStack != null) + { + if (itemStack.getItem() instanceof ItemBlock) + { + switch (customRenderItem.getMiniBlockCount(itemStack,(byte)1)) + { + case 1: + return 0.90F; + + case 2: + return 0.90F; + + case 3: + return 0.90F; + + case 4: + return 0.90F; + + case 5: + return 0.80F; + + default: + return 0.90F; + } + } else + { + switch (customRenderItem.getMiniItemCount(itemStack,(byte)1)) + { + case 1: + return 0.65F; + + case 2: + return 0.65F; + + case 3: + return 0.65F; + + case 4: + return 0.65F; + + default: + return 0.65F; + } + } + } + + return scaleFactor; + } + + private void translateGhostItemByOrientation(ItemStack ghostItemStack, double x, double y, double z, ForgeDirection forgeDirection) + { + if (ghostItemStack != null) + { + if (ghostItemStack.getItem() instanceof ItemBlock) + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 2.7F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.25F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.5F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.5F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } else + { + switch (forgeDirection) + { + case DOWN: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.6F, (float) z + 0.5F); + return; + } + + case UP: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.20F, (float) z + 0.5F); + return; + } + + case NORTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.7F); + return; + } + + case SOUTH: + { + GL11.glTranslatef((float) x + 0.5F, (float) y + 0.4F, (float) z + 0.3F); + return; + } + + case EAST: + { + GL11.glTranslatef((float) x + 0.3F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case WEST: + { + GL11.glTranslatef((float) x + 0.70F, (float) y + 0.4F, (float) z + 0.5F); + return; + } + + case UNKNOWN: + { + return; + } + + default: + { + return; + } + } + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java new file mode 100644 index 00000000..70cc34f7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java @@ -0,0 +1,81 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBloodAltar; +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +public class TEAltarItemRenderer implements IItemRenderer +{ + private ModelBloodAltar modelBloodAltar; + + public TEAltarItemRenderer() + { + modelBloodAltar = new ModelBloodAltar(); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) + { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) + { + // TODO Auto-generated method stub + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) + { + float scale = 0.08f; + + // TODO Auto-generated method stub + switch (type) + { + case ENTITY: + { + renderBloodAltar(0f, 0f, 0f, scale); + return; + } + + case EQUIPPED: + { + renderBloodAltar(0f, 0f, 0f, scale); + return; + } + + case INVENTORY: + { + renderBloodAltar(0f, -0.25f, 0f, scale); + return; + } + + default: + return; + } + } + + private void renderBloodAltar(float x, float y, float z, float scale) + { + GL11.glPushMatrix(); + // Disable Lighting Calculations + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glTranslatef(x, y, z); + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(180f, 0f, 1f, 0f); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/OBJTutorial/textures/models/TutBox.png"); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/altar.png"); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/alchemicalwizardry/textures/models/altar.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + modelBloodAltar.renderBloodAltar(); + // Re-enable Lighting Calculations + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java new file mode 100644 index 00000000..bf875589 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java @@ -0,0 +1,95 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelConduit; +import cpw.mods.fml.client.FMLClientHandler; + +public class TEConduitItemRenderer implements IItemRenderer +{ + private ModelConduit modelConduit = new ModelConduit(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockConduit; + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/Conduit.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelConduit.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java new file mode 100644 index 00000000..30cb938a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java @@ -0,0 +1,108 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEffectBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellEffectBlockItemRenderer implements IItemRenderer +{ + private ModelSpellEffectBlock modelSpellBlock = new ModelSpellEffectBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEffectWind.png"; + case 3: return "alchemicalwizardry:textures/models/SpellEffectEarth.png"; + } + return ""; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java new file mode 100644 index 00000000..9705879c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java @@ -0,0 +1,82 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelWritingTable; +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import org.lwjgl.opengl.GL11; + +public class TEWritingTableItemRenderer implements IItemRenderer +{ + private ModelWritingTable modelBloodAltar; + + public TEWritingTableItemRenderer() + { + modelBloodAltar = new ModelWritingTable(); + } + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) + { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) + { + // TODO Auto-generated method stub + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) + { + float scale = 0.08f; + + // TODO Auto-generated method stub + switch (type) + { + case ENTITY: + { + renderBloodAltar(0f, 0f, 0f, scale); + return; + } + + case EQUIPPED: + { + renderBloodAltar(0f, 0f, 0f, scale); + return; + } + + case INVENTORY: + { + renderBloodAltar(0f, -0.25f, 0f, scale); + return; + } + + default: + return; + } + } + + private void renderBloodAltar(float x, float y, float z, float scale) + { + GL11.glPushMatrix(); + // Disable Lighting Calculations + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glTranslatef(x, y, z); + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(180f, 0f, 1f, 0f); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/OBJTutorial/textures/models/TutBox.png"); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/WritingTable.png"); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/alchemicalwizardry/textures/models/altar.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + modelBloodAltar.render((Entity) null, 0, 0, 0, 0, 0, 0); + // Re-enable Lighting Calculations + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java new file mode 100644 index 00000000..b09c6ca7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderBileDemon extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/BileDemon.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderBileDemon(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityBileDemon par1EntityBileDemon) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityBileDemon) par1Entity); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java new file mode 100644 index 00000000..6db35edd --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderBoulderFist extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/BoulderFist.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderBoulderFist(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityBoulderFist par1EntityBoulderFist) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityBoulderFist) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java new file mode 100644 index 00000000..485adc3a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java @@ -0,0 +1,63 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.EntityAirElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.*; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderElemental extends RenderLiving +{ + private static final ResourceLocation airBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/AirFloatingBeacon.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + private static final ResourceLocation waterBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/WaterFloatingBeacon.png"); + private static final ResourceLocation earthBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/EarthFloatingBeacon.png"); + private static final ResourceLocation fireBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/FireFloatingBeacon.png"); + private static final ResourceLocation shadeBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/DarkFloatingBeacon.png"); + private static final ResourceLocation holyBeacon = new ResourceLocation("alchemicalwizardry", "textures/models/HolyFloatingBeacon.png"); + + public RenderElemental(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityElemental par1EntityElemental) + { + if (par1EntityElemental instanceof EntityAirElemental) + { + return airBeacon; + } + + if (par1EntityElemental instanceof EntityWaterElemental) + { + return waterBeacon; + } + + if (par1EntityElemental instanceof EntityEarthElemental) + { + return earthBeacon; + } + + if (par1EntityElemental instanceof EntityFireElemental) + { + return fireBeacon; + } + + if (par1EntityElemental instanceof EntityShadeElemental) + { + return shadeBeacon; + } + + if (par1EntityElemental instanceof EntityHolyElemental) + { + return holyBeacon; + } + + return airBeacon; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityElemental) par1Entity); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java new file mode 100644 index 00000000..28a18eaa --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java @@ -0,0 +1,30 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +@SideOnly(Side.CLIENT) +public class RenderFallenAngel extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/WingedAngel.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderFallenAngel(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityFallenAngel par1EntityFallenAngel) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityFallenAngel) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java new file mode 100644 index 00000000..e7dd7219 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderIceDemon extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/IceDemon.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderIceDemon(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityIceDemon par1EntityIceDemon) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityIceDemon) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java new file mode 100644 index 00000000..4eeaa4d3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderLowerGuardian extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/LowerGuardian.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderLowerGuardian(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityLowerGuardian par1EntityLowerGuardian) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityLowerGuardian) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java new file mode 100644 index 00000000..38868202 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderShade extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/ShadeMob.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderShade(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityShade par1EntityShade) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityShade) par1Entity); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java new file mode 100644 index 00000000..16772df4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntitySmallEarthGolem; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderSmallEarthGolem extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/SmallEarthGolem.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderSmallEarthGolem(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntitySmallEarthGolem par1EntitySmallEarthGolem) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntitySmallEarthGolem) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java new file mode 100644 index 00000000..826f7832 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.renderer.mob; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityWingedFireDemon; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; + +public class RenderWingedFireDemon extends RenderLiving +{ + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/WingedFireDemon.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + + public RenderWingedFireDemon(ModelBase par1ModelBase, float par2) + { + super(par1ModelBase, par2); + } + + public ResourceLocation func_110832_a(EntityWingedFireDemon par1EntityWingedFireDemon) + { + return field_110833_a; + } + + public ResourceLocation getEntityTexture(Entity par1Entity) + { + return this.func_110832_a((EntityWingedFireDemon) par1Entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java new file mode 100644 index 00000000..e09db58e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java @@ -0,0 +1,181 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; +import org.lwjgl.opengl.GL11; + +public class ModelBileDemon extends ModelBase +{ + //fields + ModelRenderer belly; + ModelRenderer chest; + ModelRenderer head; + ModelRenderer nose; + ModelRenderer leftHorn; + ModelRenderer leftArmSpacer; + ModelRenderer leftArm; + ModelRenderer leftChain; + ModelRenderer leftBall; + ModelRenderer rightHorn; + ModelRenderer rightChain; + ModelRenderer rightBall; + ModelRenderer rightArmSpacer; + ModelRenderer rightArm; + + public ModelBileDemon() + { + textureWidth = 128; + textureHeight = 64; + belly = new ModelRenderer(this, 0, 31); + belly.addBox(-8F, -1F, -10F, 16, 15, 18); + belly.setRotationPoint(0F, 10F, 0F); + belly.setTextureSize(128, 64); + belly.mirror = true; + setRotation(belly, 0F, 0F, 0F); + chest = new ModelRenderer(this, 70, 46); + chest.addBox(-7F, -4F, -6F, 14, 4, 14); + chest.setRotationPoint(0F, 10F, 0F); + chest.setTextureSize(128, 64); + chest.mirror = true; + setRotation(chest, -0.1115358F, 0F, 0F); + head = new ModelRenderer(this, 0, 0); + head.addBox(-4F, -8F, -4F, 8, 8, 8); + head.setRotationPoint(0F, 6F, 3F); + head.setTextureSize(128, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + nose = new ModelRenderer(this, 0, 0); + nose.addBox(-1F, -4F, -5F, 2, 1, 1); + nose.setRotationPoint(0F, 6F, 3F); + nose.setTextureSize(128, 64); + nose.mirror = true; + setRotation(nose, 0F, 0F, 0F); + leftHorn = new ModelRenderer(this, 93, 1); + leftHorn.addBox(4F, -7F, 0F, 16, 1, 1); + leftHorn.setRotationPoint(0F, 6F, 3F); + leftHorn.setTextureSize(128, 64); + leftHorn.mirror = true; + setRotation(leftHorn, 0F, 0F, 0F); + leftArmSpacer = new ModelRenderer(this, 80, 1); + leftArmSpacer.addBox(0F, -2F, -2F, 1, 4, 4); + leftArmSpacer.setRotationPoint(7F, 8F, 3F); + leftArmSpacer.setTextureSize(128, 64); + leftArmSpacer.mirror = true; + setRotation(leftArmSpacer, 0F, 0F, 0F); + leftArm = new ModelRenderer(this, 62, 1); + leftArm.addBox(1F, -2F, -2F, 4, 18, 4); + leftArm.setRotationPoint(7F, 8F, 3F); + leftArm.setTextureSize(128, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + leftChain = new ModelRenderer(this, 95, 5); + leftChain.addBox(17F, -6F, 0F, 1, 6, 1); + leftChain.setRotationPoint(0F, 6F, 3F); + leftChain.setTextureSize(128, 64); + leftChain.mirror = true; + setRotation(leftChain, 0F, 0F, 0F); + leftBall = new ModelRenderer(this, 107, 4); + leftBall.addBox(15F, 0F, -2F, 5, 5, 5); + leftBall.setRotationPoint(0F, 6F, 3F); + leftBall.setTextureSize(128, 64); + leftBall.mirror = true; + setRotation(leftBall, 0F, 0F, 0F); + rightHorn = new ModelRenderer(this, 93, 1); + rightHorn.mirror = true; + rightHorn.addBox(-20F, -7F, 0F, 16, 1, 1); + rightHorn.setRotationPoint(0F, 6F, 3F); + rightHorn.setTextureSize(128, 64); + rightHorn.mirror = true; + setRotation(rightHorn, 0F, 0F, 0F); + rightHorn.mirror = false; + rightChain = new ModelRenderer(this, 95, 5); + rightChain.mirror = true; + rightChain.addBox(-18F, -6F, 0F, 1, 6, 1); + rightChain.setRotationPoint(0F, 6F, 3F); + rightChain.setTextureSize(128, 64); + rightChain.mirror = true; + setRotation(rightChain, 0F, 0F, 0F); + rightChain.mirror = false; + rightBall = new ModelRenderer(this, 107, 4); + rightBall.mirror = true; + rightBall.addBox(-20F, 0F, -2F, 5, 5, 5); + rightBall.setRotationPoint(0F, 6F, 3F); + rightBall.setTextureSize(128, 64); + rightBall.mirror = true; + setRotation(rightBall, 0F, 0F, 0F); + rightBall.mirror = false; + rightArmSpacer = new ModelRenderer(this, 80, 1); + rightArmSpacer.mirror = true; + rightArmSpacer.addBox(-1F, -2F, -2F, 1, 4, 4); + rightArmSpacer.setRotationPoint(-7F, 8F, 3F); + rightArmSpacer.setTextureSize(128, 64); + rightArmSpacer.mirror = true; + setRotation(rightArmSpacer, 0F, 0F, 0F); + rightArmSpacer.mirror = false; + rightArm = new ModelRenderer(this, 62, 1); + rightArm.mirror = true; + rightArm.addBox(-5F, -2F, -2F, 4, 18, 4); + rightArm.setRotationPoint(-7F, 8F, 3F); + rightArm.setTextureSize(128, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float scale = 1.3f; + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(0.0f, -(6.0f / 16.0f), 0.0f); + belly.render(f5); + chest.render(f5); + head.render(f5); + nose.render(f5); + leftHorn.render(f5); + leftArmSpacer.render(f5); + leftArm.render(f5); + leftChain.render(f5); + leftBall.render(f5); + rightHorn.render(f5); + rightChain.render(f5); + rightBall.render(f5); + rightArmSpacer.render(f5); + rightArm.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.3662F + (float) Math.PI) * 1.0F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.3662F) * 1.0F * f1; + this.rightArmSpacer.rotateAngleX = MathHelper.cos(f * 0.3662F + (float) Math.PI) * 1.0F * f1; + this.leftArmSpacer.rotateAngleX = MathHelper.cos(f * 0.3662F) * 1.0F * f1; + this.leftBall.rotateAngleX = this.head.rotateAngleX; + this.leftBall.rotateAngleY = this.head.rotateAngleY; + this.rightBall.rotateAngleX = this.head.rotateAngleX; + this.rightBall.rotateAngleY = this.head.rotateAngleY; + this.leftChain.rotateAngleX = this.head.rotateAngleX; + this.leftChain.rotateAngleY = this.head.rotateAngleY; + this.rightChain.rotateAngleX = this.head.rotateAngleX; + this.rightChain.rotateAngleY = this.head.rotateAngleY; + this.leftHorn.rotateAngleX = this.head.rotateAngleX; + this.leftHorn.rotateAngleY = this.head.rotateAngleY; + this.rightHorn.rotateAngleX = this.head.rotateAngleX; + this.rightHorn.rotateAngleY = this.head.rotateAngleY; + this.nose.rotateAngleX = this.head.rotateAngleX; + this.nose.rotateAngleY = this.head.rotateAngleY; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java new file mode 100644 index 00000000..eba407bb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java @@ -0,0 +1,72 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import cpw.mods.fml.client.FMLClientHandler; + +public class ModelBloodAltar extends ModelBase +{ + private IModelCustom modelBloodAltar; + private IModelCustom modelBloodLevel; //TODO + + public ModelBloodAltar() + { + modelBloodAltar = AdvancedModelLoader.loadModel(new ResourceLocation("alchemicalwizardry:models/bloodaltar-fixeUV.obj")); + modelBloodLevel = AdvancedModelLoader.loadModel(new ResourceLocation("alchemicalwizardry:models/bloodlevel.obj")); + } + + public void renderBloodAltar() + { + modelBloodAltar.renderAll(); + } + + public void renderBloodLevel() + { + modelBloodLevel.renderAll(); + } + + public void renderBloodAltar(TEAltar altar, double x, double y, double z) + { + float scale = 0.1f; + // Push a blank matrix onto the stack + GL11.glPushMatrix(); + // Move the object into the correct position on the block (because the OBJ's origin is the center of the object) + GL11.glTranslatef((float) x + 0.5f, (float) y, (float) z + 0.5f); + // Scale our object to about half-size in all directions (the OBJ file is a little large) + GL11.glScalef(scale, scale, scale); + // Bind the texture, so that OpenGL properly textures our block. + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/altar.png"); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/alchemicalwizardry/textures/models/altar.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + // Render the object, using modelTutBox.renderAll(); + this.renderBloodAltar(); + // Pop this matrix from the stack. + GL11.glPopMatrix(); + } + + public void renderBloodLevel(TEAltar altar, double x, double y, double z) + { + float scale = 0.1f; + // Push a blank matrix onto the stack + GL11.glPushMatrix(); + float level = altar.getFluidAmount(); + // Move the object into the correct position on the block (because the OBJ's origin is the center of the object) + GL11.glTranslatef((float) x + 0.5f, (float) y + 0.6499f + 0.12f * (level / altar.getCapacity()), (float) z + 0.5f); + // Scale our object to about half-size in all directions (the OBJ file is a little large) + GL11.glScalef(scale, scale, scale); + // Bind the texture, so that OpenGL properly textures our block. + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/blood.png"); + //FMLClientHandler.instance().getClient().renderEngine.bindTexture("/mods/alchemicalwizardry/textures/models/altar.png"); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + // Render the object, using modelTutBox.renderAll(); + this.renderBloodLevel(); + // Pop this matrix from the stack. + GL11.glPopMatrix(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java new file mode 100644 index 00000000..a2cebd46 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java @@ -0,0 +1,153 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelBoulderFist extends ModelBase +{ + //fields + ModelRenderer leftFist; + ModelRenderer leftArm; + ModelRenderer body; + ModelRenderer leftLeg1; + ModelRenderer leftLeg2; + ModelRenderer leftFoot; + ModelRenderer rightFist; + ModelRenderer rightArm; + ModelRenderer rightLeg1; + ModelRenderer rightLeg2; + ModelRenderer rightFoot; + ModelRenderer head; + + public ModelBoulderFist() + { + textureWidth = 64; + textureHeight = 64; + leftFist = new ModelRenderer(this, 33, 52); + leftFist.addBox(-1F, 12F, -3F, 6, 6, 6); + leftFist.setRotationPoint(5F, 6F, -6F); + leftFist.setTextureSize(64, 64); + leftFist.mirror = true; + setRotation(leftFist, 0F, 0F, 0F); + leftArm = new ModelRenderer(this, 48, 33); + leftArm.addBox(0F, -2F, -2F, 4, 14, 4); + leftArm.setRotationPoint(5F, 6F, -6F); + leftArm.setTextureSize(64, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + body = new ModelRenderer(this, 0, 40); + body.addBox(-5F, -2F, -3F, 10, 18, 6); + body.setRotationPoint(0F, 6F, -6F); + body.setTextureSize(64, 64); + body.mirror = true; + setRotation(body, 1.22173F, 0F, 0F); + leftLeg1 = new ModelRenderer(this, 0, 25); + leftLeg1.addBox(0F, -1F, -1F, 4, 6, 2); + leftLeg1.setRotationPoint(5F, 11F, 7F); + leftLeg1.setTextureSize(64, 64); + leftLeg1.mirror = true; + setRotation(leftLeg1, -((float) Math.PI / 4F), 0F, 0F); + leftLeg2 = new ModelRenderer(this, 1, 25); + leftLeg2.addBox(0F, 5F, -1F, 4, 2, 12); + leftLeg2.setRotationPoint(5F, 11F, 7F); + leftLeg2.setTextureSize(64, 64); + leftLeg2.mirror = true; + setRotation(leftLeg2, -((float) Math.PI / 4F), 0F, 0F); + leftFoot = new ModelRenderer(this, 22, 25); + leftFoot.addBox(0F, 11F, -1F, 4, 2, 5); + leftFoot.setRotationPoint(5F, 11F, 7F); + leftFoot.setTextureSize(64, 64); + leftFoot.mirror = true; + setRotation(leftFoot, 0F, 0F, 0F); + rightFist = new ModelRenderer(this, 33, 52); + rightFist.mirror = true; + rightFist.addBox(-5F, 12F, -3F, 6, 6, 6); + rightFist.setRotationPoint(-5F, 6F, -6F); + rightFist.setTextureSize(64, 64); + rightFist.mirror = true; + setRotation(rightFist, 0F, 0F, 0F); + rightFist.mirror = false; + rightArm = new ModelRenderer(this, 48, 33); + rightArm.mirror = true; + rightArm.addBox(-4F, -2F, -2F, 4, 14, 4); + rightArm.setRotationPoint(-5F, 6F, -6F); + rightArm.setTextureSize(64, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + rightLeg1 = new ModelRenderer(this, 0, 25); + rightLeg1.mirror = true; + rightLeg1.addBox(-4F, -1F, -1F, 4, 6, 2); + rightLeg1.setRotationPoint(-5F, 11F, 7F); + rightLeg1.setTextureSize(64, 64); + rightLeg1.mirror = true; + setRotation(rightLeg1, -((float) Math.PI / 4F), 0F, 0F); + rightLeg1.mirror = false; + rightLeg2 = new ModelRenderer(this, 1, 25); + rightLeg2.mirror = true; + rightLeg2.addBox(-4F, 5F, -1F, 4, 2, 12); + rightLeg2.setRotationPoint(-5F, 11F, 7F); + rightLeg2.setTextureSize(64, 64); + rightLeg2.mirror = true; + setRotation(rightLeg2, -((float) Math.PI / 4F), 0F, 0F); + rightLeg2.mirror = false; + rightFoot = new ModelRenderer(this, 22, 25); + rightFoot.mirror = true; + rightFoot.addBox(-4F, 11F, -1F, 4, 2, 5); + rightFoot.setRotationPoint(-5F, 11F, 7F); + rightFoot.setTextureSize(64, 64); + rightFoot.mirror = true; + setRotation(rightFoot, 0F, 0F, 0F); + rightFoot.mirror = false; + head = new ModelRenderer(this, 0, 0); + head.addBox(-3F, -5F, -5F, 6, 6, 6); + head.setRotationPoint(0F, 5F, -7F); + head.setTextureSize(64, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + leftFist.render(f5); + leftArm.render(f5); + body.render(f5); + leftLeg1.render(f5); + leftLeg2.render(f5); + leftFoot.render(f5); + rightFist.render(f5); + rightArm.render(f5); + rightLeg1.render(f5); + rightLeg2.render(f5); + rightFoot.render(f5); + head.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftFoot.rotateAngleX = MathHelper.cos(f * 0.6662F) * 0.8F * f1; + this.rightFoot.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 0.8F * f1; + this.leftLeg1.rotateAngleX = leftFoot.rotateAngleX - ((float) Math.PI / 4F); + this.rightLeg1.rotateAngleX = rightFoot.rotateAngleX - ((float) Math.PI / 4F); + this.leftLeg2.rotateAngleX = leftFoot.rotateAngleX - ((float) Math.PI / 4F); + this.rightLeg2.rotateAngleX = rightFoot.rotateAngleX - ((float) Math.PI / 4F); + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 0.9f * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 0.9f * f1; + this.leftFist.rotateAngleX = leftArm.rotateAngleX; + this.rightFist.rotateAngleX = rightArm.rotateAngleX; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java new file mode 100644 index 00000000..a6a510c4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java @@ -0,0 +1,287 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +//Date: 11/26/2013 1:57:16 PM +//Template version 1.1 +//Java generated by Techne +//Keep in mind that you still need to fill in some blanks +//- ZeuX + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.util.ForgeDirection; + +public class ModelConduit extends ModelBase +{ + //fields + ModelRenderer curvedInput; + ModelRenderer curvedOutput; + ModelRenderer straightBar1; + ModelRenderer curvedBar1; + ModelRenderer spacer1; + ModelRenderer straightBar2; + ModelRenderer curvedBar2; + ModelRenderer spacer2; + ModelRenderer straightBar3; + ModelRenderer curvedBar3; + ModelRenderer straightBar4; + ModelRenderer curvedBar4; + ModelRenderer spacer3; + ModelRenderer spacer4; + ModelRenderer spacer5; + ModelRenderer spacer6; + ModelRenderer spacer7; + ModelRenderer spacer8; + + public ModelConduit() + { + textureWidth = 64; + textureHeight = 32; + curvedInput = new ModelRenderer(this, 0, 0); + curvedInput.addBox(-2F, -2F, -8F, 4, 4, 10); + curvedInput.setRotationPoint(0F, 16F, 0F); + curvedInput.setTextureSize(64, 32); + curvedInput.mirror = true; + setRotation(curvedInput, 0F, 0F, 0F); + curvedOutput = new ModelRenderer(this, 18, 0); + curvedOutput.addBox(2F, -2F, -2F, 6, 4, 4); + curvedOutput.setRotationPoint(0F, 16F, 0F); + curvedOutput.setTextureSize(64, 32); + curvedOutput.mirror = true; + setRotation(curvedOutput, 0F, 0F, 0F); + straightBar1 = new ModelRenderer(this, 0, 17); + straightBar1.addBox(-5F, 3F, -8F, 2, 2, 13); + straightBar1.setRotationPoint(0F, 16F, 0F); + straightBar1.setTextureSize(64, 32); + straightBar1.mirror = true; + setRotation(straightBar1, 0F, 0F, 0F); + curvedBar1 = new ModelRenderer(this, 29, 10); + curvedBar1.addBox(-5F, 3F, 3F, 13, 2, 2); + curvedBar1.setRotationPoint(0F, 16F, 0F); + curvedBar1.setTextureSize(64, 32); + curvedBar1.mirror = true; + setRotation(curvedBar1, 0F, 0F, 0F); + spacer1 = new ModelRenderer(this, 40, 0); + spacer1.addBox(-5.5F, 2.5F, 2.5F, 3, 3, 3); + spacer1.setRotationPoint(0F, 16F, 0F); + spacer1.setTextureSize(64, 32); + spacer1.mirror = true; + setRotation(spacer1, 0F, 0F, 0F); + straightBar2 = new ModelRenderer(this, 0, 17); + straightBar2.addBox(-5F, -5F, -8F, 2, 2, 13); + straightBar2.setRotationPoint(0F, 16F, 0F); + straightBar2.setTextureSize(64, 32); + straightBar2.mirror = true; + setRotation(straightBar2, 0F, 0F, 0F); + curvedBar2 = new ModelRenderer(this, 29, 10); + curvedBar2.addBox(-5F, -5F, 3F, 13, 2, 2); + curvedBar2.setRotationPoint(0F, 16F, 0F); + curvedBar2.setTextureSize(64, 32); + curvedBar2.mirror = true; + setRotation(curvedBar2, 0F, 0F, 0F); + spacer2 = new ModelRenderer(this, 40, 0); + spacer2.addBox(-5.5F, -5.5F, 2.5F, 3, 3, 3); + spacer2.setRotationPoint(0F, 16F, 0F); + spacer2.setTextureSize(64, 32); + spacer2.mirror = true; + setRotation(spacer2, 0F, 0F, 0F); + straightBar3 = new ModelRenderer(this, 0, 17); + straightBar3.addBox(3F, 3F, -8F, 2, 2, 13); + straightBar3.setRotationPoint(0F, 16F, 0F); + straightBar3.setTextureSize(64, 32); + straightBar3.mirror = true; + setRotation(straightBar3, 0F, 0F, 0F); + curvedBar3 = new ModelRenderer(this, 29, 10); + curvedBar3.addBox(-5F, 3F, -5F, 13, 2, 2); + curvedBar3.setRotationPoint(0F, 16F, 0F); + curvedBar3.setTextureSize(64, 32); + curvedBar3.mirror = true; + setRotation(curvedBar3, 0F, 0F, 0F); + straightBar4 = new ModelRenderer(this, 0, 17); + straightBar4.addBox(3F, -5F, -8F, 2, 2, 13); + straightBar4.setRotationPoint(0F, 16F, 0F); + straightBar4.setTextureSize(64, 32); + straightBar4.mirror = true; + setRotation(straightBar4, 0F, 0F, 0F); + curvedBar4 = new ModelRenderer(this, 29, 10); + curvedBar4.addBox(-5F, -5F, -5F, 13, 2, 2); + curvedBar4.setRotationPoint(0F, 16F, 0F); + curvedBar4.setTextureSize(64, 32); + curvedBar4.mirror = true; + setRotation(curvedBar4, 0F, 0F, 0F); + spacer3 = new ModelRenderer(this, 40, 0); + spacer3.addBox(2.5F, 2.5F, 2.5F, 3, 3, 3); + spacer3.setRotationPoint(0F, 16F, 0F); + spacer3.setTextureSize(64, 32); + spacer3.mirror = true; + setRotation(spacer3, 0F, 0F, 0F); + spacer4 = new ModelRenderer(this, 40, 0); + spacer4.addBox(2.5F, 2.5F, -5.5F, 3, 3, 3); + spacer4.setRotationPoint(0F, 16F, 0F); + spacer4.setTextureSize(64, 32); + spacer4.mirror = true; + setRotation(spacer4, 0F, 0F, 0F); + spacer5 = new ModelRenderer(this, 40, 0); + spacer5.addBox(-5.5F, 2.5F, -5.484F, 3, 3, 3); + spacer5.setRotationPoint(0F, 16F, 0F); + spacer5.setTextureSize(64, 32); + spacer5.mirror = true; + setRotation(spacer5, 0F, 0F, 0F); + spacer6 = new ModelRenderer(this, 40, 0); + spacer6.addBox(2.5F, -5.5F, 2.5F, 3, 3, 3); + spacer6.setRotationPoint(0F, 16F, 0F); + spacer6.setTextureSize(64, 32); + spacer6.mirror = true; + setRotation(spacer6, 0F, 0F, 0F); + spacer7 = new ModelRenderer(this, 40, 0); + spacer7.addBox(2.5F, -5.5F, -5.5F, 3, 3, 3); + spacer7.setRotationPoint(0F, 16F, 0F); + spacer7.setTextureSize(64, 32); + spacer7.mirror = true; + setRotation(spacer7, 0F, 0F, 0F); + spacer8 = new ModelRenderer(this, 40, 0); + spacer8.addBox(-5.5F, -5.5F, -5.5F, 3, 3, 3); + spacer8.setRotationPoint(0F, 16F, 0F); + spacer8.setTextureSize(64, 32); + spacer8.mirror = true; + setRotation(spacer8, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(curvedInput, xInputRot, yInputRot, zInputRot); + this.setRotation(curvedOutput, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(straightBar1, xInputRot, yInputRot, zInputRot); + this.setRotation(curvedBar1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(straightBar2, xInputRot, yInputRot, zInputRot); + this.setRotation(curvedBar2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(straightBar3, xInputRot, yInputRot, zInputRot); + this.setRotation(curvedBar3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(straightBar4, xInputRot, yInputRot, zInputRot); + this.setRotation(curvedBar4, xOutputRot, yOutputRot, zOutputRot); + curvedInput.render(f5); + curvedOutput.render(f5); + //setRotation(curvedOutput,0F,-(float)(Math.PI/2),0F); + straightBar1.render(f5); + curvedBar1.render(f5); + spacer1.render(f5); + straightBar2.render(f5); + curvedBar2.render(f5); + spacer2.render(f5); + straightBar3.render(f5); + curvedBar3.render(f5); + straightBar4.render(f5); + curvedBar4.render(f5); + spacer3.render(f5); + spacer4.render(f5); + spacer5.render(f5); + spacer6.render(f5); + spacer7.render(f5); + spacer8.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java new file mode 100644 index 00000000..25cb2814 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java @@ -0,0 +1,81 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntityBlaze; +import net.minecraft.world.World; + +public class ModelElemental extends ModelBase +{ + //fields + ModelRenderer body; + ModelRenderer Shape2; + ModelRenderer Shape1; + ModelRenderer Shape3; + + public ModelElemental() + { + textureWidth = 64; + textureHeight = 32; + body = new ModelRenderer(this, 33, 0); + body.addBox(-3F, -3F, -3F, 6, 6, 6); + body.setRotationPoint(0F, 14F, 0F); + body.setTextureSize(64, 32); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 0, 0); + Shape2.addBox(-4F, -4F, -4F, 8, 8, 8); + Shape2.setRotationPoint(0F, 14F, 0F); + Shape2.setTextureSize(64, 32); + Shape2.mirror = true; + setRotation(Shape2, ((float) Math.PI / 4F), ((float) Math.PI / 4F), 0F); + Shape1 = new ModelRenderer(this, 0, 0); + Shape1.addBox(-4F, -4F, -4F, 8, 8, 8); + Shape1.setRotationPoint(0F, 14F, 0F); + Shape1.setTextureSize(64, 32); + Shape1.mirror = true; + setRotation(Shape1, 0F, ((float) Math.PI / 4F), ((float) Math.PI / 4F)); + Shape3 = new ModelRenderer(this, 0, 0); + Shape3.addBox(-4F, -4F, -4F, 8, 8, 8); + Shape3.setRotationPoint(0F, 14F, 0F); + Shape3.setTextureSize(64, 32); + Shape3.mirror = true; + setRotation(Shape3, ((float) Math.PI / 4F), 0F, ((float) Math.PI / 4F)); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + body.render(f5); + Shape2.render(f5); + Shape1.render(f5); + Shape3.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + World world = entity.worldObj; + + if (world == null) + { + return; + } + + int ratio = 20; + float rot = (entity.worldObj.getWorldTime() % ratio) / ratio; + Shape1.rotateAngleX = f / 5; + Shape2.rotateAngleZ = f / 5; + Shape3.rotateAngleY = f / 5; + EntityBlaze d; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..de8e7e6b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java @@ -0,0 +1,122 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelEnergyBazookaMainProjectile extends ModelBase +{ + //fields + ModelRenderer thirdWarHead; + ModelRenderer firstWarHead; + ModelRenderer secondWarHead; + ModelRenderer support1; + ModelRenderer mainBody; + ModelRenderer support2; + ModelRenderer support3; + ModelRenderer support4; + ModelRenderer base1; + ModelRenderer base2; + ModelRenderer base3; + + public ModelEnergyBazookaMainProjectile() + { + textureWidth = 64; + textureHeight = 32; + thirdWarHead = new ModelRenderer(this, 43, 0); + thirdWarHead.addBox(-1F, -1F, -9F, 2, 2, 1); + thirdWarHead.setRotationPoint(0F, 0F, 0F); + thirdWarHead.setTextureSize(64, 32); + thirdWarHead.mirror = true; + setRotation(thirdWarHead, 0F, 0F, 0F); + firstWarHead = new ModelRenderer(this, 52, 0); + firstWarHead.addBox(-2F, -2F, -8F, 4, 4, 2); + firstWarHead.setRotationPoint(0F, 0F, 0F); + firstWarHead.setTextureSize(64, 32); + firstWarHead.mirror = true; + setRotation(firstWarHead, 0F, 0F, 0F); + secondWarHead = new ModelRenderer(this, 48, 8); + secondWarHead.addBox(-3F, -3F, -6F, 6, 6, 2); + secondWarHead.setRotationPoint(0F, 0F, 0F); + secondWarHead.setTextureSize(64, 32); + secondWarHead.mirror = true; + setRotation(secondWarHead, 0F, 0F, 0F); + support1 = new ModelRenderer(this, 0, 0); + support1.addBox(2F, 2F, -4F, 1, 1, 9); + support1.setRotationPoint(0F, 0F, 0F); + support1.setTextureSize(64, 32); + support1.mirror = true; + setRotation(support1, 0F, 0F, 0F); + mainBody = new ModelRenderer(this, 0, 19); + mainBody.addBox(-2F, -2F, -4F, 4, 4, 9); + mainBody.setRotationPoint(0F, 0F, 0F); + mainBody.setTextureSize(64, 32); + mainBody.mirror = true; + setRotation(mainBody, 0F, 0F, 0F); + support2 = new ModelRenderer(this, 0, 0); + support2.addBox(-3F, 2F, -4F, 1, 1, 9); + support2.setRotationPoint(0F, 0F, 0F); + support2.setTextureSize(64, 32); + support2.mirror = true; + setRotation(support2, 0F, 0F, 0F); + support3 = new ModelRenderer(this, 0, 0); + support3.addBox(-3F, -3F, -4F, 1, 1, 9); + support3.setRotationPoint(0F, 0F, 0F); + support3.setTextureSize(64, 32); + support3.mirror = true; + setRotation(support3, 0F, 0F, 0F); + support4 = new ModelRenderer(this, 0, 0); + support4.addBox(2F, -3F, -4F, 1, 1, 9); + support4.setRotationPoint(0F, 0F, 0F); + support4.setTextureSize(64, 32); + support4.mirror = true; + setRotation(support4, 0F, 0F, 0F); + base1 = new ModelRenderer(this, 28, 0); + base1.addBox(-3F, -3F, 5F, 6, 6, 1); + base1.setRotationPoint(0F, 0F, 0F); + base1.setTextureSize(64, 32); + base1.mirror = true; + setRotation(base1, 0F, 0F, 0F); + base2 = new ModelRenderer(this, 28, 9); + base2.addBox(-2F, -2F, 6F, 4, 4, 1); + base2.setRotationPoint(0F, 0F, 0F); + base2.setTextureSize(64, 32); + base2.mirror = true; + setRotation(base2, 0F, 0F, 0F); + base3 = new ModelRenderer(this, 28, 15); + base3.addBox(-3F, -3F, 7F, 6, 6, 1); + base3.setRotationPoint(0F, 0F, 0F); + base3.setTextureSize(64, 32); + base3.mirror = true; + setRotation(base3, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + thirdWarHead.render(f5); + firstWarHead.render(f5); + secondWarHead.render(f5); + support1.render(f5); + mainBody.render(f5); + support2.render(f5); + support3.render(f5); + support4.render(f5); + base1.render(f5); + base2.render(f5); + base3.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java new file mode 100644 index 00000000..aacef80d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java @@ -0,0 +1,113 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelFallenAngel extends ModelBase +{ + //fields + ModelRenderer leftWing; + ModelRenderer rightWing; + ModelRenderer head; + ModelRenderer body; + ModelRenderer rightarm; + ModelRenderer leftarm; + ModelRenderer rightleg; + ModelRenderer leftleg; + + public ModelFallenAngel() + { + textureWidth = 64; + textureHeight = 32; + leftWing = new ModelRenderer(this, 33, 8); + leftWing.mirror = true; + leftWing.addBox(0F, 0F, 0F, 10, 7, 0); + leftWing.setRotationPoint(0F, 1F, 2F); + leftWing.setTextureSize(64, 32); + leftWing.mirror = true; + setRotation(leftWing, 0F, 0F, 0F); + rightWing = new ModelRenderer(this, 33, 8); + rightWing.addBox(-10F, 0F, 0F, 10, 7, 0); + rightWing.setRotationPoint(0F, 1F, 2F); + rightWing.setTextureSize(64, 32); + rightWing.mirror = true; + setRotation(rightWing, 0F, 0F, 0F); + rightWing.mirror = false; + head = new ModelRenderer(this, 0, 0); + head.addBox(-4F, -8F, -4F, 8, 8, 8); + head.setRotationPoint(0F, 0F, 0F); + head.setTextureSize(64, 32); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + body = new ModelRenderer(this, 16, 16); + body.addBox(-4F, 0F, -2F, 8, 12, 4); + body.setRotationPoint(0F, 0F, 0F); + body.setTextureSize(64, 32); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + rightarm = new ModelRenderer(this, 40, 16); + rightarm.addBox(-3F, -2F, -2F, 4, 12, 4); + rightarm.setRotationPoint(-5F, 2F, 0F); + rightarm.setTextureSize(64, 32); + rightarm.mirror = true; + setRotation(rightarm, 0F, 0F, 0F); + rightarm.mirror = false; + leftarm = new ModelRenderer(this, 40, 16); + leftarm.mirror = true; + leftarm.addBox(-1F, -2F, -2F, 4, 12, 4); + leftarm.setRotationPoint(5F, 2F, 0F); + leftarm.setTextureSize(64, 32); + leftarm.mirror = true; + setRotation(leftarm, 0F, 0F, 0F); + rightleg = new ModelRenderer(this, 0, 16); + rightleg.addBox(-2F, 0F, -2F, 4, 12, 4); + rightleg.setRotationPoint(-2F, 12F, 0F); + rightleg.setTextureSize(64, 32); + rightleg.mirror = true; + setRotation(rightleg, 0F, 0F, 0F); + rightleg.mirror = false; + leftleg = new ModelRenderer(this, 0, 16); + leftleg.mirror = true; + leftleg.addBox(-2F, 0F, -2F, 4, 12, 4); + leftleg.setRotationPoint(2F, 12F, 0F); + leftleg.setTextureSize(64, 32); + leftleg.mirror = true; + setRotation(leftleg, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + leftWing.render(f5); + rightWing.render(f5); + head.render(f5); + body.render(f5); + rightarm.render(f5); + leftarm.render(f5); + rightleg.render(f5); + leftleg.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftleg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.rightleg.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.rightarm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.leftarm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.rightWing.rotateAngleY = MathHelper.cos(0.1662F); + this.leftWing.rotateAngleY = MathHelper.cos(0.1662F + (float) Math.PI); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java new file mode 100644 index 00000000..9c6d3c32 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java @@ -0,0 +1,197 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelIceDemon extends ModelBase +{ + //fields + ModelRenderer head; + ModelRenderer leftHorn; + ModelRenderer rightHorn; + ModelRenderer body; + ModelRenderer leftArm; + ModelRenderer leftWrist; + ModelRenderer leftIcicle1; + ModelRenderer leftIcicle2; + ModelRenderer leftIcicle3; + ModelRenderer leftLeg; + ModelRenderer rightArm; + ModelRenderer rightWrist; + ModelRenderer rightIcicle1; + ModelRenderer rightIcicle2; + ModelRenderer rightIcicle3; + ModelRenderer rightLeg; + ModelRenderer Shape1; + + public ModelIceDemon() + { + textureWidth = 64; + textureHeight = 64; + head = new ModelRenderer(this, 40, 0); + head.addBox(-3F, -8F, -3F, 6, 8, 6); + head.setRotationPoint(0F, -3F, 0F); + head.setTextureSize(64, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + leftHorn = new ModelRenderer(this, 0, 0); + leftHorn.addBox(3F, -7F, 2F, 1, 1, 10); + leftHorn.setRotationPoint(0F, -3F, 0F); + leftHorn.setTextureSize(64, 64); + leftHorn.mirror = true; + setRotation(leftHorn, 0.4363323F, 0F, 0F); + rightHorn = new ModelRenderer(this, 0, 0); + rightHorn.mirror = true; + rightHorn.addBox(-4F, -7F, 2F, 1, 1, 10); + rightHorn.setRotationPoint(0F, -3F, 0F); + rightHorn.setTextureSize(64, 64); + rightHorn.mirror = true; + setRotation(rightHorn, 0.4363323F, 0F, 0F); + rightHorn.mirror = false; + body = new ModelRenderer(this, 40, 15); + body.addBox(-4F, 0F, -2F, 8, 13, 4); + body.setRotationPoint(0F, -3F, 0F); + body.setTextureSize(64, 64); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + leftArm = new ModelRenderer(this, 0, 48); + leftArm.addBox(0F, -2F, -2F, 4, 12, 4); + leftArm.setRotationPoint(4F, -1F, 0F); + leftArm.setTextureSize(64, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + leftWrist = new ModelRenderer(this, 32, 57); + leftWrist.addBox(0F, 6F, -2.5F, 5, 2, 5); + leftWrist.setRotationPoint(4F, -1F, 0F); + leftWrist.setTextureSize(64, 64); + leftWrist.mirror = true; + setRotation(leftWrist, 0F, 0F, 0F); + leftIcicle1 = new ModelRenderer(this, 0, 0); + leftIcicle1.addBox(4.9F, 0F, -0.5F, 1, 6, 1); + leftIcicle1.setRotationPoint(4F, -1F, 0F); + leftIcicle1.setTextureSize(64, 64); + leftIcicle1.mirror = true; + setRotation(leftIcicle1, 0F, 0F, 0.1396263F); + leftIcicle2 = new ModelRenderer(this, 0, 0); + leftIcicle2.addBox(5F, 0F, 0F, 1, 6, 1); + leftIcicle2.setRotationPoint(4F, -1F, 0F); + leftIcicle2.setTextureSize(64, 64); + leftIcicle2.mirror = true; + setRotation(leftIcicle2, 0F, 0.5585054F, 0.1919862F); + leftIcicle3 = new ModelRenderer(this, 0, 0); + leftIcicle3.addBox(5F, 0F, -1F, 1, 6, 1); + leftIcicle3.setRotationPoint(4F, -1F, 0F); + leftIcicle3.setTextureSize(64, 64); + leftIcicle3.mirror = true; + setRotation(leftIcicle3, 0F, -0.5585054F, 0.1919862F); + leftLeg = new ModelRenderer(this, 16, 46); + leftLeg.addBox(-2F, 0F, -2F, 4, 14, 4); + leftLeg.setRotationPoint(2F, 10F, 0F); + leftLeg.setTextureSize(64, 64); + leftLeg.mirror = true; + setRotation(leftLeg, 0F, 0F, 0F); + rightArm = new ModelRenderer(this, 0, 48); + rightArm.mirror = true; + rightArm.addBox(-4F, -2F, -2F, 4, 12, 4); + rightArm.setRotationPoint(-4F, -1F, 0F); + rightArm.setTextureSize(64, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + rightWrist = new ModelRenderer(this, 32, 57); + rightWrist.mirror = true; + rightWrist.addBox(-5F, 6F, -2.5F, 5, 2, 5); + rightWrist.setRotationPoint(-4F, -1F, 0F); + rightWrist.setTextureSize(64, 64); + rightWrist.mirror = true; + setRotation(rightWrist, 0F, 0F, 0F); + rightWrist.mirror = false; + rightIcicle1 = new ModelRenderer(this, 0, 0); + rightIcicle1.addBox(-5.9F, 0F, -0.5F, 1, 6, 1); + rightIcicle1.setRotationPoint(-4F, -1F, 0F); + rightIcicle1.setTextureSize(64, 64); + rightIcicle1.mirror = true; + setRotation(rightIcicle1, 0F, 0F, -0.1396263F); + rightIcicle2 = new ModelRenderer(this, 0, 0); + rightIcicle2.addBox(-6F, 0F, 0F, 1, 6, 1); + rightIcicle2.setRotationPoint(-4F, -1F, 0F); + rightIcicle2.setTextureSize(64, 64); + rightIcicle2.mirror = true; + setRotation(rightIcicle2, 0F, -0.5585054F, -0.1919862F); + rightIcicle3 = new ModelRenderer(this, 0, 0); + rightIcicle3.addBox(-6F, 0F, -1F, 1, 6, 1); + rightIcicle3.setRotationPoint(-4F, -1F, 0F); + rightIcicle3.setTextureSize(64, 64); + rightIcicle3.mirror = true; + setRotation(rightIcicle3, 0F, 0.5585054F, -0.1919862F); + rightLeg = new ModelRenderer(this, 16, 46); + rightLeg.mirror = true; + rightLeg.addBox(-2F, 0F, -2F, 4, 14, 4); + rightLeg.setRotationPoint(-2F, 10F, 0F); + rightLeg.setTextureSize(64, 64); + rightLeg.mirror = true; + setRotation(rightLeg, 0F, 0F, 0F); + rightLeg.mirror = false; + Shape1 = new ModelRenderer(this, 0, 12); + Shape1.addBox(-0.5F, 0F, -0.5F, 1, 10, 1); + Shape1.setRotationPoint(0F, 8F, 1.5F); + Shape1.setTextureSize(64, 64); + Shape1.mirror = true; + setRotation(Shape1, 0.5948578F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + head.render(f5); + leftHorn.render(f5); + rightHorn.render(f5); + body.render(f5); + leftArm.render(f5); + leftWrist.render(f5); + leftIcicle1.render(f5); + leftIcicle2.render(f5); + leftIcicle3.render(f5); + leftLeg.render(f5); + rightArm.render(f5); + rightWrist.render(f5); + rightIcicle1.render(f5); + rightIcicle2.render(f5); + rightIcicle3.render(f5); + rightLeg.render(f5); + Shape1.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.rightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.leftHorn.rotateAngleX = head.rotateAngleX + 0.4363323F; + this.leftHorn.rotateAngleY = head.rotateAngleY; + this.rightHorn.rotateAngleX = head.rotateAngleX + 0.4363323F; + this.rightHorn.rotateAngleY = head.rotateAngleY; + this.rightIcicle1.rotateAngleX = rightArm.rotateAngleX; + this.rightIcicle2.rotateAngleX = rightArm.rotateAngleX; + this.rightIcicle3.rotateAngleX = rightArm.rotateAngleX; + this.leftIcicle1.rotateAngleX = leftArm.rotateAngleX; + this.leftIcicle2.rotateAngleX = leftArm.rotateAngleX; + this.leftIcicle3.rotateAngleX = leftArm.rotateAngleX; + this.rightWrist.rotateAngleX = rightArm.rotateAngleX; + this.leftWrist.rotateAngleX = leftArm.rotateAngleX; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java new file mode 100644 index 00000000..61d7b85d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java @@ -0,0 +1,207 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.MathHelper; + +public class ModelLowerGuardian extends ModelBase +{ + //fields + ModelRenderer Body; + ModelRenderer Torso; + ModelRenderer Head; + ModelRenderer leftArm; + ModelRenderer rightArm; + ModelRenderer leftLeg; + ModelRenderer leftFoot; + ModelRenderer rightLeg; + ModelRenderer rightFoot; + ModelRenderer leftHorn; + ModelRenderer hornAppendage1; + ModelRenderer hornAppendage2; + ModelRenderer rightHorn; + ModelRenderer hornAppendage3; + ModelRenderer hornAppendage4; + + public ModelLowerGuardian() + { + textureWidth = 64; + textureHeight = 64; + Body = new ModelRenderer(this, 0, 0); + Body.addBox(-8F, -7F, -4F, 16, 14, 8); + Body.setRotationPoint(0F, -3F, 0F); + Body.setTextureSize(64, 64); + Body.mirror = true; + setRotation(Body, 0F, 0F, 0F); + Torso = new ModelRenderer(this, 0, 25); + Torso.addBox(-4F, 0F, -3F, 8, 4, 6); + Torso.setRotationPoint(0F, 4F, 0F); + Torso.setTextureSize(64, 64); + Torso.mirror = true; + setRotation(Torso, 0F, 0F, 0F); + Head = new ModelRenderer(this, 29, 25); + Head.addBox(-4F, -8F, -4F, 8, 8, 8); + Head.setRotationPoint(0F, -10F, 0F); + Head.setTextureSize(64, 64); + Head.mirror = true; + setRotation(Head, 0F, 0F, 0F); + leftArm = new ModelRenderer(this, 17, 42); + leftArm.addBox(0F, -2F, -2F, 4, 18, 4); + leftArm.setRotationPoint(8F, -8F, 0F); + leftArm.setTextureSize(64, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + rightArm = new ModelRenderer(this, 17, 42); + rightArm.mirror = true; + rightArm.addBox(-4F, -2F, -2F, 4, 18, 4); + rightArm.setRotationPoint(-8F, -8F, 0F); + rightArm.setTextureSize(64, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + leftLeg = new ModelRenderer(this, 0, 42); + leftLeg.addBox(0F, -2F, -2F, 4, 17, 4); + leftLeg.setRotationPoint(4F, 6F, 0F); + leftLeg.setTextureSize(64, 64); + leftLeg.mirror = true; + setRotation(leftLeg, 0F, 0F, 0F); + leftFoot = new ModelRenderer(this, 34, 42); + leftFoot.addBox(0F, 15F, -6F, 4, 3, 8); + leftFoot.setRotationPoint(4F, 6F, 0F); + leftFoot.setTextureSize(64, 64); + leftFoot.mirror = true; + setRotation(leftFoot, 0F, 0F, 0F); + rightLeg = new ModelRenderer(this, 0, 42); + rightLeg.mirror = true; + rightLeg.addBox(-4F, -2F, -2F, 4, 17, 4); + rightLeg.setRotationPoint(-4F, 6F, 0F); + rightLeg.setTextureSize(64, 64); + rightLeg.mirror = true; + setRotation(rightLeg, 0F, 0F, 0F); + rightLeg.mirror = false; + rightFoot = new ModelRenderer(this, 34, 42); + rightFoot.mirror = true; + rightFoot.addBox(-4F, 15F, -6F, 4, 3, 8); + rightFoot.setRotationPoint(-4F, 6F, 0F); + rightFoot.setTextureSize(64, 64); + rightFoot.mirror = true; + setRotation(rightFoot, 0F, 0F, 0F); + rightFoot.mirror = false; + leftHorn = new ModelRenderer(this, 0, 0); + leftHorn.addBox(4F, -11F, 0F, 1, 6, 1); + leftHorn.setRotationPoint(0F, -10F, 0F); + leftHorn.setTextureSize(64, 64); + leftHorn.mirror = true; + setRotation(leftHorn, 0F, 0F, 0F); + hornAppendage1 = new ModelRenderer(this, 0, 0); + hornAppendage1.addBox(4F, -7F, -1F, 1, 1, 1); + hornAppendage1.setRotationPoint(0F, -10F, 0F); + hornAppendage1.setTextureSize(64, 64); + hornAppendage1.mirror = true; + setRotation(hornAppendage1, 0F, 0F, 0F); + hornAppendage2 = new ModelRenderer(this, 0, 0); + hornAppendage2.addBox(4F, -6F, 1F, 1, 1, 1); + hornAppendage2.setRotationPoint(0F, -10F, 0F); + hornAppendage2.setTextureSize(64, 64); + hornAppendage2.mirror = true; + setRotation(hornAppendage2, 0F, 0F, 0F); + rightHorn = new ModelRenderer(this, 0, 0); + rightHorn.mirror = true; + rightHorn.addBox(-5F, -11F, 0F, 1, 6, 1); + rightHorn.setRotationPoint(0F, -10F, 0F); + rightHorn.setTextureSize(64, 64); + rightHorn.mirror = true; + setRotation(rightHorn, 0F, 0F, 0F); + rightHorn.mirror = false; + hornAppendage3 = new ModelRenderer(this, 0, 0); + hornAppendage3.mirror = true; + hornAppendage3.addBox(-5F, -7F, -1F, 1, 1, 1); + hornAppendage3.setRotationPoint(0F, -10F, 0F); + hornAppendage3.setTextureSize(64, 64); + hornAppendage3.mirror = true; + setRotation(hornAppendage3, 0F, 0F, 0F); + hornAppendage3.mirror = false; + hornAppendage4 = new ModelRenderer(this, 0, 0); + hornAppendage4.mirror = true; + hornAppendage4.addBox(-5F, -6F, 1F, 1, 1, 1); + hornAppendage4.setRotationPoint(0F, -10F, 0F); + hornAppendage4.setTextureSize(64, 64); + hornAppendage4.mirror = true; + setRotation(hornAppendage4, 0F, 0F, 0F); + hornAppendage4.mirror = false; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Body.render(f5); + Torso.render(f5); + Head.render(f5); + leftArm.render(f5); + rightArm.render(f5); + leftLeg.render(f5); + leftFoot.render(f5); + rightLeg.render(f5); + rightFoot.render(f5); + leftHorn.render(f5); + hornAppendage1.render(f5); + hornAppendage2.render(f5); + rightHorn.render(f5); + hornAppendage3.render(f5); + hornAppendage4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setLivingAnimations(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4) + { + EntityLowerGuardian entityLowerGuardian = (EntityLowerGuardian) par1EntityLivingBase; + int i = entityLowerGuardian.getAttackTimer(); + + if (i > 0) + { + this.rightLeg.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float) i - par4, 10.0F); + this.rightFoot.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float) i - par4, 10.0F); + //this.ironGolemLeftArm.rotateAngleX = -2.0F + 1.5F * this.func_78172_a((float)i - par4, 10.0F); + } + } + + private float func_78172_a(float par1, float par2) + { + return (Math.abs(par1 % par2 - par2 * 0.5F) - par2 * 0.25F) / (par2 * 0.25F); + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.Head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.Head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftLeg.rotateAngleX = MathHelper.cos(f * 0.3662F) * 1.0F * f1; + this.rightLeg.rotateAngleX = MathHelper.cos(f * 0.3662F + (float) Math.PI) * 1.0F * f1; + this.leftFoot.rotateAngleX = MathHelper.cos(f * 0.3662F) * 1.0F * f1; + this.rightFoot.rotateAngleX = MathHelper.cos(f * 0.3662F + (float) Math.PI) * 1.0F * f1; + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.3662F + (float) Math.PI) * 1.0F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.3662F) * 1.0F * f1; + this.hornAppendage1.rotateAngleX = this.Head.rotateAngleX; + this.hornAppendage1.rotateAngleY = this.Head.rotateAngleY; + this.hornAppendage2.rotateAngleX = this.Head.rotateAngleX; + this.hornAppendage2.rotateAngleY = this.Head.rotateAngleY; + this.hornAppendage3.rotateAngleX = this.Head.rotateAngleX; + this.hornAppendage3.rotateAngleY = this.Head.rotateAngleY; + this.hornAppendage4.rotateAngleX = this.Head.rotateAngleX; + this.hornAppendage4.rotateAngleY = this.Head.rotateAngleY; + this.leftHorn.rotateAngleX = this.Head.rotateAngleX; + this.leftHorn.rotateAngleY = this.Head.rotateAngleY; + this.rightHorn.rotateAngleX = this.Head.rotateAngleX; + this.rightHorn.rotateAngleY = this.Head.rotateAngleY; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java new file mode 100644 index 00000000..26a94989 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java @@ -0,0 +1,90 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelMeteor extends ModelBase +{ + //fields + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + ModelRenderer Shape6; + ModelRenderer Shape7; + + public ModelMeteor() + { + textureWidth = 64; + textureHeight = 64; + Shape1 = new ModelRenderer(this, 0, 0); + Shape1.addBox(-8F, -8F, -8F, 16, 16, 16); + Shape1.setRotationPoint(0F, 0F, 0F); + Shape1.setTextureSize(64, 64); + Shape1.mirror = true; + setRotation(Shape1, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 0, 32); + Shape2.addBox(3F, -10F, -1F, 12, 12, 12); + Shape2.setRotationPoint(0F, 0F, 0F); + Shape2.setTextureSize(64, 64); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 32); + Shape3.addBox(0F, 0F, -10F, 12, 12, 12); + Shape3.setRotationPoint(0F, 0F, 0F); + Shape3.setTextureSize(64, 64); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 0, 32); + Shape4.addBox(1F, 2F, 2F, 12, 12, 12); + Shape4.setRotationPoint(0F, 0F, 0F); + Shape4.setTextureSize(64, 64); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + Shape5 = new ModelRenderer(this, 0, 32); + Shape5.addBox(-12F, -5F, 0F, 12, 12, 12); + Shape5.setRotationPoint(0F, 0F, 0F); + Shape5.setTextureSize(64, 64); + Shape5.mirror = true; + setRotation(Shape5, 0F, 0F, 0F); + Shape6 = new ModelRenderer(this, 0, 32); + Shape6.addBox(-13F, -2F, -11F, 12, 12, 12); + Shape6.setRotationPoint(0F, 0F, 0F); + Shape6.setTextureSize(64, 64); + Shape6.mirror = true; + setRotation(Shape6, 0F, 0F, 0F); + Shape7 = new ModelRenderer(this, 0, 32); + Shape7.addBox(-6F, -14F, -9F, 12, 12, 12); + Shape7.setRotationPoint(0F, 0F, 0F); + Shape7.setTextureSize(64, 64); + Shape7.mirror = true; + setRotation(Shape7, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + Shape1.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + Shape5.render(f5); + Shape6.render(f5); + Shape7.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java new file mode 100644 index 00000000..753df6a5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelPedestal extends ModelBase +{ + //fields + ModelRenderer base; + ModelRenderer top; + ModelRenderer middle; + + public ModelPedestal() + { + textureWidth = 64; + textureHeight = 32; + base = new ModelRenderer(this, 0, 0); + base.addBox(0F, 0F, 0F, 10, 1, 10); + base.setRotationPoint(-5F, 23F, -5F); + base.setTextureSize(64, 32); + base.mirror = true; + setRotation(base, 0F, 0F, 0F); + top = new ModelRenderer(this, 0, 19); + top.addBox(0F, 0F, 0F, 6, 1, 6); + top.setRotationPoint(-3F, 14F, -3F); + top.setTextureSize(64, 32); + top.mirror = true; + setRotation(top, 0F, 0F, 0F); + middle = new ModelRenderer(this, 50, 0); + middle.addBox(0F, 0F, 0F, 2, 8, 2); + middle.setRotationPoint(-1F, 15F, -1F); + middle.setTextureSize(64, 32); + middle.mirror = true; + setRotation(middle, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + base.render(f5); + top.render(f5); + middle.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java new file mode 100644 index 00000000..f4190b5d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java @@ -0,0 +1,90 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelPlinth extends ModelBase +{ + //fields + ModelRenderer base; + ModelRenderer table; + ModelRenderer pillar; + ModelRenderer edge1; + ModelRenderer edge2; + ModelRenderer edge3; + ModelRenderer edge4; + + public ModelPlinth() + { + textureWidth = 64; + textureHeight = 64; + base = new ModelRenderer(this, 0, 16); + base.addBox(0F, 0F, 0F, 10, 2, 10); + base.setRotationPoint(-5F, 22F, -5F); + base.setTextureSize(64, 64); + base.mirror = true; + setRotation(base, 0F, 0F, 0F); + table = new ModelRenderer(this, 0, 0); + table.addBox(0F, 0F, 0F, 14, 1, 14); + table.setRotationPoint(-7F, 11F, -7F); + table.setTextureSize(64, 64); + table.mirror = true; + setRotation(table, 0F, 0F, 0F); + pillar = new ModelRenderer(this, 0, 32); + pillar.addBox(0F, 0F, 0F, 6, 10, 6); + pillar.setRotationPoint(-3F, 12F, -3F); + pillar.setTextureSize(64, 64); + pillar.mirror = true; + setRotation(pillar, 0F, 0F, 0F); + edge1 = new ModelRenderer(this, 0, 29); + edge1.addBox(0F, 0F, 0F, 14, 1, 1); + edge1.setRotationPoint(-7F, 10F, 6F); + edge1.setTextureSize(64, 64); + edge1.mirror = true; + setRotation(edge1, 0F, 0F, 0F); + edge2 = new ModelRenderer(this, 0, 29); + edge2.addBox(0F, 0F, 0F, 14, 1, 1); + edge2.setRotationPoint(-7F, 10F, -7F); + edge2.setTextureSize(64, 64); + edge2.mirror = true; + setRotation(edge2, 0F, 0F, 0F); + edge3 = new ModelRenderer(this, 25, 32); + edge3.addBox(0F, 0F, 0F, 1, 1, 12); + edge3.setRotationPoint(-7F, 10F, -6F); + edge3.setTextureSize(64, 64); + edge3.mirror = true; + setRotation(edge3, 0F, 0F, 0F); + edge4 = new ModelRenderer(this, 25, 32); + edge4.addBox(0F, 0F, 0F, 1, 1, 12); + edge4.setRotationPoint(6F, 10F, -6F); + edge4.setTextureSize(64, 64); + edge4.mirror = true; + setRotation(edge4, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + base.render(f5); + table.render(f5); + pillar.render(f5); + edge1.render(f5); + edge2.render(f5); + edge3.render(f5); + edge4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java new file mode 100644 index 00000000..8a7f2632 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java @@ -0,0 +1,86 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelShade extends ModelBase +{ + //fields + ModelRenderer body; + ModelRenderer tail1; + ModelRenderer leftArm; + ModelRenderer rightArm; + ModelRenderer tail2; + ModelRenderer head; + + public ModelShade() + { + textureWidth = 64; + textureHeight = 64; + body = new ModelRenderer(this, 0, 45); + body.addBox(-6F, 0F, -3F, 12, 12, 6); + body.setRotationPoint(0F, -4F, 0F); + body.setTextureSize(64, 64); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + tail1 = new ModelRenderer(this, 37, 43); + tail1.addBox(-2F, 1F, -2F, 4, 6, 4); + tail1.setRotationPoint(0F, 8F, 0F); + tail1.setTextureSize(64, 64); + tail1.mirror = true; + setRotation(tail1, 0.122173F, 0F, 0F); + leftArm = new ModelRenderer(this, 0, 0); + leftArm.addBox(0F, -4F, -2F, 4, 20, 4); + leftArm.setRotationPoint(6F, -2F, 0F); + leftArm.setTextureSize(64, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + rightArm = new ModelRenderer(this, 0, 0); + rightArm.mirror = true; + rightArm.addBox(-4F, -4F, -2F, 4, 20, 4); + rightArm.setRotationPoint(-6F, -2F, 0F); + rightArm.setTextureSize(64, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + tail2 = new ModelRenderer(this, 37, 54); + tail2.addBox(-1.5F, 6F, -3F, 3, 6, 3); + tail2.setRotationPoint(0F, 8F, 0F); + tail2.setTextureSize(64, 64); + tail2.mirror = true; + setRotation(tail2, 0.4363323F, 0F, 0F); + head = new ModelRenderer(this, 17, 0); + head.addBox(-4F, -8F, -4F, 8, 8, 8); + head.setRotationPoint(0F, -4F, -1F); + head.setTextureSize(64, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + body.render(f5); + tail1.render(f5); + leftArm.render(f5); + rightArm.render(f5); + tail2.render(f5); + head.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java new file mode 100644 index 00000000..45a232de --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java @@ -0,0 +1,127 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelSmallEarthGolem extends ModelBase +{ + //fields + ModelRenderer leftLeg; + ModelRenderer rightLeg; + ModelRenderer body; + ModelRenderer head; + ModelRenderer chest1; + ModelRenderer chest2; + ModelRenderer chest3; + ModelRenderer leftArm; + ModelRenderer rightArm; + ModelRenderer back1; + + public ModelSmallEarthGolem() + { + textureWidth = 32; + textureHeight = 32; + leftLeg = new ModelRenderer(this, 13, 0); + leftLeg.addBox(-1F, 0F, -1F, 2, 5, 2); + leftLeg.setRotationPoint(1F, 19F, 0F); + leftLeg.setTextureSize(32, 32); + leftLeg.mirror = true; + setRotation(leftLeg, 0F, 0F, 0F); + rightLeg = new ModelRenderer(this, 13, 0); + rightLeg.mirror = true; + rightLeg.addBox(-1F, 0F, -1F, 2, 5, 2); + rightLeg.setRotationPoint(-1F, 19F, 0F); + rightLeg.setTextureSize(32, 32); + rightLeg.mirror = true; + setRotation(rightLeg, 0F, 0F, 0F); + rightLeg.mirror = false; + body = new ModelRenderer(this, 0, 7); + body.addBox(-2F, 0F, -1F, 4, 5, 2); + body.setRotationPoint(0F, 14F, 0F); + body.setTextureSize(32, 32); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + head = new ModelRenderer(this, 0, 0); + head.addBox(-1.5F, -3F, -2F, 3, 3, 3); + head.setRotationPoint(0F, 14F, 0F); + head.setTextureSize(32, 32); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + chest1 = new ModelRenderer(this, 22, 0); + chest1.addBox(-1F, 0.5F, -2F, 2, 3, 1); + chest1.setRotationPoint(0F, 14F, 0F); + chest1.setTextureSize(32, 32); + chest1.mirror = true; + setRotation(chest1, 0F, 0F, 0F); + chest2 = new ModelRenderer(this, 22, 5); + chest2.addBox(1F, 1.5F, -2F, 1, 1, 1); + chest2.setRotationPoint(0F, 14F, 0F); + chest2.setTextureSize(32, 32); + chest2.mirror = true; + setRotation(chest2, 0F, 0F, 0F); + chest3 = new ModelRenderer(this, 22, 5); + chest3.mirror = true; + chest3.addBox(-2F, 1.5F, -2F, 1, 1, 1); + chest3.setRotationPoint(0F, 14F, 0F); + chest3.setTextureSize(32, 32); + chest3.mirror = true; + setRotation(chest3, 0F, 0F, 0F); + chest3.mirror = false; + leftArm = new ModelRenderer(this, 13, 7); + leftArm.addBox(0F, -1F, -1F, 2, 5, 2); + leftArm.setRotationPoint(2F, 15F, 0F); + leftArm.setTextureSize(32, 32); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + rightArm = new ModelRenderer(this, 13, 7); + rightArm.mirror = true; + rightArm.addBox(-2F, -1F, -1F, 2, 5, 2); + rightArm.setRotationPoint(-2F, 15F, 0F); + rightArm.setTextureSize(32, 32); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + back1 = new ModelRenderer(this, 22, 8); + back1.addBox(-1.5F, 1.5F, 1F, 3, 1, 1); + back1.setRotationPoint(0F, 14F, 0F); + back1.setTextureSize(32, 32); + back1.mirror = true; + setRotation(back1, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + leftLeg.render(f5); + rightLeg.render(f5); + body.render(f5); + head.render(f5); + chest1.render(f5); + chest2.render(f5); + chest3.render(f5); + leftArm.render(f5); + rightArm.render(f5); + back1.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.rightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.4F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java new file mode 100644 index 00000000..61110926 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java @@ -0,0 +1,332 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.util.ForgeDirection; + +public class ModelSpellEffectBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer frame1; + ModelRenderer frame2; + ModelRenderer frame3; + ModelRenderer frame4; + ModelRenderer frame5; + ModelRenderer frame6; + ModelRenderer frame7; + ModelRenderer frame8; + ModelRenderer frame9; + ModelRenderer frame10; + ModelRenderer frame11; + ModelRenderer frame12; + ModelRenderer inputSpacer1; + ModelRenderer inputFace; + ModelRenderer inputSpacer2; + ModelRenderer inputSpacer3; + ModelRenderer inputSpacer4; + ModelRenderer outputFace; + ModelRenderer outputPlug; + ModelRenderer outputSpacer1; + ModelRenderer outputSpacer2; + ModelRenderer outputSpacer3; + ModelRenderer outputSpacer4; + + public ModelSpellEffectBlock() + { + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + frame1 = new ModelRenderer(this, 16, 18); + frame1.addBox(3F, -3F, -5F, 2, 6, 2); + frame1.setRotationPoint(0F, 16F, 0F); + frame1.setTextureSize(64, 64); + frame1.mirror = true; + setRotation(frame1, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 0, 18); + frame2.addBox(-5F, -3F, -5F, 2, 6, 2); + frame2.setRotationPoint(0F, 16F, 0F); + frame2.setTextureSize(64, 64); + frame2.mirror = true; + setRotation(frame2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 13); + frame3.addBox(-5F, -5F, -5F, 10, 2, 2); + frame3.setRotationPoint(0F, 16F, 0F); + frame3.setTextureSize(64, 64); + frame3.mirror = true; + setRotation(frame3, 0F, 0F, 0F); + frame4 = new ModelRenderer(this, 0, 27); + frame4.addBox(-5F, 3F, -5F, 10, 2, 2); + frame4.setRotationPoint(0F, 16F, 0F); + frame4.setTextureSize(64, 64); + frame4.mirror = true; + setRotation(frame4, 0F, 0F, 0F); + frame5 = new ModelRenderer(this, 0, 34); + frame5.addBox(-5F, -5F, 3F, 10, 2, 2); + frame5.setRotationPoint(0F, 16F, 0F); + frame5.setTextureSize(64, 64); + frame5.mirror = true; + setRotation(frame5, 0F, 0F, 0F); + frame6 = new ModelRenderer(this, 0, 48); + frame6.addBox(-5F, 3F, 3F, 10, 2, 2); + frame6.setRotationPoint(0F, 16F, 0F); + frame6.setTextureSize(64, 64); + frame6.mirror = true; + setRotation(frame6, 0F, 0F, 0F); + frame7 = new ModelRenderer(this, 16, 39); + frame7.addBox(-5F, -3F, 3F, 2, 6, 2); + frame7.setRotationPoint(0F, 16F, 0F); + frame7.setTextureSize(64, 64); + frame7.mirror = true; + setRotation(frame7, 0F, 0F, 0F); + frame8 = new ModelRenderer(this, 0, 39); + frame8.addBox(3F, -3F, 3F, 2, 6, 2); + frame8.setRotationPoint(0F, 16F, 0F); + frame8.setTextureSize(64, 64); + frame8.mirror = true; + setRotation(frame8, 0F, 0F, 0F); + frame9 = new ModelRenderer(this, 25, 9); + frame9.addBox(-5F, 3F, -3F, 2, 2, 6); + frame9.setRotationPoint(0F, 16F, 0F); + frame9.setTextureSize(64, 64); + frame9.mirror = true; + setRotation(frame9, 0F, 0F, 0F); + frame10 = new ModelRenderer(this, 25, 0); + frame10.addBox(-5F, -5F, -3F, 2, 2, 6); + frame10.setRotationPoint(0F, 16F, 0F); + frame10.setTextureSize(64, 64); + frame10.mirror = true; + setRotation(frame10, 0F, 0F, 0F); + frame11 = new ModelRenderer(this, 42, 0); + frame11.addBox(3F, -5F, -3F, 2, 2, 6); + frame11.setRotationPoint(0F, 16F, 0F); + frame11.setTextureSize(64, 64); + frame11.mirror = true; + setRotation(frame11, 0F, 0F, 0F); + frame12 = new ModelRenderer(this, 42, 9); + frame12.addBox(3F, 3F, -3F, 2, 2, 6); + frame12.setRotationPoint(0F, 16F, 0F); + frame12.setTextureSize(64, 64); + frame12.mirror = true; + setRotation(frame12, 0F, 0F, 0F); + inputSpacer1 = new ModelRenderer(this, 25, 27); + inputSpacer1.addBox(3F, -5F, -8F, 2, 2, 3); + inputSpacer1.setRotationPoint(0F, 16F, 0F); + inputSpacer1.setTextureSize(64, 64); + inputSpacer1.mirror = true; + setRotation(inputSpacer1, 0F, 0F, 0F); + inputFace = new ModelRenderer(this, 38, 27); + inputFace.addBox(-2F, -2F, -8F, 4, 4, 5); + inputFace.setRotationPoint(0F, 16F, 0F); + inputFace.setTextureSize(64, 64); + inputFace.mirror = true; + setRotation(inputFace, 0F, 0F, 0F); + inputSpacer2 = new ModelRenderer(this, 25, 27); + inputSpacer2.addBox(-5F, -5F, -8F, 2, 2, 3); + inputSpacer2.setRotationPoint(0F, 16F, 0F); + inputSpacer2.setTextureSize(64, 64); + inputSpacer2.mirror = true; + setRotation(inputSpacer2, 0F, 0F, 0F); + inputSpacer3 = new ModelRenderer(this, 25, 27); + inputSpacer3.addBox(3F, 3F, -8F, 2, 2, 3); + inputSpacer3.setRotationPoint(0F, 16F, 0F); + inputSpacer3.setTextureSize(64, 64); + inputSpacer3.mirror = true; + setRotation(inputSpacer3, 0F, 0F, 0F); + inputSpacer4 = new ModelRenderer(this, 25, 27); + inputSpacer4.addBox(-5F, 3F, -8F, 2, 2, 3); + inputSpacer4.setRotationPoint(0F, 16F, 0F); + inputSpacer4.setTextureSize(64, 64); + inputSpacer4.mirror = true; + setRotation(inputSpacer4, 0F, 0F, 0F); + outputFace = new ModelRenderer(this, 38, 37); + outputFace.addBox(6F, -2F, -2F, 2, 4, 4); + outputFace.setRotationPoint(0F, 16F, 0F); + outputFace.setTextureSize(64, 64); + outputFace.mirror = true; + setRotation(outputFace, 0F, 0F, 0F); + outputPlug = new ModelRenderer(this, 36, 48); + outputPlug.addBox(3F, -3F, -3F, 2, 6, 6); + outputPlug.setRotationPoint(0F, 16F, 0F); + outputPlug.setTextureSize(64, 64); + outputPlug.mirror = true; + setRotation(outputPlug, 0F, 0F, 0F); + outputSpacer1 = new ModelRenderer(this, 25, 48); + outputSpacer1.addBox(5F, -5F, -5F, 3, 2, 2); + outputSpacer1.setRotationPoint(0F, 16F, 0F); + outputSpacer1.setTextureSize(64, 64); + outputSpacer1.mirror = true; + setRotation(outputSpacer1, 0F, 0F, 0F); + outputSpacer2 = new ModelRenderer(this, 25, 48); + outputSpacer2.addBox(5F, -5F, 3F, 3, 2, 2); + outputSpacer2.setRotationPoint(0F, 16F, 0F); + outputSpacer2.setTextureSize(64, 64); + outputSpacer2.mirror = true; + setRotation(outputSpacer2, 0F, 0F, 0F); + outputSpacer3 = new ModelRenderer(this, 25, 48); + outputSpacer3.addBox(5F, 3F, -5F, 3, 2, 2); + outputSpacer3.setRotationPoint(0F, 16F, 0F); + outputSpacer3.setTextureSize(64, 64); + outputSpacer3.mirror = true; + setRotation(outputSpacer3, 0F, 0F, 0F); + outputSpacer4 = new ModelRenderer(this, 25, 48); + outputSpacer4.addBox(5F, 3F, 3F, 3, 2, 2); + outputSpacer4.setRotationPoint(0F, 16F, 0F); + outputSpacer4.setTextureSize(64, 64); + outputSpacer4.mirror = true; + setRotation(outputSpacer4, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputFace, xInputRot, yInputRot, zInputRot); + this.setRotation(outputFace, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(inputSpacer1, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer2, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer3, xInputRot, yInputRot, zInputRot); + this.setRotation(inputSpacer4, xInputRot, yInputRot, zInputRot); + this.setRotation(outputPlug, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(outputSpacer4, xOutputRot, yOutputRot, zOutputRot); + + core.render(f5); + frame1.render(f5); + frame2.render(f5); + frame3.render(f5); + frame4.render(f5); + frame5.render(f5); + frame6.render(f5); + frame7.render(f5); + frame8.render(f5); + frame9.render(f5); + frame10.render(f5); + frame11.render(f5); + frame12.render(f5); + inputSpacer1.render(f5); + inputFace.render(f5); + inputSpacer2.render(f5); + inputSpacer3.render(f5); + inputSpacer4.render(f5); + outputFace.render(f5); + outputPlug.render(f5); + outputSpacer1.render(f5); + outputSpacer2.render(f5); + outputSpacer3.render(f5); + outputSpacer4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java new file mode 100644 index 00000000..07164ffd --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java @@ -0,0 +1,203 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +public class ModelWingedFireDemon extends ModelBase +{ + //fields + ModelRenderer leftLegPlate; + ModelRenderer leftLeg; + ModelRenderer codPiece; + ModelRenderer rightLegPlate; + ModelRenderer rightLeg; + ModelRenderer body; + ModelRenderer leftShoulder; + ModelRenderer leftArm; + ModelRenderer head; + ModelRenderer rightShoulder; + ModelRenderer rightArm; + ModelRenderer leftWing; + ModelRenderer rightWing; + ModelRenderer leftHorn1; + ModelRenderer rightHorn1; + ModelRenderer leftHorn2; + ModelRenderer rightHorn2; + + public ModelWingedFireDemon() + { + textureWidth = 64; + textureHeight = 64; + leftLegPlate = new ModelRenderer(this, 40, 36); + leftLegPlate.addBox(0F, -3F, -3F, 6, 6, 6); + leftLegPlate.setRotationPoint(2F, 5F, 0F); + leftLegPlate.setTextureSize(64, 64); + leftLegPlate.mirror = true; + setRotation(leftLegPlate, 0F, 0F, 0F); + leftLeg = new ModelRenderer(this, 48, 16); + leftLeg.addBox(1F, 3F, -2F, 4, 16, 4); + leftLeg.setRotationPoint(2F, 5F, 0F); + leftLeg.setTextureSize(64, 64); + leftLeg.mirror = true; + setRotation(leftLeg, 0F, 0F, 0F); + codPiece = new ModelRenderer(this, 48, 0); + codPiece.addBox(-2F, 0F, -2F, 4, 6, 4); + codPiece.setRotationPoint(0F, 1F, 0F); + codPiece.setTextureSize(64, 64); + codPiece.mirror = true; + setRotation(codPiece, 0F, 0F, 0F); + rightLegPlate = new ModelRenderer(this, 40, 36); + rightLegPlate.mirror = true; + rightLegPlate.addBox(-6F, -3F, -3F, 6, 6, 6); + rightLegPlate.setRotationPoint(-2F, 5F, 0F); + rightLegPlate.setTextureSize(64, 64); + rightLegPlate.mirror = true; + setRotation(rightLegPlate, 0F, 0F, 0F); + rightLegPlate.mirror = false; + rightLeg = new ModelRenderer(this, 48, 16); + rightLeg.mirror = true; + rightLeg.addBox(-5F, 3F, -2F, 4, 16, 4); + rightLeg.setRotationPoint(-2F, 5F, 0F); + rightLeg.setTextureSize(64, 64); + rightLeg.mirror = true; + setRotation(rightLeg, 0F, 0F, 0F); + rightLeg.mirror = false; + body = new ModelRenderer(this, 0, 44); + body.addBox(-5F, -14F, -3F, 10, 14, 6); + body.setRotationPoint(0F, 1F, 0F); + body.setTextureSize(64, 64); + body.mirror = true; + setRotation(body, 0F, 0F, 0F); + leftShoulder = new ModelRenderer(this, 0, 29); + leftShoulder.addBox(0F, -5F, -4F, 8, 7, 8); + leftShoulder.setRotationPoint(5F, -10F, 0F); + leftShoulder.setTextureSize(64, 64); + leftShoulder.mirror = true; + setRotation(leftShoulder, 0F, 0F, 0F); + leftArm = new ModelRenderer(this, 32, 0); + leftArm.addBox(3F, 2F, -2F, 4, 12, 4); + leftArm.setRotationPoint(5F, -10F, 0F); + leftArm.setTextureSize(64, 64); + leftArm.mirror = true; + setRotation(leftArm, 0F, 0F, 0F); + head = new ModelRenderer(this, 32, 48); + head.addBox(-4F, -7F, -4F, 8, 8, 8); + head.setRotationPoint(0F, -14F, -1F); + head.setTextureSize(64, 64); + head.mirror = true; + setRotation(head, 0F, 0F, 0F); + rightShoulder = new ModelRenderer(this, 0, 29); + rightShoulder.mirror = true; + rightShoulder.mirror = true; + rightShoulder.addBox(-8F, -5F, -4F, 8, 7, 8); + rightShoulder.setRotationPoint(-5F, -10F, 0F); + rightShoulder.setTextureSize(64, 64); + rightShoulder.mirror = true; + setRotation(rightShoulder, 0F, 0F, 0F); + rightShoulder.mirror = false; + rightArm = new ModelRenderer(this, 32, 0); + rightArm.mirror = true; + rightArm.mirror = true; + rightArm.addBox(-7F, 2F, -2F, 4, 12, 4); + rightArm.setRotationPoint(-5F, -10F, 0F); + rightArm.setTextureSize(64, 64); + rightArm.mirror = true; + setRotation(rightArm, 0F, 0F, 0F); + rightArm.mirror = false; + leftWing = new ModelRenderer(this, 0, 0); + leftWing.addBox(0F, -2F, 0F, 16, 12, 0); + leftWing.setRotationPoint(0F, -11F, 3F); + leftWing.setTextureSize(64, 64); + leftWing.mirror = true; + setRotation(leftWing, 0F, -0.5061455F, 0F); + rightWing = new ModelRenderer(this, 0, 0); + rightWing.mirror = true; + rightWing.addBox(-16F, -2F, 0F, 16, 12, 0); + rightWing.setRotationPoint(0F, -11F, 3F); + rightWing.setTextureSize(64, 64); + rightWing.mirror = true; + setRotation(rightWing, 0F, 0.5061455F, 0F); + rightWing.mirror = false; + leftHorn1 = new ModelRenderer(this, 0, 12); + leftHorn1.addBox(4F, -9F, -1F, 1, 5, 1); + leftHorn1.setRotationPoint(0F, -14F, -1F); + leftHorn1.setTextureSize(64, 64); + leftHorn1.mirror = true; + setRotation(leftHorn1, 0F, 0F, 0F); + rightHorn1 = new ModelRenderer(this, 0, 12); + rightHorn1.mirror = true; + rightHorn1.addBox(-5F, -9F, -1F, 1, 5, 1); + rightHorn1.setRotationPoint(0F, -14F, -1F); + rightHorn1.setTextureSize(64, 64); + rightHorn1.mirror = true; + setRotation(rightHorn1, 0F, 0F, 0F); + rightHorn1.mirror = false; + leftHorn2 = new ModelRenderer(this, 4, 12); + leftHorn2.addBox(4F, -10F, 0F, 1, 5, 1); + leftHorn2.setRotationPoint(0F, -14F, -1F); + leftHorn2.setTextureSize(64, 64); + leftHorn2.mirror = true; + setRotation(leftHorn2, 0F, 0F, 0F); + rightHorn2 = new ModelRenderer(this, 4, 12); + rightHorn2.mirror = true; + rightHorn2.addBox(-5F, -10F, 0F, 1, 5, 1); + rightHorn2.setRotationPoint(0F, -14F, -1F); + rightHorn2.setTextureSize(64, 64); + rightHorn2.mirror = true; + setRotation(rightHorn2, 0F, 0F, 0F); + rightHorn2.mirror = false; + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + leftLegPlate.render(f5); + leftLeg.render(f5); + codPiece.render(f5); + rightLegPlate.render(f5); + rightLeg.render(f5); + body.render(f5); + leftShoulder.render(f5); + leftArm.render(f5); + head.render(f5); + rightShoulder.render(f5); + rightArm.render(f5); + leftWing.render(f5); + rightWing.render(f5); + leftHorn1.render(f5); + rightHorn1.render(f5); + leftHorn2.render(f5); + rightHorn2.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + this.head.rotateAngleX = f4 / (180F / (float) Math.PI); + this.head.rotateAngleY = f3 / (180F / (float) Math.PI); + this.leftHorn1.rotateAngleX = head.rotateAngleX; + this.leftHorn1.rotateAngleY = head.rotateAngleY; + this.leftHorn2.rotateAngleX = head.rotateAngleX; + this.leftHorn2.rotateAngleY = head.rotateAngleY; + this.rightHorn1.rotateAngleX = head.rotateAngleX; + this.rightHorn1.rotateAngleY = head.rotateAngleY; + this.rightHorn2.rotateAngleX = head.rotateAngleX; + this.rightHorn2.rotateAngleY = head.rotateAngleY; + this.leftLeg.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.rightLeg.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.0F * f1; + this.rightArm.rotateAngleX = MathHelper.cos(f * 0.6662F + (float) Math.PI) * 1.0F * f1; + this.leftArm.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1; + this.leftShoulder.rotateAngleX = this.leftArm.rotateAngleX; + this.rightShoulder.rotateAngleX = this.rightArm.rotateAngleX; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java new file mode 100644 index 00000000..15dede34 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java @@ -0,0 +1,138 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; + +public class ModelWritingTable extends ModelBase +{ + //fields + ModelRenderer base; + ModelRenderer support; + ModelRenderer appendage1; + ModelRenderer appendage2; + ModelRenderer appendage3; + ModelRenderer appendage4; + ModelRenderer appendage5; + ModelRenderer outputPad; + ModelRenderer input1; + ModelRenderer input5; + ModelRenderer input4; + ModelRenderer input3; + ModelRenderer Shape1; + + public ModelWritingTable() + { + textureWidth = 64; + textureHeight = 64; + base = new ModelRenderer(this, 0, 0); + base.addBox(0F, 0F, 0F, 16, 2, 16); + base.setRotationPoint(-8F, 22F, -8F); + base.setTextureSize(64, 32); + base.mirror = true; + setRotation(base, 0F, 0F, 0F); + support = new ModelRenderer(this, 0, 0); + support.addBox(0F, 0F, 0F, 2, 12, 2); + support.setRotationPoint(-1F, 10F, -1F); + support.setTextureSize(64, 32); + support.mirror = true; + setRotation(support, 0F, 0F, 0F); + appendage1 = new ModelRenderer(this, 48, 0); + appendage1.addBox(1F, 0F, 0F, 7, 11, 0); + appendage1.setRotationPoint(0F, 10F, 0F); + appendage1.setTextureSize(64, 32); + appendage1.mirror = true; + setRotation(appendage1, 0F, 0F, 0F); + appendage2 = new ModelRenderer(this, 48, 0); + appendage2.addBox(1F, 0F, 0F, 7, 11, 0); + appendage2.setRotationPoint(0F, 10F, 0F); + appendage2.setTextureSize(64, 32); + appendage2.mirror = true; + setRotation(appendage2, 0F, ((float) Math.PI * 2F / 5F), 0F); + appendage3 = new ModelRenderer(this, 48, 0); + appendage3.addBox(1F, 0F, 0F, 7, 11, 0); + appendage3.setRotationPoint(0F, 10F, 0F); + appendage3.setTextureSize(64, 32); + appendage3.mirror = true; + setRotation(appendage3, 0F, 2.513274F, 0F); + appendage4 = new ModelRenderer(this, 48, 0); + appendage4.addBox(1F, 0F, 0F, 7, 11, 0); + appendage4.setRotationPoint(0F, 10F, 0F); + appendage4.setTextureSize(64, 32); + appendage4.mirror = true; + setRotation(appendage4, 0F, -2.513274F, 0F); + appendage5 = new ModelRenderer(this, 48, 0); + appendage5.addBox(1F, 0F, 0F, 7, 11, 0); + appendage5.setRotationPoint(0F, 10F, 0F); + appendage5.setTextureSize(64, 32); + appendage5.mirror = true; + setRotation(appendage5, 0F, -((float) Math.PI * 2F / 5F), 0F); + outputPad = new ModelRenderer(this, 0, 20); + outputPad.addBox(0F, 0F, 0F, 4, 1, 4); + outputPad.setRotationPoint(-2F, 9F, -2F); + outputPad.setTextureSize(64, 64); + outputPad.mirror = true; + setRotation(outputPad, 0F, 0F, 0F); + input1 = new ModelRenderer(this, 0, 20); + input1.addBox(4F, 0F, -2F, 4, 1, 4); + input1.setRotationPoint(0F, 21F, 0F); + input1.setTextureSize(64, 64); + input1.mirror = true; + setRotation(input1, 0F, 0F, 0F); + input5 = new ModelRenderer(this, 0, 20); + input5.addBox(0F, 0F, 0F, 4, 1, 4); + input5.setRotationPoint(0F, 21F, -8F); + input5.setTextureSize(64, 64); + input5.mirror = true; + setRotation(input5, 0F, 0F, 0F); + input4 = new ModelRenderer(this, 0, 20); + input4.addBox(-7F, 0F, -6F, 4, 1, 4); + input4.setRotationPoint(0F, 21F, 0F); + input4.setTextureSize(64, 64); + input4.mirror = true; + setRotation(input4, 0F, 0F, 0F); + input3 = new ModelRenderer(this, 0, 20); + input3.addBox(-7F, 0F, 2F, 4, 1, 4); + input3.setRotationPoint(0F, 21F, 0F); + input3.setTextureSize(64, 64); + input3.mirror = true; + setRotation(input3, 0F, 0F, 0F); + Shape1 = new ModelRenderer(this, 0, 20); + Shape1.addBox(0F, 0F, 4F, 4, 1, 4); + Shape1.setRotationPoint(0F, 21F, 0F); + Shape1.setTextureSize(64, 64); + Shape1.mirror = true; + setRotation(Shape1, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + base.render(f5); + support.render(f5); + appendage1.render(f5); + appendage2.render(f5); + appendage3.render(f5); + appendage4.render(f5); + appendage5.render(f5); + outputPad.render(f5); + input1.render(f5); + input5.render(f5); + input4.render(f5); + input3.render(f5); + Shape1.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..57df9912 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.renderer.projectile; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelEnergyBazookaMainProjectile; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderEnergyBazookaMainProjectile extends Render +{ + public ModelBase model = new ModelEnergyBazookaMainProjectile(); + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/EnergyBazookaMainProjectile.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + private float scale = 1.0f; + + @Override + public void doRender(Entity entity, double d0, double d1, double d2, float f, float f1) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0, (float) d1, (float) d2); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(scale, scale, scale); + this.bindTexture(this.getEntityTexture(entity)); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0f - entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1, 1.0F, 0.0F, 0.0f); + model.render(entity, 0, (float) d0, (float) d1, (float) d2, f, f1); + //GL11.glRotatef(entity.getRotationYawHead(), 0.0F, 1.0F, 0.0F); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) + { + // TODO Auto-generated method stub + return field_110833_a; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java new file mode 100644 index 00000000..787ec4ad --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java @@ -0,0 +1,91 @@ +package WayofTime.alchemicalWizardry.common.renderer.projectile; + +import WayofTime.alchemicalWizardry.common.entity.projectile.*; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +@SideOnly(Side.CLIENT) +public class RenderEnergyBlastProjectile extends Render +{ + public void doRenderEnergyBlastProjectile(EnergyBlastProjectile entityShot, double par2, double par4, double par6, float par8, float par9) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) par2, (float) par4, (float) par6); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(0.1F, 0.1F, 0.1F); + this.bindTexture(this.getEntityTexture(entityShot)); + Tessellator var12 = Tessellator.instance; + GL11.glRotatef(180.0F - renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + var12.startDrawingQuads(); + var12.setNormal(0.0F, 1.0F, 0.0F); + var12.addVertexWithUV(-0.5F, -0.25F, 0.0D, 0, 1); + var12.addVertexWithUV(0.5F, -0.25F, 0.0D, 1, 1); + var12.addVertexWithUV(0.5F, 0.75F, 0.0D, 1, 0); + var12.addVertexWithUV(-0.5F, 0.75F, 0.0D, 0, 0); + var12.draw(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + @Override + public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) + { + if (par1Entity instanceof EnergyBlastProjectile) + { + this.doRenderEnergyBlastProjectile((EnergyBlastProjectile) par1Entity, par2, par4, par6, par8, par9); + } + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) + { + if (entity instanceof IceProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/iceProjectile.png"); + } + + if (entity instanceof FireProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/fireProjectile.png"); + } + + if (entity instanceof ExplosionProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/explosionProjectile.png"); + } + + if (entity instanceof HolyProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/holyProjectile.png"); + } + + if (entity instanceof WindGustProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/windGustProjectile.png"); + } + + if (entity instanceof LightningBoltProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/lightningProjectile.png"); + } + + if (entity instanceof WaterProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/waterProjectile.png"); + } + + if (entity instanceof MudProjectile) + { + return new ResourceLocation("alchemicalwizardry", "textures/entities/mudProjectile.png"); + } + + return new ResourceLocation("alchemicalwizardry", "textures/entities/energyBlastProjectile.png"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java new file mode 100644 index 00000000..cda739fe --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java @@ -0,0 +1,41 @@ +package WayofTime.alchemicalWizardry.common.renderer.projectile; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderFireProjectile +{ +// public void doRenderProjectile(FireProjectile entityShot, double par2, double par4, double par6, float par8, float par9) +// { +// GL11.glPushMatrix(); +// GL11.glTranslatef((float)par2, (float)par4, (float)par6); +// GL11.glEnable(GL12.GL_RESCALE_NORMAL); +// GL11.glScalef(0.1F, 0.1F, 0.1F); +// this.func_110776_a(this.func_110775_a(entityShot)); +// Tessellator var12 = Tessellator.instance; +// GL11.glRotatef(180.0F - renderManager.playerViewY, 0.0F, 1.0F, 0.0F); +// GL11.glRotatef(-renderManager.playerViewX, 1.0F, 0.0F, 0.0F); +// var12.startDrawingQuads(); +// var12.setNormal(0.0F, 1.0F, 0.0F); +// var12.addVertexWithUV(-0.5F, -0.25F, 0.0D, 0, 1); +// var12.addVertexWithUV(0.5F, -0.25F, 0.0D, 1, 1); +// var12.addVertexWithUV(0.5F, 0.75F, 0.0D, 1, 0); +// var12.addVertexWithUV(-0.5F, 0.75F, 0.0D, 0, 0); +// var12.draw(); +// GL11.glDisable(GL12.GL_RESCALE_NORMAL); +// GL11.glPopMatrix(); +// } +// +// @Override +// public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) +// { +// this.doRenderProjectile((FireProjectile)par1Entity, par2, par4, par6, par8, par9); +// } +// +// @Override +// protected ResourceLocation func_110775_a(Entity entity) +// { +// return new ResourceLocation("alchemicalwizardry:/textures/entities/fireProjectile.png"); +// } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java new file mode 100644 index 00000000..c39dcb11 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.renderer.projectile; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelMeteor; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +public class RenderMeteor extends Render +{ + public ModelBase model = new ModelMeteor(); + private static final ResourceLocation field_110833_a = new ResourceLocation("alchemicalwizardry", "textures/models/Meteor.png"); //refers to:YourMod/modelsTextureFile/optionalFile/yourTexture.png + private float scale = 1.0f; + + @Override + public void doRender(Entity entity, double d0, double d1, double d2, float f, float f1) + { + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0, (float) d1, (float) d2); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glScalef(scale, scale, scale); + this.bindTexture(this.getEntityTexture(entity)); + GL11.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * f1, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0f - entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * f1, 1.0F, 0.0F, 0.0f); + model.render(entity, 0, (float) d0, (float) d1, (float) d2, f, f1); + //GL11.glRotatef(entity.getRotationYawHead(), 0.0F, 1.0F, 0.0F); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + GL11.glPopMatrix(); + } + + @Override + protected ResourceLocation getEntityTexture(Entity entity) + { + // TODO Auto-generated method stub + return field_110833_a; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualComponent.java new file mode 100644 index 00000000..e929ac69 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualComponent.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +public class RitualComponent +{ + private int x; + private int y; + private int z; + private int stoneType; + public static final int BLANK = 0; + public static final int WATER = 1; + public static final int FIRE = 2; + public static final int EARTH = 3; + public static final int AIR = 4; + public static final int DUSK = 5; + + public RitualComponent(int x, int y, int z, int stoneType) + { + this.x = x; + this.y = y; + this.z = z; + this.stoneType = stoneType; + } + + public int getX() + { + return this.x; + } + + public int getY() + { + return this.y; + } + + public int getZ() + { + return this.z; + } + + public int getStoneType() + { + return this.stoneType; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffect.java new file mode 100644 index 00000000..4652c83c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public abstract class RitualEffect +{ + public abstract void performEffect(TEMasterStone ritualStone); + + public abstract int getCostPerRefresh(); + + public int getInitialCooldown() + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java new file mode 100644 index 00000000..886effc4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java @@ -0,0 +1,93 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityAgeable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectAnimalGrowth extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.getWorldTime() % 20 != 0) + { + return; + } + + int d0 = 2; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y + 1, (double) z, (double) (x + 1), (double) (y + 3), (double) (z + 1)).expand(d0, 0, d0); + List list = world.getEntitiesWithinAABB(EntityAgeable.class, axisalignedbb); + Iterator iterator1 = list.iterator(); + EntityAgeable entity; + int entityCount = 0; + boolean flag = false; + + while (iterator1.hasNext()) + { + entity = (EntityAgeable) iterator1.next(); + entityCount++; + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + Iterator iterator2 = list.iterator(); + entityCount = 0; + + while (iterator2.hasNext()) + { + entity = (EntityAgeable) iterator2.next(); + + if (entity.getGrowingAge() < 0) + { + entity.addGrowth(5); + entityCount++; + } + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 2; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java new file mode 100644 index 00000000..f52a9dd9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java @@ -0,0 +1,81 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectApiaryOverclock extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { +// TileEntity tile = world.getTileEntity(x, y+1, z); +// +// try{ +// if(tile instanceof IBeeHousing && tile.getClass().getName().contains("Apiary")) +// { +// for (int i = 0; i < 10; i++) +// { +// PacketDispatcher.sendPacketToAllPlayers(TEAltar.getParticlePacket(x, y+1, z, (short) 3)); +// } +// +// for(int i=0; i<9; i++) +// { +// tile.updateEntity(); +// } +// +// data.currentEssence = currentEssence - this.getCostPerRefresh(); +// data.markDirty(); +// } +// }catch (Exception e) +// { +// +// } + + + } + + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 10; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java new file mode 100644 index 00000000..5374368d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java @@ -0,0 +1,318 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import net.minecraft.block.Block; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; + +public class RitualEffectBiomeChanger extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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 cooldown = ritualStone.getCooldown(); + + if (cooldown > 0) + { + ritualStone.setCooldown(cooldown - 1); + + if (ritualStone.getWorldObj().rand.nextInt(15) == 0) + { + ritualStone.getWorldObj().addWeatherEffect(new EntityLightningBolt(ritualStone.getWorldObj(), ritualStone.xCoord - 1 + ritualStone.getWorldObj().rand.nextInt(3), ritualStone.yCoord + 1, ritualStone.zCoord - 1 + ritualStone.getWorldObj().rand.nextInt(3))); + } + + return; + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + int range = 10; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + boolean[][] boolList = new boolean[range * 2 + 1][range * 2 + 1]; + + for (int i = 0; i < 2 * range + 1; i++) + { + for (int j = 0; j < 2 * range + 1; j++) + { + boolList[i][j] = false; + } + } + + boolList[range][range] = true; + boolean isReady = false; + + while (!isReady) + { + isReady = true; + + for (int i = 0; i < 2 * range + 1; i++) + { + for (int j = 0; j < 2 * range + 1; j++) + { + if (boolList[i][j]) + { + if (i - 1 >= 0 && !boolList[i - 1][j]) + { + Block block = world.getBlock(x - range + i - 1, y + 1, z - range + j); + + if (!ModBlocks.largeBloodStoneBrick.equals(block) && !ModBlocks.bloodStoneBrick.equals(block)) + { + boolList[i - 1][j] = true; + isReady = false; + } + } + + if (j - 1 >= 0 && !boolList[i][j - 1]) + { + Block block = world.getBlock(x - range + i, y + 1, z - range + j - 1); + + if (!ModBlocks.largeBloodStoneBrick.equals(block) && !ModBlocks.bloodStoneBrick.equals(block)) + { + boolList[i][j - 1] = true; + isReady = false; + } + } + + if (i + 1 <= 2 * range && !boolList[i + 1][j]) + { + Block block = world.getBlock(x - range + i + 1, y + 1, z - range + j); + + if (!ModBlocks.largeBloodStoneBrick.equals(block) && !ModBlocks.bloodStoneBrick.equals(block)) + { + boolList[i + 1][j] = true; + isReady = false; + } + } + + if (j + 1 <= 2 * range && !boolList[i][j + 1]) + { + Block block = world.getBlock(x - range + i, y + 1, z - range + j + 1); + + if (!ModBlocks.largeBloodStoneBrick.equals(block) && !ModBlocks.bloodStoneBrick.equals(block)) + { + boolList[i][j + 1] = true; + isReady = false; + } + } + } + } + } + } + + float temperature = 0.5f; + float humidity = 0.5f; + float acceptableRange = 0.1f; + + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + if (i == 0 && j == 0) + { + continue; + } + + boolean isItemConsumed = false; + TileEntity tileEntity = world.getTileEntity(x + i, y, z + j); + + if (!(tileEntity instanceof TEPlinth)) + { + continue; + } + + TEPlinth tilePlinth = (TEPlinth) tileEntity; + ItemStack itemStack = tilePlinth.getStackInSlot(0); + + if (itemStack != null) + { + Item itemTest = itemStack.getItem(); + + if (itemTest != null) + { + if (itemTest instanceof ItemBlock) + { + Block item = ((ItemBlock)itemTest).field_150939_a; + if (item == (Blocks.sand)) + { + humidity -= 0.1f; + isItemConsumed = true; + } else if (item == (Blocks.lapis_block)) + { + humidity += 0.4f; + isItemConsumed = true; + } else if (item == (Blocks.sand)) + { + humidity -= 0.1f; + isItemConsumed = true; + } else if (item == (Blocks.sandstone)) + { + humidity -= 0.2f; + isItemConsumed = true; + } else if (item == (Blocks.netherrack)) + { + humidity -= 0.4f; + isItemConsumed = true; + } else if (item == (Blocks.coal_block)) + { + temperature += 0.2f; + isItemConsumed = true; + } else if (item == (Blocks.ice)) + { + temperature -= 0.4f; + isItemConsumed = true; + } else if (item == (Blocks.snow)) + { + temperature -= 0.2f; + isItemConsumed = true; + } + } else if (itemTest.equals(Items.dye) && itemStack.getItemDamage() == 4) + { + humidity += 0.1f; + isItemConsumed = true; + } else if (itemTest.equals(Items.lava_bucket)) + { + temperature += 0.4f; + isItemConsumed = true; + } else if (itemTest.equals(Items.water_bucket)) + { + humidity += 0.2f; + isItemConsumed = true; + } else if (itemTest.equals(Items.coal)) + { + temperature += 0.1f; + isItemConsumed = true; + } else if (itemTest.equals(Items.snowball)) + { + temperature -= 0.1f; + isItemConsumed = true; + } + } + } + + if (isItemConsumed) + { + tilePlinth.setInventorySlotContents(0, null); + world.markBlockForUpdate(x + i, y, z + j); + world.addWeatherEffect(new EntityLightningBolt(world, x + i, y + 1, z + j)); + } + } + } + + boolean wantsSnow = false; + boolean wantsRain = true; + int biomeID = 1; + BiomeGenBase[] biomeList = BiomeGenBase.getBiomeGenArray(); + int iteration = 0; + + for (BiomeGenBase biome : biomeList) + { + if (biome == null) + { + continue; + } + + float temp = biome.temperature; + float rainfall = biome.rainfall; + temperature = Math.min(2.0f, Math.max(0.0f, temperature)); + humidity = Math.min(2.0f, Math.max(0.0f, humidity)); + + if (Math.abs(rainfall - humidity) < acceptableRange && Math.abs(temperature - temp) < acceptableRange) + { + //if(biome.getEnableSnow()==wantsSnow) + { + biomeID = iteration; + break; + } + } + + iteration++; + } + + for (int i = 0; i < 2 * range + 1; i++) + { + for (int j = 0; j < 2 * range + 1; j++) + { + //Testing of traversal of boolean matrix + if (boolList[i][j]) + { + Chunk chunk = world.getChunkFromBlockCoords(x - range + i, z - range + j); + byte[] byteArray = chunk.getBiomeArray(); + int moduX = (x - range + i) % 16; + int moduZ = (z - range + j) % 16; + + if (moduX < 0) + { + moduX = moduX + 16; + } + + if (moduZ < 0) + { + moduZ = moduZ + 16; + } + + byteArray[moduZ * 16 + moduX] = (byte) biomeID; + chunk.setBiomeArray(byteArray); + //world.setBlock(x-range+i, y+1, z-range+j, Block.blockClay); + } + } + } + + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + ritualStone.setActive(false); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getInitialCooldown() + { + return 200; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java new file mode 100644 index 00000000..8b64e3cf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java @@ -0,0 +1,102 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectContainment extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 5; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, d0, d0); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityLivingBase livingEntity; + boolean flag = false; + + while (iterator.hasNext()) + { + livingEntity = (EntityLivingBase) iterator.next(); + + if (livingEntity instanceof EntityPlayer) + { + continue; + } + + //if (!(livingEntity.getEntityName().equals(owner))) + { + double xDif = livingEntity.posX - (x + 0.5); + double yDif = livingEntity.posY - (y + 3); + double zDif = livingEntity.posZ - (z + 0.5); + livingEntity.motionX = -0.05 * xDif; + livingEntity.motionY = -0.05 * yDif; + livingEntity.motionZ = -0.05 * zDif; + flag = true; + //livingEntity.setVelocity(-0.05 * xDif, -0.05 * yDif, -0.05 * zDif); + + if (world.rand.nextInt(10) == 0) + { + //PacketDispatcher.sendPacketToAllPlayers(TEAltar.getParticlePacket(livingEntity.posX, livingEntity.posY, livingEntity.posZ, (short) 1)); + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 1, x, y, z); + } + + livingEntity.fallDistance = 0; + //entityplayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } + } + + if (world.getWorldTime() % 2 == 0 && flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java new file mode 100644 index 00000000..e0c5d819 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java @@ -0,0 +1,159 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import java.util.ArrayList; + +public class RitualEffectCrushing extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + + if (world.getWorldTime() % 40 != 0) + { + return; + } + + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + TileEntity tile = world.getTileEntity(x, y + 1, z); + IInventory tileEntity; + + if (tile instanceof IInventory) + { + tileEntity = (IInventory) tile; + } else + { + return; + } + + if (tileEntity.getSizeInventory() <= 0) + { + return; + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + //boolean flag = false; + for (int j = -3; j < 0; j++) + { + for (int i = -1; i <= 1; i++) + { + for (int k = -1; k <= 1; k++) + { + Block block = world.getBlock(x + i, y + j, z + k); + int meta = world.getBlockMetadata(x + i, y + j, z + k); + + if (block != null) + { + if ((block.equals(ModBlocks.ritualStone) || block.equals(ModBlocks.blockMasterStone))) + { + continue; + } + + ArrayList itemDropList = block.getDrops(world, x + i, y + j, z + k, meta, 0); + + if (itemDropList != null) + { + int invSize = tileEntity.getSizeInventory(); + + for (ItemStack item : itemDropList) + { + ItemStack copyStack = item.copyItemStack(item); + + for (int n = 0; n < invSize; n++) + { + if (tileEntity.isItemValidForSlot(n, copyStack) && copyStack.stackSize != 0) + { + ItemStack itemStack = tileEntity.getStackInSlot(n); + + if (itemStack == null) + { + tileEntity.setInventorySlotContents(n, copyStack); + copyStack.stackSize = 0; + } else + { + if (itemStack.getItem().equals(copyStack.getItem())) + { + int itemSize = itemStack.stackSize; + int copySize = copyStack.stackSize; + int maxSize = itemStack.getMaxStackSize(); + + if (copySize + itemSize < maxSize) + { + copyStack.stackSize = 0; + itemStack.stackSize = itemSize + copySize; + tileEntity.setInventorySlotContents(n, itemStack); + } else + { + copyStack.stackSize = itemSize + copySize - maxSize; + itemStack.stackSize = maxSize; + } + } + } + } + } + + if (copyStack.stackSize > 0) + { + world.spawnEntityInWorld(new EntityItem(world, x + 0.4, y + 2, z + 0.5, copyStack)); + //flag=true; + } + } + } + + //if(flag) + world.setBlockToAir(x + i, y + j, z + k); + world.playSoundEffect(x + i, y + j, z + k, "mob.endermen.portal", 1.0F, 1.0F); + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + return; + } + } + } + } + } + } + + @Override + public int getCostPerRefresh() + { + return 7; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java new file mode 100644 index 00000000..19c23d46 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java @@ -0,0 +1,90 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.List; + +public class RitualEffectFeatheredEarth extends RitualEffect //Nullifies all fall damage in the area of effect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (ritualStone.getCooldown() > 0) + { + world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 5, z + 4)); + world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 5, z - 4)); + world.addWeatherEffect(new EntityLightningBolt(world, x - 4, y + 5, z - 4)); + world.addWeatherEffect(new EntityLightningBolt(world, x - 4, y + 5, z + 4)); + ritualStone.setCooldown(0); + } + + int range = 20; + int verticalRange = 30; + List entities = world.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(range, verticalRange, range)); + int entityCount = 0; + boolean flag = false; + + for (EntityLivingBase entity : entities) + { + entityCount++; + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + for (EntityLivingBase entity : entities) + { + entity.fallDistance = 0; + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } + + @Override + public int getInitialCooldown() + { + return 1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java new file mode 100644 index 00000000..792ea2f9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java @@ -0,0 +1,141 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.List; + +public class RitualEffectFeatheredKnife extends RitualEffect +{ + public final int timeDelay = 20; + public final int amount = 100; + + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.getWorldTime() % this.timeDelay != 0) + { + return; + } + +// if(!(world.getBlockTileEntity(x, y-1, z) instanceof TEAltar)) +// { +// return; +// } + TEAltar tileAltar = null; + boolean testFlag = false; + + for (int i = -5; i <= 5; i++) + { + for (int j = -5; j <= 5; j++) + { + for (int k = -10; k <= 10; k++) + { + if (world.getTileEntity(x + i, y + k, z + j) instanceof TEAltar) + { + tileAltar = (TEAltar) world.getTileEntity(x + i, y + k, z + j); + testFlag = true; + } + } + } + } + + if (!testFlag) + { + return; + } + + //tileAltar = (TEAltar)world.getBlockTileEntity(x,y-1,z); + int d0 = 15; + int vertRange = 20; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, vertRange, d0); + List list = world.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb); + Iterator iterator1 = list.iterator(); + EntityPlayer entity; + int entityCount = 0; + boolean flag = false; + + while (iterator1.hasNext()) + { + entity = (EntityPlayer) iterator1.next(); + + if (entity.getClass().equals(EntityPlayerMP.class) || entity.getClass().equals(EntityPlayer.class)) + { + entityCount++; + } + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + Iterator iterator2 = list.iterator(); + entityCount = 0; + + while (iterator2.hasNext()) + { + entity = (EntityPlayer) iterator2.next(); + + //entity = (EntityPlayer)iterator1.next(); + if (entity.getClass().equals(EntityPlayerMP.class) || entity.getClass().equals(EntityPlayer.class)) + { + if (entity.getHealth() > 6.2f) + { + entity.setHealth(entity.getHealth() - 1); + entityCount++; + tileAltar.sacrificialDaggerCall(this.amount, false); + } + } + + //entity.setHealth(entity.getHealth()-1); +// if(entity.getHealth()<=0.2f) +// { +// entity.onDeath(DamageSource.inFire); +// } + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 20; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java new file mode 100644 index 00000000..5f2af95f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java @@ -0,0 +1,88 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.List; + +public class RitualEffectFlight extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (ritualStone.getCooldown() > 0) + { + //TODO Cool stuffs + ritualStone.setCooldown(0); + } + + int range = 20; + int verticalRange = 30; + AxisAlignedBB axis = AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(range, verticalRange, range); + axis.maxY = 256; + axis.minY = 0; + List entities = world.getEntitiesWithinAABB(EntityPlayer.class, axis); + int entityCount = 0; + + for (EntityPlayer entity : entities) + { + entityCount++; + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + for (EntityPlayer entity : entities) + { + entity.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionFlight.id, 20, 0)); + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } + + @Override + public int getInitialCooldown() + { + return 1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java new file mode 100644 index 00000000..29eccf22 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java @@ -0,0 +1,84 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +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.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectGrowth extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + 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; + } + + boolean flag = false; + + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + Block block = world.getBlock(x + i, y + 2, z + j); + + if (block instanceof IPlantable) + { + { + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 3, x, y, z); + block.updateTick(world, x + i, y + 2, z + j, world.rand); + flag = true; + } + } + } + } + + if (flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 100; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java new file mode 100644 index 00000000..5cc4afd1 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java @@ -0,0 +1,126 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.List; + +public class RitualEffectHealing extends RitualEffect +{ + public final int timeDelay = 50; + //public final int amount = 10; + + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.getWorldTime() % this.timeDelay != 0) + { + return; + } + +// if(!(world.getBlockTileEntity(x, y-1, z) instanceof TEAltar)) +// { +// return; +// } + //tileAltar = (TEAltar)world.getBlockTileEntity(x,y-1,z); + int d0 = 10; + int vertRange = 10; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, vertRange, d0); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator1 = list.iterator(); + EntityLivingBase entity; + int entityCount = 0; + boolean flag = false; + + while (iterator1.hasNext()) + { + entity = (EntityLivingBase) iterator1.next(); + + if (entity instanceof EntityPlayer) + { + entityCount += 10; + } else + { + entityCount++; + } + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + Iterator iterator2 = list.iterator(); + entityCount = 0; + + while (iterator2.hasNext()) + { + entity = (EntityLivingBase) iterator2.next(); + + if (entity.getHealth() + 0.1f < entity.getMaxHealth()) + { + entity.addPotionEffect(new PotionEffect(Potion.regeneration.id, timeDelay + 2, 0)); + + //entity.setHealth(entity.getHealth()-1); + + //entity.attackEntityFrom(DamageSource.outOfWorld, 1); + + if (entity instanceof EntityPlayer) + { + entityCount += 10; + } else + { + entityCount++; + } + } + +// if(entity.getHealth()<=0.2f) +// { +// entity.onDeath(DamageSource.inFire); +// } + //tileAltar.sacrificialDaggerCall(this.amount, true); + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 20; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java new file mode 100644 index 00000000..407db900 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java @@ -0,0 +1,94 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.List; + +public class RitualEffectInterdiction extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 5; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, d0, d0); + axisalignedbb.maxY = Math.min((double) world.getHeight(), (double) (y + 1 + d0)); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityLivingBase entityplayer; + boolean flag = false; + + while (iterator.hasNext()) + { + entityplayer = (EntityLivingBase) iterator.next(); + + if (!(entityplayer instanceof EntityPlayer && (SpellHelper.getUsername((EntityPlayer)entityplayer).equals(owner)))) + { + double xDif = entityplayer.posX - x; + double yDif = entityplayer.posY - (y + 1); + double zDif = entityplayer.posZ - z; + entityplayer.motionX = 0.1 * xDif; + entityplayer.motionY = 0.1 * yDif; + entityplayer.motionZ = 0.1 * zDif; + entityplayer.fallDistance = 0; + + if (!(entityplayer instanceof EntityPlayer)) + { + flag = true; + } + + //entityplayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } + } + + if (world.getWorldTime() % 2 == 0 && flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java new file mode 100644 index 00000000..68e14b3e --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java @@ -0,0 +1,99 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import ibxm.Player; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectJumping extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 0; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y + 1, (double) z, (double) (x + 1), (double) (y + 2), (double) (z + 1)).expand(d0, d0, d0); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityLivingBase entityplayer; + boolean flag = false; + + while (iterator.hasNext()) + { + entityplayer = (EntityLivingBase) iterator.next(); + + if (entityplayer instanceof EntityPlayer) + { + //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPlayerVelocitySettingPacket(entityplayer.motionX, 1.5, entityplayer.motionZ), (Player) entityplayer); + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, entityplayer.motionX, 1.5, entityplayer.motionZ); + entityplayer.motionY = 1.5; + entityplayer.fallDistance = 0; + flag = true; + } else + //if (!(entityplayer.getEntityName().equals(owner))) + { +// double xDif = entityplayer.posX - xCoord; +// double yDif = entityplayer.posY - (yCoord + 1); +// double zDif = entityplayer.posZ - zCoord; + //entityplayer.motionX=0.1*xDif; + entityplayer.motionY = 1.5; + //entityplayer.motionZ=0.1*zDif; + entityplayer.fallDistance = 0; + flag = true; + //entityplayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } + } + + if (flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 5; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java new file mode 100644 index 00000000..5be932a5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java @@ -0,0 +1,67 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectLava extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.isAirBlock(x, y + 1, z)) + { + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + for (int i = 0; i < 10; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 3, x, y, z); + } + + world.setBlock(x, y + 1, z, Blocks.lava, 0, 3); + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 500; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java new file mode 100644 index 00000000..37734a86 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java @@ -0,0 +1,139 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectLeap extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int direction = ritualStone.getDirection(); + int d0 = 2; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y - 1, (double) z, (double) (x + 1), (double) (y + 2), (double) (z + 1)).expand(d0, 0, d0); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityLivingBase entityplayer; + boolean flag = false; + + while (iterator.hasNext()) + { + entityplayer = (EntityLivingBase) iterator.next(); + + if (entityplayer instanceof EntityPlayer) + { + entityplayer.motionY = 1.2; + entityplayer.fallDistance = 0; + + switch (direction) + { + case 1: + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, 3.0); + break; + + case 2: + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 3.0, 1.2, 0); + break; + + case 3: + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, -3.0); + break; + + case 4: + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, -3.0, 1.2, 0); + break; + } + + flag = true; + } else + //if (!(entityplayer.getEntityName().equals(owner))) + { +// double xDif = entityplayer.posX - xCoord; +// double yDif = entityplayer.posY - (yCoord + 1); +// double zDif = entityplayer.posZ - zCoord; + //entityplayer.motionX=0.1*xDif; + entityplayer.motionY = 1.2; + + switch (direction) + { + case 1: + entityplayer.motionX = 0.0; + entityplayer.motionZ = -3.0; + break; + + case 2: + entityplayer.motionX = 3.0; + entityplayer.motionZ = 0.0; + break; + + case 3: + entityplayer.motionX = 0.0; + entityplayer.motionZ = -3.0; + break; + + case 4: + entityplayer.motionX = -3.0; + entityplayer.motionZ = 0.0; + break; + } + + //entityplayer.motionZ=0.1*zDif; + entityplayer.fallDistance = 0; + flag = true; + //entityplayer.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } + } + + if (flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 5; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java new file mode 100644 index 00000000..c137b655 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java @@ -0,0 +1,121 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +public class RitualEffectMagnetic extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.getWorldTime() % 40 != 0) + { + return; + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int xRep = 0; + int yRep = 0; + int zRep = 0; + boolean replace = false; + + for (int j = 1; j <= 3; j++) + { + for (int i = -1; i <= 1; i++) + { + for (int k = -1; k <= 1; k++) + { + if ((!replace) && world.isAirBlock(x + i, y + j, z + k)) + { + xRep = x + i; + yRep = y + j; + zRep = z + k; + replace = true; + } + } + } + } + + if (replace) + { + //boolean hasReplaced = false; + for (int j = y - 1; j >= 0; j--) + { + for (int i = -3; i <= 3; i++) + { + for (int k = -3; k <= 3; k++) + { + Block block = world.getBlock(x + i, j, z + k); + int meta = world.getBlockMetadata(x + i, j, z + k); + + if (block == null) + { + continue; + } + + ItemStack itemStack = new ItemStack(block, 1, meta); + int id = OreDictionary.getOreID(itemStack); + + if (id != -1) + { + String oreName = OreDictionary.getOreName(id); + + if (oreName.contains("ore")) + { + //TODO + //Allow swapping code. This means the searched block is an ore. + BlockTeleposer.swapBlocks(world, world, x + i, j, z + k, xRep, yRep, zRep); + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + return; + } + } + } + } + } + } + } + } + + @Override + public int getCostPerRefresh() + { + return 50; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java new file mode 100644 index 00000000..7c93c470 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java @@ -0,0 +1,209 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectSoulBound extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + if (ritualStone.getVar1() == 0) + { + int d0 = 0; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y + 1, (double) z, (double) (x + 1), (double) (y + 2), (double) (z + 1)).expand(d0, d0, d0); + List list = world.getEntitiesWithinAABB(EntityItem.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityItem item; + + while (iterator.hasNext()) + { + item = (EntityItem) iterator.next(); +// double xDif = item.posX - (xCoord+0.5); +// double yDif = item.posY - (yCoord+1); +// double zDif = item.posZ - (zCoord+0.5); + ItemStack itemStack = item.getEntityItem(); + + if (itemStack == null) + { + continue; + } + + ItemStack itemGoggles = null; + + if (AlchemicalWizardry.isThaumcraftLoaded) + { + //itemGoggles = ItemApi.getItem("itemGoggles", 0); + } + + if (itemStack.getItem() == ModItems.apprenticeBloodOrb) + { + ritualStone.setVar1(Item.getIdFromItem(ModItems.energyBlaster)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + return; + } else if (itemStack.getItem() == Items.diamond_sword) + { + ritualStone.setVar1(Item.getIdFromItem(ModItems.energySword)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + return; + } else if (itemStack.getItem() == Items.diamond_pickaxe) + { + ritualStone.setVar1(Item.getIdFromItem(ModItems.boundPickaxe)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + return; + } else if (itemStack.getItem() == Items.diamond_axe) + { + ritualStone.setVar1(Item.getIdFromItem(ModItems.boundAxe)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + return; + } else if (itemStack.getItem() == Items.diamond_shovel) + { + ritualStone.setVar1(Item.getIdFromItem(ModItems.boundShovel)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + return; + } +// else if (itemGoggles != null && itemGoggles.isItemEqual(itemStack)) +// { +// ritualStone.setVar1(Item.getIdFromItem(ModItems.sanguineHelmet)); +// world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); +// ritualStone.setCooldown(ritualStone.getCooldown() - 1); +// item.setDead(); +// return; +// } + + if (world.rand.nextInt(10) == 0) + { + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 1, x, y, z); + } + } + + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } else + { + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + + if (world.rand.nextInt(20) == 0) + { + int lightningPoint = world.rand.nextInt(8); + + switch (lightningPoint) + { + case 0: + world.addWeatherEffect(new EntityLightningBolt(world, x + 4, y + 3, z + 0)); + break; + + case 1: + world.addWeatherEffect(new EntityLightningBolt(world, x - 4, y + 3, z + 0)); + break; + + case 2: + world.addWeatherEffect(new EntityLightningBolt(world, x + 0, y + 3, z + 4)); + break; + + case 3: + world.addWeatherEffect(new EntityLightningBolt(world, x + 0, y + 3, z - 4)); + break; + + case 4: + world.addWeatherEffect(new EntityLightningBolt(world, x + 3, y + 3, z + 3)); + break; + + case 5: + world.addWeatherEffect(new EntityLightningBolt(world, x - 3, y + 3, z + 3)); + break; + + case 6: + world.addWeatherEffect(new EntityLightningBolt(world, x + 3, y + 3, z - 3)); + break; + + case 7: + world.addWeatherEffect(new EntityLightningBolt(world, x - 3, y + 3, z - 3)); + break; + } + } + + if (ritualStone.getCooldown() <= 0) + { + ItemStack spawnedItem = new ItemStack(Item.getItemById(ritualStone.getVar1()), 1, 0); + + if (spawnedItem != null) + { + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, spawnedItem); + world.spawnEntityInWorld(newItem); + } + + ritualStone.setActive(false); + } + } + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } + + @Override + public int getInitialCooldown() + { + return 200; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java new file mode 100644 index 00000000..a7173b4d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java @@ -0,0 +1,91 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; +import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorRegistry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +import java.util.List; + +public class RitualEffectSummonMeteor extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (ritualStone.getCooldown() > 0) + { + ritualStone.setCooldown(0); + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + List entities = world.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(x, y + 1, z, x + 1, y + 2, z + 1)); + + if (entities == null) + { + return; + } + + for (EntityItem entityItem : entities) + { + if (entityItem != null && MeteorRegistry.isValidParadigmItem(entityItem.getEntityItem())) + { + int meteorID = MeteorRegistry.getParadigmIDForItem(entityItem.getEntityItem()); + EntityMeteor meteor = new EntityMeteor(world, x + 0.5f, 257, z + 0.5f, meteorID); + meteor.motionY = -1.0f; + entityItem.setDead(); + world.spawnEntityInWorld(meteor); + ritualStone.setActive(false); + break; + } + } + +// EnergyBlastProjectile proj = new EnergyBlastProjectile(world, x, y+20, z); +// proj.motionX = 0.0d; +// proj.motionZ = 0.0d; +// proj.motionY = -1.0d; +// world.spawnEntityInWorld(proj); + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java new file mode 100644 index 00000000..6f0a1ab5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java @@ -0,0 +1,166 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +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; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.items.BoundArmour; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectUnbinding extends RitualEffect +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 0; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y + 1, (double) z, (double) (x + 1), (double) (y + 2), (double) (z + 1)).expand(d0, d0, d0); + List list = world.getEntitiesWithinAABB(EntityItem.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityItem item; + + while (iterator.hasNext()) + { + item = (EntityItem) iterator.next(); +// double xDif = item.posX - (xCoord+0.5); +// double yDif = item.posY - (yCoord+1); +// double zDif = item.posZ - (zCoord+0.5); + ItemStack itemStack = item.getEntityItem(); + + if (itemStack == null) + { + continue; + } + + if (itemStack.getItem() == ModItems.boundHelmet) + { + ritualStone.setVar1(5); + } else if (itemStack.getItem() == ModItems.boundPlate) + { + ritualStone.setVar1(8); + } else if (itemStack.getItem() == ModItems.boundLeggings) + { + ritualStone.setVar1(7); + } else if (itemStack.getItem() == ModItems.boundBoots) + { + ritualStone.setVar1(4); + } else if (itemStack.getItem() == ModItems.sigilOfHolding) + { + ritualStone.setVar1(-1); + } + + if (ritualStone.getVar1() > 0) + { + item.setDead(); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z - 5)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z + 5)); + world.addWeatherEffect(new EntityLightningBolt(world, x - 5, y + 1, z)); + world.addWeatherEffect(new EntityLightningBolt(world, x + 5, y + 1, z)); + NBTTagCompound itemTag = itemStack.stackTagCompound; + ItemStack[] inv = ((BoundArmour) itemStack.getItem()).getInternalInventory(itemStack); + + if (inv != null) + { + for (ItemStack internalItem : inv) + { + if (internalItem != null) + { + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, internalItem.copy()); + world.spawnEntityInWorld(newItem); + } + } + } + + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, new ItemStack(ModBlocks.bloodSocket, ritualStone.getVar1())); + world.spawnEntityInWorld(newItem); + ritualStone.setActive(false); + break; + } else if (ritualStone.getVar1() == -1) + { + item.setDead(); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z - 5)); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z + 5)); + world.addWeatherEffect(new EntityLightningBolt(world, x - 5, y + 1, z)); + world.addWeatherEffect(new EntityLightningBolt(world, x + 5, y + 1, z)); + NBTTagCompound itemTag = itemStack.stackTagCompound; + ItemStack[] inv = ((SigilOfHolding) itemStack.getItem()).getInternalInventory(itemStack); + + if (inv != null) + { + for (ItemStack internalItem : inv) + { + if (internalItem != null) + { + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, internalItem.copy()); + world.spawnEntityInWorld(newItem); + } + } + } + + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, new ItemStack(ModItems.sigilOfHolding, 1, 0)); + world.spawnEntityInWorld(newItem); + ritualStone.setActive(false); + break; + } + + if (world.rand.nextInt(10) == 0) + { + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 1, x, y, z); + } + } + + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java new file mode 100644 index 00000000..6483de50 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java @@ -0,0 +1,64 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectWater extends RitualEffect +{ + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.isAirBlock(x, y + 1, z)) + { + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + for (int i = 0; i < 10; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, x, y, z, 20, world.provider.dimensionId, 3, x, y, z); + } + + world.setBlock(x, y + 1, z, Blocks.water, 0, 3); + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + public int getCostPerRefresh() + { + return 25; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java new file mode 100644 index 00000000..390d3894 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java @@ -0,0 +1,135 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; + +import java.util.Iterator; +import java.util.List; + +public class RitualEffectWellOfSuffering extends RitualEffect +{ + public final int timeDelay = 25; + public final int amount = 10; + + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (world.getWorldTime() % this.timeDelay != 0) + { + return; + } + +// if(!(world.getBlockTileEntity(x, y-1, z) instanceof TEAltar)) +// { +// return; +// } + TEAltar tileAltar = null; + boolean testFlag = false; + + for (int i = -5; i <= 5; i++) + { + for (int j = -5; j <= 5; j++) + { + for (int k = -10; k <= 10; k++) + { + if (world.getTileEntity(x + i, y + k, z + j) instanceof TEAltar) + { + tileAltar = (TEAltar) world.getTileEntity(x + i, y + k, z + j); + testFlag = true; + } + } + } + } + + if (!testFlag) + { + return; + } + + //tileAltar = (TEAltar)world.getBlockTileEntity(x,y-1,z); + int d0 = 10; + int vertRange = 5; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, vertRange, d0); + List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator1 = list.iterator(); + EntityLivingBase entity; + int entityCount = 0; + boolean flag = false; + + while (iterator1.hasNext()) + { + entity = (EntityLivingBase) iterator1.next(); + entityCount++; + } + + if (currentEssence < this.getCostPerRefresh() * entityCount) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + Iterator iterator2 = list.iterator(); + entityCount = 0; + + while (iterator2.hasNext()) + { + entity = (EntityLivingBase) iterator2.next(); + + if (entity instanceof EntityPlayer) + { + continue; + } + + //entity.setHealth(entity.getHealth()-1); + entity.attackEntityFrom(DamageSource.outOfWorld, 1); + entityCount++; +// if(entity.getHealth()<=0.2f) +// { +// entity.onDeath(DamageSource.inFire); +// } + tileAltar.sacrificialDaggerCall(this.amount, true); + } + + data.currentEssence = currentEssence - this.getCostPerRefresh() * entityCount; + data.markDirty(); + } + } + + @Override + public int getCostPerRefresh() + { + // TODO Auto-generated method stub + return 2; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java new file mode 100644 index 00000000..d56d3e9c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java @@ -0,0 +1,1079 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import WayofTime.alchemicalWizardry.common.block.RitualStone; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; +import java.util.List; + +public class Rituals +{ + private List components; + private int crystalLevel; + private int actCost; + private RitualEffect effect; + private String name; + + public static List ritualList = new ArrayList(); + + public Rituals(List components, int crystalLevel, int actCost, RitualEffect effect, String name) + { + this.components = components; + this.crystalLevel = crystalLevel; + this.actCost = actCost; + this.effect = effect; + this.name = name; + } + + public Rituals(List components, int crystalLevel, int actCost, RitualEffect effect) + { + this.components = components; + this.crystalLevel = crystalLevel; + this.actCost = actCost; + this.effect = effect; + this.name = ""; + } + + //public static final int totalRituals = 1; + + public static int checkValidRitual(World world, int x, int y, int z) + { + for (int i = 1; i <= ritualList.size(); i++) + { + if (checkRitualIsValid(world, x, y, z, i)) + { + return i; + } + } + + return 0; + } + + public static boolean canCrystalActivate(int ritual, int crystalLevel) + { + if (ritual <= ritualList.size()) + { + return ritualList.get(ritual - 1).crystalLevel <= crystalLevel; + } else + { + return false; + } + +// switch (crystalLevel) +// { +// case 1: +// return(ritual <= 8); +// +// case 2: +// return(ritual <= 16); +// +// default: +// return false; +// } + } + + public static boolean checkRitualIsValid(World world, int x, int y, int z, int ritualID) + { + int direction = Rituals.getDirectionOfRitual(world, x, y, z, ritualID); + + if (direction != -1) + { + return true; + } + + return false; +// List ritual = Rituals.getRitualList(ritualID); +// +// if (ritual == null) +// { +// return false; +// } +// +// Block test = null; +// +// for (RitualComponent rc : ritual) +// { +// test = Block.blocksList[world.getBlockId(x + rc.getX(), y + rc.getY(), z + rc.getZ())]; +// +// if (!(test instanceof RitualStone)) +// { +// return false; +// } +// +// if (world.getBlockMetadata(x + rc.getX(), y + rc.getY(), z + rc.getZ()) != rc.getStoneType()) +// { +// return false; +// } +// } +// +// return true; + } + + /** + * 1 - NORTH + * 2 - EAST + * 3 - SOUTH + * 4 - WEST + */ + public static boolean checkDirectionOfRitualValid(World world, int x, int y, int z, int ritualID, int direction) + { + List ritual = Rituals.getRitualList(ritualID); + + if (ritual == null) + { + return false; + } + + Block test = null; + + switch (direction) + { + case 1: + for (RitualComponent rc : ritual) + { + test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + + if (!(test instanceof RitualStone)) + { + return false; + } + + if (world.getBlockMetadata(x + rc.getX(), y + rc.getY(), z + rc.getZ()) != rc.getStoneType()) + { + return false; + } + } + + return true; + + case 2: + for (RitualComponent rc : ritual) + { + test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + + if (!(test instanceof RitualStone)) + { + return false; + } + + if (world.getBlockMetadata(x - rc.getZ(), y + rc.getY(), z + rc.getX()) != rc.getStoneType()) + { + return false; + } + } + + return true; + + case 3: + for (RitualComponent rc : ritual) + { + test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + + if (!(test instanceof RitualStone)) + { + return false; + } + + if (world.getBlockMetadata(x - rc.getX(), y + rc.getY(), z - rc.getZ()) != rc.getStoneType()) + { + return false; + } + } + + return true; + + case 4: + for (RitualComponent rc : ritual) + { + test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + + if (!(test instanceof RitualStone)) + { + return false; + } + + if (world.getBlockMetadata(x + rc.getZ(), y + rc.getY(), z - rc.getX()) != rc.getStoneType()) + { + return false; + } + } + + return true; + } + + return false; + } + + public static int getDirectionOfRitual(World world, int x, int y, int z, int ritualID) + { + for (int i = 1; i <= 4; i++) + { + if (Rituals.checkDirectionOfRitualValid(world, x, y, z, ritualID, i)) + { + return i; + } + } + + return -1; + } + + public static void loadRituals() + { + ArrayList waterRitual = new ArrayList(); + waterRitual.add(new RitualComponent(-1, 0, 1, 1)); + waterRitual.add(new RitualComponent(-1, 0, -1, 1)); + waterRitual.add(new RitualComponent(1, 0, -1, 1)); + waterRitual.add(new RitualComponent(1, 0, 1, 1)); + ArrayList lavaRitual = new ArrayList(); + lavaRitual.add(new RitualComponent(1, 0, 0, 2)); + lavaRitual.add(new RitualComponent(-1, 0, 0, 2)); + lavaRitual.add(new RitualComponent(0, 0, 1, 2)); + lavaRitual.add(new RitualComponent(0, 0, -1, 2)); + ArrayList growthRitual = new ArrayList(); + growthRitual.add(new RitualComponent(1, 0, 0, 1)); + growthRitual.add(new RitualComponent(-1, 0, 0, 1)); + growthRitual.add(new RitualComponent(0, 0, 1, 1)); + growthRitual.add(new RitualComponent(0, 0, -1, 1)); + growthRitual.add(new RitualComponent(-1, 0, 1, 3)); + growthRitual.add(new RitualComponent(1, 0, 1, 3)); + growthRitual.add(new RitualComponent(-1, 0, -1, 3)); + growthRitual.add(new RitualComponent(1, 0, -1, 3)); + ArrayList interdictionRitual = new ArrayList(); + interdictionRitual.add(new RitualComponent(1, 0, 0, 4)); + interdictionRitual.add(new RitualComponent(-1, 0, 0, 4)); + interdictionRitual.add(new RitualComponent(0, 0, 1, 4)); + interdictionRitual.add(new RitualComponent(0, 0, -1, 4)); + interdictionRitual.add(new RitualComponent(-1, 0, 1, 4)); + interdictionRitual.add(new RitualComponent(1, 0, 1, 4)); + interdictionRitual.add(new RitualComponent(-1, 0, -1, 4)); + interdictionRitual.add(new RitualComponent(1, 0, -1, 4)); + ArrayList containmentRitual = new ArrayList(); + containmentRitual.add(new RitualComponent(1, 0, 0, 3)); + containmentRitual.add(new RitualComponent(-1, 0, 0, 3)); + containmentRitual.add(new RitualComponent(0, 0, 1, 3)); + containmentRitual.add(new RitualComponent(0, 0, -1, 3)); + containmentRitual.add(new RitualComponent(2, 0, 2, 3)); + containmentRitual.add(new RitualComponent(2, 0, -2, 3)); + containmentRitual.add(new RitualComponent(-2, 0, 2, 3)); + containmentRitual.add(new RitualComponent(-2, 0, -2, 3)); + containmentRitual.add(new RitualComponent(1, 5, 0, 3)); + containmentRitual.add(new RitualComponent(-1, 5, 0, 3)); + containmentRitual.add(new RitualComponent(0, 5, 1, 3)); + containmentRitual.add(new RitualComponent(0, 5, -1, 3)); + containmentRitual.add(new RitualComponent(2, 5, 2, 3)); + containmentRitual.add(new RitualComponent(2, 5, -2, 3)); + containmentRitual.add(new RitualComponent(-2, 5, 2, 3)); + containmentRitual.add(new RitualComponent(-2, 5, -2, 3)); + //Bound soul ritual + ArrayList boundSoulRitual = new ArrayList(); + boundSoulRitual.add(new RitualComponent(3, 0, 0, 2)); + boundSoulRitual.add(new RitualComponent(-3, 0, 0, 2)); + boundSoulRitual.add(new RitualComponent(0, 0, 3, 2)); + boundSoulRitual.add(new RitualComponent(0, 0, -3, 2)); + boundSoulRitual.add(new RitualComponent(2, 0, 2, 4)); + boundSoulRitual.add(new RitualComponent(-2, 0, 2, 4)); + boundSoulRitual.add(new RitualComponent(2, 0, -2, 4)); + boundSoulRitual.add(new RitualComponent(-2, 0, -2, 4)); + boundSoulRitual.add(new RitualComponent(4, 2, 0, 1)); + boundSoulRitual.add(new RitualComponent(-4, 2, 0, 1)); + boundSoulRitual.add(new RitualComponent(0, 2, 4, 1)); + boundSoulRitual.add(new RitualComponent(0, 2, -4, 1)); + boundSoulRitual.add(new RitualComponent(3, 2, 3, 3)); + boundSoulRitual.add(new RitualComponent(3, 2, -3, 3)); + boundSoulRitual.add(new RitualComponent(-3, 2, 3, 3)); + boundSoulRitual.add(new RitualComponent(-3, 2, -3, 3)); + boundSoulRitual.add(new RitualComponent(4, 1, 0, 0)); + boundSoulRitual.add(new RitualComponent(-4, 1, 0, 0)); + boundSoulRitual.add(new RitualComponent(0, 1, 4, 0)); + boundSoulRitual.add(new RitualComponent(0, 1, -4, 0)); + boundSoulRitual.add(new RitualComponent(3, 1, 3, 0)); + boundSoulRitual.add(new RitualComponent(3, 1, -3, 0)); + boundSoulRitual.add(new RitualComponent(-3, 1, 3, 0)); + boundSoulRitual.add(new RitualComponent(-3, 1, -3, 0)); + // + ArrayList unbindingRitual = new ArrayList(); + unbindingRitual.add(new RitualComponent(-2, 0, 0, 4)); + unbindingRitual.add(new RitualComponent(2, 0, 0, 4)); + unbindingRitual.add(new RitualComponent(0, 0, 2, 4)); + unbindingRitual.add(new RitualComponent(0, 0, -2, 4)); + unbindingRitual.add(new RitualComponent(-2, 0, -2, 3)); + unbindingRitual.add(new RitualComponent(-2, 0, -3, 3)); + unbindingRitual.add(new RitualComponent(-3, 0, -2, 3)); + unbindingRitual.add(new RitualComponent(2, 0, -2, 3)); + unbindingRitual.add(new RitualComponent(2, 0, -3, 3)); + unbindingRitual.add(new RitualComponent(3, 0, -2, 3)); + unbindingRitual.add(new RitualComponent(-2, 0, 2, 3)); + unbindingRitual.add(new RitualComponent(-2, 0, 3, 3)); + unbindingRitual.add(new RitualComponent(-3, 0, 2, 3)); + unbindingRitual.add(new RitualComponent(2, 0, 2, 3)); + unbindingRitual.add(new RitualComponent(2, 0, 3, 3)); + unbindingRitual.add(new RitualComponent(3, 0, 2, 3)); + unbindingRitual.add(new RitualComponent(3, 1, 3, 0)); + unbindingRitual.add(new RitualComponent(3, 1, -3, 0)); + unbindingRitual.add(new RitualComponent(-3, 1, -3, 0)); + unbindingRitual.add(new RitualComponent(-3, 1, 3, 0)); + unbindingRitual.add(new RitualComponent(3, 2, 3, 0)); + unbindingRitual.add(new RitualComponent(3, 2, -3, 0)); + unbindingRitual.add(new RitualComponent(-3, 2, -3, 0)); + unbindingRitual.add(new RitualComponent(-3, 2, 3, 0)); + unbindingRitual.add(new RitualComponent(3, 3, 3, 2)); + unbindingRitual.add(new RitualComponent(3, 3, -3, 2)); + unbindingRitual.add(new RitualComponent(-3, 3, -3, 2)); + unbindingRitual.add(new RitualComponent(-3, 3, 3, 2)); + unbindingRitual.add(new RitualComponent(-5, 0, 0, 2)); + unbindingRitual.add(new RitualComponent(5, 0, 0, 2)); + unbindingRitual.add(new RitualComponent(0, 0, 5, 2)); + unbindingRitual.add(new RitualComponent(0, 0, -5, 2)); + ArrayList jumpingRitual = new ArrayList(); + + for (int i = -1; i <= 1; i++) + { + jumpingRitual.add(new RitualComponent(1, i, 1, RitualComponent.AIR)); + jumpingRitual.add(new RitualComponent(-1, i, 1, RitualComponent.AIR)); + jumpingRitual.add(new RitualComponent(-1, i, -1, RitualComponent.AIR)); + jumpingRitual.add(new RitualComponent(1, i, -1, RitualComponent.AIR)); + } + + 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.FIRE)); + ArrayList crushingRitual = new ArrayList(); + crushingRitual.add(new RitualComponent(0, 0, 1, RitualComponent.EARTH)); + crushingRitual.add(new RitualComponent(1, 0, 0, RitualComponent.EARTH)); + crushingRitual.add(new RitualComponent(0, 0, -1, RitualComponent.EARTH)); + crushingRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.EARTH)); + crushingRitual.add(new RitualComponent(2, 0, 0, RitualComponent.FIRE)); + crushingRitual.add(new RitualComponent(0, 0, 2, RitualComponent.FIRE)); + crushingRitual.add(new RitualComponent(-2, 0, 0, RitualComponent.FIRE)); + crushingRitual.add(new RitualComponent(0, 0, -2, RitualComponent.FIRE)); + crushingRitual.add(new RitualComponent(2, 0, 2, RitualComponent.DUSK)); + crushingRitual.add(new RitualComponent(2, 0, -2, RitualComponent.DUSK)); + crushingRitual.add(new RitualComponent(-2, 0, 2, RitualComponent.DUSK)); + crushingRitual.add(new RitualComponent(-2, 0, -2, RitualComponent.DUSK)); + crushingRitual.add(new RitualComponent(2, 1, 0, RitualComponent.AIR)); + crushingRitual.add(new RitualComponent(-2, 1, 0, RitualComponent.AIR)); + crushingRitual.add(new RitualComponent(0, 1, 2, RitualComponent.AIR)); + crushingRitual.add(new RitualComponent(0, 1, -2, RitualComponent.AIR)); + ArrayList leapingRitual = new ArrayList(); + leapingRitual.add(new RitualComponent(0, 0, -2, RitualComponent.DUSK)); + leapingRitual.add(new RitualComponent(1, 0, -1, RitualComponent.AIR)); + leapingRitual.add(new RitualComponent(-1, 0, -1, RitualComponent.AIR)); + + for (int i = 0; i <= 2; i++) + { + leapingRitual.add(new RitualComponent(2, 0, i, RitualComponent.AIR)); + leapingRitual.add(new RitualComponent(-2, 0, i, RitualComponent.AIR)); + } + + //Animal Growth + ArrayList animalGrowthRitual = new ArrayList(); + animalGrowthRitual.add(new RitualComponent(0, 0, 2, RitualComponent.DUSK)); + animalGrowthRitual.add(new RitualComponent(2, 0, 0, RitualComponent.DUSK)); + animalGrowthRitual.add(new RitualComponent(0, 0, -2, RitualComponent.DUSK)); + animalGrowthRitual.add(new RitualComponent(-2, 0, 0, RitualComponent.DUSK)); + animalGrowthRitual.add(new RitualComponent(0, 0, 1, RitualComponent.WATER)); + animalGrowthRitual.add(new RitualComponent(1, 0, 0, RitualComponent.WATER)); + animalGrowthRitual.add(new RitualComponent(0, 0, -1, RitualComponent.WATER)); + animalGrowthRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.WATER)); + animalGrowthRitual.add(new RitualComponent(1, 0, 2, RitualComponent.EARTH)); + animalGrowthRitual.add(new RitualComponent(-1, 0, 2, RitualComponent.EARTH)); + animalGrowthRitual.add(new RitualComponent(1, 0, -2, RitualComponent.EARTH)); + animalGrowthRitual.add(new RitualComponent(-1, 0, -2, RitualComponent.EARTH)); + animalGrowthRitual.add(new RitualComponent(2, 0, 1, RitualComponent.AIR)); + animalGrowthRitual.add(new RitualComponent(2, 0, -1, RitualComponent.AIR)); + animalGrowthRitual.add(new RitualComponent(-2, 0, 1, RitualComponent.AIR)); + animalGrowthRitual.add(new RitualComponent(-2, 0, -1, RitualComponent.AIR)); + //Well of Suffering + ArrayList wellOfSufferingRitual = new ArrayList(); + wellOfSufferingRitual.add(new RitualComponent(1, 0, 1, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(-1, 0, 1, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(1, 0, -1, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(-1, 0, -1, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(2, -1, 2, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(2, -1, -2, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(-2, -1, 2, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(-2, -1, -2, RitualComponent.FIRE)); + wellOfSufferingRitual.add(new RitualComponent(0, -1, 2, RitualComponent.EARTH)); + wellOfSufferingRitual.add(new RitualComponent(2, -1, 0, RitualComponent.EARTH)); + wellOfSufferingRitual.add(new RitualComponent(0, -1, -2, RitualComponent.EARTH)); + wellOfSufferingRitual.add(new RitualComponent(-2, -1, 0, RitualComponent.EARTH)); + wellOfSufferingRitual.add(new RitualComponent(-3, -1, -3, RitualComponent.DUSK)); + wellOfSufferingRitual.add(new RitualComponent(3, -1, -3, RitualComponent.DUSK)); + wellOfSufferingRitual.add(new RitualComponent(-3, -1, 3, RitualComponent.DUSK)); + wellOfSufferingRitual.add(new RitualComponent(3, -1, 3, RitualComponent.DUSK)); + wellOfSufferingRitual.add(new RitualComponent(2, -1, 4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(4, -1, 2, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-2, -1, 4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(4, -1, -2, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(2, -1, -4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-4, -1, 2, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-2, -1, -4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-4, -1, -2, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(1, 0, 4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(4, 0, 1, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(1, 0, -4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-4, 0, 1, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-1, 0, 4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(4, 0, -1, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-1, 0, -4, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(-4, 0, -1, RitualComponent.WATER)); + wellOfSufferingRitual.add(new RitualComponent(4, 1, 0, RitualComponent.AIR)); + wellOfSufferingRitual.add(new RitualComponent(0, 1, 4, RitualComponent.AIR)); + wellOfSufferingRitual.add(new RitualComponent(-4, 1, 0, RitualComponent.AIR)); + wellOfSufferingRitual.add(new RitualComponent(0, 1, -4, RitualComponent.AIR)); + ArrayList healingRitual = new ArrayList(); + healingRitual.add(new RitualComponent(4, 0, 0, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(5, 0, -1, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(5, 0, 1, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(-4, 0, 0, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(-5, 0, -1, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(-5, 0, 1, RitualComponent.AIR)); + healingRitual.add(new RitualComponent(0, 0, 4, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(-1, 0, 5, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(1, 0, 5, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(0, 0, -4, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(-1, 0, -5, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(1, 0, -5, RitualComponent.FIRE)); + healingRitual.add(new RitualComponent(3, 0, 5, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(5, 0, 3, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(3, 0, -5, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(5, 0, -3, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(-3, 0, 5, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(-5, 0, 3, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(-3, 0, -5, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(-5, 0, -3, RitualComponent.WATER)); + healingRitual.add(new RitualComponent(-3, 0, -3, RitualComponent.DUSK)); + healingRitual.add(new RitualComponent(-3, 0, 3, RitualComponent.DUSK)); + healingRitual.add(new RitualComponent(3, 0, -3, RitualComponent.DUSK)); + healingRitual.add(new RitualComponent(3, 0, 3, RitualComponent.DUSK)); + healingRitual.add(new RitualComponent(4, 0, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(4, -1, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, 0, 4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, -1, 4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, 0, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(4, 0, -5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(4, -1, -5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, 0, -4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, -1, -4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(5, 0, -5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-4, 0, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-4, -1, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, 0, 4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, -1, 4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, 0, 5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-4, 0, -5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-4, -1, -5, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, 0, -4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, -1, -4, RitualComponent.EARTH)); + healingRitual.add(new RitualComponent(-5, 0, -5, RitualComponent.EARTH)); + ArrayList featheredKnifeRitual = new ArrayList(); + featheredKnifeRitual.add(new RitualComponent(1, 0, 0, RitualComponent.DUSK)); + featheredKnifeRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.DUSK)); + featheredKnifeRitual.add(new RitualComponent(0, 0, 1, RitualComponent.DUSK)); + featheredKnifeRitual.add(new RitualComponent(0, 0, -1, RitualComponent.DUSK)); + featheredKnifeRitual.add(new RitualComponent(2, -1, 0, RitualComponent.WATER)); + featheredKnifeRitual.add(new RitualComponent(-2, -1, 0, RitualComponent.WATER)); + featheredKnifeRitual.add(new RitualComponent(0, -1, 2, RitualComponent.WATER)); + featheredKnifeRitual.add(new RitualComponent(0, -1, -2, RitualComponent.WATER)); + featheredKnifeRitual.add(new RitualComponent(1, -1, 1, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(1, -1, -1, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(-1, -1, 1, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(-1, -1, -1, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(4, -1, 2, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(2, -1, 4, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(-4, -1, 2, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(2, -1, -4, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(4, -1, -2, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(-2, -1, 4, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(-4, -1, -2, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(-2, -1, -4, RitualComponent.FIRE)); + featheredKnifeRitual.add(new RitualComponent(4, 0, 2, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(2, 0, 4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-4, 0, 2, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(2, 0, -4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(4, 0, -2, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-2, 0, 4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-4, 0, -2, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-2, 0, -4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(4, 0, 3, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(3, 0, 4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-4, 0, 3, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(3, 0, -4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(4, 0, -3, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-3, 0, 4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-4, 0, -3, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(-3, 0, -4, RitualComponent.EARTH)); + featheredKnifeRitual.add(new RitualComponent(3, 0, 3, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(3, 0, -3, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(-3, 0, 3, RitualComponent.AIR)); + featheredKnifeRitual.add(new RitualComponent(-3, 0, -3, RitualComponent.AIR)); + ArrayList featheredEarthRitual = new ArrayList(); + featheredEarthRitual.add(new RitualComponent(1, 0, 0, RitualComponent.DUSK)); + featheredEarthRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.DUSK)); + featheredEarthRitual.add(new RitualComponent(0, 0, 1, RitualComponent.DUSK)); + featheredEarthRitual.add(new RitualComponent(0, 0, -1, RitualComponent.DUSK)); + featheredEarthRitual.add(new RitualComponent(2, 0, 2, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-2, 0, 2, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-2, 0, -2, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(2, 0, -2, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(1, 0, 3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(0, 0, 3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(-1, 0, 3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(1, 0, -3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(0, 0, -3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(-1, 0, -3, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(3, 0, 1, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(3, 0, 0, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(3, 0, -1, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(-3, 0, 1, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(-3, 0, 0, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(-3, 0, -1, RitualComponent.EARTH)); + featheredEarthRitual.add(new RitualComponent(4, 4, 4, RitualComponent.FIRE)); + featheredEarthRitual.add(new RitualComponent(-4, 4, 4, RitualComponent.FIRE)); + featheredEarthRitual.add(new RitualComponent(-4, 4, -4, RitualComponent.FIRE)); + featheredEarthRitual.add(new RitualComponent(4, 4, -4, RitualComponent.FIRE)); + featheredEarthRitual.add(new RitualComponent(4, 5, 5, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(4, 5, 3, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(5, 5, 4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(3, 5, 4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-4, 5, 5, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-4, 5, 3, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-5, 5, 4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-3, 5, 4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(4, 5, -5, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(4, 5, -3, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(5, 5, -4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(3, 5, -4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-4, 5, -5, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-4, 5, -3, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-5, 5, -4, RitualComponent.AIR)); + featheredEarthRitual.add(new RitualComponent(-3, 5, -4, RitualComponent.AIR)); + //Biome Changer + ArrayList biomeChangerRitual = new ArrayList(); + biomeChangerRitual.add(new RitualComponent(1, 0, -2, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(1, 0, -3, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(2, 0, -1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(3, 0, -1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(1, 0, 2, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(1, 0, 3, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(2, 0, 1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(3, 0, 1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-1, 0, -2, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-1, 0, -3, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-2, 0, -1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-3, 0, -1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-1, 0, 2, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-1, 0, 3, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-2, 0, 1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-3, 0, 1, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(3, 0, -3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(3, 0, -4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(4, 0, -3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(4, 0, -5, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(5, 0, -4, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(3, 0, 3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(3, 0, 4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(4, 0, 3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(4, 0, 5, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(5, 0, 4, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-3, 0, 3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-3, 0, 4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-4, 0, 3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-4, 0, 5, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-5, 0, 4, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-3, 0, -3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-3, 0, -4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-4, 0, -3, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-4, 0, -5, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-5, 0, -4, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(0, 0, -5, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-1, 0, -6, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(1, 0, -6, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-1, 0, -8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(0, 0, -8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(1, 0, -8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(-1, 0, -10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(0, 0, -10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(1, 0, -10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(0, 0, 5, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-1, 0, 6, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(1, 0, 6, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-1, 0, 8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(0, 0, 8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(1, 0, 8, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(-1, 0, 10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(0, 0, 10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(1, 0, 10, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-5, 0, 0, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-6, 0, -1, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-6, 0, 1, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-8, 0, -1, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(-8, 0, 0, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(-8, 0, 1, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(-10, 0, -1, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-10, 0, 0, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-10, 0, 1, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(5, 0, 0, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(6, 0, -1, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(6, 0, 1, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(8, 0, -1, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(8, 0, 0, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(8, 0, 1, RitualComponent.BLANK)); + biomeChangerRitual.add(new RitualComponent(10, 0, -1, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(10, 0, 0, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(10, 0, 1, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(6, 0, -6, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(6, 0, -7, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(7, 0, -6, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(7, 0, -5, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(5, 0, -7, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(8, 0, -5, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(8, 0, -4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(9, 0, -4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(5, 0, -8, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(4, 0, -8, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(4, 0, -9, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-6, 0, 6, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-6, 0, 7, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-7, 0, 6, RitualComponent.AIR)); + biomeChangerRitual.add(new RitualComponent(-7, 0, 5, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-5, 0, 7, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-8, 0, 5, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-8, 0, 4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-9, 0, 4, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-5, 0, 8, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-4, 0, 8, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(-4, 0, 9, RitualComponent.EARTH)); + biomeChangerRitual.add(new RitualComponent(6, 0, 6, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(6, 0, 7, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(7, 0, 6, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(7, 0, 5, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(5, 0, 7, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(8, 0, 5, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(8, 0, 4, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(9, 0, 4, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(5, 0, 8, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(4, 0, 8, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(4, 0, 9, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-6, 0, -6, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-6, 0, -7, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-7, 0, -6, RitualComponent.FIRE)); + biomeChangerRitual.add(new RitualComponent(-7, 0, -5, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-5, 0, -7, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-8, 0, -5, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-8, 0, -4, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-9, 0, -4, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-5, 0, -8, RitualComponent.DUSK)); + biomeChangerRitual.add(new RitualComponent(-4, 0, -8, RitualComponent.WATER)); + biomeChangerRitual.add(new RitualComponent(-4, 0, -9, RitualComponent.WATER)); + ArrayList flightRitual = new ArrayList(); + flightRitual.add(new RitualComponent(1, 0, 0, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(0, 0, 1, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(0, 0, -1, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(2, 0, 2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(-2, 0, 2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(-2, 0, -2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(2, 0, -2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(1, 0, 3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(0, 0, 3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-1, 0, 3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(1, 0, -3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(0, 0, -3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-1, 0, -3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(3, 0, 1, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(3, 0, 0, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(3, 0, -1, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-3, 0, 1, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-3, 0, 0, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-3, 0, -1, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-3, 0, -4, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(-4, 0, -3, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(-3, 0, 4, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(4, 0, -3, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(3, 0, -4, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(-4, 0, 3, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(3, 0, 4, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(4, 0, 3, RitualComponent.WATER)); + flightRitual.add(new RitualComponent(-1, 1, 0, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(1, 1, 0, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(0, 1, -1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(0, 1, 1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-2, 1, 0, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(2, 1, 0, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(0, 1, -2, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(0, 1, 2, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(-4, 1, 0, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(4, 1, 0, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(0, 1, -4, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(0, 1, 4, RitualComponent.BLANK)); + flightRitual.add(new RitualComponent(-5, 1, 0, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(5, 1, 0, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(0, 1, -5, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(0, 1, 5, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(5, 0, 0, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(-5, 0, 0, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(0, 0, 5, RitualComponent.DUSK)); + flightRitual.add(new RitualComponent(0, 0, -5, RitualComponent.DUSK)); + + for (int i = 2; i <= 4; i++) + { + flightRitual.add(new RitualComponent(-i, 2, 0, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(i, 2, 0, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(0, 2, -i, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(0, 2, i, RitualComponent.EARTH)); + } + + flightRitual.add(new RitualComponent(2, 4, 1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(1, 4, 2, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-2, 4, 1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(1, 4, -2, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(2, 4, -1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-1, 4, 2, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-2, 4, -1, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-1, 4, -2, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(2, 4, 2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(-2, 4, 2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(2, 4, -2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(-2, 4, -2, RitualComponent.AIR)); + flightRitual.add(new RitualComponent(-4, 2, -4, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(4, 2, 4, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(4, 2, -4, RitualComponent.FIRE)); + flightRitual.add(new RitualComponent(-4, 2, 4, RitualComponent.FIRE)); + + for (int i = -1; i <= 1; i++) + { + flightRitual.add(new RitualComponent(3, 4, i, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(-3, 4, i, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(i, 4, 3, RitualComponent.EARTH)); + flightRitual.add(new RitualComponent(i, 4, -3, RitualComponent.EARTH)); + } + + ArrayList meteorRitual = new ArrayList(); + meteorRitual.add(new RitualComponent(2, 0, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-2, 0, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 0, 2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 0, -2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(3, 0, 1, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(3, 0, -1, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-3, 0, 1, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-3, 0, -1, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(1, 0, 3, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-1, 0, 3, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(1, 0, -3, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-1, 0, -3, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(4, 0, 2, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(4, 0, -2, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-4, 0, 2, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-4, 0, -2, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(2, 0, 4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-2, 0, 4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(2, 0, -4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-2, 0, -4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(5, 0, 3, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(5, 0, -3, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-5, 0, 3, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-5, 0, -3, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(3, 0, 5, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-3, 0, 5, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(3, 0, -5, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-3, 0, -5, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-4, 0, -4, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(-4, 0, 4, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(4, 0, 4, RitualComponent.DUSK)); + meteorRitual.add(new RitualComponent(4, 0, -4, RitualComponent.DUSK)); + + for (int i = 4; i <= 6; i++) + { + meteorRitual.add(new RitualComponent(i, 0, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(-i, 0, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 0, i, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 0, -i, RitualComponent.EARTH)); + } + + meteorRitual.add(new RitualComponent(8, 0, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(-8, 0, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 0, 8, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 0, -8, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(8, 1, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(-8, 1, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 1, 8, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 1, -8, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(7, 1, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(-7, 1, 0, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 1, 7, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(0, 1, -7, RitualComponent.EARTH)); + meteorRitual.add(new RitualComponent(7, 2, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-7, 2, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 2, 7, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 2, -7, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(6, 2, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-6, 2, 0, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 2, 6, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(0, 2, -6, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(6, 3, 0, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-6, 3, 0, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(0, 3, 6, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(0, 3, -6, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(5, 3, 0, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-5, 3, 0, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(0, 3, 5, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(0, 3, -5, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(5, 4, 0, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-5, 4, 0, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(0, 4, 5, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(0, 4, -5, RitualComponent.AIR)); + + for (int i = -1; i <= 1; i++) + { + meteorRitual.add(new RitualComponent(i, 4, 4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(i, 4, -4, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(4, 4, i, RitualComponent.AIR)); + meteorRitual.add(new RitualComponent(-4, 4, i, RitualComponent.AIR)); + } + + meteorRitual.add(new RitualComponent(2, 4, 4, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(4, 4, 2, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(2, 4, -4, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-4, 4, 2, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-2, 4, 4, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(4, 4, -2, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-2, 4, -4, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(-4, 4, -2, RitualComponent.WATER)); + meteorRitual.add(new RitualComponent(2, 4, 3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(3, 4, 2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(3, 4, 3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-2, 4, 3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(3, 4, -2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(3, 4, -3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(2, 4, -3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-3, 4, 2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-3, 4, 3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-2, 4, -3, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-3, 4, -2, RitualComponent.FIRE)); + meteorRitual.add(new RitualComponent(-3, 4, -3, RitualComponent.FIRE)); + + ArrayList apiaryRitual = new ArrayList(); + apiaryRitual.add(new RitualComponent(1,0,0, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(1,0,1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(1,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(-1,0,0, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(0,0,-1, RitualComponent.DUSK)); + apiaryRitual.add(new RitualComponent(0,0,1, RitualComponent.DUSK)); + + + ritualList.add(new Rituals(waterRitual, 1, 500, new RitualEffectWater(), "Ritual of the Full Spring")); + ritualList.add(new Rituals(lavaRitual, 1, 10000, new RitualEffectLava(), "Serenade of the Nether")); + ritualList.add(new Rituals(growthRitual, 1, 1000, new RitualEffectGrowth(), "Ritual of the Green Grove")); + ritualList.add(new Rituals(interdictionRitual, 1, 1000, new RitualEffectInterdiction(), "Interdiction Ritual")); + ritualList.add(new Rituals(containmentRitual, 1, 2000, new RitualEffectContainment(), "Ritual of Containment")); + ritualList.add(new Rituals(boundSoulRitual, 1, 5000, new RitualEffectSoulBound(), "Ritual of Binding")); + ritualList.add(new Rituals(unbindingRitual, 1, 30000, new RitualEffectUnbinding(), "Ritual of Unbinding")); + ritualList.add(new Rituals(jumpingRitual, 1, 1000, new RitualEffectJumping(), "Ritual of the High Jump")); + ritualList.add(new Rituals(magneticRitual, 1, 5000, new RitualEffectMagnetic(), "Ritual of Magnetism")); + ritualList.add(new Rituals(crushingRitual, 1, 2500, new RitualEffectCrushing(), "Ritual of the Crusher")); + ritualList.add(new Rituals(leapingRitual, 1, 1000, new RitualEffectLeap(), "Ritual of Speed")); + ritualList.add(new Rituals(animalGrowthRitual, 1, 10000, new RitualEffectAnimalGrowth(), "Ritual of the Shepherd")); + ritualList.add(new Rituals(wellOfSufferingRitual, 1, 50000, new RitualEffectWellOfSuffering(), "Well of Suffering")); + ritualList.add(new Rituals(healingRitual, 1, 25000, new RitualEffectHealing(), "Ritual of Regeneration")); + ritualList.add(new Rituals(featheredKnifeRitual, 1, 50000, new RitualEffectFeatheredKnife(), "Ritual of the Feathered Knife")); + ritualList.add(new Rituals(featheredEarthRitual, 2, 100000, new RitualEffectFeatheredEarth(), "Ritual of the Feathered Earth")); + ritualList.add(new Rituals(biomeChangerRitual, 2, 1000000, new RitualEffectBiomeChanger(), "Ritual of Gaia's Transformation")); + ritualList.add(new Rituals(flightRitual, 2, 1000000, new RitualEffectFlight(), "Reverence of the Condor")); + ritualList.add(new Rituals(meteorRitual, 2, 1000000, new RitualEffectSummonMeteor(), "Mark of the Falling Tower")); + ritualList.add(new Rituals(apiaryRitual,1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); + } + + public static int getCostForActivation(int ritualID) + { + if (ritualID <= ritualList.size()) + { + return ritualList.get(ritualID - 1).actCost; + } else + { + return 0; + } + +// switch (ritualID) +// { +// case 1: +// return 500; +// +// case 2: +// return 20000; +// +// case 3: +// return 250; +// +// case 4: +// return 1000; +// +// case 5: +// return 2000; +// +// case 6: +// return 5000; +// +// case 7: +// return 50000; +// +// case 8: +// return 1000; +// default: +// return 0; +// } + } + +// public static int getCostPerRefresh(int ritualID) +// { +// switch (ritualID) +// { +// case 1: +// return 25; +// +// case 2: +// return 500; +// +// case 3: +// return 20; +// +// case 4: +// return 1; +// +// case 5: +// return 1; +// +// case 6: +// return 0; +// +// case 7: +// return 0; +// +// case 8: +// return 1; +// +// default: +// return 0; +// } +// } + + public static int getInitialCooldown(int ritualID) + { + if (ritualID <= ritualList.size()) + { + RitualEffect ef = ritualList.get(ritualID - 1).effect; + + if (ef != null) + { + OreDictionary d; + return ef.getInitialCooldown(); + } + } + + return 0; + } + + public static List getRitualList(int ritualID) + { + if (ritualID <= ritualList.size()) + { + return ritualList.get(ritualID - 1).obtainComponents(); + } else + { + return null; + } + +// switch (ritualID) +// { +// case 1: +// return waterRitual; +// +// case 2: +// return lavaRitual; +// +// case 3: +// return growthRitual; +// +// case 4: +// return interdictionRitual; +// +// case 5: +// return containmentRitual; +// +// case 6: +// return boundSoulRitual; +// +// case 7: +// return unbindingRitual; +// +// case 8: +// return jumpingRitual; +// +// default: +// return null; +// } + } + + private List obtainComponents() + { + return this.components; + } + + private int getCrystalLevel() + { + return this.crystalLevel; + } + + public static void performEffect(TEMasterStone ritualStone, int ritualID) + { + if (ritualID <= ritualList.size()) + { + RitualEffect ef = ritualList.get(ritualID - 1).effect; + + if (ef != null) + { + ef.performEffect(ritualStone); + } + } + } + + public static int getNumberOfRituals() + { + return ritualList.size(); + } + + public String getRitualName() + { + return this.name; + } + + public static String getNameOfRitual(int id) + { + if (ritualList.get(id) != null) + { + return ritualList.get(id).getRitualName(); + } else + { + return ""; + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java new file mode 100644 index 00000000..016bfa48 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -0,0 +1,611 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileImpactEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileUpdateEffect; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EntitySpellProjectile extends Entity implements IProjectile +{ + private int xTile = -1; + private int yTile = -1; + private int zTile = -1; + private int inTile = 0; + private int inData = 0; + private boolean inGround = false; + /** The owner of this arrow. */ + public EntityPlayer shootingEntity; + private int ticksInAir = 0; + private int ricochetCounter = 0; + private boolean scheduledForDeath = false; + + //Custom variables + private int maxRicochet = 0; + private float damage = 1; + public List impactList = new ArrayList(); + private boolean penetration = false; + public List updateEffectList = new ArrayList(); + public List spellEffectList = new LinkedList(); + private int blocksBroken = 0; + + public EntitySpellProjectile(World par1World) + { + super(par1World); + this.setSize(0.5F, 0.5F); + } + + public EntitySpellProjectile(World par1World, double par2, double par4, double par6) + { + super(par1World); + this.setSize(0.5F, 0.5F); + this.setPosition(par2, par4, par6); + yOffset = 0.0F; + } + + public EntitySpellProjectile(World par1World, EntityPlayer par2EntityPlayer) + { + super(par1World); + shootingEntity = par2EntityPlayer; + float par3 = 0.8F; + this.setSize(0.1F, 0.1F); + this.setLocationAndAngles(par2EntityPlayer.posX, par2EntityPlayer.posY + par2EntityPlayer.getEyeHeight(), par2EntityPlayer.posZ, par2EntityPlayer.rotationYaw, par2EntityPlayer.rotationPitch); + posX -= MathHelper.cos(rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + posY -= 0.2D; + posZ -= MathHelper.sin(rotationYaw / 180.0F * (float)Math.PI) * 0.16F; + this.setPosition(posX, posY, posZ); + yOffset = 0.0F; + motionX = -MathHelper.sin(rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float)Math.PI); + motionZ = MathHelper.cos(rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float)Math.PI); + motionY = -MathHelper.sin(rotationPitch / 180.0F * (float)Math.PI); + this.setThrowableHeading(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); + + } + + @Override + protected void entityInit() { + dataWatcher.addObject(16, Byte.valueOf((byte)0)); + } + + /** + * Similar to setArrowHeading, it's point the throwable entity to a x, y, z + * direction. + */ + @Override + public void setThrowableHeading(double var1, double var3, double var5, float var7, float var8) { + float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5); + var1 /= var9; + var3 /= var9; + var5 /= var9; + var1 += rand.nextGaussian() * 0.007499999832361937D * var8; + var3 += rand.nextGaussian() * 0.007499999832361937D * var8; + var5 += rand.nextGaussian() * 0.007499999832361937D * var8; + var1 *= var7; + var3 *= var7; + var5 *= var7; + motionX = var1; + motionY = var3; + motionZ = var5; + float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5); + prevRotationYaw = rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float)(Math.atan2(var3, var10) * 180.0D / Math.PI); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX, + * posY, posZ, yaw, pitch + */ + public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9) { + this.setPosition(par1, par3, par5); + this.setRotation(par7, par8); + } + + @Override + @SideOnly(Side.CLIENT) + /** + * Sets the velocity to the args. Args: x, y, z + */ + public void setVelocity(double par1, double par3, double par5) { + motionX = par1; + motionY = par3; + motionZ = par5; + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) { + float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5); + prevRotationYaw = rotationYaw = (float)(Math.atan2(par1, par5) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float)(Math.atan2(par3, var7) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch; + prevRotationYaw = rotationYaw; + this.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); + } + } + + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() + { + super.onUpdate(); + this.performUpdateEffects(); + if (ticksInAir > 600) { + this.setDead(); + } + if (shootingEntity == null) { + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX - 1, posY - 1, posZ - 1, posX + 1, posY + 1, posZ + 1)); + Iterator i = players.iterator(); + double closestDistance = Double.MAX_VALUE; + EntityPlayer closestPlayer = null; + while (i.hasNext()) { + EntityPlayer e = (EntityPlayer)i.next(); + double distance = e.getDistanceToEntity(this); + if (distance < closestDistance) { + closestPlayer = e; + } + } + if (closestPlayer != null) { + shootingEntity = closestPlayer; + } + } + if (prevRotationPitch == 0.0F && prevRotationYaw == 0.0F) { + float var1 = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + prevRotationYaw = rotationYaw = (float)(Math.atan2(motionX, motionZ) * 180.0D / Math.PI); + prevRotationPitch = rotationPitch = (float)(Math.atan2(motionY, var1) * 180.0D / Math.PI); + } + Block var16 = worldObj.getBlock(xTile, yTile, zTile); + + if (var16 != null) + { + var16.setBlockBoundsBasedOnState(worldObj, xTile, yTile, zTile); + AxisAlignedBB var2 = var16.getCollisionBoundingBoxFromPool(worldObj, xTile, yTile, zTile); + + if (var2 != null && var2.isVecInside(worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ))) + { + inGround = true; + } + } + + if (inGround) + { + Block var18 = worldObj.getBlock(xTile, yTile, zTile); + int var19 = worldObj.getBlockMetadata(xTile, yTile, zTile); + + if (var18.equals(Block.getBlockById(inTile)) && var19 == inData) + { + // this.groundImpact(); + // this.setDead(); + } + } else + { + ++ticksInAir; + + if (ticksInAir > 1 && ticksInAir < 3) + { + //worldObj.spawnParticle("flame", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0D, 0D, 0D); + for (int particles = 0; particles < 3; particles++) + { + this.doFiringParticles(); + } + } + + Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); + var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = worldObj.getWorldVec3Pool().getVecFromPool(var4.hitVec.xCoord, var4.hitVec.yCoord, var4.hitVec.zCoord); + } + + Entity var5 = null; + List var6 = worldObj.getEntitiesWithinAABBExcludingEntity(this, boundingBox.addCoord(motionX, motionY, motionZ).expand(1.0D, 1.0D, 1.0D)); + double var7 = 0.0D; + Iterator var9 = var6.iterator(); + float var11; + + while (var9.hasNext()) + { + Entity var10 = (Entity) var9.next(); + + if (var10.canBeCollidedWith() && (var10 != shootingEntity || ticksInAir >= 5)) + { + var11 = 0.3F; + AxisAlignedBB var12 = var10.boundingBox.expand(var11, var11, var11); + MovingObjectPosition var13 = var12.calculateIntercept(var17, var3); + + if (var13 != null) + { + double var14 = var17.distanceTo(var13.hitVec); + + if (var14 < var7 || var7 == 0.0D) + { + var5 = var10; + var7 = var14; + } + } + } + } + + if (var5 != null) + { + var4 = new MovingObjectPosition(var5); + } + + if (var4 != null) + { + this.onImpact(var4); + + if (scheduledForDeath) + { + this.setDead(); + } + } + + posX += motionX; + posY += motionY; + posZ += motionZ; + MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + this.setPosition(posX, posY, posZ); + //this.doBlockCollisions(); + } + } + + private void doFlightParticles() { + if (ticksInAir % 3 == 0) { + double gauss = gaussian(1.0F); + worldObj.spawnParticle("mobSpell", posX, posY, posZ, gauss, gauss, 0.0F); + } + } + + private void doFiringParticles() { + worldObj.spawnParticle("mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), 0.5D, 0.5D, 0.5D); + worldObj.spawnParticle("flame", posX, posY, posZ, gaussian(motionX), gaussian(motionY), gaussian(motionZ)); + } + + /** + * (abstract) Protected helper method to write subclass entity data to NBT. + */ + @Override + public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) + { + par1NBTTagCompound.setShort("xTile", (short)xTile); + par1NBTTagCompound.setShort("yTile", (short)yTile); + par1NBTTagCompound.setShort("zTile", (short)zTile); + par1NBTTagCompound.setByte("inTile", (byte)inTile); + par1NBTTagCompound.setByte("inData", (byte)inData); + par1NBTTagCompound.setByte("inGround", (byte)(inGround ? 1 : 0)); + + NBTTagList effectList = new NBTTagList(); + + for(SpellEffect eff : spellEffectList) + { + effectList.appendTag(eff.getTag()); + } + +// for (String str : this.effectList) +// { +// if (str != null) +// { +// NBTTagCompound tag = new NBTTagCompound(); +// +// tag.setString("Class", str); +// effectList.appendTag(tag); +// } +// } + + par1NBTTagCompound.setTag("Effects", effectList); + par1NBTTagCompound.setInteger("blocksBroken", blocksBroken); + } + + /** + * (abstract) Protected helper method to read subclass entity data from NBT. + */ + @Override + public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) + { + xTile = par1NBTTagCompound.getShort("xTile"); + yTile = par1NBTTagCompound.getShort("yTile"); + zTile = par1NBTTagCompound.getShort("zTile"); + inTile = par1NBTTagCompound.getByte("inTile") & 255; + inData = par1NBTTagCompound.getByte("inData") & 255; + inGround = par1NBTTagCompound.getByte("inGround") == 1; + blocksBroken = par1NBTTagCompound.getInteger("blocksBroken"); + + NBTTagList tagList = par1NBTTagCompound.getTagList("Effects",Constants.NBT.TAG_COMPOUND); + + List spellEffectList = new LinkedList(); + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + + SpellEffect eff = SpellEffect.getEffectFromTag(tag); + if(eff!=null) + { + spellEffectList.add(eff); + } + } + this.spellEffectList = spellEffectList; + + +// this.effectList = new LinkedList(); +// for (int i = 0; i < tagList.tagCount(); i++) +// { +// NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); +// +// this.effectList.add(tag.getString("Class")); +// } + + //SpellParadigmProjectile parad = SpellParadigmProjectile.getParadigmForStringArray(effectList); + SpellParadigmProjectile parad = SpellParadigmProjectile.getParadigmForEffectArray(spellEffectList); + parad.applyAllSpellEffects(); + parad.prepareProjectile(this); + } + + /** + * returns if this entity triggers Block.onEntityWalking on the blocks they + * walk on. used for spiders and wolves to prevent them from trampling crops + */ + @Override + protected boolean canTriggerWalking() { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public float getShadowSize() { + return 0.0F; + } + + /** + * Sets the amount of knockback the arrow applies when it hits a mob. + */ + public void setKnockbackStrength(int par1) { + } + + /** + * If returns false, the item will not inflict any damage against entities. + */ + @Override + public boolean canAttackWithItem() { + return false; + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public void setIsCritical(boolean par1) { + byte var2 = dataWatcher.getWatchableObjectByte(16); + if (par1) { + dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1))); + } else { + dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2))); + } + } + + /** + * Whether the arrow has a stream of critical hit particles flying behind + * it. + */ + public boolean getIsCritical() { + byte var1 = dataWatcher.getWatchableObjectByte(16); + return (var1 & 1) != 0; + } + + private void onImpact(MovingObjectPosition mop) + { + if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null) + { + if (mop.entityHit == shootingEntity) return; + this.onImpact(mop.entityHit); + this.performEntityImpactEffects(mop.entityHit); + } + else if (mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + if(!this.penetration) + { + this.groundImpact(mop.sideHit); + this.performTileImpactEffects(mop); + } + } + } + + private void onImpact(Entity mop) //TODO + { + if (mop == shootingEntity && ticksInAir > 3) + { + shootingEntity.attackEntityFrom(DamageSource.causePlayerDamage(shootingEntity), 1); + this.setDead(); + } + else + { + doDamage(this.damage, mop); + } + spawnHitParticles("exorcism", 8); + this.setDead(); + } + + + private void spawnHitParticles(String string, int i) { + for (int particles = 0; particles < i; particles++) { + worldObj.spawnParticle("mobSpellAmbient", posX + smallGauss(0.1D), posY + smallGauss(0.1D), posZ + smallGauss(0.1D), posGauss(1.0F), posGauss(1.0F), 0.0F); + } + } + + private void doDamage(float f, Entity mop) + { + mop.attackEntityFrom(this.getDamageSource(), f); + } + + private DamageSource getDamageSource() + { + return DamageSource.causePlayerDamage(shootingEntity); + } + + private void groundImpact(int sideHit) { + this.ricochet(sideHit); + } + + private double smallGauss(double d) { + return (worldObj.rand.nextFloat() - 0.5D) * d; + } + + private double posGauss(double d) { + return rand.nextFloat() * 0.5D * d; + } + + private double gaussian(double d) { + return d + d * ((rand.nextFloat() - 0.5D) / 4); + } + + private void ricochet(int sideHit) { + switch (sideHit) { + case 0: + case 1: + // topHit, bottomHit, reflect Y + motionY = motionY * -1; + break; + case 2: + case 3: + // westHit, eastHit, reflect Z + motionZ = motionZ * -1; + break; + case 4: + case 5: + // southHit, northHit, reflect X + motionX = motionX * -1; + break; + } + ricochetCounter++; + if (ricochetCounter > this.getRicochetMax()) { + scheduledForDeath = true; + for (int particles = 0; particles < 4; particles++) { + switch (sideHit) { + case 0: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), -gaussian(0.1D), gaussian(0.1D)); + break; + case 1: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + case 2: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), -gaussian(0.1D)); + break; + case 3: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + case 4: + worldObj.spawnParticle("smoke", posX, posY, posZ, -gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + case 5: + worldObj.spawnParticle("smoke", posX, posY, posZ, gaussian(0.1D), gaussian(0.1D), gaussian(0.1D)); + break; + } + } + } + } + + //Custom stuff + public int getRicochetMax() + { + return this.maxRicochet; + } + + public void setRicochetMax(int ricochet) + { + this.maxRicochet = ricochet; + } + + public void setImpactList(List list) + { + this.impactList = list; + } + + public void setUpdateEffectList(List list) + { + this.updateEffectList = list; + } + + private void performEntityImpactEffects(Entity mop) + { + if(impactList!=null) + { + for(IProjectileImpactEffect impactEffect : impactList) + { + impactEffect.onEntityImpact(mop); + } + } + } + + private void performTileImpactEffects(MovingObjectPosition mop) + { + if(impactList!=null) + { + for(IProjectileImpactEffect impactEffect : impactList) + { + impactEffect.onTileImpact(worldObj, mop); + } + } + } + + private void performUpdateEffects() + { + if(updateEffectList!=null) + { + for(IProjectileUpdateEffect updateEffect : updateEffectList) + { + updateEffect.onUpdateEffect(this); + } + } + } + + public void setPenetration(boolean penetration) + { + this.penetration = penetration; + } + + public float getDamage() + { + return this.damage; + } + + public void setDamage(float damage) + { + this.damage = damage; + } + + public void setSpellEffectList(List list) + { + this.spellEffectList = list; + } + + public int getBlocksBroken() + { + return this.blocksBroken; + } + + public void setBlocksBroken(int blocksBroken) + { + this.blocksBroken = blocksBroken; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java new file mode 100644 index 00000000..39297530 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +public class SpellModifier +{ + public static final int DEFAULT = 0; + public static final int OFFENSIVE = 1; + public static final int DEFENSIVE = 2; + public static final int ENVIRONMENTAL = 3; + + private int modifier; + + protected SpellModifier(int modifier) + { + this.modifier = modifier; + } + + public int getModifier() + { + return this.modifier; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java new file mode 100644 index 00000000..fd379ae1 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java @@ -0,0 +1,9 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +public class SpellModifierDefault extends SpellModifier +{ + public SpellModifierDefault() + { + super(SpellModifier.DEFAULT); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java new file mode 100644 index 00000000..f9f69dbe --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java @@ -0,0 +1,9 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +public class SpellModifierDefensive extends SpellModifier +{ + public SpellModifierDefensive() + { + super(SpellModifier.DEFENSIVE); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java new file mode 100644 index 00000000..ff9ef7f4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java @@ -0,0 +1,9 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +public class SpellModifierEnvironmental extends SpellModifier +{ + public SpellModifierEnvironmental() + { + super(SpellModifier.ENVIRONMENTAL); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java new file mode 100644 index 00000000..783ab1e3 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java @@ -0,0 +1,9 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +public class SpellModifierOffensive extends SpellModifier +{ + public SpellModifierOffensive() + { + super(SpellModifier.OFFENSIVE); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java new file mode 100644 index 00000000..025d188c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java @@ -0,0 +1,157 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; + +public abstract class SpellParadigm +{ + protected List bufferedEffectList = new ArrayList(); + public List effectList = new LinkedList(); + + public void addBufferedEffect(SpellEffect effect) + { + if(effect!=null) + { + this.bufferedEffectList.add(effect); + + effectList.add(effect.getClass().getName()); + } + } + + public void modifyBufferedEffect(SpellModifier modifier) + { + SpellEffect effect = this.getBufferedEffect(); + if(effect!=null) + { + effect.modifyEffect(modifier); + + effectList.add(modifier.getClass().getName()); + } + } + + public void applyEnhancement(SpellEnhancement enh) + { + if(enh!=null) + { + if(bufferedEffectList.isEmpty()) + { + this.enhanceParadigm(enh); + } + else + { + SpellEffect effect = this.getBufferedEffect(); + if(effect!=null) + { + effect.enhanceEffect(enh); + } + } + + effectList.add(enh.getClass().getName()); + } + + } + + public abstract void enhanceParadigm(SpellEnhancement enh); + public abstract void castSpell(World world, EntityPlayer entityPlayer, ItemStack itemStack); + + public void applySpellEffect(SpellEffect effect) + { + effect.modifyParadigm(this); + } + + public void applyAllSpellEffects() + { + for(SpellEffect effect : bufferedEffectList) + { + this.applySpellEffect(effect); + } + } + + public SpellEffect getBufferedEffect() + { + if(bufferedEffectList.isEmpty()) + { + return null; + } + else + { + return bufferedEffectList.get(bufferedEffectList.size()-1); + } + } + + public int getTotalCost() + { + int cost = 0; + if(this.bufferedEffectList!=null && !this.bufferedEffectList.isEmpty()) + { + if(this instanceof SpellParadigmProjectile) + { + for(SpellEffect effect : bufferedEffectList) + { + cost+=effect.getCostForProjectile(); + } + }else if(this instanceof SpellParadigmSelf) + { + for(SpellEffect effect : bufferedEffectList) + { + cost+=effect.getCostForSelf(); + } + }else if(this instanceof SpellParadigmMelee) + { + for(SpellEffect effect : bufferedEffectList) + { + cost+=effect.getCostForMelee(); + } + } + + return (int)(cost*Math.sqrt(this.bufferedEffectList.size())); + } + + return getDefaultCost(); + } + + public abstract int getDefaultCost(); + + public int getBufferedEffectPower() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getPowerEnhancements(); + } + + return 0; + } + + public int getBufferedEffectCost() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getCostEnhancements(); + } + + return 0; + } + + public int getBufferedEffectPotency() + { + SpellEffect eff = this.getBufferedEffect(); + + if(eff!=null) + { + return eff.getPotencyEnhancements(); + } + + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java new file mode 100644 index 00000000..b1cac7de --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IMeleeSpellEntityEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IMeleeSpellWorldEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; + +public class SpellParadigmMelee extends SpellParadigm +{ + private List entityEffectList; + private List worldEffectList; + + public SpellParadigmMelee() + { + this.entityEffectList = new ArrayList(); + this.worldEffectList = new ArrayList(); + } + + @Override + public void enhanceParadigm(SpellEnhancement enh) + { + + } + + @Override + public void castSpell(World world, EntityPlayer entityPlayer, ItemStack itemStack) + { + for(IMeleeSpellEntityEffect effect : entityEffectList) + { + effect.onEntityImpact(world, entityPlayer); + } + + for(IMeleeSpellWorldEffect effect : worldEffectList) + { + effect.onWorldEffect(world, entityPlayer); + } + + int cost = this.getTotalCost(); + + EnergyItems.syphonBatteries(itemStack, entityPlayer, cost); + } + + public void addEntityEffect(IMeleeSpellEntityEffect eff) + { + if(eff!=null) + { + this.entityEffectList.add(eff); + } + } + + public void addWorldEffect(IMeleeSpellWorldEffect eff) + { + if(eff!=null) + { + this.worldEffectList.add(eff); + } + } + + @Override + public int getDefaultCost() + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java new file mode 100644 index 00000000..7c81d8aa --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java @@ -0,0 +1,99 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileImpactEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.IProjectileUpdateEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; + +public class SpellParadigmProjectile extends SpellParadigm +{ + public DamageSource damageSource; + public float damage; + public int cost; + public List impactList; + public List updateEffectList; + public boolean penetration; + public int ricochetMax; + + public SpellParadigmProjectile() + { + this.damageSource = DamageSource.generic; + this.damage = 1; + this.cost = 0; + this.impactList = new ArrayList(); + this.updateEffectList = new ArrayList(); + this.penetration = false; + this.ricochetMax = 0; + } + + @Override + public void enhanceParadigm(SpellEnhancement enh) + { + + } + + @Override + public void castSpell(World world, EntityPlayer entityPlayer, ItemStack itemStack) + { + EntitySpellProjectile proj = new EntitySpellProjectile(world, entityPlayer); + this.prepareProjectile(proj); + world.spawnEntityInWorld(proj); + int cost = this.getTotalCost(); + + EnergyItems.syphonBatteries(itemStack, entityPlayer, cost); + } + + public static SpellParadigmProjectile getParadigmForEffectArray(List effectList) + { + SpellParadigmProjectile parad = new SpellParadigmProjectile(); + + for(SpellEffect eff : effectList) + { + parad.addBufferedEffect(eff); + } + + return parad; + } + + public void prepareProjectile(EntitySpellProjectile proj) + { + proj.setDamage(damage); + proj.setImpactList(impactList); + proj.setUpdateEffectList(updateEffectList); + proj.setPenetration(penetration); + proj.setRicochetMax(ricochetMax); + proj.setSpellEffectList(bufferedEffectList); + } + + public void addImpactEffect(IProjectileImpactEffect eff) + { + if(eff!=null) + { + this.impactList.add(eff); + } + } + + public void addUpdateEffect(IProjectileUpdateEffect eff) + { + if(eff!=null) + { + this.updateEffectList.add(eff); + } + } + + @Override + public int getDefaultCost() + { + return 50; + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java new file mode 100644 index 00000000..94a7186a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.ArrayList; +import java.util.List; + +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ISelfSpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class SpellParadigmSelf extends SpellParadigm +{ + public List selfSpellEffectList; + + public SpellParadigmSelf() + { + selfSpellEffectList = new ArrayList(); + } + + @Override + public void enhanceParadigm(SpellEnhancement enh) + { + + } + + @Override + public void castSpell(World world, EntityPlayer entityPlayer, ItemStack itemStack) + { + this.applyAllSpellEffects(); + + for(ISelfSpellEffect eff : selfSpellEffectList) + { + eff.onSelfUse(world, entityPlayer); + } + + int cost = this.getTotalCost(); + + EnergyItems.syphonBatteries(itemStack, entityPlayer, cost); + } + + public void addSelfSpellEffect(ISelfSpellEffect eff) + { + if(eff!=null) + { + this.selfSpellEffectList.add(eff); + } + } + + @Override + public int getDefaultCost() + { + return 100; + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java new file mode 100644 index 00000000..7a090649 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java @@ -0,0 +1,221 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import net.minecraft.nbt.NBTTagCompound; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellModifier; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; + +public abstract class SpellEffect +{ + protected int modifierState; + protected int powerEnhancement; + protected int costEnhancement; + protected int potencyEnhancement; + + public SpellEffect() + { + this.modifierState = SpellModifier.DEFAULT; + this.powerEnhancement = 0; + this.costEnhancement = 0; + this.potencyEnhancement = 0; + } + + public void enhanceEffect(SpellEnhancement enh) + { + if(enh!=null) + { + switch(enh.getState()) + { + case SpellEnhancement.POWER: this.powerEnhancement++; break; + case SpellEnhancement.EFFICIENCY: this.costEnhancement++; break; + case SpellEnhancement.POTENCY: this.potencyEnhancement++; break; + } + } + } + + public void modifyEffect(SpellModifier mod) + { + if(mod!=null) + modifierState = mod.getModifier(); + } + + public void modifyParadigm(SpellParadigm parad) + { + if(parad instanceof SpellParadigmProjectile) + { + this.modifyProjectileParadigm((SpellParadigmProjectile)parad); + } + if(parad instanceof SpellParadigmSelf) + { + this.modifySelfParadigm((SpellParadigmSelf)parad); + } + if(parad instanceof SpellParadigmMelee) + { + this.modifyMeleeParadigm((SpellParadigmMelee)parad); + } + } + + public void modifyProjectileParadigm(SpellParadigmProjectile parad) + { + switch(modifierState) + { + case SpellModifier.DEFAULT: this.defaultModificationProjectile(parad); break; + case SpellModifier.OFFENSIVE: this.offensiveModificationProjectile(parad); break; + case SpellModifier.DEFENSIVE: this.defensiveModificationProjectile(parad); break; + case SpellModifier.ENVIRONMENTAL: this.environmentalModificationProjectile(parad); break; + } + } + + public abstract void defaultModificationProjectile(SpellParadigmProjectile parad); + public abstract void offensiveModificationProjectile(SpellParadigmProjectile parad); + public abstract void defensiveModificationProjectile(SpellParadigmProjectile parad); + public abstract void environmentalModificationProjectile(SpellParadigmProjectile parad); + + public void modifySelfParadigm(SpellParadigmSelf parad) + { + switch(modifierState) + { + case SpellModifier.DEFAULT: this.defaultModificationSelf(parad); break; + case SpellModifier.OFFENSIVE: this.offensiveModificationSelf(parad); break; + case SpellModifier.DEFENSIVE: this.defensiveModificationSelf(parad); break; + case SpellModifier.ENVIRONMENTAL: this.environmentalModificationSelf(parad); break; + } + } + + public abstract void defaultModificationSelf(SpellParadigmSelf parad); + public abstract void offensiveModificationSelf(SpellParadigmSelf parad); + public abstract void defensiveModificationSelf(SpellParadigmSelf parad); + public abstract void environmentalModificationSelf(SpellParadigmSelf parad); + + public void modifyMeleeParadigm(SpellParadigmMelee parad) + { + switch(modifierState) + { + case SpellModifier.DEFAULT: this.defaultModificationMelee(parad); break; + case SpellModifier.OFFENSIVE: this.offensiveModificationMelee(parad); break; + case SpellModifier.DEFENSIVE: this.defensiveModificationMelee(parad); break; + case SpellModifier.ENVIRONMENTAL: this.environmentalModificationMelee(parad); break; + } + } + + public abstract void defaultModificationMelee(SpellParadigmMelee parad); + public abstract void offensiveModificationMelee(SpellParadigmMelee parad); + public abstract void defensiveModificationMelee(SpellParadigmMelee parad); + public abstract void environmentalModificationMelee(SpellParadigmMelee parad); + + public int getCostForProjectile() + { + switch(this.modifierState) + { + case SpellModifier.DEFAULT: return this.getCostForDefaultProjectile(); + case SpellModifier.OFFENSIVE: return this.getCostForOffenseProjectile(); + case SpellModifier.DEFENSIVE: return this.getCostForDefenseProjectile(); + case SpellModifier.ENVIRONMENTAL: return this.getCostForEnvironmentProjectile(); + } + return 0; + } + + protected abstract int getCostForDefaultProjectile(); + protected abstract int getCostForOffenseProjectile(); + protected abstract int getCostForDefenseProjectile(); + protected abstract int getCostForEnvironmentProjectile(); + + public int getCostForSelf() + { + switch(this.modifierState) + { + case SpellModifier.DEFAULT: return this.getCostForDefaultSelf(); + case SpellModifier.OFFENSIVE: return this.getCostForOffenseSelf(); + case SpellModifier.DEFENSIVE: return this.getCostForDefenseSelf(); + case SpellModifier.ENVIRONMENTAL: return this.getCostForEnvironmentSelf(); + } + return 0; + } + + protected abstract int getCostForDefaultSelf(); + protected abstract int getCostForOffenseSelf(); + protected abstract int getCostForDefenseSelf(); + protected abstract int getCostForEnvironmentSelf(); + + public int getCostForMelee() + { + switch(this.modifierState) + { + case SpellModifier.DEFAULT: return this.getCostForDefaultMelee(); + case SpellModifier.OFFENSIVE: return this.getCostForOffenseMelee(); + case SpellModifier.DEFENSIVE: return this.getCostForDefenseMelee(); + case SpellModifier.ENVIRONMENTAL: return this.getCostForEnvironmentMelee(); + } + return 0; + } + + protected abstract int getCostForDefaultMelee(); + protected abstract int getCostForOffenseMelee(); + protected abstract int getCostForDefenseMelee(); + protected abstract int getCostForEnvironmentMelee(); + + public int getPowerEnhancements() + { + return this.powerEnhancement; + } + + public int getCostEnhancements() + { + return this.costEnhancement; + } + + public int getPotencyEnhancements() + { + return this.potencyEnhancement; + } + + public NBTTagCompound getTag() + { + NBTTagCompound tag = new NBTTagCompound(); + + tag.setString("Class", this.getClass().getName()); + tag.setInteger("modifier", modifierState); + tag.setInteger("power", powerEnhancement); + tag.setInteger("cost", costEnhancement); + tag.setInteger("potency", potencyEnhancement); + + return tag; + } + + public static SpellEffect getEffectFromTag(NBTTagCompound tag) + { + try { + Class clazz = Class.forName(tag.getString("Class")); + if(clazz !=null) + { + try { + Object obj = clazz.newInstance(); + if(obj instanceof SpellEffect) + { + SpellEffect eff = (SpellEffect) obj; + + eff.modifierState = tag.getInteger("modifier"); + eff.powerEnhancement = tag.getInteger("power"); + eff.costEnhancement = tag.getInteger("cost"); + eff.potencyEnhancement = tag.getInteger("potency"); + + return eff; + } + } catch (InstantiationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java new file mode 100644 index 00000000..ee98c2d2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -0,0 +1,176 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; + +public class SpellEffectEarth extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java new file mode 100644 index 00000000..65fe51f7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -0,0 +1,178 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfOffensiveFire; + +public class SpellEffectFire extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + parad.damage+=this.potencyEnhancement; + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefaultFire(powerEnhancement, potencyEnhancement, costEnhancement)); + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfOffensiveFire(powerEnhancement,potencyEnhancement,costEnhancement)); + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefensiveFire(powerEnhancement,potencyEnhancement,costEnhancement)); + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfEnvironmentalFire(powerEnhancement, potencyEnhancement, costEnhancement)); + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + return (int) ((15*Math.pow(1.7, powerEnhancement)+10*Math.pow(potencyEnhancement,1.8))*Math.pow(0.8, costEnhancement)); + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java new file mode 100644 index 00000000..f11d92b0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -0,0 +1,167 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeDefensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeEnvironmentalIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.MeleeOffensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileDefensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileEnvironmentalIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ProjectileOffensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfDefensiveIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfEnvironmentalIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.SelfOffensiveIce; + +public class SpellEffectIce extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileDefaultIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.damage+=2; + parad.addImpactEffect(new ProjectileOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + parad.addUpdateEffect(new ProjectileEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefaultIce(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeDefaultIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeOffensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeEnvironmentalIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + protected int getCostForDefaultProjectile() + { + return (int)((30)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseProjectile() + { + return (int)((60)*(this.powerEnhancement+1)*(3*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseProjectile() + { + return (int)(75*(2*this.powerEnhancement+1)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentProjectile() + { + return (int)(200*(2*this.powerEnhancement+1)*(2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultSelf() + { + return (int)(20*(this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + return (int)(100*(2*this.powerEnhancement+1)*(2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseSelf() + { + return (int)(200*(3*powerEnhancement+1)*(2*potencyEnhancement + 1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentSelf() + { + return (int)(10*(1.5*potencyEnhancement+1)*(3*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultMelee() + { + return (int)(250*(potencyEnhancement+1)*(1.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseMelee() + { + return (int)(40*(1.5*potencyEnhancement+1)*Math.pow(1.5, powerEnhancement)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseMelee() + { + return (int)(50*(0.5*potencyEnhancement+1)*(0.7*powerEnhancement+1)*(0.5*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentMelee() + { + return (int)(20*(0.5*potencyEnhancement+1)*(0*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java new file mode 100644 index 00000000..0b9f2623 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -0,0 +1,176 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; + +public class SpellEffectWind extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentProjectile() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentSelf() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefaultMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForOffenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForDefenseMelee() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentMelee() + { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java new file mode 100644 index 00000000..152493f8 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -0,0 +1,184 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraft.world.WorldProvider; +import net.minecraftforge.common.util.ForgeDirection; + +public class SpellHelper +{ + public static Random rand = new Random(); + public static final double root2 = Math.sqrt(2); + + public static void smeltBlockInWorld(World world, int posX, int posY, int posZ) + { + FurnaceRecipes recipes = FurnaceRecipes.smelting(); + + Block block = world.getBlock(posX, posY, posZ); + if(block==null) + { + return; + } + + int meta = world.getBlockMetadata(posX, posY, posZ); + + ItemStack smeltedStack = recipes.getSmeltingResult(new ItemStack(block,1,meta)); + if(smeltedStack!=null && smeltedStack.getItem() instanceof ItemBlock) + { + world.setBlock(posX, posY, posZ, ((ItemBlock)(smeltedStack.getItem())).field_150939_a, smeltedStack.getItemDamage(), 3); + } + } + + public static List getEntitiesInRange(World world, double posX, double posY, double posZ, double horizontalRadius, double verticalRadius) + { + return world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(posX-0.5f, posY-0.5f, posZ-0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(horizontalRadius, verticalRadius, horizontalRadius)); + } + + public static List getPlayersInRange(World world, double posX, double posY, double posZ, double horizontalRadius, double verticalRadius) + { + return world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX-0.5f, posY-0.5f, posZ-0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(horizontalRadius, verticalRadius, horizontalRadius)); + } + + public static double gaussian(double d) + { + return d * ((rand.nextFloat() - 0.5D)); + } + + public static Vec3 getEntityBlockVector(Entity entity) + { + int posX = (int) Math.round(entity.posX - 0.5f); + int posY = (int) entity.posY; + int posZ = (int) Math.round(entity.posZ - 0.5f); + + return entity.getLookVec().createVectorHelper(posX, posY, posZ); + } + + public static ForgeDirection getDirectionForLookVector(Vec3 lookVec) + { + double distance = lookVec.lengthVector(); + + if(lookVec.yCoord>distance*0.9) + { + return ForgeDirection.UP; + } + if(lookVec.yCoordradius*1/root2) + { + return ForgeDirection.SOUTH; + } + if(lookVec.zCoord<-radius*1/root2) + { + return ForgeDirection.NORTH; + } + if(lookVec.xCoord>radius*1/root2) + { + return ForgeDirection.EAST; + } + if(lookVec.xCoord<-radius*1/root2) + { + return ForgeDirection.WEST; + } + + return ForgeDirection.EAST; + } + + public static void freezeWaterBlock(World world, int posX, int posY, int posZ) + { + Block block = world.getBlock(posX, posY, posZ); + + if(block == Blocks.water || block == Blocks.flowing_water) + { + world.setBlock(posX, posY, posZ, Blocks.ice); + } + } + + public static String getUsername(EntityPlayer player) + { + return player.getDisplayName(); + } + + public static void sendParticleToPlayer(EntityPlayer player, String str, double xCoord, double yCoord, double zCoord, double xVel, double yVel, double zVel) + { + + } + + public static void sendIndexedParticleToPlayer(EntityPlayer player, int index, double xCoord, double yCoord, double zCoord) + { + switch(index) + { + case 1: + SpellHelper.sendParticleToPlayer(player, "mobSpell", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 0.5117D, 0.0117D, 0.0117D); + case 2: + SpellHelper.sendParticleToPlayer(player, "reddust", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 0.82D, 0.941D, 0.91D); + case 3: + SpellHelper.sendParticleToPlayer(player, "mobSpell", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 1.0D, 0.371D, 0.371D); + case 4: + float f = (float) 1.0F; + float f1 = f * 0.6F + 0.4F; + float f2 = f * f * 0.7F - 0.5F; + float f3 = f * f * 0.6F - 0.7F; + + for (int l = 0; l < 8; ++l) + { + SpellHelper.sendParticleToPlayer(player,"reddust", xCoord + Math.random() - Math.random(), yCoord + Math.random() - Math.random(), zCoord + Math.random() - Math.random(), f1, f2, f3); + } + } + } + + public static void sendParticleToAllAround(World world, double xPos, double yPos, double zPos, int radius, int dimension, String str, double xCoord, double yCoord, double zCoord, double xVel, double yVel, double zVel) + { + List entities = SpellHelper.getPlayersInRange(world, xPos, yPos, zPos, radius, radius); + + if(entities==null) + { + return; + } + + for(EntityPlayer player : entities) + { + SpellHelper.sendParticleToPlayer(player, str, xCoord, yCoord, zCoord, xVel, yVel, zVel); + } + } + + public static void sendIndexedParticleToAllAround(World world, double xPos, double yPos, double zPos, int radius, int dimension, int index, double xCoord, double yCoord, double zCoord) + { + List entities = SpellHelper.getPlayersInRange(world, xPos, yPos, zPos, radius, radius); + + if(entities==null) + { + return; + } + + for(EntityPlayer player : entities) + { + SpellHelper.sendIndexedParticleToPlayer(player, index, xCoord, yCoord, zCoord); + } + } + + public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) + { + + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java new file mode 100644 index 00000000..aca6b077 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java @@ -0,0 +1,74 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public abstract class ExtrapolatedMeleeEntityEffect implements IMeleeSpellEntityEffect +{ + protected float range; + protected float radius; + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + protected int maxHit; + + public ExtrapolatedMeleeEntityEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + this.range = 0; + this.radius = 0; + this.maxHit = 1; + } + + @Override + public void onEntityImpact(World world, EntityPlayer entityPlayer) + { + Vec3 lookVec = entityPlayer.getLook(range); + double x = entityPlayer.posX + lookVec.xCoord; + double y = entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord; + double z = entityPlayer.posZ + lookVec.zCoord; + + List entities = world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(x-0.5f, y-0.5f, z-0.5f, x + 0.5f, y + 0.5f, z + 0.5f).expand(radius, radius, radius)); + int hit = 0; + + if(entities!=null) + { + for(Entity entity : entities) + { + if(hit0) + { + entity.hurtResistantTime = Math.max(0, -(potencyUpgrades+1)+entity.hurtResistantTime); + } + + return true; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java new file mode 100644 index 00000000..03471ca7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java @@ -0,0 +1,48 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellWorldEffect; + +public class MeleeDefensiveIce extends MeleeSpellWorldEffect +{ + public MeleeDefensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onWorldEffect(World world, EntityPlayer entityPlayer) + { + ForgeDirection look = SpellHelper.getCompassDirectionForLookVector(entityPlayer.getLookVec()); + + int width = this.powerUpgrades; + int height = this.powerUpgrades + 2; + + int xOffset = look.offsetX; + int zOffset = look.offsetZ; + + int range = this.potencyUpgrades + 1; + + Vec3 lookVec = SpellHelper.getEntityBlockVector(entityPlayer); + + int xStart = (int)(lookVec.xCoord) + range * xOffset; + int zStart = (int)(lookVec.zCoord) + range * zOffset; + int yStart = (int)(lookVec.yCoord); + + for(int i=-width; i<=width; i++) + { + for(int j=0; j entities = SpellHelper.getEntitiesInRange(world, player.posX, player.posY, player.posZ,horizRadius, vertRadius); + + if(entities==null) + { + return; + } + + int i=0; + int number = this.powerUpgrades+1; + + for(Entity entity : entities) + { + if(i>=number) + { + continue; + } + + if(entity instanceof EntityLivingBase && !entity.equals(player)) + { + ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id,60*(1+this.powerUpgrades),this.potencyUpgrades)); + + i++; + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java new file mode 100644 index 00000000..b17c5659 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.enhancement; + +public class SpellEnhancement +{ + public static final int POWER = 0; + public static final int EFFICIENCY = 1; + public static final int POTENCY = 2; + + private int state = this.POWER; + + protected SpellEnhancement(int state) + { + this.state = state; + } + + public int getState() + { + return this.state; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java new file mode 100644 index 00000000..2e0df1fb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.enhancement; + +public class SpellEnhancementCost extends SpellEnhancement +{ + + public SpellEnhancementCost() + { + super(SpellEnhancement.EFFICIENCY); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java new file mode 100644 index 00000000..6231c8a7 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.enhancement; + +public class SpellEnhancementPotency extends SpellEnhancement +{ + public SpellEnhancementPotency() + { + super(SpellEnhancement.POTENCY); + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java new file mode 100644 index 00000000..527dfe46 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.enhancement; + +public class SpellEnhancementPower extends SpellEnhancement +{ + + public SpellEnhancementPower() + { + super(SpellEnhancement.POWER); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java new file mode 100644 index 00000000..903f4fb9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java @@ -0,0 +1,143 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public abstract class HomSpell implements ISimpleSpell +{ + private int offensiveRangedEnergy; + private int offensiveMeleeEnergy; + private int defensiveEnergy; + private int environmentalEnergy; + + public HomSpell() + { + //super(id); + //this.setMaxStackSize(1); + // TODO Auto-generated constructor stub + } + + @Override + public abstract ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + ; + + @Override + public abstract ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + @Override + public abstract ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + @Override + public abstract ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + public int getOffensiveRangedEnergy() + { + return offensiveRangedEnergy; + } + + public int getOffensiveMeleeEnergy() + { + return offensiveMeleeEnergy; + } + + public int getDefensiveEnergy() + { + return defensiveEnergy; + } + + public int getEnvironmentalEnergy() + { + return environmentalEnergy; + } + + public void setEnergies(int offensiveRanged, int offensiveMelee, int defensive, int environmental) + { + this.offensiveRangedEnergy = offensiveRanged; + this.offensiveMeleeEnergy = offensiveMelee; + this.defensiveEnergy = defensive; + this.environmentalEnergy = environmental; + } + + public void setSpellParadigm(ItemStack itemStack, int paradigm) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + itemStack.stackTagCompound.setInteger("paradigm", paradigm); + } + + public int getSpellParadigm(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return (itemStack.stackTagCompound.getInteger("paradigm")); + } + + //@Override + public ItemStack useSpell(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + int paradigm = getSpellParadigm(par1ItemStack); + + if (par3EntityPlayer.isSneaking()) + { + if (paradigm < 3) + { + this.setSpellParadigm(par1ItemStack, paradigm + 1); + } else + { + this.setSpellParadigm(par1ItemStack, 0); + } + + return par1ItemStack; + } + + switch (paradigm) + { + case 0: + return this.onOffensiveRangedRightClick(par1ItemStack, par2World, par3EntityPlayer); + + case 1: + return this.onOffensiveMeleeRightClick(par1ItemStack, par2World, par3EntityPlayer); + + case 2: + return this.onDefensiveRightClick(par1ItemStack, par2World, par3EntityPlayer); + + case 3: + return this.onEnvironmentalRightClick(par1ItemStack, par2World, par3EntityPlayer); + } + + return par1ItemStack; + } + +// @Override +// public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) +// { +// if (!(par1ItemStack.stackTagCompound == null)) +// { +// if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) +// { +// par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); +// } +// +// par3List.add("Current paradigm: " + this.getSpellParadigm(par1ItemStack)); +// } +// } + + public int getDimensionID(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.stackTagCompound.getInteger("dimensionId"); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java new file mode 100644 index 00000000..41cfcaab --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java @@ -0,0 +1,26 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import net.minecraft.item.ItemStack; + +public class HomSpellComponent +{ + public HomSpell spell; + public ItemStack item; + public int blockID; + + public HomSpellComponent(ItemStack item, HomSpell spell) + { + this.item = item; + this.spell = spell; + } + + public HomSpell getSpell() + { + return spell; + } + + public ItemStack getItemStack() + { + return this.item; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java new file mode 100644 index 00000000..645bd99c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java @@ -0,0 +1,55 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class HomSpellRegistry +{ + public static List spellList = new ArrayList(); + + public static void registerBasicSpell(ItemStack item, HomSpell spell) + { + spellList.add(new HomSpellComponent(item, spell)); + } + + public static HomSpell getSpellForItemStack(ItemStack testItem) + { + if (testItem == null) + { + return null; + } + + for (HomSpellComponent hsc : spellList) + { + ItemStack item = hsc.getItemStack(); + + if (item != null) + { + if (item.getItem() instanceof ItemBlock) + { + if (testItem.getItem() instanceof ItemBlock) + { + if (testItem.getItem() == item.getItem()) + { + return hsc.getSpell(); + } + } + } else + { + if (!(testItem.getItem() instanceof ItemBlock)) + { + if (testItem.getItem() == item.getItem()) + { + return hsc.getSpell(); + } + } + } + } + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java new file mode 100644 index 00000000..77a8799d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java @@ -0,0 +1,16 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ISimpleSpell +{ + public abstract ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + public abstract ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + public abstract ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); + + public abstract ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java new file mode 100644 index 00000000..e4a31e55 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java @@ -0,0 +1,199 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.MudProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellEarthBender extends HomSpell +{ + Random itemRand = new Random(); + + public SpellEarthBender() + { + super(); + this.setEnergies(100, 150, 350, 200); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.spawnEntityInWorld(new MudProjectile(par2World, par3EntityPlayer, 8, false)); + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + if (!par2World.isRemote) + { + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + par2World.spawnEntityInWorld(new MudProjectile(par2World, par3EntityPlayer, 3, 3, par3EntityPlayer.posX, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight(), par3EntityPlayer.posZ, par3EntityPlayer.rotationYaw + i * 10F, par3EntityPlayer.rotationPitch + j * 5F, true)); + } + } + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + int posX = (int) xCoord; + int posY = (int) yCoord; + int posZ = (int) zCoord; + Block blockID = Blocks.stone; + + if (par2World.isAirBlock(posX, posY + 3, posZ)) + { + par2World.setBlock(posX, posY + 3, posZ, Blocks.glass); + } + + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + if (par2World.isAirBlock(posX + i - 1, posY + j, posZ - 2)) + { + par2World.setBlock(posX + i - 1, posY + j, posZ - 2, blockID); + } + + if (par2World.isAirBlock(posX + 2, posY + j, posZ - 1 + i)) + { + par2World.setBlock(posX + 2, posY + j, posZ - 1 + i, blockID); + } + + if (par2World.isAirBlock(posX - i + 1, posY + j, posZ + 2)) + { + par2World.setBlock(posX - i + 1, posY + j, posZ + 2, blockID); + } + + if (par2World.isAirBlock(posX - 2, posY + j, posZ + 1 - i)) + { + par2World.setBlock(posX - 2, posY + j, posZ + 1 - i, blockID); + } + + { + if (par2World.isAirBlock(posX - 1 + i, posY + 3, posZ - 1 + j)) + { + par2World.setBlock(posX - 1 + i, posY + 3, posZ - 1 + j, blockID); + } + } + } + } + + for (int i = 0; i < 20; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F)); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + int range = 3; + + if (!par2World.isRemote) + { + for (int i = -range; i <= range; i++) + { + for (int j = -1; j <= 1; j++) + { + for (int k = -range; k <= range; k++) + { + if (par2World.getBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k) == Blocks.water || par2World.getBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k) == Blocks.flowing_water) + { + int x = par2World.rand.nextInt(2); + + if (x == 0) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k, Blocks.sand); + } else + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k, Blocks.dirt); + } + } + } + } + } + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 16; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, 0.0F, 0.410F, 1.0F)); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java new file mode 100644 index 00000000..44ede225 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java @@ -0,0 +1,116 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import WayofTime.alchemicalWizardry.common.entity.projectile.ExplosionProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.Random; + +public class SpellExplosions extends HomSpell +{ + Random itemRand = new Random(); + + public SpellExplosions() + { + super(); + this.setEnergies(400, 500, 1900, 1500); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new ExplosionProjectile(par2World, par3EntityPlayer, 6, true)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + int distance = 4; + double yaw = par3EntityPlayer.rotationYaw / 180 * Math.PI; + double pitch = par3EntityPlayer.rotationPitch / 180 * Math.PI; + par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX + Math.sin(yaw) * Math.cos(pitch) * (-distance), par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance, par3EntityPlayer.posZ + Math.cos(yaw) * Math.cos(pitch) * distance, (float) (3), true); + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + int distance = 4; +// double yaw = par3EntityPlayer.rotationYaw/180*Math.PI; +// double pitch = par3EntityPlayer.rotationPitch/180*Math.PI; + par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight(), par3EntityPlayer.posZ, (float) (distance), false); + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + int radius = 3; + + for (int i = 0; i < 360; i += 36) + { + par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX + Math.cos(i) * radius, par3EntityPlayer.posY, par3EntityPlayer.posZ + Math.sin(i) * radius, (float) (2), true); + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java new file mode 100644 index 00000000..de01a35f --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java @@ -0,0 +1,174 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.entity.projectile.FireProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; + +public class SpellFireBurst extends HomSpell +{ + public Random itemRand = new Random(); + + public SpellFireBurst() + { + super(); + this.setEnergies(100, 300, 400, 100); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 7)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 8, 2, par3EntityPlayer.posX, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight(), par3EntityPlayer.posZ, par3EntityPlayer.rotationYaw + i * 10F, par3EntityPlayer.rotationPitch + j * 10F)); + } + } + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + int d0 = 2; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) par3EntityPlayer.posX, (double) par3EntityPlayer.posY, (double) par3EntityPlayer.posZ, (double) (par3EntityPlayer.posX + 1), (double) (par3EntityPlayer.posY + 2), (double) (par3EntityPlayer.posZ + 1)).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + entityLiving.setFire(100); + entityLiving.attackEntityFrom(DamageSource.inFire, 2); + } + +// if (!par2World.isRemote) +// { +// +// for(int i=0;i<10;i++) +// { +// for(int j=0;j<5;j++) +// { +// par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 10,5,par3EntityPlayer.posX,par3EntityPlayer.posY+par3EntityPlayer.getEyeHeight(),par3EntityPlayer.posZ, par3EntityPlayer.rotationYaw+i*36F,par3EntityPlayer.rotationPitch+j*72F)); +// } +// } +// } + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + World worldObj = par2World; + + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + for (int k = -1; k <= 1; k++) + { + if (worldObj.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k)) + { + if (worldObj.rand.nextFloat() < 0.8F) + { + worldObj.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k, Blocks.fire); + } + } + } + } + } + + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java new file mode 100644 index 00000000..bfa441eb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java @@ -0,0 +1,208 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.entity.projectile.IceProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; + +public class SpellFrozenWater extends HomSpell +{ + public Random itemRand = new Random(); + + public SpellFrozenWater() + { + super(); + this.setEnergies(100, 200, 150, 100); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new IceProjectile(par2World, par3EntityPlayer, 6)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + for (int i = -2; i <= 2; i++) + { + par2World.spawnEntityInWorld(new IceProjectile(par2World, par3EntityPlayer, 6, 2, par3EntityPlayer.posX, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight(), par3EntityPlayer.posZ, par3EntityPlayer.rotationYaw + i * 5F, par3EntityPlayer.rotationPitch)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, getDefensiveEnergy()); + } + + float yaw = par3EntityPlayer.rotationYaw; + float pitch = par3EntityPlayer.rotationPitch; + int range = 2; + + if (pitch > 40F) + { + for (int i = -range; i <= range; i++) + { + for (int j = -range; j <= range; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY - 1, (int) par3EntityPlayer.posZ + j)) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY - 1, (int) par3EntityPlayer.posZ + j, Blocks.ice); + } + } + } + + return par1ItemStack; + } else if (pitch < -40F) + { + for (int i = -range; i <= range; i++) + { + for (int j = -range; j <= range; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + 3, (int) par3EntityPlayer.posZ + j)) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + 3, (int) par3EntityPlayer.posZ + j, Blocks.ice); + } + } + } + + return par1ItemStack; + } + + if ((yaw >= 315 && yaw < 360) || (yaw >= 0 && yaw < 45)) + { + for (int i = -range; i <= range; i++) + { + for (int j = 0; j < range * 2 + 1; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + 2)) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + 2, Blocks.ice); + } + } + } + } else if (yaw >= 45 && yaw < 135) + { + for (int i = -range; i <= range; i++) + { + for (int j = 0; j < range * 2 + 1; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX - 2, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + i)) + { + par2World.setBlock((int) par3EntityPlayer.posX - 2, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + i, Blocks.ice); + } + } + } + } else if (yaw >= 135 && yaw < 225) + { + for (int i = -range; i <= range; i++) + { + for (int j = 0; j < range * 2 + 1; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ - 2)) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ - 2, Blocks.ice); + } + } + } + } else + { + for (int i = -range; i <= range; i++) + { + for (int j = 0; j < range * 2 + 1; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + 2, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + i)) + { + par2World.setBlock((int) par3EntityPlayer.posX + 2, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + i, Blocks.ice); + } + } + } + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + int radius = 3; + int posX = (int) par3EntityPlayer.posX; + int posY = (int) par3EntityPlayer.posY; + int posZ = (int) par3EntityPlayer.posZ; + + for (int i = -radius; i <= radius; i++) + { + for (int j = -radius; j <= radius; j++) + { + for (int k = -radius; k <= radius; k++) + { + Block block = par2World.getBlock((int) par3EntityPlayer.posX + i - 1, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k); + + //Block block = Block.blocksList[blockID]; + if (block == Blocks.water || block == Blocks.flowing_water) + { + par2World.setBlock((int) par3EntityPlayer.posX + i - 1, (int) par3EntityPlayer.posY + j, (int) par3EntityPlayer.posZ + k, Blocks.ice); + } + } + } + } + +// int blockID = par2World.getBlockId((int)par3EntityPlayer.posX+i, (int)par3EntityPlayer.posY+j, (int)par3EntityPlayer.posZ+k); +// //Block block = Block.blocksList[blockID]; +// if(blockID==Block.waterMoving.blockID||blockID==Block.waterStill.blockID) +// { +// par2World.setBlock((int)par3EntityPlayer.posX+i, (int)par3EntityPlayer.posY+j, (int)par3EntityPlayer.posZ+k, Blocks.ice); +// } + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java new file mode 100644 index 00000000..f39035f4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java @@ -0,0 +1,200 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellHolyBlast extends HomSpell +{ + Random itemRand = new Random(); + + public SpellHolyBlast() + { + super(); + this.setEnergies(100, 300, 500, 400); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new HolyProjectile(par2World, par3EntityPlayer, 8)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + int distance = 2; + double yaw = par3EntityPlayer.rotationYaw / 180 * Math.PI; + double pitch = par3EntityPlayer.rotationPitch / 180 * Math.PI; + double xCoord = par3EntityPlayer.posX + Math.sin(yaw) * Math.cos(pitch) * (-distance); + double yCoord = par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance; + double zCoord = par3EntityPlayer.posZ + Math.cos(yaw) * Math.cos(pitch) * distance; + float d0 = 0.5f; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB(par3EntityPlayer.posX - 0.5 + Math.sin(yaw) * Math.cos(pitch) * (-distance), par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance, par3EntityPlayer.posZ - 0.5 + Math.cos(yaw) * Math.cos(pitch) * distance, par3EntityPlayer.posX + Math.sin(yaw) * Math.cos(pitch) * (-distance) + 0.5, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance + 1, par3EntityPlayer.posZ + Math.cos(yaw) * Math.cos(pitch) * distance + 0.5).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + int i = 1; + + if (entityLiving.isEntityUndead()) + { + i = 3; + } + + //entityLiving.setFire(50); + entityLiving.attackEntityFrom(DamageSource.causePlayerDamage(par3EntityPlayer), 5 * i); + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + } + + par2World.createExplosion(par3EntityPlayer, xCoord, yCoord, zCoord, (float) (1), false); + + for (int i = 0; i < 5; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F)); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + if (!par2World.isRemote) + { + for (int i = 0; i < 360; i += 18) + { + par2World.spawnEntityInWorld(new HolyProjectile(par2World, par3EntityPlayer, 8, 3, par3EntityPlayer.posX, par3EntityPlayer.posY + (par3EntityPlayer.height / 2), par3EntityPlayer.posZ, i, 0)); + } + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + int d0 = 3; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) par3EntityPlayer.posX, (double) par3EntityPlayer.posY, (double) par3EntityPlayer.posZ, (double) (par3EntityPlayer.posX + 1), (double) (par3EntityPlayer.posY + 2), (double) (par3EntityPlayer.posZ + 1)).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + int i = 1; + + if (entityLiving.isEntityUndead()) + { + i = 3; + } + + //entityLiving.setFire(50); + entityLiving.attackEntityFrom(DamageSource.causePlayerDamage(par3EntityPlayer), 5 * i); + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + } + + par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float) (2), false); + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 20; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F); + } + + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java new file mode 100644 index 00000000..576b9884 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java @@ -0,0 +1,141 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Random; + +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.LightningBoltProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellLightningBolt extends HomSpell +{ + Random itemRand = new Random(); + + public SpellLightningBolt() + { + super(); + this.setEnergies(75, 200, 700, 700); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new LightningBoltProjectile(par2World, par3EntityPlayer, 8, false)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + //TODO Make it work better...? + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + par2World.getWorldInfo().setRaining(true); + //par2World.setRainStrength(1.0F); + par2World.setRainStrength(1.0f); + par2World.setThunderStrength(1.0f); + par2World.getWorldInfo().setThunderTime(0); + par2World.getWorldInfo().setThundering(true); + + for (int i = 0; i < 5; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F)); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 5; i++) + { + par2World.addWeatherEffect(new EntityLightningBolt(par2World, xCoord + itemRand.nextInt(64) - 32, yCoord + itemRand.nextInt(8) - 8, zCoord + itemRand.nextInt(64) - 32)); + } + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + itemRand.nextFloat() - itemRand.nextFloat(), yCoord + itemRand.nextFloat() - itemRand.nextFloat(), zCoord + itemRand.nextFloat() - itemRand.nextFloat(), 1.0F, 1.0F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new LightningBoltProjectile(par2World, par3EntityPlayer, 8, true)); + } + + return par1ItemStack; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java new file mode 100644 index 00000000..30f5d5bf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java @@ -0,0 +1,289 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityEnderman; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.TeleportProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellTeleport extends HomSpell +{ + Random itemRand = new Random(); + + public SpellTeleport() + { + super(); + this.setEnergies(500, 300, 500, 1000); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.spawnEntityInWorld(new TeleportProjectile(par2World, par3EntityPlayer, 8, true)); + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + EntityEnderman g; + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + par2World.spawnEntityInWorld(new TeleportProjectile(par2World, par3EntityPlayer, 8, false)); + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + SpellTeleport.teleportRandomly(par3EntityPlayer, 128); + + for (int i = 0; i < 20; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("portal", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, itemRand.nextFloat(), itemRand.nextFloat(), itemRand.nextFloat())); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "portal", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, itemRand.nextFloat(), itemRand.nextFloat(), itemRand.nextFloat()); + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + if (!par2World.isRemote) + { + int d0 = 3; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) par3EntityPlayer.posX, (double) par3EntityPlayer.posY, (double) par3EntityPlayer.posZ, (double) (par3EntityPlayer.posX + 1), (double) (par3EntityPlayer.posY + 2), (double) (par3EntityPlayer.posZ + 1)).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + SpellTeleport.teleportRandomly(entityLiving, 128); + //entityLiving.attackEntityFrom(DamageSource.inFire, 5); + } + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 32; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "portal", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 2, itemRand.nextFloat(), itemRand.nextFloat(), itemRand.nextFloat()); + } + + return par1ItemStack; + } + + public static boolean teleportRandomly(EntityLivingBase entityLiving, double distance) + { + double x = entityLiving.posX; + double y = entityLiving.posY; + double z = entityLiving.posZ; + Random rand = new Random(); + double d0 = x + (rand.nextDouble() - 0.5D) * distance; + double d1 = y + (double) (rand.nextInt((int) distance) - (distance) / 2); + double d2 = z + (rand.nextDouble() - 0.5D) * distance; + int i = 0; + + while (!SpellTeleport.teleportTo(entityLiving, d0, d1, d2, x, y, z) && i < 100) + { + d0 = x + (rand.nextDouble() - 0.5D) * distance; + d1 = y + (double) (rand.nextInt((int) distance) - (distance) / 2); + d2 = z + (rand.nextDouble() - 0.5D) * distance; + i++; + } + + if (i >= 100) + { + return false; + } + + return true; + //return SpellTeleport.teleportTo(entityLiving, d0, d1, d2,x,y,z); + } + + private static boolean teleportTo(EntityLivingBase entityLiving, double par1, double par3, double par5, double lastX, double lastY, double lastZ) + { + EnderTeleportEvent event = new EnderTeleportEvent(entityLiving, par1, par3, par5, 0); + + if (MinecraftForge.EVENT_BUS.post(event)) + { + return false; + } + + double d3 = lastX; + double d4 = lastY; + double d5 = lastZ; + SpellTeleport.moveEntityViaTeleport(entityLiving, event.targetX, event.targetY, event.targetZ); + boolean flag = false; + int i = MathHelper.floor_double(entityLiving.posX); + int j = MathHelper.floor_double(entityLiving.posY); + int k = MathHelper.floor_double(entityLiving.posZ); + Block l; + + if (entityLiving.worldObj.blockExists(i, j, k)) + { + boolean flag1 = false; + + while (!flag1 && j > 0) + { + l = entityLiving.worldObj.getBlock(i, j - 1, k); + + if (l != null && l.getMaterial().blocksMovement()) + { + flag1 = true; + } else + { + --entityLiving.posY; + --j; + } + } + + if (flag1) + { + SpellTeleport.moveEntityViaTeleport(entityLiving, entityLiving.posX, entityLiving.posY, entityLiving.posZ); + + if (entityLiving.worldObj.getCollidingBoundingBoxes(entityLiving, entityLiving.boundingBox).isEmpty() && !entityLiving.worldObj.isAnyLiquid(entityLiving.boundingBox)) + { + flag = true; + } + } + } + + if (!flag) + { + SpellTeleport.moveEntityViaTeleport(entityLiving, d3, d4, d5); + return false; + } else + { + short short1 = 128; + + for (j = 0; j < short1; ++j) + { + double d6 = (double) j / ((double) short1 - 1.0D); + float f = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; + float f1 = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; + float f2 = (entityLiving.worldObj.rand.nextFloat() - 0.5F) * 0.2F; + double d7 = d3 + (entityLiving.posX - d3) * d6 + (entityLiving.worldObj.rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; + double d8 = d4 + (entityLiving.posY - d4) * d6 + entityLiving.worldObj.rand.nextDouble() * (double) entityLiving.height; + double d9 = d5 + (entityLiving.posZ - d5) * d6 + (entityLiving.worldObj.rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; + entityLiving.worldObj.spawnParticle("portal", d7, d8, d9, (double) f, (double) f1, (double) f2); + } + +// this.worldObj.playSoundEffect(d3, d4, d5, "mob.endermen.portal", 1.0F, 1.0F); +// this.playSound("mob.endermen.portal", 1.0F, 1.0F); + return true; + } + } + + public static void moveEntityViaTeleport(EntityLivingBase entityLiving, double x, double y, double z) + { + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving != null && entityLiving instanceof EntityPlayerMP) + { + EntityPlayerMP entityplayermp = (EntityPlayerMP) entityLiving; + + //if (!entityplayermp.playerNetServerHandler.connectionClosed && entityplayermp.worldObj == entityLiving.worldObj) + if (entityplayermp.worldObj == entityLiving.worldObj) + { + EnderTeleportEvent event = new EnderTeleportEvent(entityplayermp, x, y, z, 5.0F); + + if (!MinecraftForge.EVENT_BUS.post(event)) + { + if (entityLiving.isRiding()) + { + entityLiving.mountEntity((Entity) null); + } + + entityLiving.setPositionAndUpdate(event.targetX, event.targetY, event.targetZ); +// this.getThrower().fallDistance = 0.0F; +// this.getThrower().attackEntityFrom(DamageSource.fall, event.attackDamage); + } + } + } + } else if (entityLiving != null) + { + entityLiving.setPosition(x, y, z); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java new file mode 100644 index 00000000..91f9c1e5 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java @@ -0,0 +1,180 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.WaterProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellWateryGrave extends HomSpell +{ + Random itemRand = new Random(); + + public SpellWateryGrave() + { + super(); + this.setEnergies(250, 350, 500, 750); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.spawnEntityInWorld(new WaterProjectile(par2World, par3EntityPlayer, 8)); + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + if (!par2World.isRemote) + { + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + par2World.spawnEntityInWorld(new WaterProjectile(par2World, par3EntityPlayer, 3, 3, par3EntityPlayer.posX, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight(), par3EntityPlayer.posZ, par3EntityPlayer.rotationYaw + i * 10F, par3EntityPlayer.rotationPitch + j * 5F)); + } + } + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + int d0 = 3; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) par3EntityPlayer.posX, (double) par3EntityPlayer.posY, (double) par3EntityPlayer.posZ, (double) (par3EntityPlayer.posX + 1), (double) (par3EntityPlayer.posY + 2), (double) (par3EntityPlayer.posZ + 1)).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + int x = 1; + + if (entityLiving.isImmuneToFire()) + { + x = 2; + } + + entityLiving.attackEntityFrom(DamageSource.drown, 2 * x); + entityLiving.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionDrowning.id, 100, x - 1)); + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 20; i++) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, PacketHandler.getCustomParticlePacket("mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F)); + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + int range = 2; + + if (!par2World.isRemote) + { + for (int i = -range; i <= range; i++) + { + for (int j = -range; j <= range; j++) + { + if (par2World.isAirBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY, (int) par3EntityPlayer.posZ + j)) + { + par2World.setBlock((int) par3EntityPlayer.posX + i, (int) par3EntityPlayer.posY, (int) par3EntityPlayer.posZ + j, Blocks.water); + } + } + } + } + + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 16; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java new file mode 100644 index 00000000..516ff944 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java @@ -0,0 +1,219 @@ +package WayofTime.alchemicalWizardry.common.spell.simple; + +import ibxm.Player; + +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.entity.projectile.WindGustProjectile; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class SpellWindGust extends HomSpell +{ + Random itemRand = new Random(); + + public SpellWindGust() + { + super(); + this.setEnergies(300, 400, 300, 500); + //this.setCreativeTab(CreativeTabs.tabMisc); + } + + @Override + public ItemStack onOffensiveRangedRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveRangedEnergy()); + } + + par2World.playSoundAtEntity(par3EntityPlayer, "random.fizz", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); + + if (!par2World.isRemote) + { + //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); + par2World.spawnEntityInWorld(new WindGustProjectile(par2World, par3EntityPlayer, 8)); + } + + return par1ItemStack; + } + + @Override + public ItemStack onOffensiveMeleeRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getOffensiveMeleeEnergy()); + } + + int distance = 3; + double yaw = par3EntityPlayer.rotationYaw / 180 * Math.PI; + double pitch = par3EntityPlayer.rotationPitch / 180 * Math.PI; + double xCoord = par3EntityPlayer.posX + Math.sin(yaw) * Math.cos(pitch) * (-distance); + double yCoord = par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance; + double zCoord = par3EntityPlayer.posZ + Math.cos(yaw) * Math.cos(pitch) * distance; + float d0 = 0.5f; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB(par3EntityPlayer.posX - 0.5 + Math.sin(yaw) * Math.cos(pitch) * (-distance), par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance, par3EntityPlayer.posZ - 0.5 + Math.cos(yaw) * Math.cos(pitch) * distance, par3EntityPlayer.posX + Math.sin(yaw) * Math.cos(pitch) * (-distance) + 0.5, par3EntityPlayer.posY + par3EntityPlayer.getEyeHeight() + Math.sin(-pitch) * distance + 1, par3EntityPlayer.posZ + Math.cos(yaw) * Math.cos(pitch) * distance + 0.5).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + //entityLiving.setFire(50); + //entityLiving.attackEntityFrom(DamageSource.causePlayerDamage(par3EntityPlayer), 5*i); + //entityLiving.setVelocity(Math.sin(-yaw)*2, 2, Math.cos(yaw)*2); + entityLiving.motionX = Math.sin(-yaw) * 2; + entityLiving.motionY = 2; + entityLiving.motionZ = Math.cos(yaw) * 2; + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + } + + //par2World.createExplosion(par3EntityPlayer, xCoord, yCoord, zCoord, (float)(1), false); + + for (int i = 0; i < 5; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + + } + + return par1ItemStack; + } + + @Override + public ItemStack onDefensiveRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getDefensiveEnergy()); + } + + int distance = 3; + double yaw = par3EntityPlayer.rotationYaw / 180 * Math.PI; + double pitch = par3EntityPlayer.rotationPitch / 180 * Math.PI; + double wantedVelocity = 5; + double xVel = Math.sin(yaw) * Math.cos(pitch) * (-wantedVelocity); + double yVel = Math.sin(-pitch) * wantedVelocity; + double zVel = Math.cos(yaw) * Math.cos(pitch) * wantedVelocity; + Vec3 vec = par3EntityPlayer.getLookVec(); + par3EntityPlayer.motionX = vec.xCoord * wantedVelocity; + par3EntityPlayer.motionY = vec.yCoord * wantedVelocity; + par3EntityPlayer.motionZ = vec.zCoord * wantedVelocity; + //PacketDispatcher.sendPacketToPlayer(PacketHandler.getPlayerVelocitySettingPacket(xVel, yVel, zVel), (Player) par3EntityPlayer); + SpellHelper.setPlayerSpeedFromServer(par3EntityPlayer, xVel, yVel, zVel); + par2World.playSoundEffect((double) ((float) par3EntityPlayer.posX + 0.5F), (double) ((float) par3EntityPlayer.posY + 0.5F), (double) ((float) par3EntityPlayer.posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (par2World.rand.nextFloat() - par2World.rand.nextFloat()) * 0.8F); + par3EntityPlayer.fallDistance = 0; + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } + + @Override + public ItemStack onEnvironmentalRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, this.getEnvironmentalEnergy()); + } + + int d0 = 3; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getAABBPool().getAABB((double) par3EntityPlayer.posX, (double) par3EntityPlayer.posY, (double) par3EntityPlayer.posZ, (double) (par3EntityPlayer.posX + 1), (double) (par3EntityPlayer.posY + 2), (double) (par3EntityPlayer.posZ + 1)).expand(d0, d0, d0); + //axisalignedbb.maxY = (double)this.worldObj.getHeight(); + List list = par3EntityPlayer.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); + Iterator iterator = list.iterator(); + double xCoord = par3EntityPlayer.posX; + double yCoord = par3EntityPlayer.posY; + double zCoord = par3EntityPlayer.posZ; + double wantedVel = 2; + + while (iterator.hasNext()) + { + EntityLivingBase entityLiving = (EntityLivingBase) iterator.next(); + + if (entityLiving instanceof EntityPlayer) + { + if (entityLiving.equals(par3EntityPlayer)) + { + continue; + } + } + + double posXDif = entityLiving.posX - par3EntityPlayer.posX; + double posYDif = entityLiving.posY - par3EntityPlayer.posY + 1; + double posZDif = entityLiving.posZ - par3EntityPlayer.posZ; + double distance2 = Math.pow(posXDif, 2) + Math.pow(posYDif, 2) + Math.pow(posZDif, 2); + double distance = Math.sqrt(distance2); + //entityLiving.setVelocity(posXDif*wantedVel/distance, posYDif*wantedVel/distance, posZDif*wantedVel/distance); + entityLiving.motionX = posXDif * wantedVel / distance; + entityLiving.motionY = posYDif * wantedVel / distance; + entityLiving.motionZ = posZDif * wantedVel / distance; + //entityLiving.setFire(50); + //entityLiving.attackEntityFrom(DamageSource.causePlayerDamage(par3EntityPlayer), 5*i); + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + } + + //par2World.createExplosion(par3EntityPlayer, par3EntityPlayer.posX, par3EntityPlayer.posY, par3EntityPlayer.posZ, (float)(2), false); + + for (int i = 0; i < 20; i++) + { + SpellHelper.sendParticleToAllAround(par2World, xCoord, yCoord, zCoord, 30, par2World.provider.dimensionId, "mobSpell", xCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, yCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, zCoord + (itemRand.nextFloat() - itemRand.nextFloat()) * 3, 0.0F, 0.410F, 1.0F); + } + + return par1ItemStack; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java new file mode 100644 index 00000000..eaea8feb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java @@ -0,0 +1,19 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.World; + +public class SummoningFallenAngel extends SummoningHelper +{ + public SummoningFallenAngel(int id) + { + super(id); + // TODO Auto-generated constructor stub + } + + public EntityLivingBase getEntity(World worldObj) + { + return new EntityFallenAngel(worldObj); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelper.java new file mode 100644 index 00000000..b4b459ee --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelper.java @@ -0,0 +1,98 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.EntityAirElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.*; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.world.World; + +public class SummoningHelper +{ + private int id; + + public SummoningHelper(int id) + { + this.id = id; + } + + public EntityLivingBase getEntity(World worldObj) + { + if (this.id == AlchemicalWizardry.entityFallenAngelID) + { + return new EntityFallenAngel(worldObj); + } + + if (this.id == AlchemicalWizardry.entityLowerGuardianID) + { + return new EntityLowerGuardian(worldObj); + } + + if (this.id == AlchemicalWizardry.entityBileDemonID) + { + return new EntityBileDemon(worldObj); + } + + if (this.id == AlchemicalWizardry.entityWingedFireDemonID) + { + return new EntityWingedFireDemon(worldObj); + } + + if (this.id == AlchemicalWizardry.entitySmallEarthGolemID) + { + return new EntitySmallEarthGolem(worldObj); + } + + if (this.id == AlchemicalWizardry.entityIceDemonID) + { + return new EntityIceDemon(worldObj); + } + + if (this.id == AlchemicalWizardry.entityBoulderFistID) + { + return new EntityBoulderFist(worldObj); + } + + if (this.id == AlchemicalWizardry.entityShadeID) + { + return new EntityShade(worldObj); + } + + if (this.id == AlchemicalWizardry.entityAirElementalID) + { + return new EntityAirElemental(worldObj); + } + + if (this.id == AlchemicalWizardry.entityWaterElementalID) + { + return new EntityWaterElemental(worldObj); + } + + if (this.id == AlchemicalWizardry.entityEarthElementalID) + { + return new EntityEarthElemental(worldObj); + } + + if (this.id == AlchemicalWizardry.entityFireElementalID) + { + return new EntityFireElemental(worldObj); + } + + if (this.id == AlchemicalWizardry.entityShadeElementalID) + { + return new EntityShadeElemental(worldObj); + } + + if (this.id == AlchemicalWizardry.entityHolyElementalID) + { + return new EntityHolyElemental(worldObj); + } + + return new EntityPig(worldObj); + } + + public int getSummoningHelperID() + { + return id; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistry.java new file mode 100644 index 00000000..8f4fac89 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistry.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; + +public class SummoningRegistry +{ + public static List summoningList = new ArrayList(); + + public static void registerSummon(SummoningHelper s, ItemStack[] ring1, ItemStack[] ring2, ItemStack[] ring3, int amountUsed, int bloodOrbLevel) + { + summoningList.add(new SummoningRegistryComponent(s, ring1, ring2, ring3, amountUsed, bloodOrbLevel)); + } + + public static boolean isRecipeValid(int bloodOrbLevel, ItemStack[] test1, ItemStack[] test2, ItemStack[] test3) + { + for (SummoningRegistryComponent src : summoningList) + { + if (src.getBloodOrbLevel() <= bloodOrbLevel && src.compareRing(1, test1) && src.compareRing(2, test2) && src.compareRing(3, test3)) + { + return true; + } + } + + return false; + } + + public static SummoningRegistryComponent getRegistryComponent(int bloodOrbLevel, ItemStack[] test1, ItemStack[] test2, ItemStack[] test3) + { + for (SummoningRegistryComponent src : summoningList) + { + if (src.getBloodOrbLevel() <= bloodOrbLevel && src.compareRing(1, test1) && src.compareRing(2, test2) && src.compareRing(3, test3)) + { + return src; + } + } + + return null; + } + + public static EntityLivingBase getEntity(World worldObj, int bloodOrbLevel, ItemStack[] test1, ItemStack[] test2, ItemStack[] test3) + { + for (SummoningRegistryComponent src : summoningList) + { + if (src.getBloodOrbLevel() <= bloodOrbLevel && src.compareRing(1, test1) && src.compareRing(2, test2) && src.compareRing(3, test3)) + { + return src.getEntity(worldObj); + } + } + + return null; + } + + public static EntityLivingBase getEntityWithID(World worldObj, int id) + { + for (SummoningRegistryComponent src : summoningList) + { + if (src.getSummoningHelperID() == id) + { + return src.getEntity(worldObj); + } + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistryComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistryComponent.java new file mode 100644 index 00000000..c44efedf --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/SummoningRegistryComponent.java @@ -0,0 +1,231 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +public class SummoningRegistryComponent +{ + public ItemStack[] ring1 = new ItemStack[6]; + public ItemStack[] ring2 = new ItemStack[6]; + public ItemStack[] ring3 = new ItemStack[6]; + public SummoningHelper summoningHelper; + public int summoningCost; + public int bloodOrbLevel; + + public SummoningRegistryComponent(SummoningHelper s, ItemStack[] newRing1, ItemStack[] newRing2, ItemStack[] newRing3, int amount, int bloodOrbLevel) + { + this.summoningHelper = s; + this.ring1 = newRing1; + this.ring2 = newRing2; + this.ring3 = newRing3; + this.summoningCost = amount; + this.bloodOrbLevel = bloodOrbLevel; + + if (this.ring1.length != 6) + { + ItemStack[] newRecipe = new ItemStack[6]; + + for (int i = 0; i < 6; i++) + { + if (i + 1 > this.ring1.length) + { + newRecipe[i] = null; + } else + { + newRecipe[i] = this.ring1[i]; + } + } + + this.ring1 = newRecipe; + } + + if (this.ring2.length != 6) + { + ItemStack[] newRecipe = new ItemStack[6]; + + for (int i = 0; i < 6; i++) + { + if (i + 1 > this.ring2.length) + { + newRecipe[i] = null; + } else + { + newRecipe[i] = this.ring2[i]; + } + } + + this.ring2 = newRecipe; + } + + if (this.ring3.length != 6) + { + ItemStack[] newRecipe = new ItemStack[6]; + + for (int i = 0; i < 6; i++) + { + if (i + 1 > this.ring3.length) + { + newRecipe[i] = null; + } else + { + newRecipe[i] = this.ring3[i]; + } + } + + this.ring3 = newRecipe; + } + } + + public boolean compareRing(int ring, ItemStack[] checkedRingRecipe) + { + ItemStack[] recipe; + + if (checkedRingRecipe.length < 6) + { + return false; + } + + switch (ring) + { + case 1: + recipe = ring1; + break; + + case 2: + recipe = ring2; + break; + + case 3: + recipe = ring3; + break; + + default: + recipe = ring1; + } + + if (recipe.length != 6) + { + ItemStack[] newRecipe = new ItemStack[6]; + + for (int i = 0; i < 6; i++) + { + if (i + 1 > recipe.length) + { + newRecipe[i] = null; + } else + { + newRecipe[i] = recipe[i]; + } + } + + recipe = newRecipe; + } + + boolean[] checkList = new boolean[6]; + + for (int i = 0; i < 6; i++) + { + checkList[i] = false; + } + + for (int i = 0; i < 6; i++) + { + ItemStack recipeItemStack = recipe[i]; + + if (recipeItemStack == null) + { + continue; + } + + boolean test = false; + + for (int j = 0; j < 6; j++) + { + if (checkList[j]) + { + continue; + } + + ItemStack checkedItemStack = checkedRingRecipe[j]; + + if (checkedItemStack == null) + { + continue; + } + + boolean quickTest = false; + + if (recipeItemStack.getItem() instanceof ItemBlock) + { + if (checkedItemStack.getItem() instanceof ItemBlock) + { + quickTest = true; + } + } else if (!(checkedItemStack.getItem() instanceof ItemBlock)) + { + quickTest = true; + } + + if (!quickTest) + { + continue; + } + + if ((checkedItemStack.getItemDamage() == recipeItemStack.getItemDamage() || OreDictionary.WILDCARD_VALUE == recipeItemStack.getItemDamage()) && checkedItemStack.getItem() == recipeItemStack.getItem()) + { + test = true; + checkList[j] = true; + break; + } + } + + if (!test) + { + return false; + } + } + + return true; + } + + public int getSummoningCost() + { + return summoningCost; + } + + public EntityLivingBase getEntity(World world) + { + return this.summoningHelper.getEntity(world); + } + + public int getBloodOrbLevel() + { + return this.bloodOrbLevel; + } + + public ItemStack[] getRingRecipeForRing(int ring) + { + switch (ring) + { + case 1: + return ring1; + + case 2: + return ring2; + + case 3: + return ring3; + + default: + return null; + } + } + + public int getSummoningHelperID() + { + return this.summoningHelper.getSummoningHelperID(); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java new file mode 100644 index 00000000..5d3fcb7b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java @@ -0,0 +1,86 @@ +package WayofTime.alchemicalWizardry.common.summoning.meteor; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; + +public class MeteorParadigm +{ + public List componentList = new ArrayList(); + public ItemStack focusStack; + public int radius; + public static int maxChance = 1000; + + public MeteorParadigm(ItemStack focusStack, int radius) + { + this.focusStack = focusStack; + this.radius = radius; + } + + public void parseStringArray(String[] oreArray) + { + for (int i = 0; i + 1 < oreArray.length; i += 2) + { + String oreName = oreArray[i]; + int oreChance = Integer.parseInt(oreArray[i + 1]); + MeteorParadigmComponent mpc = new MeteorParadigmComponent(oreName, oreChance); + componentList.add(mpc); + } + } + + public void createMeteorImpact(World world, int x, int y, int z) + { + world.createExplosion(null, x, y, z, radius * 4, AlchemicalWizardry.doMeteorsDestroyBlocks); + + for (int i = -radius; i <= radius; i++) + { + for (int j = -radius; j <= radius; j++) + { + for (int k = -radius; k <= radius; k++) + { + if (i * i + j * j + k * k >= (radius + 0.50f) * (radius + 0.50f)) + { + continue; + } + + if (!world.isAirBlock(x + i, y + j, z + k)) + { + continue; + } + + int randNum = world.rand.nextInt(maxChance); + boolean hasPlacedBlock = false; + + for (MeteorParadigmComponent mpc : componentList) + { + if (mpc == null || !mpc.isValidBlockParadigm()) + { + continue; + } + + randNum -= mpc.getChance(); + + if (randNum < 0) + { + ItemStack blockStack = mpc.getValidBlockParadigm(); + world.setBlock(x + i, y + j, z + k, Block.getBlockById(Item.getIdFromItem(blockStack.getItem())), blockStack.getItemDamage(), 3); + hasPlacedBlock = true; + break; + } + } + + if (!hasPlacedBlock) + { + world.setBlock(x + i, y + j, z + k, Blocks.stone, 0, 3); + } + } + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java new file mode 100644 index 00000000..0daa43a1 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java @@ -0,0 +1,54 @@ +package WayofTime.alchemicalWizardry.common.summoning.meteor; + +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.List; + +public class MeteorParadigmComponent +{ + public String oreDictName; + public int chance; + + public MeteorParadigmComponent(String dictName, int chance) + { + this.oreDictName = dictName; + this.chance = chance; + } + + public boolean isValidBlockParadigm() + { + if (this.getValidBlockParadigm() != null) + { + return true; + } + + return false; + } + + public String getOreDictName() + { + return this.oreDictName; + } + + public int getChance() + { + return this.chance; + } + + public ItemStack getValidBlockParadigm() + { + List list = OreDictionary.getOres(getOreDictName()); + + for (ItemStack stack : list) + { + if (stack != null && stack.getItem() instanceof ItemBlock) + { + return stack; + } + } + + return null; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java new file mode 100644 index 00000000..4df585c1 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java @@ -0,0 +1,61 @@ +package WayofTime.alchemicalWizardry.common.summoning.meteor; + +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.ArrayList; +import java.util.List; + +public class MeteorRegistry +{ + public static List paradigmList = new ArrayList(); + + public static void registerMeteorParadigm(MeteorParadigm paradigm) + { + paradigmList.add(paradigm); + } + + public static void registerMeteorParadigm(ItemStack stack, String[] oreList, int radius) + { + if (stack != null && oreList != null) + { + MeteorParadigm meteor = new MeteorParadigm(stack, radius); + meteor.parseStringArray(oreList); + paradigmList.add(meteor); + } + } + + public static void createMeteorImpact(World world, int x, int y, int z, int paradigmID) + { + if (paradigmID < paradigmList.size()) + { + paradigmList.get(paradigmID).createMeteorImpact(world, x, y, z); + } + } + + public static int getParadigmIDForItem(ItemStack stack) + { + if (stack == null) + { + return -1; + } + + for (int i = 0; i < paradigmList.size(); i++) + { + ItemStack focusStack = paradigmList.get(i).focusStack; + + if (focusStack != null && focusStack.getItem()== stack.getItem() && (focusStack.getItemDamage() == OreDictionary.WILDCARD_VALUE || focusStack.getItemDamage() == stack.getItemDamage())) + { + return i; + } + } + + return -1; + } + + public static boolean isValidParadigmItem(ItemStack stack) + { + return getParadigmIDForItem(stack) != -1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java new file mode 100644 index 00000000..c1353871 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -0,0 +1,1024 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidEvent; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipe; +import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegistry; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.AltarUpgradeComponent; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFluidHandler +{ + public static final int sizeInv = 1; + private ItemStack[] inv; + private int resultID; + private int resultDamage; + private int upgradeLevel; + //public final LiquidTank tank = new LiquidTank(LiquidContainerRegistry.BUCKET_VOLUME * 10); + protected FluidStack fluid; + public int capacity; + private boolean isActive; + private int liquidRequired; //mB + private boolean canBeFilled; + private int consumptionRate; + private int drainRate; + private float consumptionMultiplier; + private float efficiencyMultiplier; + private float sacrificeEfficiencyMultiplier; + private float selfSacrificeEfficiencyMultiplier; + private float capacityMultiplier; + private float orbCapacityMultiplier; + private float dislocationMultiplier; + private boolean isUpgraded; + private boolean isResultBlock; + private int bufferCapacity; + protected FluidStack fluidOutput; + protected FluidStack fluidInput; + private int progress; + + public TEAltar() + { + this.inv = new ItemStack[1]; + resultID = 0; + resultDamage = 0; + this.capacity = FluidContainerRegistry.BUCKET_VOLUME * 10; + fluid = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 0); + fluidOutput = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 0); + fluidInput = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 0); + bufferCapacity = FluidContainerRegistry.BUCKET_VOLUME; + isActive = false; + consumptionRate = 0; + drainRate = 0; + consumptionMultiplier = 0; + efficiencyMultiplier = 0; + capacityMultiplier = 1; + isUpgraded = false; + upgradeLevel = 0; + isResultBlock = false; + progress = 0; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList tagList = par1NBTTagCompound.getTagList("Inventory",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + resultID = par1NBTTagCompound.getInteger("resultID"); + resultDamage = par1NBTTagCompound.getInteger("resultDamage"); + + if (!par1NBTTagCompound.hasKey("Empty")) + { + FluidStack fluid = this.fluid.loadFluidStackFromNBT(par1NBTTagCompound); + + if (fluid != null) + { + setMainFluid(fluid); + } + + FluidStack fluidOut = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, par1NBTTagCompound.getInteger("outputAmount")); + + if (fluidOut != null) + { + setOutputFluid(fluidOut); + } + + FluidStack fluidIn = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, par1NBTTagCompound.getInteger("inputAmount")); + + if (fluidIn != null) + { + setInputFluid(fluidIn); + } + } + + upgradeLevel = par1NBTTagCompound.getInteger("upgradeLevel"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + liquidRequired = par1NBTTagCompound.getInteger("liquidRequired"); + canBeFilled = par1NBTTagCompound.getBoolean("canBeFilled"); + isUpgraded = par1NBTTagCompound.getBoolean("isUpgraded"); + consumptionRate = par1NBTTagCompound.getInteger("consumptionRate"); + drainRate = par1NBTTagCompound.getInteger("drainRate"); + consumptionMultiplier = par1NBTTagCompound.getFloat("consumptionMultiplier"); + efficiencyMultiplier = par1NBTTagCompound.getFloat("efficiencyMultiplier"); + selfSacrificeEfficiencyMultiplier = par1NBTTagCompound.getFloat("selfSacrificeEfficiencyMultiplier"); + sacrificeEfficiencyMultiplier = par1NBTTagCompound.getFloat("sacrificeEfficiencyMultiplier"); + capacityMultiplier = par1NBTTagCompound.getFloat("capacityMultiplier"); + orbCapacityMultiplier = par1NBTTagCompound.getFloat("orbCapacityMultiplier"); + dislocationMultiplier = par1NBTTagCompound.getFloat("dislocationMultiplier"); + capacity = par1NBTTagCompound.getInteger("capacity"); + bufferCapacity = par1NBTTagCompound.getInteger("bufferCapacity"); + progress = par1NBTTagCompound.getInteger("progress"); + isResultBlock = par1NBTTagCompound.getBoolean("isResultBlock"); + } + + public void setMainFluid(FluidStack fluid) + { + this.fluid = fluid; + } + + public void setOutputFluid(FluidStack fluid) + { + this.fluidOutput = fluid; + } + + public void setInputFluid(FluidStack fluid) + { + this.fluidInput = fluid; + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inv[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + par1NBTTagCompound.setInteger("resultID", resultID); + par1NBTTagCompound.setInteger("resultDamage", resultDamage); + par1NBTTagCompound.setTag("Inventory", itemList); + + if (fluid != null) + { + fluid.writeToNBT(par1NBTTagCompound); + } else + { + par1NBTTagCompound.setString("Empty", ""); + } + + if (fluidOutput != null) + { + par1NBTTagCompound.setInteger("outputAmount", fluidOutput.amount); + } + + if (fluidInput != null) + { + par1NBTTagCompound.setInteger("inputAmount", fluidInput.amount); + } + + par1NBTTagCompound.setInteger("upgradeLevel", upgradeLevel); + par1NBTTagCompound.setBoolean("isActive", isActive); + par1NBTTagCompound.setInteger("liquidRequired", liquidRequired); + par1NBTTagCompound.setBoolean("canBeFilled", canBeFilled); + par1NBTTagCompound.setBoolean("isUpgraded", isUpgraded); + par1NBTTagCompound.setInteger("consumptionRate", consumptionRate); + par1NBTTagCompound.setInteger("drainRate", drainRate); + par1NBTTagCompound.setFloat("consumptionMultiplier", consumptionMultiplier); + par1NBTTagCompound.setFloat("efficiencyMultiplier", efficiencyMultiplier); + par1NBTTagCompound.setFloat("sacrificeEfficiencyMultiplier", sacrificeEfficiencyMultiplier); + par1NBTTagCompound.setFloat("selfSacrificeEfficiencyMultiplier", selfSacrificeEfficiencyMultiplier); + par1NBTTagCompound.setBoolean("isResultBlock", isResultBlock); + par1NBTTagCompound.setFloat("capacityMultiplier", capacityMultiplier); + par1NBTTagCompound.setFloat("orbCapacityMultiplier", orbCapacityMultiplier); + par1NBTTagCompound.setFloat("dislocationMultiplier", dislocationMultiplier); + par1NBTTagCompound.setInteger("capacity", capacity); + par1NBTTagCompound.setInteger("progress", progress); + par1NBTTagCompound.setInteger("bufferCapacity", bufferCapacity); + } + + @Override + public int getSizeInventory() + { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + inv[slot] = itemStack; + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() + { + return "TEAltar"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityPlayer) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + // TODO Auto-generated method stub + } + + @Override + public void closeInventory() + { + // TODO Auto-generated method stub + } + + //IFluidTank methods + @Override + public FluidStack getFluid() + { + return fluid; + } + + public FluidStack getInputFluid() + { + return fluidInput; + } + + public FluidStack getOutputFluid() + { + return fluidOutput; + } + + @Override + public int getFluidAmount() + { + if (fluid == null) + { + return 0; + } + + return fluid.amount; + } + + @Override + public int getCapacity() + { + return capacity; + } + + @Override + public FluidTankInfo getInfo() + { + return new FluidTankInfo(this); + } + + @Override + public int fill(FluidStack resource, boolean doFill) + { + TileEntity tile = this; + + if (resource == null) + { + return 0; + } + + if (resource.fluidID != (new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 1)).fluidID) + { + return 0; + } + + if (!doFill) + { + if (fluidInput == null) + { + return Math.min(bufferCapacity, resource.amount); + } + + if (!fluidInput.isFluidEqual(resource)) + { + return 0; + } + + return Math.min(bufferCapacity - fluidInput.amount, resource.amount); + } + + if (fluidInput == null) + { + fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.amount)); + + if (tile != null) + { + FluidEvent.fireEvent(new FluidEvent.FluidFillingEvent(fluidInput, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord, this)); + } + + return fluidInput.amount; + } + + if (!fluidInput.isFluidEqual(resource)) + { + return 0; + } + + int filled = bufferCapacity - fluidInput.amount; + + if (resource.amount < filled) + { + fluidInput.amount += resource.amount; + filled = resource.amount; + } else + { + fluidInput.amount = bufferCapacity; + } + + if (tile != null) + { + FluidEvent.fireEvent(new FluidEvent.FluidFillingEvent(fluidInput, tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord, this)); + } + + return filled; + } + + @Override + public FluidStack drain(int maxDrain, boolean doDrain) + { + if (fluidOutput == null) + { + return null; + } + + int drained = maxDrain; + + if (fluidOutput.amount < drained) + { + drained = fluidOutput.amount; + } + + FluidStack stack = new FluidStack(fluidOutput, drained); + + if (doDrain) + { + fluidOutput.amount -= drained; + + if (fluidOutput.amount <= 0) + { + fluidOutput = null; + } + + if (this != null) + { + FluidEvent.fireEvent(new FluidEvent.FluidDrainingEvent(fluidOutput, this.worldObj, this.xCoord, this.yCoord, this.zCoord, this)); + } + } + + if (fluidOutput == null) + { + fluidOutput = new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 0); + } + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return stack; + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + //this.capacity=(int) (10000*this.capacityMultiplier); + if (!worldObj.isRemote && worldObj.getWorldTime() % 20 == 0) + { + //TODO + int syphonMax = (int) (20 * this.dislocationMultiplier); + int fluidInputted = 0; + int fluidOutputted = 0; + fluidInputted = Math.min(syphonMax, -this.fluid.amount + capacity); + fluidInputted = Math.min(this.fluidInput.amount, fluidInputted); + this.fluid.amount += fluidInputted; + this.fluidInput.amount -= fluidInputted; + fluidOutputted = Math.min(syphonMax, this.bufferCapacity - this.fluidOutput.amount); + fluidOutputted = Math.min(this.fluid.amount, fluidOutputted); + this.fluidOutput.amount += fluidOutputted; + this.fluid.amount -= fluidOutputted; + } + + if (worldObj.getWorldTime() % 150 == 0) + { + startCycle(); + } + + if (!isActive) + { + return; + } + + if (getStackInSlot(0) == null) + { + return; + } + + int worldTime = (int) (worldObj.getWorldTime() % 24000); + + if (worldObj.isRemote) + { + return; + } + + if (worldTime % 1 == 0) + { + if (!canBeFilled) + { + if (fluid != null && fluid.amount >= 1) + { + int stackSize = getStackInSlot(0).stackSize; + int liquidDrained = Math.min((int) (upgradeLevel >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); + + if (liquidDrained > (liquidRequired * stackSize - progress)) + { + liquidDrained = liquidRequired * stackSize - progress; + } + + fluid.amount = fluid.amount - liquidDrained; + progress += liquidDrained; + //getStackInSlot(0).setItemDamage(getStackInSlot(0).getItemDamage() + liquidDrained); + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (progress >= liquidRequired * stackSize) + { + ItemStack result = null; + result = AltarRecipeRegistry.getItemForItemAndTier(this.getStackInSlot(0), this.upgradeLevel); + if(result!=null) + { + result.stackSize*=stackSize; + } + +// if (!isResultBlock) +// { +// result = new ItemStack(resultID, stackSize, resultDamage); +// } else +// { +// result = new ItemStack(Block.blocksList[resultID], stackSize, 0); +// } + + setInventorySlotContents(0, result); + progress = 0; + + for (int i = 0; i < 8; i++) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 4, xCoord+0.5f, yCoord+1.0f, zCoord+0.5f); + } + + //setInventorySlotContents(1, null); + this.isActive = false; + } + } else if (progress > 0) + { + progress -= (int) (efficiencyMultiplier * drainRate); + + if (worldTime % 2 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 2, xCoord, yCoord, zCoord); + } + } + } else + { + ItemStack returnedItem = getStackInSlot(0); + + if (!(returnedItem.getItem() instanceof EnergyBattery)) + { + return; + } + + EnergyBattery item = (EnergyBattery) (returnedItem.getItem()); + NBTTagCompound itemTag = returnedItem.stackTagCompound; + + if (itemTag == null) + { + return; + } + + String ownerName = itemTag.getString("ownerName"); + + if (ownerName.equals("")) + { + return; + } + + //EntityPlayer owner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(itemTag.getString("ownerName")); + World world = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) world.loadItemData(LifeEssenceNetwork.class, ownerName); + + if (data == null) + { + data = new LifeEssenceNetwork(ownerName); + world.setItemData(ownerName, data); + } + + int currentEssence = data.currentEssence; +// if(owner==null){return;} +// NBTTagCompound playerTag = owner.getEntityData(); +// if(playerTag==null){return;} + //int currentEssence=playerTag.getInteger("currentEssence"); + + if (fluid != null && fluid.amount >= 1) + { + int liquidDrained = Math.min((int) (upgradeLevel >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); + + if (liquidDrained > (item.getMaxEssence() * this.orbCapacityMultiplier - currentEssence)) + { + liquidDrained = (int) (item.getMaxEssence() * this.orbCapacityMultiplier - currentEssence); + } + + if (liquidDrained <= 0) + { + return; + } + + fluid.amount = fluid.amount - liquidDrained; +// int maxAmount = (int) Math.min(item.getMaxEssence() - consumptionRate * (1 + consumptionMultiplier), consumptionRate * (1 + consumptionMultiplier)); +// fluid.amount -= maxAmount; + data.currentEssence = liquidDrained + data.currentEssence; + data.markDirty(); +// playerTag.setInteger("currentEssence", currentEssence+maxAmount); + + if (worldTime % 4 == 0) + { + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, getParticlePacket(xCoord, yCoord, zCoord, (short) 3)); + SpellHelper.sendIndexedParticleToAllAround(world, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 3, xCoord, yCoord, zCoord); + } + } + } + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + //AlchemicalWizardry.proxy.getClientWorld().markBlockForUpdate(xCoord, yCoord, zCoord); + //PacketDispatcher.sendPacketToAllAround(xCoord, yCoord, zCoord, 10, 1, getDescriptionPacket()); + /* + progress++; + + if(progress>=liquidRequired) + { + setActive(); + setInventorySlotContents(0, new ItemStack(AlchemicalWizardry.weakBloodOrb)); + } + */ + } + } + + public void setActive() + { + isActive = false; + } + + public boolean isActive() + { + return isActive; + } + + public void sacrificialDaggerCall(int amount, boolean isSacrifice) + { + fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + + public void handlePacketData(int[] intData, int[] fluidData, int capacity) + { + if (intData == null) + { + return; + } + + if (intData.length == 3) + { + for (int i = 0; i < 1; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + + FluidStack flMain = new FluidStack(fluidData[0],fluidData[1]); + FluidStack flIn = new FluidStack(fluidData[2],fluidData[3]); + FluidStack flOut = new FluidStack(fluidData[4],fluidData[5]); + + this.setMainFluid(flMain); + this.setInputFluid(flIn); + this.setOutputFluid(flOut); + + this.capacity = capacity; + } + + public int[] buildIntDataList() + { + int[] sortList = new int[1 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + public void startCycle() + { + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + this.checkAndSetAltar(); + + if (fluid == null || fluid.amount <= 0) + { + return; + } + + if (getStackInSlot(0) == null) + { + return; + } + + if (!isActive) + { + progress = 0; + } + + if(AltarRecipeRegistry.isRequiredItemValid(getStackInSlot(0), upgradeLevel)) + { + AltarRecipe recipe = AltarRecipeRegistry.getAltarRecipeForItemAndTier(getStackInSlot(0), upgradeLevel); + this.isActive = true; + this.liquidRequired = recipe.getLiquidRequired(); + this.canBeFilled = recipe.getCanBeFilled(); + this.consumptionRate = recipe.getConsumptionRate(); + this.drainRate = recipe.drainRate; + return; + } + + isActive = false; + } + + public void checkAndSetAltar() + { + boolean checkUpgrade = true; + int upgradeState = UpgradedAltars.isAltarValid(worldObj, xCoord, yCoord, zCoord); + + if (upgradeState <= 1) + { + upgradeLevel = 1; + isUpgraded = false; + this.consumptionMultiplier = 0; + this.efficiencyMultiplier = 1; + this.sacrificeEfficiencyMultiplier = 0; + this.selfSacrificeEfficiencyMultiplier = 0; + this.capacityMultiplier = 1; + this.orbCapacityMultiplier = 1; + this.dislocationMultiplier = 1; + return; + } + + AltarUpgradeComponent upgrades = UpgradedAltars.getUpgrades(worldObj, xCoord, yCoord, zCoord, upgradeState); + + if (upgrades == null) + { + upgradeLevel = 1; + isUpgraded = false; + this.consumptionMultiplier = 0; + this.efficiencyMultiplier = 1; + this.sacrificeEfficiencyMultiplier = 0; + this.selfSacrificeEfficiencyMultiplier = 0; + this.capacityMultiplier = 1; + this.orbCapacityMultiplier = 1; + this.dislocationMultiplier = 1; + this.upgradeLevel = upgradeState; + return; + } + + this.isUpgraded = checkUpgrade; + this.upgradeLevel = upgradeState; + this.consumptionMultiplier = (float) (0.15 * upgrades.getSpeedUpgrades()); + this.efficiencyMultiplier = (float) Math.pow(0.85, upgrades.getSpeedUpgrades()); + this.sacrificeEfficiencyMultiplier = (float) (0.10 * upgrades.getSacrificeUpgrades()); + this.selfSacrificeEfficiencyMultiplier = (float) (0.10 * upgrades.getSelfSacrificeUpgrades()); + this.capacityMultiplier = (float) (1 + 0.15 * upgrades.getAltarCapacitiveUpgrades()); + //TODO finalize values + this.dislocationMultiplier = (float) (Math.pow(1.2, upgrades.getDisplacementUpgrades())); + this.orbCapacityMultiplier = (float) (1 + 0.02 * upgrades.getOrbCapacitiveUpgrades()); + this.capacity = (int) (FluidContainerRegistry.BUCKET_VOLUME * 10 * capacityMultiplier); + this.bufferCapacity = (int) (FluidContainerRegistry.BUCKET_VOLUME * 1 * capacityMultiplier); + + if (this.fluid.amount > this.capacity) + { + this.fluid.amount = this.capacity; + } + + if (this.fluidOutput.amount > this.bufferCapacity) + { + this.fluidOutput.amount = this.bufferCapacity; + } + + if (this.fluidInput.amount > this.bufferCapacity) + { + this.fluidInput.amount = this.bufferCapacity; + } + + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); +// for (int x = -1; x <= 1; x++) +// { +// for (int z = -1; z <= 1; z++) +// { +// if (!(x == 0 && z == 0)) +// { +// Block block = Block.blocksList[worldObj.getBlockId(xCoord + x, yCoord - 1, zCoord + z)]; +// +// if (!(block instanceof BloodRune)) +// { +// checkUpgrade = false; +// this.isUpgraded = false; +// return; +// } +// +// if ((z == 0 && (x == -1 || x == 1)) || (x == 0 && (z == -1 || z == 1))) +// { +// switch (((BloodRune)block).getRuneEffect()) +// { +// case 1: +// speedUpgrades++; +// +// case 2: +// efficiencyUpgrades++; +// +// case 3: +// sacrificeUpgrades++; +// +// case 4: +// selfSacrificeUpgrades++; +// } +// } +// } +// } +// } +// this.isUpgraded = checkUpgrade; +// this.consumptionMultiplier = (float)(0.20 * speedUpgrades); +// this.efficiencyMultiplier = (float)Math.pow(0.80, efficiencyUpgrades); +// this.sacrificeEfficiencyMultiplier = (float)(0.10 * sacrificeUpgrades); +// this.selfSacrificeEfficiencyMultiplier = (float)(0.10 * sacrificeUpgrades); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + if (slot == 0) + { + return true; + } + + return false; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) + { + //TODO + if (resource == null) + { + return 0; + } + + resource = resource.copy(); + int totalUsed = 0; + //TileTank tankToFill = getBottomTank(); + int used = this.fill(resource, doFill); + resource.amount -= used; + totalUsed += used; + //FluidStack liquid = tankToFill.tank.getFluid(); +// if (liquid != null && liquid.amount > 0 && !liquid.isFluidEqual(resource)) +// { +// return 0; +// } +// while (tankToFill != null && resource.amount > 0) +// { +// int used = tankToFill.tank.fill(resource, doFill); +// resource.amount -= used; +// if (used > 0) +// { +// tankToFill.hasUpdate = true; +// } +// +// +// totalUsed += used; +// tankToFill = getTankAbove(tankToFill); +// } + this.startCycle(); + return totalUsed; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) + { + if (resource == null) + { + return null; + } + + if (!resource.isFluidEqual(fluidOutput)) + { + return null; + } + + return drain(from, resource.amount, doDrain); + } + + @Override + public FluidStack drain(ForgeDirection from, int maxEmpty, boolean doDrain) + { + return this.drain(maxEmpty, doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) + { + // TODO Auto-generated method stub + if (this.fluidInput != null && this.fluid.getFluid().equals(fluidInput)) + { + return true; + } + + return false; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) + { + // TODO Auto-generated method stub + return true; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) + { + // TODO Auto-generated method stub + FluidTank compositeTank = new FluidTank(capacity); + compositeTank.setFluid(fluid); + return new FluidTankInfo[]{compositeTank.getInfo()}; + } + + public int[] buildFluidList() + { + int[] sortList = new int[6]; + + if(this.fluid == null) + { + sortList[0] = AlchemicalWizardry.lifeEssenceFluid.getID(); + sortList[1] = 0; + }else + { + sortList[0] = this.fluid.fluidID; + sortList[1] = this.fluid.amount; + } + + if(this.fluidInput == null) + { + sortList[2] = AlchemicalWizardry.lifeEssenceFluid.getID(); + sortList[3] = 0; + }else + { + sortList[2] = this.fluidInput.fluidID; + sortList[3] = this.fluidInput.amount; + } + + if(this.fluidOutput == null) + { + sortList[4] = AlchemicalWizardry.lifeEssenceFluid.getID(); + sortList[5] = 0; + }else + { + sortList[4] = this.fluidOutput.fluidID; + sortList[5] = this.fluidOutput.amount; + } + + return sortList; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java new file mode 100644 index 00000000..4b5fe8bc --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java @@ -0,0 +1,40 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.Packet; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; + +public class TEConduit extends TESpellBlock +{ + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + + } + + @Override + public Packet getDescriptionPacket() + { + return super.getDescriptionPacket(); + } + + @Override + protected void applySpellChange(SpellParadigm parad) + { + return; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java new file mode 100644 index 00000000..180b0d35 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java @@ -0,0 +1,167 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntitySkull; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.simple.HomSpell; +import WayofTime.alchemicalWizardry.common.spell.simple.HomSpellRegistry; + +public class TEHomHeart extends TileEntity +{ + public boolean canCastSpell(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return true; + } + + public int castSpell(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + HomSpell spell = getSpell(); + + if (spell != null) + { + switch (getModifiedParadigm()) + { + case 0: + spell.onOffensiveRangedRightClick(par1ItemStack, par2World, par3EntityPlayer); + break; + + case 1: + spell.onOffensiveMeleeRightClick(par1ItemStack, par2World, par3EntityPlayer); + break; + + case 2: + spell.onDefensiveRightClick(par1ItemStack, par2World, par3EntityPlayer); + break; + + case 3: + spell.onEnvironmentalRightClick(par1ItemStack, par2World, par3EntityPlayer); + break; + } + + //spell.onOffensiveRangedRightClick(par1ItemStack, par2World, par3EntityPlayer); + } + + return 0; + } + + public HomSpell getSpell() + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord - 1, yCoord, zCoord); + + if (tileEntity instanceof TEAltar) + { + ItemStack itemStack = ((TEAltar) tileEntity).getStackInSlot(0); + + if (itemStack != null) + { + HomSpell spell = HomSpellRegistry.getSpellForItemStack(itemStack); + + if (spell != null) + { + return spell; + } + } + } + + tileEntity = worldObj.getTileEntity(xCoord + 1, yCoord, zCoord); + + if (tileEntity instanceof TEAltar) + { + ItemStack itemStack = ((TEAltar) tileEntity).getStackInSlot(0); + + if (itemStack != null) + { + HomSpell spell = HomSpellRegistry.getSpellForItemStack(itemStack); + + if (spell != null) + { + return spell; + } + } + } + + tileEntity = worldObj.getTileEntity(xCoord, yCoord, zCoord - 1); + + if (tileEntity instanceof TEAltar) + { + ItemStack itemStack = ((TEAltar) tileEntity).getStackInSlot(0); + + if (itemStack != null) + { + HomSpell spell = HomSpellRegistry.getSpellForItemStack(itemStack); + + if (spell != null) + { + return spell; + } + } + } + + tileEntity = worldObj.getTileEntity(xCoord, yCoord, zCoord + 1); + + if (tileEntity instanceof TEAltar) + { + ItemStack itemStack = ((TEAltar) tileEntity).getStackInSlot(0); + + if (itemStack != null) + { + HomSpell spell = HomSpellRegistry.getSpellForItemStack(itemStack); + + if (spell != null) + { + return spell; + } + } + } + + return null; + } + + public int getModifiedParadigm() + { + //TODO change so that it works with a Tile Entity for a custom head or whatnot + Block block = worldObj.getBlock(xCoord, yCoord + 1, zCoord); + + if (block == Blocks.glowstone) + { + return 0; + } else if (block == Blocks.redstone_block) + { + return 1; + } else if (block == Blocks.anvil) + { + return 2; + } else if (block == Blocks.glass) + { + return 3; + } + + TileEntity tileEntity = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + + if (tileEntity instanceof TileEntitySkull) + { + int skullType = ((TileEntitySkull) tileEntity).func_145904_a(); + + switch (skullType) + { + case 0: + return 0; + + case 1: + return 1; + + case 2: + return 2; + + case 4: + return 3; + } + } + + return -1; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java new file mode 100644 index 00000000..859a3b9c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java @@ -0,0 +1,13 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; + +public class TEHomHeartRenderer extends TileEntitySpecialRenderer +{ + @Override + public void renderTileEntityAt(TileEntity tileentity, double d0, double d1, double d2, float f) + { + // TODO Auto-generated method stub + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java new file mode 100644 index 00000000..110996ea --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java @@ -0,0 +1,11 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.tileentity.TileEntity; + +public class TEImperfectRitualStone extends TileEntity +{ + public TEImperfectRitualStone() + { + // TODO Auto-generated constructor stub + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java new file mode 100644 index 00000000..37fa9e98 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java @@ -0,0 +1,193 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.rituals.Rituals; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEMasterStone extends TileEntity +{ + private int currentRitual; + private boolean isActive; + private String owner; + private int cooldown; + private int var1; + private int direction; + + public TEMasterStone() + { + currentRitual = 0; + isActive = false; + owner = ""; + cooldown = 0; + var1 = 0; + direction = 0; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + currentRitual = par1NBTTagCompound.getInteger("currentRitual"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + owner = par1NBTTagCompound.getString("owner"); + cooldown = par1NBTTagCompound.getInteger("cooldown"); + var1 = par1NBTTagCompound.getInteger("var1"); + direction = par1NBTTagCompound.getInteger("direction"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("currentRitual", currentRitual); + par1NBTTagCompound.setBoolean("isActive", isActive); + par1NBTTagCompound.setString("owner", owner); + par1NBTTagCompound.setInteger("cooldown", cooldown); + par1NBTTagCompound.setInteger("var1", var1); + par1NBTTagCompound.setInteger("direction", direction); + } + + public void activateRitual(World world, int crystalLevel) + { + int testRitual = Rituals.checkValidRitual(world, xCoord, yCoord, zCoord); + + if (testRitual == 0) + { + return; + } + + boolean testLevel = Rituals.canCrystalActivate(testRitual, crystalLevel); + + if (!testLevel) + { + return; + } + + if (world.isRemote) + { + return; + } + + 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; + + if (currentEssence < Rituals.getCostForActivation(testRitual)) + { + //TODO Bad stuff + return; + } + + if (!world.isRemote) + { + data.currentEssence = currentEssence - Rituals.getCostForActivation(testRitual); + data.markDirty(); + + for (int i = 0; i < 12; i++) + { + SpellHelper.sendIndexedParticleToAllAround(world, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + } + + cooldown = Rituals.getInitialCooldown(testRitual); + var1 = 0; + currentRitual = testRitual; + isActive = true; + direction = Rituals.getDirectionOfRitual(world, xCoord, yCoord, zCoord, testRitual); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public void setOwner(String owner) + { + this.owner = owner; + } + + @Override + public void updateEntity() + { + if (!isActive) + { + return; + } + + int worldTime = (int) (worldObj.getWorldTime() % 24000); + + if (worldObj.isRemote) + { + return; + } + + if (worldTime % 100 == 0) + { + boolean testRunes = Rituals.checkDirectionOfRitualValid(worldObj, xCoord, yCoord, zCoord, currentRitual, direction); + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + + if (!testRunes) + { + isActive = false; + currentRitual = 0; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + //PacketDispatcher.sendPacketToAllPlayers(TEAltar.getParticlePacket(xCoord, yCoord, zCoord, (short)3)); + return; + } + } + + if (worldObj.getBlockPowerInput(xCoord, yCoord, zCoord) > 0) + { + return; + } + + performRitual(worldObj, xCoord, yCoord, zCoord, currentRitual); + } + + public void performRitual(World world, int x, int y, int z, int ritualID) + { + Rituals.performEffect(this, ritualID); + } + + public String getOwner() + { + return owner; + } + + public void setCooldown(int newCooldown) + { + this.cooldown = newCooldown; + } + + public int getCooldown() + { + return this.cooldown; + } + + public void setVar1(int newVar1) + { + this.var1 = newVar1; + } + + public int getVar1() + { + return this.var1; + } + + public void setActive(boolean active) + { + this.isActive = active; + } + + public int getDirection() + { + return this.direction; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java new file mode 100644 index 00000000..d156f352 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.block.IOrientable; + +public class TEOrientable extends TileEntity implements IOrientable +{ + protected ForgeDirection inputFace; + protected ForgeDirection outputFace; + + public TEOrientable() + { + this.inputFace = ForgeDirection.DOWN; + this.outputFace = ForgeDirection.UP; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + this.setInputDirection(ForgeDirection.getOrientation(par1NBTTagCompound.getInteger("inputFace"))); + this.setOutputDirection(ForgeDirection.getOrientation(par1NBTTagCompound.getInteger("outputFace"))); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("inputFace", TEOrientable.getIntForForgeDirection(this.getInputDirection())); + par1NBTTagCompound.setInteger("outputFace", TEOrientable.getIntForForgeDirection(this.getOutputDirection())); + } + + @Override + public ForgeDirection getInputDirection() + { + return this.inputFace; + } + + @Override + public ForgeDirection getOutputDirection() + { + return this.outputFace; + } + + @Override + public void setInputDirection(ForgeDirection direction) + { + this.inputFace = direction; + } + + @Override + public void setOutputDirection(ForgeDirection direction) + { + this.outputFace = direction; + } + + public static int getIntForForgeDirection(ForgeDirection direction) + { + switch (direction) + { + case DOWN: + return 0; + + case UP: + return 1; + + case NORTH: + return 2; + + case SOUTH: + return 3; + + case WEST: + return 4; + + case EAST: + return 5; + + default: + return 0; + } + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public boolean isSideRendered(ForgeDirection side) + { + if(side.equals(this.getInputDirection()) || side.equals(this.getOutputDirection())) + { + return true; + } + return false; + } + + public String getResourceLocationForMeta(int meta) + { + return ""; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java new file mode 100644 index 00000000..c49c520a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java @@ -0,0 +1,267 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.entity.effect.EntityLightningBolt; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEPedestal extends TileEntity implements IInventory +{ + private ItemStack[] inv; + private int resultID; + private int resultDamage; + public static final int sizeInv = 1; + + private boolean isActive; + + public TEPedestal() + { + this.inv = new ItemStack[1]; + resultID = 0; + resultDamage = 0; + isActive = false; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList tagList = par1NBTTagCompound.getTagList("Inventory", Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + resultID = par1NBTTagCompound.getInteger("resultID"); + resultDamage = par1NBTTagCompound.getInteger("resultDamage"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inv[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + par1NBTTagCompound.setInteger("resultID", resultID); + par1NBTTagCompound.setInteger("resultDamage", resultDamage); + par1NBTTagCompound.setTag("Inventory", itemList); + par1NBTTagCompound.setBoolean("isActive", isActive); + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + inv[slot] = itemStack; + + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() + { + return "TEPedestal"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityPlayer) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + // TODO Auto-generated method stub + } + + @Override + public void closeInventory() + { + // TODO Auto-generated method stub + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + super.updateEntity(); + } + + public void setActive() + { + isActive = false; + } + + public boolean isActive() + { + return isActive; + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public void handlePacketData(int[] intData) + { + if (intData == null) + { + return; + } + + if (intData.length == 3) + { + for (int i = 0; i < 1; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + } + + public int[] buildIntDataList() + { + int[] sortList = new int[1 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + if (slot == 0) + { + return true; + } + + return false; + } + + public void onItemDeletion() + { + //worldObj.createExplosion(null, xCoord+0.5, yCoord+0.5, zCoord+0.5, 1, false); + worldObj.addWeatherEffect(new EntityLightningBolt(worldObj, xCoord, yCoord, zCoord)); + + for (int i = 0; i < 16; i++) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 2, xCoord, yCoord, zCoord); + } + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java new file mode 100644 index 00000000..4995d574 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java @@ -0,0 +1,689 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.common.IDemon; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.PlinthComponent; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.summoning.SummoningRegistry; +import WayofTime.alchemicalWizardry.common.summoning.SummoningRegistryComponent; + +public class TEPlinth extends TileEntity implements IInventory +{ + private ItemStack[] inv; + + private boolean isActive; + private boolean paradigm; + + private ItemStack[] ring1Inv; + private ItemStack[] ring2Inv; + private ItemStack[] ring3Inv; + + public static final int sizeInv = 1; + + private int progressInterval; + private int progress; + + public static List pedestalPositions = new ArrayList(); + + public TEPlinth() + { + this.inv = new ItemStack[1]; + this.ring1Inv = new ItemStack[6]; + this.ring2Inv = new ItemStack[6]; + this.ring3Inv = new ItemStack[6]; + isActive = false; + progress = 0; + progressInterval = 50; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList tagList = par1NBTTagCompound.getTagList("Inventory",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + NBTTagList ring1TagList = par1NBTTagCompound.getTagList("ring1Inv",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < ring1TagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) ring1TagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + ring1Inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + NBTTagList ring2TagList = par1NBTTagCompound.getTagList("ring2Inv",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < ring2TagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) ring2TagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + ring2Inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + NBTTagList ring3TagList = par1NBTTagCompound.getTagList("ring3Inv",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < ring3TagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) ring3TagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + ring3Inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + progress = par1NBTTagCompound.getInteger("progress"); + progressInterval = par1NBTTagCompound.getInteger("progressInterval"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inv[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + par1NBTTagCompound.setTag("Inventory", itemList); + NBTTagList ring1ItemList = new NBTTagList(); + + for (int i = 0; i < ring1Inv.length; i++) + { + ItemStack stack = ring1Inv[i]; + + if (ring1Inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + ring1Inv[i].writeToNBT(tag); + ring1ItemList.appendTag(tag); + } + } + + par1NBTTagCompound.setTag("ring1Inv", ring1ItemList); + NBTTagList ring2ItemList = new NBTTagList(); + + for (int i = 0; i < ring2Inv.length; i++) + { + ItemStack stack = ring2Inv[i]; + + if (ring2Inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + ring2Inv[i].writeToNBT(tag); + ring2ItemList.appendTag(tag); + } + } + + par1NBTTagCompound.setTag("ring2Inv", ring1ItemList); + NBTTagList ring3ItemList = new NBTTagList(); + + for (int i = 0; i < ring3Inv.length; i++) + { + ItemStack stack = ring3Inv[i]; + + if (ring3Inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + ring3Inv[i].writeToNBT(tag); + ring3ItemList.appendTag(tag); + } + } + + par1NBTTagCompound.setTag("ring3Inv", ring1ItemList); + par1NBTTagCompound.setInteger("progress", progress); + par1NBTTagCompound.setInteger("progressInterval", progressInterval); + par1NBTTagCompound.setBoolean("isActive", isActive); + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + inv[slot] = itemStack; + + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() + { + return "TEPlinth"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityPlayer) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + // TODO Auto-generated method stub + } + + @Override + public void closeInventory() + { + // TODO Auto-generated method stub + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + super.updateEntity(); + + if (worldObj.isRemote) + { + return; + } + + if (!isActive()) + { + if (getStackInSlot(0) != null && getStackInSlot(0).getItem() instanceof EnergyBattery) + { + int bloodOrbLevel = ((EnergyBattery) getStackInSlot(0).getItem()).getOrbLevel(); + + if (SummoningRegistry.isRecipeValid(bloodOrbLevel, composeItemsForRingAndParadigm(1, true), composeItemsForRingAndParadigm(2, true), composeItemsForRingAndParadigm(3, true))) + { + SummoningRegistryComponent src = SummoningRegistry.getRegistryComponent(bloodOrbLevel, composeItemsForRingAndParadigm(1, true), composeItemsForRingAndParadigm(2, true), composeItemsForRingAndParadigm(3, true)); + isActive = true; + paradigm = true; + progress = 0; + ring1Inv = src.getRingRecipeForRing(1); + ring2Inv = src.getRingRecipeForRing(2); + ring3Inv = src.getRingRecipeForRing(3); + } else if (SummoningRegistry.isRecipeValid(bloodOrbLevel, composeItemsForRingAndParadigm(1, false), composeItemsForRingAndParadigm(2, false), composeItemsForRingAndParadigm(3, false))) + { + SummoningRegistryComponent src = SummoningRegistry.getRegistryComponent(bloodOrbLevel, composeItemsForRingAndParadigm(1, false), composeItemsForRingAndParadigm(2, false), composeItemsForRingAndParadigm(3, false)); + isActive = true; + paradigm = false; + progress = 0; + ring1Inv = src.getRingRecipeForRing(1); + ring2Inv = src.getRingRecipeForRing(2); + ring3Inv = src.getRingRecipeForRing(3); + } else + { + isActive = false; + progress = 0; + } + } + } else + { + if (getStackInSlot(0) != null && getStackInSlot(0).getItem() instanceof EnergyBattery) + { + if (progress % progressInterval == 0) + { + int ring = (progress / progressInterval) / 6 + 1; + int slot = (progress / progressInterval) % 6; + ItemStack itemStack; + + switch (ring) + { + case 1: + itemStack = this.ring1Inv[slot]; + break; + + case 2: + itemStack = this.ring2Inv[slot]; + break; + + case 3: + itemStack = this.ring3Inv[slot]; + break; + + default: + itemStack = null; + } + + if (itemStack == null) + { + progress += progressInterval; + } else + { + if (this.deleteItemStackInRing(ring, itemStack)) + { + progress++; + } + } + } else + { + progress++; + } + + if (progress >= progressInterval * 18) + { + int bloodOrbLevel = ((EnergyBattery) getStackInSlot(0).getItem()).getOrbLevel(); + EntityLivingBase entity = SummoningRegistry.getEntity(worldObj, bloodOrbLevel, ring1Inv, ring2Inv, ring3Inv); + //EntityLivingBase entity = new EntityFallenAngel(worldObj); + + if (entity != null) + { + //entity.worldObj = worldObj; + entity.setPosition(xCoord + 0.5, yCoord + 1, zCoord + 0.5); + worldObj.spawnEntityInWorld(entity); + + if (entity instanceof IDemon) + { + ((IDemon) entity).setSummonedConditions(); + } + + worldObj.createExplosion(entity, entity.posX, entity.posY, entity.posZ, 3, false); + deleteItemsInRing(1); + isActive = false; + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } + } + } + + public void deleteItemsInRing(int ring) + { + if (paradigm) + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + + if (tileEntity instanceof TEPedestal) + { + ((TEPedestal) tileEntity).setInventorySlotContents(0, null); + worldObj.markBlockForUpdate(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + i++; + } + } + } + } else + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.zOffset, yCoord + pc.yOffset, zCoord + pc.xOffset); + + if (tileEntity instanceof TEPedestal) + { + ((TEPedestal) tileEntity).setInventorySlotContents(0, null); + worldObj.markBlockForUpdate(xCoord + pc.zOffset, yCoord + pc.yOffset, zCoord + pc.xOffset); + i++; + } + } + } + } + } + + public boolean deleteItemStackInRing(int ring, ItemStack itemStack) + { + if (itemStack == null) + { + return true; + } + + if (paradigm) + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + + if (tileEntity instanceof TEPedestal) + { + ItemStack possibleItem = ((TEPedestal) tileEntity).getStackInSlot(0); + + if (possibleItem == null) + { + i++; + continue; + } + + boolean test = false; + + if (possibleItem.getItem() instanceof ItemBlock) + { + if (itemStack.getItem() instanceof ItemBlock) + { + test = true; + } + } else if (!(itemStack.getItem() instanceof ItemBlock)) + { + test = true; + } + + if (test) + { + if (itemStack.getItem()== possibleItem.getItem() && (itemStack.getItemDamage() == possibleItem.getItemDamage() || itemStack.getItemDamage() == OreDictionary.WILDCARD_VALUE)) + { + ((TEPedestal) tileEntity).decrStackSize(0, 1); + ((TEPedestal) tileEntity).onItemDeletion(); + worldObj.markBlockForUpdate(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + return true; + } + } + + i++; + } + } + } + } else + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.zOffset, yCoord + pc.yOffset, zCoord + pc.xOffset); + + if (tileEntity instanceof TEPedestal) + { + ItemStack possibleItem = ((TEPedestal) tileEntity).getStackInSlot(0); + + if (possibleItem == null) + { + i++; + continue; + } + + boolean test = false; + + if (possibleItem.getItem() instanceof ItemBlock) + { + if (itemStack.getItem() instanceof ItemBlock) + { + test = true; + } + } else if (!(itemStack.getItem() instanceof ItemBlock)) + { + test = true; + } + + if (test) + { + if (itemStack.getItem() == possibleItem.getItem() && (itemStack.getItemDamage() == possibleItem.getItemDamage() || itemStack.getItemDamage() == OreDictionary.WILDCARD_VALUE)) + { + ((TEPedestal) tileEntity).decrStackSize(0, 1); + ((TEPedestal) tileEntity).onItemDeletion(); + //worldObj.markBlockForUpdate(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + worldObj.markBlockForUpdate(xCoord + pc.zOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + return true; + } + } + + i++; + } + } + } + } + + return false; + } + + public ItemStack[] composeItemsForRingAndParadigm(int ring, boolean paradigm) + { + ItemStack[] composed = new ItemStack[6]; + + if (paradigm) + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.xOffset, yCoord + pc.yOffset, zCoord + pc.zOffset); + + if (tileEntity instanceof TEPedestal) + { + composed[i] = ((TEPedestal) tileEntity).getStackInSlot(0); + i++; + } + } + } + } else + { + int i = 0; + + for (PlinthComponent pc : pedestalPositions) + { + if (i < 6 && pc.getRing() == ring) + { + TileEntity tileEntity = worldObj.getTileEntity(xCoord + pc.zOffset, yCoord + pc.yOffset, zCoord + pc.xOffset); + + if (tileEntity instanceof TEPedestal) + { + composed[i] = ((TEPedestal) tileEntity).getStackInSlot(0); + i++; + } + } + } + } + + return composed; + } + + public void setActive() + { + isActive = false; + } + + public boolean isActive() + { + return isActive; + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public void handlePacketData(int[] intData) + { + if (intData == null) + { + return; + } + + if (intData.length == 3) + { + for (int i = 0; i < 1; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + } + + public int[] buildIntDataList() + { + int[] sortList = new int[1 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + if (slot == 0) + { + return true; + } + + return false; + } + + public static void initialize() + { + pedestalPositions.add(new PlinthComponent(1, 0, -2, 1)); + pedestalPositions.add(new PlinthComponent(2, 0, 0, 1)); + pedestalPositions.add(new PlinthComponent(1, 0, +2, 1)); + pedestalPositions.add(new PlinthComponent(-1, 0, -2, 1)); + pedestalPositions.add(new PlinthComponent(-2, 0, 0, 1)); + pedestalPositions.add(new PlinthComponent(-1, 0, +2, 1)); + pedestalPositions.add(new PlinthComponent(3, 1, -5, 2)); + pedestalPositions.add(new PlinthComponent(6, 1, 0, 2)); + pedestalPositions.add(new PlinthComponent(3, 1, +5, 2)); + pedestalPositions.add(new PlinthComponent(-3, 1, -5, 2)); + pedestalPositions.add(new PlinthComponent(-6, 1, 0, 2)); + pedestalPositions.add(new PlinthComponent(-3, 1, +5, 2)); + pedestalPositions.add(new PlinthComponent(0, 2, -9, 3)); + pedestalPositions.add(new PlinthComponent(7, 2, -4, 3)); + pedestalPositions.add(new PlinthComponent(7, 2, +4, 3)); + pedestalPositions.add(new PlinthComponent(0, 2, +9, 3)); + pedestalPositions.add(new PlinthComponent(-7, 2, -4, 3)); + pedestalPositions.add(new PlinthComponent(-7, 2, 4, 3)); + } + + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java new file mode 100644 index 00000000..c98638c4 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java @@ -0,0 +1,254 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; + +public class TESocket extends TileEntity implements IInventory +{ + private ItemStack[] inv; + private int resultID; + private int resultDamage; + + public static final int sizeInv = 1; + + private boolean isActive; + + public TESocket() + { + this.inv = new ItemStack[1]; + resultID = 0; + resultDamage = 0; + isActive = false; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList tagList = par1NBTTagCompound.getTagList("Inventory",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + resultID = par1NBTTagCompound.getInteger("resultID"); + resultDamage = par1NBTTagCompound.getInteger("resultDamage"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inv[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + par1NBTTagCompound.setInteger("resultID", resultID); + par1NBTTagCompound.setInteger("resultDamage", resultDamage); + par1NBTTagCompound.setTag("Inventory", itemList); + par1NBTTagCompound.setBoolean("isActive", isActive); + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + inv[slot] = itemStack; + + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() + { + return "TESocket"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityPlayer) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + // TODO Auto-generated method stub + } + + @Override + public void closeInventory() + { + // TODO Auto-generated method stub + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + super.updateEntity(); + } + + public void setActive() + { + isActive = false; + } + + public boolean isActive() + { + return isActive; + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public void handlePacketData(int[] intData) + { + if (intData == null) + { + return; + } + + if (intData.length == 3) + { + for (int i = 0; i < 1; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + } + + public int[] buildIntDataList() + { + int[] sortList = new int[1 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + if (slot == 0) + { + return true; + } + + return false; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java new file mode 100644 index 00000000..b2cca5fb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java @@ -0,0 +1,48 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; + +public abstract class TESpellBlock extends TEOrientable +{ + public void modifySpellParadigm(SpellParadigm parad) + { + this.applySpellChange(parad); + TileEntity tile = this.getTileAtOutput(); + if(tile instanceof TESpellBlock) + { + TESpellBlock outputBlock = (TESpellBlock)tile; + outputBlock.modifySpellParadigm(parad); + } + } + + protected abstract void applySpellChange(SpellParadigm parad); + + public TESpellBlock getTileAtOutput() + { + ForgeDirection output = this.getOutputDirection(); + int xOffset = output.offsetX; + int yOffset = output.offsetY; + int zOffset = output.offsetZ; + + TileEntity tile = worldObj.getTileEntity(xCoord + xOffset, yCoord + yOffset, zCoord + zOffset); + + if(tile instanceof TESpellBlock && ((TESpellBlock)tile).canInputRecieveOutput(output)) + { + return (TESpellBlock)tile; + } + + return null; + } + + public boolean canInputRecieve() + { + return true; + } + + public boolean canInputRecieveOutput(ForgeDirection output) + { + return this.canInputRecieve() && this.getInputDirection().getOpposite()==output; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java new file mode 100644 index 00000000..a2b9a4be --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffectWind; + +public class TESpellEffectBlock extends TESpellBlock +{ + @Override + protected void applySpellChange(SpellParadigm parad) + { + parad.addBufferedEffect(this.getSpellEffect()); + } + + public SpellEffect getSpellEffect() + { + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + switch(meta) + { + case 0: return new SpellEffectFire(); + case 1: return new SpellEffectIce(); + case 2: return new SpellEffectWind(); + case 3: return new SpellEffectEarth(); + } + return new SpellEffectFire(); + } + + @Override + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEffectFire.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEffectIce.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEffectWind.png"; + case 3: return "alchemicalwizardry:textures/models/SpellEffectEarth.png"; + } + return ""; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java new file mode 100644 index 00000000..e6110498 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java @@ -0,0 +1,102 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigm; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementCost; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPotency; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancementPower; + +public class TESpellEnhancementBlock extends TESpellBlock +{ + @Override + protected void applySpellChange(SpellParadigm parad) + { + int i = -1; + + switch(this.enhancementType()) + { + case 0: + i = parad.getBufferedEffectPower(); + break; + case 1: + i = parad.getBufferedEffectCost(); + break; + case 2: + i = parad.getBufferedEffectPotency(); + break; + } + + if(i!=-1 && i stringList = parad.effectList; +// SpellParadigmSelf spellParadSelf = SpellParadigmSelf.getParadigmForStringArray(stringList); +// for(String str : stringList) +// { +// ChatMessageComponent chat = new ChatMessageComponent(); +// chat.addText(str); +// entity.sendChatToPlayer(chat); +// } +// spellParadSelf.castSpell(world, entity, spellCasterStack); +// } +// else if(parad instanceof SpellParadigmProjectile) +// { +// List stringList = parad.effectList; +// SpellParadigmProjectile spellParadSelf = SpellParadigmProjectile.getParadigmForStringArray(stringList); +// for(String str : stringList) +// { +// ChatMessageComponent chat = new ChatMessageComponent(); +// chat.addText(str); +// entity.sendChatToPlayer(chat); +// } +// spellParadSelf.castSpell(world, entity, spellCasterStack); +// }else + { + parad.applyAllSpellEffects(); + parad.castSpell(world, entity, spellCasterStack); + } + + } + + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java new file mode 100644 index 00000000..26239d1c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java @@ -0,0 +1,373 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.Packet; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.items.TelepositionFocus; + +public class TETeleposer extends TileEntity implements IInventory +{ + private ItemStack[] inv; + private int resultID; + private int resultDamage; + private int previousInput; + + public static final int sizeInv = 1; + + private boolean isActive; + + public TETeleposer() + { + this.inv = new ItemStack[1]; + resultID = 0; + resultDamage = 0; + isActive = false; + previousInput = 0; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + NBTTagList tagList = par1NBTTagCompound.getTagList("Inventory", Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + int slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + resultID = par1NBTTagCompound.getInteger("resultID"); + resultDamage = par1NBTTagCompound.getInteger("resultDamage"); + isActive = par1NBTTagCompound.getBoolean("isActive"); + previousInput = par1NBTTagCompound.getInteger("previousInput"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (inv[i] != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + inv[i].writeToNBT(tag); + itemList.appendTag(tag); + } + } + + par1NBTTagCompound.setInteger("resultID", resultID); + par1NBTTagCompound.setInteger("resultDamage", resultDamage); + par1NBTTagCompound.setTag("Inventory", itemList); + par1NBTTagCompound.setBoolean("isActive", isActive); + par1NBTTagCompound.setInteger("previousInput", previousInput); + } + + @Override + public int getSizeInventory() + { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + inv[slot] = itemStack; + + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) + { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public String getInventoryName() + { + return "TETeleposer"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 1; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityPlayer) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + // TODO Auto-generated method stub + } + + @Override + public void closeInventory() + { + // TODO Auto-generated method stub + } + + //Logic for the actual block is under here + @Override + public void updateEntity() + { + super.updateEntity(); + + if (worldObj.isRemote) + { + return; + } + + int currentInput = worldObj.getBlockPowerInput(xCoord, yCoord, zCoord); + + if (previousInput == 0 && currentInput != 0) + { + ItemStack focus = this.getStackInSlot(0); + + if (focus != null && focus.getItem() instanceof TelepositionFocus) + { + TelepositionFocus focusItem = (TelepositionFocus) (focus.getItem()); + int xf = focusItem.xCoord(focus); + int yf = focusItem.yCoord(focus); + int zf = focusItem.zCoord(focus); + World worldF = focusItem.getWorld(focus); + int damage = (int) (0.5f * Math.sqrt((xCoord - xf) * (xCoord - xf) + (yCoord - yf + 1) * (yCoord - yf + 1) + (zCoord - zf) * (zCoord - zf))); + int focusLevel = ((TelepositionFocus) focusItem).getFocusLevel(); + int transportCount = 0; + int entityCount = 0; + + if (worldF != null && worldF.getTileEntity(xf, yf, zf) instanceof TETeleposer && !worldF.getTileEntity(xf, yf, zf).equals(this)) + { + //Prime the teleportation + int d0 = focusLevel - 1; + AxisAlignedBB axisalignedbb1 = AxisAlignedBB.getAABBPool().getAABB((double) this.xCoord, (double) this.yCoord + d0 + 1, (double) this.zCoord, (double) (this.xCoord + 1), (double) (this.yCoord + 2 + d0), (double) (this.zCoord + 1)).expand(d0, d0, d0); + axisalignedbb1.maxY = Math.min((double) this.worldObj.getHeight(), this.yCoord + 2 + d0 + d0); + List list1 = this.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb1); + Iterator iterator1 = list1.iterator(); + EntityLivingBase entityplayer1; + + while (iterator1.hasNext()) + { + entityplayer1 = (EntityLivingBase) iterator1.next(); + entityCount++; + } + + //int d0 = focusLevel-1; + AxisAlignedBB axisalignedbb2 = AxisAlignedBB.getAABBPool().getAABB(xf, yf + d0 + 1, zf, xf + 1, yf + 2 + d0, zf).expand(d0, d0, d0); + //axisalignedbb2.maxY = Math.min((double)worldF.getHeight(),yf+1+d0+d0); + List list2 = worldF.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb2); + Iterator iterator2 = list2.iterator(); + EntityLivingBase entityplayer2; + + while (iterator2.hasNext()) + { + entityplayer2 = (EntityLivingBase) iterator2.next(); + entityCount++; + } + + if (EnergyItems.canSyphonInContainer(focus, damage * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) + damage * entityCount)) + { + for (int k = 0; k <= (focusLevel * 2 - 2); k++) + //for(int k=(focusLevel*2-1);k>=0;k--) + { + for (int i = -(focusLevel - 1); i <= (focusLevel - 1); i++) + { + for (int j = -(focusLevel - 1); j <= (focusLevel - 1); j++) + { + { + if (BlockTeleposer.swapBlocks(worldObj, worldF, xCoord + i, yCoord + 1 + k, zCoord + j, xf + i, yf + 1 + k, zf + j)) + { + transportCount++; + } + } + } + } + } + + if (!worldF.equals(worldObj)) + { + entityCount = 0; + } + + EnergyItems.syphonWhileInContainer(focus, damage * transportCount + damage * entityCount); + //Teleport + + if (worldF.equals(worldObj)) + { + iterator1 = list1.iterator(); + iterator2 = list2.iterator(); + + while (iterator1.hasNext()) + { + entityplayer1 = (EntityLivingBase) iterator1.next(); + entityplayer1.worldObj = worldF; + entityplayer1.setPositionAndUpdate(entityplayer1.posX - this.xCoord + xf, entityplayer1.posY - this.yCoord + yf, entityplayer1.posZ - this.zCoord + zf); + } + + while (iterator2.hasNext()) + { + entityplayer2 = (EntityLivingBase) iterator2.next(); + entityplayer2.worldObj = worldF; + entityplayer2.setPositionAndUpdate(entityplayer2.posX + this.xCoord - xf, entityplayer2.posY + this.yCoord - yf, entityplayer2.posZ + this.zCoord - zf); + } + } + } + } + } + } + + previousInput = currentInput; + } + + public void setActive() + { + isActive = false; + } + + public boolean isActive() + { + return isActive; + } + + @Override + public Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public void handlePacketData(int[] intData) + { + if (intData == null) + { + return; + } + + if (intData.length == 3) + { + for (int i = 0; i < 1; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + } + + public int[] buildIntDataList() + { + int[] sortList = new int[1 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + if (slot == 0) + { + return true; + } + + return false; + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java new file mode 100644 index 00000000..d6946e71 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java @@ -0,0 +1,745 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.IBindingAgent; +import WayofTime.alchemicalWizardry.common.ICatalyst; +import WayofTime.alchemicalWizardry.common.IFillingAgent; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemicalPotionCreationHandler; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.items.potion.AlchemyFlask; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEWritingTable extends TileEntity implements IInventory +{ + private ItemStack[] inv; + private int progress; + private int progressNeeded = 100; + private int amountUsed; + + public static final int sizeInv = 7; + + public TEWritingTable() + { + inv = new ItemStack[7]; + } + + @Override + public int getSizeInventory() + { + return inv.length; + } + + @Override + public ItemStack getStackInSlot(int slot) + { + return inv[slot]; + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + inv[slot] = stack; + + if (stack != null && stack.stackSize > getInventoryStackLimit()) + { + stack.stackSize = getInventoryStackLimit(); + } + } + + @Override + public ItemStack decrStackSize(int slot, int amt) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + if (stack.stackSize <= amt) + { + setInventorySlotContents(slot, null); + } else + { + stack = stack.splitStack(amt); + + if (stack.stackSize == 0) + { + setInventorySlotContents(slot, null); + } + } + } + + return stack; + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + + if (stack != null) + { + setInventorySlotContents(slot, null); + } + + return stack; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } + + @Override + public void openInventory() + { + } + + @Override + public void closeInventory() + { + } + + @Override + public void readFromNBT(NBTTagCompound tagCompound) + { + super.readFromNBT(tagCompound); + NBTTagList tagList = tagCompound.getTagList("Inventory",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + byte slot = tag.getByte("Slot"); + + if (slot >= 0 && slot < inv.length) + { + inv[slot] = ItemStack.loadItemStackFromNBT(tag); + } + } + + progress = tagCompound.getInteger("progress"); + amountUsed = tagCompound.getInteger("amountUsed"); + } + + @Override + public void writeToNBT(NBTTagCompound tagCompound) + { + super.writeToNBT(tagCompound); + NBTTagList itemList = new NBTTagList(); + + for (int i = 0; i < inv.length; i++) + { + ItemStack stack = inv[i]; + + if (stack != null) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setByte("Slot", (byte) i); + stack.writeToNBT(tag); + itemList.appendTag(tag); + } + } + + tagCompound.setTag("Inventory", itemList); + tagCompound.setInteger("progress", progress); + tagCompound.setInteger("amountUsed", amountUsed); + } + + @Override + public String getInventoryName() + { + return "aw.TEWritingTable"; + } + + @Override + public boolean hasCustomInventoryName() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + // TODO Auto-generated method stub + return false; + } + + @Override + public net.minecraft.network.Packet getDescriptionPacket() + { + return NewPacketHandler.getPacket(this); + } + + public void handlePacketData(int[] intData) + { + if (intData == null) + { + return; + } + + if (intData.length == 3 * 7) + { + for (int i = 0; i < 7; i++) + { + if (intData[i * 3 + 2] != 0) + { + ItemStack is = new ItemStack(Item.getItemById(intData[i * 3]), intData[i * 3 + 2], intData[i * 3 + 1]); + inv[i] = is; + } else + { + inv[i] = null; + } + } + } + } + + public int[] buildIntDataList() + { + int[] sortList = new int[7 * 3]; + int pos = 0; + + for (ItemStack is : inv) + { + if (is != null) + { + sortList[pos++] = Item.getIdFromItem(is.getItem()); + sortList[pos++] = is.getItemDamage(); + sortList[pos++] = is.stackSize; + } else + { + sortList[pos++] = 0; + sortList[pos++] = 0; + sortList[pos++] = 0; + } + } + + return sortList; + } + + public ItemStack getResultingItemStack() + { + ItemStack[] composedRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + composedRecipe[i] = inv[i + 1]; + } + + return AlchemyRecipeRegistry.getResult(composedRecipe, inv[0]); + } + + public boolean isRecipeValid() + { + return (getResultingItemStack() != null); + } + + public int getAmountNeeded(ItemStack bloodOrb) + { + ItemStack[] composedRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + composedRecipe[i] = inv[i + 1]; + } + + return AlchemyRecipeRegistry.getAmountNeeded(composedRecipe, bloodOrb); + } + + public boolean containsPotionFlask() + { + if (getPotionFlaskPosition() != -1) + { + return true; + } else + { + return false; + } + } + + public int getPotionFlaskPosition() + { + for (int i = 1; i <= 5; i++) + { + if (inv[i] != null && !(inv[i].getItem() instanceof ItemBlock) && inv[i].getItem() == ModItems.alchemyFlask) + { + return i; + } + } + + return -1; + } + + public boolean containsRegisteredPotionIngredient() + { + if (getRegisteredPotionIngredientPosition() != -1) + { + return true; + } else + { + return false; + } + } + + public int getRegisteredPotionIngredientPosition() + { + ItemStack[] composedRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + composedRecipe[i] = inv[i + 1]; + } + + int location = AlchemicalPotionCreationHandler.getRegisteredPotionIngredientPosition(composedRecipe); + + if (location != -1) + { + return location + 1; + } + + return -1; + } + + public boolean containsCatalyst() + { + if (getCatalystPosition() != -1) + { + return true; + } + + return false; + } + + public int getCatalystPosition() + { + for (int i = 0; i < 5; i++) + { + if (inv[i + 1] != null && inv[i + 1].getItem() instanceof ICatalyst) + { + return i + 1; + } + } + + return -1; + } + + public boolean containsBindingAgent() + { + if (getBindingAgentPosition() != -1) + { + return true; + } + + return false; + } + + public int getBindingAgentPosition() + { + for (int i = 0; i < 5; i++) + { + if (inv[i + 1] != null && inv[i + 1].getItem() instanceof IBindingAgent) + { + return i + 1; + } + } + + return -1; + } + + public boolean containsFillingAgent() + { + if (getFillingAgentPosition() != -1) + { + return true; + } + + return false; + } + + public int getFillingAgentPosition() + { + for (int i = 0; i < 5; i++) + { + if (inv[i + 1] != null && inv[i + 1].getItem() instanceof IFillingAgent) + { + return i + 1; + } + } + + return -1; + } + + public boolean containsBlankSlate() + { + if (getBlankSlatePosition() != -1) + { + return true; + } + + return false; + } + + public int getBlankSlatePosition() + { + for (int i = 0; i < 5; i++) + { + if (inv[i + 1] != null && inv[i + 1].getItem() == ModItems.blankSlate) + { + return i + 1; + } + } + + return -1; + } + + @Override + public void updateEntity() + { + long worldTime = worldObj.getWorldTime(); + + if (worldObj.isRemote) + { + return; + } + +// if(worldTime%100==0) +// { +// if (worldObj != null) +// { +// worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); +// } +// } + + if (containsPotionFlask() && containsRegisteredPotionIngredient()) + { + if (containsCatalyst()) + { + if (getStackInSlot(6) == null) + { + progress++; + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (progress >= progressNeeded) + { + ItemStack flaskStack = inv[this.getPotionFlaskPosition()]; + ItemStack ingredientStack = inv[this.getRegisteredPotionIngredientPosition()]; + ItemStack catalystStack = inv[this.getCatalystPosition()]; + + if (flaskStack == null || ingredientStack == null || catalystStack == null) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + int potionID = AlchemicalPotionCreationHandler.getPotionIDForStack(ingredientStack); + int catalystLevel = ((ICatalyst) catalystStack.getItem()).getCatalystLevel(); + boolean isConcentration = ((ICatalyst) catalystStack.getItem()).isConcentration(); + + if (potionID == -1 || catalystLevel < 0) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + if (isConcentration) + { + ((AlchemyFlask) flaskStack.getItem()).setConcentrationOfPotion(flaskStack, potionID, catalystLevel); + } else + { + ((AlchemyFlask) flaskStack.getItem()).setDurationFactorOfPotion(flaskStack, potionID, catalystLevel); + } + + //((AlchemyFlask)flaskStack.getItem()).setConcentrationOfPotion(flaskStack, Potion.regeneration.id, 2); + this.setInventorySlotContents(6, flaskStack); + this.decrStackSize(this.getPotionFlaskPosition(), 1); + this.decrStackSize(this.getCatalystPosition(), 1); + this.decrStackSize(this.getRegisteredPotionIngredientPosition(), 1); + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } else if (containsBindingAgent()) + { + if (getStackInSlot(6) == null) + { + progress++; + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (progress >= progressNeeded) + { + ItemStack flaskStack = inv[this.getPotionFlaskPosition()]; + ItemStack ingredientStack = inv[this.getRegisteredPotionIngredientPosition()]; + ItemStack agentStack = inv[this.getBindingAgentPosition()]; + + if (flaskStack == null || ingredientStack == null || agentStack == null) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + int potionEffectNumber = ((AlchemyFlask) flaskStack.getItem()).getNumberOfPotionEffects(flaskStack); + int potionID = AlchemicalPotionCreationHandler.getPotionIDForStack(ingredientStack); + int tickDuration = AlchemicalPotionCreationHandler.getPotionTickDurationForStack(ingredientStack); + float successChance = ((IBindingAgent) agentStack.getItem()).getSuccessRateForPotionNumber(potionEffectNumber); + //boolean isConcentration = ((ICatalyst)catalystStack.getItem()).isConcentration(); + + if (potionID == -1) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + ((AlchemyFlask) flaskStack.getItem()).addPotionEffect(flaskStack, potionID, tickDuration); + + //((AlchemyFlask)flaskStack.getItem()).addPotionEffect(flaskStack, Potion.regeneration.id, 1000); + + if (successChance > worldObj.rand.nextFloat()) + { + this.setInventorySlotContents(6, flaskStack); + } else + { + worldObj.createExplosion(null, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 2, false); + } + + this.decrStackSize(this.getPotionFlaskPosition(), 1); + this.decrStackSize(this.getBindingAgentPosition(), 1); + this.decrStackSize(this.getRegisteredPotionIngredientPosition(), 1); + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } + } else if (this.containsBlankSlate() && this.containsPotionFlask()) + { + if (getStackInSlot(6) == null) + { + progress++; + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (progress >= progressNeeded) + { + ItemStack flaskStack = inv[this.getPotionFlaskPosition()]; + //ItemStack ingredientStack = inv[this.getRegisteredPotionIngredientPosition()]; + ItemStack blankSlate = inv[this.getBlankSlatePosition()]; + + if (flaskStack == null || blankSlate == null) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + //boolean isConcentration = ((ICatalyst)catalystStack.getItem()).isConcentration(); + ((AlchemyFlask) flaskStack.getItem()).setIsPotionThrowable(true, flaskStack); + //((AlchemyFlask)flaskStack.getItem()).addPotionEffect(flaskStack, Potion.regeneration.id, 1000); + //if(successChance>worldObj.rand.nextFloat()) + this.setInventorySlotContents(6, flaskStack); + this.decrStackSize(this.getPotionFlaskPosition(), 1); + this.decrStackSize(this.getBlankSlatePosition(), 1); + //this.decrStackSize(this.getRegisteredPotionIngredientPosition(), 1); + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } else if (this.containsFillingAgent() && this.containsPotionFlask()) + { + //TODO + if (getStackInSlot(6) == null) + { + progress++; + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (progress >= progressNeeded) + { + ItemStack flaskStack = inv[this.getPotionFlaskPosition()]; + //ItemStack ingredientStack = inv[this.getRegisteredPotionIngredientPosition()]; + ItemStack fillingAgent = inv[this.getFillingAgentPosition()]; + + if (flaskStack == null || fillingAgent == null) + { + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return; + } + + //boolean isConcentration = ((ICatalyst)catalystStack.getItem()).isConcentration(); + int potionEffects = ((AlchemyFlask) flaskStack.getItem()).getNumberOfPotionEffects(flaskStack); + int potionFillAmount = ((IFillingAgent) fillingAgent.getItem()).getFilledAmountForPotionNumber(potionEffects); + flaskStack.setItemDamage(Math.max(0, flaskStack.getItemDamage() - potionFillAmount)); + //((AlchemyFlask)flaskStack.getItem()).addPotionEffect(flaskStack, Potion.regeneration.id, 1000); + //if(successChance>worldObj.rand.nextFloat()) + this.setInventorySlotContents(6, flaskStack); + this.decrStackSize(this.getPotionFlaskPosition(), 1); + this.decrStackSize(this.getFillingAgentPosition(), 1); + //this.decrStackSize(this.getRegisteredPotionIngredientPosition(), 1); + progress = 0; + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } else + { + if (!isRecipeValid()) + { + progress = 0; + return; + } + + if (progress <= 0) + { + progress = 0; + amountUsed = this.getAmountNeeded(getStackInSlot(0)); + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + + if (getStackInSlot(6) == null) + { + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (!EnergyItems.syphonWhileInContainer(getStackInSlot(0), amountUsed)) + { + return; + } + + progress++; + + if (progress >= progressNeeded) + { + progress = 0; + this.setInventorySlotContents(6, getResultingItemStack()); + + for (int i = 0; i < 5; i++) + { + this.decrStackSize(i + 1, 1); + } + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } else if (getStackInSlot(6).getItem() == getResultingItemStack().getItem() && getResultingItemStack().stackSize <= (getStackInSlot(6).getMaxStackSize() - getStackInSlot(6).stackSize)) + { + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + if (!EnergyItems.syphonWhileInContainer(getStackInSlot(0), amountUsed)) + { + return; + } + + progress++; + + if (progress >= progressNeeded) + { + progress = 0; + ItemStack result = getResultingItemStack().copy(); + result.stackSize += getStackInSlot(6).stackSize; + this.setInventorySlotContents(6, result); + + for (int i = 0; i < 5; i++) + { + this.decrStackSize(i + 1, 1); + } + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } + + //worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java new file mode 100644 index 00000000..9f926427 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java @@ -0,0 +1,96 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.container; + +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerAltar extends Container +{ + protected TEAltar tileEntity; + + public ContainerAltar(InventoryPlayer inventoryPlayer, TEAltar te) + { + tileEntity = te; + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + addSlotToContainer(new Slot(tileEntity, j + i * 3, 62 + j * 18, 17 + i * 18)); + } + } + + bindPlayerInventory(inventoryPlayer); + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) + { + return tileEntity.isUseableByPlayer(entityplayer); + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, + 8 + j * 18, 84 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot) + { + ItemStack stack = null; + Slot slotObject = (Slot) inventorySlots.get(slot); + + //null checks and checks if the item can be stacked (maxStackSize > 1) + if (slotObject != null && slotObject.getHasStack()) + { + ItemStack stackInSlot = slotObject.getStack(); + stack = stackInSlot.copy(); + + //merges the item into player inventory since its in the tileEntity + if (slot < 9) + { + if (!this.mergeItemStack(stackInSlot, 0, 35, true)) + { + return null; + } + } + //places it into the tileEntity is possible since its in the player inventory + else if (!this.mergeItemStack(stackInSlot, 0, 9, false)) + { + return null; + } + + if (stackInSlot.stackSize == 0) + { + slotObject.putStack(null); + } else + { + slotObject.onSlotChanged(); + } + + if (stackInSlot.stackSize == stack.stackSize) + { + return null; + } + + slotObject.onPickupFromSlot(player, stackInSlot); + } + + return stack; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java new file mode 100644 index 00000000..09104284 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java @@ -0,0 +1,106 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.container; + +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerTeleposer extends Container +{ + protected TETeleposer tileEntity; + + public ContainerTeleposer(InventoryPlayer inventoryPlayer, TETeleposer te) + { + tileEntity = te; + //the Slot constructor takes the IInventory and the slot number in that it binds to + //and the x-y coordinates it resides on-screen +// addSlotToContainer(new Slot(tileEntity, 0, 152, 110)); +// addSlotToContainer(new Slot(tileEntity, 1, 80, 18)); +// addSlotToContainer(new Slot(tileEntity, 2, 33, 52)); +// addSlotToContainer(new Slot(tileEntity, 3, 51, 110)); +// addSlotToContainer(new Slot(tileEntity, 4, 109, 110)); +// addSlotToContainer(new Slot(tileEntity, 5, 127, 52)); + addSlotToContainer(new Slot(tileEntity, 0, 80, 67)); + //commonly used vanilla code that adds the player's inventory + bindPlayerInventory(inventoryPlayer); + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileEntity.isUseableByPlayer(player); + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 140 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 198)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot) + { + ItemStack stack = null; + Slot slotObject = (Slot) inventorySlots.get(slot); + + //null checks and checks if the item can be stacked (maxStackSize > 1) + if (slotObject != null && slotObject.getHasStack()) + { + ItemStack stackInSlot = slotObject.getStack(); + stack = stackInSlot.copy(); + + if (slot == 7) + { + if (!this.mergeItemStack(stackInSlot, 7, 35, true)) + { + return null; + } + + slotObject.onSlotChange(stackInSlot, stack); + } + + //merges the item into player inventory since its in the tileEntity + if (slot < 1) + { + if (!this.mergeItemStack(stackInSlot, 7, 35, true)) + { + return null; + } + } + //places it into the tileEntity is possible since its in the player inventory + else if (!this.mergeItemStack(stackInSlot, 0, 0, false)) + { + return null; + } + + if (stackInSlot.stackSize == 0) + { + slotObject.putStack(null); + } else + { + slotObject.onSlotChanged(); + } + + if (stackInSlot.stackSize == stack.stackSize) + { + return null; + } + + slotObject.onPickupFromSlot(player, stackInSlot); + } + + return stack; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java new file mode 100644 index 00000000..aaf63b67 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java @@ -0,0 +1,106 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.container; + +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerWritingTable extends Container +{ + protected TEWritingTable tileEntity; + + public ContainerWritingTable(InventoryPlayer inventoryPlayer, TEWritingTable te) + { + tileEntity = te; + //the Slot constructor takes the IInventory and the slot number in that it binds to + //and the x-y coordinates it resides on-screen + addSlotToContainer(new Slot(tileEntity, 0, 152, 110)); + addSlotToContainer(new Slot(tileEntity, 1, 80, 18)); + addSlotToContainer(new Slot(tileEntity, 2, 33, 52)); + addSlotToContainer(new Slot(tileEntity, 3, 51, 110)); + addSlotToContainer(new Slot(tileEntity, 4, 109, 110)); + addSlotToContainer(new Slot(tileEntity, 5, 127, 52)); + addSlotToContainer(new Slot(tileEntity, 6, 80, 67)); + //commonly used vanilla code that adds the player's inventory + bindPlayerInventory(inventoryPlayer); + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { + return tileEntity.isUseableByPlayer(player); + } + + protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) + { + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 140 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 198)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot) + { + ItemStack stack = null; + Slot slotObject = (Slot) inventorySlots.get(slot); + + //null checks and checks if the item can be stacked (maxStackSize > 1) + if (slotObject != null && slotObject.getHasStack()) + { + ItemStack stackInSlot = slotObject.getStack(); + stack = stackInSlot.copy(); + + if (slot == 7) + { + if (!this.mergeItemStack(stackInSlot, 7, 35, true)) + { + return null; + } + + slotObject.onSlotChange(stackInSlot, stack); + } + + //merges the item into player inventory since its in the tileEntity + if (slot < 6) + { + if (!this.mergeItemStack(stackInSlot, 7, 35, true)) + { + return null; + } + } + //places it into the tileEntity is possible since its in the player inventory + else if (!this.mergeItemStack(stackInSlot, 0, 6, false)) + { + return null; + } + + if (stackInSlot.stackSize == 0) + { + slotObject.putStack(null); + } else + { + slotObject.onSlotChanged(); + } + + if (stackInSlot.stackSize == stack.stackSize) + { + return null; + } + + slotObject.onPickupFromSlot(player, stackInSlot); + } + + return stack; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java new file mode 100644 index 00000000..2c50234a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java @@ -0,0 +1,73 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.gui; + +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerTeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerWritingTable; +import cpw.mods.fml.common.network.IGuiHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class GuiHandler implements IGuiHandler +{ + //returns an instance of the Container you made earlier + @Override + public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) + { + TileEntity tileEntity; + + switch (id) + { + case 0: + tileEntity = world.getTileEntity(x, y, z); + + if (tileEntity instanceof TEWritingTable) + { + return new ContainerWritingTable(player.inventory, (TEWritingTable) tileEntity); + } + + case 1: + tileEntity = world.getTileEntity(x, y, z); + + if (tileEntity instanceof TETeleposer) + { + return new ContainerTeleposer(player.inventory, (TETeleposer) tileEntity); + } + } + + return null; + } + + //returns an instance of the Gui you made earlier + @Override + public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) + { + TileEntity tileEntity; + + switch (id) + { + case 0: + tileEntity = world.getTileEntity(x, y, z); + + if (tileEntity instanceof TEWritingTable) + { + return new GuiWritingTable(player.inventory, (TEWritingTable) tileEntity); + } + + break; + + case 1: + tileEntity = world.getTileEntity(x, y, z); + + if (tileEntity instanceof TETeleposer) + { + return new GuiTeleposer(player.inventory, (TETeleposer) tileEntity); + } + + break; + } + + return null; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java new file mode 100644 index 00000000..a6d5f58a --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java @@ -0,0 +1,47 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.gui; + +import net.minecraft.client.gui.inventory.GuiBrewingStand; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerTeleposer; + +public class GuiTeleposer extends GuiContainer +{ + public GuiTeleposer(InventoryPlayer inventoryPlayer, TETeleposer tileEntity) + { + //the container is instanciated and passed to the superclass for handling + super(new ContainerTeleposer(inventoryPlayer, tileEntity)); + xSize = 176; + ySize = 222; + } + + @Override + protected void drawGuiContainerForegroundLayer(int param1, int param2) + { + //draw text and stuff here + //the parameters for drawString are: string, x, y, color + fontRendererObj.drawString("Teleposer", 8, 6, 4210752); + //draws "Inventory" or your regional equivalent + fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, 130, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + //draw your Gui here, only thing you need to change is the path + //ResourceLocation texture = mc.renderEngine.getTexture("/gui/trap.png"); + ResourceLocation test = new ResourceLocation("alchemicalwizardry", "gui/Teleposer.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(test); + int x = (width - xSize) / 2; + int y = (height - ySize) / 2; + this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); + GuiBrewingStand d; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java new file mode 100644 index 00000000..53a74f19 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.gui; + +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; +import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerWritingTable; +import net.minecraft.client.gui.inventory.GuiBrewingStand; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +public class GuiWritingTable extends GuiContainer +{ + public GuiWritingTable(InventoryPlayer inventoryPlayer, TEWritingTable tileEntity) + { + //the container is instanciated and passed to the superclass for handling + super(new ContainerWritingTable(inventoryPlayer, tileEntity)); + xSize = 176; + ySize = 222; + } + + @Override + protected void drawGuiContainerForegroundLayer(int param1, int param2) + { + //draw text and stuff here + //the parameters for drawString are: string, x, y, color + fontRendererObj.drawString("Alchemic Chemistry Set", 8, 6, 4210752); + //draws "Inventory" or your regional equivalent + fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, 130, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) + { + //draw your Gui here, only thing you need to change is the path + //ResourceLocation texture = mc.renderEngine.getTexture("/gui/trap.png"); + ResourceLocation test = new ResourceLocation("alchemicalwizardry", "gui/WritingTable.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(test); + int x = (width - xSize) / 2; + int y = (height - ySize) / 2; + this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); + GuiBrewingStand d; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/mcmod.info b/1.7.2/java/WayofTime/mcmod.info new file mode 100644 index 00000000..03fe5817 --- /dev/null +++ b/1.7.2/java/WayofTime/mcmod.info @@ -0,0 +1,22 @@ +[ +{ + "modid": "AWWayofTime", + "name": "XAlchemical Wizardry", + "description": "Two words: magical swag. Oh, and a gun.", + "version": "0.0.1", + "url": "http://www.minecraftforum.net/topic/1596973-", + "updateUrl": "", + "logoFile": "", + "mcversion": "1.5.x", + "authorList": [ + "WayofTime" + ], + "credits": "", + "screenshots": [ + ], + "parent": "", + "dependencies": [ + ] +} +] + diff --git a/1.7.2/resources/assets/alchemicalwizardry/altar.png b/1.7.2/resources/assets/alchemicalwizardry/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6ac12e2fc7b3b2884e97a899c6630c43da9e5a GIT binary patch literal 59034 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 B{^S4v literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/models/armor/armor - Shortcut.lnk b/1.7.2/resources/assets/alchemicalwizardry/models/armor/armor - Shortcut.lnk new file mode 100644 index 0000000000000000000000000000000000000000..806150bd4ab973a746ab149163fced1f066eb7d9 GIT binary patch literal 1926 zcmds1O-NKx6#mAssF0c|3lqyh3au~{T7)48BV!9OX|!D2g^xFHbo7mHxbM-B)WT(D z5JU?hLdgE0MVn}qNJN_;q@pkiqE!?jE`kVxzVpTzXEbo!_8#Z{^PO|P`<>ejAW&Vw z7MSx}#I9fqLL5(>4Yv1Odld+Lt=)9LsP{LyAIP0Av?DyHVC1|&*+=6v;8u9q4c!pX9| z6{GjjhfBXHjL{!Zhwc&|Ny!Jt%f?O?A_uCOM=?ifGlOGgBc;hnh7s*th2m;+11K(e zG<}qT(pXYsmZ^=ThmH+IBrI9P(=d=EYd{TpOK=U>wLBMSD;w1y|1MEIw!j|t#he+o zIc%j|8eua_Uv>h}GSH6$_vn7k$W!fRl@}i8wBu!%Z(em^| z6qma0{hHr3<0cz^axWnVBo=`!zQPEa5T%3_`h96?w#s)eB2wt&*u^NN>aau=%6Yz2 z$)i^K>?l9Q+=HhWi4?w~2Ps{duP!@9=2nVEX6wsb_?2((G9hE}nQ$`SQZl?=Rtr`kS$u=L=`n+ZUj}>V{Sq literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_1.png b/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec1ced0d0c8336b19787d6a18619f2b3a7f0f8c GIT binary patch literal 3785 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_2.png b/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe14b5eb1e8124cefa080ffa6873913f1677e14 GIT binary patch literal 3149 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_1.png b/1.7.2/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d472d41df372757ba91ff3fbd3195e0038fec8d6 GIT binary patch literal 3830 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/AlchemicChemistrySet.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/AlchemicChemistrySet.png new file mode 100644 index 0000000000000000000000000000000000000000..23e179ab1e5bc2cc0132f2f1f6261e70f074b35a GIT binary patch literal 450 zcmV;z0X_bSP)mGh0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8I7vi7R5;7Eld(<$K@>&L>?|`Z$!aj6F(z6VdcJ{@ z-!LRvXd)0P_yf?=#y_y%e=yc2wAff6CSc*Z2=gpNA_R~GopLhw=FG`^N<`S?cD_mDodWMI2)OEW)Yf>s z(8ba(RI*v|!w{EFbD_0-e1)ZzBx`|f*H^=e8&brQN21i@h= zD)dgI5f$7CqJpCTO>jUP+=}4vBUF%f!h2sg zO`0T(F|k=XpMShq@PqPB)3lSxWVKp3=Zc~bLd@s$JJ%1q_uprGhzyBnI2D$XFap&N=pdZ>??i#r%c#-g89f?0Vg2S=P2q7>0FK*YEK7 zrThE$Uy>vuNs_WG$rB)Jnr86fg9pTCPlXWUPhWvCdHa@g$QRy*IS^>jEQqPp$0 zF&_Mnt5@F?Q5+cc;DR!!HfnpP=A z4<7&#B5JJwKybu$-(qcRd&kFp45i zWQ^flDAo79k}@*JY#tTIQYi(DIifU8vMj?mPK>dRymQuCr?lGeRaG?@3^?a?T@wHR zAaWw&mo8pNl6ZLYhPr$Sz;D`N7&_+wVB@pg+2+@-27ypYVHgHo*DV$ctu+w=fOD=a r%hS_SYpwTQDP@dVE|*HF*=+V7^X72Gm7@z|00000NkvXXu0mjfPRcM_*HG0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8B1uF+R5;76lf6msGOxm$0xRG;09gaP3PpK7fDXf0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8XGugsR5;6}lCg>tQ51&1GYQEgkx9V762wLe#YT*8 zu&~8~+ij6-v52<5mSSh@Oy>)TRmc$a) z3ZsbIIHr+htkV<~F*BeB`~`Zzq<{pwzkikti71N5^Be=h!VIt|Ad{*DTaDXoWt$Cw zL;}P>TD(nn%m7HLJi~rp7of+jma1xw0_MG*o`Ggi2?(m@dpa0M-<2tID_xjU zz{`GLmtn};^8kLr*=x80PD&sLfLG0?#zBC*=eKjb85*u=;yd8Q9^?R!0?BH{!a2sy zu`%O4umm0yV?4Tv0FP=ledu< z{|`Aib^^x|C2_UlvIk!WGxGt15&!=F8OQPY`T2Z413(DDTD$MN)*1i+plw@bZrgU- zHX_p2+Pm7ety0Q4M?}LgF!Sr{D**I;&&*Rw!FwTuzBldrZmo?mrZhi2J>71%QcB?=t5WK4h)Sta%DQBwlnx;*%Q{V| z);f;UAx0sDwRTxnCFQa#%=Hihfbib$`!3%v5fM?XFbt1f*9j@tH3NXO)>dXB`f@xX=5@_Y zV~FVfDCb&4?79vBLhvz0>6|CpmDY$zwBv?KDF7J9vFkdeR7xp?AcYh{GPC;q>!|yJ?zI3IJ%Wg%H>4)j4O3Mnv5-CZ+l9?ah17%=gtVm&=_{Yt1<$A|i$m b&gb)gc+5&GHlu-0 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png new file mode 100644 index 0000000000000000000000000000000000000000..67bede34b0014ac5964d4adb386140460a1d1485 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)1Fs>FdgVkCBy6SoFoGHa?(`Y-UJAiF1B#Zfaf$kjuc}T$Gwv zlA5AWo>`Ki;O^-gkfN8$4itCrba4!^IGwyE`E<$xmJJ3#uqJJf@3dzZ{;%Tk;Sp&H zWaf|%_!U1@@ymX#+}Hz6{*z{WF_h}P(#7gj*vrqr5OJ4_mCLMR2gnjnS3j3^P6KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i5~C)<;m&7C!`<20*?sfZAAf3N{P?*tdX1?v+CLtWMMRic zTl?KlKZa?#^!@#IE5GM)B%EGCIXr&Nx};v@w;@mC>w}4(V+M$3nI<5D zAAAM}bhu810lcPdEm_KK5h0?*`*9fXq<=h8SR}8w1!g2?$*bfwg$3WF81eiG|KK46 zrLDyotayJp2S1k#SXHblgv`u<23PI*Tw=A(&Et3i`Wh30njQ}@yZ9OJZ>i*U9ERcc zELjj^xl&A$CB;-b7yOKa*O;~pjumI-EoBi_D#e5(v@xtI6p$68T1T}&)633wDfKuE zr#<`(h(pL3(Xmn@V%vs@zW?x{FaUKP@&L~(5v8#B$0PW8jp>wPECPTYfX+%u&dgj= z*2dg#H&#^&OJ(%dj0##~ZOmS?6|o`@75prDh3c7^6@woz0I5jMDJ=V`>#=Wy8Mr92 zh}3P%O0iOv(b^bg+a~x~qgEowl$EO6mWWaal5^cQ&{Ybdb}og5h-&AGj-I@MjT8w0jZVG-sOqu$HNifh$KmfE>u18w(~h{pSC?c6d=n-I2kTR{~EAI%t?zh|S zbgH12_5o?&9RcAC$=M#X)Sk~U(c+0jq>76Hr6>x8+TQHmqBckL@(pbH($lA>C!jZ7 zH;*GSc=Pe^e{dAOC8BW{P@j1m$6*M5wr%q*Zqd@#2VvQ@UKcX0bLuN}WHa2J!=Wv^ z>orVMK`*$a!mKK=4{jlcOW$ubD0~gKXHc(gjd-^yv`>QK4W(LJ{~s#HO2M)3x0`kD zR3_BRzaKY)R23jzUtX4JVx`9W>sND%l|uNESJXL$v&zK9BcTWOj74#n0Lp|9BMlO)*lW#m{xyV4x~gvLv{8uZ_{xVsN5Ymuc#* zm*D3V7W9PVb@4NNu(&VgAi_#9X`(eIH4XzpKu>9-H-``@*0k#+XlqLwL(_HJEQc8h zYbuqmj6SU~VM3KrRUBp;ip;Edjj47{@_Om}6k~UJxA%>pV~%|T9EkfwM7C{?x3RMv z4e}V{r>Cbirt$s?CuhZ&sb%s=mZRgIuKjy#6{UOOMVrkl-gg=N7A$9y*L}jswihv% z;Q=UMp6Htk`oquvHjJEEF#;+h1vKIeZLK?>3;WyRg+{}2hpnWP2x33>5v!^^zj(iI zf3iojYFigGM&F#!!=*p9tx+O~WSc+Cl2=yBwhf-w#%QCDS^!;eq!PY$?u3XoZ`!xa zZFve|n{LjP83O0H^nH6iW9nfy07clB)|l3quzP*kaLN`8p8?|(scu_97o*2UrH#?X zV4gFxWI6g$N#gXwufO1(;$KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iCT7;H?53htsIHE8Wp+O%`) zrEAC%D0GRlbjp&nTOmux*ev=5PJe=^nn6oVNhu|TLLk_}AaDnF`0_5NNPd`yeDB_O z-+g!Ytfv5g5Vy<4{Z#-N5UL}wplqyOF916-t{GOY5XgYSpa6*K{4?cH7#?<^!n(?X zYX)S7Z)QO07M2mY77B{DY}fn`futOx046|a^a+hmQIk~i z34l7g4W)8b*;-2oOjL4?2_Kd14UtHI3PV3sA{OR;R#z%rv%hmP~E2c z(yf~eM|Gg1Cd1aGT-D2j*4em~7=&0TPK$C*0MNqwW_*vRyTYweP50o2l=9dHw}-QPviK zos_i`q1{T>)m$_4vP#c1R7m2i32szL(>0GrzcOx_nOn^xQg58#+@FKmU9a1hKik&X41rZ9?&{_4)84vCj7Qqyze#rtDnELZW{e)I24`Ry{<58_qx_{xqNBapVIWt<)!EQ@3*!DS6Fm{;Lqiy zPDtm_mybEkE@@*w90ZS>ghV&S@N9rH2|N|^zC3UisMlnlL(dZeE&{s-=F8X z=lhxgvDhtgm(3#b+JooMgk2{H4#s0ar(zO`yVQ{WyCqq(xz{AIzthV$hBasCeaA$bh?`Fl| zioDEkc71&tK(9%9L5}p$=#5s3-7Hac49Q7m3xNIb@g_5ny+7FWe4ieykltx;v|8Nd q_vG~}&-eR-%}x+JdHqVz{to~U$@yTU)t@>50000KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i0%eSf~+_xs8F4Kf%&1AvgPPnQ2w;{b5Z^A4D3vgM04c1ZgSTpEE1GIr7D{q<=$ zYz76XB6HS8zNo4D4514R$eh0dt^XK?CI|4%w@`r)zQ8}Q3SVHweLjX2$e{0XuK=(D z73jkTWX_nuU(kS62%!S2;MZNM&=DowP3Kq&UDp_+tz8JjG(7-6FaRM+(gb-W8_;#7 zWDXoVV+KQr^NG6<<_w8QT?fp-&m6@AqoMSn;~1Ee5$7{?jZ~^l!_2)u za2tAjrUo<3_cSvwi}7*YwgNu$$$gX`_N2bX37r?Q8V{VC>mIP8fH#(TDk@^ zHRROi-b0ffog$XsTvkuX6qv2RKmsGOJ)XYKIQc`1JI_`|jyl6={1dWajRz=lx<=ewgnp%-3Pwzs z2r-NyfWPsUVZP@+%-;w7<<9?dueVu2D!Rr4o}a!{r*fqtFXspQhwY2=gZ-H(Vtju3 zvRtW*?(Srjt;^%1KGeAn!25YFv_uz-%`v*WTYtK7bNxYfFOQEDwf=NtGD-oP>GJpp z@cuaceWvPSIhybKtl4ZO2~dopNt&KDn}_WS*?RP3eUhf?shQ-nurT^rv#C5hda|xa zd0(s5#8WIUc6P*}l_Zl#w$XW4x?2ilQ#XL)?Eq^a7iPM<&CXasq=x&B~PELhgWB-7GL5^chY47}>~ ze%;z?C5if|{tsG4(IicaQRJ(J!rfu};_~=tGD?e4Bq2l_#cw_P$@-skIvQOVQ%_mF zx9!)K8P!(iM>N+7kxZp(RWt`qIvrt8TGR-FEk=>|K6#_r9%k9a)%K;{@$GG?S_QuQ zVN=xB8I?>DM=Frjd!M|qR+~e6(%E15410a`(YU($f|R;S)vErs_jZd>RNvZMtJSvm pcBSftYkh087)26C6te4o0{~6n?hd>n{Pq9<002ovPDHLkV1h;AuqXfk literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Top.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Top.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc3a60a69433c4b057d123d841eb6b352e17217 GIT binary patch literal 2261 zcmV;`2rBo9P)KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iI&Sh-R*iMaebxT^cqSRbo0)-@Q z)3mfwCHMsJ4o|%H8}P_G5<+|eZUuyLaTB0eLJ^8msV$|A>!yim9A9R9X3p7rFCHdm zI&IlcXYaFad+q;P>o2cC1vg<8fRcx+`s{XccoS%azbL?zwec@AK0VWFPOqD-o3Ywh z^Gs{~i}I7T+Ui!|#!*!5>FQ^Ls@rV|8?XvhD?d@3mfwT7r+ff5heaqMz=~ljb45%Z z0&K%^$l!M2tB~?CTMF^sZ2rL7firW?Y=^WA75Mg+Z^60D_M(=s2+Lq!fw$lU^fLRl zG571Z4Z}`$V9iWO3GNm?q|}Kz6u#l)R7~$B6)SbrVP=D~b0Ph=@E?13JH(?i`A11l zTWO+txB>PoY{Mdal=)yxC$q1jr$T%j-OSydvoEE%DW-Pjyy~qcy;EdsG2TYjRJWZy zP}PvWEv$sN>dbq_7?A^G=0e zr3a-CF)4V&2?B-cx4ikCwLLEho@>H&XOCCS*gD|Kspqu_V3fY58N~}eBt^=Y)Y`vW zdp<Cg5xcjmY0J|JTf` z$VdbTDOn^yp_-Hw6A)md#eD_x(-v(v;hXSb;h&39L15jQq$qf6*P7;6N}-ydKz?9& z!@CeuLY>H3OydyOt{#cgv=H?1(o>*B?XCWhg`wE~6 zkvGL8!J=xUuR3WV_8fSag`u}0>IK!)s&_<^G5=`7k58T4A5@(pUnuh5e6YE<^I)m) zw+DxL*%|EZEgV_=dUyV3J3D>vP|l@zQuTeMH;N0e2gL-Y8F*{fG+oQHb?2Uq(HqGj z7fDTX|DeCUw|@}BQV3sp^2w(b<|CS5FdSJUxvID3yD46F_EwWFs4l?mu2tl>{f$8E>eY<=hPx0v2N{J z2pV`@%xsIIYElQly~3+7jM_0G$k`aY$mNiJbo|&z%;8|LRaH)@z0WmuM7o`_TNJ<8 z`tYK)*Q_mL0{X)2C>#|2@nQ22MW4<#rAg}HY>ZZ<=wm-j6dJpT=p&|O@e|KNg@MH@rcq)7xLg|q(})^~=()3Y;G(i9qu`Q_&3pZ51pW?s;w%qI1)k7gpJm`_4nhVf97 zpFj^b0C)tn@GrzDkl>OXUmNG_T4;V9ajGiRB0m(~@IHnps4-?OMgdWN>+H<1IRd>F zimunDXca!5$)B&AOU4L*J|E*15rOZG>OXq7;*1CeqC(TWJgWa-jDfWnuNVR8!>ch~ z?__Tu)}N;>551`h7-OuVLX5~TYZ7Yxidv1+>m z;P%>z*v(utvM%ym6M_{R<5g#k>Y)-;MNbMLy;IVNfZ?xTFw~pi7O@>4U87vK(@lzdzll{>&$vrtG z3_Laphf}1unxJSbRR2FFTTSuYvc<;u`>81&K5ev~3fhc$(ZftWP}r%;wK3s300000NkvXXu0mjfQYS!_ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodSocket.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodSocket.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0abab056d7672cba674c8f1a95853e86916a88 GIT binary patch literal 481 zcmV<70UrK|P)BH9Z+ifM+?dGx(;Cc@ z$Q&O>_4(st@V>V+m^p;SNy1O6_Fy!%MyTIuTNGh0L9%M zJIBoJ>+5HLl7y1Py}d<4MFfCDpwS3G2%#5A2mv7|NpA8SfXT8rzg{fPHX9B>O4)Pp z&Vl*r;Gnh^fUc@v#sH|Ty*@eubM*NDx~6%*;O~bAA;fSzKHF^K-TusGYB1I5!-Rm-qM4XS;1|>-Wniep>JU XwAsu-zt6@i00000NkvXXu0mjfb|c&5 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodStoneBrick.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/BloodStoneBrick.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd91f9e0a175ea2eff4a789bd7a8670603cd3ef GIT binary patch literal 459 zcmV;+0W|)JP)b0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#8K}keGR4C7N(M@g>K@>&db6>q`yB#?)QJ5kzVks#1d2pc)H#EB8Fl3 zEjcXEQaZZ7tZUa=gDeUd03D1CKZz_gI7CQLOW*1w*48rdB1@1=XP7}?&-t*pCvlZ3 zGFWoX-d%)QIum!M8jQgdDDZBXwXU<2VS#GtTuPuhXhbzDV4{N#O#de#t!6hF(X8vD ztaFRENfrF5F$8z;3uQQzB0@+2k}!AQl&@x9-BK7J85rE@fyO~D8m6ukP>azzO;vE-bQ@BQBM z@oDGxo{xJeo4=MPHp>ZvoF|MdU>002ovPDHLkV1l*U Bx>x`J literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DislocationRune.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DislocationRune.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6c886f95969e1ae04bda4228251c1671f8456d GIT binary patch literal 741 zcmVXopTqOOBi_7zwcqbA zE-tp)EdXn6S(Y(Ir4#@FRaG%_RaMKfgb-9&mM2kz_bvtj1z>uUgA*D>=j zj@B3cu0C#rg{p_r*>q<&V^E?C4TAxyq==cAeo8GSdhfg3gqUK?GX$SRRb7wc1PCDn0P@~kWw0_DIX0 z-~KhNf1kt{WuL(j$98`I$N!y_GNp7p%u-5atvwu$!!YKYQJf&O~!XndPe|hok)HDqMYmIYG)wLOh zsW!FuK7{yuee?I@M-YW&krloCA@%*Z*=&|22tmv&zkl|fG4<8e(-S<{zJk zb9H~^CZ&`R;^E<;u4}E8_g)o+9>?kK?#>v)%%|(S-EP0%H%*gsp6A(n@4dIyZnxVn Xl5I!`(@Hx|00000NkvXXu0mjfCNWOv literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DuskRitualStone.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/DuskRitualStone.png new file mode 100644 index 0000000000000000000000000000000000000000..34c6a0a4ebe5228de488166c28e75a81d0dac973 GIT binary patch literal 762 zcmVxnc+ei?lc~r>; zDNz=7025qMb&<52sJ}LeNJIlngb4)xL{U~4Gvk^2IH!w#`w#zq_pVwjdiU-*Ymr8%*TX`Dk7#B zkIIq&KvE(iVooUmKnwv?Rkf~b9|9l(0H}&80GRFZxUMPyK!Cg`y!S-3JsP!bs{psR zx6azUC=?(wW^Xd#`x_fsmi_whq4)mm;^N=y>&K5C0V1d}^ZDiF^^YIVo<4o{|)~i>vT>f)>45~2% z!;E{cUo!wA=6Nn6P1_P;C(oIPn3v0?VK&Ar?(Ukl9SjDh-|vT}A)-#Fvsf%LV~FUu sED`aqw{KThRuEBClgMB=><@%02dv6B!55H6dF zN(D$-uGi7>Ju}VnZf8D zJokn7VE!EM!nvGMzu&)paa@ML01;j8JqjTVVhlxL@BTvz?o~n&bUlS2D@0=e2aLlW!ifWVd zBS$j)@(Ms!?YhpFWjUjJU^cVs-~awx{x}|wscm!47rTeOUT=8%X1;qk+}N0%oyD91 zKt=lfKAa;mBFZUg&Q~E_N<>6NR|YflB64GK;#N-0JnZ)RAJpz*_Ylnc%lEoa$GUU= z7r@h;my=(yt}14}-1~X9d63!9Ht#VLob%o@_}|fiu&<_1+8>@8QBf4$h}29~MTCg< z7bl)|eD+pNJ;|-rdjREN(A0GxP9nalDl*GCGjO^0sA-y;i<5f#Thq4V*`Le($1z67 zdbh>*)>MtmJLk)?M2Bhp5iN}Dnwl|*NZ~zz z?XPc{n3;PjMoi3pGMW4r9|I`Ma=BcJ2mo*9oTHzf70xlUnqAK4gBWjYZ~qS^jAAX< S?p?nC0000fHj4>KxhGEzg%bH36&?k79w&MG+Yl=_5 zFUqSc=WJ<=QU&K6t+fCkrMw=q*SG1*``)v#`YS1=zg92JoA~1&N=g}HY?`yy8nxEW zImTFfi;t!yB6yvjw(hW=U(Fm8-k-0-iv?heF#tg4+-kKt91hOSLI`W^nOW5)U~IG5 zoWyv17azXqaU2m508mOw0%b)uE1BDF8U+V*>cLX!>DDkcbG0=zMO= zvIGF~^d^)#2w!IjQc6i6zhVUr+Z?+x>D}{j(eLT#w_#5r;5@ zrqWxLXH0ADy~pF}gorZBq?GH;dKmltjgK)Jt)^*OE|&}$&2w3rd3FGR9C5NXhL8Zd zw)^sN-m^Z&NJK=G64bpm#xTTbvH*a2o~Iaz=z6(y&Q6ofGD$?2M=hCpS@^V50AP$R z%Mz8+M4k)boFnpXcARqnXxp}`s+<3EqM5H1GGq*6jQocW_gbsFyIb!)K)TRbmW2=i zpl{XE z)7O>#E(a^0inft}wjWSvou`Xqh{frp!5alx6gga;uQpUP*x2r^(J`S(=W&qm?T^au zKDzDwJ<-Merfh^*`H>q5%63(rF7=G(=hU-wa%5==2sF;T%cY^Tb{bPB$GJHNU%NZB zL~(U^R5P(3dHq%?A#Jwa#!^FQOEi`$h`X4{oqNxD&v{Q5vw!&U zz{agx&3HUBJ8Sbis;cT_G66(Hj4}4C6%jxLfU2tI=jUlKHwTDO#EE=7K2}xdeb=@@ z#H1u5Nfi;9nV1OxbLPt0wrwX(Lvns@i(-=Hc3+0SKx@ zL_|MczqIl5Um_AjL?nhl=g*$4s;XC(w}1J2=f>r(ZAB!{^XYmB;njsR>(37k&VAy& z2LQOawq}gk-hcPQwF}}sXW7;t{~|z)(HQe!`C`T#LfG6p`u4LkbzNgo6vmkQi|57r z5JJ;5#+aQOm+vht7-KSK*L9lG(37|W@{~cv9gje7uIh4`p<*qi{81q z-&a-f-T-u6mu1=Z{<|k@i|;>t7>!1ljPW9>`rVatn|nuDo?B~)2#J`vD2i`hzWwQ| z<)8|P5+hC~6AdAR0Ej!+FKzz*I>wmiIcJ%*_U?-}Prtkd0Gd*WF@%5yz>AzV%@n@3 zw6Okc-;0D8*Prcw|M{nF+dAixY7k)}SY25mV*sEmOI7WhLx7?z2@#3fwq+t_9-p3e z&JBk{9t;N3b%(P%In{tumEXf0uqmUjRE002ov JPDHLkV1i|UX5#<= literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_bottom.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..de3fb1bf8630edb6f47d80c425fe72bf844e7759 GIT binary patch literal 680 zcmV;Z0$2TsP)n z5rvq_P?$KEY-Z=n#l8Q0eeKW@sdr!2b*vQ;L*M|=y;(}B)_T7`o}ZqVb@Aq>^NE?? z-mWh%F9}f1iGZ57VW{`VV;sk6nmT}pp8h!f_jV;@1gy2HYOO;lnVCsM03d`AI3OS+ zxi=B5LwP*zA%<<;VhG*)vMf1eDy4`D021?dzpL52EZU4i00bh+L%Ba5%{wACcM{Rl z>HP8WVP-J|Ird{ex;FrLdU{gT%jvvsn~D$-GliUD83t8}F?RQ_U%xENno{cC2~kCI z8QgulZ#icKAQ4@bb(*H$`=JtJiZR9zo4c5Gz!)Mkx7LpRKtvkHv3p;aRpnUc1ra*{ zhp-=V>>?ubGLOTMQy!;L%;@cUB_<9LiO!eH_5B?Y&1}d?RfbxLSXHK}nkgd@6CKCl z-pqVmw-}>{GP9Yr*1CHxrA`wP9lIa`rIdQ_W^I~AGZoR4f{4TvTeF-?ARLFq9%xl zkde@z;6wyRQ8Uz`KO=~U17i#!Bt}AT;14+PL)3xY_nv!h?x|h-;h-I^(PF_0PtVTe zQ}+9Sh=>RPs!B1M>LnskOi4x7j}PVPKydcqtv{>Z@%qOhgkWZ1#>}c}W)!1}h^l>I z`Ehyh`fC^|ep3?NqwcHXX5dbV`eDd9Um8*=ep~TJ`04bjnxUHZ{c!j6mHe=W&oH{D zWy{O~k%$7Ke`(=9{rc{WQZf-CGXp@3@t3!*_o&12u^E|1g5BKYt5ITBJ#0rB|csySxpiG+=F}xs$+<)fV?U@` z-@A^Y>r>0lbG?*Azf| Q?EnA(07*qoM6N<$f||2cUH||9 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top.png new file mode 100644 index 0000000000000000000000000000000000000000..45c4f5bb975cedf63d9049d5b63990f2aa2148c7 GIT binary patch literal 622 zcmV-!0+IcRP) z=vs5c;9qV+(HQQ8a_uk++FHx(N4!zB*38W3*OxhGs06Y~I}>Dhz(_->05&6O06>O& zR>p1L2}HQr#cAhS63+ANtySe(B(}Q)kjlIT#n;;_Ky&sMLYc?g>tj{!N;9wAJJa0- z&D=51=@Cvhw`27CxrEBhQthlkYu+S*1bDPzEh2NTJ&gcp27;xWYq}8xC=gY-_nP|* zlA{ebtJIupWrn*XH!rEAu$IbW99aofWYw+|(AyvZpj4x`+xAM%>~iiy@gxA zsidS`Wp2vaxq!%ARr@}(H`|#bx&&IYhxa`zRob}>WIUH||9 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top1.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top1.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ad8f9e4d4c223d00daf0ed92a2223ee4e87127 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E{Cu%tD^n2_m_b}vY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zJ5b!()5S4FX(dgro>bh!6mP07#md znWxkYLt3`&&E4JW^;)&YQ;UpR0f79I^SbMH(-aXPlWJ|+_V3Nj9yn;*T1wO!5wl50 zb`i>Xk&?SVMRA^=F*lfR}303rYY$mC!qKoS5-0+IldA?<*5*IkX{8?$$(ry$QRE`ChY zfja?`A}JYWHL&S>0!MB8;rMvF-G05i{CIM*awiEAq?wU4NRJ-?KnAIlvim+Fn#SBo zHttK{x)hl4^K!XbENUqvB|-9t_ix{N&R@3MnSldit-~Vt+(&pyC?(B^AVC`U`vu5;cD14+8m%-m^~Xtpb50$%j}jBi%JY~ACAB`C|i;NsbmRTd&ZWGAcR3d0mB#jrOJ|$Cj&+rY0b>c7zm{h1RZ|w zJ%fc@awyG=$TATmic-?ieJIOJ5++F=5DF{kn3%{g9GqnXWm(#jtF)7{mtffv>ew*dAx#xcjLVMbjH%eWnX%i5l6)8rMBW=KP)#~m__Wf}db9XQ1EN2G`j{=c0>Fy5d0AhlaQBIUO z9vU7im<|Ld+%)+08|w-SCvOFQB{dZW)d?Ksj8Xj z>3Dp9f8T62&o3|YJg>|kayT3ShzJpZSyVUo_n)7iS65dG;K$wF?}vvXiinAbss>dC zB0@y8H8cDB@o{}~}-904v~zg%*?FJaU7o?A2U;#+1<^| z%&JOMsVXx80AL^^JfbpNYbv4{VP;Szq9U5ck%(67HC46NJYs0g-HB-W{vO9s8JOK0 zGgY~}hzw>RI!+T+F_4)NF_<0aIWkpLi70wsOn3LzTCa)-RaKGRI|E=|%z%l&+=gK} zMnvJB5mhx!lSdE{5mnX2#f7a_0C0JE31%iTGXWT=OlF42@pyFig=uDHrp~>ePN!v7 zRb~c|%#umWsS1(SngCFxDrD97;jpX|k*aEIOQ0fR!(e8ESyp|0eMObJdq%|a12E6? zBK5yWD>G)!s#r`D(a+s3B3f$z78LFtnbS16`#jIRcQ9|aTL4hix7XM0ZUM;NT{>z?V^>DifOWvy5wE(D8f zo&X^s4iL*yq)2ce$DDG_W8@jQfH)!Llz@TZk=`}M7>zMa)AarDh8gQM0Ce52#+;s>E|<56StK))77=UhFbr+m zzUX@}-8wuVz{jYWU;X_y-?;JAjnnB=L}HBU-u_(?F~+=f?&iVcdVimZbWuo*La=x5 zsN1(ceg5)eQCwVXX0sXBb?uxZA^?gN01@%ddGCXB05LNFfOZ~s&dulZ*D)>+o-nH{ z;$sZnXJoCkNYYwOAKZV@U+$7z6h+&%0LsEJQCSuc0l>^eBq2&n5(0pX975m_!e+DG z@gyn6$jqwHM3j-iq_iTX09;>qk0A1I{82RhB zZ_NBm>D52)G;@dnK$1j?MUqyUh&LZTJ}*n}9ROC$*W)ND0Z1u9atZ-SvSdk;iHfoW z5iwt1j{vkWW*l7z;g28g{Q3R}InN(G%m6cs$iMH8K=fPJjm}wHH%+4_llt;7J`g;p P00000NkvXXu0mjfnIS@q literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RitualStone.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RitualStone.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd9343bc10d2647997185714921fe7355fe598e GIT binary patch literal 630 zcmV-+0*U>JP)`6pHR4C6al1XkOF%Sf6YqHt2YzeX-X3YQp;IY&j zYny}Snn)x9h{QkN-|OS?{_#;u@ra1nwhf7h$ld2!RTYU4vG;zv-S~dJB9W_}s(*ie zBH|q5*mqNfOjXSYA`%f6VMHk+z1H97lg2PrLd=L(D-xL*i_}_|-fJn5sj5QE=NQ|* zU$56vt1y>RYOVXepU1&O?jG*Xb=5KY+nX@a7^C;zde4Zdl#H+lW@ct0GBZ_;2vv16 zInT5A&ZQtg0Ibg^0K8o;nOSR9)p?%B7yzKE$8iWx(=kRR$_O1prl~CpBR;ncGKtyU z&8)Td_c%m^T5ABH=c!|u*}AUbew?S75z!=a9!F#{k(<3j3io-QUt<7Zs$upLGE@N( z03sqXGm~B=LPUV2cM&0?h#*83`ThMJV=!}OP9n8dS+{MPrp$ErsT4vaW8e7{lF5DUmse zxO?v%5hK&w%}fAssOGv}-rrxW>$=XZnfn+6iD=*d+f)^1X{|8;A~Lh8CV-i_dl8{p z_kCB@%zQkbECPsfzu)yZh^V#pcswQ%B7#h2e!E<5*XxVNBR;>r?w_Ck03JwbSeu$$ Q_5c6?07*qoM6N<$f_RV+PXGV_ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSacrifice.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..20faa107af08bdeb448bc05776bc349a93977e75 GIT binary patch literal 741 zcmVUt2*KQh*ZD~A{O~OTD zflzo4BqW|Tc?Kj9B4J6K2pr>)?Y>o4pXw?Wv;7y}&wly&r?zc(yWQz@0s!ZnQYxh+ zga7~l&|2r5wbt`I6Om9#Jy)$Y=iC@WM4Qbf=X^LE0ARgd=bXE~ch)k-#IuxAQc8L6 z`+nGNxAM(f607ZZ-!kuy$K(C|o+0L35E}WmQ%Gy?U9p+a)dcOX|A5SZfLtfEXit@#1ng_+ijm5fKv6?bdql z0e})&Yn58blz0fG6wY~7dCvK=EMc5D=fXKRj-l)NQcBx)mG_J>bT%wGP187zIhV>i z0A{UCDdG9)2@&OLC8fOE+?~&7Aq31MtqCDCO~W~lF?#RjIRXH3#4t^HSqebcc3SIk z45gH1S%|0<*lh0Vx@L$WOaOpNsgg4hec3cIP9aRXWax+V_>fXEM#mWIx&{E}toI&` zu|$ar5o07uagJa7{s*LVjj^t4&UxSW&N*br80MV$H(!5ct$BQWNGSmnnHKZ;GyV9Q z)CvHE5R9?QmR-!hLLDS#28}{eB9sPmUO*drIcFh5W+M~<2WMX@p$|n XWDHc~-BJXQ00000NkvXXu0mjfrH4wD literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSelfSacrifice.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSelfSacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..748a287df2cde601c2e28469cf21a0425e7ec558 GIT binary patch literal 830 zcmV-E1Ht@>P)vI{@14&%`!017C-IuZ&Dzo~ z>%?da(u6bt0$zAPNRuYI88#E#*X73cb78{d;L6o(90J; zL{a24~Ihl za9vkxy^Led7($4An3Pg(rKncdCvR1!U85+N%xP=WS!?TA@3i7n`a@?B*ccRO({r078vMqkql)O&midAc)Xj8HSjnEZ0GXW14;s8li+p%~nBe*E?$@y#JwLq36%|Su-7Wv)kK(fnKTMj8Ge$<2n_V*aGeZMmZ-0KMsWA1yQ2J6jv695Pyv-^!;A}}eNCdu=h zluBkCucp%}V@zue0I$!RLWn4uJC0KnMV4i03IMm9^Vw|nKQWC>+3%f4k^lez07*qo IM6N<$f`gZRH~;_u literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/SoulForge.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/SoulForge.png new file mode 100644 index 0000000000000000000000000000000000000000..11dc21a42ad191f178ccfcb8f3952a542f6bfb82 GIT binary patch literal 632 zcmV-;0*C#HP)hQ|6ohBaIq%&y zAwZLVKt!9027=kdNC+vC?e*I#zc3p|iBds87(taL9X|q5L|T^h+k5XBiVf1VGozW0 zPw(CPd$)75FdN;s^L)3I+WWp%H~Vz4*v_+?Nh%SN{PS_#*9xije&{`=qgrN4ByU@j z1VBJa=H%f1?KHW2i3oR+DFJxAUJGzC+#jx1l2VGfwM8i-nVECuqiGt*Svny*@YTgd zmjI09^78V>%_c~G^W@2~aWMP&*|QQKQkLiE@7}!GZMV0zk}MH}djP0_0g`Iw*?J8i z0RUBcaCQb@AVL1J*|=Fa`P=pNE( zgQO$^U6OQ=?w_81L3YW2FVD}Nl++|6X%@G&woCyu%ie$8Y{Kl&+Ti}(G~K*-;bfJD zVUYB3DfY=?5oQ1YI7y&ol3Y&HAFp3aYMH(F-F{y)_qEz0!hk}alrp*x?#pQkvy=|C z0>~paKvHJfKZk>Wf2G@bJ~F;}{`~an>i6sG*1P`S2B1s(TCGGFNg&M3ETwTAgIr!+ znR}PqtVEQEAU``fiKDejhg!d1ulG_Rf7)yo!|?Fp!bt#cU%l#5nuR-mxO1mvj_xh9 zxbJHfX7=!!ZKA3Ii`S`D--QjSY>tyXcr6Y>Dwf_Lwwp>X$ SP;ejs0000WFU8GbZ8()Nlj2>E@cM*00G%aL_t(I%SF>sZ(~&q z1mMrUxlP)nT?8x(LgN3w@|%zlg59W_ZPKP`Y#z=n`0;3tJ)RlI?aJ@XLxjJ({bbZJ zIAeu3?-gE~w z!CrXl_Ote;1;N@JI`(0IiTbCvIEuzMHr(mYq$cIiQg)YcL9-9A>iSw3v4tfzF- zbcWB(U9vBB%^hkq2$$dxe3h9-OP*uj4 zoH5_;(wWJ7&pA($1Xeb$efcmRkIS-bG#ZrBG|l+nf9DGJ^F08-Aq1sVmSxS(<7>C~ zDuAMJ3p@MeQX69e0LA+rX>BD+MNvcu!NwQ>sBb^S7{kRIecGk1E$6)MA7xp}7-MU9 z+`Ara-PT&iag68h{${P!{UiMGG)+^n-pO-q-X71ciuF!*+D+4}c-Ko`{|x}xdw*l^ z>2Nr-w%|8+ymy0t4!kP>p`RW+nZEjKq0yM8DXeVF-Fg53WPAB~a-$^{m*tPEp{mfu zYlM)HBH6eX&R*tut~Pd|ejO0#em9CD>YTeeIbFPgYl! zIp>%VDMYMd_rqHG;U(vswzj&Qtc{WDI~72=)DCB_@?3`y z$}(J?yr?Q@cJ{dt2xF}c0AS8}vbp>1-#_bH4@W02v^I=I&N)h{_g+fjy{Di40|2Gs zBuTK8@zwEReS6Qn@2QPlTUbH}02pIxwHhJBTC0@82qT0;2&BD!b7ALEBfBh@+PdGJ z(TuU|^BDk8O3SOu(P$*4j3R2SrHn;ikN>cVil@^M0sxd{IUEirlS!>stE$QvW38Qa b27|$OP>xd4_+pbY00000NkvXXu0mjfd5dO& literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Side.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Side.png new file mode 100644 index 0000000000000000000000000000000000000000..45a0707b4930b35a21b5b1ed52a33e05547e1abd GIT binary patch literal 719 zcmV;=0x+fdF2SOxq?AT0oDtoc3 zXtjCsfl7*c&%u4f$nZwYC_Td)FmTG2_2Pq=FfxP)BSV;>A>uv58|k`})sNLd)Uk6j z+ct@Fs90mHs7_@gLpY_efUI80jo!?J`e;1_R3sW9k|yR96%#>~>Qshurd25L=S1=I z$Zvr(AsB;`gHB1EEjybVqDqX+j~5H$MTn>>ZLig?2!udBIXHKzHhQBvcC+{Am0C8D z`ye7j6Cb4XXiv8!&JfHPIG@j5s*T@Ta_G_I_Uof3uUCIx`QA5?mtI03MpQ{cw9=~? z&UN-~o6gS7mfp`d2~i@HUYwd!bK3dAR0)CEi?f60^7~h7hsSS|$i34G+4;P7_D2j< zQY(W(OaP~-(k?~C<}TL;Ch~_@Ye3&b{_8?522rI|y58;p$l6t0>&g%sV@0bih=^E> zhzJlOWn0pU^*!n9Zpx{J!mU_NWp{I6f2-$C7Phux6f+4?%n%_MmDH9!=r51fpG))W zH`I(YVS2{qPZT|O`_sgFy5pxW@#B{$Lbc15KI(5AD_*{3F+!d4_$k2j3>pC5yzdzL z;d4x!xi+t-F?jZh5RkR2I!eQTtX@Qf#UhO+e*q+w8Mx9F<)Huo002ovPDHLkV1jeR BK%@Ww literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Top.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Top.png new file mode 100644 index 0000000000000000000000000000000000000000..3818b504681bacd9f0598de3cb976b5c3d7e950d GIT binary patch literal 696 zcmV;p0!RIcP)I{#)W?0000TX;fHrLvL+uWo~o;00000Lvm$d zbY)~9cWHEJAV*0}P-HG;2LJ#9E=fc|R4C7FlFv(2Q545N_s*Ma5Oz!#Usc{T$JnMS#{A!l)~v7Jr45#G-7}u#`edy3Sw>Cui+SkN;*76%c5w z2*=uqyY{Q&{zi?t_r#(|rRYA3)*L+q8laDdW(Q)#7O)Ad|u?aiEcl1({9amGDZ?l%OfG znYSdlP>?N2yb_rdBA14B4yWb9vcByAT%Ou~>Cw$^0PT-Zur3sNv zIt&c!BUw2xthK>&%D~_#4H4R!<@~ZPjfM+EF3sHrTR^4Pzv0l{B86anSw{qgjI1lO z_}NU4gtlI<_>rBB#7I(SJSBHlR ej3H`KuJQ}scj@ezE>xKS0000b z;A)FjoD54+-Sa*W?r-nx4+c>`x?qgY;wiycWSOy+F{iS+=K8^ev;Y7D0D;tX{d!|P zxB1C;-+P{4ELEb5uK++Wri{hY$t<2!?J1ID%*{yQ663u6;q>tK@&1iNN-1N!b?5lu z4?hAz|NZ*LjuHvUQ>wk~0L3PcYSl7Yw9h}fMof?{``*ep`m|mR2b0Bc5P8{|7BQ~v zqZiMgqTHN4d#seytjdtEh$8@$OOj_A6=arDiiG7`JGbfw4=JWjF5^``O4u6CCmII; t66aFmfmRCh)K!_2*N9{cfq7K8mN z)?(oow{M@W*IV=X>esI?-h8R5ecvMy5tUM^5K>BSf4g)3#(vwji^W0?SF2D}>*M26 z^4r71s;Xj2IcH`Tk(?4C0ss@4SsX|4B5epKn~fHY(?p1-T8Dr{IcF9LArRA6*Qr@b zN%}WG41l?0VQgkIVLp2O&F;;Y!!Z2+``zV7KbBI!?4O^%G&5$B`PHW}Mj+bS-Zu5l zdjQC)%!~j;lykoD*}kgA7`v{MX`0%$W$zI{0Zum?RW&m+!?W(HiZKE}N@*NNVduse z1JTi|duED=M8t@jzBkpQKfXmoGyCwy{_!}92!4L+)-Vi&Xl6O*qPnxQ1Bj=ajd#vD zH;p4QZ_Q?_gM)T9BO=mLs;VO9QVIa%lr-nFAu%OD1OR<6DrXQOuK)ZF0MzV=X>t7- zA@+aY@6`yAnA%TYIFS&7oc6tQ&dk~?kDd2%nua&`iCIJtvAO)nIX9or9XkW?-je~u zlvK5pf{4z0B4lP_M#Q?Vo2IFoCaWS*DnkO(qNCW^*gowb5nP*+M*xp9O6PBiFcF&z# b?(V(=pQ%^n7QE~g00000NkvXXu0mjfJwizy literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..29c332d44a7c388db65717d41d73ca1467bde589 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-{=GkYWDJJ9mIWvY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zJ5YSBr;B5V#`&p}PVyc$;9+TZ>N8to)yuH+j@PRq)q6G?l2$zG&%7t3O<&^i+efBL z*r4Z(@W;y3$O#ivOz-@Ok}*Cn@IL+dnVW72&!iL>J{CF_ReP3vllv$(NnzpM!o>Y@ zOdIm&Bx_ygAXBTez;(T#M%;ZLfH>R&+0uygk{JUEcU%U3o zudjL^W`@Un=3P)^+BWg$-0HK;w_@y0oc>;4!}!xFt$SI@tm7abdAj{XE z)7O>#9-{=Gl*VE0e#rMLhV|<~O9AJXEvx$7(-@ zq_(vl{n}oQES{GdHm4U##46rB*S9#Co#~|v1Ea&Pc!kPpPm3+zy^3#eNQ*S2c(-qJ zy;pagli}O3Z5n<#oP~?56>kd6dcJtFMZ4kBi(68%kEeeP7Cn)yHb1yNShP%VmB~NiGP>fSd{p}U`M}XF3&sP>MwpDmh9eP@oaUOY0|oPf6IS7 hHLv;Eu&ZYOb?GMyYIIgvaNGuY*wfX|Wt~$(69DT1ffWD% literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png new file mode 100644 index 0000000000000000000000000000000000000000..524902475233dc3ce8b8ef7caef9a8814dfa1390 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-{=Gu+jVOJ?cOq+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VouR)5S4F{XE z)7O>#9-{=Gw4QNrRsv8+HZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a50aba4#PI6rk#q|hM)9_RVStm`Ju+iY++Xx*WmRg=2;y4Jy&77VV#G^B&$0`(ZXjY9jdseI!86f-N0K$f#Gp#|CCeSPEl#P#rj6`oYYb> zG-DQ4CO<1>3gE6TIm~EW+_L?7UQGQNuG?X=vU5(H^>na_S}xolHoLIJh+#fYXpqKt z#v5504`Zf&c=$8hWS0EYM=r_s9BY=Snj8ydZC^Jh+~m;{yRBcBaLZ5m@OR%ltyz_i T@}oOvg8b;|>gTe~DWM4fcj literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceFlowing.png b/1.7.2/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceFlowing.png new file mode 100644 index 0000000000000000000000000000000000000000..05cfdd4e85dfb8e2f646d98e518acf8529bb1e5f GIT binary patch literal 576 zcmV-G0>AxWFU8GbZ8()Nlj2>E@cM*00E>)L_t(I%T1GAPQx$| zguk^nX(&R7n{aDR!Zo-7LJ_1*op_grwVOUzk*%Ha{5W#^`1s`S5BvJU*A-EPaRdN& zs1=3*d3!^ipFsow83xk(JIXv`-{1J}ZvfnJ_ZX}-&Ps{%Z3D9)m?qNYg8H)HKR@{8 zf{Y^$G2|X9YK2xLU1-1=xhLqyQoMR9|O)1A7Ko#a0WnJNV#Y+kQ z?m=P}fN=~3`yNEw7H3aS__CnXdYA0(NJ=qm1|o<%ZWjAaQY-8`e!ZgoCJ_l{k;7-s z2e6dL0T8nY^mZe8DPV@TWXT!HIeg|Es}W!p7Me25P)fngkRBG`Jt%j$-41YXr>|O3 ze*j9(_`V||@fNo2sIO<0Qp}4$N+juzru)tL$N+FNyuX7MED%Je6ADCqIm0jnuoLzc zy5tUQV3{V;{jj}2Q9YVy3V0-FmSvinf_+CGeW}J8hL{Ds`9&le5VkKtNr!0#A O0000-p~Wgp&QK2!369ZK7kp) zfb*V3igJvpa~e@o<#_J23P=q3mhxoO=0ZtQh`Yp8h}ExygU_V z6`*wlgXb{HGUU|fTwH9Vg0zThZ1L+_M& x#cbOu4^|r23)PF2YyK1G^&QX^rop+x>j!M+!f6LpXzc(1002ovPDHLkV1ht*(4+tW literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/entities/energyBlastProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/entities/energyBlastProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..91b4a55d75669dd58cbe8ff5678197e7428011cc GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPaw=j#ovDrjFW1tXEW=KSdbAE1aYF-JD%fPT_-KLp9 zYO$w_V~EA+HB z`zSLrGshUS8=J?R-Fn_VkS9^e)tFtFzgcX(Y1j7|9=s-eYH}iW!kXI-Gi=hHq0xKH zG3mhP`Q;Mz|9>C-@bbJg8xXYh*T)$e0KuOhzeU%5IKE#$V)3LDaRq6YsVzr5a)S1K jf6K&taEXs!+9IHTTne4O?ywK%207c))z4*}Q$iB}M?_|* literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/entities/explosionProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/entities/explosionProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..24b7a2f44377c09820e1cd1e859d83440e03ef7b GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E{CwFI19&W^RGZ5+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vq_Q)5S5w;`H9hXZ@TE1zPuKGU&fLCGh=NYvR#K$0w>!NWZ9l;dtW7S*?bF%+^oh zn*VyfUZl7+M&WwG9AEX9FK5m)UM}SHU`Bw9e zcWS3Njwy2s*5{t^!;5^-HL@1g#~OukLgYARhUpMIO!y|MOCTxn#%19Ft7tDnm{r-UW| DkEd8I literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/entities/holyProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/entities/holyProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..35a03e3d4311320da52fe5b265b932f86aa79f27 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E{CwF9FqZ;W+zZcHZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a30Px;TbdoIX1FG;fOm59|Extg}3<7xsVIw#A`KVN1h;wwtG$jvSAohe_#?#4b6bjjYGVOVo-5Ku0|L9drl4--=ztZ-5&Oi9sw^H&n$fcgH KelF{r5}E)x{$L0I literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..9eab38e012662f0b91111f28c67e17062cd1276c GIT binary patch literal 327 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/8wWtY8d.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/8wWtY8d.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9d01e2f189c9aff5ce00e1101c5e3c45cc2927 GIT binary patch literal 319 zcmV-F0l@x=P)!pi(DB7Engip-3R%Lw^2$PE@sN z{w3FGzlGy&J@sL;f^X}a5W+{)wk>!dD1b+c{-ihiQ+O1T*m}tGF@m(#`lE*YY3-W6 z_ZHBUw+Dc?`xa`RkQX3^aQPDeyvqx*1OS%%2~qf8Js}Fe2!ItL2CzU#0BVR-cng3O zei&|06CU*{|Gw|Dn>2@{0J^RNjeky`^)H1l0Z7L8ahS|C08;o^Uk#9hh$qJTdO1%4 zau6IKr%yuE0!XHDmjE<+_bu>Wi&W8+u=&(V)93yvy~ckQG;Yhc+!DIR{{>B68}ULj R$-)2t002ovPDHLkV1n?;hFbst literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/Aether.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/Aether.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf829d9d836e98c7c2fe7c0891b73dc0252651d GIT binary patch literal 3540 zcmV;_4J-1AP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00092Nkl%Wqp%5Qo2WeC~Cw?bvCYxOQSE#3hds)RgjSD}kz1Rn!eESg~M* zgpkKhaZXE+?RcQSOh|&{-lv+ zG4q>GqZx7SgO>o%N`oN?2ngDN>Uf>D_BHtnV_2gmj&sOCvrWBJ=gvn3!M{@fB{C$j z9S0qtb7!*TujFaOs#tOWt-3g!63=8tNgq^s^Tx&C+qdtAjtzu_R-=V!_UNnc&LS>& zY?OEK)&goPMQqdu+~M47Gjyjdc}yULpt*NI^7Me7`*4n0YMc2l7qItS1_$HF zzJOY&Nz6<$Jd&kWu2Xqf;^L=M`tDaNLbS0sa1Yn_7@p2x z)_b`B`R^2O{VjwL5oLxA_V2Vip_) z`}^hGNdw@Ao4)~w7pEowsC==hIy*gr zoa{haBGVxrCtOrhFfo(k@W);K6am2H+2?7vEwYD6+>jTx3YORPJ6Pk7X+&W^=dh21 zymxX3$4?=ppwkKP+HG#m-}YmnuqlfQ?>j}ba1`=}W?}vhA%r*{{LcWj@j4FZc0E)8 O0000KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=iRa5)`Q86L|8vf#NGVy*u&~at0kG}>)<|9!LM&CVuItL00tg{wLqkKvFiJQ! z{5$z#bar;4X&NmpEv6wX(Mk@WX&Nq<3x~t8Op!G!LYK?61d*4QX9~g+>en0gb2y#O z6&27l?LXSEY$rzPg?}K%$H$i`5On|{gfvc;!-N~szhfM<<8(TgK>kb~iUOuxAcT-c zbq$R5fo}x7*^rtFS#hY%txL~291gm>yBQc5Fy#bO073|9T)P6ZKInJD{zCXN2}vHX zSYd7mrh<@fM}7O6Q2K%S8t5MdbO;8Z{WI9Tki893a-g*fv|Z5l6{F+?#wHQH8W2KA zqpl8e@*r^s%qKwBKIof<#4Yfw1uBZ*RTmsDf?+qRR|im{QUgK=X&gEX3jxSV<8I|? zl4UGbxj^0f58#pT?hRDgp?eH|cu}*>w_|g&z-IyP0#DCW@wl%SWDumn%ZjsHeDnaS zkHM4X2IgwNKSznH;j5vQ`NAON3@bfx{O8y huyHZj0ElM%9srV>LDu_Z?P&l2002ovPDHLkV1k5K|4{${ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/AirSigil.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/AirSigil.png new file mode 100644 index 0000000000000000000000000000000000000000..17246bb022da7525278ee0988a5acfac40359bd2 GIT binary patch literal 500 zcmV!vPrrzn>GAt(xh zkKn>5@oB_`k0SUAilQXNQYpA|qaa$Of8*jNX>N;xI51?A+;i@kIU}kHKz#mL0G3*( zm3RISk`l=7zLL}!vv9C@cx1jV&h&SJ$;2m6b+yO>q268#fPa-SE>k6~HdyQ4r&IS- zU&JDThyz&*h!4zxm&@gXN1%5%f@)5#z;FmQaNk-x9>K?8Fa$7CT@k6SIFtw&3tKfX z0$~W&z~(kY_cJwfEl83s8ZFQ%1Obf4u)YD$eNbFma}Le>HRdq}F*659YstW=11W*8 zsaA)lt|LL9-*YX5VR~ZVDbTl9^+-CA>vc3rri;71)_`UkR6~y-8=#9I8{XE z)7O>#E+?ay0gq%eYdla$HZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a4bKba4!^IK6bTVbLK20oVInlbs~*JYkvQbQKFzb<6$IB@*nrl|O36Jk=YJH$3$FTT&V zjNiewXyUxLe9xn9N3y-YFE+K&_1F3IN!9y5^GlT#{+g_R5g29+44$rjF6*2UngDg_ BhnfHY literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ApprenticeBloodOrb.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ApprenticeBloodOrb.png new file mode 100644 index 0000000000000000000000000000000000000000..1653f049655ae6b7aeb042fcec23dec3e99fa08d GIT binary patch literal 831 zcmV-F1Hk-=P)WFU8GbZ8()Nlj2>E@cM*00N^)L_t(I%bk-;NK|nY z#()1ib7!2HX1eO=s5#~X46U&2g=9q%M2l)u3yaKEAT6RrL=Z(-5H5mf6(K?Nf&v#s zFQr8g{hedjwbA*JMR5KVOwn*bvX0gcS9 zXTm0woIHCDado}KsdDhdQ3~@sR27vGHIvwPv`E5H~&C}NBOK;)Mx>2cV9yGzMK}B?a8JvoQ-3u7V}HW=~pwv%@p+oB~)rfyh(@=6x!sOI!fz}R1y8KQK)U08+B%ckXwWxMGJ@ec=D9Xd7I`DlnSmg3^^THKm zBt~n8A_45J9g5t%shv%kB)d-@qis(+V~Hs$O3GMcI(g}mn9(TS@i1TAZr;6q!?nZf zi5m;pxmS@2fDkYm>ZhSXN5nFm`#yxt>*jkZL2$00jN3(QUVzFNtf-%2=;M6=EbCVb z?>{|4^Odu8g`LT_U4$R^voH`OxO_Pihw^EQR@1)KskHcHddfpR&aCDYxxYo8{M}R`InIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^0|TSAr;B5V#p%71cY84hinv}sncc?I*MIDslTj~+GKXj4 z;@na<&xYn%L z&+0NwW0T8%CKIXNGcpB7*p|DLE&Nlh=6Q4F_17MY+`QRKN>1!e$`dJGDW&`LwMybo zU7&_1Gn7Ju*bcBrDD{ND+aWt==JU!Bt*P&UQW5ZcpM#0Y(Xfsf?~XjEwUbORmPuYhM4C?ak`dYKr^TK8zMU z&t&s@)y$dVnI%f~=uV2Q$W%3H9pXqm(fWp_))z4*} HQ$iB}|FN}S literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ArchmageBloodOrb.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ArchmageBloodOrb.png new file mode 100644 index 0000000000000000000000000000000000000000..327d2b272bc2d6a9f59a9ef272ef6d296bddc02d GIT binary patch literal 590 zcmV-U0-W03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00FW|L_t(I%YD;5YZOr! z1>on-%$mgz7xY&swg#~h;x7>VAZQt3e}RRjN@HguSXc>GK?Dn{Ac$b2V5bq((o#`l zWU@OmuSKqFCK_M3#hiQ3Iq%n`i14o%r={M-oo*wQsrc(%+AlCpOHoNKSkwunQmygG zD{wcSrUM1WX(=vQG*H>mXf@h>j*q?WiBx+pE4%oXdWMxs&}s!jKjUJr`$eZU`Fm)v zo1$2ox+?>t+nD~ z9wpP?O{}n!!38Wx`C%AHCfR9%p`?<06&CW&q=>MZMzL&uroK1YjCJ{J2}8*f+t%V+ znyvDUG>XgSXEUGeI?8-LWFU8GbZ8()Nlj2>E@cM*00D$aL_t(I%Z-zfUf`610wkndizTX*Y3L%kNQ$I^ z$O5y4mm8Y9)7iP$j5NhcGvEF@^RJ;HCf;fN+=^1e|Hi~SjX`73BN2^3=YjPw^UeEF z$}2X=`HK?xZpVy5AoFgqlJb^P!I6l*1Rb!c1A2>gT9SYPQBwY1b)aL4(YKUrPY%K;8&hw5Ps%) z)f|H!tgZ37+hs3G$qITBAYZ-X49sviteWTN zbY~;w?vJh2onqo;Hm$r7l7PPFu@2bK-I}fIkVY%lA+B}8st7N_BMd7T44=7LZt43z iRdSDPvkbEATmJ(-j{ZfduXz6e0000WFU8GbZ8()Nlj2>E@cM*00EFmL_t(I%Z-!IY7uESuR(9t9CE zXpwP&;`w5KbL>6S)ZMHk|0P#&D56h6$8>Z|`(`D1QW=u_0Q8l$`j&1rBo8{0J36cg zNK&Um(3jTgkui8r-dF1bLe+`Mh zk6133W;UDs&679#bY&v>>|a}}&(eP3N{ zu!by6Gf4;)m*_LJGz223)zDBj^xDS>B8bKa3i>ADP-H|6O$~*j-urg%)6mk3g@H>w zaF&O2ew;rXK@#IgVod!}K(W$bvC<%n`7}u6D|;-Jclay7K)P@M@$g zqOTRYN{xsktncH$BD@8Bq103AmwPiTLh}gLi{cy~+4&3L)de7>mcJHd^OL zA{q&g1^|Gz7Axgl#^OnIEb%HOoR??ZoE?ghBPe50s2^}LIggIDcq3s*_`V*>9qK?C zi^4{e6VoYl?^_@(3;`hpZZA)S6o8cSXF#s%F*1`z@9rAyi(?@i2h)TWW9 z^L3FVgP}DR*0$L1tAKAUkzTFQHzweV|Nl%M1%Ixf%n%-S00000NkvXXu0mjfD37A- literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/AveragePowerCatalyst.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/AveragePowerCatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..bef44443936dd63e701188c36d86b277d11c1370 GIT binary patch literal 387 zcmV-}0et?6P)Y6r5eWFU8GbZ8()Nlj2>E@cM*00E9kL_t(I%bk;3Zqz^! zMNjq1o=%2^pa>}u?26^E6~q@i03}~p$jIaN^sD%Y9W=-wh5Br@j!xg(C8`R*^Oth~ z#`m9ZPP}1c1AM%{S8FZadzO??RYU|t0Qm9vDE|a}xVuv;!Z421*3jNjRg5tJzk%y) zK(ieL@3Gc$Sr*0+IK)VAjaDnxIjpsa2(7g%19R;oSm(&4P)k7p>ph2YL{*tnqP0e; zmD?D@6<|{m5o)cZc?RGx49xRPE#=kHh%n7_25^6dl5-};NcSF9eaQnDLZH-&3xQVa z>wUMItO&y}05F|S48wr)9v1?}80NnLwnkD)gkhk!hOw5E67N>v`F!T*)06CmC?a_8 z>Ae%2qvrhb57zXj(}_cjSGK!PK$WyC+#HY8Qn1D_P18$-tL1);>oaPt8g}c s`1S^xk507*qoM6N<$f*oD%^#A|> literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/BlankSpell.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/BlankSpell.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1131998f6bd1a44b3f00b76b2b0da9a76afa9b GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E{7;1mwu}Kx0^sA+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VmX%)5S5w;`GtU8+i{Ih`8K8+PUB)!N_{qK7YUae`*?!<3WchJDEM_UOMBmmu23OrQYw4J5_ymm~`}rg!X+=&ng36?N-AJ z@4nAhJGS2ZfT)ElQ!)GGUE9{HnK^KuVPVTT{MC5DiZ?kuOg8+D+y&g;9kKHzxD%2C z81*_Tn!Vcoo3=jg=6P+WdF07#M@@;P`=rhv+MFoHw~no~<#5FB5_c_gpRFlOd{XE z)7O>#9-|Z=1J6?)jj2E(+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vq_L)5S5w;`G%?hTex01ls1WKOzvc#EFZw@PyKi9W3pC8sGfW{y)pYLtLF*b`eLQ zb5v%s-p_NoF5JEf-g{rZ+wr`$`u&6Z?VX1m7H__pus~z!+3A^$j2(v^+7Gqgt8oIQQbtboYWWPhQ z?$OuWLDM>}FkD%;w6G;jYeMC3)_wPiSDh8>c3maqy3%jo#hFKIX8jYL^d+WFU8GbZ8()Nlj2>E@cM*00DeSL_t(I%cYV{Qrkcf zMql?pk}LRsACQY&3dkJ-l*`;9c2?Yhi{PJBwgdwQ$Tm`cS&Sr#*sy@Eni|!N=F`)g zHc7mv_L_&@u#kDeu)JV-mg0}1{P=LU{H5VcN8U3;Jy#Q z{qKbVc$4Iwi1>?HD!)%wP?OB3D~!N=pC6aM>d;ehr|FOHZ`mo#)$1hdHv z$7hFIzt9FeZq^2(iV|>6&&N+MnQ?MH#yugl+d&pN7Kr(D{i5~bZwHte4|l7^vf9xd z6zY%0>Wz-n8y330LjBPfU0$Ap-t$@GQXG^OtKcl0EI2F`Fzg^WB}82`c87D*#T;vaFPH z>U)p$IuZI!-`ELF)>MCas%530Ovp%E&A!jf z8zG6awRvGC8JyNwDm{|TFB`I_6njdM*^tNmX7CD(wdTmSIkIi`l;Zd1sYGI(w7nMg z+X`K!FwJv(?)LxyXZK$ER!fj=V?JMNJZg<;o&x}uBtpwV_aQn@P^>`8d%K^_fVHrZ zz-f);?Q4LK-406hL;ZF|tLADB;j&O$E*{V0ba5sEUxbbOQ?+xJ^hLFqO wH7{Pj?%?UMBs(z{h$?EVUVM^*JiomO1Ebdq0IXx8*6mxEja7PC!V#kOVT66ML&Z>-jZ#WaCbM_Hj7xdMbYOLbHfse#d)IlMmS2jtk}FJ^FSu>zopr05c6rqyPW_ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..88c6026430e749358cc4d4c006f1a54a68c691c1 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)2OFcb%HtVd3>X*~#XVgdLo7~j4chH>BtT?Nb^f6; zDP}Q7=No2komSNxWRpJV6fxybqr3`>*k7jqO7au55|X#ix@&qn(@3o9`$Eq%T7Jb3 z3!crHX(|3gKcwfR(3ST!hKa%RGqg6bD0|ngzHb}Pz|glQ`l8i>q%*ZYGbhnk&*i>5L#D0x4O$caiOL4s&sl6}C+s8@hGu3YkB0{~HmXhNSogda` zSxr8uNF*LEV2t6#O~_SNIMT5p;7zAPz7ipoZYs;N##?x7ElDA3IMOlf-Q6L9Z97IG zYjC|489M{7eJLf!C#UrY89*!8vTcfvPxJF!Mg*E)7eC;jTqY=&hXew^0u11FuKymR zkv`dk#h9EvWomA2gxCdKV`w8p2ZSkmZ+r^1_hl(LEpl1|&=#m0gI4|f+n~$AU7U^e zXB84-z>7OCg{)!Iw)qr6D@7Ez3%VRv6sh!6#1Bbzs_U;VsP8w*lxEJ)+yOu}&L-+$vbqd>vkYfwh$00000NkvXXu0mjfM!&j! literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..49702f68c49b07d97ed92df9d7eb16144f8e2565 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)2MYtQs`8o3XMsY?JzX3_EKV;C-pzMdL143TTaVA* zh8ovxb=CDPipk4+w(mS0D99z4siSyg?pa$44bF0dt8E@ylcct`Phw!uZg}!MHtE}1 z*7FQAemnV|*x+}{@_^4Nl{T@=kD+N-nN<}hRqc53vM=0yLe2d>J)8_>o$s4WwCqeS zavh34pAjl%JLO{ivjcuDnI#i0v3^|0zPRZ!kI$pBh5z2mT$v$l+~2mN`rz986{7MJ X=K62DVqth0=wt>@S3j3^P6ce%5)=3oyno&vS-hI1|qq*b5L5=6TLIj>!r?HunNVgjtp~;`V)s zcqyRWEFyHth?-Agnx>577}i>h$7AJ^Pz?Y{k`MrlF@F+wfGCO}BCyt?EK6tcLJmY^ k(KN?auD|iO^6=042K$C-z5YVHg8%>k07*qoM6N<$g0H)x&Hw-a literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundSword_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/BoundSword_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae9464f22511e007eebf689d25f68fd69e521ef GIT binary patch literal 386 zcmV-|0e$|7P)ejqZo7NaPS zwAOT(4#Ki?uR2w>cPt{z^PD2WSse3vGT|(ac^HO#d%fkRyBM57JM-Pk4fggg)yBYe z#dZ}UGMKsc&chf(Yb|S$EXyb&+X)zBSQG`5Bw<~Nh>VIff!5jvUT+^HvQ+T2UrNSxyKRQ|cK`qY07*qoM6N<$f_i?VvH$=8 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..37ddd60495a6a1325a5d28dae219832251f9eccb GIT binary patch literal 632 zcmV-;0*C#HP)WFU8GbZ8()Nlj2>E@cM*00G=dL_t(I%bk<4Yg17a z#((GDBu!pk`*L5B8pRHRlc@iJAdcdyvxsgkE{;+VCrAAcTomc#?pAaX9IBl}6a-6b z+SJ4*efJ)R=SzH;r5?C&xrgt&-}%ltqN)IVcsi;9^>cTdLyi$r5VX@&MFb;)_Z|fV zKm>pvySuW8pi*2y2syyo9HcrY0aE8wWX@3#n&QD2gNP8k#~Q=_jYs&Xg@%BLP=E`? zGhDeKL8Am80<|yi8D70dwsszt+xXZqtu)XO2q6$hQLW?wK)Tw~z3UG#qX8(WfQSJx z1Tj#LS=m^}Oh)Vu2J){0fax!ycdrnE`0WdtZ=Qp#u)O&Ureh3&zr8?JXD4+|lU7UZ z&Bxm9bhO*)s7n%cC)d>6d7|#@1?}`sY3iI7m~sh!5+OYe(F$Y}Q1GhQM$FQ;k7QXk zlV56M?qTls@XBq(*!%}TjYWdTzI;HXT3tLy#V`Q`?=jY5jbU)@KJ~5F1Xb+UE$aS| zoqm6@0)V6L8G`qS2$gCTtuwWOHEV^8n;1&dA9`icd&;CY;S*()e~;92XPcxfS=>BKlV2MZ~O+YvfJNH SZ{R-w0000|YZJb^_T`DBQ`L!=n;xK*lnH#x*%wRl>aicR_?$-fup zbST`J=#smxXM62#X3m)t?`BSap3`TiWE|wh@WoR2-41K^$)39xJ6=t+wN~ZOs-N7k z;11*4ua*p}Z%5mvIaFHg+v%Vdrz5`QG%Lg7#Py5qiWV9bl>d5cslUHobBnpOj_S3| z!pF?T4R(aM-eH_k7VE+?$zZcm1k1Z~D{{FL?&rUJe6&nxL_(%*L? z4Lo0*mCTQSe%o>N*xq_YuAoT%OX{6AE`L9LnjN?Q<+s}v1~XL};>*i_-rWDO{IGeaUuobz*YQ}arITm}Z`qSVBa z)D(sC%#sWRcTeAd6une-p!iZx7sn8b)5(AS|F>sWZRl)ta@feIb41I=$dUbB`0OU_ z9+jOBPO!}VAAj#oTE)jdk}u;LGM@otq<#H>V+b{ z1>LUv+FSM5fbe0dg%>3JU@m3PtWn1Tq{B(OUDmUh`b9BXTYr=f3u6G~#WyBS{jTYBfZJ-F6E= zzu)J69Cd9TkH@&KOB}}}Nm3YXv)Q1OV!2#inp_%qo=2YN9FIrRG`*w(yEOQS&;hQx79mSsdyM4F~(tsgJ3-ENE4nr5@f;c&oOi!lZf z!F63$s}WtBvu=HdA`jL~Dd0d<-yl@i@1>rND(28W7qq0w<4VSf!bJ#k1}t#-th$ lnmcK(={8#3TI>3qe*l0R|B@je-u(ao002ovPDHLkV1l6ao8SNd literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DaggerOfSacrifice.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DaggerOfSacrifice.png new file mode 100644 index 0000000000000000000000000000000000000000..2d7f4a1ca39fd4f642783c25d1fea4f99844b600 GIT binary patch literal 476 zcmV<20VDp2P)axxldL z;0;EG|Ns9JjeYIZ|6e%1`~SJ4JO77!8vpHYurZe8{N;>o@Lb)=d8!{i8R4)-+vfBx7mxMp8F_5aB77#g;>BNUWo zg#JH!WXJ!#TUY%*b9g(3W{fa6Fx4I&rx{Uh|3f3=89sdc#K6bL!!UbVA0*V#028hN z%g8HZ`26J?gOHFQ!`_`+7-lTn#fVKUBXUBzvA5&@gVPHbxHa+_ezS=%2nh->WF?0& z9J}_O5m)S>xIn|Xg7F6v2gBDJ6B#%ezcRGc730;6;eu_QTL0gN>|hXH?S`Syqv8f5 zUKi}>(D={v{~v?!YBvUtiW`hPA}Vl2Zl#wP3A$iMhsJ+=HWB3oasU$pg#Z8-F%?W$ S5LGMy0000!*I literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonBloodShard.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonBloodShard.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa05b5cfd567c99955fa76699e60422740a426a GIT binary patch literal 457 zcmV;)0XF`LP)*N6Y(WflAV|?`VQ{8aAhqnd=0@;^K-foV5LOr@46Qg zC-;OOmA%%*gY`$*hWrAVvzV@{ARtgN+I79{CLW9vF2a6^=Q##O8F-!xkd$5w09a1? z(hX;92uAIUn+kvj$eg!54a%_f!lE_8w^HGxHFPhK~e zGAFRC^<~#GwI>N3ygRP@1|GteITL-(YJA}_p00000NkvXXu0mjfi0`o! literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonPlacer.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonPlacer.png new file mode 100644 index 0000000000000000000000000000000000000000..371ffac6a7fd217ebbad2326102cc29d4ee539f5 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E;p~ZuI}uh|DS+DvY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zI|BnFtEY=&h{frnlh1lFI|{Vyzvt;E_+Noz-q(a07S`Go0xXICTwITKzjVB~+U1MH zb%n=i!E!=n$$!$!S{d8w0Ng+ z;$<$2Wg`2!sIIy5I^x8C`={k7{$9Dl)@GKh zT!)II{`#vn$7b0#PkQ_`?115u{gOwMRG+afxjkd%tNztyHP1IbNXuU+610nZt(r)( qM8%H3vsQaVm-wvqy7}*~)PII@xus^xO2#WeA?4}n=d#Wzp$Pzf37QiC literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonSlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonSlate.png new file mode 100644 index 0000000000000000000000000000000000000000..ca195b9e863009938193e573c1a1fac1e5c8e23f GIT binary patch literal 571 zcmV-B0>u4^P)WFU8GbZ8()Nlj2>E@cM*00Ey#L_t(I%bk-?YZO5g z#DDdAW_D+d2SveLvam-9LV|uPKaL;9gD20zN(f#;@Dd1m5SC=;U#9!zurrBEvO=s| zH{I1$^{VCW0Q~s02H@?-XFLTO3Em$ac?f|#&uQu!cSjOP0DN06^-qF#hld^{CetZ> zjPzYc>^h3FL}vGd14cp{H;Ozbgh1OgOpAg%1Xh=qbajo)FbPS-7`GH;+j>OEGS*jD z{JFT``TjmKLw!$E*EC(nq%2A9?9FCeSJl0RF$YQfIy*xW4w!_ylTtzwFXwY)#`5H3 z+ro&ZsxXPyiv_`qSMxbYyjd)eM3!ZQ5bn;~qqA|R$aBn$u5B?13js+KMX@`B(M|-q zn;T+Em>DrfWSh6Ds^a_UsUB4zX_Gb(BvMK^ATv^o^nK5?EVmRquwYq+yVJJqM)G8W zNvx}CQ>wp0-zw5Lh2Q7r_>j0sm>GSHcWZ#3tCb#P;O@wb7Y7IUa3L=W+?^OBJ_Nh7 zNFR=m-GM9w(vUhs`zA#}+qNX&^OvvMX<=_R1K_%lYyg!5Oy^;U`002ov JPDHLkV1mRj>tO%@ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonicTeleposerFocus.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DemonicTeleposerFocus.png new file mode 100644 index 0000000000000000000000000000000000000000..72f3c0365432d55596450dc6e0cd70378232e333 GIT binary patch literal 603 zcmV-h0;K(kP)R5;6}lig}lQ4oc{Is3E~6LU(7B8iv=6h(~M zNH6;uf~{z+f_Vr*dskpbY(F>C&zqh5|*wzQV(z1o^$}shNIVqcVGNSGC-WyHt?`=!|}4^ z(SQt8O-!-Da@{fTqfLwfDn(Oi3ML%9_~7|^lxXLR0??6POH7aEgMVnsRXWn#&&E-uurK0A7FctlV@&QRu!iSgJb?dSd;f=kdJzcM7${)LaN7`r~2q zbC}gJ_-)(M>%-t^p_>aX+uA6{XE z)7O>#E|0u0t71dLx79!)+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vouf)5S5w;`GvBZN9?>BA>g<8YgYqD4S5TV#(3ex3O-^WtVDm>2XQjxAdxN-kDH! z^Vj4_S1$!GIZ=16SV*zc*5U})E2lllmjiuzHt4mas#VCWue*O_$Ml&8tQOhceI&JF zbLkh~S$&_rb1riFQ+oY@8q1{Fp-&U4#ltLj9KER;XA)4fV#X75m${+g3_IqWee!UP zqeoSsJ;$Xdhu^aw{QNbp&8+!i%39@1EgSj{Ce?F)p6Q%+{gd*VdxZ=s@5|*F^Y|F^ T&iqi=0`j7#tDnm{r-UW|qd|Xz literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/DivinationSigil.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/DivinationSigil.png new file mode 100644 index 0000000000000000000000000000000000000000..53dd25c7e572d119fd067f313714b5f69a22336a GIT binary patch literal 625 zcmV-%0*?KOP)WFU8GbZ8()Nlj2>E@cM*00GrWL_t(I%bk-wYg9oL zhMzNEcXP84J4J|{L{|A(MOV$#HDqy8K#5kVsaQ;8r}wn9J%q_7jT&>$FvW$)g- zA2Y{db2Uq1Aim`c=biWCjHoIAA0HI~=v{d@JKzkEj^NtjqFQV5-ZL&sR22~c5dc2y z?#ihIR~Hu4ijehsv@xP7v2lB!r&|{R{t_OdBQ)JX@E&U|)p$%V1ZMIa)x`SpSFCeb zYY`D*j8h8Sv>w4aN8L0SV|cuI9v=ez*&anvFe*!|F(g&`c^-zNQT@k4mqYhTY+DfF z!JS{k6iG3Gz>^mj0NCBzlj912x~{pu{u5P2QB)@`H@D|$+Ln-o3HgZ@4)JVz9_J=k z!@+#1I@sAM%aW?DS-J5EV=Zg9z97aR#!wW+RHbG*L&1AbN{Nk? zZ=@6_dmylS^E1Q2fSEi$rG-P>Tl-EM4O_1+<7~t8?MsZSio2`(ynNk1d6BvnRF!dA zVx8mM+#Jq1ejFU&oFmIJM1=P{J912csv^eFR24o1j0jcJFs^I7_mfssX^#XrmBIC; zB~2;etVIAZhS;{G7;)Z{RB4)qH*ep`KP~k0+yV?oqj=`u_`moKhXLR<={C#Z00000 LNkvXXu0mjfv5fP)8-A5QWbeV{Neo zD@Dn@q6Nv15gsB^PMPAjK)F|*E9=Pwj03J0qk>L)>!RImr-raDB@O_t>mm$8R4SFdhjV8#Y!Y%Z4r zT5FoA+4fD@>7RBC3t~j^oJXTJa)2tpfx<1I*`h$Yxus8$I>IZ-7ZLCKAl2VaeI&xMuLN%;2Q`Vgafu(tt1CTgq==@84Jvw5c-WD zY(!dXn!j-eTmpd~B==sPpFt2`EQj^Fsgt002ovPDHLkV1mH!3rGL} literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/EarthScribeTool.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/EarthScribeTool.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f197a4972ead6917d15e5a1748316de95368fa GIT binary patch literal 1078 zcmV-61j+k}P)KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=i^=@Ar=%uH&1$TK}1lzbP+vx@ghic38JfqwLqu{3D#cARYfgWHOmu3IqE&9u;%7O^;!g}5Gz=KsB67SQ%UbaFB`cHj4>q6CFp6z%-8h3Gw~531;qte{@7b1!uQ wUw}`bYKsqE(nwb7Fj^A8(T~XyK#*&D04OsMQh)O&`~Uy|07*qoM6N<$f(gsry8r+H literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkAir.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkAir.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d3e1ffe103d915dada6610eba50e2d38d12f52 GIT binary patch literal 439 zcmV;o0Z9IdP)kWqna zrvfPm>r1*DVOEETNQ5E;KSQ^$>_x*|()~{dPm!{QK?8G{ndjk|;Ta_&OcMrEMr2&0 zdUhmTJye%86i%V2ex<-E6jdNXC(vWTf3gB1GBPhKuGF7e(s+K6>r+q0&5cyxmP=x< z=9sZ8-h3aG*~BZCWTF+kvMZ^~2F<%Feh?5dO%`mMbT-HFi7TN5mV(#D4J-K_+P7CM z+BTM9kc!17KjQNG77w)xX4mrEw>tndyItP34kyq+DjEeKVOgY;2>|BeaXz(#6U>_i ztzHj1>wK&CwPwkRgcCT0qUzLZm`d@{?_(JTy}^LTyDHne2R{s@#y!({#S>p^lp138 h_YOz8QT_WjegO^fkWe^7eER?Z002ovPDHLkV1lQ;s{XE z)7O>#F1rMu1*^uSWPhNLY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$ z&cMKE;OXKRVsZNDWNU9`M-jL4XYzz5TXn2R5ah0J>}^sq6B6l3(#n1F#+7;6G^L2B zj)PXSPbIu=`XO8+vQePMQDADvvAc7#1wE3@q&*(Cu6%ayaCw`xm&=Q#CbrXL%N~Zw z{9I)_!H1vGU}|houC%MlmpSvNJy}zsFt_TB-^W+|SMQ0uJI@#B^^h-3#mBLoH(ow} zyGXu&S%G$62`i9@kyt~CI&9tJ|Nn(4H?Uy+Onw?*~CuSAnX}%R^|Ts^B1|iqB}UkY&sQK;(!WnZ412B#r7gXreV7G za?=I6(vPc`TsnNQVdkAxQqi|_e;pM*@+*iTW!m-`bD~3H-yZzp6vz0ecHj1(GtaKy ge%JWx`~4r>XXh>GxVy3W0Vq&CUHx3vIVCg!0E!i?E&u=k literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkFire.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkFire.png new file mode 100644 index 0000000000000000000000000000000000000000..6f69f5ba10567f911aac8b999bb43bedb5ed9e24 GIT binary patch literal 430 zcmV;f0a5;mP)1fyqK%{?2-2zD>=vDh z58x;r`-GB7@&H*a^bf5d?e1W)5iJ_jcsmrj)Ko?2UGKezbI&=UtaiOYX708q;%yEIZs1A*^J{ltN6mfpwkuoHrAM;fIn z>*0`9zfb+N{G-WEfWY^}%@w(OeMS`uD9d6KhBV6OTS0ySq^46I-(GMpYdkDMlx49V zjaUr^==pp%13jHlE0nl@>fu%|Km=`B=zM;^Ag#|F(v=Dl$He0?$}mudfp(nz0K_y= zw#}7YW;2-}QH085P^P)Rje+lpYudCN7^TA7@KZbtxg6ajF3bE^&t(!YJ< Y7kck>_4OTKZU6uP07*qoM6N<$f|^gSC;$Ke literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkWater.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalInkWater.png new file mode 100644 index 0000000000000000000000000000000000000000..35f17a0a4b9adc518d856c9c2e181a81bf4141eb GIT binary patch literal 429 zcmV;e0aE^nP)FUQE+!3p2~8}9 zm61>As$~O5r4H^+T{OnTrP#CvX_cJxbt5tK1jFE)+;Z>Tli&O2VMK&&f@905=n}zb z@B^*W>$5)*bb5W3qzg>qLi_nw0ss&d4#QYe0}+*;@zAF*OehQ!8V`Naz2mz2_YOVG z=L^K~2b@-Sr6<}RTwVHPIj4BIzX1R=o4Zh|!2Z!$sYofoCEJxUyzgxLNHiWrrk#N?{54C XZ5xsAMC4Y-00000NkvXXu0mjf#ICN7 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..04c3aafc2193273d91ef979bea4e4b6082aa1962 GIT binary patch literal 659 zcmV;E0&M+>P)WFU8GbZ8()Nlj2>E@cM*00H+&L_t(I%bnB9OI1-6 z$MNsl>%6>LQfZRCgm6%Qf+HP?8eQlC4uXQF{UOn~S@fVmL0u^i>ZquJ(SOim5JVc4 zU@z?GJ$IkI8l=X>3~Y@y8}^6wW3MG<2EfZ}KNBE3ak=vcJ1E%zE?qosst(nNve_hx z0wD;&8~`_Nzmk6f7tRlwh|tsHFg&5ED2fR0BLK_{kw3-;7;Rj1b~-EshK3eUg%AW) zV}8Du)zuEhCl;A%9KrhvRksOko?0y-NsVAIJ$;Bg@24z{W*IX!zDQ9R_4<3v0=}x~ zs@0M<;QGzilBN|Q7*!P*9sR&`-U}h+!Tkf6!Q9+FR6!6{ilS_b0I<9qvsxIcia3a) zgyE65v^-RmFg&uv?p;Eoadc}00Ouf%LB#Ro@c{MuM;<*qNJj=!Q$09mw zJ%CWQN@9yJes^Ogh$va6tgWqa>&_ebD}V^%z$_3)N}33W;45Qt@-revnq_TI+9G7B z5k+w3^e4t9-jV0WND^TtKaBUry}Nx_sI~`GjVLnaX7}>!X&+96?(T$>rxx%Y&YoLh zeeSjbW`?e}9VanmQ)zk6m#?1Z^Zls8?92cmgza}BP6Ayu&$sW65Oi~NRh6=A;hb>g t>I>Q5w`VH=&{eA`z)De6JKo0stzT;c+*SS@uwMWG002ovPDHLkV1h|l7CZm| literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_deactivated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..f91496e1342b14f3afc609aba0225da9efeee659 GIT binary patch literal 598 zcmV-c0;&CpP)WFU8GbZ8()Nlj2>E@cM*00Fv5L_t(I%bkPH#LmI@>Ab~{7gCJ^J5IhY95<)`6cAOAL1ks~lXPwUFrO!A7S6fR7?Z`(HpX+&x4Jze5Njiahx5JFj~gj9Akolbf6W?<(!uz876Ao9Khn&F(|VEh#%D%I+e zgL5MsjKA@z|CzhpHr_k7w^Agrkv3rNawR~B+x07~-?@%6qf)8z;o}Iy*xfrKgcSfu zm~$YA;uvR+(>&)SJE7NY0kFN5QWW{>Sr9-FL1lT1uj{>MHao>ROV literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBattery.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBattery.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab960d1f3ec4f5b6a693d634524eff6dd62e348 GIT binary patch literal 845 zcmV-T1G4;yP)WFU8GbZ8()Nlj2>E@cM*00OZ|L_t(I%WacOY*b|w z$A8~4n zvNJ{vF(fS1sFem1EmWYLz9!Qt*SYWSxTsQWdv+%||6k7epL3Lmuvc^`B`<1?4Sa13 zO%b(Mo!SXFV_EVyaH?F!-oKyNbxAyrALr-!AW4uNpw!dJ3CogmM~~vyYIw`bB)(7L z`vi>!(+3Z7&GR^>wR~^P6Nr8qa6l=v)?~|NGNlr&r6rOuq*$pC)a%5q%eelZWE*fy zYk75gn%2@1&AWHWISwWW@Ryfay?K*Nv51w;@GIOe)BRHu{xq^eU&-aG#m>1-!oz5N-}gM)0$&5?H;{IxYq z5YRa~O0d4Zwa!L^D;J-q(0`cfloAaPdK+|Bd%8%^OM?`f57?aR!h|7RV;;?1KyLUA9@ZLk zw>Ee<`z2aiTL7nWlG$H>rj!@jy9UVVQFQtdh1V5{8b;hd>FyXosmDCK?*MBHw&a?Jjo~4X)dwxxPSesmPGi&syys&y2jxh0C9F z{U=cx;G?Uz)yJQF%Avy*R{ol$ZD5A^#m7k4q*K@FD_EqGIve#G&XJQ`{bEbJ>zUp^ zcU=DX?K_?uo4`aq0PSrFQ5aC}clhSpABYm3i1++PfG}v0Zp$J9N-02yWFU8GbZ8()Nlj2>E@cM*00JCIL_t(I%Z-z7OH*MO z#(($m?3}4>I3}}cN;Q+jtduM$EP_BOq*r}{pa}X%z42QFGkXyv6$EQ_64R7T{JXW8 z?(A$kd!F97r5LvB-F@@iKW?t;ene|cLl^8jT5H8xbwOxR(g28v1{g4JA!4vrecuwq zI64fF@jt+kt^Nz>w{9MLJ#0T9U<4R#pKggFy@4^Uv|`IoG15MbZ3Y?b8=+itNw24I zyrevgKht%k5m6Y1iC6KM&(BKJg8^$o2ed`ljxc_4oKP@CC>$c?d?CA+rJ@cvs2?B* zhM1fS4-n)G$=z3C0%WS61mJq-Bb_Vc*{bi*hCw9UjazeZiWxR)sivuM^P27s#sM%J z&9TlI?fGSve=V_BEntboaNAWz5?An-73Zznx{=JLpOT^W`?{IJVW2El=H*){DLoy% zgzYHbchhX=w|O!(L)40q2u?PQT`IqoV*p?IO;$J%q00^v@91N7=O+svKQl3S1Emy~ z?7RBJ9RQ@=*8(up`$GGwMy`~j;1(!W3b?frv9nQzx`y$!e=J7xXfYjou9f)Y-5nfn zP5=_tq~7=T`TD~l7VRPHX8Gp^Q$0_0U8=1A&NPPsR;ur$=KJgx^K2H@35rF(HK9)c zHcA_0imN!~y3B3Oic*?3Z7_J~h3Hf6{&D|Ht+cR`Tg37Hf-l?mv>_&r e_eM?yw4y&jVf7_)&~1GH0000ndmf literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBlaster_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnergyBlaster_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..2e245f2fbea48a29a2b6e425ad3ee6210610f272 GIT binary patch literal 525 zcmV+o0`mQdP)_)IrXk1se*3axdHC>xsbAiTe+TxDfkUEQFyrqb`Fs@lvE<=f_)iRs3Jy+cgD z2Y^6h1HD}%@^yN_6vl=Z#Ih`Q!Uq7<)mPKj-kO0F1lW;~8XsMh#Jgk+)LQcxd%^U3 zuq^8vBnQwR9GCa_M~?e;B&3dyPB}lj{`rvRrq{&lH48?kwa%oGy@e7H=BC!<{w{{c zSI*MP#E-dWi|t5A8OfwW%26be@n6OHQc#ZLFwi$C6%}p(HnwKfU%vAv1xd9Jvvn`A P00000NkvXXu0mjf=Ca$3 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedFillingAgent.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedFillingAgent.png new file mode 100644 index 0000000000000000000000000000000000000000..1713701435be6de4353a3c6389a28a6cb6186244 GIT binary patch literal 606 zcmV-k0-^nhP)WFU8GbZ8()Nlj2>E@cM*00F{DL_t(I%cYXdYZGA@ z#DDMZ2BV2dmDCR+f`UqkTA}1m5D$9LOYtP0q#gv%q6e?ul->meK@TFHJP1OSdb0Uw z(x`<}JqT$v-H>c{v+uk6_y@F`R2+Ct&oDDEqeO)NftB>oS~FkB$$TL<(m^F9Xti2$ zVzUh*tW6%KSS+f1KEI9UBqIoPos?rylxjWPe0AP53}eqR&9h?5tll;b3L ziO9C|eV@isRm@%Fl4K5=y}3K&gR+ekIan*aa+ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedTeleposerFocus.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/EnhancedTeleposerFocus.png new file mode 100644 index 0000000000000000000000000000000000000000..06436a18f1c2f6b8e75be5d25e4a60b28dd2e7f8 GIT binary patch literal 498 zcmVg(BkrT%%0Cd%pt*gIi~M+#sIzckK`*N6^r=%--6o08 zSimQ(g&?1`|H^5{gvrF_q9dO*rBd)*g|j;uz(oC005mY=dM<3Q(9;F0vyRBa_W@HB z!_P%Wr3#0qzC%$9LF}P4=lFf>Q4HmTg3w^C=!pG01U(_79Q-=+P3bn$Cjiy`eAcwJ z;5rEkInzebv3H!fJetw+pKY!lZ?Rljx_Pkjoosr@v|bDt`)0bhmxTb{g9JfxCobUf z`jTq&+)}a2Ac_(JNl0QmgLapk3jL@NW3X2YrC#NJ=ekGF=Hv?mYyC$(Lj*A-0XOqD9c oZ@tq-FOo?1_TFj7*q8st7qEHH7&CqbssI2007*qoM6N<$f;~XhRR910 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/FireScribeTool.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/FireScribeTool.png new file mode 100644 index 0000000000000000000000000000000000000000..537d7a230864ae9a3599908ea4930d3eb6ecce4b GIT binary patch literal 1050 zcmV+#1m*jQP)KLZ*U+R`sCEkzKl)gj5&q@hY_5?)@_euSf22N!q0z{yc?Q2YY_Kym8e z5Fvwu2%hQO!{u_psMvL#(bD64NQRTZj^-}DnS22ry9f-;mW=gZvQj}U-ZdMsK&I8^7~DvX`q=idDE;$S`6*HvBVr zD{8eGuIo~*RzpKraU}(jcbx|qmzz^WEfoOs3PTr0JpC~*KObx&;gtV z`he#q`5RzVDWp>I)qs>z-&Kl!;1tjeoCnr{6z~uj1zwuxt3dEu1rb{-UNtN418&aD zKqiAuBzRgba|L(?Tm@d3_l*4Uxu9uCuPrXpIXKAsg$25Ldbqx{#5ynrd^UyIaGbWz z0_%VBmz81wxIZ_CH$TsIvx(N4Ev;Fbo#o#2G#?CLI-8Au9(V^Rz!@3>A!vE#CtwMI z&gW^EBK_Xgg{_o`6(9rD0g+0Pv~7~|L3w%4Mfg}T51Qv#exwE_s z$s~3nfk>seG&RM8Vv%!z-{#(jQXmKd@z`-VX`0Q%$Os$0Pv`hJCv2M=#Uf{cT7(lc zbSKOyMGue$`hnMgG#351&(*hm7PRhjO0j9$a&Ls>kw&tp!)PRc;~$e_fH>pV0KYEu UL>`oJ^#A|>07*qoM6N<$g3=GmLjV8( literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/GreaterLengtheningCatalyst.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/GreaterLengtheningCatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7811a1c3b5e6791bdd9aa2ffe89ad1a170fb73 GIT binary patch literal 491 zcmVcZF6NN@W)ChuT1pP%W-Dt_Qa-*3pTevQ%1c%X~5+W$Cts4Bh4(4#s6vQJ)WSAfVm{ONi1r{~WN*~c#wkxPc){;USYlC}Uc zo8=F~RegR24FrD>gU_an&#U+E{J5_MeRvvByW?99PyD#W5-8 h@GeZ~B(^GOB2K~tId{itrzg}o@j;-tN`b})of@v?R2P1=9?#J;G|QNQW7ZzHGHGC zLC>K3IMA*|zv~MEl1M#I&pv9bFY9T0Lk-Yg30cyRDdaf`FcwEt_m62pj*u*@?1%VdxoD_Hk762c(2DbVeSeD=-4D?V*bjXk63Fr=V3pxNP z%gTG;;!yLUk88fN+2^z-nXBIY4IqljH?b|aY-R)GFVrP-15|#!7kbcbx3PT=f5D9U aoj(Ak7Xj^##s|Fs0000WFU8GbZ8()Nlj2>E@cM*00D+cL_t(I%cYauYEwZJ zg}*g3=Nx-%C4Gz*FN9cYZ1G(}pGpM5XHiQr#Eat3Tc{vO+hk^MFAj+bIlZy_YGC&M zSZnPWxjPT3v^pG*4?U%T6|h_&fEy@^ki^%wKh+1&O2P5Pz&!&72;8A*3`ZE4Ycow#0H|sqId#g! z;P?hXn;{;J2VMu`?B)F4&@QL@+}*&B_rJ9jVrN5Z_J_|0B*Ez94`06Rkr$C-Mjee( zr`;_8D8l*aoU3U|Oo0%(@Jfz^7y(#Pqfq)SJiQorSr#6(Vl>>fF}WUaw=k~X{9Eak zg0kpj+}=1>(irAXP)WFU8GbZ8()Nlj2>E@cM*00DPNL_t(I%cYXRZWBQa zhCh2|Hz=Y&;R2%Kz>U6D#Zw`qN_`~+y#pek2o<6>glu;FbC~VYpoIhV$zyvy`L}J7 zxQ*p&=lJAMIXh7x`T`CLuw-~P-oC!DDS%yfaQyOt)B^z+NMKe07`O|CA=Ui(={E!L zk%YsLbe!al1nbW`EUe}+B-OgXMgRgc12e9c9WuetbV^QyD1CrHHwYu(-RXtNg$r(VNVM|?bNfpN60=8+Osw8-#`x;P7J!G(=ajzZ&8y!l-2;@a4ooGue{_ei z!sW*u^T(N-6J58X$!YHn_9QUmA|NO1OWzpr|CWFU8GbZ8()Nlj2>E@cM*00D+cL_t(I%cYaCZWBQi zMbDjC+X0%S;9pQk5RPcgpQJ!ag=3|#V;3OtFRUZcVL1^Xls`cV4N_$9&U+NQ>yWUi z{HmE(oOkBVjNF}VDr**>UhO#qVifCDNfHPV0z|>P zq&l9(aE{4wbGkwNo7)C(ytvWF!(D$lzMJ^1N`|PKORvR!xP6*Wy5iZH$`Ux^C<=}j zH)=Id-Coy*Uhj|2?{c}Gd})73O+`Vf6|FY-KAKY`qbH;Dbmwt^fK>tg+1m%n7#_u1 z8D9G1fFe2l>43#B=UIR^(@OotxB_0CU69P$pYn%;JvWCeM53jYi7s-L23Zi4_RC^; kesXpHPiWiU7}&D@0#D$qH}^38djJ3c07*qoM6N<$g3=`43jhEB literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/HasteSigil_deactivated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/HasteSigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..aff173d788cf6542d59e83f2e312cbaeb75d54ac GIT binary patch literal 562 zcmV-20?qx2P)_06N8*cnkml03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00EXsL_t(I%cYY$Zc|YZ zhQEK#y>XC8{Gwqi2(bVHP6I7FNP(0+P*AW99zsHqA}A;#U^P7Km^f1KJ!gjEVq?Tj z<*7zTNB?~D&x|61ZK7HwFYXNkjFd!KW{QLdm_ZUe{WMdTfK~+0?hGOV%*4m@Js#}; zBq!m32@L1~3lEZs5*;n{QcIW! ziU)_c7UTkzg8RcuayZ2uM{N3LtK{fxsw8;%ZNR(fKCi#-0Z>9TrO;#t+LqFW8@6dk z33xJ|F&SUbv$jeAALe~d<|A$z>{JO!|F-}T0hfr)$r{1I=z^4ts;a4Jz3L=bRZKYf z&z~H^BWQ8~M9!I`v#B}>Brpm0zZD!fo%Po=k8fXfFVgzKpeaEUEnE}EqtQ9pof~ps z_j&;VzjE;Yyq!HjEk|;!GOkEeIj$GT4kyz-hod>Wz^iGC{^rMk9R&yD1;xF4m7m`o zh6hw;nENtBEkhoVB)lnjGLFCedlTCB8jUUEH=Gr^RE-+BUjP6A07*qoM6N<$f-C0W AbpQYW literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/IceSigil_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/IceSigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..30ff69d307e58d87b12caf6f21b8a03b46560ee3 GIT binary patch literal 557 zcmV+|0@D47P)lR-`tQ4of|s`t8KnjVQ8y#t9mRwTrj zz`}*`0>l$|7FQm@E4V=u0+@IM4}x@04?VAb7sHT2XBPOcYEk*#Uw^$aNdWx%+||JD z!Nl36UiNCoo_MuH11m&MvOBf~^Dn;T>~M zrY)1?xI67mO$JWe36tbxGv2lhcJFwl2f#w&>+g=P1n>5z99I>iM1+_Fr+W=QX9Kkv zQqVR{{RptK6cU$RPfkwl4hFC5itE`xPKmjMVchop-J=Xv3IzcO!|vw~iBV!cj+i@I z8^bpxTO^8tf)NpX?*~rWhMY3)zBz-X#QXgz6L%D%0+J^xKoZlcVq%Y1`WL`B?*TX1A`3I74gCG5jcBjJKIm#Ia3Zh8#V?m+KxA5WOS^$ASVy~(gN|4N0NR$Z7 v;M2h?d-3x5zW{)?X%fI~-lTB_@K@fz$>UlB2WD_C5)>e{DByNCl z96NA{h!b!YRvdvdfD+rXgcFXyf|#EifyjQ~r#I6q{DTe7BJ^rTs;TL!>Xy3$@afH@ z0&E|?dT_%XN(+M1!O$gP5;4V92mo(e4Q(RG76>WWOlla>2g8SwU0P3wa09V~JWJc|%1&HG3gzpy@92~cCcM{G{ zwOSeHd10$9S(Xv9j9Q}sa{-dLzPx0w-N9wJgb?FAFV-Y1DtTgS`#vDdZ0UrV;R2a~ z{&-;O+Ns18=F~)_{#8|FHx<*h; z#?+g~Tz?$0*KFaQkVLpwVZZa7tMm7S5N=PQy8Dn+mNSiJn2Z!7UY3*#TbFIwsifoR9z^M%^<)FtW{XE z)7O>#E+?}H7hmGPW3ANc;jyC6RH;_@1%oV5BGo8w~_PN|ub#_aFFD)ZIhO5L%bPnsKa4Y#gr zWUF9h*~7g3z|^&@?BaoO>{`;yrB}im%^w6Nxj$O-H045EPO5G1E%m)z3<(ksm=dPt zT>3LfQsjW~2L=%{X3kQ^GDq{za(qmym?gb(7=&lfJS!L9lkY5(U1!Ir-JIPpb;m9C w&;u*3E?#%OM0U1o%oWFU8GbZ8()Nlj2>E@cM*00F^CL_t(I%bk-=Y8yci zg}W`JSdoQE=bw@|dOo_&CO`WfAR26@d0+0zj!sG8(OZB=(+J z2)hAhhKVp}xAAdIs49{yW6*5!dT$RxU@@I?d3`NA0U|;aMI>2U2;u25HLu(Gf*a{QVXTkg_C%fI9b_JfLyRd_Kpi^7+eG rX(!EX0Kk5u;Q)R-JykEh#{aEfnw`o+s2@$d00000NkvXXu0mjfhxGkU literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/LavaCrystal.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/LavaCrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..688b609185880b35061279ca9197d5fceaee591c GIT binary patch literal 585 zcmV-P0=E5$P)#-y9bO z!_=sSf@gi+=Um=%3=v@?5o3e#SAcs-iF;9rNbtuTqumJZWhHpf*>ixdgGX3;c@Hdb zu2qbG0^GckEkkDrs&i=DV)Kp+-Mdc`E-o?+RnC?vL4oH~|A%qEiRrtVeoSH92; z7qRy2BYo;7ZeB$yn!m&aB?#0@Q}_*!A6xq=zMDacpBVB2vbhRfef#12Y9VKGwUbr{ z8v0LPfm{aNX;XUogpm^_dq)En-n^nbJxyb2mdx4PU;u<`MhL*{O=I&wz@1Mu0g(QY|(UXi*eD3pc3U;PLQiBN^r8(vwj)Sz> zfiqb#+=7x#%NnbyNoS9;{rCW;okV|_CDu1c%;aBj7nXlvuZ*aVgu#{c{pE1Bc# zi^n7mk5PGW0q0KC#`cGlS3(1}jhsV&Tc-B*5!m3|SjQnnKm{e#z`6Uoa9x1^@{Kb@?P)WFU8GbZ8()Nlj2>E@cM*00E&%L_t(I%cYY|Y7|iv zg}?Kvs$W%g+8B|z578C40>P03b>bh!fdj!M2u=(^Cn6?W5Ck`&i*S@d8w}l@>gsy+ zu7j>LUBm<=4<7eU?#DUzM`p%lUV56`^4?Owy00#_UHnA_f+OvQkb*&aSCUWq)fZT{#1Yk_y^Ue?i6Gh^h>YjzA?`3}P z-Hg-$3$cZR1Rm|p@L9i!J%C4C_u|3cj0~1eYw($PxI0A&1iJtLPz=P-3kQtS1X>Z2 zNS1*aEJA;zJ-`BEV4|8Eg~Z#(Ih4lxCnX-Y+K+P;fuv6e_ zhh1c0(EyFOf@A;w2#!SX@aEGTD#w?nL&ABRXlC5bbNlvk1Hux0_v4g&0Gl{|*G3Dy zE$jhqdT;7FAJ=Xo=`^<8@W1~$)b@?7vkCyJs-h^0|GGw9_MHC$Ro1M)`T&0S00000 LNkvXXu0mjfDHZUo literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/LifeBucket.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/LifeBucket.png new file mode 100644 index 0000000000000000000000000000000000000000..52756dbff7151e7b96b1f7094a54f51b8e253b79 GIT binary patch literal 659 zcmV;E0&M+>P)Km|DOdS%bC{oLU z(rj56vN7-yC{GZiyaqc%)R_f!p(2nDk&u{Jx>QV&nikuq1NTO@1HvXziL0K)^6}NZ z=l}2jU*99D$}YoU$ML^_LfV0qN@b;3N~O}u@!f7$a>0PCb3qdE`_Tw53<=~humI3R z{`=`^Dn<%fD}Jqt0{3P?PZa?iRep&O0t=Dt8L-Gd4u`mAvgm|f7%owZAQnCF$`ql% zz2ig|Kt=d^Z~(wyFpyLX*s}Ii*;nOG1Q&2bSVR$6A*m7qMO8$VATs8678h7me=+Yz z!{GxG4+w#Rp&Gz7Ie>yHfe1d}o7~{=@M$&-&4d6y&C?gb2}4{Xz95np5&R4qSX)4+ z(*dB-XvFd#uCLiw#gDMCXSOU@fw)?&0?_aGc@`He%tDXsm;rUB0xT0Yl8o4RcY6y! zv)PR0r_<@*ISD=0ttLyo1?6%%#>jX)j(s1uTDV)>Ene=wpkA*lK)ctWn82e7XXZok7Mdjo`Ctg4_M^0v$N$-saRYdPOTOIKhDnqxSP!g9A|eL&{b!| zb1-1z)6ES4pN%FSG%%k7@WyChzQO-5Ujz0AlXQdC!lu}y{`|S1*XsdLtJMH_dvz7d t=e949w7ucFzF=K!+WY)5@Xz*!e*o3E(KK3+-!}jN002ovPDHLkV1j$$8_fU! literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/Magicales.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/Magicales.png new file mode 100644 index 0000000000000000000000000000000000000000..e078a01b4117e990c25d0b0491523cd71289060c GIT binary patch literal 408 zcmV;J0cZY+P)M@3!EM^#Z* zX2x$S;FtBcKuZnls%<|4I%?W+a70}PwA8R~0bR9iU%TX%lUPEHtuK*aad?li%ET6v zFv8>6V0|Gn2VCmH4ud*Ns_^RHNO6=@Vn_l&m1UYbvxPuMP1{ioZ=Qk0WH=m-zV!jf z$w^6BW0iBA+9#k$k%)*;MPiF_WOGN&$;t7IND=zj52p(u1~#Cg3JD_|4v!}zV@N_u zN`V3);T)jpSAL2fxlV7)<5{7~h!hz2JVr!`XI=;po7}56$!T^LZZ(!4I5C@qg$M`` zVw*b+f!<6eoW1AOq~RoK@<0xV01tE)44(dd8s7nk6@}kv*E*K~0000WFU8GbZ8()Nlj2>E@cM*00KKnL_t(I%XO1IYg9oL zhM$?ayLWGPlbCE+gGE3SQLqrQSfmq_kkZ%*mih2cqnwIVPICj$Opv?6yxnhGnc`oP7JspPr09T?wit&nDd z)?kc6#J`8(q2?e$6e(0!?tSao9zaA;3bclDbT~&15YE=6(-A~`g8)IG&>F%}qqT=; znUB!g62jTK0I1@XNjWuhjqOg0+T&ZCJL?FH7ignAO@Xxz5m^4DS)G|fWnfocc?TPf zb*xHRt3P4&o5iL+dmK9w>)4Lltm_Xf|M*;B-u7WAs}~_G}Gu}g{`HR*hdTM$R6C8 zyKnB^zL5hox|U1&3J{q68`vBf9~tiX8+%pt=5+<|>)wMSfWFU8GbZ8()Nlj2>E@cM*00JLLL_t(I%XO1GYg9oL z$A4$;Yj+c2iH`(HV_|Qh2v(xtBZ`e62#Tags(@v_fnbwH8?m(#!4wJ#Y9sgo)F4(i zF)?g**X-WSea;+<8_jM^PBRQ={*QC`kEkm9)#5^Pr19WUM?5kAy_3BJe}UI7)flfU z;u(qp-hN1k2k`LmZ#j@)aiOVKF4UNsGKgBbTY@d2uu7*3{Q-Rbnz8g`m&6}tGr-X! zu)bz#jKOxIBq=yo^~(~9a&!bUtbXx)L_Y@O33&;v%?gy|AOd4`IC&yu{_gI6Mz&%M zs8JAD{RzGg4p0YTs=MbaL9mYlfFcLYg-%zA!b;UpodUGlmGF3D55cSJlL}B+h*Kqs zc0d9O7!TUr3UFw=(p;XYF!J*1F+J7v=@bPoj^~^^8=)oi5=auTPSH}Z&fyv1%eS1l zxJFVc8`+M7c3NT`++MHo@l!@`09guHMG%4jfwZ& zhFiZPo|EmH&iQ_gE$c{}(oZe@Lh+qK-Gi;6eBE4&NSrd}8zKX$P^c1HB`}86I@Si3 zMrbfMUT?^c0W?DoV<0rUOxvZy4kf+r3mZwvYHW!D!@YMc`4{EonMs|lL++Hqjar|G z44ur;PL<8f5qO5#_bnNT^2*X1FTa1;7EURLRJ)lY&I=;n5DFX$4fAJCPs|?l8xN|( hb9V%w{q)%g;15=t1y)La>lFY1002ovPDHLkV1f&~B>w;a literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..8b25db877088d45bb71adecfee848707d2352263 GIT binary patch literal 670 zcmV;P0%84$P)WFU8GbZ8()Nlj2>E@cM*00II@L_t(I%bk-=Yg0iO zg`fGjH}~Eo4XH>GE7GO@451spKyf3Yf55u5#ht4vZVJVMdv)0&Ze4aOE?o;^yGav` z$-PPD&b%(tq>0*v9(ZAxk2B{zb4G~>0H0s>V<5S_R_*c+P!odH3r6x1fl z@MkMie}AHw<&uYG52?1=p3Ey02@55cAwtRb0(S3 zftF5Nj!9TP*I@5SjYqFD4vuoZ9CWE!a6uq=j2Z`R7ItDF!1rFs>eB)@98ru)&ZdTZ zR8leH_Kbr1Zz;9M3Rr0vbFm7;U`Zng8v4#t2B=13bE|)e_|(Le8f8(!uq;V6SPhXr z3D^X0Kep5ygNRJ4nx>|jrba}FuimW8uANrX&-B0e1^m1B(dhUgvj6}907*qoM6N<$ Ef|Ldw^8f$< literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_deactivated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/MiningSigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..3d80e3510d53c76d0682382528bc69a9aa9f0a4d GIT binary patch literal 649 zcmV;40(Sk0P)WFU8GbZ8()Nlj2>E@cM*00HeuL_t(I%bkM zc>VSrRv;~)IR`WI)T#w%1QiRw%k4Mp?jImP?|KJp#2^Q2pi!^K3xLCKUY25r4H$v3 zhde09S%IjMOU(Lam!$}NfI*s$0i3i}1VE4a>H~}lC8)<4s5!WIqr={ZPh>@)yRnWn zrGjZVKqh|%tS%B*tVK_P=)(j9iHzT zka()|B93u{chnM}3`#+`75RtKB{F z0AAs2;>d$S@K`C0wqPWdTeBu!YFqs=HbfFofmX$m<{l$Z1jqxl>x)lt69ud_tv#QB z(LlwOl7_jb2#`c&bCbVVeCEWp2F0iVW1#BFYLPiH*fd^z{w@myRh_M*RuAV jqg$EJowjD5>3`!F@yYRBj{qPT00000NkvXXu0mjf8B-0z literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/MundaneLengtheningCatalyst.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/MundaneLengtheningCatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..ce906c3599d755d8ac4c7223787d87d3a78deac8 GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E+?}HA9w!x=_x>=B2O2`5R22vfByfsXI5?KY;-cnVz6WW_cvMKT;6|u>Bukh zb(mX;7%?>+1~u9DdB?R>SFOqVoEG zJR4h^`RZi`MuvtH^A7y~|6fu{XE z)7O>#E+?}HuNKGaD?fokxt=bLAr`0KUNYorFc4wB@Z_~Z+2zd~^G&UlzB z;dn9UvNn^Am)H_Htk1r&Rp3;a?El36Y0U#B)^l1SBAOOzK#LhXUHx3vIVCg!087S2 A2mk;8 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/PotionFlask.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/PotionFlask.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d3231edabf5f48fc3a0f473efd1e0524f612cb GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E+-Q|gUFTFb6x|5o_M-AhFF|lI@yq~$v~v7p0k-xYISGa0mu9Y3fi6OA4L54 z<{ddX`G#{zQE{q+P%~pPXVdwEQ#^EdU)b+m^8Ww*>DR@61g~Ay{J6?<-+N{Ty^Fl7 z4}0Fu4rTqa{r94@*|Ekt=RbSgQ+_l@`1zg{rF*w&o`^hCAK$mgz<0fixaE7pXfZh5ExOq{ItqicL5eghK!4n$?+mfvqhXP-%q0~(^HAt#o;+$i~KOZNKQ=en9IS!Y<-IaIxhxBT>v&#ctvZ{Jb VRw_Ao>NL>544$rjF6*2Ung9alf~o)j literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/ReinforcedSlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/ReinforcedSlate.png new file mode 100644 index 0000000000000000000000000000000000000000..9485f48aa4d66ee3e21af51075e216816b5222f0 GIT binary patch literal 709 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᣶WSIN6;# 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png new file mode 100644 index 0000000000000000000000000000000000000000..03a3915abed97b8782e7e96daf73d6be96af7860 GIT binary patch literal 457 zcmV;)0XF`LP)OL4s&sl6}C+s8@hGu3YkB0{~HmXhNSogda` zSxr8uNF*LEV2t6#O~_SNIMT5p;7zAPz7ipoZYs;N##?x7ElDA3IMOlf-Q6L9Z97IG zYjC|489M{7eJLf!C#UrY89*!8vTcfvPxJF!Mg*E)7eC;jTqY=&hXew^0u11FuKymR zkv`dk#h9EvWomA2gxCdKV`w8p2ZSkmZ+r^1_hl(LEpl1|&=#m0gI4|f+n~$AU7U^e zXB84-z>7OCg{)!Iw)qr6D@7Ez3%VRv6sh!6#1Bbzs_U;VsP8w*lxEJ)+yOu}&L-+$vbqd>vkYfwh$00000NkvXXu0mjfi1fMu literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/SigilOfHolding.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/SigilOfHolding.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb3443ce47bc547f99f9208d4c0ce48f6ede7ad GIT binary patch literal 697 zcmV;q0!ICbP)WFU8GbZ8()Nlj2>E@cM*00JFJL_t(I%bk-wYgADX zhMzh2oV(e?n2&{|5&T$nQ4oVcQz)XXzrw;sh)M`(6w?S2{6L7t&O-l*q*4nZL`0Jy zv9MUstdY%T@7;6GSeO-;#6qW;DP|sq_ni?{1>pVMMhbKt9q;+UKZLXa&xeP#rHU8> zAz($eI)3Gg)vD|SuRtwW>Au+fl;q9FzyegT% z>05_ce6&iRbK7kMm@Ad^$d!HAE(6xEFtfsm$uglH2u`qGkhK=+i;coqV>#ajcs4Yo z)y*bnrYpRA_?dc^A;zFF5=0oiQKmZcg^KS@#v049!$yECMj{Y0Wj)L2NmEW;Eu$iQ z&oaV#pq6^t!`lE+l~e_>N>PMwdCsfHpBR}qK*3n-fTNfsJ71!z;*8<+z{~JF6buWFU8GbZ8()Nlj2>E@cM*00E{+L_t(I%bk-;juSBu zhQBJen@%SyHi%PjnlOS95kl-)^4PI}72*I$AWa}bz=*?e1ug(+lCe8&7Yk2!l*tHb zsFfe(um1XNifd@N=gX~ z5J3b|HZ~!2dkUbKb^JJ9B$u@idPGVc6+u*SE+4kAqrmDz!(>vna*Cu}dfsl0W+J3y zR|AH7I(`(!$+zVMGsD=@C*$|8$m`F$E7eQIG2rX6;rnW~M-{+VLeuPv*2^BO-q*$P z3)w1ys)B&3?a4m?crVW z00=HqgGK-V010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3$!^3kWFU8GbZ8()Nlj2>E@cM*00Fj1L_t(I%bk-?iW5N; zhrjo#y6tr0#*KIcVVKNHL=7H8^b#)pvvZ*<@eVG;bI8m>SCRqo0A4^PX}goI`nhP6 znV3Ns9~2Z6^}SzxRb`R@IDNe=)vKC5o&4kyWgEcrM`MKm$Z6XiccUl_3?z8@ZfXAn zJb6&7EFxwiIxx>+%<3nb%szQBVM!_YRRM2tpGP*+viwC&0_fERBU)^$BG3=X<( zjU<9QDJ60im|+Gfi>7T?I|*Qr_33MivhZk_8ExBR<`{zqb0>tne}wap+XpqH(XiAk zI#NyuW4#vD$Vf>S1MJWE_@%*vf#BX@jU*(|C-LKZ$E){eSL!?6fj*1bwC4WN)iWw! zW)#t=s@>53cl$6oql63`lvf4ulX$d5{)k+|KtLNCFur zr_FY8b~K?+i4UI}ifD9QLRl9-`=EMTOfcOXe6Ec_0sWU&r)xp78qay^r5+ij`BBNz!prv&%U?LPGyyH3d zym`-kj)MS);3V%8s}$6Q5gCVjmc~lI6l1)Qp*1)cuSqIv6V+l=Xmrg%o|>q zKv5LhUu9g^C6^PiD~Nd%Y}<|i>h-z+Xf~S>fMr=?sex_VQLS3RF!S`C?zA2R0av$o zSdE5Q`UjI?!_2RSaT2}nbTJACI1l%H_IiwlL;TT*q^eHe#3ra!D*%K+z`%9!eIL*B z*x5HZ+}lO{Ln9Vrzx#?10!>xPq|*d}Pa=^Z7>^elTwdS&G^9k=b&{zR`nJJKr$ejj zkj-Y7Q%GtW>tYs5Jhxjsy?=m|GbrQlAPiBZ{EaNc48mB0RrC!+^@CQ(daN-3 O00001vJ&Y97f zaW0PLoGdg5Dx(lwNMd%`mFqUG3ZoWMP;FXSVYO(}F4}Y<2!w(bQIRGllo4nU;U)qr z2j?Q4Xl9&qJahgtf2%R0$)Mid_bp!D%l8ST6#oNXt>x~k*BE#_%H8tc3B+mzS1t+# zFq6E2B>|rgO$cnq$-X#qa{ZbFmoEs_-#>tDXPBIPM&iH-X5CJ#@-p#gl*x$+G)?2s zz%g+oP{V={VB7O7I~KYw*zUdL;Wv|~S(9`sMQ>*(9lLtCf9s~Iso>t7HkD4N0qEO1 zK)#S+s%4NxwSk#Tj-GHmwsc9v8~N~dnn!~t1b|*;swhQQS3i;1COl6eDh}Ohmgjmq zI}$NommCf@HDTs*$V#Pl3sUC!^zk~@(k%9}iEU-kLO}wh5}mOI#?y#wopB7$rb|oiu0ctNY8b@nmK=6pc%vHC7qr^$|CC`9W-v-L!#jDZfuk}peYum zTIGs@)citVF*{Ci$;ELaB#l1G&S$*$r-+v4crrFh+%VX@Wh-XB@OuVB!-}KF7exO1 zG@9OuWd$)>50i-Qr@Qb5fQD!czhD3JDOcgTB_53QDk&X2Y2)_?DSIVuo2LPIb?&TK olc0)A=fyAc(6Czjnf?Vo0DzD1Z^ceB+W-In07*qoM6N<$g6_i~`2YX_ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/StandardFillingAgent.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/StandardFillingAgent.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4c8f45ff5ec7842c4029a7a2ec7af66bf69b3b GIT binary patch literal 610 zcmV-o0-gPdP)!s=W=sG803B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00G8HL_t(I%cYV_YZGx4 z#ee^K(E3VhNmY!sv}i#JDwJ$p=t4v{f(vmcuEd4z?8ZnxfEy`-6uZ!c=tjhk;8J4V zNgo=tqQyq@u$g2!^UqvAKr(5?3wLwx;hY2KC=ua*#t3`(zRyA|A`7v|Km`@%pjZ%Dh{^NY@0m>`)Ib8y^H?jb wh^PR=w9$@BV1jL$%$zx`49nbIm3KRT0V|amqXbjc+W-In07*qoM6N<$f|C3SSO5S3 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/TeleposerFocus.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/TeleposerFocus.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9533faa617fa1a3698a05c80a99d56c88886a5 GIT binary patch literal 530 zcmV+t0`2{YP)WFU8GbZ8()Nlj2>E@cM*00DMML_t(I%hi+5N?TDF z#DCvC!9|0))@u|*%{7G7TCalppeyqRU09_qeF(uy@gW2^1)`Gj8R_6@EaAv;mm?WNpfG6U449WwhI5bs@20$S+6+(M7Yvym_b>6g` zI9eWdzIqixV|CWiyoFMq=|^3b)?2#7sk~`<+Of6g(Qhb67{K>)lreahI6m!rYL_V! zNl0R%A8pP%6>_Mbvr6gda*K~X>3jn+a34(N`F5u+sgkM*UF133odJI~vl&lLTrY$|5wAc;6^3*r!srE->DqBjHRL&a&d_nz-|(815TtQeYB zW*kA#p1(6#OdO4-*#6>~%=7Ot0#u8}!36?1tjnrJqjrg!w@|x!xC4(G{C}V64txmH UyyJ&&JOBUy07*qoM6N<$f-a`uWB>pF literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/Tennebrae.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/Tennebrae.png new file mode 100644 index 0000000000000000000000000000000000000000..e4768e2236aab8cd7b270bb9a88188a01d3cd3cc GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)Coi9-=ss@G??55h%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6^dDE`sY#WBR<^wG(VtC|f2+V-y$%;I12I_^-f+=cEb^Oiku z>YQfs|8|I=a;tmgp2o=3XVOOTNt1r4`PE3)a~l|+c~jo7YSk7KW~MEzI?uB`qBiSz z=T2L-Ec42?wf7b*@e|s%eS^=s*RyQS&wMWVTqgE9W9HwND|Y5aZ_;`Evu0iJ>s@K} zb6YafvSzWpw>5M-_uSafO|GB)oMl_$gR-OtkdlT?D?5y;vT)CIi kO8)TKJ>7Tg-(T~844jJ|8Ez;`Xa|Lgr>mdKI;Vst0RO0-iU0rr literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/Terrae.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/Terrae.png new file mode 100644 index 0000000000000000000000000000000000000000..81e1154abdfbe43cf9a43ecf18da6d4192b768bd GIT binary patch literal 460 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 Eg0P3-2LJ#7 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WaterSigil.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WaterSigil.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd095b5da355ae1863931fcb99865239b9c307c GIT binary patch literal 590 zcmV-U0WFU8GbZ8()Nlj2>E@cM*00FW|L_t(I%cYaej*L+d zhM%hQ{q@Ag4UCNut0u(HmJ65*kXf*pn3zO}2$4u^M+hRZkY-$gg&VM9(+shauyO-3 z>BRT7@6;&^wEoe(pjPLcobyz@Z`BcZ=YJymz1Y8e>L*DAP;i^L`1#9ASqK0KAz;ao z1QJTr!2v1qKMAIQI({e;2$GW(fe;Ej-e-v(ca zvB9kc5xVC#_^|zW0wCii9#~#=2|}hBZP-PVa_H`-3c6twSkAUMcJNBbCx;rcTPP?WKE(tKe za7l;@5D+g&T2DwAc`*K1ToJE+WfWY%C6Tn@b^p1{9i+Oh>2x}O{dEUdRx5yypI$U` c0sj&|03lezJP$tf`~Uy|07*qoM6N<$f~x-UzyJUM literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBindingAgent.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBindingAgent.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf917b971c73d31ff1d150fec943cb0e9788b17 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEcES>O>_ z%)r1c48n{Iv*t(u1=&kHeO=k_a!WBWi%1j~WCMj{GeaUuobz*YQ}arITm}Z`qSVBa z)D(sC%#sWRcTeAd6une-p!hdW7sn8b(^n_&^{N}|1=DS(7y>1>fG!cDbnVBukf5K&#U9#Aw3yt|& zI$KNFYmM}SVmIF35|I-=S)#TfuU~*^r@2-B`;xuNx;ti8vNPR(y)esXR#?d`saGeK zb4%GS literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBloodShard.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakBloodShard.png new file mode 100644 index 0000000000000000000000000000000000000000..b09932c47acd21e7a366f232ce68ef78ea4a4bd0 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)2Md!tW6J)?3xPtinIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^0|TS2r;B5V#p$J!H)bDlkT`mOE{o~~6BfR%$w#>qU%b0_ z(ADve`=9Vv7k0*4m1LkA`%k}|vG?|kShx8GO&eXc@h zu-Bs_rx@d+*M@k1U+2BJ)bK#@;)5C6e_z}_?dXEb2j@QDDDYrSkYl}-X!Y7Dho0B) zo&VfbT3|b~!&%l&|x z9Rro4fx%`+Hogze=AC44EJ6NWzT$HR&q)byexG?KZ|x)W=*s&)tSq88_&O}6GlD|c M)78&qol`;+0GbB7;s5{u literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakFillingAgent.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WeakFillingAgent.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b054eeaf59883e9353268d820bcf5373fa5fd4 GIT binary patch literal 582 zcmV-M0=fN(P)WFU8GbZ8()Nlj2>E@cM*00F8=L_t(I%cYXNYg1tq z#((F%?+t-UA`)@PAPQ1SMWuA|3v?_l{t1q53W|cRg6@BKIqj_pk=9yrr^_&pDtM^u&n8B=yh)0D+VO&1%ri4Ibhpxf>0shurQ zrFZ-U&1O^T_4*#2EhA@H)_-&J#<6~2xw9R;%ChX=5;*7h{-vk*oYNO(#M%-sRo%0r z(TMfsmS)MAGh)LYAoSYjr__3HrnfYAfWI$XWqYHd*Km-tsgYrKEWjkL+`+6S%z z2Bc%p(2Wogc89+(2tO~~WwpJkr2r8j2rZk}?h!>hoc-{Ujk#MGgm3XC&c_(9lX_4v z81xCkkV^Fkz00?WH6>1CEFnQ)D6C8_lE`1dDE^K232H(r7%aj#&(T22i&PW^owYS} z7w@y1L_}nO!{Y(V^vBoC&Ckn3fcKuS-Os9`7-Pv2M`0ig0%p&j6JvwJRr#><2ft13 UNnTDINB{r;07*qoM6N<$f|+9RivR!s literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_activated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..df200e2b09011941b1664a55f902a4b40c332707 GIT binary patch literal 624 zcmV-$0+0QPP)WFU8GbZ8()Nlj2>E@cM*00GoVL_t(I%bk)s z6%$ROI1KWOm}Ls9{`bVV6{V_9ZR z_kcG&V|5=r(4z$ggS>$2g6qLv8$@!6y8T`NtX#BMgmdTNLXdrgFiC!9F-HJbMB^ngk!~Uc1wYGXVgZzN$ne=yhSf1{h-6Q&r9378+H5Gju1Odqu(<}GKf&4xEG&X$!%p2iVT6ZJDqBN=L@rO7 zPMn!A;F=AvZ8#P{dl!-ONrvvo{Z7WuH&mURKnl?i5u0mOc)JPJ zIYWHrI=p-i7c1a-AmSYA169SUOeslXengBw7{T}{`1aL+?e}vG?CdI)siC6;`l*w! zX#KR=Z9y19lJMol>pwiLn$5uX3xV$!R26r==8c~HZRVW#KjSy{NZQSdJP(Bc0000< KMNUMnLSTZ|762^( literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_deactivated.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/WindSigil_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb6ab4db76dd7bd580f6d0f384e3de5b1aa9201 GIT binary patch literal 503 zcmVWFU8GbZ8()Nlj2>E@cM*00CP`L_t(I%bk)0ja z;6G)pP7%G->OdIkS<=$~;wKUM`Is`$fevEb=Q*^yFnj=Dw_dNl&t_kRghGY`x!`se zvXu3QoP^Nq?Hd4@PNc{HU^G-vmcn5Zf&d<~Qr?OL_a)v%W6I$1s5Ex1LhJRK0}v<5 zHAdGsfyJV@?9z7t-_}k~1Di`JZgu9u%*#Ng6Y(Hf3iG)dnCGfH4B`37m9gRhoQZ`e zaRM)6?E%nrG*lzC0+p?uC?eSYK*;m5C$=`f@jNIR$@T|j4;b^cq*@?cg}vU~`eYF) tW+RG%Mid1iLiOytwtDu{^g8iB;~NR@t*J>{_GthB002ovPDHLkV1k{-%X9z$ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalAwakened.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalAwakened.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb3dd1fe61eae909c6f4ff1474fd8f51d7b2971 GIT binary patch literal 689 zcmV;i0#5yjP)WFU8GbZ8()Nlj2>E@cM*00I?BL_t(I%cYY`YZOrs zg}>W5_y9qvtL# z803UONT6e+-NuXOOZTBVkzhPsl*XAkoU16S3NaDr5S0xPgj$j^__W1Ne_b6RXr@at zaefZ(9lfy#w|s@*a|cl%lMUj>FNuZ~CQ8_S|90P!25{D5OiEc+IpcHvX1)NbEGH^p3!2lc1Re8P*&`;)7p>c#XFXYc1x%Gm6{SK!oD%Jkm%}{T#KIQ?kn;K>7I+7S95C}mH z3W_^7C*K;HgTH%yAN!Cf22-)<*D?h z7*og0&QKLO*1nJ7?%AbnNY{2(OJt>V?~Tf$%h?GoU+|p|F literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalWeak.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/activationCrystalWeak.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ee0b77fd428f8916f9d9370494a9fd8e41d964 GIT binary patch literal 765 zcmVd4I8pr?u03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Lo2L_t(I%cYacPZMDj z#ed&0Gi`xBpinSWgklI3B9ux%UEoF&mM%<;(ZroQ{umZ)NR06n6XVY48WM?#yyX3m zfFfX9pmc0IFrD^u;S&X7;@#exlaq6QM@T98pHYuntVM1~Beze9s$-$hJo!i*btnFG zu-ly{053ekcHcgDZ z6na-T6_X|%(@(`;0?TbTWFlNde0G7F>Hux^wP0B&m6f1ryc&9g$XjG90z}sxG)z7b zKQqYNHhanU>`YlW91bGUc4R8W=U5z>HL;|i+2bOyoyA_5W8N&K;dcj%t=Hsk@PML? zPuTtd0*PPRgrZUA-p%l(xP&vsI*Fvgrjfy|72!%&&^hx=r~ujY7W%FvW94wBc0p08 zztl}3lcBk-6~*mF8U|I>)qEHpA+eoC7Bo5m1weC^W6J_*b0553qPiyDtut z=nUYi@=%DyY3#iMx{f>CiuV1@b>}-+i^m}t#FcO#4bt1z>vFG2#avxQN$#M!im9yh z~wk2v0s1$D+Izy(2T(IPpjYRx*jYpG5(3OS^9A`q0uLKI&d%8G=Se#D&^Z&m+vuZ+HRKZX4s1H(IOQCWu8 SgBn1i7(8A5T-G@yGywo}^Eqq) literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/tYf5ft9.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/tYf5ft9.png new file mode 100644 index 0000000000000000000000000000000000000000..052c7ca352a90303bd87cb43ba1f634423d48ac9 GIT binary patch literal 291 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 Bm_q;n literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png new file mode 100644 index 0000000000000000000000000000000000000000..e22b9c40349441ae1673097274da3d2b689e1af9 GIT binary patch literal 985 zcmV;~119{5P)VGd000McNliru-U0^#01KC)vA_TT17=A? zK~#9!?U>I}+g23De^aX>er zR)X9SV4xL1JGA`@dyvdPs|d>*D6Wb}7y!z>>$UOE;S9MyTQ7l=Lc9q69(eoEZQ9M} z_rYn~j+q8ije!KHXZ)Ps2i1Y_1!QWF+_G)CUFdkw^*|qjo4hCE+7JLxn+K-@jW0pJ zJ=@mK+W)Qt#sRN!4GHLGpyR{LKlTl`<{)J5jK0BO>*H5Nc(s6U!T@b$UvD4y&wN!dV@>xYJ>3By$XpfO()| zH}4-pdjX=QUa8xJP6<*CnKxD!+F7W62T2}u3v&P3zVUr%-Ug=*{_%8(qpGZ6nls>5 zz->Ub0%;MV2ataW;cKXV1F8;w1ZeRIubx;P33tB-s1x856 zi#F#ofR}*t2BP~={2jbw=w@xA_&X33K{r5GAiE9zD@f+S1VG#V@>@V`t4J^f0;$6n zkd*92sz9eOvkl!@sL$Cb$Zgw_sOr6b0R(^BRMBnV2vieHkNZvunjtvdDIj3}xBieZ zPy(t7Ism4?G9`|JUy082%d?=Kaxl$hQ1|5$^f7Ygx;*6md8|#g_+97(ZwgKg#)+Z0 z2q%U^4fZ929x?ewNN|%=U}UCb6sAT*Z~{cIU*yzB-{hx`mk1C7ga9Ex2oOw?5xNNF zOU^vV2wlc3onJ@!|NY7oBQ(yh!H=1xVe1(FywMmeiGWF2h(v(kCX~SmJYTr+DWFfq z=kdtPppo+cDT7xpgC`hv+&$`(COtCIkwejIB7z@?+@(b9Q^$XH0w!f4t9^R3Iz*(D zq<|101PB3w>;E+q)@s&mP1Y4-n00000NkvXX Hu0mjfAnLK& literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/BoulderFist.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/BoulderFist.png new file mode 100644 index 0000000000000000000000000000000000000000..92839932f539f9c99c14e1429c3d6bae1f31f378 GIT binary patch literal 4025 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..6be1c2b51ac0692f5cc0efc05f8492bca93b02f3 GIT binary patch literal 1948 zcmV;N2V?k&P)pF2XskIMF-vi0T(hDhDqS~000L&Nklw`^?_woVEY!>LlcszojD2c=`!?OZlCQ(`yEW&;6j@dT=fMw?#?RFb$Ev;4y z?>*l8RRCCP@!sQ{qu1+cvnhkYU>Q=dtOM?KAJ7fn(KQ$puox6&paTjDDy>jnxn&{% zMBu=O-vjXOi`aO#-|u&u4T=aUB|-?RHXcGiM2IntJ-|6Pnj?}>R1>HoA{3PL`~6P+ zj$1!s->dgud+#{~5|K#6VDRFJL|W1!p?t#KuJ^e+)J?j9`@jEXuHU!!cNggZZ;dem zkWxZKu-1;p4KPhOSZl|C06e+)>)im|ZnwYkq1|q`8UDAV#N+VlD5N5hM%Or^Dp4X1 zOC(YeCi4L2{Ka~HqjYJE!8wPjl2W29%kjn=KvsG~6At};zq`@q*U0R&bWl--46!PZ z5-mp7H#Lx@mP8_|X)*v(N@Jxi5`@1s)@%Uq-jAzH42AU!z1;Geh*lm>WX5rh^k1fkSX zB5X?wfLJHRn{IpO-H#l5?5O+qiIdvUP!n^`Ic~V+W}ZIs6i**{ibUe@-h%`U=brrf z=6CPj{WjoVlL9a^KYNwMGG#IprO*Nq z!QpUXi9kgF6jVT9*Pb`c0!Xjdn+9T@=fe#Y-L-Rm{)G__3t!xK=q7-lhiCrzdR_ha z@#DH#%zN*NF|MlqHgoB}Kl|6;CK8U3@cYW!ss3nPAmpXMWED*8JVJ>00dJLUeth-S7_aF8N@kR<} zm0+y>{Waa6X@)YS(5fzW0xj`?Qc(ed$5ClTTUt1=474B+n2~ABc5l9^DN;)7C{R@? z%W~E4o5>@`9y?lS$xutCr88=vL|M`S6_K(A#UL0lSS*4eqfJ3YMYa7NkmtGddc97b z=c}^(;+eAw@aAi;kvji)zynpD=hdq=YN9x7T}>JcLMAN?7Ev%*0u_NsMMcm^CK;WY zB`!+{?3mlReB$H+s){j&5CTj1g-sB2sTW)~#`y^uqI~Dz-BVPEb3Cq#@VcaP!2v zZdCnkw5Hqb4z}F`v~FXYJTU47JTU}PN+dT$_UYTP{}JK=!Td!je*dSf_8fyr*K9cn zJ^}g!yza8tTHCnw$kNslLjVy(K&(e+1a%-wO1cIp7cLzmO|t0WEK_R?F(qCyhN#Lz zpiz~j5cqZo6T4@OvGxE#8jmohJ|IzyR>-UnuLg;b=76c|FBt%nod<}pcQ|BUQ7}je zM7U)z;J|Rmv~ybyfnqo$govxFzLkd|QeMFH71;x_1okDpq~*#)PqrewtcnM`bIfEJ z)$%eg14|Qf_R0{Db_>-+Q556jun@v1G_pC$A09#noPJ2t!rARjvg^ z{x1`y8^p*vYO7MM=sN51DPz{9x+&+laWG)1o=Nq02grbbWZ9Jy0@Kz)4M39+()hFm zX8ihph02sD>h-Q>hyobaKwL?Q(Ft%W%SI(?O1KsO0JV*w7z}{8t}uGuds@bfO5-{V i5|A0Qr6aA&E&l_cah5E*<3HB`0000VGd000McNliru-3bd0GZ0%R7=Hi&0y$m(XX>2`O-R|4-VVkyOZ?Zz4yM81sNbf*ns$u2ycP# z)DIhw`!W0Z(k_VddBArdE&$9FQ3J58zNheVnEzgt%o!=p151uJ2qc{kING5g6+z(S zBE;3yr;g7FD{I1+S7YH3!6Rb-@qQu*!kUCTXo$tqX%85(ZaW5v12hm-8la$ZMIl^N!K(<_;6T)3R4pY3Y1ZabO zO`1A^&U?M|6t@qkvP3jz2(_M?^+NF=Y=Myn4;owCp@O`8)|Y_wt?p`#eGf9MPla?q zI%qVi(dcs4U#c6)>BP`Oc>NIz=={6+)lc6DZq z$38}*jBbyVre=y?Cjg{_v$G5A?jGwVzyjd6+d4Da?PYwL&6EHgu6bfy0~G*pxGd$5 zdwW<+CWSHp05G4!pH5+=Tw^e>FdX_u9$F`xMFP1IO)z%=UV{<2Q?)Md3uF=j(gu3~ z!h?3u+LrdHwU@ASd9CY_SRb7c*b8Mq3uFW212q~TTOcp7WBeqziO|aCCp?mS_-Xe4 zfK5bP+JX|u>AcaGp?|jfm)J4+GE~CIu3R;`mMBr8#O>iPmXLN572)#k00000NkvXXu0mjf?aywQ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/FloatingBeacon.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/FloatingBeacon.png new file mode 100644 index 0000000000000000000000000000000000000000..7882bb35971c2b3308580084ff7e0a8116febfd1 GIT binary patch literal 805 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 Y3yrpxMfrf2L;wH)07*qoM6N<$g1fEc#Q*>R literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/Pedestal.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/Pedestal.png new file mode 100644 index 0000000000000000000000000000000000000000..818dd50a5031b5099501d8121ae1efaff3af8cb5 GIT binary patch literal 1219 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 JPDHLkV1f~wyFLH_ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SmallEarthGolem.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SmallEarthGolem.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e5b8a74f4279107410b786d86f69c6242b277c GIT binary patch literal 765 zcmVpF2XskIMF-sp1{FF51tHUs0007!D8vq4x>j!t;yB_QB4045B;7<-)S7YtATh(x1Wu^cZ%+sJ+ zN(g8D%>nBe$W;pldr2yT5v=a)Q&G$A<&#*QFacyU1^7co1glyw;8Pos8EJY+DxRI( z6&Nz-H%bIwE;TR;!whONk)fBQGqSNyQ z?1k~F&g2HD1IxW6{dzFQOc$s(q4PxOfqB)dDr=1~pZBYW);G@#2e}n00*Z386JrFP zzMrxo=Q?c-3kcosyTS%W>m_M%rf6H$VlTk%_eAcl$2u58Et-sq%ueO17T00*53VGnlk06w{9MI_+p=b=+B>Ep#=WGlF?!UDiB46+$!pv z9?XPToZ<4o9te6GC3;fVKLVi;b)(LmMq$9c00000NkvXXu0mjf4B}hD literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb026bc6153cf6b2b48fee5842b92adc7377288 GIT binary patch literal 1833 zcmV+^2iEwBP)Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-U0~|2|DVAw8sDd2DV8= zK~#9!?VC?*99JF3KfjsTf8LGPt>ZL6%z+cGgb;@!1RP45sFJ5bNGNK>g(8A-tA<;sKpfbpRidO^IKUxNkQ%`SRMRviiQ~0*Jv+Oz^W*S#lHKwCn_b)4 zCHs{u?R)d)&Ai|H{l33H^DK0MzR0V;dnxlCK%=QNLjhpR3-KE8nR$zB%3Mp?=GyDO z@r8s~bzN<5UoDjmeGaEfgTW{q$cJC`c^$vXwr`Ls? z17!~sSjfTsiupa45`s{8;RtvQs0WHnu?F-MKrH}2fMZ95AXMhF;E37v;v8%|QoM$8 zqG+-0Df%LL`H*UohhMmJGS*W{ynu1%umBX6VkG!g$5L!j%3jDnK2@qUWye=GJ>@}F zu`K0~z`@9Lq3#Gc>+FpAxDKCF2Nb2W$&$AY}{B&nZC&3t3^Srlc%5 zl9h=Mge-vV8f4-6UJ{v@Q35t=GA6&g)Y%$SU0+9?~n04jCG z58$&!!w>g%1}{D$tS7sdd;#Om;hep)H-b}G1hxd406NbyizUVp_|C;K zXeYhd@nywn{$Cs^$}Hf%j0X>H(*b@Zm|>Z<#}9>UyM7hQE-y*YqPBfRgQ z=I0;3^002GbfL zm%3(*=P-TWin+`8&%LddfV*K#>ek9!-)Gz{hy4Br8D0DDsYGsgVtw?Vew0zif*oIZ zr%lDXd7X2|uM?_bi}0&^$pp|*6m2K5_=CC;U_W;`ZUAJ7`D-=@kIkor5UAD1G=V`S zvBNBkh9T?*@Y~JPJ#9W}|Lmhz_}+8ZI8jXQ4xRYU5Axx0A@tIiXx^>?(GYkIU$B6e zTF?92lOn6>=xkr5vk;p|1CkUu+l6qL8uNIrGm&8TE^-vJn-~(j6lSV`sWNm2+!w)lns?u4*%tE)cOW9 z2dV){vbIr*s0%q*%0D?^oll#^gZXciLV5x?;Gog%&{UG$JSYvA8W**C(CP4`F0@yK z*nS+YJ!(uU7@0N!48lmK#it38w`o6yGtP0G*(tG^2}~KH_@dne{$CGr&oILb2ao>& Xdnv-ECL{}e00000NkvXXu0mjfV*Pdn literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png new file mode 100644 index 0000000000000000000000000000000000000000..f079a183cfe4479cb263ab0e21386bfa3d555fd2 GIT binary patch literal 1721 zcmV;q21fabP)VGd000McNliru-U0~{FEzL&Kt%um21ZFl zK~#9!?VHPQ8&wp>e={CGV#j&8p{df802Pl`LM%`>WrJ8$@~|xeflyUiMe06(MfQ;@ zp(;W`NOZ%3DM$#~J+J^31c)jrp{0-1b?n&jV?39|or&%7_%U{z+O3ZiHFxITYv1$u z&Ua336+A?o;7sZm-wGA9BIFV73JaM_dqSniJ@JFTAFGr{SHC^VjDCQinE}U>_uacPr%GC zP??16Jj{RT-vc(F&U%X+{2t9bfZPnI71(_qw8!=D$`SdmrGii)IK*C{HG5%&pc01h z2h!b3(=c@tigOTs3^@zb5~PoTwhQ6}G39r1em?w?uGc>>4BrRnbq^JZZL=;AJQdDB z?huq!*m(&i{(wLh3eyr4Cx4ZzgSp|x0B!R_MCul#V-oO!TaaIea2Bipm=PG;gm4P- zFT&U(2&ADh17gC)1Pihuc6LsH83baGI|^1%W(NnUS8eMwSj`pB?)TRWV_)`Y?g2AE zN*+GE1?5@D%-gB%7E}^oY7n|FaiJW6^lMOvgI1DC0mvSQ;t^2u5Z}6k+>h)%_#4B@h-Cp)dilf2Ajw(=hjy ze`G(<5Kv7Bl%&==SP>a0;Z2B6O2pSv5ZQq6T`0_ehyrE#6JH0i zGK)lW!w>>*B1#Ec8#|KpC_?6UOOak6f)IKDg?Z^M+9OG!tjQ{qFe4xo2v(pHf?^C* z3ueD>9s+|vgtVET8W#vi0BHp(0Ahj#5^P6*BvUsp&a85ihff6+-dsa0U9F}LuXJLZR%xk|SRA-w=~;MU_kh)!2EwXg;2w7(Uh7tk;Ygc`n@YN+ z9kuLr{RjgFK>?R^y^c7z$DQ`%y!IJ^;E<%l5fO4*vKi-gSA@-~#)Wep;CBHw->L`A zhItoUYmQcb-TDrp7G=k&JRt*EDajs%6^7@2@DI3JH(K*5i#x3v8`pK7F0BykE<*e_ z$RC2}Iw)n?!?c23R)a}h7xGIRZHpXtCFoTRF5y&z>{Wv+_T1%9S3tkf*nUBwZcg3X zW!qH+=k#~EvSm;>3`-du67bn$gYpbq+|_+4b1w_jTCCH4fZyK0`)i2nx-OFXjRwHn zTvJ3+*TwZVVCu+uP3OE;HNeNyx_$UAJ)kjG4Tr$kLpfe(IJ4mfsZk=8hY8muddBBY}*>vg+NCgld&G~E14Q!6ScLq_3 z%HJ=RT4$XrrhFze_ym6n(5kU0LCXO+_Xl|aV5@Z5D*;j}pqQX#fbrII$Nz-FVGv;; z-a`nqYl$6XW7G=EKf0b9Zyxi`_`Q=lS4;!ZML=tA%eTwnZY4Nr&;13ReLV?L2Xf?y zz3!;JFV!Zi{W*2xIqDm+zC6HBle1O{2k9|;d!2O@+jz)s!fs$daK$xVwx2jeNbgh6 zQEOHUJS$C6jUf?tI4$f`bPY^DV8w$zI~dadydKZH1zT-D=w+)E)u}AI#@Ac?CCae( z*Xu}6cP=roP0?1KwWoj@1$T=%+91b#vk-7BUl#)1V!{T9q^^sku8R#2?r|rU@>=JN z2figXYKlJN(p6Kmld91xEp4tL#25Ale*o4BC@;XVuQ`zGG@dQ7ZWeWVk)o~k7m?TN zo+J}=Uykxy40+}LrK>tg9pSXcZ=XgeQ*ym10eRpXupWUDfQ?g#z@_fVOwS(Rr)uk_ ziAoNvySCL8APnLkd3XRNH~<*XZ}GY`Z P00000NkvXXu0mjf$Girc literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png new file mode 100644 index 0000000000000000000000000000000000000000..33b61d44cb62c30209265c76bfa77a2b75fcf755 GIT binary patch literal 1481 zcmV;)1vdJLP)VGd000McNliru-U0~{GZy?cY-#`i1y)H! zK~#9!?OIK28$}fUX1z&pQ%XaVC`xLn5*1Q=Xb~0W0ur2%b{1}tIC7}uLrzEpAtBLY zq2cO7Bo4m!>Ww&&!ZAW>g-{P%h-3kx4JpA5rH$>!VQ1Xg+5dIy>?VGawL7~rv!3_! zy`LF|0HVuy@68SRHs~D=#C5{^c>zi||E7^%LtFMg6{Pe*hxRa`ICtUWq;XwA0{i+-3 z+)ge7AxZ1YPH4xdcZJq~Rs)n~fMkT!1StVM0FmgNCWw*tJV+oEHAkQZs4A`A>y)(L zn2K5t7&M?bjG*Qy$T;yDpi54tI7tpV{>U{zqN+q#y`6-D#w8t_k8Ci4;zG+o$B!`} z4-A-Hu|0u<-cA~d2F)`D!GgHMaUi5iGA!m^U-o8%LH*X39aKIF*mSuLwBGXO9=?9p zwK3mHyMQWTZ*1_ne4=kxDZM|}vSh4(ky*?xHz2sCwO7Rx83^$q)f~;R zT;QY>MNJfhbaSd4l6B>#9>t-Tqs z6D8eWt!`(^Dt#uPS8&r*bfc=sNf|iCfS8(t&jjkW-vlyZ0;_HlMVUZcS=-{AqD&y~ z-e6o5J?WIGD4HZ|4021Y2I&2ZgkBqP{$%*z5}|Yk`0-MFF>_dfR;HbyL9#~b03~rU zxw8v&j`)a`(Q1IKg!MQz$&r$lyFu!PXzezK#W~50@XB{Y*M4^Q5REB-l>lpjV4MOv zZQ$znL}`!e92x_H+)UDtG-(l)Dd!DIl(i?9fQfm)d>LS74lrQY6m)1RjXe(w0}A7! ztYN3ad0l8&gjn4W$KmR>Cu&T~7*;d}#8LXw;sqm_393a=c^z3Ca4aLiu?ZA}WPG8T jz;QjuJ*F{@Y54R%ByrtsSoYAB00000NkvXXu0mjfpnjvY literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png new file mode 100644 index 0000000000000000000000000000000000000000..6270aa80757c2791d43613252fa771a3ebc088cd GIT binary patch literal 1679 zcmV;A25|X_P)Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-U0~|0wIGJq~HJm1{_I5 zK~#9!?VC+&8%G$&f4kb1Z7Ejl*p5vaL7}&PfEGeq=p~`MJsAu+hBjbm4>=Scdg=!- zxfDWcXu*db+!S&t5}~EUg4WyTrh?*phW7&%Jy4vYswAO01T50uSOR*j>(u`(C zJI~wv|BuEBJ|f=cnzH)teE??WK~*7t1jQpcK#PJJfpVcf>DEJqkYbpoaJSQ`)QPX5 z`t~Z!py?2shDup(R#oL6fTn|{!NoUVGR`QA=DYvD_z_LtLXX119#DnE1+c3isxTFU z{ap|i=#zEDgp~AhrLiM*@@uqy^5_IO&NRCSmIZoLzS_3*3QdP|3CQPOFAq4DiD|f? zL+%g|kjp~soK(b8QYs>sb@E1BdBjnu_`Rn$TC*~2(&Z=PvQJT= zkgJW+WWNw_bO5CS++->K*}9cy=b>1T zedVI;k4{4Fr91`ZF2eo`I5!P1p4JlQg7lbAe^G`!2@057g6wlB7GWYL-5z8(EG$7j z57}Mm1x~-PrNYk7)cb5pwsScszJgd{=z);N-VV$qVR{y(Ea?fBRRcZ>D4Gn3=!A@Y zMU{xKT872TfC7^Vn5ousf&%dwC>((;M&K9}0$x6qt{qW8)$0(qQi3Os8)wYU*MU#I z3{@MRWg5pUT#^`}TpD^Hr19AwO)eu~4#+A{1rQ06%yFRn!=Z;WEGUoa$LB}`q0A;? z^(PYm({r4d&X})KIAfe~d=c*088#r)0EIVJTKiAXXCv(anN31vDn}8HCpZ@H0+3_i z5(32V{Z-K`5DHqu*8|)x?SAi-PREU9>Nb5((1eoT5b0fj@1%_8uU^yinL zT)^0hbX8AK-4^S#9uT%RaD5Z;z%+$nZZ~0u%%&m?(-aTdAj)HfZ|v7LUu)ml!Pts) ze+o3mYO3MI(Q2}3&ne$#dVmQlygM7+5t*{2_>hNdXG?gO8l z9MdZCy8FA$30gnkrSH6ug^@K+`$51jQC{K|npJv3z+1r$Q_&5oB6o|=$2q`LbLc1p zQavajFa$cN2L^>ex9rd%P(e(zABk{W6g}(GRZ+BC4v^VIBwt;DXp~HJn`G$&&?n%N zU)x`&84%Fw>X)IOSmR6_rfc^N6H{OpPuBxZgbZz76 z9NiBDGXwR2Fh$O8il|`K4_vDtBTtWjuEJp%viZ}`0fQF5OH*O2IVcYp3C4D&6wr=b zISA36bKIygtYSt^0d2WSU;b@wh{dtIyC~Yrb)4}nv2h5Dm^k>t9RjcGMeebTWh{f2 Z{{b~BP<=e&rZxZo002ovPDHLkV1i6>43Yo< literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/WaterFloatingBeacon.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/WaterFloatingBeacon.png new file mode 100644 index 0000000000000000000000000000000000000000..b545bbf048f7fa8acb8c48e269b7bd91140b333f GIT binary patch literal 543 zcmV+)0^t3LP)VGd000McNliru-3bd4G!b@PfqquNEn=$ zfRH9gpTh|jxuflIM@qflbbXJu_g=aG|BfMzAR=@Zz}+d^i1(+2u)@c?@`EaaD!nm88COVxn!pQ4f?m?f^I0sScn zMQ)XoiD25jS=C;LYwU1`^ag|#aUn??Ov{^4drj`(W%BubNPGUE%GQ(a2qvy8E_H!j zKHpuycwR;AHM&DF_5n9D+W6}xRb5B?>0}QLI0m&h;12%=c9gSLusgX3uDo34%Vs7fmj#z<6GTq-}P7n?Q54%fAGwbcu(_3(n%L(;(e8&RHF!@|*=k zMC=u#neZ@_xA>!L!1aaK4zA)>?=7QkS`I}JkyPk{h|1pp6IN%jSl(+jyL_w&8b;6V h!Nh*wVzF2bz&Fn9DSFY|z?A?1002ovPDHLkV1jHZ_K*Mo literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedAngel.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedAngel.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae2cfd584c3a62b07841b88b374e2d1af7e2086 GIT binary patch literal 3549 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 Xut2vg5yR&i00000NkvXXu0mjfEE~6? literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedFireDemon.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/WingedFireDemon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e365babb59fb7b940e83973bdc14b72c31fee8e GIT binary patch literal 5121 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 j^h{nX363>00000NkvXXu0mjfg>|Lt literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/WritingTable.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/WritingTable.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa176e43e0902744d4585bffc51a7c53d0309b7 GIT binary patch literal 1851 zcmV-B2gLY^P)pF2XskIMF-sp0v03{LG#rl000KsNklVr^#)Ty#Iw*pahHC!AB?z=zEnW32T-Y$5(Ys-;B%>6d^zIT6|Gc(`$&de1mKKMpw0K*h$lJe`n55f!J zgKu`$k46fDnqfc?Xkx%Hnkc9N7*T{V8)nr1Km<}0MEo8QVmQ8*4Wd8@zMa*eXo0Oo zpcLbme_cJZ&)c_e+r4}DUSlom@uLz>Jr|RE((@{iule^CEyL$npCm z2tgoJ!$1Icn2pDq3SxexZrOk)Kof?~j;~$2wmCmII5_p5x&hJ; z-dq|?3}YY!qfJT>_|aRP#R$Lp^lT>dgLxE#xWTxQQvoxNdL;lM2xiUz2_Ogp$A*be z)Zf=NLQ|tYWMgL;Ianz>op3Z7T8!BE_4lq`<>DJ}P)cDK22x6!{k3h&_3PK^x{eql z`%j+m$B#eWTu=L#-=#~5u@u@E+0WU3=Zu=cr++w;0dHMO91cn@&?KQt!jr>7P^W?! zG>s6}j;PL9J1SI`6oWAfkslSggLaIh+r z0!@N3yEag@AqF?rs?pg%)KfwYB8Hg}M9^X!nRxCS1vO#J;oKK& zF9WMV5rbTeT#OKeDH}l`D~K3T+>jx=Q-e4o)I9G?f#~WI+tZ>{US3xg9*@l$t&1gb#B8Q=?>KoQ%W4pUq`m23-ip zTvG)C~>r?|(;r|GSSq`rdOXB()jJhKZ3U!|+lVgP<5G z30sXzcrM3=N=+9LhzKfdSQo2~SZ&Ti@c%-982!Gkd1V41@4vmYVe;s=P3_Fo+uAM` ze)EsB8=?2#?#uu!9<3C-rVHL2b**^xw9+2vvq!ZH!f1w;^~r zTvUUwvkd&=Fa0Z(f@EqWQA{9D{w}QrcH;ah&?Pt;{Qj`W)9|iJZScjDfArI2sf| z*jfnFWRwhDE1NEF(F#%FurIWYFsM;Z3`DV(0jo@ydZ&@9AA`V{3j!?KP}lwf`hXXm z`kvbfj@|~xIt}(?6)}vXq1N}{5%eH?Q?%^Fg)F#}hDj^?+}O1i^rLM?mo~}f{}kn= z2e(rl@TxDkuoZnoHE)XrNYT|@M3Cl~-bHOQ2lS)s{**xsLUbks0p(cqmR;E7e~Q9Z z7Z@fZR$X~z5&ZGD7Isi4y6skYIv7oWu^4R>ioxM%Tb2Ag(kX?_LI>>HqFv{U|O$tIMvb!TsQ~NGM_Q+$Mc1LKm>Jt! zTm1InLwTJXaB3A;b{$>Uad3D@KMX9ojt~NeM@O$61H!YzP2&dFGS;TV)?z^^g_EC} zUK@w4?fvsB?SMy*9`$Y8 z()aywdz%u|H2KGg8u^?v(=>7O=1mJB@c8j#_V@Qs)se511Fl@TvIDI4_V%>0p##$1 z-ri@=d#K*G{qW(#&*nNZW5$dbGyb=+ySw}C7w!aS%$PA_#*7&=X3Ur|W5$dbGiJ<~ pF=NJz88c?gm@#9v+002ovPDHLkV1kE7a=ZWl literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/altar.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6ac12e2fc7b3b2884e97a899c6630c43da9e5a GIT binary patch literal 59034 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 O0000. Subcommands are tps, track +commands.forge.usage.tracking=Use /forge track . Valid types are te (Tile Entities). Duration is < 60. +commands.forge.tps.summary=%s : Mean tick time: %d ms. Mean TPS: %d + +commands.forge.tracking.te.enabled=Tile Entity tracking enabled for %d seconds. \ No newline at end of file diff --git a/1.7.2/resources/assets/forge/lang/es_ES.lang b/1.7.2/resources/assets/forge/lang/es_ES.lang new file mode 100644 index 00000000..b7c198ee --- /dev/null +++ b/1.7.2/resources/assets/forge/lang/es_ES.lang @@ -0,0 +1,5 @@ +commands.forge.usage=Usa /forge . Los subcomandos son tps, track +commands.forge.usage.tracking=Usa /forge track . Los tipos válidos te (Tile Entities). La duración es < 60. +commands.forge.tps.summary=%s : Tiempo de tick medio: %d ms. TPS medio: %d + +commands.forge.tracking.te.enabled=Rastreo de Tile Entity activado durante %d segundos. diff --git a/1.7.2/resources/assets/forge/lang/fr_FR.lang b/1.7.2/resources/assets/forge/lang/fr_FR.lang new file mode 100644 index 00000000..bd01daa9 --- /dev/null +++ b/1.7.2/resources/assets/forge/lang/fr_FR.lang @@ -0,0 +1,5 @@ +commands.forge.usage=Utilisez /forge . Les sous-commandes sont tps, track +commands.forge.usage.tracking=Utilisez /forge track . Les types valides sont te (Tile Entities). La durée doit être inférieur à 60. +commands.forge.tps.summary=%s : Duré de tick : %d ms. TPS moyen : %d + +commands.forge.tracking.te.enabled=Trackage des Tile Entity activé pour %d secondes. \ No newline at end of file diff --git a/1.7.2/resources/mcmod.info b/1.7.2/resources/mcmod.info new file mode 100644 index 00000000..e7148b21 --- /dev/null +++ b/1.7.2/resources/mcmod.info @@ -0,0 +1,16 @@ +[ +{ + "modid": "examplemod", + "name": "Example Mod", + "description": "Example placeholder mod.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "", + "updateUrl": "", + "authors": ["ExampleDude"], + "credits": "The Forge and FML guys, for making this example", + "logoFile": "", + "screenshots": [], + "dependencies": [] +} +] diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index ee98c2d2..af5709e0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileEnvironmentalEarth; public class SpellEffectEarth extends SpellEffect { @@ -30,7 +31,7 @@ public class SpellEffectEarth extends SpellEffect @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub + parad.addUpdateEffect(new ProjectileEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java index 0b9f2623..de3ca561 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileEnvironmentalWind; public class SpellEffectWind extends SpellEffect { @@ -30,7 +31,7 @@ public class SpellEffectWind extends SpellEffect @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub + parad.addUpdateEffect(new ProjectileEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java new file mode 100644 index 00000000..7408fae8 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java @@ -0,0 +1,66 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileUpdateEffect; + +public class ProjectileEnvironmentalEarth extends ProjectileUpdateEffect +{ + public ProjectileEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onUpdateEffect(Entity projectile) + { + Vec3 posVec = SpellHelper.getEntityBlockVector(projectile); + + int horizRange = this.powerUpgrades+2; + int vertRange = 0*this.potencyUpgrades+1; + int maxBlocks = (int)(2*Math.pow(this.potencyUpgrades,3)) + 3; + + int posX = (int)(posVec.xCoord); + int posY = (int)(posVec.yCoord); + int posZ = (int)(posVec.zCoord); + + World worldObj = projectile.worldObj; + + if(projectile instanceof EntitySpellProjectile) + { + int blocksBroken = ((EntitySpellProjectile) projectile).getBlocksBroken(); + + if(blocksBroken>=maxBlocks) + { + return; + } + + for(int i=-horizRange; i<=horizRange; i++) + { + for(int j=-vertRange; j<=vertRange; j++) + { + for(int k=-horizRange; k<=horizRange; k++) + { + if(!worldObj.isAirBlock(posX+i, posY+j, posZ+k)&&blocksBroken entitylist = SpellHelper.getEntitiesInRange(worldObj, projectile.posX, projectile.posY, projectile.posZ, horizRange, vertRange); + if(entitylist !=null) + { + for(Entity entity : entitylist) + { + if(entity instanceof EntityItem) + { + entity.onCollideWithPlayer((EntityPlayer)shooter); + } + } + } + } + } + + + } +} diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb026bc6153cf6b2b48fee5842b92adc7377288 GIT binary patch literal 1833 zcmV+^2iEwBP)Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-U0~|2|DVAw8sDd2DV8= zK~#9!?VC?*99JF3KfjsTf8LGPt>ZL6%z+cGgb;@!1RP45sFJ5bNGNK>g(8A-tA<;sKpfbpRidO^IKUxNkQ%`SRMRviiQ~0*Jv+Oz^W*S#lHKwCn_b)4 zCHs{u?R)d)&Ai|H{l33H^DK0MzR0V;dnxlCK%=QNLjhpR3-KE8nR$zB%3Mp?=GyDO z@r8s~bzN<5UoDjmeGaEfgTW{q$cJC`c^$vXwr`Ls? z17!~sSjfTsiupa45`s{8;RtvQs0WHnu?F-MKrH}2fMZ95AXMhF;E37v;v8%|QoM$8 zqG+-0Df%LL`H*UohhMmJGS*W{ynu1%umBX6VkG!g$5L!j%3jDnK2@qUWye=GJ>@}F zu`K0~z`@9Lq3#Gc>+FpAxDKCF2Nb2W$&$AY}{B&nZC&3t3^Srlc%5 zl9h=Mge-vV8f4-6UJ{v@Q35t=GA6&g)Y%$SU0+9?~n04jCG z58$&!!w>g%1}{D$tS7sdd;#Om;hep)H-b}G1hxd406NbyizUVp_|C;K zXeYhd@nywn{$Cs^$}Hf%j0X>H(*b@Zm|>Z<#}9>UyM7hQE-y*YqPBfRgQ z=I0;3^002GbfL zm%3(*=P-TWin+`8&%LddfV*K#>ek9!-)Gz{hy4Br8D0DDsYGsgVtw?Vew0zif*oIZ zr%lDXd7X2|uM?_bi}0&^$pp|*6m2K5_=CC;U_W;`ZUAJ7`D-=@kIkor5UAD1G=V`S zvBNBkh9T?*@Y~JPJ#9W}|Lmhz_}+8ZI8jXQ4xRYU5Axx0A@tIiXx^>?(GYkIU$B6e zTF?92lOn6>=xkr5vk;p|1CkUu+l6qL8uNIrGm&8TE^-vJn-~(j6lSV`sWNm2+!w)lns?u4*%tE)cOW9 z2dV){vbIr*s0%q*%0D?^oll#^gZXciLV5x?;Gog%&{UG$JSYvA8W**C(CP4`F0@yK z*nS+YJ!(uU7@0N!48lmK#it38w`o6yGtP0G*(tG^2}~KH_@dne{$CGr&oILb2ao>& Xdnv-ECL{}e00000NkvXXu0mjfV*Pdn literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png b/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png index 767fb339f418d25edb6806f59ef8a8696a6e41a3..f079a183cfe4479cb263ab0e21386bfa3d555fd2 100644 GIT binary patch delta 1699 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 Date: Wed, 19 Feb 2014 17:03:56 -0500 Subject: [PATCH 21/33] More changes --- .../AlchemicalWizardry.java | 186 +--- .../alchemicalWizardry/ModBlocks.java | 13 +- .../client/ClientProxy.java | 16 +- .../common/NewPacketHandler.java | 796 ++++++++++-------- .../AlchemyPotionHandlerComponent.java | 4 +- .../common/alchemy/AlchemyRecipe.java | 40 +- .../common/block/ArmourForge.java | 1 + .../common/block/BlockAltar.java | 9 +- .../common/block/BlockBloodLightSource.java | 2 +- .../common/block/BlockConduit.java | 2 +- .../common/block/BlockHomHeart.java | 2 +- .../common/block/BlockMasterStone.java | 2 +- .../common/block/BlockPedestal.java | 2 +- .../common/block/BlockPlinth.java | 2 +- .../common/block/BlockSocket.java | 2 +- .../common/block/BlockSpellEffect.java | 2 +- .../common/block/BlockSpellEnhancement.java | 20 +- .../common/block/BlockSpellModifier.java | 2 +- .../common/block/BlockSpellParadigm.java | 2 +- .../common/block/BlockTeleposer.java | 2 +- .../common/block/BlockWritingTable.java | 2 +- .../common/block/BloodRune.java | 2 +- .../common/block/BloodStoneBrick.java | 2 +- .../common/block/EfficiencyRune.java | 2 +- .../common/block/EmptySocket.java | 2 +- .../common/block/ImperfectRitualStone.java | 2 +- .../common/block/LargeBloodStoneBrick.java | 2 +- .../common/block/LifeEssenceBlock.java | 3 +- .../common/block/RitualStone.java | 2 +- .../common/block/RuneOfSacrifice.java | 2 +- .../common/block/RuneOfSelfSacrifice.java | 2 +- .../common/block/SpectralBlock.java | 2 +- .../common/block/SpeedRune.java | 2 +- .../common/items/EnergyBattery.java | 16 +- .../common/items/EnergyItems.java | 5 + .../common/items/ItemSpellEffectBlock.java | 2 +- .../common/items/ItemSpellModifierBlock.java | 10 +- .../common/items/sigil/DivinationSigil.java | 2 +- .../block/RenderSpellEnhancementBlock.java | 49 ++ .../TESpellEnhancementBlockItemRenderer.java | 107 +++ .../model/ModelSpellEnhancementBlock.java | 334 ++++++++ .../common/rituals/RitualEffectCrushing.java | 2 +- .../spell/complex/effect/SpellHelper.java | 16 +- .../common/tileEntity/TEAltar.java | 15 +- .../common/tileEntity/TEConduit.java | 6 - .../common/tileEntity/TEHomHeartRenderer.java | 13 - .../common/tileEntity/TEOrientable.java | 4 +- .../common/tileEntity/TEPedestal.java | 1 + .../common/tileEntity/TEPlinth.java | 1 + .../common/tileEntity/TESocket.java | 1 + .../tileEntity/TESpellEnhancementBlock.java | 13 + .../common/tileEntity/TETeleposer.java | 5 +- .../assets/alchemicalwizardry/lang/en_US.lang | 132 +++ .../models/SpellEnhancementPower1.png | Bin 0 -> 4387 bytes .../models/SpellEnhancementPower2.png | Bin 0 -> 3718 bytes .../models/SpellEnhancementPower3.png | Bin 0 -> 3718 bytes 56 files changed, 1250 insertions(+), 618 deletions(-) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java delete mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java create mode 100644 1.7.2/resources/assets/alchemicalwizardry/lang/en_US.lang create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 6adbc972..0b802faa 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -27,6 +27,7 @@ import WayofTime.alchemicalWizardry.common.AlchemicalWizardryTickHandler; import WayofTime.alchemicalWizardry.common.CommonProxy; import WayofTime.alchemicalWizardry.common.EntityAirElemental; import WayofTime.alchemicalWizardry.common.LifeBucketHandler; +import WayofTime.alchemicalWizardry.common.LifeEssence; import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent; import WayofTime.alchemicalWizardry.common.NewPacketHandler; import WayofTime.alchemicalWizardry.common.PacketHandler; @@ -234,7 +235,14 @@ public class AlchemicalWizardry System.err.println(e); } } + AlchemicalWizardry.lifeEssenceFluid = new LifeEssence("Life Essence"); + FluidRegistry.registerFluid(lifeEssenceFluid); + ModBlocks.init(); + + + ModBlocks.registerBlocksInPre(); + ModItems.init(); ModItems.registerItems(); @@ -249,10 +257,8 @@ public class AlchemicalWizardry int craftingConstant = OreDictionary.WILDCARD_VALUE; //TickRegistry.registerTickHandler(new AlchemicalWizardryTickHandler(), Side.SERVER); - ModBlocks.registerBlocks(); - + ModBlocks.registerBlocksInInit(); //blocks - proxy.registerRenderers(); proxy.registerEntities(); @@ -305,7 +311,7 @@ public class AlchemicalWizardry ItemStack energySwordStack = new ItemStack(ModItems.energySword); ItemStack energyBlasterStack = new ItemStack(ModItems.energyBlaster); ItemStack sacrificialDaggerStack = new ItemStack(ModItems.sacrificialDagger); - ItemStack bloodAltarStack = new ItemStack(ModBlocks.blockAltar); + ItemStack bloodAltarStack = new ItemStack(ModBlocks.blockAltar,1,0); ItemStack bloodRuneCraftedStack = new ItemStack(ModBlocks.bloodRune, 1); ItemStack bloodRuneStack = new ItemStack(ModBlocks.bloodRune); ItemStack speedRuneStack = new ItemStack(ModBlocks.speedRune); @@ -430,105 +436,20 @@ public class AlchemicalWizardry customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); - //All items registered go here - //LanguageRegistry.addName(orbOfTesting, "Orb of Testing"); - LanguageRegistry.addName(ModItems.weakBloodOrb, "Weak Blood Orb"); - LanguageRegistry.addName(ModItems.apprenticeBloodOrb, "Apprentice Blood Orb"); - LanguageRegistry.addName(ModItems.magicianBloodOrb, "Magician's Blood Orb"); - LanguageRegistry.addName(ModItems.archmageBloodOrb, "Archmage's Blood Orb"); - LanguageRegistry.addName(ModItems.energyBlaster, "Energy Blaster"); - LanguageRegistry.addName(ModItems.energySword, "Bound Blade"); - LanguageRegistry.addName(ModItems.lavaCrystal, "Lava Crystal"); - LanguageRegistry.addName(ModItems.waterSigil, "Water Sigil"); - LanguageRegistry.addName(ModItems.lavaSigil, "Lava Sigil"); - LanguageRegistry.addName(ModItems.voidSigil, "Void Sigil"); - //LanguageRegistry.addName(glassShard, "Glass Shard"); - //LanguageRegistry.addName(bloodiedShard, "Bloodied Shard"); - LanguageRegistry.addName(ModItems.blankSlate, "Blank Slate"); - LanguageRegistry.addName(ModItems.reinforcedSlate, "Reinforced Slate"); - LanguageRegistry.addName(ModItems.sacrificialDagger, "Sacrificial Knife"); - LanguageRegistry.addName(ModItems.daggerOfSacrifice, "Dagger of Sacrifice"); - LanguageRegistry.addName(ModItems.airSigil, "Air Sigil"); - LanguageRegistry.addName(ModItems.sigilOfTheFastMiner, "Sigil of the Fast Miner"); - LanguageRegistry.addName(ModItems.sigilOfElementalAffinity, "Sigil of Elemental Affinity"); - LanguageRegistry.addName(ModItems.sigilOfHaste, "Sigil of Haste"); - LanguageRegistry.addName(ModItems.sigilOfHolding, "Sigil of Holding"); - LanguageRegistry.addName(ModItems.growthSigil, "Sigil of the Green Grove"); -// LanguageRegistry.addName(elementalInkWater, "Elemental Ink: Water"); -// LanguageRegistry.addName(elementalInkFire, "Elemental Ink: Fire"); -// LanguageRegistry.addName(elementalInkEarth, "Elemental Ink: Earth"); -// LanguageRegistry.addName(elementalInkAir, "Elemental Ink: Air"); - LanguageRegistry.addName(ModItems.divinationSigil, "Divination Sigil"); - LanguageRegistry.addName(new ItemStack(ModItems.activationCrystal, 1, 0), "Weak Activation Crystal"); - LanguageRegistry.addName(new ItemStack(ModItems.activationCrystal, 1, 1), "Awakened Activation Crystal"); - LanguageRegistry.addName(ModItems.waterScribeTool, "Elemental Inscription Tool: Water"); - LanguageRegistry.addName(ModItems.fireScribeTool, "Elemental Inscription Tool: Fire"); - LanguageRegistry.addName(ModItems.earthScribeTool, "Elemental Inscription Tool: Earth"); - LanguageRegistry.addName(ModItems.airScribeTool, "Elemental Inscription Tool: Air"); - LanguageRegistry.addName(ModItems.boundPickaxe, "Bound Pickaxe"); - LanguageRegistry.addName(ModItems.boundAxe, "Bound Axe"); - LanguageRegistry.addName(ModItems.boundShovel, "Bound Shovel"); - LanguageRegistry.addName(ModItems.boundHelmet, "Bound Helmet"); - LanguageRegistry.addName(ModItems.boundPlate, "Bound Chestplate"); - LanguageRegistry.addName(ModItems.boundLeggings, "Bound Leggings"); - LanguageRegistry.addName(ModItems.boundBoots, "Bound Boots"); - LanguageRegistry.addName(ModItems.weakBloodShard, "Weak Blood Shard"); - LanguageRegistry.addName(ModItems.blankSpell, "Unbound Crystal"); - LanguageRegistry.addName(ModItems.masterBloodOrb, "Master Blood Orb"); - LanguageRegistry.addName(ModItems.alchemyFlask, "Potion Flask"); - LanguageRegistry.addName(ModItems.mundanePowerCatalyst, "Mundane Power Catalyst"); - LanguageRegistry.addName(ModItems.averagePowerCatalyst, "Average Power Catalyst"); - LanguageRegistry.addName(ModItems.greaterPowerCatalyst, "Greater Power Catalyst"); - LanguageRegistry.addName(ModItems.mundaneLengtheningCatalyst, "Mundane Lengthening Catalyst"); - LanguageRegistry.addName(ModItems.averageLengtheningCatalyst, "Average Lengthening Catalyst"); - LanguageRegistry.addName(ModItems.greaterLengtheningCatalyst, "Greater Lengthening Catalyst"); - LanguageRegistry.addName(ModItems.standardBindingAgent, "Standard Binding Agent"); - LanguageRegistry.addName(ModItems.incendium, "Incendium"); - LanguageRegistry.addName(ModItems.magicales, "Magicales"); - LanguageRegistry.addName(ModItems.sanctus, "Sanctus"); - LanguageRegistry.addName(ModItems.aether, "Aether"); - LanguageRegistry.addName(ModItems.simpleCatalyst, "Simple Catalyst"); - LanguageRegistry.addName(ModItems.crepitous, "Crepitous"); - LanguageRegistry.addName(ModItems.crystallos, "Crystallos"); - LanguageRegistry.addName(ModItems.terrae, "Terrae"); - LanguageRegistry.addName(ModItems.aquasalus, "Aquasalus"); - LanguageRegistry.addName(ModItems.tennebrae, "Tennebrae"); - LanguageRegistry.addName(ModItems.sigilOfWind, "Sigil of the Whirlwind"); - LanguageRegistry.addName(ModItems.telepositionFocus, "Teleposition Focus"); - LanguageRegistry.addName(ModItems.enhancedTelepositionFocus, "Enhanced Teleposition Focus"); - LanguageRegistry.addName(ModItems.reinforcedTelepositionFocus, "Reinforced Teleposition Focus"); - LanguageRegistry.addName(ModItems.demonicTelepositionFocus, "Demonic Teleposition Focus"); - LanguageRegistry.addName(ModItems.imbuedSlate, "Imbued Slate"); - LanguageRegistry.addName(ModItems.demonicSlate, "Demonic Slate"); - LanguageRegistry.addName(ModItems.duskScribeTool, "Elemental Inscription Tool: Dusk"); - LanguageRegistry.addName(ModItems.sigilOfTheBridge, "Sigil of the Phantom Bridge"); - LanguageRegistry.addName(ModItems.armourInhibitor, "Armour Inhibitor"); - LanguageRegistry.addName(ModItems.creativeFiller, "Orb of Testing"); - LanguageRegistry.addName(ModItems.weakFillingAgent, "Weak Filling Agent"); - LanguageRegistry.addName(ModItems.standardFillingAgent, "Standard Filling Agent"); - LanguageRegistry.addName(ModItems.enhancedFillingAgent, "Enhanced Filling Agent"); - LanguageRegistry.addName(ModItems.weakBindingAgent, "Weak Binding Agent"); - LanguageRegistry.addName(ModItems.itemRitualDiviner, "Ritual Diviner"); - LanguageRegistry.addName(ModItems.sigilOfMagnetism, "Sigil of Magnetism"); - LanguageRegistry.addName(ModItems.itemKeyOfDiablo, "Key of Binding"); - LanguageRegistry.addName(ModItems.energyBazooka, "Energy Bazooka"); - LanguageRegistry.addName(ModItems.itemBloodLightSigil, "Sigil of the Blood Lamp"); - LanguageRegistry.addName(ModItems.demonBloodShard, "Demon Blood Shard"); + //FluidStack lifeEssenceFluidStack = new FluidStack(lifeEssenceFluid, 1); //LiquidStack lifeEssence = new LiquidStack(lifeEssenceFlowing, 1); //LiquidDictionary.getOrCreateLiquid("Life Essence", lifeEssence); - FluidRegistry.registerFluid(lifeEssenceFluid); - ModBlocks.blockLifeEssence = new LifeEssenceBlock(); + + // ModBlocks.blockLifeEssence.setUnlocalizedName("lifeEssenceBlock"); FluidContainerRegistry.registerFluidContainer(lifeEssenceFluid, new ItemStack(ModItems.bucketLife), FluidContainerRegistry.EMPTY_BUCKET); - FluidRegistry.registerFluid(lifeEssenceFluid); + //lifeEssenceFluid.setUnlocalizedName("lifeEssence"); //LiquidContainerRegistry.registerLiquid(new LiquidContainerData(LiquidDictionary.getLiquid("Life Essence", LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(AlchemicalWizardry.bucketLife), new ItemStack(Item.bucketEmpty))); //GameRegistry.registerBlock(testingBlock, "testingBlock"); //LanguageRegistry.addName(testingBlock, "Testing Block"); //(testingBlock, "pickaxe", 0); - LanguageRegistry.addName(ModBlocks.blockAltar, "Blood Altar"); - LanguageRegistry.addName(ModBlocks.blockLifeEssence, "Life Essence"); ModBlocks.blockAltar.setHarvestLevel("pickaxe", 1); //Register Tile Entity GameRegistry.registerTileEntity(TEAltar.class, "containerAltar"); @@ -545,69 +466,7 @@ public class AlchemicalWizardry GameRegistry.registerTileEntity(TESpellEffectBlock.class, "containerSpellEffectBlock"); GameRegistry.registerTileEntity(TESpellModifierBlock.class, "containerSpellModifierBlock"); GameRegistry.registerTileEntity(TESpellEnhancementBlock.class, "containerSpellEnhancementBlock"); - // - LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 0), "Blood Rune"); - LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 1), "Rune of Augmented Capacity"); - LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 2), "Rune of Dislocation"); - LanguageRegistry.addName(new ItemStack(ModBlocks.bloodRune, 1, 3), "Rune of the Orb"); - //TODO - - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 0), "Particle Generator"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 1), "Self Augmentator"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellParadigm, 1, 2), "Melee Aggregator"); - - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 0), "Unstable Spell Empowerer"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 1), "Standard Spell Empowerer"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 2), "Reinforced Spell Empowerer"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 3), "Imbued Spell Empowerer"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 4), "Demonic Spell Empowerer"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 5), "Unstable Spell Dampener"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 6), "Standard Spell Dampener"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 7), "Reinforced Spell Dampener"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 8), "Imbued Spell Dampener"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 9), "Demonic Spell Dampener"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 10), "Unstable Spell Augmenter"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 11), "Standard Spell Augmenter"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 12), "Reinforced Spell Augmenter"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 13), "Imbued Spell Augmenter"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEnhancement, 1, 14), "Demonic Spell Augmenter"); - - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 0), "Default Spell Modifier"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 1), "Offensive Spell Modifier"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 2), "Defensive Spell Modifier"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellModifier, 1, 3), "Environmental Spell Modifier"); - - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 0), "Crucible of Fire"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 1), "Ice Maker"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 2), "Wind Generator"); - LanguageRegistry.addName(new ItemStack(ModBlocks.blockSpellEffect, 1, 3), "Earth Former"); - - LanguageRegistry.addName(ModBlocks.speedRune, "Speed Rune"); - LanguageRegistry.addName(ModBlocks.efficiencyRune, "Efficiency Rune"); - LanguageRegistry.addName(ModBlocks.runeOfSacrifice, "Rune of Sacrifice"); - LanguageRegistry.addName(ModBlocks.runeOfSelfSacrifice, "Rune of Self-sacrifice"); -// GameRegistry.registerBlock(lifeEssenceStill, "lifeEssenceStill"); -// GameRegistry.registerBlock(lifeEssenceFlowing, "lifeEssenceFlowing"); - //LanguageRegistry.addName(lifeEssenceStill, "Life Essence"); - LanguageRegistry.addName(ModItems.bucketLife, "Bucket of Life"); - LanguageRegistry.addName(ModBlocks.blockMasterStone, "Master Ritual Stone"); - LanguageRegistry.addName(ModBlocks.imperfectRitualStone, "Imperfect Ritual Stone"); - LanguageRegistry.addName(ModBlocks.ritualStone, "Ritual Stone"); - LanguageRegistry.addName(ModBlocks.armourForge, "Soul Armour Forge"); - LanguageRegistry.addName(ModBlocks.emptySocket, "Empty Socket"); - LanguageRegistry.addName(ModBlocks.bloodSocket, "Filled Socket"); - LanguageRegistry.addName(ModBlocks.bloodStoneBrick, "Bloodstone Brick"); - LanguageRegistry.addName(ModBlocks.largeBloodStoneBrick, "Large Bloodstone Brick"); - LanguageRegistry.addName(ModBlocks.blockHomHeart, "Spell Table"); - LanguageRegistry.addName(ModBlocks.blockPedestal, "Arcane Pedestal"); - LanguageRegistry.addName(ModBlocks.blockPlinth, "Arcane Plinth"); - LanguageRegistry.addName(ModBlocks.blockWritingTable, "Alchemic Chemistry Set"); - LanguageRegistry.addName(ModBlocks.blockTeleposer, "Teleposer"); - LanguageRegistry.addName(ModBlocks.spectralBlock, "Spectral Block"); - LanguageRegistry.addName(ModBlocks.blockBloodLight, "Blood Light"); - LanguageRegistry.addName(ModBlocks.blockConduit, "Spell Conduit"); - //TODO - + //GameRegistry.registerBlock(ModBlocks.blockSpellEffect,"blockSpellEffect"); ModBlocks.bloodRune.setHarvestLevel("pickaxe", 2); ModBlocks.speedRune.setHarvestLevel("pickaxe", 2); @@ -715,21 +574,6 @@ public class AlchemicalWizardry EntityRegistry.registerModEntity(EntityShadeElemental.class, "ShadeElemental", this.entityShadeElementalID, this, 120, 3, true); EntityRegistry.registerModEntity(EntityHolyElemental.class, "HolyElemental", this.entityHolyElementalID, this, 120, 3, true); //EntityRegistry.addSpawn(EntityFallenAngel.class, 5, 1, 5, EnumCreatureType.creature, BiomeGenBase.biomeList); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.FallenAngel.name", "en_US", "Fallen Angel"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.LowerGuardian.name", "en_US", "Lower Stone Guardian"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.BileDemon.name", "en_US", "Bile Demon"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.WingedFireDemon.name", "en_US", "Winged Fire Demon"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.SmallEarthGolem.name", "en_US", "Small Earth Golem"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.IceDemon.name", "en_US", "Ice Demon"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.BoulderFist.name", "en_US", "Boulder Fist"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.Shade.name", "en_US", "Shade"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.AirElemental.name", "en_US", "Air Elemental"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.WaterElemental.name", "en_US", "Water Elemental"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.EarthElemental.name", "en_US", "Earth Elemental"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.FireElemental.name", "en_US", "Fire Elemental"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.ShadeElemental.name", "en_US", "Shade Elemental"); - LanguageRegistry.instance().addStringLocalization("entity.AlchemicalWizardry.HolyElemental.name", "en_US", "Holy Elemental"); - LanguageRegistry.instance().addStringLocalization("itemGroup.tabBloodMagic", "en_US", "Blood Magic"); ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.standardBindingAgent), 1, 3, this.standardBindingAgentDungeonChance)); ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.mundanePowerCatalyst), 1, 1, this.mundanePowerCatalystDungeonChance)); ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST).addItem(new WeightedRandomChestContent(new ItemStack(ModItems.mundaneLengtheningCatalyst), 1, 1, this.mundaneLengtheningCatalystDungeonChance)); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java index c92f9dd5..18cf8810 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java @@ -60,7 +60,7 @@ public class ModBlocks efficiencyRune = new EfficiencyRune(); runeOfSacrifice = new RuneOfSacrifice(); runeOfSelfSacrifice = new RuneOfSelfSacrifice(); - AlchemicalWizardry.lifeEssenceFluid = new LifeEssence("Life Essence"); + blockTeleposer = new BlockTeleposer(); spectralBlock = new SpectralBlock(); ritualStone = new RitualStone(); @@ -81,12 +81,14 @@ public class ModBlocks blockSpellParadigm = new BlockSpellParadigm(); blockSpellModifier = new BlockSpellModifier(); blockSpellEnhancement = new BlockSpellEnhancement(); + + blockLifeEssence = new LifeEssenceBlock(); } - public static void registerBlocks() + public static void registerBlocksInPre() { + GameRegistry.registerBlock(ModBlocks.blockAltar, "Altar"); GameRegistry.registerBlock(ModBlocks.bloodRune, ItemBloodRuneBlock.class, "AlchemicalWizardry" + (ModBlocks.bloodRune.getUnlocalizedName().substring(5))); - GameRegistry.registerBlock(ModBlocks.blockAltar, "bloodAltar"); GameRegistry.registerBlock(ModBlocks.blockLifeEssence, "lifeEssence"); GameRegistry.registerBlock(ModBlocks.blockSpellParadigm, ItemSpellParadigmBlock.class, "AlchemicalWizardry" + (ModBlocks.blockSpellParadigm.getUnlocalizedName())); GameRegistry.registerBlock(ModBlocks.blockSpellEnhancement, ItemSpellEnhancementBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEnhancement.getUnlocalizedName())); @@ -114,4 +116,9 @@ public class ModBlocks GameRegistry.registerBlock(ModBlocks.blockBloodLight, "bloodLight"); GameRegistry.registerBlock(ModBlocks.blockConduit,"blockConduit"); } + + public static void registerBlocksInInit() + { + //GameRegistry.registerBlock(ModBlocks.blockLifeEssence, "lifeEssence"); + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java index e9bf768f..48986b0f 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.client; +import net.minecraft.item.ItemBlock; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import WayofTime.alchemicalWizardry.ModBlocks; @@ -25,11 +26,13 @@ import WayofTime.alchemicalWizardry.common.renderer.block.RenderConduit; import WayofTime.alchemicalWizardry.common.renderer.block.RenderPedestal; import WayofTime.alchemicalWizardry.common.renderer.block.RenderPlinth; import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEnhancementBlock; import WayofTime.alchemicalWizardry.common.renderer.block.RenderWritingTable; import WayofTime.alchemicalWizardry.common.renderer.block.TEAltarRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEAltarItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEConduitItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEffectBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEnhancementBlockItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBileDemon; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBoulderFist; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderElemental; @@ -57,6 +60,7 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; @@ -103,15 +107,19 @@ public class ClientProxy extends CommonProxy RenderingRegistry.registerEntityRenderingHandler(EntityShadeElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); //EntityRegistry.registerGlobalEntityID(EntityHolyElemental.class, "AlchemicalWizardry.HolyElemental", EntityRegistry.findGlobalUniqueEntityId(),0x40FF00, 0x0B610B); RenderingRegistry.registerEntityRenderingHandler(EntityHolyElemental.class, new RenderElemental(new ModelElemental(), 0.5F)); + ClientRegistry.bindTileEntitySpecialRenderer(TEAltar.class, new TEAltarRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TEPedestal.class, new RenderPedestal()); ClientRegistry.bindTileEntitySpecialRenderer(TEPlinth.class, new RenderPlinth()); ClientRegistry.bindTileEntitySpecialRenderer(TEWritingTable.class, new RenderWritingTable()); ClientRegistry.bindTileEntitySpecialRenderer(TEConduit.class, new RenderConduit()); ClientRegistry.bindTileEntitySpecialRenderer(TESpellEffectBlock.class, new RenderSpellEffectBlock()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellEnhancementBlock.class, new RenderSpellEnhancementBlock()); //Item Renderer stuff - //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockConduit.blockID, new TEConduitItemRenderer()); - //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellEffect.blockID, new TESpellEffectBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockConduit), new TEConduitItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellEffect), new TESpellEffectBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellEnhancement), new TESpellEnhancementBlockItemRenderer()); + //RenderingRegistry.registerEntityRenderingHandler(FireProjectile.class, new RenderFireProjectile()); //RenderingRegistry.registerBlockHandler(new AltarRenderer()); } @@ -125,8 +133,8 @@ public class ClientProxy extends CommonProxy @Override public void InitRendering() { - ClientRegistry.bindTileEntitySpecialRenderer(TEAltar.class, new TEAltarRenderer()); - //MinecraftForgeClient.registerItemRenderer(ModBlocks.blockAltar.blockID, new TEAltarItemRenderer()); + + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockAltar), new TEAltarItemRenderer()); //MinecraftForgeClient.registerItemRenderer(AlchemicalWizardry.blockWritingTable.blockID, new TEWritingTableItemRenderer()); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java index 9f95230f..f492117c 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java @@ -6,6 +6,9 @@ import io.netty.channel.SimpleChannelInboundHandler; import java.util.EnumMap; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -21,6 +24,7 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; +import cpw.mods.fml.common.network.FMLOutboundHandler; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -47,7 +51,7 @@ public enum NewPacketHandler { // request a channel pair for IronChest from the network registry // Add the IronChestCodec as a member of both channel pipelines - this.channels = NetworkRegistry.INSTANCE.newChannel("BloodMagic", new TEAltarCodec(), new TEOrientableCodec(), new TEPedestalCodec(), new TEPlinthCodec(), new TESocketCodec()); + this.channels = NetworkRegistry.INSTANCE.newChannel("BloodMagic", new TEAltarCodec()); if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { addClientHandler(); @@ -64,22 +68,17 @@ public enum NewPacketHandler private void addClientHandler() { FMLEmbeddedChannel clientChannel = this.channels.get(Side.CLIENT); - // These two lines find the existing codec (Ironchestcodec) and insert our message handler after it - // in the pipeline + String tileAltarCodec = clientChannel.findChannelHandlerNameForType(TEAltarCodec.class); - clientChannel.pipeline().addAfter(tileAltarCodec, "TEAltarHandler", new TEAltarMessageHandler()); - - String tileOrientableCodec = clientChannel.findChannelHandlerNameForType(TEOrientableCodec.class); - clientChannel.pipeline().addAfter(tileOrientableCodec, "TEOrientableHandler", new TEOrientableMessageHandler()); - - String tilePedestalCodec = clientChannel.findChannelHandlerNameForType(TEPedestalCodec.class); - clientChannel.pipeline().addAfter(tilePedestalCodec, "TEPedestalHandler", new TEPedestalMessageHandler()); - - String tilePlinthCodec = clientChannel.findChannelHandlerNameForType(TEPlinthCodec.class); - clientChannel.pipeline().addAfter(tilePlinthCodec, "TEPlinthHandler", new TEPlinthMessageHandler()); - - String tileSocketCodec = clientChannel.findChannelHandlerNameForType(TESocketCodec.class); - clientChannel.pipeline().addAfter(tileSocketCodec, "TESocketHandler", new TESocketMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "ClientHandler", new TEAltarMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEOrientableHandler", new TEOrientableMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEPedestalHandler", new TEPedestalMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEPlinthHandler", new TEPlinthMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TESocketHandler", new TESocketMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TETeleposerHandler", new TETeleposerMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEWritingTableHandler", new TEWritingTableMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "ParticleHandler", new ParticleMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "VelocityHandler", new VelocityMessageHandler()); } @@ -101,6 +100,12 @@ public enum NewPacketHandler if (te instanceof TEAltar) { TEAltar altar = (TEAltar) te; + + System.out.println("x: " + msg.x + ", y: " + msg.y + ", z: " + msg.z); + for(int in : msg.items) + { + System.out.println("" + in); + } altar.handlePacketData(msg.items, msg.fluids, msg.capacity); } @@ -203,8 +208,40 @@ public enum NewPacketHandler } } } + + private static class ParticleMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, ParticleMessage msg) throws Exception + { + World world = AlchemicalWizardry.proxy.getClientWorld(); + + world.spawnParticle(msg.particle, msg.xCoord, msg.yCoord, msg.zCoord, msg.xVel, msg.yVel, msg.zVel); + } + } + + private static class VelocityMessageHandler extends SimpleChannelInboundHandler + { + @Override + protected void channelRead0(ChannelHandlerContext ctx, VelocityMessage msg) throws Exception + { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + + if(player!=null) + { + player.motionX = msg.xVel; + player.motionY = msg.yVel; + player.motionZ = msg.zVel; + } + } + } - public static class TEAltarMessage + public static class BMMessage + { + int index; + } + + public static class TEAltarMessage extends BMMessage { int x; int y; @@ -215,7 +252,7 @@ public enum NewPacketHandler int capacity; } - public static class TEOrientableMessage + public static class TEOrientableMessage extends BMMessage { int x; int y; @@ -225,7 +262,7 @@ public enum NewPacketHandler int output; } - public static class TEPedestalMessage + public static class TEPedestalMessage extends BMMessage { int x; int y; @@ -234,7 +271,7 @@ public enum NewPacketHandler int[] items; } - public static class TEPlinthMessage + public static class TEPlinthMessage extends BMMessage { int x; int y; @@ -243,7 +280,7 @@ public enum NewPacketHandler int[] items; } - public static class TESocketMessage + public static class TESocketMessage extends BMMessage { int x; int y; @@ -252,7 +289,7 @@ public enum NewPacketHandler int[] items; } - public static class TETeleposerMessage + public static class TETeleposerMessage extends BMMessage { int x; int y; @@ -261,7 +298,7 @@ public enum NewPacketHandler int[] items; } - public static class TEWritingTableMessage + public static class TEWritingTableMessage extends BMMessage { int x; int y; @@ -269,344 +306,385 @@ public enum NewPacketHandler int[] items; } + + public static class ParticleMessage extends BMMessage + { + String particle; + + double xCoord; + double yCoord; + double zCoord; + + double xVel; + double yVel; + double zVel; + } + + public static class VelocityMessage extends BMMessage + { + double xVel; + double yVel; + double zVel; + } - private class TEAltarCodec extends FMLIndexedMessageToMessageCodec + private class TEAltarCodec extends FMLIndexedMessageToMessageCodec { public TEAltarCodec() { addDiscriminator(0, TEAltarMessage.class); + addDiscriminator(1, TEOrientableMessage.class); + addDiscriminator(2, TEPedestalMessage.class); + addDiscriminator(3, TEPlinthMessage.class); + addDiscriminator(4, TESocketMessage.class); + addDiscriminator(5, TETeleposerMessage.class); + addDiscriminator(6, TEWritingTableMessage.class); + addDiscriminator(7, ParticleMessage.class); + addDiscriminator(8, VelocityMessage.class); } @Override - public void encodeInto(ChannelHandlerContext ctx, TEAltarMessage msg, ByteBuf target) throws Exception + public void encodeInto(ChannelHandlerContext ctx, BMMessage msg, ByteBuf target) throws Exception { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); + target.writeInt(msg.index); + + switch(msg.index) + { + case 0: + target.writeInt(((TEAltarMessage)msg).x); + target.writeInt(((TEAltarMessage)msg).y); + target.writeInt(((TEAltarMessage)msg).z); - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) + target.writeBoolean(((TEAltarMessage)msg).items != null); + if (((TEAltarMessage)msg).items != null) { - int i = items[j]; - target.writeInt(i); + int[] items = ((TEAltarMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + System.out.println("" + i); + } } - } - - if(msg.fluids != null) - { - int[] fluids = msg.fluids; - for (int j = 0; j < fluids.length; j++) + + target.writeBoolean(((TEAltarMessage)msg).fluids != null); + if(((TEAltarMessage)msg).fluids != null) { - int i = fluids[j]; - target.writeInt(i); + int[] fluids = ((TEAltarMessage)msg).fluids; + for (int j = 0; j < fluids.length; j++) + { + int i = fluids[j]; + target.writeInt(i); + } } - } - - target.writeInt(msg.capacity); + + target.writeInt(((TEAltarMessage)msg).capacity); + + break; + + case 1: + target.writeInt(((TEOrientableMessage)msg).x); + target.writeInt(((TEOrientableMessage)msg).y); + target.writeInt(((TEOrientableMessage)msg).z); + + target.writeInt(((TEOrientableMessage)msg).input); + target.writeInt(((TEOrientableMessage)msg).output); + + break; + + case 2: + target.writeInt(((TEPedestalMessage)msg).x); + target.writeInt(((TEPedestalMessage)msg).y); + target.writeInt(((TEPedestalMessage)msg).z); + + target.writeBoolean(((TEPedestalMessage)msg).items != null); + if (((TEPedestalMessage)msg).items != null) + { + int[] items = ((TEPedestalMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + break; + + case 3: + target.writeInt(((TEPlinthMessage)msg).x); + target.writeInt(((TEPlinthMessage)msg).y); + target.writeInt(((TEPlinthMessage)msg).z); + + target.writeBoolean(((TEPlinthMessage)msg).items != null); + if (((TEPlinthMessage)msg).items != null) + { + int[] items = ((TEPlinthMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + break; + + case 4: + target.writeInt(((TESocketMessage)msg).x); + target.writeInt(((TESocketMessage)msg).y); + target.writeInt(((TESocketMessage)msg).z); + + target.writeBoolean(((TESocketMessage)msg).items != null); + if (((TESocketMessage)msg).items != null) + { + int[] items = ((TESocketMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + break; + + case 5: + target.writeInt(((TETeleposerMessage)msg).x); + target.writeInt(((TETeleposerMessage)msg).y); + target.writeInt(((TETeleposerMessage)msg).z); + + target.writeBoolean(((TETeleposerMessage)msg).items != null); + if (((TETeleposerMessage)msg).items != null) + { + int[] items = ((TETeleposerMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + break; + + case 6: + target.writeInt(((TEWritingTableMessage)msg).x); + target.writeInt(((TEWritingTableMessage)msg).y); + target.writeInt(((TEWritingTableMessage)msg).z); + + target.writeBoolean(((TEWritingTableMessage)msg).items != null); + if (((TEWritingTableMessage)msg).items != null) + { + int[] items = ((TEWritingTableMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + break; + + case 7: + String str = ((ParticleMessage)msg).particle; + target.writeInt(str.length()); + for(int i=0; i - { - public TEOrientableCodec() - { - addDiscriminator(0, TEOrientableMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TEOrientableMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - target.writeInt(msg.input); - target.writeInt(msg.output); - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEOrientableMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - - msg.input = dat.readInt(); - msg.output = dat.readInt(); - } - } - - private class TEPedestalCodec extends FMLIndexedMessageToMessageCodec - { - public TEPedestalCodec() - { - addDiscriminator(0, TEPedestalMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TEPedestalMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) - { - int i = items[j]; - target.writeInt(i); - } - } - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPedestalMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - int typDat = dat.readByte(); - boolean hasStacks = dat.readBoolean(); - - msg.items = new int[TEPedestal.sizeInv*3]; - if (hasStacks) - { - msg.items = new int[TEPedestal.sizeInv*3]; - for (int i = 0; i < msg.items.length; i++) - { - msg.items[i] = dat.readInt(); - } - } - } - } - - private class TEPlinthCodec extends FMLIndexedMessageToMessageCodec - { - public TEPlinthCodec() - { - addDiscriminator(0, TEPlinthMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TEPlinthMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) - { - int i = items[j]; - target.writeInt(i); - } - } - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPlinthMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - int typDat = dat.readByte(); - boolean hasStacks = dat.readBoolean(); - - msg.items = new int[TEPlinth.sizeInv*3]; - if (hasStacks) - { - msg.items = new int[TEPlinth.sizeInv*3]; - for (int i = 0; i < msg.items.length; i++) - { - msg.items[i] = dat.readInt(); - } - } - } - } - - private class TESocketCodec extends FMLIndexedMessageToMessageCodec - { - public TESocketCodec() - { - addDiscriminator(0, TESocketMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TESocketMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) - { - int i = items[j]; - target.writeInt(i); - } - } - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TESocketMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - int typDat = dat.readByte(); - boolean hasStacks = dat.readBoolean(); - - msg.items = new int[TESocket.sizeInv*3]; - if (hasStacks) - { - msg.items = new int[TESocket.sizeInv*3]; - for (int i = 0; i < msg.items.length; i++) - { - msg.items[i] = dat.readInt(); - } - } - } - } - - private class TETeleposerCodec extends FMLIndexedMessageToMessageCodec - { - public TETeleposerCodec() - { - addDiscriminator(0, TETeleposerMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TETeleposerMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) - { - int i = items[j]; - target.writeInt(i); - } - } - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TETeleposerMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - int typDat = dat.readByte(); - boolean hasStacks = dat.readBoolean(); - - msg.items = new int[TETeleposer.sizeInv*3]; - if (hasStacks) - { - msg.items = new int[TETeleposer.sizeInv*3]; - for (int i = 0; i < msg.items.length; i++) - { - msg.items[i] = dat.readInt(); - } - } - } - } - - private class TEWritingTableCodec extends FMLIndexedMessageToMessageCodec - { - public TEWritingTableCodec() - { - addDiscriminator(0, TEWritingTableMessage.class); - } - - @Override - public void encodeInto(ChannelHandlerContext ctx, TEWritingTableMessage msg, ByteBuf target) throws Exception - { - target.writeInt(msg.x); - target.writeInt(msg.y); - target.writeInt(msg.z); - - target.writeBoolean(msg.items != null); - if (msg.items != null) - { - int[] items = msg.items; - for (int j = 0; j < items.length; j++) - { - int i = items[j]; - target.writeInt(i); - } - } - } - - @Override - public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEWritingTableMessage msg) - { - msg.x = dat.readInt(); - msg.y = dat.readInt(); - msg.z = dat.readInt(); - int typDat = dat.readByte(); - boolean hasStacks = dat.readBoolean(); - - msg.items = new int[TEWritingTable.sizeInv*3]; - if (hasStacks) - { - msg.items = new int[TEWritingTable.sizeInv*3]; - for (int i = 0; i < msg.items.length; i++) - { - msg.items[i] = dat.readInt(); - } - } - } - } - //Packets to be obtained public static Packet getPacket(TEAltar tileAltar) { TEAltarMessage msg = new TEAltarMessage(); + msg.index = 0; msg.x = tileAltar.xCoord; msg.y = tileAltar.yCoord; msg.z = tileAltar.zCoord; @@ -620,6 +698,7 @@ public enum NewPacketHandler public static Packet getPacket(TEOrientable tileOrientable) { TEOrientableMessage msg = new TEOrientableMessage(); + msg.index = 1; msg.x = tileOrientable.xCoord; msg.y = tileOrientable.yCoord; msg.z = tileOrientable.zCoord; @@ -632,6 +711,7 @@ public enum NewPacketHandler public static Packet getPacket(TEPedestal tilePedestal) { TEPedestalMessage msg = new TEPedestalMessage(); + msg.index = 2; msg.x = tilePedestal.xCoord; msg.y = tilePedestal.yCoord; msg.z = tilePedestal.zCoord; @@ -643,6 +723,7 @@ public enum NewPacketHandler public static Packet getPacket(TEPlinth tilePlinth) { TEPlinthMessage msg = new TEPlinthMessage(); + msg.index = 3; msg.x = tilePlinth.xCoord; msg.y = tilePlinth.yCoord; msg.z = tilePlinth.zCoord; @@ -654,6 +735,7 @@ public enum NewPacketHandler public static Packet getPacket(TESocket tileSocket) { TESocketMessage msg = new TESocketMessage(); + msg.index = 4; msg.x = tileSocket.xCoord; msg.y = tileSocket.yCoord; msg.z = tileSocket.zCoord; @@ -665,6 +747,7 @@ public enum NewPacketHandler public static Packet getPacket(TETeleposer tileTeleposer) { TETeleposerMessage msg = new TETeleposerMessage(); + msg.index = 5; msg.x = tileTeleposer.xCoord; msg.y = tileTeleposer.yCoord; msg.z = tileTeleposer.zCoord; @@ -676,6 +759,7 @@ public enum NewPacketHandler public static Packet getPacket(TEWritingTable tileWritingTable) { TEWritingTableMessage msg = new TEWritingTableMessage(); + msg.index = 6; msg.x = tileWritingTable.xCoord; msg.y = tileWritingTable.yCoord; msg.z = tileWritingTable.zCoord; @@ -683,4 +767,50 @@ public enum NewPacketHandler return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } + + public static Packet getParticlePacket(String str, double xCoord, double yCoord, double zCoord, double xVel, double yVel, double zVel) + { + ParticleMessage msg = new ParticleMessage(); + msg.index = 7; + msg.particle = str; + msg.xCoord = xCoord; + msg.yCoord = yCoord; + msg.zCoord = zCoord; + msg.xVel = xVel; + msg.yVel = yVel; + msg.zVel = zVel; + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public static Packet getVelSettingPacket(double xVel, double yVel, double zVel) + { + VelocityMessage msg = new VelocityMessage(); + msg.index = 8; + msg.xVel = xVel; + msg.yVel = yVel; + msg.zVel = zVel; + + return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); + } + + public void sendTo(Packet message, EntityPlayerMP player) + { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendToAll(Packet message) + { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + this.channels.get(Side.SERVER).writeAndFlush(message); + } + + public void sendToAllAround(Packet message, NetworkRegistry.TargetPoint point) + { + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + this.channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(point); + this.channels.get(Side.SERVER).writeAndFlush(message); + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java index 58c6120e..79765ee4 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyPotionHandlerComponent.java @@ -24,11 +24,11 @@ public class AlchemyPotionHandlerComponent { if (itemStack.getItem() instanceof ItemBlock) { - return comparedStack.equals(itemStack) && comparedStack.getItemDamage() == itemStack.getItemDamage(); + return comparedStack.getItem().equals(itemStack.getItem()) && comparedStack.getItemDamage() == itemStack.getItemDamage(); } } else if (!(itemStack.getItem() instanceof ItemBlock)) { - return comparedStack.equals(itemStack) && comparedStack.getItemDamage() == itemStack.getItemDamage(); + return comparedStack.getItem().equals(itemStack.getItem()) && comparedStack.getItemDamage() == itemStack.getItemDamage(); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java index a3423fa3..f54ebb3d 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipe.java @@ -104,7 +104,7 @@ public class AlchemyRecipe continue; } - if ((checkedItemStack.getItemDamage() == recipeItemStack.getItemDamage() || OreDictionary.WILDCARD_VALUE == recipeItemStack.getItemDamage()) && checkedItemStack.equals(recipeItemStack)) + if ((checkedItemStack.getItemDamage() == recipeItemStack.getItemDamage() || OreDictionary.WILDCARD_VALUE == recipeItemStack.getItemDamage()) && checkedItemStack.getItem()==recipeItemStack.getItem()) { test = true; checkList[j] = true; @@ -119,44 +119,6 @@ public class AlchemyRecipe } return true; -// if(slottedBloodOrbLevel=maximum) + { + return; + } + data.currentEssence = Math.min(maximum, data.currentEssence + amount); data.markDirty(); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java index 5b06e576..2c5e106d 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java @@ -41,7 +41,7 @@ public class ItemSpellEffectBlock extends ItemBlock break; case 3: - name = "water"; + name = "earth"; break; default: diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java index 5be244a4..acd47516 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java @@ -26,18 +26,22 @@ public class ItemSpellModifierBlock extends ItemBlock { case 0: { - name = "power"; + name = "default"; break; } case 1: { - name = "efficiency"; + name = "offensive"; break; } case 2: - name = "potency"; + name = "defensive"; + break; + + case 3: + name = "environmental"; break; default: diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java index 082a5472..dfcce632 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java @@ -68,7 +68,7 @@ public class DivinationSigil extends Item implements ArmourUpgrade //PacketDispatcher.sendPacketToServer(PacketHandler.getPacket(ownerName)); int currentEssence = EnergyItems.getCurrentEssence(ownerName); - par3EntityPlayer.addChatMessage(new ChatComponentText("Current Essence: " + 0)); + par3EntityPlayer.addChatMessage(new ChatComponentText("Current Essence: " + EnergyItems.getCurrentEssence(ownerName))); return par1ItemStack; } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java new file mode 100644 index 00000000..ae2b9f2c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellEnhancementBlock extends TileEntitySpecialRenderer +{ + private ModelSpellEnhancementBlock modelSpellEnhancementBlock = new ModelSpellEnhancementBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellEnhancementBlock) + { + TESpellEnhancementBlock tileSpellBlock = (TESpellEnhancementBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellEnhancementPower1.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellEnhancementBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java new file mode 100644 index 00000000..76d1a176 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEnhancementBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellEnhancementBlockItemRenderer implements IItemRenderer +{ + private ModelSpellEnhancementBlock modelSpellBlock = new ModelSpellEnhancementBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEnhancementPower2.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEnhancementPower3.png"; + } + return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java new file mode 100644 index 00000000..f56dca24 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java @@ -0,0 +1,334 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.util.ForgeDirection; + + +public class ModelSpellEnhancementBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer frame1; + ModelRenderer frame2; + ModelRenderer frame3; + ModelRenderer frame4; + ModelRenderer frame5; + ModelRenderer frame6; + ModelRenderer frame7; + ModelRenderer frame8; + ModelRenderer frame9; + ModelRenderer frame10; + ModelRenderer frame11; + ModelRenderer frame12; + ModelRenderer outputMain; + ModelRenderer inputMain; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + ModelRenderer input1; + ModelRenderer input2; + ModelRenderer input3; + ModelRenderer input4; + ModelRenderer outputSecond; + + public ModelSpellEnhancementBlock() + { + textureWidth = 128; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(128, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + frame1 = new ModelRenderer(this, 0, 32); + frame1.addBox(-7F, 5F, -7F, 14, 2, 2); + frame1.setRotationPoint(0F, 16F, 0F); + frame1.setTextureSize(128, 64); + frame1.mirror = true; + setRotation(frame1, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 24, 19); + frame2.addBox(5F, -5F, -7F, 2, 10, 2); + frame2.setRotationPoint(0F, 16F, 0F); + frame2.setTextureSize(128, 64); + frame2.mirror = true; + setRotation(frame2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 19); + frame3.addBox(-7F, -5F, -7F, 2, 10, 2); + frame3.setRotationPoint(0F, 16F, 0F); + frame3.setTextureSize(128, 64); + frame3.mirror = true; + setRotation(frame3, 0F, 0F, 0F); + frame4 = new ModelRenderer(this, 0, 14); + frame4.addBox(-7F, -7F, -7F, 14, 2, 2); + frame4.setRotationPoint(0F, 16F, 0F); + frame4.setTextureSize(128, 64); + frame4.mirror = true; + setRotation(frame4, 0F, 0F, 0F); + frame5 = new ModelRenderer(this, 0, 57); + frame5.addBox(-7F, 5F, 5F, 14, 2, 2); + frame5.setRotationPoint(0F, 16F, 0F); + frame5.setTextureSize(128, 64); + frame5.mirror = true; + setRotation(frame5, 0F, 0F, 0F); + frame6 = new ModelRenderer(this, 0, 44); + frame6.addBox(5F, -5F, 5F, 2, 10, 2); + frame6.setRotationPoint(0F, 16F, 0F); + frame6.setTextureSize(128, 64); + frame6.mirror = true; + setRotation(frame6, 0F, 0F, 0F); + frame7 = new ModelRenderer(this, 24, 44); + frame7.addBox(-7F, -5F, 5F, 2, 10, 2); + frame7.setRotationPoint(0F, 16F, 0F); + frame7.setTextureSize(128, 64); + frame7.mirror = true; + setRotation(frame7, 0F, 0F, 0F); + frame8 = new ModelRenderer(this, 0, 39); + frame8.addBox(-7F, -7F, 5F, 14, 2, 2); + frame8.setRotationPoint(0F, 16F, 0F); + frame8.setTextureSize(128, 64); + frame8.mirror = true; + setRotation(frame8, 0F, 0F, 0F); + frame9 = new ModelRenderer(this, 66, 14); + frame9.addBox(5F, 5F, -5F, 2, 2, 10); + frame9.setRotationPoint(0F, 16F, 0F); + frame9.setTextureSize(128, 64); + frame9.mirror = true; + setRotation(frame9, 0F, 0F, 0F); + frame10 = new ModelRenderer(this, 40, 14); + frame10.addBox(-7F, 5F, -5F, 2, 2, 10); + frame10.setRotationPoint(0F, 16F, 0F); + frame10.setTextureSize(128, 64); + frame10.mirror = true; + setRotation(frame10, 0F, 0F, 0F); + frame11 = new ModelRenderer(this, 66, 0); + frame11.addBox(5F, -7F, -5F, 2, 2, 10); + frame11.setRotationPoint(0F, 16F, 0F); + frame11.setTextureSize(128, 64); + frame11.mirror = true; + setRotation(frame11, 0F, 0F, 0F); + frame12 = new ModelRenderer(this, 40, 0); + frame12.addBox(-7F, -7F, -5F, 2, 2, 10); + frame12.setRotationPoint(0F, 16F, 0F); + frame12.setTextureSize(128, 64); + frame12.mirror = true; + setRotation(frame12, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 78, 36); + outputMain.addBox(6F, -2F, -2F, 2, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(128, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + inputMain = new ModelRenderer(this, 40, 36); + inputMain.addBox(-2F, -2F, -8F, 4, 4, 5); + inputMain.setRotationPoint(0F, 16F, 0F); + inputMain.setTextureSize(128, 64); + inputMain.mirror = true; + setRotation(inputMain, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 80, 30); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(128, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 80, 30); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(128, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 80, 30); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(128, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 80, 30); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(128, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + input1 = new ModelRenderer(this, 40, 27); + input1.addBox(3F, -5F, -8F, 2, 2, 5); + input1.setRotationPoint(0F, 16F, 0F); + input1.setTextureSize(128, 64); + input1.mirror = true; + setRotation(input1, 0F, 0F, 0F); + input2 = new ModelRenderer(this, 40, 27); + input2.addBox(-5F, -5F, -8F, 2, 2, 5); + input2.setRotationPoint(0F, 16F, 0F); + input2.setTextureSize(128, 64); + input2.mirror = true; + setRotation(input2, 0F, 0F, 0F); + input3 = new ModelRenderer(this, 40, 27); + input3.addBox(3F, 3F, -8F, 2, 2, 5); + input3.setRotationPoint(0F, 16F, 0F); + input3.setTextureSize(128, 64); + input3.mirror = true; + setRotation(input3, 0F, 0F, 0F); + input4 = new ModelRenderer(this, 40, 27); + input4.addBox(-5F, 3F, -8F, 2, 2, 5); + input4.setRotationPoint(0F, 16F, 0F); + input4.setTextureSize(128, 64); + input4.mirror = true; + setRotation(input4, 0F, 0F, 0F); + outputSecond = new ModelRenderer(this, 78, 47); + outputSecond.addBox(4F, -3F, -3F, 1, 6, 6); + outputSecond.setRotationPoint(0F, 16F, 0F); + outputSecond.setTextureSize(128, 64); + outputSecond.mirror = true; + setRotation(outputSecond, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputMain, xInputRot, yInputRot, zInputRot); + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(input1, xInputRot, yInputRot, zInputRot); + this.setRotation(input2, xInputRot, yInputRot, zInputRot); + this.setRotation(input3, xInputRot, yInputRot, zInputRot); + this.setRotation(input4, xInputRot, yInputRot, zInputRot); + this.setRotation(outputSecond, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + + core.render(f5); + frame1.render(f5); + frame2.render(f5); + frame3.render(f5); + frame4.render(f5); + frame5.render(f5); + frame6.render(f5); + frame7.render(f5); + frame8.render(f5); + frame9.render(f5); + frame10.render(f5); + frame11.render(f5); + frame12.render(f5); + outputMain.render(f5); + inputMain.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + input1.render(f5); + input2.render(f5); + input3.render(f5); + input4.render(f5); + outputSecond.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java index e0c5d819..b467590f 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java @@ -80,7 +80,7 @@ public class RitualEffectCrushing extends RitualEffect Block block = world.getBlock(x + i, y + j, z + k); int meta = world.getBlockMetadata(x + i, y + j, z + k); - if (block != null) + if (block != null && !world.isAirBlock(x + i, y + j, z + k)) { if ((block.equals(ModBlocks.ritualStone) || block.equals(ModBlocks.blockMasterStone))) { diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 152493f8..ec812f42 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -3,9 +3,11 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import java.util.List; import java.util.Random; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -121,7 +123,10 @@ public class SpellHelper public static void sendParticleToPlayer(EntityPlayer player, String str, double xCoord, double yCoord, double zCoord, double xVel, double yVel, double zVel) { - + if(player instanceof EntityPlayerMP) + { + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getParticlePacket(str, xCoord, yCoord, zCoord, xVel, yVel, zVel),(EntityPlayerMP) player); + } } public static void sendIndexedParticleToPlayer(EntityPlayer player, int index, double xCoord, double yCoord, double zCoord) @@ -130,10 +135,13 @@ public class SpellHelper { case 1: SpellHelper.sendParticleToPlayer(player, "mobSpell", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 0.5117D, 0.0117D, 0.0117D); + break; case 2: SpellHelper.sendParticleToPlayer(player, "reddust", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 0.82D, 0.941D, 0.91D); + break; case 3: SpellHelper.sendParticleToPlayer(player, "mobSpell", xCoord + 0.5D + rand.nextGaussian() / 8, yCoord + 1.1D, zCoord + 0.5D + rand.nextGaussian() / 8, 1.0D, 0.371D, 0.371D); + break; case 4: float f = (float) 1.0F; float f1 = f * 0.6F + 0.4F; @@ -144,6 +152,7 @@ public class SpellHelper { SpellHelper.sendParticleToPlayer(player,"reddust", xCoord + Math.random() - Math.random(), yCoord + Math.random() - Math.random(), zCoord + Math.random() - Math.random(), f1, f2, f3); } + break; } } @@ -179,6 +188,9 @@ public class SpellHelper public static void setPlayerSpeedFromServer(EntityPlayer player, double motionX, double motionY, double motionZ) { - + if(player instanceof EntityPlayerMP) + { + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getVelSettingPacket(motionX, motionY, motionZ), (EntityPlayerMP) player); + } } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java index c1353871..7312c391 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -11,8 +11,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; @@ -32,6 +34,7 @@ import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegist import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.AltarUpgradeComponent; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFluidHandler @@ -682,10 +685,11 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui @Override public Packet getDescriptionPacket() { - return NewPacketHandler.getPacket(this); + NBTTagCompound nbttagcompound = new NBTTagCompound(); + this.writeToNBT(nbttagcompound); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 2, nbttagcompound); } - public void handlePacketData(int[] intData, int[] fluidData, int capacity) { if (intData == null) @@ -1021,4 +1025,11 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui return sortList; } + + public void sendChatInfoToPlayer(EntityPlayer player) + { + player.addChatMessage(new ChatComponentText("Altar's Current Essence: " + this.fluid.amount+ "LP")); + player.addChatMessage(new ChatComponentText("Altar's Current Tier: " + UpgradedAltars.isAltarValid(worldObj, xCoord, yCoord, zCoord))); + player.addChatMessage(new ChatComponentText("Capacity: " + this.getCapacity() + "LP")); + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java index 4b5fe8bc..a4d475fb 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java @@ -24,12 +24,6 @@ public class TEConduit extends TESpellBlock public void updateEntity() { - } - - @Override - public Packet getDescriptionPacket() - { - return super.getDescriptionPacket(); } @Override diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java deleted file mode 100644 index 859a3b9c..00000000 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeartRenderer.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.alchemicalWizardry.common.tileEntity; - -import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; -import net.minecraft.tileentity.TileEntity; - -public class TEHomHeartRenderer extends TileEntitySpecialRenderer -{ - @Override - public void renderTileEntityAt(TileEntity tileentity, double d0, double d1, double d2, float f) - { - // TODO Auto-generated method stub - } -} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java index d156f352..991f6e64 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.tileEntity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import WayofTime.alchemicalWizardry.common.NewPacketHandler; @@ -88,8 +89,9 @@ public class TEOrientable extends TileEntity implements IOrientable @Override public Packet getDescriptionPacket() { - return NewPacketHandler.getPacket(this); + return NewPacketHandler.getPacket(this); } + public boolean isSideRendered(ForgeDirection side) { diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java index c49c520a..d83006cc 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java @@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import WayofTime.alchemicalWizardry.common.NewPacketHandler; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java index 4995d574..efb02a9d 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java @@ -12,6 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import net.minecraftforge.oredict.OreDictionary; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java index c98638c4..9f43b483 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java @@ -7,6 +7,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import WayofTime.alchemicalWizardry.common.NewPacketHandler; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java index e6110498..d40004b6 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java @@ -99,4 +99,17 @@ public class TESpellEnhancementBlock extends TESpellBlock { } + + @Override + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEnhancementPower2.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEnhancementPower3.png"; + + } + return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java index 26239d1c..e1ae21fc 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java @@ -11,6 +11,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @@ -309,8 +310,8 @@ public class TETeleposer extends TileEntity implements IInventory @Override public Packet getDescriptionPacket() - { - return NewPacketHandler.getPacket(this); + { + return NewPacketHandler.getPacket(this); } public void handlePacketData(int[] intData) diff --git a/1.7.2/resources/assets/alchemicalwizardry/lang/en_US.lang b/1.7.2/resources/assets/alchemicalwizardry/lang/en_US.lang new file mode 100644 index 00000000..df2c8853 --- /dev/null +++ b/1.7.2/resources/assets/alchemicalwizardry/lang/en_US.lang @@ -0,0 +1,132 @@ +#Block Localization +tile.bloodAltar.name=Blood Altar +tile.bloodRune.blank.name=Blood Rune +tile.bloodRune.fill.name=Rune of Augmented Capacity +tile.bloodRune.empty.name=Rune of Dislocation +tile.bloodRune.test.name=Rune of the Orb +tile.speedRune.name=Speed Rune +tile.efficiencyRune.name=Efficiency Rune +tile.runeOfSacrifice.name=Rune of Sacrifice +tile.runeOfSelfSacrifice.name=Rune of Self-Sacrifice +tile.ritualStone.name=Ritual Stone +tile.blockMasterStone.name=Master Ritual Stone +tile.bloodSocket.name=Filled Socket +tile.imperfectRitualStone.name=Imperfect Ritual Stone +tile.armourForge.name=Soul Armour Forge +tile.emptySocket.name=Empty Socket +tile.bloodStoneBrick.name=Bloodstone Brick +tile.largeBloodStoneBrick.name=Large Bloodstone Brick +tile.blockWritingTable.name=Alchemic Chemistry Set +tile.blockHomHeart.name=Spell Table +tile.bloodPedestal.name=Arcane Pedestal +tile.bloodPlinth.name=Arcane Plinth +tile.bloodTeleposer.name=Teleposer +tile.blockConduit.name=Spell Conduit +tile.blockSpellParadigm.projectile.name=Particle Generator +tile.blockSpellParadigm.self.name=Self Augmentator +tile.blockSpellParadigm.melee.name=Melee Aggregator +tile.blockSpellEnhancement.power1.name=Unstable Spell Empowerer +tile.blockSpellEnhancement.power2.name=Standard Spell Empowerer +tile.blockSpellEnhancement.power3.name=Reinforced Spell Empowerer +tile.blockSpellEnhancement.power4.name=Imbued Spell Empowerer +tile.blockSpellEnhancement.power5.name=Demonic Spell Empowerer +tile.blockSpellEnhancement.cost1.name=Unstable Spell Dampener +tile.blockSpellEnhancement.cost2.name=Standard Spell Dampener +tile.blockSpellEnhancement.cost3.name=Reinforced Spell Dampener +tile.blockSpellEnhancement.cost4.name=Imbued Spell Dampener +tile.blockSpellEnhancement.cost5.name=Demonic Spell Dampener +tile.blockSpellEnhancement.potency1.name=Unstable Spell Augmentor +tile.blockSpellEnhancement.potency2.name=Standard Spell Augmentor +tile.blockSpellEnhancement.potency3.name=Reinforced Spell Augmentor +tile.blockSpellEnhancement.potency4.name=Imbued Spell Augmentor +tile.blockSpellEnhancement.potency5.name=Demonic Spell Augmentor +tile.blockSpellModifier.default.name=Default Spell Modifier +tile.blockSpellModifier.offensive.name=Offensive Spell Modifier +tile.blockSpellModifier.defensive.name=Defensive Spell Modifier +tile.blockSpellModifier.environmental.name=Environmental Spell Modifier +tile.blockSpellEffect.fire.name=Crucible of Fire +tile.blockSpellEffect.ice.name=Ice Maker +tile.blockSpellEffect.wind.name=Wind Generator +tile.blockSpellEffect.earth.name=Earth Former + +#Item Localization +item.weakBloodOrb.name=Weak Blood Orb +item.apprenticeBloodOrb.name=Apprentice Blood Orb +item.magicianBloodOrb.name=Magician's Blood Orb +item.masterBloodOrb.name=Master Blood Orb +item.archmageBloodOrb.name=Archamge's Blood Orb +item.energyBlast.name=Energy Blaster +item.energySword.name=Bound Blade +item.lavaCrystal.name=Lava Crystal +item.waterSigil.name=Water Sigil +item.lavaSigil.name=Lava Sigil +item.voidSigil.name=Void Sigil +item.blankSlate.name=Blank Slate +item.reinforcedSlate.name=Reinforced Slate +item.sacrificialDagger.name=Sacrificial Knife +item.daggerOfSacrifice.name=Dagger of Sacrifice +item.airSigil.name=Air Sigil +item.sigilOfTheFastMiner.name=Sigil of the Fast Miner +item.sigilOfElementalAffinity.name=Sigil of Elemental Affinity +item.sigilOfHaste.name=Sigil of Haste +item.sigilOfHolding.name=Sigil of Holding +item.divinationSigil.name=Divination Sigil +item.waterScribeTool.name=Elemental Inscription Tool: Water +item.fireScribeTool.name=Elemental Inscription Tool: Fire +item.earthScribeTool.name=Elemental Inscription Tool: Earth +item.airScribeTool.name=Elemental Inscription Tool: Air +item.duskScribeTool.name=Elemental Inscription Tool: Dusk +item.activationCrystalWeak.name=Weak Activation Crystal +item.activationCrystalAwakened.name=Awakened Activation Crystal +item.boundPickaxe.name=Bound Pickaxe +item.boundAxe.name=Bound Axe +item.boundShovel.name=Bound Shovel +item.boundHelmet.name=Bound Helmet +item.boundPlate.name=Bound Plate +item.boundLeggings.name=Bound Leggings +item.boundBoots.name=Bound Boots +item.weakBloodShard.name=Weak Blood Shard +item.growthSigil.name=Sigil of the Green Grove +item.blankSpell.name=Unbound Crystal +item.alchemyFlask.name=Potion Flask +item.standardBindingAgent.name=Standard Binding Agent +item.mundanePowerCatalyst.name=Mundane Power Catalyst +item.averagePowerCatalyst.name=Average Power Catalyst +item.greaterPowerCatalyst.name=Greater Power Catalyst +item.mundaneLengtheningCatalyst.name=Mundane Lengthening Catalyst +item.averageLengtheningCatalyst.name=Average Lengthening Catalyst +item.greaterLengtheningCatalyst.name=Greater Lengthening Catalyst +item.incendium.name=Incendium +item.magicales.name=Magicales +item.sanctus.name=Sanctus +item.aether.name=Aether +item.simpleCatalyst.name=Simple Catalyst +item.crepitous.name=Crepitous +item.crystallos.name=Crystallos +item.terrae.name=Terrae +item.aquasalus.name=Aquasalus +item.tennebrae.name=Tennebrae +item.demonBloodShard.name=Demon Blood Shard +item.sigilOfWind.name=Sigil of the Whirlwind +item.telepositionFocus.name=Teleposition Focus +item.enhancedTelepositionFocus.name=Enhanced Teleposition Focus +item.reinforcedTelepositionFocus.name=Reinforced Teleposition Focus +item.demonicTelepositionFocus.name=Demonic Teleposition Focus +item.imbuedSlate.name=Imbued Slate +item.demonicSlate.name=Demonic Slate +item.sigilOfTheBridge.name=Sigil of the Phantom Bridge +item.armourInhibitor.name=Armour Inhibitor +item.cheatyItem.name=Orb of Testing +item.weakFillingAgent.name=Weak Filling Agent +item.standardFillingAgent.name=Standard Filling Agent +item.enhancedFillingAgent.name=Enhanced Filling Agent +item.weakBindingAgent.name=Weak Binding Agent +item.ritualDiviner.name=Ritual Diviner +item.sigilOfMagnetism.name=Sigil of Magnetism +item.itemDiabloKey.name=Key of Binding +item.energyBazooka.name=Energy Bazooka +item.bloodLightSigil.name=Sigil of the Blood Lamp +item.itemComplexSpellCrystal.name=[WIP] Complex Spell Crystal + +#Creative Tab +itemGroup.tabBloodMagic=Blood Magic \ No newline at end of file diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ebb892fbe7a833d2dc14537fce64aade0d87cd GIT binary patch literal 4387 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca6c0cc3d2305ae41e1299e3539969650a5aecb GIT binary patch literal 3718 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 kE3zUhvLY+8B1 Date: Sun, 23 Feb 2014 21:25:10 -0500 Subject: [PATCH 22/33] 1.7.2 is almost ready! --- .../AlchemicalWizardry.java | 8 +- .../common/AlchemicalWizardryEventHooks.java | 21 +++-- .../common/CommonProxy.java | 2 +- .../common/NewPacketHandler.java | 9 +-- .../projectile/EnergyBlastProjectile.java | 22 +++++- ...ntityEnergyBazookaSecondaryProjectile.java | 2 +- .../common/items/BoundArmour.java | 30 ++++---- .../common/items/BoundAxe.java | 9 ++- .../common/items/BoundPickaxe.java | 13 ++-- .../common/items/BoundShovel.java | 9 ++- .../RenderEnergyBlastProjectile.java | 22 ++++-- .../common/rituals/RitualEffectLeap.java | 4 +- .../common/rituals/Rituals.java | 6 +- .../spell/complex/EntitySpellProjectile.java | 2 +- .../complex/effect/SpellEffectEarth.java | 6 +- .../spell/complex/effect/SpellEffectWind.java | 3 +- .../earth/ProjectileEnvironmentalEarth.java | 72 ++++++++++++++++++ .../wind/ProjectileEnvironmentalWind.java | 53 +++++++++++++ .../common/spell/simple/SpellFireBurst.java | 3 +- .../common/tileEntity/TEAltar.java | 4 +- .../textures/models/ParadigmBlock.png | Bin 0 -> 923 bytes 21 files changed, 231 insertions(+), 69 deletions(-) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 0b802faa..c9da2243 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -247,7 +247,8 @@ public class AlchemicalWizardry ModItems.registerItems(); - FMLCommonHandler.instance().bus().register(new AlchemicalWizardryEventHooks()); + //FMLCommonHandler.instance().bus().register(new AlchemicalWizardryEventHooks()); + MinecraftForge.EVENT_BUS.register(new AlchemicalWizardryEventHooks()); NewPacketHandler.INSTANCE.ordinal(); } @@ -262,6 +263,7 @@ public class AlchemicalWizardry proxy.registerRenderers(); proxy.registerEntities(); + proxy.registerEntityTrackers(); //ItemStacks used for crafting go here ItemStack lavaBucketStack = new ItemStack(Items.lava_bucket); ItemStack cobblestoneStack = new ItemStack(Blocks.cobblestone); @@ -489,7 +491,7 @@ public class AlchemicalWizardry //Fuel handler GameRegistry.registerFuelHandler(new AlchemicalWizardryFuelHandler()); //EntityRegistry.registerModEntity(EnergyBlastProjectile.class, "BlasterProj", 0, this, 128, 5, true); - proxy.registerEntityTrackers(); + //Gui registration // NetworkRegistry.instance().registerGuiHandler(this, new GuiHandlerAltar()); Rituals.loadRituals(); @@ -502,7 +504,7 @@ public class AlchemicalWizardry //MinecraftForge.setToolClass(ModItems.boundPickaxe, "pickaxe", 5); //MinecraftForge.setToolClass(ModItems.boundAxe, "axe", 5); //MinecraftForge.setToolClass(ModItems.boundShovel, "shovel", 5); - FMLCommonHandler.instance().bus().register(new ModLivingDropsEvent()); + MinecraftForge.EVENT_BUS.register(new ModLivingDropsEvent()); proxy.InitRendering(); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); // ItemStack[] comp = new ItemStack[5]; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index d84a11dd..52a8e8a4 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -82,14 +82,14 @@ public class AlchemicalWizardryEventHooks // event.setResult(Result.DEFAULT); // } - @SubscribeEvent - public void onPlayerTickEnd(PlayerTickEvent event) - { - if(event.type.equals(Type.PLAYER) && event.phase.equals(TickEvent.Phase.END)) - { - ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, event.player.capabilities, Float.valueOf(0.1f), new String[]{"walkSpeed", "g", "field_75097_g"}); - } - } +// @SubscribeEvent +// public void onPlayerTickEnd(PlayerTickEvent event) +// { +// if(event.type.equals(Type.PLAYER) && event.phase.equals(TickEvent.Phase.END)) +// { +// ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, event.player.capabilities, Float.valueOf(0.1f), new String[]{"walkSpeed", "g", "field_75097_g"}); +// } +// } @SubscribeEvent public void onEntityUpdate(LivingUpdateEvent event) @@ -104,6 +104,11 @@ public class AlchemicalWizardryEventHooks int yPos = (int)(blockVector.yCoord); int zPos = (int)(blockVector.zCoord); + if(entityLiving instanceof EntityPlayer) + { + ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, ((EntityPlayer)event.entityLiving).capabilities, Float.valueOf(0.1f), new String[]{"walkSpeed", "g", "field_75097_g"}); + } + if (entityLiving instanceof EntityPlayer && entityLiving.worldObj.isRemote) { EntityPlayer entityPlayer = (EntityPlayer) entityLiving; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java index 43c7b129..d4c1198e 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/CommonProxy.java @@ -76,7 +76,7 @@ public class CommonProxy EntityRegistry.registerModEntity(EntityEnergyBazookaMainProjectile.class, "energyBazookaMain", 10, AlchemicalWizardry.instance, 128, 3, true); EntityRegistry.registerModEntity(EntityEnergyBazookaSecondaryProjectile.class, "energyBazookaSecondary", 11, AlchemicalWizardry.instance, 128, 3, true); EntityRegistry.registerModEntity(EntityBloodLightProjectile.class, "bloodLightProjectile", 12, AlchemicalWizardry.instance, 128, 3, true); - EntityRegistry.registerModEntity(EntityMeteor.class, "Meteor", 13, AlchemicalWizardry.instance, 128, 3, true); + EntityRegistry.registerModEntity(EntityMeteor.class, "meteor", 13, AlchemicalWizardry.instance, 120, 3, true); EntityRegistry.registerModEntity(EntitySpellProjectile.class, "spellProjectile", 14, AlchemicalWizardry.instance, 128, 3, true); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java index f492117c..8e55d286 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java @@ -70,7 +70,7 @@ public enum NewPacketHandler FMLEmbeddedChannel clientChannel = this.channels.get(Side.CLIENT); String tileAltarCodec = clientChannel.findChannelHandlerNameForType(TEAltarCodec.class); - clientChannel.pipeline().addAfter(tileAltarCodec, "ClientHandler", new TEAltarMessageHandler()); + clientChannel.pipeline().addAfter(tileAltarCodec, "TEAltarHandler", new TEAltarMessageHandler()); clientChannel.pipeline().addAfter(tileAltarCodec, "TEOrientableHandler", new TEOrientableMessageHandler()); clientChannel.pipeline().addAfter(tileAltarCodec, "TEPedestalHandler", new TEPedestalMessageHandler()); clientChannel.pipeline().addAfter(tileAltarCodec, "TEPlinthHandler", new TEPlinthMessageHandler()); @@ -100,12 +100,6 @@ public enum NewPacketHandler if (te instanceof TEAltar) { TEAltar altar = (TEAltar) te; - - System.out.println("x: " + msg.x + ", y: " + msg.y + ", z: " + msg.z); - for(int in : msg.items) - { - System.out.println("" + in); - } altar.handlePacketData(msg.items, msg.fluids, msg.capacity); } @@ -362,7 +356,6 @@ public enum NewPacketHandler { int i = items[j]; target.writeInt(i); - System.out.println("" + i); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java index 49460c52..e41d6468 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java @@ -17,11 +17,12 @@ import net.minecraft.util.MathHelper; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import cpw.mods.fml.common.registry.IThrowableEntity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; //Shamelessly ripped off from x3n0ph0b3 -public class EnergyBlastProjectile extends Entity implements IProjectile +public class EnergyBlastProjectile extends Entity implements IProjectile, IThrowableEntity { protected int xTile = -1; protected int yTile = -1; @@ -43,6 +44,7 @@ public class EnergyBlastProjectile extends Entity implements IProjectile { super(par1World); this.setSize(0.5F, 0.5F); + this.maxTicksInAir = 600; } public EnergyBlastProjectile(World par1World, double par2, double par4, double par6) @@ -51,6 +53,7 @@ public class EnergyBlastProjectile extends Entity implements IProjectile this.setSize(0.5F, 0.5F); this.setPosition(par2, par4, par6); yOffset = 0.0F; + this.maxTicksInAir = 600; } public EnergyBlastProjectile(World par1World, EntityLivingBase par2EntityPlayer, int damage) @@ -267,7 +270,7 @@ public class EnergyBlastProjectile extends Entity implements IProjectile Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); - MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); @@ -505,4 +508,19 @@ public class EnergyBlastProjectile extends Entity implements IProjectile { return 0; } + + @Override + public Entity getThrower() + { + // TODO Auto-generated method stub + return this.shootingEntity; + } + + @Override + public void setThrower(Entity entity) + { + if(entity instanceof EntityLivingBase) + this.shootingEntity = (EntityLivingBase)entity; + + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java index 950bfbf0..112e766e 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java @@ -213,7 +213,7 @@ public class EntityEnergyBazookaSecondaryProjectile extends EnergyBlastProjectil Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); - MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java index d69a25a4..a507fa76 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java @@ -16,14 +16,18 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; +import net.minecraftforge.common.util.Constants; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.IBindable; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.Optional.Interface; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//,IRevealer, IGoggles +@Optional.InterfaceList(value = {@Interface(iface="IRevealer", modid = "Thaumcraft"), @Interface(iface="IGoggles", modid = "Thaumcraft")}) +public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable //,IRevealer, IGoggles { private static int invSize = 9; private static IIcon helmetIcon; @@ -111,7 +115,7 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, return new ArmorProperties(-1, 0, 0); } - if (helmet.equals(ModItems.boundHelmet) || plate.equals(ModItems.boundPlate) || leggings.equals(ModItems.boundLeggings) || boots.equals(ModItems.boundBoots)) + if (helmet.getItem().equals(ModItems.boundHelmet) || plate.getItem().equals(ModItems.boundPlate) || leggings.getItem().equals(ModItems.boundLeggings) || boots.getItem().equals(ModItems.boundBoots)) { if (source.isUnblockable()) { @@ -329,12 +333,12 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, if (itemStack != null) { - if (itemStack.equals(ModItems.weakBloodShard)) + if (itemStack.getItem().equals(ModItems.weakBloodShard)) { max = Math.max(max, 1); } - if (itemStack.equals(ModItems.demonBloodShard)) + if (itemStack.getItem().equals(ModItems.demonBloodShard)) { max = Math.max(max, 2); } @@ -394,11 +398,10 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, if (itemTag == null) { itemStack.setTagCompound(new NBTTagCompound()); - return null; } ItemStack[] inv = new ItemStack[9]; - NBTTagList tagList = itemTag.getTagList("Inventory",0); + NBTTagList tagList = itemTag.getTagList("Inventory", Constants.NBT.TAG_COMPOUND); if (tagList == null) { @@ -407,14 +410,13 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, for (int i = 0; i < tagList.tagCount(); i++) { - NBTTagCompound tag = new NBTTagCompound(); + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); int slot = tag.getByte("Slot"); if (slot >= 0 && slot < invSize) { inv[slot] = ItemStack.loadItemStackFromNBT(tag); } - tagList.appendTag(tag); } return inv; @@ -463,7 +465,7 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, continue; } - if (item.equals(ModItems.voidSigil)) + if (item.getItem().equals(ModItems.voidSigil)) { return true; } @@ -540,27 +542,27 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor,IBindable//, continue; } - if (item.equals(ModItems.weakBloodOrb)) + if (item.getItem().equals(ModItems.weakBloodOrb)) { return 0.75f; } - if (item.equals(ModItems.apprenticeBloodOrb)) + if (item.getItem().equals(ModItems.apprenticeBloodOrb)) { return 0.50f; } - if (item.equals(ModItems.magicianBloodOrb)) + if (item.getItem().equals(ModItems.magicianBloodOrb)) { return 0.25f; } - if (item.equals(ModItems.masterBloodOrb)) + if (item.getItem().equals(ModItems.masterBloodOrb)) { return 0.0f; } - if (item.equals(ModItems.archmageBloodOrb)) + if (item.getItem().equals(ModItems.archmageBloodOrb)) { return 0.0f; } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java index f8adfe61..c8b6524e 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java @@ -19,10 +19,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -138,9 +140,10 @@ public class BoundAxe extends ItemAxe implements IBindable return par1ItemStack; } - int posX = (int) par3EntityPlayer.posX; - int posY = (int) par3EntityPlayer.posY; - int posZ = (int) par3EntityPlayer.posZ; + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (int)(blockVec.xCoord); + int posY = (int)(blockVec.xCoord); + int posZ = (int)(blockVec.xCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java index eae60f68..a0026c38 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java @@ -4,23 +4,23 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -136,10 +136,11 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable { return par1ItemStack; } - - int posX = (int) par3EntityPlayer.posX; - int posY = (int) par3EntityPlayer.posY; - int posZ = (int) par3EntityPlayer.posZ; + + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (int)(blockVec.xCoord); + int posY = (int)(blockVec.xCoord); + int posZ = (int)(blockVec.xCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java index c13f2ddd..1aba8e0f 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java @@ -17,10 +17,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import com.google.common.collect.Multimap; @@ -139,9 +141,10 @@ public class BoundShovel extends ItemSpade implements IBindable return par1ItemStack; } - int posX = (int) par3EntityPlayer.posX; - int posY = (int) par3EntityPlayer.posY; - int posZ = (int) par3EntityPlayer.posZ; + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (int)(blockVec.xCoord); + int posY = (int)(blockVec.xCoord); + int posZ = (int)(blockVec.xCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java index 787ec4ad..5e988929 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java @@ -1,19 +1,29 @@ package WayofTime.alchemicalWizardry.common.renderer.projectile; -import WayofTime.alchemicalWizardry.common.entity.projectile.*; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; +import net.minecraft.entity.IProjectile; import net.minecraft.util.ResourceLocation; + import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; +import WayofTime.alchemicalWizardry.common.entity.projectile.ExplosionProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.FireProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.HolyProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.IceProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.LightningBoltProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.MudProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WaterProjectile; +import WayofTime.alchemicalWizardry.common.entity.projectile.WindGustProjectile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + @SideOnly(Side.CLIENT) public class RenderEnergyBlastProjectile extends Render { - public void doRenderEnergyBlastProjectile(EnergyBlastProjectile entityShot, double par2, double par4, double par6, float par8, float par9) + public void doRenderEnergyBlastProjectile(Entity entityShot, double par2, double par4, double par6, float par8, float par9) { GL11.glPushMatrix(); GL11.glTranslatef((float) par2, (float) par4, (float) par6); @@ -37,9 +47,9 @@ public class RenderEnergyBlastProjectile extends Render @Override public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) { - if (par1Entity instanceof EnergyBlastProjectile) + if (par1Entity instanceof IProjectile) { - this.doRenderEnergyBlastProjectile((EnergyBlastProjectile) par1Entity, par2, par4, par6, par8, par9); + this.doRenderEnergyBlastProjectile(par1Entity, par2, par4, par6, par8, par9); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java index 37734a86..3798c560 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java @@ -67,7 +67,7 @@ public class RitualEffectLeap extends RitualEffect switch (direction) { case 1: - SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, 3.0); + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, -3.0); break; case 2: @@ -75,7 +75,7 @@ public class RitualEffectLeap extends RitualEffect break; case 3: - SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, -3.0); + SpellHelper.setPlayerSpeedFromServer((EntityPlayer)entityplayer, 0, 1.2, 3.0); break; case 4: diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java index d56d3e9c..b28c52d1 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/Rituals.java @@ -152,7 +152,7 @@ public class Rituals case 2: for (RitualComponent rc : ritual) { - test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + test = world.getBlock(x - rc.getZ(), y + rc.getY(), z + rc.getX()); if (!(test instanceof RitualStone)) { @@ -170,7 +170,7 @@ public class Rituals case 3: for (RitualComponent rc : ritual) { - test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + test = world.getBlock(x - rc.getX(), y + rc.getY(), z - rc.getZ()); if (!(test instanceof RitualStone)) { @@ -188,7 +188,7 @@ public class Rituals case 4: for (RitualComponent rc : ritual) { - test = world.getBlock(x + rc.getX(), y + rc.getY(), z + rc.getZ()); + test = world.getBlock(x + rc.getZ(), y + rc.getY(), z - rc.getX()); if (!(test instanceof RitualStone)) { diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index 016bfa48..4af98379 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -209,7 +209,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile Vec3 var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); Vec3 var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); - MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, true); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); var17 = worldObj.getWorldVec3Pool().getVecFromPool(posX, posY, posZ); var3 = worldObj.getWorldVec3Pool().getVecFromPool(posX + motionX, posY + motionY, posZ + motionZ); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index ee98c2d2..fe71038c 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileEnvironmentalEarth; public class SpellEffectEarth extends SpellEffect { @@ -30,7 +31,7 @@ public class SpellEffectEarth extends SpellEffect @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub + parad.addUpdateEffect(new ProjectileEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @@ -114,8 +115,7 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*2*(0.1d*(this.potencyEnhancement+1))*Math.pow(3.47,this.potencyEnhancement)); } @Override diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java index 0b9f2623..de3ca561 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileEnvironmentalWind; public class SpellEffectWind extends SpellEffect { @@ -30,7 +31,7 @@ public class SpellEffectWind extends SpellEffect @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub + parad.addUpdateEffect(new ProjectileEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java new file mode 100644 index 00000000..da958d8b --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java @@ -0,0 +1,72 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileUpdateEffect; + +public class ProjectileEnvironmentalEarth extends ProjectileUpdateEffect +{ + public ProjectileEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onUpdateEffect(Entity projectile) + { + Vec3 posVec = SpellHelper.getEntityBlockVector(projectile); + + int horizRange = this.powerUpgrades+1; + int vertRange = (int)(0.5*(this.powerUpgrades+1)); + int maxBlocks = (int)(2*Math.pow(3.47, this.potencyUpgrades)); + + int posX = (int)(posVec.xCoord); + int posY = (int)(posVec.yCoord); + int posZ = (int)(posVec.zCoord); + + World worldObj = projectile.worldObj; + + if(projectile instanceof EntitySpellProjectile) + { + int blocksBroken = ((EntitySpellProjectile) projectile).getBlocksBroken(); + + if(blocksBroken>=maxBlocks) + { + return; + } + + for(int i=-horizRange; i<=horizRange; i++) + { + for(int j=-vertRange; j<=vertRange; j++) + { + for(int k=-horizRange; k<=horizRange; k++) + { + if(!worldObj.isAirBlock(posX+i, posY+j, posZ+k)&&blocksBroken entitylist = SpellHelper.getEntitiesInRange(worldObj, projectile.posX, projectile.posY, projectile.posZ, horizRange, vertRange); + if(entitylist !=null) + { + for(Entity entity : entitylist) + { + if(entity instanceof EntityItem) + { + ((EntityItem)entity).delayBeforeCanPickup = 0; + entity.onCollideWithPlayer((EntityPlayer)shooter); + } + } + } + } + } + + + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java index de01a35f..c4ac72c2 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java @@ -45,7 +45,8 @@ public class SpellFireBurst extends HomSpell if (!par2World.isRemote) { //par2World.spawnEntityInWorld(new EnergyBlastProjectile(par2World, par3EntityPlayer, damage)); - par2World.spawnEntityInWorld(new FireProjectile(par2World, par3EntityPlayer, 7)); + FireProjectile proj = new FireProjectile(par2World, par3EntityPlayer, 7); + par2World.spawnEntityInWorld(proj); } return par1ItemStack; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java index 7312c391..e94d382d 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -685,9 +685,7 @@ public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFlui @Override public Packet getDescriptionPacket() { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - this.writeToNBT(nbttagcompound); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 2, nbttagcompound); + return NewPacketHandler.getPacket(this); } public void handlePacketData(int[] intData, int[] fluidData, int capacity) diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png new file mode 100644 index 0000000000000000000000000000000000000000..062cfc791a535fd72d58f2c3ef6956f5e482bc2a GIT binary patch literal 923 zcmV;M17!S(P)Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-U1gB5)3@d%4h%p11L#E zK~#9!?VLSt8bJ_-XHIEi|AI(v_zRRgEOSB~NxMqbOP%{og8f3{eBr9Nu*ekj5r8zMg#w z@I-5CtCZZMsL$`sQ+{mc!p!9*0JDl$>PobJ;8i0Wj`t_M+x4W`B+@#kr|KBBz=82T z8bQT!0cHk3IaX2unErjf`d4Dc=RN6x3kd9==>X=Hzo7cxVG#(h1-vRRMPM(X+{2>Z zxd5U*KMnZ&3X!EFXvVA?4*&q5Xk@OeqUjtz_reAO2mn9;pdK}VJne^SfI8o+gA4#F zL*`a+{BWp)(L)9R5CDJxK#5&Ik&cCfS1JNOK0eBWUVeYxy&b+~!#qCjDJ53qv$kzx zWUIUdcuEN|`+tv)Fp71sfg#nn{@r^P5qnDEH~%^az&sAVNc$pWE!jGP_&Q&}RGKZ| z&~^E<2(`!KwN|rtaw6VziVRTp3@~^(WxcczG&_O8s<(zirr|Ip9vwsU0RRL53cLl} xuj$+2^J@l Date: Tue, 25 Feb 2014 05:34:37 +0000 Subject: [PATCH 23/33] Make Alchemy flasks non-repairable setting alchemy flasks to be non-repairable, will stop items such as the ars magica repairer and my anvil from being able to repair flasks, which should be what you'd want from what I understand, since they have their own special repair method. --- .../alchemicalWizardry/common/items/potion/AlchemyFlask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java index 2e625415..56fba9c8 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java @@ -42,6 +42,7 @@ public class AlchemyFlask extends Item this.setMaxDamage(8); this.setMaxStackSize(1); setCreativeTab(AlchemicalWizardry.tabBloodMagic); + setNoRepair(); // TODO Auto-generated constructor stub } From 64e6ea2677483c5e4d7f7c080d3d0e01e697989a Mon Sep 17 00:00:00 2001 From: Qeliox Date: Fri, 28 Feb 2014 16:57:42 +0400 Subject: [PATCH 24/33] add for translation --- .gitignore | 1 + .../assets/alchemicalwizardry/lang/ru_RU.lang | 132 ++++++++++++++++++ 1.7.2/resources/assets/forge/lang/ru_RU.lang | 5 + 3 files changed, 138 insertions(+) create mode 100644 1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang create mode 100644 1.7.2/resources/assets/forge/lang/ru_RU.lang diff --git a/.gitignore b/.gitignore index 55a4602d..ecdd36b7 100644 --- a/.gitignore +++ b/.gitignore @@ -213,3 +213,4 @@ pip-log.txt #Mr Developer .mr.developer.cfg +*.stackdump diff --git a/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang b/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang new file mode 100644 index 00000000..df2c8853 --- /dev/null +++ b/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang @@ -0,0 +1,132 @@ +#Block Localization +tile.bloodAltar.name=Blood Altar +tile.bloodRune.blank.name=Blood Rune +tile.bloodRune.fill.name=Rune of Augmented Capacity +tile.bloodRune.empty.name=Rune of Dislocation +tile.bloodRune.test.name=Rune of the Orb +tile.speedRune.name=Speed Rune +tile.efficiencyRune.name=Efficiency Rune +tile.runeOfSacrifice.name=Rune of Sacrifice +tile.runeOfSelfSacrifice.name=Rune of Self-Sacrifice +tile.ritualStone.name=Ritual Stone +tile.blockMasterStone.name=Master Ritual Stone +tile.bloodSocket.name=Filled Socket +tile.imperfectRitualStone.name=Imperfect Ritual Stone +tile.armourForge.name=Soul Armour Forge +tile.emptySocket.name=Empty Socket +tile.bloodStoneBrick.name=Bloodstone Brick +tile.largeBloodStoneBrick.name=Large Bloodstone Brick +tile.blockWritingTable.name=Alchemic Chemistry Set +tile.blockHomHeart.name=Spell Table +tile.bloodPedestal.name=Arcane Pedestal +tile.bloodPlinth.name=Arcane Plinth +tile.bloodTeleposer.name=Teleposer +tile.blockConduit.name=Spell Conduit +tile.blockSpellParadigm.projectile.name=Particle Generator +tile.blockSpellParadigm.self.name=Self Augmentator +tile.blockSpellParadigm.melee.name=Melee Aggregator +tile.blockSpellEnhancement.power1.name=Unstable Spell Empowerer +tile.blockSpellEnhancement.power2.name=Standard Spell Empowerer +tile.blockSpellEnhancement.power3.name=Reinforced Spell Empowerer +tile.blockSpellEnhancement.power4.name=Imbued Spell Empowerer +tile.blockSpellEnhancement.power5.name=Demonic Spell Empowerer +tile.blockSpellEnhancement.cost1.name=Unstable Spell Dampener +tile.blockSpellEnhancement.cost2.name=Standard Spell Dampener +tile.blockSpellEnhancement.cost3.name=Reinforced Spell Dampener +tile.blockSpellEnhancement.cost4.name=Imbued Spell Dampener +tile.blockSpellEnhancement.cost5.name=Demonic Spell Dampener +tile.blockSpellEnhancement.potency1.name=Unstable Spell Augmentor +tile.blockSpellEnhancement.potency2.name=Standard Spell Augmentor +tile.blockSpellEnhancement.potency3.name=Reinforced Spell Augmentor +tile.blockSpellEnhancement.potency4.name=Imbued Spell Augmentor +tile.blockSpellEnhancement.potency5.name=Demonic Spell Augmentor +tile.blockSpellModifier.default.name=Default Spell Modifier +tile.blockSpellModifier.offensive.name=Offensive Spell Modifier +tile.blockSpellModifier.defensive.name=Defensive Spell Modifier +tile.blockSpellModifier.environmental.name=Environmental Spell Modifier +tile.blockSpellEffect.fire.name=Crucible of Fire +tile.blockSpellEffect.ice.name=Ice Maker +tile.blockSpellEffect.wind.name=Wind Generator +tile.blockSpellEffect.earth.name=Earth Former + +#Item Localization +item.weakBloodOrb.name=Weak Blood Orb +item.apprenticeBloodOrb.name=Apprentice Blood Orb +item.magicianBloodOrb.name=Magician's Blood Orb +item.masterBloodOrb.name=Master Blood Orb +item.archmageBloodOrb.name=Archamge's Blood Orb +item.energyBlast.name=Energy Blaster +item.energySword.name=Bound Blade +item.lavaCrystal.name=Lava Crystal +item.waterSigil.name=Water Sigil +item.lavaSigil.name=Lava Sigil +item.voidSigil.name=Void Sigil +item.blankSlate.name=Blank Slate +item.reinforcedSlate.name=Reinforced Slate +item.sacrificialDagger.name=Sacrificial Knife +item.daggerOfSacrifice.name=Dagger of Sacrifice +item.airSigil.name=Air Sigil +item.sigilOfTheFastMiner.name=Sigil of the Fast Miner +item.sigilOfElementalAffinity.name=Sigil of Elemental Affinity +item.sigilOfHaste.name=Sigil of Haste +item.sigilOfHolding.name=Sigil of Holding +item.divinationSigil.name=Divination Sigil +item.waterScribeTool.name=Elemental Inscription Tool: Water +item.fireScribeTool.name=Elemental Inscription Tool: Fire +item.earthScribeTool.name=Elemental Inscription Tool: Earth +item.airScribeTool.name=Elemental Inscription Tool: Air +item.duskScribeTool.name=Elemental Inscription Tool: Dusk +item.activationCrystalWeak.name=Weak Activation Crystal +item.activationCrystalAwakened.name=Awakened Activation Crystal +item.boundPickaxe.name=Bound Pickaxe +item.boundAxe.name=Bound Axe +item.boundShovel.name=Bound Shovel +item.boundHelmet.name=Bound Helmet +item.boundPlate.name=Bound Plate +item.boundLeggings.name=Bound Leggings +item.boundBoots.name=Bound Boots +item.weakBloodShard.name=Weak Blood Shard +item.growthSigil.name=Sigil of the Green Grove +item.blankSpell.name=Unbound Crystal +item.alchemyFlask.name=Potion Flask +item.standardBindingAgent.name=Standard Binding Agent +item.mundanePowerCatalyst.name=Mundane Power Catalyst +item.averagePowerCatalyst.name=Average Power Catalyst +item.greaterPowerCatalyst.name=Greater Power Catalyst +item.mundaneLengtheningCatalyst.name=Mundane Lengthening Catalyst +item.averageLengtheningCatalyst.name=Average Lengthening Catalyst +item.greaterLengtheningCatalyst.name=Greater Lengthening Catalyst +item.incendium.name=Incendium +item.magicales.name=Magicales +item.sanctus.name=Sanctus +item.aether.name=Aether +item.simpleCatalyst.name=Simple Catalyst +item.crepitous.name=Crepitous +item.crystallos.name=Crystallos +item.terrae.name=Terrae +item.aquasalus.name=Aquasalus +item.tennebrae.name=Tennebrae +item.demonBloodShard.name=Demon Blood Shard +item.sigilOfWind.name=Sigil of the Whirlwind +item.telepositionFocus.name=Teleposition Focus +item.enhancedTelepositionFocus.name=Enhanced Teleposition Focus +item.reinforcedTelepositionFocus.name=Reinforced Teleposition Focus +item.demonicTelepositionFocus.name=Demonic Teleposition Focus +item.imbuedSlate.name=Imbued Slate +item.demonicSlate.name=Demonic Slate +item.sigilOfTheBridge.name=Sigil of the Phantom Bridge +item.armourInhibitor.name=Armour Inhibitor +item.cheatyItem.name=Orb of Testing +item.weakFillingAgent.name=Weak Filling Agent +item.standardFillingAgent.name=Standard Filling Agent +item.enhancedFillingAgent.name=Enhanced Filling Agent +item.weakBindingAgent.name=Weak Binding Agent +item.ritualDiviner.name=Ritual Diviner +item.sigilOfMagnetism.name=Sigil of Magnetism +item.itemDiabloKey.name=Key of Binding +item.energyBazooka.name=Energy Bazooka +item.bloodLightSigil.name=Sigil of the Blood Lamp +item.itemComplexSpellCrystal.name=[WIP] Complex Spell Crystal + +#Creative Tab +itemGroup.tabBloodMagic=Blood Magic \ No newline at end of file diff --git a/1.7.2/resources/assets/forge/lang/ru_RU.lang b/1.7.2/resources/assets/forge/lang/ru_RU.lang new file mode 100644 index 00000000..2f9368d4 --- /dev/null +++ b/1.7.2/resources/assets/forge/lang/ru_RU.lang @@ -0,0 +1,5 @@ +commands.forge.usage=Use /forge . Subcommands are tps, track +commands.forge.usage.tracking=Use /forge track . Valid types are te (Tile Entities). Duration is < 60. +commands.forge.tps.summary=%s : Mean tick time: %d ms. Mean TPS: %d + +commands.forge.tracking.te.enabled=Tile Entity tracking enabled for %d seconds. \ No newline at end of file From 1104871f91774a3cf0836928c3df7821859d926f Mon Sep 17 00:00:00 2001 From: Aleksey Nazarov Date: Fri, 28 Feb 2014 16:14:25 +0300 Subject: [PATCH 25/33] few changes --- .../assets/alchemicalwizardry/lang/ru_RU.lang | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang b/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang index df2c8853..588b7423 100644 --- a/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang +++ b/1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang @@ -1,17 +1,17 @@ #Block Localization -tile.bloodAltar.name=Blood Altar -tile.bloodRune.blank.name=Blood Rune -tile.bloodRune.fill.name=Rune of Augmented Capacity +tile.bloodAltar.name=Кровавый алтарь +tile.bloodRune.blank.name=Руна крови +tile.bloodRune.fill.name=Руна дополнительной ёмкости tile.bloodRune.empty.name=Rune of Dislocation tile.bloodRune.test.name=Rune of the Orb -tile.speedRune.name=Speed Rune -tile.efficiencyRune.name=Efficiency Rune -tile.runeOfSacrifice.name=Rune of Sacrifice -tile.runeOfSelfSacrifice.name=Rune of Self-Sacrifice -tile.ritualStone.name=Ritual Stone -tile.blockMasterStone.name=Master Ritual Stone +tile.speedRune.name=Руна скорости +tile.efficiencyRune.name=Руна эффективности +tile.runeOfSacrifice.name=Руна жертвоприношения +tile.runeOfSelfSacrifice.name=Руна самопожертвования +tile.ritualStone.name=Ритуальный камень +tile.blockMasterStone.name=Мастерский ритуальный камень tile.bloodSocket.name=Filled Socket -tile.imperfectRitualStone.name=Imperfect Ritual Stone +tile.imperfectRitualStone.name=Несовершенный ритуальный камень tile.armourForge.name=Soul Armour Forge tile.emptySocket.name=Empty Socket tile.bloodStoneBrick.name=Bloodstone Brick @@ -22,7 +22,7 @@ tile.bloodPedestal.name=Arcane Pedestal tile.bloodPlinth.name=Arcane Plinth tile.bloodTeleposer.name=Teleposer tile.blockConduit.name=Spell Conduit -tile.blockSpellParadigm.projectile.name=Particle Generator +tile.blockSpellParadigm.projectile.name=Генератор частиц tile.blockSpellParadigm.self.name=Self Augmentator tile.blockSpellParadigm.melee.name=Melee Aggregator tile.blockSpellEnhancement.power1.name=Unstable Spell Empowerer @@ -45,8 +45,8 @@ tile.blockSpellModifier.offensive.name=Offensive Spell Modifier tile.blockSpellModifier.defensive.name=Defensive Spell Modifier tile.blockSpellModifier.environmental.name=Environmental Spell Modifier tile.blockSpellEffect.fire.name=Crucible of Fire -tile.blockSpellEffect.ice.name=Ice Maker -tile.blockSpellEffect.wind.name=Wind Generator +tile.blockSpellEffect.ice.name=Генератор льда +tile.blockSpellEffect.wind.name=Генератор ветра tile.blockSpellEffect.earth.name=Earth Former #Item Localization @@ -58,19 +58,19 @@ item.archmageBloodOrb.name=Archamge's Blood Orb item.energyBlast.name=Energy Blaster item.energySword.name=Bound Blade item.lavaCrystal.name=Lava Crystal -item.waterSigil.name=Water Sigil -item.lavaSigil.name=Lava Sigil -item.voidSigil.name=Void Sigil -item.blankSlate.name=Blank Slate -item.reinforcedSlate.name=Reinforced Slate -item.sacrificialDagger.name=Sacrificial Knife -item.daggerOfSacrifice.name=Dagger of Sacrifice -item.airSigil.name=Air Sigil -item.sigilOfTheFastMiner.name=Sigil of the Fast Miner +item.waterSigil.name=Символ воды +item.lavaSigil.name=Символ лавы +item.voidSigil.name=Символ пустоты +item.blankSlate.name=Чистый лист +item.reinforcedSlate.name=Усиленный лист +item.sacrificialDagger.name=Жертвенный нож +item.daggerOfSacrifice.name=Кинжал жертвоприношения +item.airSigil.name=Символ воздуха +item.sigilOfTheFastMiner.name=Символ ускоренной добычи item.sigilOfElementalAffinity.name=Sigil of Elemental Affinity -item.sigilOfHaste.name=Sigil of Haste +item.sigilOfHaste.name=Символ спешки item.sigilOfHolding.name=Sigil of Holding -item.divinationSigil.name=Divination Sigil +item.divinationSigil.name=Символ предсказания item.waterScribeTool.name=Elemental Inscription Tool: Water item.fireScribeTool.name=Elemental Inscription Tool: Fire item.earthScribeTool.name=Elemental Inscription Tool: Earth @@ -99,7 +99,7 @@ item.greaterLengtheningCatalyst.name=Greater Lengthening Catalyst item.incendium.name=Incendium item.magicales.name=Magicales item.sanctus.name=Sanctus -item.aether.name=Aether +item.aether.name=Эфир item.simpleCatalyst.name=Simple Catalyst item.crepitous.name=Crepitous item.crystallos.name=Crystallos @@ -107,14 +107,14 @@ item.terrae.name=Terrae item.aquasalus.name=Aquasalus item.tennebrae.name=Tennebrae item.demonBloodShard.name=Demon Blood Shard -item.sigilOfWind.name=Sigil of the Whirlwind +item.sigilOfWind.name=Символ бури item.telepositionFocus.name=Teleposition Focus item.enhancedTelepositionFocus.name=Enhanced Teleposition Focus item.reinforcedTelepositionFocus.name=Reinforced Teleposition Focus item.demonicTelepositionFocus.name=Demonic Teleposition Focus -item.imbuedSlate.name=Imbued Slate -item.demonicSlate.name=Demonic Slate -item.sigilOfTheBridge.name=Sigil of the Phantom Bridge +item.imbuedSlate.name=Прочный лист +item.demonicSlate.name=Демонический лист +item.sigilOfTheBridge.name=Символ призрачного моста item.armourInhibitor.name=Armour Inhibitor item.cheatyItem.name=Orb of Testing item.weakFillingAgent.name=Weak Filling Agent @@ -122,11 +122,11 @@ item.standardFillingAgent.name=Standard Filling Agent item.enhancedFillingAgent.name=Enhanced Filling Agent item.weakBindingAgent.name=Weak Binding Agent item.ritualDiviner.name=Ritual Diviner -item.sigilOfMagnetism.name=Sigil of Magnetism +item.sigilOfMagnetism.name=Символ магнетизма item.itemDiabloKey.name=Key of Binding item.energyBazooka.name=Energy Bazooka -item.bloodLightSigil.name=Sigil of the Blood Lamp +item.bloodLightSigil.name=Символ кровавой лампы item.itemComplexSpellCrystal.name=[WIP] Complex Spell Crystal #Creative Tab -itemGroup.tabBloodMagic=Blood Magic \ No newline at end of file +itemGroup.tabBloodMagic=Кровавая магия From b34ff3c58ec01d3c6949f711215714eaae558a68 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 7 Mar 2014 07:02:18 -0500 Subject: [PATCH 26/33] Getting more spell stuff done --- .../AlchemicalWizardry.java | 42 ++++---- .../BloodMagicConfiguration.java | 2 + .../alchemicalWizardry/ModBlocks.java | 10 +- .../alchemicalWizardry/ModItems.java | 74 ++++++++++++- .../common/AlchemicalWizardryEventHooks.java | 33 +++++- .../AltarRecipeRegistry.java | 2 +- .../common/items/BoundAxe.java | 4 +- .../common/items/BoundPickaxe.java | 4 +- .../common/items/BoundShovel.java | 4 +- .../common/items/ItemComponents.java | 80 ++++++++++++++ .../common/{ => potion}/PotionBoost.java | 2 +- .../common/{ => potion}/PotionDrowning.java | 2 +- .../common/potion/PotionFireFuse.java | 18 ++++ .../common/{ => potion}/PotionFlameCloak.java | 2 +- .../common/{ => potion}/PotionFlight.java | 2 +- .../common/potion/PotionHeavyHeart.java | 18 ++++ .../common/{ => potion}/PotionIceCloak.java | 2 +- .../common/{ => potion}/PotionInhibit.java | 2 +- .../{ => potion}/PotionProjectileProtect.java | 2 +- .../{ => potion}/PotionReciprocation.java | 2 +- .../TESpellEnhancementBlockItemRenderer.java | 11 +- .../spell/complex/EntitySpellProjectile.java | 2 +- .../complex/effect/SpellEffectEarth.java | 29 +++--- .../spell/complex/effect/SpellEffectFire.java | 35 +++---- .../spell/complex/effect/SpellEffectWind.java | 21 ++-- .../spell/complex/effect/SpellHelper.java | 37 ++++++- .../IProjectileImpactEffect.java | 2 +- .../MeleeSpellCenteredWorldEffect.java | 34 ++++++ .../earth/MeleeDefaultEarth.java | 38 +++++++ .../earth/ProjectileDefaultEarth.java | 58 +++++++++++ .../earth/ProjectileDefensiveEarth.java | 66 ++++++++++++ .../earth/ProjectileEnvironmentalEarth.java | 2 +- .../earth/ProjectileOffensiveEarth.java | 98 ++++++++++++++++++ .../fire/ProjectileDefaultFire.java | 56 +++++++--- .../fire/ProjectileDefensiveFire.java | 47 +++++++++ .../fire/ProjectileEnvironmentalFire.java | 46 ++++++++ .../fire/ProjectileOffensiveFire.java | 88 ++++++++++++++++ .../impactEffects/fire/SelfDefensiveFire.java | 27 ++++- .../ice/ProjectileDefaultIce.java | 2 +- .../ice/ProjectileDefensiveIce.java | 2 +- .../ice/ProjectileOffensiveIce.java | 2 +- .../wind/ProjectileDefaultWind.java | 33 ++++++ .../wind/ProjectileOffensiveWind.java | 33 ++++++ .../common/tileEntity/TEPlinth.java | 4 + .../tileEntity/TESpellEnhancementBlock.java | 6 ++ .../common/tileEntity/TEWritingTable.java | 10 +- .../textures/items/baseItemQuartzRod.png | Bin 0 -> 251 bytes .../textures/models/SpellEnhancementCost1.png | Bin 0 -> 4871 bytes .../textures/models/SpellEnhancementCost2.png | Bin 0 -> 3603 bytes .../textures/models/SpellEnhancementCost3.png | Bin 0 -> 4025 bytes .../models/SpellEnhancementPotency1.png | Bin 0 -> 4329 bytes .../models/SpellEnhancementPotency2.png | Bin 0 -> 3539 bytes .../models/SpellEnhancementPotency3.png | Bin 0 -> 3951 bytes .../models/SpellEnhancementPower1.png | Bin 4387 -> 4449 bytes .../models/SpellEnhancementPower2.png | Bin 3718 -> 3738 bytes .../models/SpellEnhancementPower3.png | Bin 3718 -> 4068 bytes .../AlchemicalWizardry.java | 16 +-- .../common/items/ActivationCrystal.java | 7 ++ .../common/items/BlankSpell.java | 6 ++ .../common/items/BoundArmour.java | 19 ++-- .../common/items/DaggerOfSacrifice.java | 11 +- .../common/items/EnergyBattery.java | 5 +- .../common/items/EnergyBazooka.java | 6 ++ .../common/items/EnergyBlast.java | 6 ++ .../common/items/ItemDiabloKey.java | 7 +- .../common/items/ItemRitualDiviner.java | 7 ++ .../common/items/SacrificialDagger.java | 5 +- .../common/items/sigil/AirSigil.java | 6 ++ .../common/items/sigil/DivinationSigil.java | 6 ++ .../items/sigil/ItemBloodLightSigil.java | 7 ++ .../common/items/sigil/LavaSigil.java | 6 ++ .../common/items/sigil/SigilOfGrowth.java | 11 ++ .../common/items/sigil/SigilOfHaste.java | 11 ++ .../common/items/sigil/SigilOfMagnetism.java | 11 ++ .../common/items/sigil/VoidSigil.java | 6 ++ .../common/items/sigil/WaterSigil.java | 6 ++ .../common/rituals/Rituals.java | 2 +- .../spell/complex/effect/SpellHelper.java | 29 ++++++ 78 files changed, 1133 insertions(+), 159 deletions(-) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionBoost.java (86%) rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionDrowning.java (86%) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionFlameCloak.java (86%) rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionFlight.java (86%) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionIceCloak.java (86%) rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionInhibit.java (86%) rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionProjectileProtect.java (86%) rename 1.7.2/java/WayofTime/alchemicalWizardry/common/{ => potion}/PotionReciprocation.java (86%) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileOffensiveEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefensiveFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileEnvironmentalFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileOffensiveFire.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost3.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency2.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency3.png diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index c9da2243..62f88d07 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -4,7 +4,6 @@ import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -23,27 +22,16 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.oredict.OreDictionary; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryFuelHandler; -import WayofTime.alchemicalWizardry.common.AlchemicalWizardryTickHandler; import WayofTime.alchemicalWizardry.common.CommonProxy; import WayofTime.alchemicalWizardry.common.EntityAirElemental; import WayofTime.alchemicalWizardry.common.LifeBucketHandler; import WayofTime.alchemicalWizardry.common.LifeEssence; import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent; import WayofTime.alchemicalWizardry.common.NewPacketHandler; -import WayofTime.alchemicalWizardry.common.PacketHandler; -import WayofTime.alchemicalWizardry.common.PotionBoost; -import WayofTime.alchemicalWizardry.common.PotionDrowning; -import WayofTime.alchemicalWizardry.common.PotionFlameCloak; -import WayofTime.alchemicalWizardry.common.PotionFlight; -import WayofTime.alchemicalWizardry.common.PotionIceCloak; -import WayofTime.alchemicalWizardry.common.PotionInhibit; -import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; -import WayofTime.alchemicalWizardry.common.PotionReciprocation; import WayofTime.alchemicalWizardry.common.alchemy.AlchemicalPotionCreationHandler; import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; import WayofTime.alchemicalWizardry.common.altarRecipeRegistry.AltarRecipeRegistry; import WayofTime.alchemicalWizardry.common.block.ArmourForge; -import WayofTime.alchemicalWizardry.common.block.LifeEssenceBlock; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; @@ -58,16 +46,18 @@ 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.items.ItemBloodRuneBlock; import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; -import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock; -import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; -import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; -import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; -import WayofTime.alchemicalWizardry.common.items.LifeBucket; -import WayofTime.alchemicalWizardry.common.items.forestry.ItemBloodFrame; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; -import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; +import WayofTime.alchemicalWizardry.common.potion.PotionBoost; +import WayofTime.alchemicalWizardry.common.potion.PotionDrowning; +import WayofTime.alchemicalWizardry.common.potion.PotionFireFuse; +import WayofTime.alchemicalWizardry.common.potion.PotionFlameCloak; +import WayofTime.alchemicalWizardry.common.potion.PotionFlight; +import WayofTime.alchemicalWizardry.common.potion.PotionHeavyHeart; +import WayofTime.alchemicalWizardry.common.potion.PotionIceCloak; +import WayofTime.alchemicalWizardry.common.potion.PotionInhibit; +import WayofTime.alchemicalWizardry.common.potion.PotionProjectileProtect; +import WayofTime.alchemicalWizardry.common.potion.PotionReciprocation; import WayofTime.alchemicalWizardry.common.rituals.Rituals; import WayofTime.alchemicalWizardry.common.spell.simple.HomSpellRegistry; import WayofTime.alchemicalWizardry.common.spell.simple.SpellEarthBender; @@ -97,7 +87,6 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import WayofTime.alchemicalWizardry.common.tileEntity.gui.GuiHandler; -import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -109,8 +98,6 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.LanguageRegistry; -import cpw.mods.fml.relauncher.Side; @Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.8.0") //@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {"BloodAltar", "particle", "SetLifeEssence", "GetLifeEssence", "Ritual", "GetAltarEssence", "TESocket", "TEWritingTable", "CustomParticle", "SetPlayerVel", "SetPlayerPos", "TEPedestal", "TEPlinth", "TETeleposer", "InfiniteLPPath", "TEOrientor"}, packetHandler = PacketHandler.class) @@ -135,6 +122,8 @@ public class AlchemicalWizardry public static Potion customPotionReciprocation; public static Potion customPotionFlameCloak; public static Potion customPotionIceCloak; + public static Potion customPotionHeavyHeart; + public static Potion customPotionFireFuse; public static int customPotionDrowningID; public static int customPotionBoostID; @@ -144,6 +133,8 @@ public class AlchemicalWizardry public static int customPotionReciprocationID; public static int customPotionFlameCloakID; public static int customPotionIceCloakID; + public static int customPotionHeavyHeartID; + public static int customPotionFireFuseID; public static boolean isThaumcraftLoaded; public static boolean isForestryLoaded; @@ -438,7 +429,10 @@ public class AlchemicalWizardry customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); - + customPotionHeavyHeart = (new PotionHeavyHeart(customPotionHeavyHeartID,true,0).setIconIndex(0, 0).setPotionName("Heavy Heart")); + customPotionFireFuse = (new PotionFireFuse(customPotionFireFuseID,true,0).setIconIndex(0, 0).setPotionName("Fire Fuse")); + + //FluidStack lifeEssenceFluidStack = new FluidStack(lifeEssenceFluid, 1); //LiquidStack lifeEssence = new LiquidStack(lifeEssenceFlowing, 1); //LiquidDictionary.getOrCreateLiquid("Life Essence", lifeEssence); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 59b4e98a..88184381 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -46,6 +46,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.customPotionReciprocationID = config.get("Potion ID", "Reciprocation", 105).getInt(); AlchemicalWizardry.customPotionFlameCloakID = config.get("Potion ID","FlameCloak",106).getInt(); AlchemicalWizardry.customPotionIceCloakID = config.get("Potion ID","IceCloak",107).getInt(); + AlchemicalWizardry.customPotionHeavyHeartID = config.get("Potion ID","HeavyHeart",108).getInt(); + AlchemicalWizardry.customPotionFireFuseID = config.get("Potion ID","FireFuse",109).getInt(); MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java index 18cf8810..19a2a061 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModBlocks.java @@ -90,10 +90,6 @@ public class ModBlocks GameRegistry.registerBlock(ModBlocks.blockAltar, "Altar"); GameRegistry.registerBlock(ModBlocks.bloodRune, ItemBloodRuneBlock.class, "AlchemicalWizardry" + (ModBlocks.bloodRune.getUnlocalizedName().substring(5))); GameRegistry.registerBlock(ModBlocks.blockLifeEssence, "lifeEssence"); - GameRegistry.registerBlock(ModBlocks.blockSpellParadigm, ItemSpellParadigmBlock.class, "AlchemicalWizardry" + (ModBlocks.blockSpellParadigm.getUnlocalizedName())); - GameRegistry.registerBlock(ModBlocks.blockSpellEnhancement, ItemSpellEnhancementBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEnhancement.getUnlocalizedName())); - GameRegistry.registerBlock(ModBlocks.blockSpellModifier, ItemSpellModifierBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellModifier.getUnlocalizedName())); - GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); GameRegistry.registerBlock(ModBlocks.speedRune, "speedRune"); GameRegistry.registerBlock(ModBlocks.efficiencyRune, "efficiencyRune"); GameRegistry.registerBlock(ModBlocks.runeOfSacrifice, "runeOfSacrifice"); @@ -114,7 +110,13 @@ public class ModBlocks GameRegistry.registerBlock(ModBlocks.blockTeleposer, "blockTeleposer"); GameRegistry.registerBlock(ModBlocks.spectralBlock, "spectralBlock"); GameRegistry.registerBlock(ModBlocks.blockBloodLight, "bloodLight"); + GameRegistry.registerBlock(ModBlocks.blockConduit,"blockConduit"); + GameRegistry.registerBlock(ModBlocks.blockSpellParadigm, ItemSpellParadigmBlock.class, "AlchemicalWizardry" + (ModBlocks.blockSpellParadigm.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellEnhancement, ItemSpellEnhancementBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEnhancement.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellModifier, ItemSpellModifierBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellModifier.getUnlocalizedName())); + GameRegistry.registerBlock(ModBlocks.blockSpellEffect, ItemSpellEffectBlock.class,"AlchemicalWizardry" + (ModBlocks.blockSpellEffect.getUnlocalizedName())); + } public static void registerBlocksInInit() diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java index f5c8bd83..ba96f5d8 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java @@ -1,13 +1,72 @@ package WayofTime.alchemicalWizardry; -import cpw.mods.fml.common.event.FMLEvent; -import cpw.mods.fml.common.registry.GameRegistry; -import WayofTime.alchemicalWizardry.common.items.*; -import WayofTime.alchemicalWizardry.common.items.potion.*; -import WayofTime.alchemicalWizardry.common.items.sigil.*; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Items; import net.minecraft.item.Item; +import WayofTime.alchemicalWizardry.common.items.AWBaseItems; +import WayofTime.alchemicalWizardry.common.items.ActivationCrystal; +import WayofTime.alchemicalWizardry.common.items.AirScribeTool; +import WayofTime.alchemicalWizardry.common.items.ApprenticeBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ArchmageBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ArmourInhibitor; +import WayofTime.alchemicalWizardry.common.items.BlankSpell; +import WayofTime.alchemicalWizardry.common.items.BloodShard; +import WayofTime.alchemicalWizardry.common.items.BoundArmour; +import WayofTime.alchemicalWizardry.common.items.BoundAxe; +import WayofTime.alchemicalWizardry.common.items.BoundPickaxe; +import WayofTime.alchemicalWizardry.common.items.BoundShovel; +import WayofTime.alchemicalWizardry.common.items.CheatyItem; +import WayofTime.alchemicalWizardry.common.items.DaggerOfSacrifice; +import WayofTime.alchemicalWizardry.common.items.DemonPlacer; +import WayofTime.alchemicalWizardry.common.items.DemonicTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.DuskScribeTool; +import WayofTime.alchemicalWizardry.common.items.EarthScribeTool; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.EnergyBazooka; +import WayofTime.alchemicalWizardry.common.items.EnergyBlast; +import WayofTime.alchemicalWizardry.common.items.EnergySword; +import WayofTime.alchemicalWizardry.common.items.EnhancedTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.FireScribeTool; +import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; +import WayofTime.alchemicalWizardry.common.items.ItemComponents; +import WayofTime.alchemicalWizardry.common.items.ItemDiabloKey; +import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; +import WayofTime.alchemicalWizardry.common.items.LavaCrystal; +import WayofTime.alchemicalWizardry.common.items.LifeBucket; +import WayofTime.alchemicalWizardry.common.items.MagicianBloodOrb; +import WayofTime.alchemicalWizardry.common.items.MasterBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ReinforcedTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.SacrificialDagger; +import WayofTime.alchemicalWizardry.common.items.TelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.WaterScribeTool; +import WayofTime.alchemicalWizardry.common.items.potion.AlchemyFlask; +import WayofTime.alchemicalWizardry.common.items.potion.AlchemyReagent; +import WayofTime.alchemicalWizardry.common.items.potion.AverageLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.AveragePowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.EnhancedFillingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.GreaterLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.GreaterPowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.MundaneLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.MundanePowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.StandardBindingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.StandardFillingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.WeakBindingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.WeakFillingAgent; +import WayofTime.alchemicalWizardry.common.items.sigil.AirSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.DivinationSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemBloodLightSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.LavaSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfElementalAffinity; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfGrowth; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHaste; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfMagnetism; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfTheBridge; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfTheFastMiner; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfWind; +import WayofTime.alchemicalWizardry.common.items.sigil.VoidSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.WaterSigil; +import cpw.mods.fml.common.registry.GameRegistry; /** * Created with IntelliJ IDEA. @@ -84,6 +143,8 @@ public class ModItems public static Item armourInhibitor; public static Item creativeFiller; public static Item demonPlacer; + + public static Item baseItems; public static Item weakFillingAgent; public static Item standardFillingAgent; @@ -182,6 +243,7 @@ public class ModItems itemBloodLightSigil = new ItemBloodLightSigil().setUnlocalizedName("bloodLightSigil"); itemComplexSpellCrystal = new ItemComplexSpellCrystal().setUnlocalizedName("itemComplexSpellCrystal"); bucketLife = (new LifeBucket(ModBlocks.blockLifeEssence)).setUnlocalizedName("bucketLife").setContainerItem(Items.bucket).setCreativeTab(CreativeTabs.tabMisc); + baseItems = new ItemComponents().setUnlocalizedName("baseItems"); } public static void registerItems() @@ -269,6 +331,8 @@ public class ModItems GameRegistry.registerItem(ModItems.itemBloodLightSigil, "itemBloodLightSigil"); GameRegistry.registerItem(ModItems.itemComplexSpellCrystal, "itemComplexSpellCrystal"); GameRegistry.registerItem(ModItems.bucketLife, "bucketLife"); + + GameRegistry.registerItem(ModItems.baseItems, "bloodMagicBaseItems"); //GameRegistry.registerItem(ModItems.itemBloodFrame, "itemBloodFrame"); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index 52a8e8a4..040af219 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -42,6 +42,11 @@ public class AlchemicalWizardryEventHooks { int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionBoost).getAmplifier(); event.entityLiving.motionY += (0.1f) * (2 + i); + } + + if(event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionHeavyHeart)) + { + event.entityLiving.motionY = 0; } } @@ -298,6 +303,32 @@ public class AlchemicalWizardryEventHooks } } } - } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionHeavyHeart)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionHeavyHeart).getAmplifier(); + double decrease = 0.025*(i+1); + + if(entityLiving.motionY>-0.5) + { + entityLiving.motionY-=decrease; + } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionFireFuse)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int r = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFireFuse).getAmplifier(); + int radius = r+1; + + if(entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFireFuse).getDuration()<=2) + { + entityLiving.worldObj.createExplosion(null, x, y, z, radius, false); + } + } } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java index 88ef593b..2808aa54 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -78,7 +78,7 @@ public class AltarRecipeRegistry { if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) { - return recipe.getResult(); + return ItemStack.copyItemStack(recipe.getResult()); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java index c8b6524e..3af40dc7 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java @@ -142,8 +142,8 @@ public class BoundAxe extends ItemAxe implements IBindable Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); int posX = (int)(blockVec.xCoord); - int posY = (int)(blockVec.xCoord); - int posZ = (int)(blockVec.xCoord); + int posY = (int)(blockVec.yCoord); + int posZ = (int)(blockVec.zCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java index a0026c38..6d3f82f3 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java @@ -139,8 +139,8 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); int posX = (int)(blockVec.xCoord); - int posY = (int)(blockVec.xCoord); - int posZ = (int)(blockVec.xCoord); + int posY = (int)(blockVec.yCoord); + int posZ = (int)(blockVec.zCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java index 1aba8e0f..7c03848e 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java @@ -143,8 +143,8 @@ public class BoundShovel extends ItemSpade implements IBindable Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); int posX = (int)(blockVec.xCoord); - int posY = (int)(blockVec.xCoord); - int posZ = (int)(blockVec.xCoord); + int posY = (int)(blockVec.yCoord); + int posZ = (int)(blockVec.zCoord); boolean silkTouch = false; int so = Enchantment.silkTouch.effectId; int fortune = Enchantment.fortune.effectId; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java new file mode 100644 index 00000000..51b1e7d2 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java @@ -0,0 +1,80 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemComponents extends Item +{ + private static final String[] ITEM_NAMES = new String[]{"QuartzRod"}; + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public ItemComponents() + { + super(); + this.maxStackSize = 1; + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + icons = new IIcon[ITEM_NAMES.length]; + + for (int i = 0; i < ITEM_NAMES.length; ++i) + { + icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "baseItem" + ITEM_NAMES[i]); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + //This is what will do all the localisation things on the alchemy components so you dont have to set it :D + int meta = MathHelper.clamp_int(itemStack.getItemDamage(), 0, ITEM_NAMES.length - 1); + return ("" + "item.bloodMagicBaseItem." + ITEM_NAMES[meta]); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) + { + int j = MathHelper.clamp_int(meta, 0, ITEM_NAMES.length - 1); + return icons[j]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + for (int meta = 0; meta < ITEM_NAMES.length; ++meta) + { + list.add(new ItemStack(id, 1, meta)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java index ce4de5f2..132205bb 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionBoost.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java index 26efc6af..87558f26 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionDrowning.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java new file mode 100644 index 00000000..8fe5d527 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +import net.minecraft.potion.Potion; + +public class PotionFireFuse extends Potion +{ + public PotionFireFuse(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java index e25a7c06..b885d240 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlameCloak.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java index 9b7940d0..23e93e57 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionFlight.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java new file mode 100644 index 00000000..952fb59c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +import net.minecraft.potion.Potion; + +public class PotionHeavyHeart extends Potion +{ + public PotionHeavyHeart(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java index 18eba799..d169b4d9 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionIceCloak.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java index 0014b9c3..2214e105 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionInhibit.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java index b3c70c6b..317edd54 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionProjectileProtect.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java similarity index 86% rename from 1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java rename to 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java index 2f105b23..ddceed0b 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/PotionReciprocation.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java @@ -1,4 +1,4 @@ -package WayofTime.alchemicalWizardry.common; +package WayofTime.alchemicalWizardry.common.potion; import net.minecraft.potion.Potion; diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java index 76d1a176..a25da6d7 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java @@ -95,13 +95,20 @@ public class TESpellEnhancementBlockItemRenderer implements IItemRenderer } public String getResourceLocationForMeta(int meta) - { + { switch(meta) { case 0: return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; case 1: return "alchemicalwizardry:textures/models/SpellEnhancementPower2.png"; case 2: return "alchemicalwizardry:textures/models/SpellEnhancementPower3.png"; + case 5: return "alchemicalwizardry:textures/models/SpellEnhancementCost1.png"; + case 6: return "alchemicalwizardry:textures/models/SpellEnhancementCost2.png"; + case 7: return "alchemicalwizardry:textures/models/SpellEnhancementCost3.png"; + case 10: return "alchemicalwizardry:textures/models/SpellEnhancementPotency1.png"; + case 11: return "alchemicalwizardry:textures/models/SpellEnhancementPotency2.png"; + case 12: return "alchemicalwizardry:textures/models/SpellEnhancementPotency3.png"; + } return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; - } + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index 4af98379..f1b410ef 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -552,7 +552,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile { for(IProjectileImpactEffect impactEffect : impactList) { - impactEffect.onEntityImpact(mop); + impactEffect.onEntityImpact(mop, this); } } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index fe71038c..c168d34b 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -3,36 +3,36 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefensiveEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileOffensiveEarth; public class SpellEffectEarth extends SpellEffect { @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileOffensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefensiveEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { parad.addUpdateEffect(new ProjectileEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - } @Override @@ -66,8 +66,7 @@ public class SpellEffectEarth extends SpellEffect @Override public void defaultModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override @@ -94,28 +93,26 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow((0.5*(this.powerEnhancement)+1)*2 + 1,3)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + + return (int)(3*(1.5*this.potencyEnhancement+1)*(Math.pow(1*this.powerEnhancement+1,2))*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(3*Math.pow((this.powerEnhancement*2+1),2)*(this.potencyEnhancement*2+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentProjectile() { - return (int)(10*2*(0.1d*(this.potencyEnhancement+1))*Math.pow(3.47,this.potencyEnhancement)); + return (int)(10*2*(0.1d*(this.potencyEnhancement+1))*Math.pow(3.47,this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index 65fe51f7..4800871f 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -4,6 +4,9 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileEnvironmentalFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileOffensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; @@ -21,25 +24,19 @@ public class SpellEffectFire extends SpellEffect @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileOffensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileDefensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addUpdateEffect(new ProjectileEnvironmentalFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -97,48 +94,43 @@ public class SpellEffectFire extends SpellEffect @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)((5*Math.pow(1.5*this.powerEnhancement+1, 2)*(1.5*this.potencyEnhancement+1)+this.potencyEnhancement*15)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow((this.powerEnhancement)*1.3+1,2)*((1.5*this.potencyEnhancement+1))*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(25*Math.pow(1*this.powerEnhancement+1,2)*(1*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(75*(0.5*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefaultSelf() { - return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)); + return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseSelf() { - return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); + return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(25*(3*this.potencyEnhancement+1)*(2*this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -174,5 +166,4 @@ public class SpellEffectFire extends SpellEffect // TODO Auto-generated method stub return 0; } - } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java index de3ca561..0edb3596 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -3,36 +3,34 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileDefaultWind; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileEnvironmentalWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileOffensiveWind; public class SpellEffectWind extends SpellEffect { @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileOffensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.ricochetMax+=this.potencyEnhancement; } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { parad.addUpdateEffect(new ProjectileEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - } @Override @@ -94,15 +92,13 @@ public class SpellEffectWind extends SpellEffect @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(0.5*this.potencyEnhancement+1)*(this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -115,8 +111,7 @@ public class SpellEffectWind extends SpellEffect @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(50*(this.powerEnhancement+1)*(this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index ec812f42..d10a6494 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -3,8 +3,8 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import java.util.List; import java.util.Random; -import WayofTime.alchemicalWizardry.common.NewPacketHandler; import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -15,8 +15,8 @@ import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import net.minecraft.world.WorldProvider; import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; public class SpellHelper { @@ -193,4 +193,37 @@ public class SpellHelper NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getVelSettingPacket(motionX, motionY, motionZ), (EntityPlayerMP) player); } } + + public static void smashBlock(World world, int posX, int posY, int posZ) + { + Block block = world.getBlock(posX, posY, posZ); + + if(block==Blocks.stone) + { + world.setBlock(posX, posY, posZ, Blocks.cobblestone); + } + else if(block==Blocks.cobblestone) + { + world.setBlock(posX, posY, posZ, Blocks.gravel); + } + else if(block==Blocks.gravel) + { + world.setBlock(posX, posY, posZ, Blocks.sand); + } + } + + public static boolean isBlockFluid(Block block) + { + return block instanceof BlockLiquid; + } + + public static void evaporateWaterBlock(World world, int posX, int posY, int posZ) + { + Block block = world.getBlock(posX, posY, posZ); + + if(block == Blocks.water || block == Blocks.flowing_water) + { + world.setBlockToAir(posX, posY, posZ); + } + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java index 2f2cbf92..4f8cda7b 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java @@ -6,6 +6,6 @@ import net.minecraft.world.World; public interface IProjectileImpactEffect { - public void onEntityImpact(Entity mop); + public void onEntityImpact(Entity mop, Entity projectile); public void onTileImpact(World world, MovingObjectPosition mop); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java new file mode 100644 index 00000000..1ab9f89c --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java @@ -0,0 +1,34 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public abstract class MeleeSpellCenteredWorldEffect extends MeleeSpellWorldEffect +{ + protected float range; + + public MeleeSpellCenteredWorldEffect(int power, int potency, int cost) + { + super(power, potency, cost); + range = 0; + } + + @Override + public void onWorldEffect(World world, EntityPlayer entityPlayer) + { + Vec3 lookVec = entityPlayer.getLook(range); + int x = (int)(entityPlayer.posX + lookVec.xCoord); + int y = (int)(entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord); + int z = (int)(entityPlayer.posZ + lookVec.zCoord); + + this.onCenteredWorldEffect(world, x, y, z); + } + + public void setRange(float range) + { + this.range = range; + } + + public abstract void onCenteredWorldEffect(World world, int posX, int posY, int posZ); +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java new file mode 100644 index 00000000..bed566cc --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java @@ -0,0 +1,38 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityFallingBlock; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellCenteredWorldEffect; + +public class MeleeDefaultEarth extends MeleeSpellCenteredWorldEffect +{ + public MeleeDefaultEarth(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(2); + } + + @Override + public void onCenteredWorldEffect(World world, int posX, int posY, int posZ) + { + for(int i=-3; i<=3; i++) + { + for(int j=-3; j<=3; j++) + { + for(int k=-3; k<=3; k++) + { + if(!world.isAirBlock(posX + i, posY + j, posZ + k) && world.getTileEntity(posX + i, posY + j, posZ + k)==null) + { + Block block = world.getBlock(posX + i, posY + j, posZ + k); + int meta = world.getBlockMetadata(posX + i, posY + j, posZ + k); + + EntityFallingBlock entity = new EntityFallingBlock(world, posX + i + 0.5f, posY + j + 0.5f, posZ + k + 0.5f, block, meta); + world.spawnEntityInWorld(entity); + } + } + } + } + + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java new file mode 100644 index 00000000..e0ff5554 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidBase; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileDefaultEarth extends ProjectileImpactEffect +{ + public ProjectileDefaultEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop, Entity proj) + { + // TODO Auto-generated method stub + + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + int horizRange = (int)(0.5*(this.powerUpgrades)+1); + int vertRange = (int)(0.5*(this.powerUpgrades)+1); + + int posX = mop.blockX; + int posY = mop.blockY; + int posZ = mop.blockZ; + + for(int i=-horizRange; i<=horizRange; i++) + { + for(int j=-vertRange; j<=vertRange; j++) + { + for(int k=-horizRange; k<=horizRange; k++) + { + if(!world.isAirBlock(posX+i, posY+j, posZ+k)) + { + Block block = world.getBlock(posX+i, posY+j, posZ+k); + if(block == null || block.getBlockHardness(world, posX+i, posY+j, posZ+k)==-1 || SpellHelper.isBlockFluid(block)) + { + continue; + } + //block.breakBlock(world, posX+i, posY+j, posZ+k, block.blockID, world.getBlockMetadata(posX+i, posY+j, posZ+k)); + //world.destroyBlock(posX+i, posY+j, posZ+k, true); + world.func_147480_a(posX+i, posY+j, posZ+k, false); + } + } + } + } + + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java new file mode 100644 index 00000000..530e9e97 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java @@ -0,0 +1,66 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.EntitySpellProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileUpdateEffect; + +public class ProjectileDefensiveEarth extends ProjectileImpactEffect +{ + public ProjectileDefensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop, Entity proj) + { + // TODO Auto-generated method stub + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + int horizRange = (int)(this.powerUpgrades); + int vertRange = (int)(this.potencyUpgrades); + + int posX = mop.blockX; + int posY = mop.blockY; + int posZ = mop.blockZ; + + for(int i=-horizRange; i<=horizRange; i++) + { + for(int j=-vertRange; j<=vertRange; j++) + { + for(int k=-horizRange; k<=horizRange; k++) + { + if(!world.isAirBlock(posX+i, posY+j, posZ+k)) + { + Block block = world.getBlock(posX+i, posY+j, posZ+k); + if(block == null || block.getBlockHardness(world, posX+i, posY+j, posZ+k)==-1) + { + continue; + } + //block.breakBlock(world, posX+i, posY+j, posZ+k, block.blockID, world.getBlockMetadata(posX+i, posY+j, posZ+k)); + //world.destroyBlock(posX+i, posY+j, posZ+k, true); + if(world.rand.nextFloat()<0.6f) + { + SpellHelper.smashBlock(world, posX+i, posY+j, posZ+k); + } + } + } + } + } + + } + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java index da958d8b..09ee4efe 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java @@ -52,7 +52,7 @@ public class ProjectileEnvironmentalEarth extends ProjectileUpdateEffect if(!worldObj.isAirBlock(posX+i, posY+j, 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a340ef754b97c9b9be376f9c2e8d0faabd8734b GIT binary patch literal 3603 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 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png new file mode 100644 index 0000000000000000000000000000000000000000..1266816fb829c147baa4ba7fa95222e322e9fe37 GIT binary patch literal 4329 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 XI*x2&VGd000McNliru-U1pE8Vc_mJ%|7R4PZ$` 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 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png index e1be8bf69744c7d4fb9ce000cb39831ca6efb1b8..e2b6fd536d7e18b2643c559e1f7c2f32b369971c 100644 GIT binary patch delta 4064 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 diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 55d672ab..cd8a55ac 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -946,14 +946,14 @@ public class AlchemicalWizardry { this.isForestryLoaded = true; - ModItems.itemBloodFrame = new ItemBloodFrame(this.itemBloodFrameItemID).setUnlocalizedName("bloodFrame"); - - ItemStack provenFrame = GameRegistry.findItemStack("Forestry", "frameImpregnated", 1); - - if(provenFrame !=null) - { - AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.itemBloodFrame), provenFrame, 3, 30000, 20, 20, false); - } +// ModItems.itemBloodFrame = new ItemBloodFrame(this.itemBloodFrameItemID).setUnlocalizedName("bloodFrame"); +// +// ItemStack provenFrame = GameRegistry.findItemStack("Forestry", "frameImpregnated", 1); +// +// if(provenFrame !=null) +// { +// AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.itemBloodFrame), provenFrame, 3, 30000, 20, 20, false); +// } }else { this.isForestryLoaded = false; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java index 9692d179..f62c4043 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -95,6 +96,12 @@ public class ActivationCrystal extends EnergyItems public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + return par1ItemStack; } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/BlankSpell.java b/BM_src/WayofTime/alchemicalWizardry/common/items/BlankSpell.java index ee56fd6e..84f46e63 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/BlankSpell.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/BlankSpell.java @@ -1,6 +1,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -54,6 +55,11 @@ public class BlankSpell extends EnergyItems { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java b/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java index 43e88c6d..d646fc00 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java @@ -1,11 +1,7 @@ package WayofTime.alchemicalWizardry.common.items; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.ModItems; -import WayofTime.alchemicalWizardry.common.ArmourUpgrade; -import WayofTime.alchemicalWizardry.common.IBindable; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; + import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -22,9 +18,16 @@ import net.minecraft.world.World; import net.minecraftforge.common.ISpecialArmor; import thaumcraft.api.IGoggles; import thaumcraft.api.nodes.IRevealer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.IBindable; +import cpw.mods.fml.common.Optional; +import cpw.mods.fml.common.Optional.Interface; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; -import java.util.List; - +@Optional.InterfaceList(value = {@Interface(iface="IRevealer", modid = "Thaumcraft"), @Interface(iface="IGoggles", modid = "Thaumcraft")}) public class BoundArmour extends ItemArmor implements ISpecialArmor, IRevealer, IGoggles, IBindable { private static int invSize = 9; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java b/BM_src/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java index bf9d6ffa..1011ac20 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java @@ -1,6 +1,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import com.google.common.collect.Multimap; @@ -55,10 +56,18 @@ public class DaggerOfSacrifice extends EnergyItems @Override public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) { - if (par3EntityLivingBase == null || par2EntityLivingBase == null || par3EntityLivingBase.worldObj.isRemote || !(par3EntityLivingBase.getClass().equals(EntityPlayerMP.class))) + if (par3EntityLivingBase == null || par2EntityLivingBase == null || par3EntityLivingBase.worldObj.isRemote) { return false; } + + if(par3EntityLivingBase instanceof EntityPlayer) + { + if(SpellHelper.isFakePlayer(par3EntityLivingBase.worldObj, (EntityPlayer)par3EntityLivingBase)) + { + return false; + } + } //EntityWither d; if (par2EntityLivingBase.isChild() || par2EntityLivingBase instanceof EntityWither || par2EntityLivingBase instanceof EntityDragon || par2EntityLivingBase instanceof EntityPlayer || par2EntityLivingBase instanceof IBossDisplayData) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java index 3bc4b51b..729b9ec1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.*; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.relauncher.Side; @@ -68,9 +69,9 @@ public class EnergyBattery extends Item implements ArmourUpgrade, IBindable EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); World world = par3EntityPlayer.worldObj; - if (par3EntityPlayer instanceof FakePlayer || par3EntityPlayer instanceof EntityPlayerMP) + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { - return par1ItemStack; + return par1ItemStack; } if (world != null) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java index 93cc8a0b..6af3d045 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.entity.projectile.EntityEnergyBazookaMainProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -68,6 +69,11 @@ public class EnergyBazooka extends EnergyItems { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java index 71926ea3..8392bacc 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -68,6 +69,11 @@ public class EnergyBlast extends EnergyItems { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { this.setActivated(par1ItemStack, !getActivated(par1ItemStack)); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java index 69b02f2a..3a46f278 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.relauncher.Side; @@ -59,11 +60,11 @@ public class ItemDiabloKey extends EnergyItems EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); World world = par3EntityPlayer.worldObj; - if (par3EntityPlayer instanceof FakePlayer || par3EntityPlayer instanceof EntityPlayerMP) + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { - return par1ItemStack; + return par1ItemStack; } - + if (world != null) { double posX = par3EntityPlayer.posX; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java index 449a0900..01eea34f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java @@ -5,6 +5,7 @@ import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.rituals.RitualComponent; import WayofTime.alchemicalWizardry.common.rituals.Rituals; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -125,6 +126,12 @@ public class ItemRitualDiviner extends EnergyItems public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + + if(SpellHelper.isFakePlayer(par2EntityPlayer.worldObj, par2EntityPlayer)) + { + return false; + } + ItemStack[] playerInventory = par2EntityPlayer.inventory.mainInventory; TileEntity tileEntity = par3World.getBlockTileEntity(par4, par5, par6); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java b/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java index 2168064a..0e23d9f3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java @@ -1,6 +1,7 @@ package WayofTime.alchemicalWizardry.common.items; import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -46,9 +47,9 @@ public class SacrificialDagger extends Item par3EntityPlayer.setHealth(par3EntityPlayer.getHealth() - 2); } - if (par3EntityPlayer instanceof FakePlayer) + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { - return par1ItemStack; + return par1ItemStack; } double posX = par3EntityPlayer.posX; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java index a9b4ee95..0850c947 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.sigil; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -49,6 +50,11 @@ public class AirSigil extends EnergyItems implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java index c51786da..66fd6c60 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java @@ -4,6 +4,7 @@ import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.PacketHandler; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -52,6 +53,11 @@ public class DivinationSigil extends Item implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (!par3EntityPlayer.worldObj.isRemote) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java index bf7db13f..9f76a671 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java @@ -4,6 +4,7 @@ import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.common.entity.projectile.EntityBloodLightProjectile; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -51,6 +52,12 @@ public class ItemBloodLightSigil extends EnergyItems public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + + if(SpellHelper.isFakePlayer(par2EntityPlayer.worldObj, par2EntityPlayer)) + { + return false; + } + EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); if (par3World.isRemote) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java index e18894d6..9b4a7939 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java @@ -4,6 +4,7 @@ import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyBattery; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -72,6 +73,11 @@ public class LavaSigil extends ItemBucket implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java index b7b693a5..09252937 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.sigil; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.*; @@ -103,6 +104,11 @@ public class SigilOfGrowth extends EnergyItems implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer); + if(SpellHelper.isFakePlayer(par2EntityPlayer.worldObj, par2EntityPlayer)) + { + return false; + } + if (applyBonemeal(par1ItemStack, par3World, par4, par5, par6, par2EntityPlayer)) { EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed()); @@ -161,6 +167,11 @@ public class SigilOfGrowth extends EnergyItems implements ArmourUpgrade { return; } + + if(SpellHelper.isFakePlayer(par3Entity.worldObj, (EntityPlayer)par3Entity)) + { + return; + } EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java index ff56bd33..4e8a98b2 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.sigil; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -97,6 +98,11 @@ public class SigilOfHaste extends EnergyItems implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; @@ -141,6 +147,11 @@ public class SigilOfHaste extends EnergyItems implements ArmourUpgrade return; } + if(SpellHelper.isFakePlayer(par2World,(EntityPlayer) par3Entity)) + { + return; + } + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; if (par1ItemStack.stackTagCompound == null) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java index c0925457..45c4a8a1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.sigil; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IconRegister; @@ -116,6 +117,11 @@ public class SigilOfMagnetism extends EnergyItems implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; @@ -153,6 +159,11 @@ public class SigilOfMagnetism extends EnergyItems implements ArmourUpgrade { return; } + + if(SpellHelper.isFakePlayer(par2World, (EntityPlayer)par3Entity)) + { + return; + } EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java index 4fe816aa..563db7d7 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java @@ -4,6 +4,7 @@ import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyBattery; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.MaterialLiquid; @@ -145,6 +146,11 @@ public class VoidSigil extends ItemBucket implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java index bba0ee01..78b03075 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.sigil; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.ArmourUpgrade; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -79,6 +80,11 @@ public class WaterSigil extends ItemBucket implements ArmourUpgrade { EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + if(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + if (par3EntityPlayer.isSneaking()) { return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java b/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java index dea3acc6..e434f776 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/rituals/Rituals.java @@ -900,7 +900,7 @@ public class Rituals ritualList.add(new Rituals(biomeChangerRitual, 2, 1000000, new RitualEffectBiomeChanger(), "Ritual of Gaia's Transformation")); ritualList.add(new Rituals(flightRitual, 2, 1000000, new RitualEffectFlight(), "Reverence of the Condor")); ritualList.add(new Rituals(meteorRitual, 2, 1000000, new RitualEffectSummonMeteor(), "Mark of the Falling Tower")); - ritualList.add(new Rituals(apiaryRitual,1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); + //ritualList.add(new Rituals(apiaryRitual,1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); } public static int getCostForActivation(int ritualID) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index fba4bbb6..9925e9d1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -5,12 +5,15 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.FakePlayer; import net.minecraftforge.common.ForgeDirection; public class SpellHelper @@ -105,4 +108,30 @@ public class SpellHelper world.setBlock(posX, posY, posZ, Block.ice.blockID); } } + + public static boolean isFakePlayer(World world, EntityPlayer player) + { + if(world.isRemote) + { + return false; + } + + if(player instanceof FakePlayer) + { + return true; + } + + String str = player.getClass().getCanonicalName(); + if(str.contains("GCEntityPlayerMP")) + { + return false; + } + + if(player.getClass().equals(EntityPlayerMP.class)) + { + return false; + } + + return true; + } } From 5a4bb6e8e81c0331521578f42886f8eb6916101a Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 7 Mar 2014 14:17:06 -0500 Subject: [PATCH 27/33] Fixed the GC issues --- .../alchemicalWizardry/AlchemicalWizardry.java | 9 +++++++++ .../common/items/SacrificialDagger.java | 5 ----- .../common/items/potion/AlchemyFlask.java | 1 + .../common/spell/complex/effect/SpellHelper.java | 10 ++++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index cd8a55ac..657cabe9 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -145,6 +145,7 @@ public class AlchemicalWizardry public static boolean isThaumcraftLoaded; public static boolean isForestryLoaded; + public static boolean isGCLoaded; public static CreativeTabs tabBloodMagic = new CreativeTabs("tabBloodMagic") { @@ -958,5 +959,13 @@ public class AlchemicalWizardry { this.isForestryLoaded = false; } + + if(Loader.isModLoaded("GalacticraftCore")) + { + this.isGCLoaded = true; + }else + { + this.isGCLoaded = false; + } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java b/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java index 0e23d9f3..b693ffc0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java @@ -66,11 +66,6 @@ public class SacrificialDagger extends Item par2World.spawnParticle("reddust", posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), f1, f2, f3); } - if (!par2World.isRemote && !(par3EntityPlayer.getClass().equals(EntityPlayerMP.class))) - { - return par1ItemStack; - } - findAndFillAltar(par2World, par3EntityPlayer, 200); if (par3EntityPlayer.getHealth() <= 0.5f) diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java b/BM_src/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java index 764b019d..6d6342d3 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java @@ -39,6 +39,7 @@ public class AlchemyFlask extends Item super(id); this.setMaxDamage(8); this.setMaxStackSize(1); + setNoRepair(); setCreativeTab(AlchemicalWizardry.tabBloodMagic); // TODO Auto-generated constructor stub } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 9925e9d1..810acdeb 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -3,6 +3,8 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import java.util.List; import java.util.Random; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import micdoodle8.mods.galacticraft.core.entities.player.GCCorePlayerMP; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -116,13 +118,13 @@ public class SpellHelper return false; } - if(player instanceof FakePlayer) + if(player instanceof FakePlayer || player.username.contains("[CoFH]")) { return true; } - String str = player.getClass().getCanonicalName(); - if(str.contains("GCEntityPlayerMP")) + String str = player.getClass().getSimpleName(); + if(str.contains("GC")) { return false; } @@ -132,6 +134,6 @@ public class SpellHelper return false; } - return true; + return false; } } From 172cd455481bd4d833849ca6b30c4e0a0a797d39 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 8 Mar 2014 12:52:17 -0500 Subject: [PATCH 28/33] Latest 1.6.4 push --- .../AlchemicalWizardry.java | 2 +- .../common/AlchemicalWizardryEventHooks.java | 16 +- .../AltarRecipeRegistry.java | 2 +- .../common/items/BoundArmour.java | 6 +- .../items/thaumcraft/ItemSanguineArmour.java | 25 +- .../spell/complex/effect/SpellHelper.java | 1 - BM_src/thaumcraft/api/IGoggles.java | 19 - BM_src/thaumcraft/api/IRepairable.java | 10 - .../thaumcraft/api/IRepairableExtended.java | 14 - BM_src/thaumcraft/api/IVisDiscounter.java | 12 - BM_src/thaumcraft/api/ItemApi.java | 81 --- BM_src/thaumcraft/api/ThaumcraftApi.java | 515 ------------------ .../thaumcraft/api/ThaumcraftApiHelper.java | 257 --------- BM_src/thaumcraft/api/aspects/Aspect.java | 247 --------- BM_src/thaumcraft/api/aspects/AspectList.java | 319 ----------- .../api/aspects/IAspectContainer.java | 73 --- .../thaumcraft/api/aspects/IAspectSource.java | 11 - .../api/aspects/IEssentiaContainerItem.java | 36 -- .../api/aspects/IEssentiaTransport.java | 94 ---- .../api/crafting/CrucibleRecipe.java | 73 --- .../api/crafting/IArcaneRecipe.java | 33 -- .../crafting/InfusionEnchantmentRecipe.java | 206 ------- .../api/crafting/InfusionRecipe.java | 147 ----- .../api/crafting/ShapedArcaneRecipe.java | 275 ---------- .../api/crafting/ShapelessArcaneRecipe.java | 169 ------ BM_src/thaumcraft/api/nodes/INode.java | 55 -- BM_src/thaumcraft/api/nodes/IRevealer.java | 18 - .../api/research/IScanEventHandler.java | 10 - .../api/research/ResearchCategories.java | 101 ---- .../api/research/ResearchCategoryList.java | 44 -- .../thaumcraft/api/research/ResearchItem.java | 336 ------------ .../thaumcraft/api/research/ResearchPage.java | 198 ------- .../thaumcraft/api/research/ScanResult.java | 55 -- BM_src/thaumcraft/api/wands/IWandFocus.java | 60 -- .../api/wands/IWandRodOnUpdate.java | 15 - .../api/wands/IWandTriggerManager.java | 11 - BM_src/thaumcraft/api/wands/IWandable.java | 22 - .../thaumcraft/api/wands/ItemFocusBasic.java | 185 ------- BM_src/thaumcraft/api/wands/WandCap.java | 133 ----- BM_src/thaumcraft/api/wands/WandRod.java | 166 ------ .../api/wands/WandTriggerRegistry.java | 84 --- 41 files changed, 27 insertions(+), 4109 deletions(-) delete mode 100644 BM_src/thaumcraft/api/IGoggles.java delete mode 100644 BM_src/thaumcraft/api/IRepairable.java delete mode 100644 BM_src/thaumcraft/api/IRepairableExtended.java delete mode 100644 BM_src/thaumcraft/api/IVisDiscounter.java delete mode 100644 BM_src/thaumcraft/api/ItemApi.java delete mode 100644 BM_src/thaumcraft/api/ThaumcraftApi.java delete mode 100644 BM_src/thaumcraft/api/ThaumcraftApiHelper.java delete mode 100644 BM_src/thaumcraft/api/aspects/Aspect.java delete mode 100644 BM_src/thaumcraft/api/aspects/AspectList.java delete mode 100644 BM_src/thaumcraft/api/aspects/IAspectContainer.java delete mode 100644 BM_src/thaumcraft/api/aspects/IAspectSource.java delete mode 100644 BM_src/thaumcraft/api/aspects/IEssentiaContainerItem.java delete mode 100644 BM_src/thaumcraft/api/aspects/IEssentiaTransport.java delete mode 100644 BM_src/thaumcraft/api/crafting/CrucibleRecipe.java delete mode 100644 BM_src/thaumcraft/api/crafting/IArcaneRecipe.java delete mode 100644 BM_src/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java delete mode 100644 BM_src/thaumcraft/api/crafting/InfusionRecipe.java delete mode 100644 BM_src/thaumcraft/api/crafting/ShapedArcaneRecipe.java delete mode 100644 BM_src/thaumcraft/api/crafting/ShapelessArcaneRecipe.java delete mode 100644 BM_src/thaumcraft/api/nodes/INode.java delete mode 100644 BM_src/thaumcraft/api/nodes/IRevealer.java delete mode 100644 BM_src/thaumcraft/api/research/IScanEventHandler.java delete mode 100644 BM_src/thaumcraft/api/research/ResearchCategories.java delete mode 100644 BM_src/thaumcraft/api/research/ResearchCategoryList.java delete mode 100644 BM_src/thaumcraft/api/research/ResearchItem.java delete mode 100644 BM_src/thaumcraft/api/research/ResearchPage.java delete mode 100644 BM_src/thaumcraft/api/research/ScanResult.java delete mode 100644 BM_src/thaumcraft/api/wands/IWandFocus.java delete mode 100644 BM_src/thaumcraft/api/wands/IWandRodOnUpdate.java delete mode 100644 BM_src/thaumcraft/api/wands/IWandTriggerManager.java delete mode 100644 BM_src/thaumcraft/api/wands/IWandable.java delete mode 100644 BM_src/thaumcraft/api/wands/ItemFocusBasic.java delete mode 100644 BM_src/thaumcraft/api/wands/WandCap.java delete mode 100644 BM_src/thaumcraft/api/wands/WandRod.java delete mode 100644 BM_src/thaumcraft/api/wands/WandTriggerRegistry.java diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 657cabe9..d02d3e30 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -367,7 +367,7 @@ public class AlchemicalWizardry public void load(FMLInitializationEvent event) { int craftingConstant = OreDictionary.WILDCARD_VALUE; - TickRegistry.registerTickHandler(new AlchemicalWizardryTickHandler(), Side.SERVER); + //TickRegistry.registerTickHandler(new AlchemicalWizardryTickHandler(), Side.SERVER); //orbOfTesting = new OrbOfTesting(17000); //public final static Item glassShard = new GlassShard(17009).setUnlocalizedName("glassShard"); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index a36c67cc..e3cb2c94 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -127,18 +127,22 @@ public class AlchemicalWizardryEventHooks EntityLivingBase entity = event.entityLiving; //if(!entity.isSneaking()) { - double percentIncrease = (i + 1) * 0.03d; + float percentIncrease = (i + 1) * 0.05f; if (event.entityLiving instanceof EntityPlayer) { EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; entityPlayer.stepHeight = 1.0f; - if (!entityPlayer.worldObj.isRemote) - { - float speed = ((Float) ReflectionHelper.getPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, new String[]{"walkSpeed", "g", "field_75097_g"})).floatValue(); - ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(speed + (float) percentIncrease), new String[]{"walkSpeed", "g", "field_75097_g"}); //CAUTION - } + if((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) + entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease/2.0f) : percentIncrease); + + +// if (!entityPlayer.worldObj.isRemote) +// { +// float speed = ((Float) ReflectionHelper.getPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, new String[]{"walkSpeed", "g", "field_75097_g"})).floatValue(); +// ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(speed + (float) percentIncrease), new String[]{"walkSpeed", "g", "field_75097_g"}); //CAUTION +// } } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java index 0b40bd14..e4ee3444 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -76,7 +76,7 @@ public class AltarRecipeRegistry { if(recipe.doesRequiredItemMatch(testItem, currentTierAltar)) { - return recipe.getResult(); + return recipe.getResult().copy(); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java b/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java index d646fc00..48b3422a 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/BoundArmour.java @@ -509,7 +509,7 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor, IRevealer, continue; } - if (item.getItem() instanceof IRevealer) + if (AlchemicalWizardry.isThaumcraftLoaded && item.getItem() instanceof IRevealer) { return true; } @@ -534,7 +534,7 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor, IRevealer, continue; } - if (item.getItem() instanceof IGoggles) + if (AlchemicalWizardry.isThaumcraftLoaded && item.getItem() instanceof IGoggles) { return true; } @@ -593,13 +593,11 @@ public class BoundArmour extends ItemArmor implements ISpecialArmor, IRevealer, return 0; } - @Override public boolean showNodes(ItemStack itemstack, EntityLivingBase player) { return this.hasIRevealer(itemstack); } - @Override public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) { return this.hasIGoggles(itemstack); diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java b/BM_src/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java index 5c0821c3..c4bba0fa 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java @@ -1,10 +1,7 @@ package WayofTime.alchemicalWizardry.common.items.thaumcraft; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.ModItems; -import WayofTime.alchemicalWizardry.common.ArmourUpgrade; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; + import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -14,12 +11,16 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; import net.minecraft.world.World; import thaumcraft.api.IGoggles; -import thaumcraft.api.IVisDiscounter; +import thaumcraft.api.IVisDiscountGear; +import thaumcraft.api.aspects.Aspect; import thaumcraft.api.nodes.IRevealer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.ArmourUpgrade; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; -import java.util.List; - -public class ItemSanguineArmour extends ItemArmor implements IRevealer, ArmourUpgrade, IGoggles, IVisDiscounter +public class ItemSanguineArmour extends ItemArmor implements IRevealer, ArmourUpgrade, IGoggles, IVisDiscountGear { private static Icon helmetIcon; @@ -54,7 +55,7 @@ public class ItemSanguineArmour extends ItemArmor implements IRevealer, ArmourUp public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { par3List.add("A pair of goggles imbued with power"); - par3List.add("Vis discount: " + this.getVisDiscount() + "%"); + par3List.add("Vis discount: " + 8 + "%"); } @Override @@ -88,8 +89,8 @@ public class ItemSanguineArmour extends ItemArmor implements IRevealer, ArmourUp } @Override - public int getVisDiscount() + public int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect) { - return 10; + return 8; } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 810acdeb..17717243 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Random; import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import micdoodle8.mods.galacticraft.core.entities.player.GCCorePlayerMP; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; diff --git a/BM_src/thaumcraft/api/IGoggles.java b/BM_src/thaumcraft/api/IGoggles.java deleted file mode 100644 index a66a8238..00000000 --- a/BM_src/thaumcraft/api/IGoggles.java +++ /dev/null @@ -1,19 +0,0 @@ -package thaumcraft.api; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; - -/** - * @author Azanor - *

- * Equipped head slot items that extend this class will be able to perform most functions that - * goggles of revealing can apart from view nodes which is handled by IRevealer. - */ - -public interface IGoggles -{ - /* - * If this method returns true things like block essentia contents will be shown. - */ - public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player); -} diff --git a/BM_src/thaumcraft/api/IRepairable.java b/BM_src/thaumcraft/api/IRepairable.java deleted file mode 100644 index 59788069..00000000 --- a/BM_src/thaumcraft/api/IRepairable.java +++ /dev/null @@ -1,10 +0,0 @@ -package thaumcraft.api; - -/** - * @author Azanor - * Items, armor and tools with this interface can receive the Repair enchantment. - * Repairs 1 point of durability every 10 seconds (2 for repair II) - */ -public interface IRepairable -{ -} diff --git a/BM_src/thaumcraft/api/IRepairableExtended.java b/BM_src/thaumcraft/api/IRepairableExtended.java deleted file mode 100644 index 1922b18b..00000000 --- a/BM_src/thaumcraft/api/IRepairableExtended.java +++ /dev/null @@ -1,14 +0,0 @@ -package thaumcraft.api; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -/** - * @author Azanor - * Items, armor and tools with this interface can receive the Repair enchantment. - * Repairs 1 point of durability every 10 seconds (2 for repair II) - */ -public interface IRepairableExtended extends IRepairable -{ - public boolean doRepair(ItemStack stack, EntityPlayer player, int enchantlevel); -} diff --git a/BM_src/thaumcraft/api/IVisDiscounter.java b/BM_src/thaumcraft/api/IVisDiscounter.java deleted file mode 100644 index 584cb289..00000000 --- a/BM_src/thaumcraft/api/IVisDiscounter.java +++ /dev/null @@ -1,12 +0,0 @@ -package thaumcraft.api; - -/** - * @author Azanor - * ItemArmor with this interface will grant a discount to the vis cost of actions the wearer performs with casting wands. - * The amount returned is the percentage by which the cost is discounted. There is a built-int max discount of 50%, but - * individual items really shouldn't have a discount more than 5% - */ -public interface IVisDiscounter -{ - int getVisDiscount(); -} diff --git a/BM_src/thaumcraft/api/ItemApi.java b/BM_src/thaumcraft/api/ItemApi.java deleted file mode 100644 index 5043ab45..00000000 --- a/BM_src/thaumcraft/api/ItemApi.java +++ /dev/null @@ -1,81 +0,0 @@ -package thaumcraft.api; - -import cpw.mods.fml.common.FMLLog; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -/** - * @author Azanor - *

- * This is used to gain access to the items in my mod. - * I only give some examples and it will probably still - * require a bit of work for you to get hold of everything you need. - */ -public class ItemApi -{ - public static ItemStack getItem(String itemString, int meta) - { - ItemStack item = null; - - try - { - String itemClass = "thaumcraft.common.config.ConfigItems"; - Object obj = Class.forName(itemClass).getField(itemString).get(null); - - if (obj instanceof Item) - { - item = new ItemStack((Item) obj, 1, meta); - } else if (obj instanceof ItemStack) - { - item = (ItemStack) obj; - } - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft] Could not retrieve item identified by: " + itemString); - } - - return item; - } - - public static ItemStack getBlock(String itemString, int meta) - { - ItemStack item = null; - - try - { - String itemClass = "thaumcraft.common.config.ConfigBlocks"; - Object obj = Class.forName(itemClass).getField(itemString).get(null); - - if (obj instanceof Block) - { - item = new ItemStack((Block) obj, 1, meta); - } else if (obj instanceof ItemStack) - { - item = (ItemStack) obj; - } - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft] Could not retrieve block identified by: " + itemString); - } - - return item; - } - - /** - * - * Some examples - * - * Casting Wands: - * itemWandCasting - * - * Resources: - * itemEssence, itemWispEssence, itemResource, itemShard, itemNugget, - * itemNuggetChicken, itemNuggetBeef, itemNuggetPork, itemTripleMeatTreat - * - * Research: - * itemResearchNotes, itemInkwell, itemThaumonomicon - * - */ - -} diff --git a/BM_src/thaumcraft/api/ThaumcraftApi.java b/BM_src/thaumcraft/api/ThaumcraftApi.java deleted file mode 100644 index 721b91c9..00000000 --- a/BM_src/thaumcraft/api/ThaumcraftApi.java +++ /dev/null @@ -1,515 +0,0 @@ -package thaumcraft.api; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumArmorMaterial; -import net.minecraft.item.EnumToolMaterial; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; -import net.minecraftforge.common.EnumHelper; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.crafting.*; -import thaumcraft.api.research.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author Azanor - *

- *

- * IMPORTANT: If you are adding your own aspects to items it is a good idea to do it AFTER Thaumcraft adds its aspects, otherwise odd things may happen. - */ -public class ThaumcraftApi -{ - //Materials - public static EnumToolMaterial toolMatThaumium = EnumHelper.addToolMaterial("THAUMIUM", 3, 400, 7F, 2, 22); - public static EnumToolMaterial toolMatElemental = EnumHelper.addToolMaterial("THAUMIUM_ELEMENTAL", 3, 1500, 10F, 3, 18); - public static EnumArmorMaterial armorMatThaumium = EnumHelper.addArmorMaterial("THAUMIUM", 25, new int[]{2, 6, 5, 2}, 25); - public static EnumArmorMaterial armorMatSpecial = EnumHelper.addArmorMaterial("SPECIAL", 25, new int[]{1, 3, 2, 1}, 25); - - //Enchantment references - public static int enchantFrugal; - public static int enchantPotency; - public static int enchantWandFortune; - public static int enchantHaste; - public static int enchantRepair; - - //Miscellaneous - /** - * Portable Hole Block-id Blacklist. - * Simply add the block-id's of blocks you don't want the portable hole to go through. - */ - public static ArrayList portableHoleBlackList = new ArrayList(); - - //RESEARCH///////////////////////////////////////// - public static ArrayList scanEventhandlers = new ArrayList(); - public static ArrayList scanEntities = new ArrayList(); - - public static class EntityTags - { - public EntityTags(String entityName, NBTBase[] nbts, AspectList aspects) - { - this.entityName = entityName; - this.nbts = nbts; - this.aspects = aspects; - } - - public String entityName; - public NBTBase[] nbts; - public AspectList aspects; - } - - /** - * not really working atm, so ignore it for now - * - * @param scanEventHandler - */ - public static void registerScanEventhandler(IScanEventHandler scanEventHandler) - { - scanEventhandlers.add(scanEventHandler); - } - - /** - * This is used to add aspects to entities which you can then scan using a thaumometer. - * Also used to calculate vis drops from mobs. - * - * @param entityName - * @param aspects - * @param nbt you can specify certain nbt keys and their values - * to differentiate between mobs.
For example the normal and wither skeleton: - *
ThaumcraftApi.registerEntityTag("Skeleton", (new AspectList()).add(Aspect.DEATH, 5)); - *
ThaumcraftApi.registerEntityTag("Skeleton", (new AspectList()).add(Aspect.DEATH, 8), new NBTTagByte("SkeletonType",(byte) 1)); - */ - public static void registerEntityTag(String entityName, AspectList aspects, NBTBase... nbt) - { - scanEntities.add(new EntityTags(entityName, nbt, aspects)); - } - - //RECIPES///////////////////////////////////////// - private static ArrayList craftingRecipes = new ArrayList(); - private static HashMap smeltingBonus = new HashMap(); - private static ArrayList smeltingBonusExlusion = new ArrayList(); - - /** - * This method is used to determine what bonus items are generated when the infernal furnace smelts items - * - * @param in The result (not input) of the smelting operation. e.g. new ItemStack(ingotGold) - * @param out The bonus item that can be produced from the smelting operation e.g. new ItemStack(nuggetGold,0,0). - * Stacksize should be 0 unless you want to guarantee that at least 1 item is always produced. - */ - public static void addSmeltingBonus(ItemStack in, ItemStack out) - { - smeltingBonus.put( - Arrays.asList(in.itemID, in.getItemDamage()), - new ItemStack(out.itemID, 0, out.getItemDamage())); - } - - /** - * Returns the bonus item produced from a smelting operation in the infernal furnace - * - * @param in The result of the smelting operation. e.g. new ItemStack(ingotGold) - * @return the The bonus item that can be produced - */ - public static ItemStack getSmeltingBonus(ItemStack in) - { - return smeltingBonus.get(Arrays.asList(in.itemID, in.getItemDamage())); - } - - /** - * Excludes specific items from producing bonus items when they are smelted in the infernal furnace, even - * if their smelt result would normally produce a bonus item. - * - * @param in The item to be smelted that should never produce a bonus item (e.g. the various macerated dusts form IC2) - * Even though they produce gold, iron, etc. ingots, they should NOT produce bonus nuggets as well. - *

- * Smelting exclusions can also be done via the FMLInterModComms in your @Mod.Init method using "smeltBonusExclude" - * Example for vanilla iron: - * FMLInterModComms.sendMessage("Thaumcraft", "smeltBonusExclude", new ItemStack(Item.ingotIron)); - */ - public static void addSmeltingBonusExclusion(ItemStack in) - { - smeltingBonusExlusion.add(Arrays.asList(in.itemID, in.getItemDamage())); - } - - /** - * Sees if an item is allowed to produce bonus items when smelted in the infernal furnace - * - * @param in The item you wish to check - * @return true or false - */ - public static boolean isSmeltingBonusExluded(ItemStack in) - { - return smeltingBonusExlusion.contains(Arrays.asList(in.itemID, in.getItemDamage())); - } - - public static List getCraftingRecipes() - { - return craftingRecipes; - } - - /** - * @param research the research key required for this recipe to work. Leave blank if it will work without research - * @param result the recipe output - * @param aspects the vis cost per aspect. - * @param recipe The recipe. Format is exactly the same as vanilla recipes. Input itemstacks are NBT sensitive. - */ - public static ShapedArcaneRecipe addArcaneCraftingRecipe(String research, ItemStack result, AspectList aspects, Object... recipe) - { - ShapedArcaneRecipe r = new ShapedArcaneRecipe(research, result, aspects, recipe); - craftingRecipes.add(r); - return r; - } - - /** - * @param research the research key required for this recipe to work. Leave blank if it will work without research - * @param result the recipe output - * @param aspects the vis cost per aspect - * @param recipe The recipe. Format is exactly the same as vanilla shapeless recipes. Input itemstacks are NBT sensitive. - */ - public static ShapelessArcaneRecipe addShapelessArcaneCraftingRecipe(String research, ItemStack result, AspectList aspects, Object... recipe) - { - ShapelessArcaneRecipe r = new ShapelessArcaneRecipe(research, result, aspects, recipe); - craftingRecipes.add(r); - return r; - } - - /** - * @param research the research key required for this recipe to work. Leave blank if it will work without research - * @param result the recipe output. It can either be an itemstack or an nbt compound tag that will be added to the central item - * @param instability a number that represents the N in 1000 chance for the infusion altar to spawn an - * instability effect each second while the crafting is in progress - * @param aspects the essentia cost per aspect. - * @param aspects input the central item to be infused - * @param recipe An array of items required to craft this. Input itemstacks are NBT sensitive. - * Infusion crafting components are automatically "fuzzy" and the oredict will be checked for possible matches. - */ - public static InfusionRecipe addInfusionCraftingRecipe(String research, Object result, int instability, AspectList aspects, ItemStack input, ItemStack[] recipe) - { - if (!(result instanceof ItemStack || result instanceof NBTBase)) - { - return null; - } - - InfusionRecipe r = new InfusionRecipe(research, result, instability, aspects, input, recipe); - craftingRecipes.add(r); - return r; - } - - /** - * @param research the research key required for this recipe to work. Leave blank if it will work without research - * @param enchantment the enchantment that will be applied to the item - * @param instability a number that represents the N in 1000 chance for the infusion altar to spawn an - * instability effect each second while the crafting is in progress - * @param aspects the essentia cost per aspect. - * @param recipe An array of items required to craft this. Input itemstacks are NBT sensitive. - * Infusion crafting components are automatically "fuzzy" and the oredict will be checked for possible matches. - */ - public static InfusionEnchantmentRecipe addInfusionEnchantmentRecipe(String research, Enchantment enchantment, int instability, AspectList aspects, ItemStack[] recipe) - { - InfusionEnchantmentRecipe r = new InfusionEnchantmentRecipe(research, enchantment, instability, aspects, recipe); - craftingRecipes.add(r); - return r; - } - - /** - * @param stack the recipe result - * @return the recipe - */ - public static InfusionRecipe getInfusionRecipe(ItemStack res) - { - for (Object r : getCraftingRecipes()) - { - if (r instanceof InfusionRecipe) - { - if (((InfusionRecipe) r).recipeOutput instanceof ItemStack) - { - if (((ItemStack) ((InfusionRecipe) r).recipeOutput).isItemEqual(res)) - { - return (InfusionRecipe) r; - } - } - } - } - - return null; - } - - /** - * @param key the research key required for this recipe to work. - * @param result the output result - * @param cost the vis cost - * @param tags the aspects required to craft this - */ - public static CrucibleRecipe addCrucibleRecipe(String key, ItemStack result, Object catalyst, AspectList tags) - { - CrucibleRecipe rc = new CrucibleRecipe(key, result, catalyst, tags); - getCraftingRecipes().add(rc); - return rc; - } - - /** - * @param stack the recipe result - * @return the recipe - */ - public static CrucibleRecipe getCrucibleRecipe(ItemStack stack) - { - for (Object r : getCraftingRecipes()) - { - if (r instanceof CrucibleRecipe) - { - if (((CrucibleRecipe) r).recipeOutput.isItemEqual(stack)) - { - return (CrucibleRecipe) r; - } - } - } - - return null; - } - - /** - * Used by the thaumonomicon drilldown feature. - * - * @param stack the item - * @return the thaumcraft recipe key that produces that item. - */ - private static HashMap keyCache = new HashMap(); - - public static Object[] getCraftingRecipeKey(EntityPlayer player, ItemStack stack) - { - int[] key = new int[]{stack.itemID, stack.getItemDamage()}; - - if (keyCache.containsKey(key)) - { - if (keyCache.get(key) == null) - { - return null; - } - - if (ThaumcraftApiHelper.isResearchComplete(player.username, (String) (keyCache.get(key))[0])) - { - return keyCache.get(key); - } else - { - return null; - } - } - - for (ResearchCategoryList rcl : ResearchCategories.researchCategories.values()) - { - for (ResearchItem ri : rcl.research.values()) - { - if (ri.getPages() == null) - { - continue; - } - - for (int a = 0; a < ri.getPages().length; a++) - { - ResearchPage page = ri.getPages()[a]; - - if (page.recipeOutput != null && stack != null && page.recipeOutput.isItemEqual(stack)) - { - keyCache.put(key, new Object[]{ri.key, a}); - - if (ThaumcraftApiHelper.isResearchComplete(player.username, ri.key)) - return new Object[]{ri.key, a}; - else - { - return null; - } - } - } - } - } - - keyCache.put(key, null); - return null; - } - - //ASPECTS//////////////////////////////////////// - - public static ConcurrentHashMap objectTags = new ConcurrentHashMap(); - - /** - * Checks to see if the passed item/block already has aspects associated with it. - * - * @param id - * @param meta - * @return - */ - public static boolean exists(int id, int meta) - { - AspectList tmp = ThaumcraftApi.objectTags.get(Arrays.asList(id, meta)); - - if (tmp == null) - { - tmp = ThaumcraftApi.objectTags.get(Arrays.asList(id, -1)); - - if (meta == -1 && tmp == null) - { - int index = 0; - - do - { - tmp = ThaumcraftApi.objectTags.get(Arrays.asList(id, index)); - index++; - } - while (index < 16 && tmp == null); - } - - if (tmp == null) - { - return false; - } - } - - return true; - } - - /** - * Used to assign apsects to the given item/block. Here is an example of the declaration for cobblestone:

- * ThaumcraftApi.registerObjectTag(Block.cobblestone.blockID, -1, (new ObjectTags()).add(EnumTag.ROCK, 1).add(EnumTag.DESTRUCTION, 1)); - * - * @param id - * @param meta pass -1 if all damage values of this item/block should have the same aspects - * @param aspects A ObjectTags object of the associated aspects - */ - public static void registerObjectTag(int id, int meta, AspectList aspects) - { - if (aspects == null) - { - aspects = new AspectList(); - } - - objectTags.put(Arrays.asList(id, meta), aspects); - } - - /** - * Used to assign apsects to the given item/block. Here is an example of the declaration for cobblestone:

- * ThaumcraftApi.registerObjectTag(Block.cobblestone.blockID, new int[]{0,1}, (new ObjectTags()).add(EnumTag.ROCK, 1).add(EnumTag.DESTRUCTION, 1)); - * - * @param id - * @param meta A range of meta values if you wish to lump several item meta's together as being the "same" item (i.e. stair orientations) - * @param aspects A ObjectTags object of the associated aspects - */ - public static void registerObjectTag(int id, int[] meta, AspectList aspects) - { - if (aspects == null) - { - aspects = new AspectList(); - } - - objectTags.put(Arrays.asList(id, meta), aspects); - } - - /** - * Used to assign apsects to the given ore dictionary item. - * - * @param oreDict the ore dictionary name - * @param aspects A ObjectTags object of the associated aspects - */ - public static void registerObjectTag(String oreDict, AspectList aspects) - { - if (aspects == null) - { - aspects = new AspectList(); - } - - ArrayList ores = OreDictionary.getOres(oreDict); - - if (ores != null && ores.size() > 0) - { - for (ItemStack ore : ores) - { - int d = ore.getItemDamage(); - - if (d == OreDictionary.WILDCARD_VALUE) - { - d = -1; - } - - objectTags.put(Arrays.asList(ore.itemID, d), aspects); - } - } - } - - /** - * Used to assign aspects to the given item/block. - * Attempts to automatically generate aspect tags by checking registered recipes. - * Here is an example of the declaration for pistons:

- * ThaumcraftApi.registerComplexObjectTag(Block.pistonBase.blockID, 0, (new ObjectTags()).add(EnumTag.MECHANISM, 2).add(EnumTag.MOTION, 4)); - * - * @param id - * @param meta pass -1 if all damage values of this item/block should have the same aspects - * @param aspects A ObjectTags object of the associated aspects - */ - public static void registerComplexObjectTag(int id, int meta, AspectList aspects) - { - if (!exists(id, meta)) - { - AspectList tmp = ThaumcraftApiHelper.generateTags(id, meta); - - if (tmp != null && tmp.size() > 0) - { - for (Aspect tag : tmp.getAspects()) - { - aspects.add(tag, tmp.getAmount(tag)); - } - } - - registerObjectTag(id, meta, aspects); - } else - { - AspectList tmp = ThaumcraftApiHelper.getObjectAspects(new ItemStack(id, 1, meta)); - - for (Aspect tag : aspects.getAspects()) - { - tmp.merge(tag, tmp.getAmount(tag)); - } - - registerObjectTag(id, meta, tmp); - } - } - - //CROPS ////////////////////////////////////////////////////////////////////////////////////////// - - /** - * To define mod crops you need to use FMLInterModComms in your @Mod.Init method. - * There are two 'types' of crops you can add. Standard crops and clickable crops. - * - * Standard crops work like normal vanilla crops - they grow until a certain metadata - * value is reached and you harvest them by destroying the block and collecting the blocks. - * You need to create and ItemStack that tells the golem what block id and metadata represents - * the crop when fully grown. - * Example for vanilla wheat: - * FMLInterModComms.sendMessage("Thaumcraft", "harvestStandardCrop", new ItemStack(Block.crops,1,7)); - * - * Clickable crops are crops that you right click to gather their bounty instead of destroying them. - * As for standard crops, you need to create and ItemStack that tells the golem what block id - * and metadata represents the crop when fully grown. The golem will trigger the blocks onBlockActivated method. - * Example (this will technically do nothing since clicking wheat does nothing, but you get the idea): - * FMLInterModComms.sendMessage("Thaumcraft", "harvestClickableCrop", new ItemStack(Block.crops,1,7)); - */ - - //NATIVE CLUSTERS ////////////////////////////////////////////////////////////////////////////////// - - /** - * You can define certain ores that will have a chance to produce native clusters via FMLInterModComms - * in your @Mod.Init method using the "nativeCluster" string message. - * The format should be: - * "[ore item/block id],[ore item/block metadata],[cluster item/block id],[cluster item/block metadata],[chance modifier float]" - * - * NOTE: The chance modifier is a multiplier applied to the default chance for that cluster to be produced (27.5% for a pickaxe of the core) - * - * Example for vanilla iron ore to produce one of my own native iron clusters (assuming default id's) at double the default chance: - * FMLInterModComms.sendMessage("Thaumcraft", "nativeCluster","15,0,25016,16,2.0"); - */ - -} diff --git a/BM_src/thaumcraft/api/ThaumcraftApiHelper.java b/BM_src/thaumcraft/api/ThaumcraftApiHelper.java deleted file mode 100644 index ed1f8e84..00000000 --- a/BM_src/thaumcraft/api/ThaumcraftApiHelper.java +++ /dev/null @@ -1,257 +0,0 @@ -package thaumcraft.api; - -import cpw.mods.fml.common.FMLLog; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.aspects.IEssentiaTransport; - -import java.lang.reflect.Method; -import java.util.HashMap; - -public class ThaumcraftApiHelper -{ - public static AspectList cullTags(AspectList temp) - { - AspectList temp2 = new AspectList(); - - for (Aspect tag : temp.getAspects()) - { - if (tag != null) - { - temp2.add(tag, temp.getAmount(tag)); - } - } - - while (temp2 != null && temp2.size() > 10) - { - Aspect lowest = null; - int low = Integer.MAX_VALUE; - - for (Aspect tag : temp2.getAspects()) - { - if (tag == null) - { - continue; - } - - if (temp2.getAmount(tag) < low) - { - low = temp2.getAmount(tag); - lowest = tag; - } - } - - temp2.aspects.remove(lowest); - } - - return temp2; - } - - public static boolean areItemsEqual(ItemStack s1, ItemStack s2) - { - if (s1.isItemStackDamageable() && s2.isItemStackDamageable()) - { - return s1.itemID == s2.itemID; - } else - { - return s1.itemID == s2.itemID && s1.getItemDamage() == s2.getItemDamage(); - } - } - - static Method isResearchComplete; - static Method getObjectTags; - static Method getBonusTags; - static Method generateTags; - - public static boolean isResearchComplete(String username, String researchkey) - { - boolean ot = false; - - try - { - if (isResearchComplete == null) - { - Class fake = Class.forName("thaumcraft.common.lib.research.ResearchManager"); - isResearchComplete = fake.getMethod("isResearchComplete", String.class, String.class); - } - - ot = (Boolean) isResearchComplete.invoke(null, username, researchkey); - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.research.ResearchManager method isResearchComplete"); - } - - return ot; - } - - public static ItemStack getStackInRowAndColumn(Object instance, int row, int column) - { - ItemStack ot = null; - - try - { - Class fake = Class.forName("thaumcraft.common.tiles.TileMagicWorkbench"); - Method getStackInRowAndColumn = fake.getMethod("getStackInRowAndColumn", int.class, int.class); - ot = (ItemStack) getStackInRowAndColumn.invoke(instance, row, column); - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.tiles.TileMagicWorkbench method getStackInRowAndColumn"); - } - - return ot; - } - - public static AspectList getObjectAspects(ItemStack is) - { - AspectList ot = null; - - try - { - if (getObjectTags == null) - { - Class fake = Class.forName("thaumcraft.common.lib.ThaumcraftCraftingManager"); - getObjectTags = fake.getMethod("getObjectTags", ItemStack.class); - } - - ot = (AspectList) getObjectTags.invoke(null, is); - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.ThaumcraftCraftingManager method getObjectTags"); - } - - return ot; - } - - public static AspectList getBonusObjectTags(ItemStack is, AspectList ot) - { - try - { - if (getBonusTags == null) - { - Class fake = Class.forName("thaumcraft.common.lib.ThaumcraftCraftingManager"); - getBonusTags = fake.getMethod("getBonusTags", ItemStack.class, AspectList.class); - } - - ot = (AspectList) getBonusTags.invoke(null, is, ot); - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.ThaumcraftCraftingManager method getBonusTags"); - } - - return ot; - } - - public static AspectList generateTags(int id, int meta) - { - try - { - if (generateTags == null) - { - Class fake = Class.forName("thaumcraft.common.lib.ThaumcraftCraftingManager"); - generateTags = fake.getMethod("generateTags", int.class, int.class); - } - - return (AspectList) generateTags.invoke(null, id, meta); - } catch (Exception ex) - { - FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.lib.ThaumcraftCraftingManager method generateTags"); - } - - return null; - } - - public static boolean containsMatch(boolean strict, ItemStack[] inputs, ItemStack... targets) - { - for (ItemStack input : inputs) - { - for (ItemStack target : targets) - { - if (itemMatches(target, input, strict)) - { - return true; - } - } - } - - return false; - } - - public static boolean itemMatches(ItemStack target, ItemStack input, boolean strict) - { - if (input == null && target != null || input != null && target == null) - { - return false; - } - - return (target.itemID == input.itemID && ((target.getItemDamage() == OreDictionary.WILDCARD_VALUE && !strict) || target.getItemDamage() == input.getItemDamage())); - } - - public static TileEntity getConnectableTile(World world, int x, int y, int z, ForgeDirection face) - { - TileEntity te = world.getBlockTileEntity(x + face.offsetX, y + face.offsetY, z + face.offsetZ); - - if (te instanceof IEssentiaTransport && ((IEssentiaTransport) te).isConnectable(face.getOpposite())) - { - return te; - } else - { - return null; - } - } - - public static TileEntity getConnectableTile(IBlockAccess world, int x, int y, int z, ForgeDirection face) - { - TileEntity te = world.getBlockTileEntity(x + face.offsetX, y + face.offsetY, z + face.offsetZ); - - if (te instanceof IEssentiaTransport && ((IEssentiaTransport) te).isConnectable(face.getOpposite())) - { - return te; - } else - { - return null; - } - } - - private static HashMap allAspects = new HashMap(); - private static HashMap allCompoundAspects = new HashMap(); - - public static AspectList getAllAspects(int amount) - { - if (allAspects.get(amount) == null) - { - AspectList al = new AspectList(); - - for (Aspect aspect : Aspect.aspects.values()) - { - al.add(aspect, amount); - } - - allAspects.put(amount, al); - } - - return allAspects.get(amount); - } - - public static AspectList getAllCompoundAspects(int amount) - { - if (allCompoundAspects.get(amount) == null) - { - AspectList al = new AspectList(); - - for (Aspect aspect : Aspect.getCompoundAspects()) - { - al.add(aspect, amount); - } - - allCompoundAspects.put(amount, al); - } - - return allCompoundAspects.get(amount); - } -} diff --git a/BM_src/thaumcraft/api/aspects/Aspect.java b/BM_src/thaumcraft/api/aspects/Aspect.java deleted file mode 100644 index cad05355..00000000 --- a/BM_src/thaumcraft/api/aspects/Aspect.java +++ /dev/null @@ -1,247 +0,0 @@ -package thaumcraft.api.aspects; - -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import org.apache.commons.lang3.text.WordUtils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; - -public class Aspect -{ - String tag; - Aspect[] components; - int color; - private String chatcolor; - ResourceLocation image; - int blend; - - /** - * Use this constructor to register your own aspects. - * - * @param tag the key that will be used to reference this aspect, as well as its latin display name - * @param color color to display the tag in - * @param components the aspects this one is formed from - * @param image ResourceLocation pointing to a 32x32 icon of the aspect - * @param blend GL11 blendmode (1 or 771). Used for rendering nodes. Default is 1 - */ - public Aspect(String tag, int color, Aspect[] components, ResourceLocation image, int blend) - { - if (aspects.containsKey(tag)) - { - throw new IllegalArgumentException(tag + " already registered!"); - } - - this.tag = tag; - this.components = components; - this.color = color; - this.image = image; - this.blend = blend; - aspects.put(tag, this); - } - - /** - * Shortcut constructor I use for the default aspects - you shouldn't be using this. - */ - public Aspect(String tag, int color, Aspect[] components) - { - this(tag, color, components, new ResourceLocation("thaumcraft", "textures/aspects/" + tag.toLowerCase() + ".png"), 1); - } - - /** - * Shortcut constructor I use for the default aspects - you shouldn't be using this. - */ - public Aspect(String tag, int color, Aspect[] components, int blend) - { - this(tag, color, components, new ResourceLocation("thaumcraft", "textures/aspects/" + tag.toLowerCase() + ".png"), blend); - } - - /** - * Shortcut constructor I use for the primal aspects - - * you shouldn't use this as making your own primal aspects will break all the things. - */ - public Aspect(String tag, int color, String chatcolor, int blend) - { - this(tag, color, (Aspect[]) null, blend); - this.setChatcolor(chatcolor); - } - - public int getColor() - { - return color; - } - - public String getName() - { - return WordUtils.capitalizeFully(tag); - } - - public String getLocalizedDescription() - { - return StatCollector.translateToLocal("tc.aspect." + tag); - } - - public String getTag() - { - return tag; - } - - public void setTag(String tag) - { - this.tag = tag; - } - - public Aspect[] getComponents() - { - return components; - } - - public void setComponents(Aspect[] components) - { - this.components = components; - } - - public ResourceLocation getImage() - { - return image; - } - - public static Aspect getAspect(String tag) - { - return aspects.get(tag); - } - - public int getBlend() - { - return blend; - } - - public void setBlend(int blend) - { - this.blend = blend; - } - - public boolean isPrimal() - { - return getComponents() == null || getComponents().length != 2; - } - - /////////////////////////////// - public static ArrayList getPrimalAspects() - { - ArrayList primals = new ArrayList(); - Collection pa = aspects.values(); - - for (Aspect aspect : pa) - { - if (aspect.isPrimal()) - { - primals.add(aspect); - } - } - - return primals; - } - - public static ArrayList getCompoundAspects() - { - ArrayList compounds = new ArrayList(); - Collection pa = aspects.values(); - - for (Aspect aspect : pa) - { - if (!aspect.isPrimal()) - { - compounds.add(aspect); - } - } - - return compounds; - } - - public String getChatcolor() - { - return chatcolor; - } - - public void setChatcolor(String chatcolor) - { - this.chatcolor = chatcolor; - } - - /////////////////////////////// - public static LinkedHashMap aspects = new LinkedHashMap(); - - //PRIMAL - public static final Aspect AIR = new Aspect("aer", 0xffff7e, "e", 1); - public static final Aspect EARTH = new Aspect("terra", 0x56c000, "2", 1); - public static final Aspect FIRE = new Aspect("ignis", 0xff5a01, "c", 1); - public static final Aspect WATER = new Aspect("aqua", 0x3cd4fc, "3", 1); - public static final Aspect ORDER = new Aspect("ordo", 0xd5d4ec, "7", 1); - public static final Aspect ENTROPY = new Aspect("perditio", 0x404040, "8", 771); - - //SECONDARY TODO - public static final Aspect VOID = new Aspect("vacuos", 0x888888, new Aspect[]{AIR, ENTROPY}, 771); - public static final Aspect LIGHT = new Aspect("lux", 0xfff663, new Aspect[]{AIR, FIRE}); - public static final Aspect ENERGY = new Aspect("potentia", 0xc0ffff, new Aspect[]{ORDER, FIRE}); - public static final Aspect MOTION = new Aspect("motus", 0xcdccf4, new Aspect[]{AIR, ORDER}); - public static final Aspect STONE = new Aspect("saxum", 0x808080, new Aspect[]{EARTH, EARTH}); - public static final Aspect LIFE = new Aspect("victus", 0xde0005, new Aspect[]{WATER, EARTH}); - public static final Aspect WEATHER = new Aspect("tempestas", 0xFFFFFF, new Aspect[]{AIR, WATER}); - public static final Aspect ICE = new Aspect("gelum", 0xe1ffff, new Aspect[]{WATER, ORDER}); - public static final Aspect CRYSTAL = new Aspect("vitreus", 0x80ffff, new Aspect[]{STONE, WATER}); - - //TERTIARY TODO - - public static final Aspect DEATH = new Aspect("mortuus", 0x887788, new Aspect[]{LIFE, ENTROPY}); - public static final Aspect FLIGHT = new Aspect("volatus", 0xe7e7d7, new Aspect[]{AIR, MOTION}); - public static final Aspect DARKNESS = new Aspect("tenebrae", 0x222222, new Aspect[]{VOID, LIGHT}); - public static final Aspect SOUL = new Aspect("spiritus", 0xebebfb, new Aspect[]{LIFE, DEATH}); - public static final Aspect HEAL = new Aspect("sano", 0xff2f34, new Aspect[]{LIFE, LIFE}); - - public static final Aspect TRAVEL = new Aspect("iter", 0xe0585b, new Aspect[]{MOTION, EARTH}); - public static final Aspect POISON = new Aspect("venenum", 0x89f000, new Aspect[]{WATER, DEATH}); - - public static final Aspect ELDRITCH = new Aspect("alienis", 0x805080, new Aspect[]{VOID, DARKNESS}); - public static final Aspect MAGIC = new Aspect("praecantatio", 0x9700c0, new Aspect[]{VOID, ENERGY}); - public static final Aspect AURA = new Aspect("auram", 0xffc0ff, new Aspect[]{MAGIC, AIR}); - public static final Aspect TAINT = new Aspect("vitium", 0x800080, new Aspect[]{MAGIC, ENTROPY}); - - public static final Aspect SEED = new Aspect("granum", 0xeea16e, new Aspect[]{LIFE, EARTH}); - public static final Aspect SLIME = new Aspect("limus", 0x01f800, new Aspect[]{LIFE, WATER}); - public static final Aspect PLANT = new Aspect("herba", 0x01ac00, new Aspect[]{SEED, EARTH}); - public static final Aspect TREE = new Aspect("arbor", 0x876531, new Aspect[]{EARTH, PLANT}); - - public static final Aspect BEAST = new Aspect("bestia", 0x9f6409, new Aspect[]{MOTION, LIFE}); - public static final Aspect FLESH = new Aspect("corpus", 0xee478d, new Aspect[]{DEATH, BEAST}); - public static final Aspect UNDEAD = new Aspect("exanimis", 0x3a4000, new Aspect[]{MOTION, DEATH}); - public static final Aspect MIND = new Aspect("cognitio", 0xffc2b3, new Aspect[]{EARTH, SOUL}); - public static final Aspect SENSES = new Aspect("sensus", 0x0fd9ff, new Aspect[]{AIR, SOUL}); - - public static final Aspect MAN = new Aspect("humanus", 0xffd7c0, new Aspect[]{BEAST, MIND}); - public static final Aspect CROP = new Aspect("messis", 0xe1b371, new Aspect[]{SEED, MAN}); - public static final Aspect HARVEST = new Aspect("meto", 0xeead82, new Aspect[]{CROP, MAN}); - public static final Aspect METAL = new Aspect("metallum", 0xb5b5cd, new Aspect[]{STONE, ORDER}); - public static final Aspect MINE = new Aspect("perfodio", 0xdcd2d8, new Aspect[]{MAN, STONE}); - public static final Aspect TOOL = new Aspect("instrumentum", 0x4040ee, new Aspect[]{MAN, METAL}); - public static final Aspect WEAPON = new Aspect("telum", 0xc05050, new Aspect[]{TOOL, ENTROPY}); - public static final Aspect ARMOR = new Aspect("tutamen", 0x00c0c0, new Aspect[]{TOOL, EARTH}); - public static final Aspect HUNGER = new Aspect("fames", 0x9a0305, new Aspect[]{LIFE, VOID}); - public static final Aspect GREED = new Aspect("lucrum", 0xe6be44, new Aspect[]{MAN, HUNGER}); - public static final Aspect CRAFT = new Aspect("fabrico", 0x809d80, new Aspect[]{MAN, TOOL}); - - public static final Aspect CLOTH = new Aspect("pannus", 0xeaeac2, new Aspect[]{TOOL, BEAST}); - public static final Aspect MECHANISM = new Aspect("machina", 0x8080a0, new Aspect[]{MOTION, TOOL}); - public static final Aspect TRAP = new Aspect("vinculum", 0x9a8080, new Aspect[]{MOTION, ENTROPY}); - public static final Aspect EXCHANGE = new Aspect("permutatio", 0x578357, new Aspect[]{MOTION, WATER}); - -// public static final Aspect LAVA = new Aspect("lava",0xe85729, new Aspect[] {EARTH, FIRE}); -// public static final Aspect STEAM = new Aspect("steam",0xFFFFFF, new Aspect[] {WATER, FIRE}); -// public static final Aspect MUD = new Aspect("lutum",0x473423, new Aspect[] {WATER, EARTH}); -// public static final Aspect SAND = new Aspect("sand",0xFFFFFF, new Aspect[] {AIR, EARTH}); -// public static final Aspect ASTRAL = new Aspect("Astral",0xFFFFFF, new Aspect[] {VOID, DARKNESS}); -// public static final Aspect HARM = new Aspect("Harm",0xFFFFFF, new Aspect[] {ENTROPY, LIFE}); -// public static final Aspect BIRD = new Aspect("Bird",0xFFFFFF, new Aspect[] {BEAST, AIR}); -// public static final Aspect FISH = new Aspect("Fish",0xFFFFFF, new Aspect[] {BEAST, WATER}); -} diff --git a/BM_src/thaumcraft/api/aspects/AspectList.java b/BM_src/thaumcraft/api/aspects/AspectList.java deleted file mode 100644 index 5b662f0e..00000000 --- a/BM_src/thaumcraft/api/aspects/AspectList.java +++ /dev/null @@ -1,319 +0,0 @@ -package thaumcraft.api.aspects; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import thaumcraft.api.ThaumcraftApiHelper; - -import java.io.Serializable; -import java.util.LinkedHashMap; - -public class AspectList implements Serializable -{ - public LinkedHashMap aspects = new LinkedHashMap(); //aspects associated with this object - - /** - * this creates a new aspect list with preloaded values based off the aspects of the given item. - * - * @param id the item/block id of an existing item - * @param meta the damage value of an existing item - */ - public AspectList(int id, int meta) - { - try - { - AspectList temp = ThaumcraftApiHelper.getObjectAspects(new ItemStack(id, 1, meta)); - - if (temp != null) - for (Aspect tag : temp.getAspects()) - { - add(tag, temp.getAmount(tag)); - } - } catch (Exception e) - { - } - } - - public AspectList() - { - } - - public AspectList copy() - { - AspectList out = new AspectList(); - - for (Aspect a : this.getAspects()) - { - out.add(a, this.getAmount(a)); - } - - return out; - } - - /** - * @return the amount of different aspects in this collection - */ - public int size() - { - return aspects.size(); - } - - /** - * @return the amount of total vis in this collection - */ - public int visSize() - { - int q = 0; - - for (Aspect as : aspects.keySet()) - { - q += this.getAmount(as); - } - - return q; - } - - /** - * @return an array of all the aspects in this collection - */ - public Aspect[] getAspects() - { - Aspect[] q = new Aspect[1]; - return aspects.keySet().toArray(q); - } - - /** - * @return an array of all the aspects in this collection - */ - public Aspect[] getPrimalAspects() - { - AspectList t = new AspectList(); - - for (Aspect as : aspects.keySet()) - { - if (as.isPrimal()) - { - t.add(as, 1); - } - } - - Aspect[] q = new Aspect[1]; - return t.aspects.keySet().toArray(q); - } - - /** - * @return an array of all the aspects in this collection sorted by name - */ - public Aspect[] getAspectsSorted() - { - Aspect[] out = aspects.keySet().toArray(new Aspect[1]); - boolean change = false; - - do - { - change = false; - - for (int a = 0; a < out.length - 1; a++) - { - Aspect e1 = out[a]; - Aspect e2 = out[a + 1]; - - if (e1 != null && e2 != null && e1.getTag().compareTo(e2.getTag()) > 0) - { - out[a] = e2; - out[a + 1] = e1; - change = true; - break; - } - } - } - while (change == true); - - return out; - } - - /** - * @return an array of all the aspects in this collection sorted by amount - */ - public Aspect[] getAspectsSortedAmount() - { - Aspect[] out = aspects.keySet().toArray(new Aspect[1]); - boolean change = false; - - do - { - change = false; - - for (int a = 0; a < out.length - 1; a++) - { - int e1 = getAmount(out[a]); - int e2 = getAmount(out[a + 1]); - - if (e1 > 0 && e2 > 0 && e2 > e1) - { - Aspect ea = out[a]; - Aspect eb = out[a + 1]; - out[a] = eb; - out[a + 1] = ea; - change = true; - break; - } - } - } - while (change == true); - - return out; - } - - /** - * @param key - * @return the amount associated with the given aspect in this collection - */ - public int getAmount(Aspect key) - { - return aspects.get(key) == null ? 0 : aspects.get(key); - } - - /** - * Reduces the amount of an aspect in this collection by the given amount. - * - * @param key - * @param amount - * @return - */ - public boolean reduce(Aspect key, int amount) - { - if (getAmount(key) >= amount) - { - int am = getAmount(key) - amount; - aspects.put(key, am); - return true; - } - - return false; - } - - /** - * Reduces the amount of an aspect in this collection by the given amount. - * If reduced to 0 or less the aspect will be removed completely. - * - * @param key - * @param amount - * @return - */ - public AspectList remove(Aspect key, int amount) - { - int am = getAmount(key) - amount; - - if (am <= 0) - { - aspects.remove(key); - } else - { - this.aspects.put(key, am); - } - - return this; - } - - /** - * Simply removes the aspect from the list - * - * @param key - * @param amount - * @return - */ - public AspectList remove(Aspect key) - { - aspects.remove(key); - return this; - } - - /** - * Adds this aspect and amount to the collection. - * If the aspect exists then its value will be increased by the given amount. - * - * @param aspect - * @param amount - * @return - */ - public AspectList add(Aspect aspect, int amount) - { - if (this.aspects.containsKey(aspect)) - { - int oldamount = this.aspects.get(aspect); - amount += oldamount; - } - - this.aspects.put(aspect, amount); - return this; - } - - /** - * Adds this aspect and amount to the collection. - * If the aspect exists then only the highest of the old or new amount will be used. - * - * @param aspect - * @param amount - * @return - */ - public AspectList merge(Aspect aspect, int amount) - { - if (this.aspects.containsKey(aspect)) - { - int oldamount = this.aspects.get(aspect); - - if (amount < oldamount) - { - amount = oldamount; - } - } - - this.aspects.put(aspect, amount); - return this; - } - - /** - * Reads the list of aspects from nbt - * - * @param nbttagcompound - * @return - */ - public void readFromNBT(NBTTagCompound nbttagcompound) - { - aspects.clear(); - NBTTagList tlist = nbttagcompound.getTagList("Aspects"); - - for (int j = 0; j < tlist.tagCount(); j++) - { - NBTTagCompound rs = (NBTTagCompound) tlist.tagAt(j); - - if (rs.hasKey("key")) - { - add(Aspect.getAspect(rs.getString("key")), - rs.getInteger("amount")); - } - } - } - - /** - * Writes the list of aspects to nbt - * - * @param nbttagcompound - * @return - */ - public void writeToNBT(NBTTagCompound nbttagcompound) - { - NBTTagList tlist = new NBTTagList(); - nbttagcompound.setTag("Aspects", tlist); - - for (Aspect aspect : getAspects()) - if (aspect != null) - { - NBTTagCompound f = new NBTTagCompound(); - f.setString("key", aspect.getTag()); - f.setInteger("amount", getAmount(aspect)); - tlist.appendTag(f); - } - } -} diff --git a/BM_src/thaumcraft/api/aspects/IAspectContainer.java b/BM_src/thaumcraft/api/aspects/IAspectContainer.java deleted file mode 100644 index 855e077e..00000000 --- a/BM_src/thaumcraft/api/aspects/IAspectContainer.java +++ /dev/null @@ -1,73 +0,0 @@ -package thaumcraft.api.aspects; - -/** - * @author azanor - *

- * Used by blocks like the crucible and alembic to hold their aspects. - * Tiles extending this interface will have their aspects show up when viewed by goggles of revealing - */ -public interface IAspectContainer -{ - public AspectList getAspects(); - - public void setAspects(AspectList aspects); - - /** - * This method is used to determine of a specific aspect can be added to this container. - * - * @param tag - * @return true or false - */ - public boolean doesContainerAccept(Aspect tag); - - /** - * This method is used to add a certain amount of an aspect to the tile entity. - * - * @param tag - * @param amount - * @return the amount of aspect left over that could not be added. - */ - public int addToContainer(Aspect tag, int amount); - - /** - * Removes a certain amount of a specific aspect from the tile entity - * - * @param tag - * @param amount - * @return true if that amount of aspect was available and was removed - */ - public boolean takeFromContainer(Aspect tag, int amount); - - /** - * removes a bunch of different aspects and amounts from the tile entity. - * - * @param ot the ObjectTags object that contains the aspects and their amounts. - * @return true if all the aspects and their amounts were available and successfully removed - */ - public boolean takeFromContainer(AspectList ot); - - /** - * Checks if the tile entity contains the listed amount (or more) of the aspect - * - * @param tag - * @param amount - * @return - */ - public boolean doesContainerContainAmount(Aspect tag, int amount); - - /** - * Checks if the tile entity contains all the listed aspects and their amounts - * - * @param ot the ObjectTags object that contains the aspects and their amounts. - * @return - */ - public boolean doesContainerContain(AspectList ot); - - /** - * Returns how much of the aspect this tile entity contains - * - * @param tag - * @return the amount of that aspect found - */ - public int containerContains(Aspect tag); -} diff --git a/BM_src/thaumcraft/api/aspects/IAspectSource.java b/BM_src/thaumcraft/api/aspects/IAspectSource.java deleted file mode 100644 index d0ccac33..00000000 --- a/BM_src/thaumcraft/api/aspects/IAspectSource.java +++ /dev/null @@ -1,11 +0,0 @@ -package thaumcraft.api.aspects; - -/** - * @author Azanor - *

- * This interface is implemented by tile entites (or possibly anything else) like jars - * so that they can act as an essentia source for blocks like the infusion altar. - */ -public interface IAspectSource extends IAspectContainer -{ -} diff --git a/BM_src/thaumcraft/api/aspects/IEssentiaContainerItem.java b/BM_src/thaumcraft/api/aspects/IEssentiaContainerItem.java deleted file mode 100644 index 9ea36355..00000000 --- a/BM_src/thaumcraft/api/aspects/IEssentiaContainerItem.java +++ /dev/null @@ -1,36 +0,0 @@ -package thaumcraft.api.aspects; - -import net.minecraft.item.ItemStack; - -/** - * @author azanor - *

- * Used by wispy essences and essentia phials to hold their aspects. - * Useful for similar item containers that store their aspect information in nbt form so TC - * automatically picks up the aspects they contain - */ -public interface IEssentiaContainerItem -{ - public AspectList getAspects(ItemStack itemstack); - - public void setAspects(ItemStack itemstack, AspectList aspects); -} - -//Example implementation -/* - @Override - public AspectList getAspects(ItemStack itemstack) { - if (itemstack.hasTagCompound()) { - AspectList aspects = new AspectList(); - aspects.readFromNBT(itemstack.getTagCompound()); - return aspects.size()>0?aspects:null; - } - return null; - } - - @Override - public void setAspects(ItemStack itemstack, AspectList aspects) { - if (!itemstack.hasTagCompound()) itemstack.setTagCompound(new NBTTagCompound()); - aspects.writeToNBT(itemstack.getTagCompound()); - } -*/ \ No newline at end of file diff --git a/BM_src/thaumcraft/api/aspects/IEssentiaTransport.java b/BM_src/thaumcraft/api/aspects/IEssentiaTransport.java deleted file mode 100644 index 77eb6590..00000000 --- a/BM_src/thaumcraft/api/aspects/IEssentiaTransport.java +++ /dev/null @@ -1,94 +0,0 @@ -package thaumcraft.api.aspects; - -import net.minecraftforge.common.ForgeDirection; - -/** - * @author Azanor - * This interface is used by tiles that use or transport vis. - * Only tiles that implement this interface will be able to connect to vis conduits or other thaumic devices - */ -public interface IEssentiaTransport -{ - /** - * Is this tile able to connect to other vis users/sources on the specified side? - * - * @param face - * @return - */ - public boolean isConnectable(ForgeDirection face); - - /** - * Is this side used to input essentia? - * - * @param face - * @return - */ - boolean canInputFrom(ForgeDirection face); - - /** - * Is this side used to output essentia? - * - * @param face - * @return - */ - boolean canOutputTo(ForgeDirection face); - -// /** -// * Can this tile act as a source of vis? -// * @return -// */ -// public boolean isVisSource(); -// -// /** -// * Is this tile a conduit that transports vis? -// * @return -// */ -// public boolean isVisConduit(); - - /** - * Sets the amount of suction this block will apply - * - * @param suction - */ - public void setSuction(AspectList suction); - - /** - * Sets the amount of suction this block will apply - * - * @param suction - */ - public void setSuction(Aspect aspect, int amount); - - /** - * Returns the amount of suction this block is applying. - * - * @param loc the location from where the suction is being checked - * @return - */ - public AspectList getSuction(ForgeDirection face); - - /** - * remove the specified amount of vis from this transport tile - * - * @param suction - * @return how much was actually taken - */ - public int takeVis(Aspect aspect, int amount); - - public AspectList getEssentia(ForgeDirection face); - - /** - * Essentia will not be drawn from this container unless the suction exceeds this amount. - * - * @return the amount - */ - public int getMinimumSuction(); - - /** - * Return true if you want the conduit to extend a little further into the block. - * Used by jars and alembics that have smaller than normal hitboxes - * - * @return - */ - boolean renderExtendedTube(); -} diff --git a/BM_src/thaumcraft/api/crafting/CrucibleRecipe.java b/BM_src/thaumcraft/api/crafting/CrucibleRecipe.java deleted file mode 100644 index 0d8dddbb..00000000 --- a/BM_src/thaumcraft/api/crafting/CrucibleRecipe.java +++ /dev/null @@ -1,73 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; - -import java.util.ArrayList; - -public class CrucibleRecipe -{ - public ItemStack recipeOutput; - public Object catalyst; - public AspectList aspects; - public String key; - - public CrucibleRecipe(String researchKey, ItemStack result, Object cat, AspectList tags) - { - recipeOutput = result; - this.aspects = tags; - this.key = researchKey; - this.catalyst = cat; - - if (cat instanceof String) - { - this.catalyst = OreDictionary.getOres((String) cat); - } - } - - public boolean matches(AspectList itags, ItemStack cat) - { - if (catalyst instanceof ItemStack && - !ThaumcraftApiHelper.itemMatches((ItemStack) catalyst, cat, false)) - { - return false; - } else if (catalyst instanceof ArrayList && ((ArrayList) catalyst).size() > 0) - { - if (!ThaumcraftApiHelper.containsMatch(true, ((ArrayList) catalyst).toArray(new ItemStack[]{}), cat)) - return false; - } - - if (itags == null) - { - return false; - } - - for (Aspect tag : aspects.getAspects()) - { - if (itags.getAmount(tag) < aspects.getAmount(tag)) - { - return false; - } - } - - return true; - } - - public AspectList removeMatching(AspectList itags) - { - AspectList temptags = new AspectList(); - temptags.aspects.putAll(itags.aspects); - - for (Aspect tag : aspects.getAspects()) - { - temptags.remove(tag, aspects.getAmount(tag)); -// if (!temptags.remove(tag, aspects.getAmount(tag))) return null; - } - - itags = temptags; - return itags; - } -} diff --git a/BM_src/thaumcraft/api/crafting/IArcaneRecipe.java b/BM_src/thaumcraft/api/crafting/IArcaneRecipe.java deleted file mode 100644 index 37690ebd..00000000 --- a/BM_src/thaumcraft/api/crafting/IArcaneRecipe.java +++ /dev/null @@ -1,33 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import thaumcraft.api.aspects.AspectList; - -public interface IArcaneRecipe -{ - /** - * Used to check if a recipe matches current crafting inventory - * - * @param player - */ - boolean matches(IInventory var1, World world, EntityPlayer player); - - /** - * Returns an Item that is the result of this recipe - */ - ItemStack getCraftingResult(IInventory var1); - - /** - * Returns the size of the recipe area - */ - int getRecipeSize(); - - ItemStack getRecipeOutput(); - - AspectList getAspects(); - - String getResearch(); -} diff --git a/BM_src/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java b/BM_src/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java deleted file mode 100644 index d43110e6..00000000 --- a/BM_src/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java +++ /dev/null @@ -1,206 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.AspectList; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; - -public class InfusionEnchantmentRecipe -{ - public AspectList aspects; - public String research; - public ItemStack[] components; - public Enchantment enchantment; - public int recipeXP; - public int instability; - - public InfusionEnchantmentRecipe(String research, Enchantment input, int inst, - AspectList aspects2, ItemStack[] recipe) - { - this.research = research; - this.enchantment = input; - this.aspects = aspects2; - this.components = recipe; - this.instability = inst; - this.recipeXP = Math.max(1, input.getMinEnchantability(1) / 3); - } - - /** - * Used to check if a recipe matches current crafting inventory - * - * @param player - */ - public boolean matches(ArrayList input, ItemStack central, World world, EntityPlayer player) - { - if (research.length() > 0 && !ThaumcraftApiHelper.isResearchComplete(player.username, research)) - { - return false; - } - - if (!enchantment.canApply(central)) - { - return false; - } - - Map map1 = EnchantmentHelper.getEnchantments(central); - Iterator iterator = map1.keySet().iterator(); - - while (iterator.hasNext()) - { - int j1 = ((Integer) iterator.next()).intValue(); - Enchantment ench = Enchantment.enchantmentsList[j1]; - - if (j1 == enchantment.effectId && - EnchantmentHelper.getEnchantmentLevel(j1, central) >= ench.getMaxLevel()) - { - return false; - } - - if (enchantment.effectId != ench.effectId && - (!enchantment.canApplyTogether(ench) || - !ench.canApplyTogether(enchantment))) - { - return false; - } - } - - ItemStack i2 = null; - ArrayList ii = new ArrayList(); - - for (ItemStack is : input) - { - ii.add(is.copy()); - } - - for (ItemStack comp : components) - { - boolean b = false; - - for (int a = 0; a < ii.size(); a++) - { - i2 = ii.get(a).copy(); - - if (comp.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { - i2.setItemDamage(OreDictionary.WILDCARD_VALUE); - } - - if (areItemStacksEqual(i2, comp, true)) - { - ii.remove(a); - b = true; - break; - } - } - - if (!b) - { - return false; - } - } - -// System.out.println(ii.size()); - return ii.size() == 0 ? true : false; - } - - private boolean areItemStacksEqual(ItemStack stack0, ItemStack stack1, boolean fuzzy) - { - if (stack0 == null && stack1 != null) - { - return false; - } - - if (stack0 != null && stack1 == null) - { - return false; - } - - if (stack0 == null && stack1 == null) - { - return true; - } - - boolean t1 = false; - - if (fuzzy) - { - t1 = true; - int od = OreDictionary.getOreID(stack0); - - if (od != -1) - { - ItemStack[] ores = OreDictionary.getOres(od).toArray(new ItemStack[]{}); - - if (ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{stack1}, ores)) - return true; - } - } else - { - t1 = ItemStack.areItemStackTagsEqual(stack0, stack1); - } - - return stack0.itemID != stack1.itemID ? false : (stack0.getItemDamage() != stack1.getItemDamage() ? false : (stack0.stackSize > stack0.getMaxStackSize() ? false : t1)); - } - - public Enchantment getEnchantment() - { - return enchantment; - } - - public AspectList getAspects() - { - return aspects; - } - - public String getResearch() - { - return research; - } - - public int calcInstability(ItemStack recipeInput) - { - int i = 0; - Map map1 = EnchantmentHelper.getEnchantments(recipeInput); - Iterator iterator = map1.keySet().iterator(); - - while (iterator.hasNext()) - { - int j1 = ((Integer) iterator.next()).intValue(); - i += EnchantmentHelper.getEnchantmentLevel(j1, recipeInput); - } - - return (i / 2) + instability; - } - - public int calcXP(ItemStack recipeInput) - { - return recipeXP * (1 + EnchantmentHelper.getEnchantmentLevel(enchantment.effectId, recipeInput)); - } - - public float getEssentiaMod(ItemStack recipeInput) - { - float mod = EnchantmentHelper.getEnchantmentLevel(enchantment.effectId, recipeInput); - Map map1 = EnchantmentHelper.getEnchantments(recipeInput); - Iterator iterator = map1.keySet().iterator(); - - while (iterator.hasNext()) - { - int j1 = ((Integer) iterator.next()).intValue(); - - if (j1 != enchantment.effectId) - { - mod += EnchantmentHelper.getEnchantmentLevel(j1, recipeInput) * .1f; - } - } - - return mod; - } -} diff --git a/BM_src/thaumcraft/api/crafting/InfusionRecipe.java b/BM_src/thaumcraft/api/crafting/InfusionRecipe.java deleted file mode 100644 index 4fa3ac00..00000000 --- a/BM_src/thaumcraft/api/crafting/InfusionRecipe.java +++ /dev/null @@ -1,147 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.AspectList; - -import java.util.ArrayList; - -public class InfusionRecipe -{ - public AspectList aspects; - public String research; - public ItemStack[] components; - public ItemStack recipeInput; - public Object recipeOutput; - public int instability; - - public InfusionRecipe(String research, Object output, int inst, - AspectList aspects2, ItemStack input, ItemStack[] recipe) - { - this.research = research; - this.recipeOutput = output; - this.recipeInput = input; - this.aspects = aspects2; - this.components = recipe; - this.instability = inst; - } - - /** - * Used to check if a recipe matches current crafting inventory - * - * @param player - */ - public boolean matches(ArrayList input, ItemStack central, World world, EntityPlayer player) - { - if (research.length() > 0 && !ThaumcraftApiHelper.isResearchComplete(player.username, research)) - { - return false; - } - - ItemStack i2 = central.copy(); - - if (recipeInput.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { - i2.setItemDamage(OreDictionary.WILDCARD_VALUE); - } - - if (!areItemStacksEqual(i2, recipeInput, true)) - { - return false; - } - - ArrayList ii = new ArrayList(); - - for (ItemStack is : input) - { - ii.add(is.copy()); - } - - for (ItemStack comp : components) - { - boolean b = false; - - for (int a = 0; a < ii.size(); a++) - { - i2 = ii.get(a).copy(); - - if (comp.getItemDamage() == OreDictionary.WILDCARD_VALUE) - { - i2.setItemDamage(OreDictionary.WILDCARD_VALUE); - } - - if (areItemStacksEqual(i2, comp, true)) - { - ii.remove(a); - b = true; - break; - } - } - - if (!b) - { - return false; - } - } - -// System.out.println(ii.size()); - return ii.size() == 0 ? true : false; - } - - private boolean areItemStacksEqual(ItemStack stack0, ItemStack stack1, boolean fuzzy) - { - if (stack0 == null && stack1 != null) - { - return false; - } - - if (stack0 != null && stack1 == null) - { - return false; - } - - if (stack0 == null && stack1 == null) - { - return true; - } - - boolean t1 = false; - - if (fuzzy) - { - t1 = true; - int od = OreDictionary.getOreID(stack0); - - if (od != -1) - { - ItemStack[] ores = OreDictionary.getOres(od).toArray(new ItemStack[]{}); - - if (ThaumcraftApiHelper.containsMatch(false, new ItemStack[]{stack1}, ores)) - return true; - } - } else - { - t1 = ItemStack.areItemStackTagsEqual(stack0, stack1); - } - - return stack0.itemID != stack1.itemID ? false : (stack0.getItemDamage() != stack1.getItemDamage() ? false : (stack0.stackSize > stack0.getMaxStackSize() ? false : t1)); - } - - public Object getRecipeOutput() - { - return recipeOutput; - } - - public AspectList getAspects() - { - return aspects; - } - - public String getResearch() - { - return research; - } -} diff --git a/BM_src/thaumcraft/api/crafting/ShapedArcaneRecipe.java b/BM_src/thaumcraft/api/crafting/ShapedArcaneRecipe.java deleted file mode 100644 index 5d372527..00000000 --- a/BM_src/thaumcraft/api/crafting/ShapedArcaneRecipe.java +++ /dev/null @@ -1,275 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.AspectList; - -import java.util.ArrayList; -import java.util.HashMap; - -public class ShapedArcaneRecipe implements IArcaneRecipe -{ - //Added in for future ease of change, but hard coded for now. - private static final int MAX_CRAFT_GRID_WIDTH = 3; - private static final int MAX_CRAFT_GRID_HEIGHT = 3; - - public ItemStack output = null; - public Object[] input = null; - public AspectList aspects = null; - public String research; - public int width = 0; - public int height = 0; - private boolean mirrored = true; - - public ShapedArcaneRecipe(String research, Block result, AspectList aspects, Object... recipe) - { - this(research, new ItemStack(result), aspects, recipe); - } - - public ShapedArcaneRecipe(String research, Item result, AspectList aspects, Object... recipe) - { - this(research, new ItemStack(result), aspects, recipe); - } - - public ShapedArcaneRecipe(String research, ItemStack result, AspectList aspects, Object... recipe) - { - output = result.copy(); - this.research = research; - this.aspects = aspects; - String shape = ""; - int idx = 0; - - if (recipe[idx] instanceof Boolean) - { - mirrored = (Boolean) recipe[idx]; - - if (recipe[idx + 1] instanceof Object[]) - { - recipe = (Object[]) recipe[idx + 1]; - } else - { - idx = 1; - } - } - - if (recipe[idx] instanceof String[]) - { - String[] parts = ((String[]) recipe[idx++]); - - for (String s : parts) - { - width = s.length(); - shape += s; - } - - height = parts.length; - } else - { - while (recipe[idx] instanceof String) - { - String s = (String) recipe[idx++]; - shape += s; - width = s.length(); - height++; - } - } - - if (width * height != shape.length()) - { - String ret = "Invalid shaped ore recipe: "; - - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - - ret += output; - throw new RuntimeException(ret); - } - - HashMap itemMap = new HashMap(); - - for (; idx < recipe.length; idx += 2) - { - Character chr = (Character) recipe[idx]; - Object in = recipe[idx + 1]; - - if (in instanceof ItemStack) - { - itemMap.put(chr, ((ItemStack) in).copy()); - } else if (in instanceof Item) - { - itemMap.put(chr, new ItemStack((Item) in)); - } else if (in instanceof Block) - { - itemMap.put(chr, new ItemStack((Block) in, 1, OreDictionary.WILDCARD_VALUE)); - } else if (in instanceof String) - { - itemMap.put(chr, OreDictionary.getOres((String) in)); - } else - { - String ret = "Invalid shaped ore recipe: "; - - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - - ret += output; - throw new RuntimeException(ret); - } - } - - input = new Object[width * height]; - int x = 0; - - for (char chr : shape.toCharArray()) - { - input[x++] = itemMap.get(chr); - } - } - - @Override - public ItemStack getCraftingResult(IInventory var1) - { - return output.copy(); - } - - @Override - public int getRecipeSize() - { - return input.length; - } - - @Override - public ItemStack getRecipeOutput() - { - return output; - } - - @Override - public boolean matches(IInventory inv, World world, EntityPlayer player) - { - if (research.length() > 0 && !ThaumcraftApiHelper.isResearchComplete(player.username, research)) - { - return false; - } - - for (int x = 0; x <= MAX_CRAFT_GRID_WIDTH - width; x++) - { - for (int y = 0; y <= MAX_CRAFT_GRID_HEIGHT - height; ++y) - { - if (checkMatch(inv, x, y, false)) - { - return true; - } - - if (mirrored && checkMatch(inv, x, y, true)) - { - return true; - } - } - } - - return false; - } - - private boolean checkMatch(IInventory inv, int startX, int startY, boolean mirror) - { - for (int x = 0; x < MAX_CRAFT_GRID_WIDTH; x++) - { - for (int y = 0; y < MAX_CRAFT_GRID_HEIGHT; y++) - { - int subX = x - startX; - int subY = y - startY; - Object target = null; - - if (subX >= 0 && subY >= 0 && subX < width && subY < height) - { - if (mirror) - { - target = input[width - subX - 1 + subY * width]; - } else - { - target = input[subX + subY * width]; - } - } - - ItemStack slot = ThaumcraftApiHelper.getStackInRowAndColumn(inv, x, y); - - if (target instanceof ItemStack) - { - if (!checkItemEquals((ItemStack) target, slot)) - { - return false; - } - } else if (target instanceof ArrayList) - { - boolean matched = false; - - for (ItemStack item : (ArrayList) target) - { - matched = matched || checkItemEquals(item, slot); - } - - if (!matched) - { - return false; - } - } else if (target == null && slot != null) - { - return false; - } - } - } - - return true; - } - - private boolean checkItemEquals(ItemStack target, ItemStack input) - { - if (input == null && target != null || input != null && target == null) - { - return false; - } - - return (target.itemID == input.itemID && - (!target.hasTagCompound() || ItemStack.areItemStackTagsEqual(target, input)) && - (target.getItemDamage() == OreDictionary.WILDCARD_VALUE || target.getItemDamage() == input.getItemDamage())); - } - - public ShapedArcaneRecipe setMirrored(boolean mirror) - { - mirrored = mirror; - return this; - } - - /** - * Returns the input for this recipe, any mod accessing this value should never - * manipulate the values in this array as it will effect the recipe itself. - * - * @return The recipes input vales. - */ - public Object[] getInput() - { - return this.input; - } - - @Override - public AspectList getAspects() - { - return aspects; - } - - @Override - public String getResearch() - { - return research; - } -} diff --git a/BM_src/thaumcraft/api/crafting/ShapelessArcaneRecipe.java b/BM_src/thaumcraft/api/crafting/ShapelessArcaneRecipe.java deleted file mode 100644 index 9687803b..00000000 --- a/BM_src/thaumcraft/api/crafting/ShapelessArcaneRecipe.java +++ /dev/null @@ -1,169 +0,0 @@ -package thaumcraft.api.crafting; - -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.AspectList; - -import java.util.ArrayList; -import java.util.Iterator; - -public class ShapelessArcaneRecipe implements IArcaneRecipe -{ - private ItemStack output = null; - private ArrayList input = new ArrayList(); - - public AspectList aspects = null; - public String research; - - public ShapelessArcaneRecipe(String research, Block result, AspectList aspects, Object... recipe) - { - this(research, new ItemStack(result), aspects, recipe); - } - - public ShapelessArcaneRecipe(String research, Item result, AspectList aspects, Object... recipe) - { - this(research, new ItemStack(result), aspects, recipe); - } - - public ShapelessArcaneRecipe(String research, ItemStack result, AspectList aspects, Object... recipe) - { - output = result.copy(); - this.research = research; - this.aspects = aspects; - - for (Object in : recipe) - { - if (in instanceof ItemStack) - { - input.add(((ItemStack) in).copy()); - } else if (in instanceof Item) - { - input.add(new ItemStack((Item) in)); - } else if (in instanceof Block) - { - input.add(new ItemStack((Block) in)); - } else if (in instanceof String) - { - input.add(OreDictionary.getOres((String) in)); - } else - { - String ret = "Invalid shapeless ore recipe: "; - - for (Object tmp : recipe) - { - ret += tmp + ", "; - } - - ret += output; - throw new RuntimeException(ret); - } - } - } - - @Override - public int getRecipeSize() - { - return input.size(); - } - - @Override - public ItemStack getRecipeOutput() - { - return output; - } - - @Override - public ItemStack getCraftingResult(IInventory var1) - { - return output.copy(); - } - - @Override - public boolean matches(IInventory var1, World world, EntityPlayer player) - { - if (research.length() > 0 && !ThaumcraftApiHelper.isResearchComplete(player.username, research)) - { - return false; - } - - ArrayList required = new ArrayList(input); - - for (int x = 0; x < 9; x++) - { - ItemStack slot = var1.getStackInSlot(x); - - if (slot != null) - { - boolean inRecipe = false; - Iterator req = required.iterator(); - - while (req.hasNext()) - { - boolean match = false; - Object next = req.next(); - - if (next instanceof ItemStack) - { - match = checkItemEquals((ItemStack) next, slot); - } else if (next instanceof ArrayList) - { - for (ItemStack item : (ArrayList) next) - { - match = match || checkItemEquals(item, slot); - } - } - - if (match) - { - inRecipe = true; - required.remove(next); - break; - } - } - - if (!inRecipe) - { - return false; - } - } - } - - return required.isEmpty(); - } - - private boolean checkItemEquals(ItemStack target, ItemStack input) - { - return (target.itemID == input.itemID && - (!target.hasTagCompound() || ItemStack.areItemStackTagsEqual(target, input)) && - (target.getItemDamage() == OreDictionary.WILDCARD_VALUE || target.getItemDamage() == input.getItemDamage())); - } - - /** - * Returns the input for this recipe, any mod accessing this value should never - * manipulate the values in this array as it will effect the recipe itself. - * - * @return The recipes input vales. - */ - public ArrayList getInput() - { - return this.input; - } - - @Override - public AspectList getAspects() - { - return aspects; - } - - @Override - public String getResearch() - { - return research; - } -} diff --git a/BM_src/thaumcraft/api/nodes/INode.java b/BM_src/thaumcraft/api/nodes/INode.java deleted file mode 100644 index f7f755c0..00000000 --- a/BM_src/thaumcraft/api/nodes/INode.java +++ /dev/null @@ -1,55 +0,0 @@ -package thaumcraft.api.nodes; - -import thaumcraft.api.aspects.IAspectContainer; - -public interface INode extends IAspectContainer -{ - /** - * Unique identifier to distinguish nodes. Normal node id's are based on world id and coordinates - * - * @return - */ - public String getId(); - - /** - * Return the type of node - * - * @return - */ - public NodeType getNodeType(); - - /** - * Set the type of node - * - * @return - */ - public void setNodeType(NodeType nodeType); - - /** - * Return the node modifier - * - * @return - */ - public void setNodeModifier(NodeModifier nodeModifier); - - /** - * Set the node modifier - * - * @return - */ - public NodeModifier getNodeModifier(); - - /** - * Return the maximum capacity of each aspect the node can hold - * - * @return - */ - public int getNodeVisBase(); - - /** - * Set the maximum capacity of each aspect the node can hold - * - * @return - */ - public void setNodeVisBase(short nodeVisBase); -} diff --git a/BM_src/thaumcraft/api/nodes/IRevealer.java b/BM_src/thaumcraft/api/nodes/IRevealer.java deleted file mode 100644 index 8f7bc2e7..00000000 --- a/BM_src/thaumcraft/api/nodes/IRevealer.java +++ /dev/null @@ -1,18 +0,0 @@ -package thaumcraft.api.nodes; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; - -/** - * @author Azanor - *

- * Equipped head slot items that extend this class will make nodes visible in world. - */ - -public interface IRevealer -{ - /* - * If this method returns true the nodes will be visible. - */ - public boolean showNodes(ItemStack itemstack, EntityLivingBase player); -} diff --git a/BM_src/thaumcraft/api/research/IScanEventHandler.java b/BM_src/thaumcraft/api/research/IScanEventHandler.java deleted file mode 100644 index 0fa313a2..00000000 --- a/BM_src/thaumcraft/api/research/IScanEventHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package thaumcraft.api.research; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public interface IScanEventHandler -{ - ScanResult scanPhenomena(ItemStack stack, World world, EntityPlayer player); -} diff --git a/BM_src/thaumcraft/api/research/ResearchCategories.java b/BM_src/thaumcraft/api/research/ResearchCategories.java deleted file mode 100644 index 8ba14edb..00000000 --- a/BM_src/thaumcraft/api/research/ResearchCategories.java +++ /dev/null @@ -1,101 +0,0 @@ -package thaumcraft.api.research; - -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; - -import java.util.Collection; -import java.util.LinkedHashMap; - -public class ResearchCategories -{ - //Research - public static LinkedHashMap researchCategories = new LinkedHashMap(); - - /** - * @param key - * @return the research item linked to this key - */ - public static ResearchCategoryList getResearchList(String key) - { - return researchCategories.get(key); - } - - /** - * @param key - * @return the name of the research category linked to this key. - * Must be stored as localization information in the LanguageRegistry. - */ - public static String getCategoryName(String key) - { - return StatCollector.translateToLocal("tc.research_category." + key); - } - - /** - * @param key the research key - * @return the ResearchItem object. - */ - public static ResearchItem getResearch(String key) - { - Collection rc = researchCategories.values(); - - for (Object cat : rc) - { - Collection rl = ((ResearchCategoryList) cat).research.values(); - - for (Object ri : rl) - { - if ((((ResearchItem) ri).key).equals(key)) - { - return (ResearchItem) ri; - } - } - } - - return null; - } - - /** - * @param key the key used for this category - * @param icon the icon to be used for the research category tab - * @param background the resource location of the background image to use for this category - * @return the name of the research linked to this key - */ - public static void registerCategory(String key, ResourceLocation icon, ResourceLocation background) - { - if (getResearchList(key) == null) - { - ResearchCategoryList rl = new ResearchCategoryList(icon, background); - researchCategories.put(key, rl); - } - } - - public static void addResearch(ResearchItem ri) - { - ResearchCategoryList rl = getResearchList(ri.category); - - if (rl != null && !rl.research.containsKey(ri.key)) - { - rl.research.put(ri.key, ri); - - if (ri.displayColumn < rl.minDisplayColumn) - { - rl.minDisplayColumn = ri.displayColumn; - } - - if (ri.displayRow < rl.minDisplayRow) - { - rl.minDisplayRow = ri.displayRow; - } - - if (ri.displayColumn > rl.maxDisplayColumn) - { - rl.maxDisplayColumn = ri.displayColumn; - } - - if (ri.displayRow > rl.maxDisplayRow) - { - rl.maxDisplayRow = ri.displayRow; - } - } - } -} diff --git a/BM_src/thaumcraft/api/research/ResearchCategoryList.java b/BM_src/thaumcraft/api/research/ResearchCategoryList.java deleted file mode 100644 index e1e85c86..00000000 --- a/BM_src/thaumcraft/api/research/ResearchCategoryList.java +++ /dev/null @@ -1,44 +0,0 @@ -package thaumcraft.api.research; - -import net.minecraft.util.ResourceLocation; - -import java.util.HashMap; -import java.util.Map; - -public class ResearchCategoryList -{ - /** - * Is the smallest column used on the GUI. - */ - public int minDisplayColumn; - - /** - * Is the smallest row used on the GUI. - */ - public int minDisplayRow; - - /** - * Is the biggest column used on the GUI. - */ - public int maxDisplayColumn; - - /** - * Is the biggest row used on the GUI. - */ - public int maxDisplayRow; - - /** - * display variables * - */ - public ResourceLocation icon; - public ResourceLocation background; - - public ResearchCategoryList(ResourceLocation icon, ResourceLocation background) - { - this.icon = icon; - this.background = background; - } - - //Research - public Map research = new HashMap(); -} diff --git a/BM_src/thaumcraft/api/research/ResearchItem.java b/BM_src/thaumcraft/api/research/ResearchItem.java deleted file mode 100644 index 5b2cf909..00000000 --- a/BM_src/thaumcraft/api/research/ResearchItem.java +++ /dev/null @@ -1,336 +0,0 @@ -package thaumcraft.api.research; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; - -public class ResearchItem -{ - /** - * A short string used as a key for this research. Must be unique - */ - public final String key; - - /** - * A short string used as a reference to the research category to which this must be added. - */ - public final String category; - - /** - * The aspect tags and their values required to complete this research - */ - public final AspectList tags; - - /** - * This links to any research that needs to be completed before this research can be discovered or learnt. - */ - public String[] parents = null; - - /** - * Like parent above, but a line will not be displayed in the thaumonomicon linking them. Just used to prevent clutter. - */ - public String[] parentsHidden = null; - /** - * any research linked to this that will be unlocked automatically when this research is complete - */ - public String[] siblings = null; - - /** - * the horizontal position of the research icon - */ - public final int displayColumn; - - /** - * the vertical position of the research icon - */ - public final int displayRow; - - /** - * the icon to be used for this research - */ - public final ItemStack icon_item; - - /** - * the icon to be used for this research - */ - public final ResourceLocation icon_resource; - - /** - * How large the research grid is. Valid values are 1 to 5. - */ - private int complexity; - - /** - * Special research has a spiky border. Used for important research milestones. - */ - private boolean isSpecial; - - /** - * This indicates if the research should use a circular icon border. Usually used for "passive" research - * that doesn't have recipes and grants passive effects, or that unlock automatically. - */ - private boolean isRound; - - /** - * Stub research cannot be discovered by normal means, but can be unlocked via the sibling system. - */ - private boolean isStub; - - /** - * This indicated that the research is completely hidden and cannot be discovered by any - * player-controlled means. The recipes will never show up in the thaumonomicon. - * Usually used to unlock "hidden" recipes via sibling unlocking, like - * the various cap and rod combos for wands. - */ - private boolean isVirtual; - - /** - * Hidden research does not display in the thaumonomicon until discovered - */ - private boolean isHidden; - - /** - * Concealed research does not display in the thaumonomicon until parent researches are discovered. - */ - private boolean isConcealed; - - /** - * Lost research can only be discovered via knowledge fragments - */ - private boolean isLost; - - /** - * These research items will automatically unlock for all players on game start - */ - private boolean isAutoUnlock; - - private ResearchPage[] pages = null; - - public ResearchItem(String par1, String par2) - { - this.key = par1; - this.category = par2; - this.tags = new AspectList(); - this.icon_resource = null; - this.icon_item = null; - this.displayColumn = 0; - this.displayRow = 0; - this.setVirtual(); - } - - public ResearchItem(String par1, String par2, AspectList tags, int par3, int par4, int par5, ResourceLocation icon) - { - this.key = par1; - this.category = par2; - this.tags = tags; - this.icon_resource = icon; - this.icon_item = null; - this.displayColumn = par3; - this.displayRow = par4; - this.complexity = par5; - - if (complexity < 1) - { - this.complexity = 1; - } - - if (complexity > 5) - { - this.complexity = 5; - } - } - - public ResearchItem(String par1, String par2, AspectList tags, int par3, int par4, int par5, ItemStack icon) - { - this.key = par1; - this.category = par2; - this.tags = tags; - this.icon_item = icon; - this.icon_resource = null; - this.displayColumn = par3; - this.displayRow = par4; - this.complexity = par5; - - if (complexity < 0) - { - this.complexity = 0; - } - - if (complexity > 5) - { - this.complexity = 5; - } - } - - public ResearchItem setSpecial() - { - this.isSpecial = true; - return this; - } - - public ResearchItem setStub() - { - this.isStub = true; - return this; - } - - public ResearchItem setHidden() - { - this.isHidden = true; - return this; - } - - public ResearchItem setConcealed() - { - this.isConcealed = true; - return this; - } - - public ResearchItem setLost() - { - this.isLost = true; - return this; - } - - public ResearchItem setVirtual() - { - this.isVirtual = true; - return this; - } - - public ResearchItem setParents(String... par) - { - this.parents = par; - return this; - } - - public ResearchItem setParentsHidden(String... par) - { - this.parentsHidden = par; - return this; - } - - public ResearchItem setSiblings(String... sib) - { - this.siblings = sib; - return this; - } - - public ResearchItem setPages(ResearchPage... par) - { - this.pages = par; - return this; - } - - public ResearchPage[] getPages() - { - return pages; - } - - public ResearchItem registerResearchItem() - { - ResearchCategories.addResearch(this); - return this; - } - - @SideOnly(Side.CLIENT) - public String getName() - { - return StatCollector.translateToLocal("tc.research_name." + key); - } - - @SideOnly(Side.CLIENT) - public String getText() - { - return StatCollector.translateToLocal("tc.research_text." + key); - } - - @SideOnly(Side.CLIENT) - public boolean isSpecial() - { - return this.isSpecial; - } - - public boolean isStub() - { - return this.isStub; - } - - public boolean isHidden() - { - return this.isHidden; - } - - public boolean isConcealed() - { - return this.isConcealed; - } - - public boolean isLost() - { - return this.isLost; - } - - public boolean isVirtual() - { - return this.isVirtual; - } - - public boolean isAutoUnlock() - { - return isAutoUnlock; - } - - public ResearchItem setAutoUnlock() - { - this.isAutoUnlock = true; - return this; - } - - public boolean isRound() - { - return isRound; - } - - public ResearchItem setRound() - { - this.isRound = true; - return this; - } - - public int getComplexity() - { - return complexity; - } - - public ResearchItem setComplexity(int complexity) - { - this.complexity = complexity; - return this; - } - - /** - * @return the aspect aspects ordinal with the highest value. Used to determine scroll color and similar things - */ - public Aspect getResearchPrimaryTag() - { - Aspect aspect = null; - int highest = 0; - - if (tags != null) - for (Aspect tag : tags.getAspects()) - { - if (tags.getAmount(tag) > highest) - { - aspect = tag; - highest = tags.getAmount(tag); - } ; - } - - return aspect; - } -} diff --git a/BM_src/thaumcraft/api/research/ResearchPage.java b/BM_src/thaumcraft/api/research/ResearchPage.java deleted file mode 100644 index 57ae8290..00000000 --- a/BM_src/thaumcraft/api/research/ResearchPage.java +++ /dev/null @@ -1,198 +0,0 @@ -package thaumcraft.api.research; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StatCollector; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.crafting.CrucibleRecipe; -import thaumcraft.api.crafting.IArcaneRecipe; -import thaumcraft.api.crafting.InfusionEnchantmentRecipe; -import thaumcraft.api.crafting.InfusionRecipe; - -import java.util.List; - -public class ResearchPage -{ - public static enum PageType - { - TEXT, - TEXT_CONCEALED, - IMAGE, - CRUCIBLE_CRAFTING, - ARCANE_CRAFTING, - ASPECTS, - NORMAL_CRAFTING, - INFUSION_CRAFTING, - COMPOUND_CRAFTING, - INFUSION_ENCHANTMENT - } - - public PageType type = PageType.TEXT; - - public String text = null; - public String research = null; - public ResourceLocation image = null; - public AspectList aspects = null; - public Object recipe = null; - public ItemStack recipeOutput = null; - - /** - * @param text this can (but does not have to) be a reference to a localization variable, not the actual text. - */ - public ResearchPage(String text) - { - this.type = PageType.TEXT; - this.text = text; - } - - /** - * @param research this page will only be displayed if the player has discovered this research - * @param text this can (but does not have to) be a reference to a localization variable, not the actual text. - */ - public ResearchPage(String research, String text) - { - this.type = PageType.TEXT_CONCEALED; - this.research = research; - this.text = text; - } - - /** - * @param recipe a vanilla crafting recipe. - */ - public ResearchPage(IRecipe recipe) - { - this.type = PageType.NORMAL_CRAFTING; - this.recipe = recipe; - this.recipeOutput = recipe.getRecipeOutput(); - } - - /** - * @param recipe a collection of vanilla crafting recipes. - */ - public ResearchPage(IRecipe[] recipe) - { - this.type = PageType.NORMAL_CRAFTING; - this.recipe = recipe; - } - - /** - * @param recipe a collection of arcane crafting recipes. - */ - public ResearchPage(IArcaneRecipe[] recipe) - { - this.type = PageType.ARCANE_CRAFTING; - this.recipe = recipe; - } - - /** - * @param recipe a collection of infusion crafting recipes. - */ - public ResearchPage(InfusionRecipe[] recipe) - { - this.type = PageType.INFUSION_CRAFTING; - this.recipe = recipe; - } - - /** - * @param recipe a compound crafting recipe. - */ - public ResearchPage(List recipe) - { - this.type = PageType.COMPOUND_CRAFTING; - this.recipe = recipe; - } - - /** - * @param recipe an arcane worktable crafting recipe. - */ - public ResearchPage(IArcaneRecipe recipe) - { - this.type = PageType.ARCANE_CRAFTING; - this.recipe = recipe; - this.recipeOutput = recipe.getRecipeOutput(); - } - - /** - * @param recipe an alchemy crafting recipe. - */ - public ResearchPage(CrucibleRecipe recipe) - { - this.type = PageType.CRUCIBLE_CRAFTING; - this.recipe = recipe; - this.recipeOutput = recipe.recipeOutput; - } - - /** - * @param recipe an infusion crafting recipe. - */ - public ResearchPage(InfusionRecipe recipe) - { - this.type = PageType.INFUSION_CRAFTING; - this.recipe = recipe; - - if (recipe.recipeOutput instanceof ItemStack) - { - this.recipeOutput = (ItemStack) recipe.recipeOutput; - } else - { - this.recipeOutput = recipe.recipeInput; - } - } - - /** - * @param recipe an infusion crafting recipe. - */ - public ResearchPage(InfusionEnchantmentRecipe recipe) - { - this.type = PageType.INFUSION_ENCHANTMENT; - this.recipe = recipe; -// if (recipe.recipeOutput instanceof ItemStack) { -// this.recipeOutput = (ItemStack) recipe.recipeOutput; -// } else { -// this.recipeOutput = recipe.recipeInput; -// } - } - - /** - * @param image - * @param caption this can (but does not have to) be a reference to a localization variable, not the actual text. - */ - public ResearchPage(ResourceLocation image, String caption) - { - this.type = PageType.IMAGE; - this.image = image; - this.text = caption; - } - - /** - * This function should really not be called directly - used internally - */ - public ResearchPage(AspectList as) - { - this.type = PageType.ASPECTS; - this.aspects = as; - } - - /** - * returns a localized text of the text field (if one exists). Returns the text field itself otherwise. - * - * @return - */ - public String getTranslatedText() - { - String ret = ""; - - if (text != null) - { - ret = StatCollector.translateToLocal(text); - - if (ret.isEmpty()) - { - ret = text; - } - } - - return ret; - } -} diff --git a/BM_src/thaumcraft/api/research/ScanResult.java b/BM_src/thaumcraft/api/research/ScanResult.java deleted file mode 100644 index 3b9d236d..00000000 --- a/BM_src/thaumcraft/api/research/ScanResult.java +++ /dev/null @@ -1,55 +0,0 @@ -package thaumcraft.api.research; - -import net.minecraft.entity.Entity; - -public class ScanResult -{ - public byte type = 0; //1=blocks,2=entities,3=phenomena - public int blockId; - public int blockMeta; - public Entity entity; - public String phenomena; - - public ScanResult(byte type, int blockId, int blockMeta, Entity entity, - String phenomena) - { - super(); - this.type = type; - this.blockId = blockId; - this.blockMeta = blockMeta; - this.entity = entity; - this.phenomena = phenomena; - } - - @Override - public boolean equals(Object obj) - { - if (obj instanceof ScanResult) - { - ScanResult sr = (ScanResult) obj; - - if (type != sr.type) - { - return false; - } - - if (type == 1 - && (blockId != sr.blockId || blockMeta != sr.blockMeta)) - { - return false; - } - - if (type == 2 && entity.entityId != sr.entity.entityId) - { - return false; - } - - if (type == 3 && !phenomena.equals(sr.phenomena)) - { - return false; - } - } - - return true; - } -} diff --git a/BM_src/thaumcraft/api/wands/IWandFocus.java b/BM_src/thaumcraft/api/wands/IWandFocus.java deleted file mode 100644 index c0922ed5..00000000 --- a/BM_src/thaumcraft/api/wands/IWandFocus.java +++ /dev/null @@ -1,60 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Icon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.world.World; -import thaumcraft.api.aspects.AspectList; - -public interface IWandFocus -{ - public enum WandFocusAnimation - { - WAVE, CHARGE; - } - - /** - * @return The color the focus should be changed to. - */ - public int getFocusColor(); - - /** - * @return An icon that will be drawn as a block inside the focus "block". - */ - Icon getFocusDepthLayerIcon(); - - public Icon getOrnament(); - - public WandFocusAnimation getAnimation(); - - /** - * Gets the amount of vis used per aspect per click or tick. This cost is actually listed as - * a hundredth of a single point of vis, so a cost of 100 will equal one vis per tick/click. - * It is returned as an AspectList to allow for multiple vis types in different ratios. - */ - public AspectList getVisCost(); - - public boolean isVisCostPerTick(); - - public ItemStack onFocusRightClick(ItemStack itemstack, World world, EntityPlayer player, MovingObjectPosition movingobjectposition); - - public void onUsingFocusTick(ItemStack itemstack, EntityPlayer player, int count); - - public void onPlayerStoppedUsingFocus(ItemStack itemstack, World world, EntityPlayer player, int count); - - /** - * Helper method to determine in what order foci should be iterated through when - * the user presses the 'change focus' keybinding. - * - * @return a string of characters that foci will be sorted against. - * For example AA00 will be placed before FG12 - *
As a guide build the sort string from two alphanumeric characters followed by - * two numeric characters based on... whatever. - */ - public String getSortingHelper(ItemStack itemstack); - - boolean onFocusBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player); - - public boolean acceptsEnchant(int id); -} diff --git a/BM_src/thaumcraft/api/wands/IWandRodOnUpdate.java b/BM_src/thaumcraft/api/wands/IWandRodOnUpdate.java deleted file mode 100644 index 5f9053f8..00000000 --- a/BM_src/thaumcraft/api/wands/IWandRodOnUpdate.java +++ /dev/null @@ -1,15 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -/** - * @author azanor - *

- * Implemented by a class that you wish to be called whenever a wand with this rod performs its - * update tick. - */ -public interface IWandRodOnUpdate -{ - void onUpdate(ItemStack itemstack, EntityPlayer player); -} diff --git a/BM_src/thaumcraft/api/wands/IWandTriggerManager.java b/BM_src/thaumcraft/api/wands/IWandTriggerManager.java deleted file mode 100644 index c6229630..00000000 --- a/BM_src/thaumcraft/api/wands/IWandTriggerManager.java +++ /dev/null @@ -1,11 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public interface IWandTriggerManager -{ - public boolean performTrigger(World world, ItemStack wand, EntityPlayer player, - int x, int y, int z, int side, int event); -} diff --git a/BM_src/thaumcraft/api/wands/IWandable.java b/BM_src/thaumcraft/api/wands/IWandable.java deleted file mode 100644 index 0e14241e..00000000 --- a/BM_src/thaumcraft/api/wands/IWandable.java +++ /dev/null @@ -1,22 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -/** - * @author azanor - *

- * Add this to a tile entity that you wish wands to interact with in some way. - */ - -public interface IWandable -{ - public int onWandRightClick(World world, ItemStack wandstack, EntityPlayer player, int x, int y, int z, int side, int md); - - public ItemStack onWandRightClick(World world, ItemStack wandstack, EntityPlayer player); - - public void onUsingWandTick(ItemStack wandstack, EntityPlayer player, int count); - - public void onWandStoppedUsing(ItemStack wandstack, World world, EntityPlayer player, int count); -} diff --git a/BM_src/thaumcraft/api/wands/ItemFocusBasic.java b/BM_src/thaumcraft/api/wands/ItemFocusBasic.java deleted file mode 100644 index deb02d96..00000000 --- a/BM_src/thaumcraft/api/wands/ItemFocusBasic.java +++ /dev/null @@ -1,185 +0,0 @@ -package thaumcraft.api.wands; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Icon; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import thaumcraft.api.ThaumcraftApi; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; - -import java.text.DecimalFormat; -import java.util.List; -import java.util.Map; - -public class ItemFocusBasic extends Item implements IWandFocus -{ - public ItemFocusBasic(int i) - { - super(i); - maxStackSize = 1; - canRepair = false; - this.setMaxDamage(1); - } - - public Icon icon; - - @SideOnly(Side.CLIENT) - @Override - public Icon getIconFromDamage(int par1) - { - return icon; - } - - @Override - public boolean isItemTool(ItemStack par1ItemStack) - { - return true; - } - - @Override - public boolean isDamageable() - { - return true; - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) - { - AspectList al = this.getVisCost(); - - if (al != null && al.size() > 0) - { - list.add(StatCollector.translateToLocal(isVisCostPerTick() ? "item.Focus.cost2" : "item.Focus.cost1")); - - for (Aspect aspect : al.getAspectsSorted()) - { - DecimalFormat myFormatter = new DecimalFormat("#####.##"); - String amount = myFormatter.format(al.getAmount(aspect) / 100f); - list.add(" \u00A7" + aspect.getChatcolor() + aspect.getName() + "\u00A7r x " + amount); - } - } - } - - @Override - public int getItemEnchantability() - { - return 5; - } - - @Override - public EnumRarity getRarity(ItemStack itemstack) - { - return EnumRarity.rare; - } - - @Override - public int getFocusColor() - { - // TODO Auto-generated method stub - return 0; - } - - @Override - public AspectList getVisCost() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public ItemStack onFocusRightClick(ItemStack itemstack, World world, - EntityPlayer player, MovingObjectPosition movingobjectposition) - { - // TODO Auto-generated method stub - return null; - } - - @Override - public void onUsingFocusTick(ItemStack itemstack, EntityPlayer player, - int count) - { - // TODO Auto-generated method stub - } - - @Override - public void onPlayerStoppedUsingFocus(ItemStack itemstack, World world, - EntityPlayer player, int count) - { - // TODO Auto-generated method stub - } - - /** - * Just insert two alphanumeric characters before this string in your focus item class - */ - @Override - public String getSortingHelper(ItemStack itemstack) - { - Map ench = EnchantmentHelper.getEnchantments(itemstack); - String out = ""; - - for (Integer lvl : ench.values()) - { - out = out + lvl + ""; - } - - return out; - } - - @Override - public boolean isVisCostPerTick() - { - return false; - } - - @Override - public Icon getOrnament() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean onFocusBlockStartBreak(ItemStack itemstack, int x, int y, - int z, EntityPlayer player) - { - // TODO Auto-generated method stub - return false; - } - - @Override - public WandFocusAnimation getAnimation() - { - return WandFocusAnimation.WAVE; - } - - @Override - public Icon getFocusDepthLayerIcon() - { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see thaumcraft.api.wands.IWandFocus#acceptsEnchant(int) - * By default fortune is off for all wands - */ - @Override - public boolean acceptsEnchant(int id) - { - if (id == ThaumcraftApi.enchantFrugal || - id == ThaumcraftApi.enchantPotency) - { - return true; - } - - return false; - } -} diff --git a/BM_src/thaumcraft/api/wands/WandCap.java b/BM_src/thaumcraft/api/wands/WandCap.java deleted file mode 100644 index 2d658039..00000000 --- a/BM_src/thaumcraft/api/wands/WandCap.java +++ /dev/null @@ -1,133 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import thaumcraft.api.aspects.Aspect; - -import java.util.LinkedHashMap; -import java.util.List; - -/** - * This class is used to keep the material information for the various caps. - * It is also used to generate the wand recipes ingame. - * - * @author Azanor - */ -public class WandCap -{ - private String tag; - - /** - * Cost to craft this wand. Combined with the rod cost. - */ - private int craftCost; - - /** - * the amount by which all aspect costs are multiplied - */ - float baseCostModifier; - - /** - * specifies a list of primal aspects that use the special discount figure instead of the normal discount. - */ - List specialCostModifierAspects; - - /** - * the amount by which the specified aspect costs are multiplied - */ - float specialCostModifier; - - /** - * The texture that will be used for the ingame wand cap - */ - ResourceLocation texture; - - /** - * the actual item that makes up this cap and will be used to generate the wand recipes - */ - ItemStack item; - - public static LinkedHashMap caps = new LinkedHashMap(); - - public WandCap(String tag, float discount, ItemStack item, int craftCost) - { - this.setTag(tag); - this.baseCostModifier = discount; - this.specialCostModifierAspects = null; - texture = new ResourceLocation("thaumcraft", "textures/models/wand_cap_" + getTag() + ".png"); - this.item = item; - this.setCraftCost(craftCost); - caps.put(tag, this); - } - - public WandCap(String tag, float discount, List specialAspects, float discountSpecial, ItemStack item, int craftCost) - { - this.setTag(tag); - this.baseCostModifier = discount; - this.specialCostModifierAspects = specialAspects; - this.specialCostModifier = discountSpecial; - texture = new ResourceLocation("thaumcraft", "textures/models/wand_cap_" + getTag() + ".png"); - this.item = item; - this.setCraftCost(craftCost); - caps.put(tag, this); - } - - public float getBaseCostModifier() - { - return baseCostModifier; - } - - public List getSpecialCostModifierAspects() - { - return specialCostModifierAspects; - } - - public float getSpecialCostModifier() - { - return specialCostModifier; - } - - public ResourceLocation getTexture() - { - return texture; - } - - public void setTexture(ResourceLocation texture) - { - this.texture = texture; - } - - public String getTag() - { - return tag; - } - - public void setTag(String tag) - { - this.tag = tag; - } - - public ItemStack getItem() - { - return item; - } - - public void setItem(ItemStack item) - { - this.item = item; - } - - public int getCraftCost() - { - return craftCost; - } - - public void setCraftCost(int craftCost) - { - this.craftCost = craftCost; - } - - // Some examples: - // WandCap WAND_CAP_IRON = new WandCap("iron", 1.1f, Arrays.asList(Aspect.ORDER),1, new ItemStack(ConfigItems.itemWandCap,1,0),1); - // WandCap WAND_CAP_GOLD = new WandCap("gold", 1f, new ItemStack(ConfigItems.itemWandCap,1,1),3); -} diff --git a/BM_src/thaumcraft/api/wands/WandRod.java b/BM_src/thaumcraft/api/wands/WandRod.java deleted file mode 100644 index 4659f4ac..00000000 --- a/BM_src/thaumcraft/api/wands/WandRod.java +++ /dev/null @@ -1,166 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import java.util.LinkedHashMap; - -/** - * @author Azanor - *

- * This class is used to keep the material information for the various rods. - * It is also used to generate the wand recipes ingame. - */ -public class WandRod -{ - private String tag; - - /** - * Cost to craft this wand. Combined with the rod cost. - */ - private int craftCost; - - /** - * The amount of vis that can be stored - this number is actually multiplied - * by 100 for use by the wands internals - */ - int capacity; - - /** - * The texture that will be used for the ingame wand rod - */ - ResourceLocation texture; - - /** - * the actual item that makes up this rod and will be used to generate the wand recipes - */ - ItemStack item; - - /** - * A class that will be called whenever the wand onUpdate tick is run - */ - IWandRodOnUpdate onUpdate; - - /** - * Does the rod glow in the dark? - */ - boolean glow; - - public static LinkedHashMap rods = new LinkedHashMap(); - - public WandRod(String tag, int capacity, ItemStack item, int craftCost, ResourceLocation texture) - { - this.setTag(tag); - this.capacity = capacity; - this.texture = texture; - this.item = item; - this.setCraftCost(craftCost); - rods.put(tag, this); - } - - public WandRod(String tag, int capacity, ItemStack item, int craftCost, IWandRodOnUpdate onUpdate, ResourceLocation texture) - { - this.setTag(tag); - this.capacity = capacity; - this.texture = texture; - this.item = item; - this.setCraftCost(craftCost); - rods.put(tag, this); - this.onUpdate = onUpdate; - } - - public WandRod(String tag, int capacity, ItemStack item, int craftCost) - { - this.setTag(tag); - this.capacity = capacity; - this.texture = new ResourceLocation("thaumcraft", "textures/models/wand_rod_" + getTag() + ".png"); - this.item = item; - this.setCraftCost(craftCost); - rods.put(tag, this); - } - - public WandRod(String tag, int capacity, ItemStack item, int craftCost, IWandRodOnUpdate onUpdate) - { - this.setTag(tag); - this.capacity = capacity; - this.texture = new ResourceLocation("thaumcraft", "textures/models/wand_rod_" + getTag() + ".png"); - this.item = item; - this.setCraftCost(craftCost); - rods.put(tag, this); - this.onUpdate = onUpdate; - } - - public String getTag() - { - return tag; - } - - public void setTag(String tag) - { - this.tag = tag; - } - - public int getCapacity() - { - return capacity; - } - - public void setCapacity(int capacity) - { - this.capacity = capacity; - } - - public ResourceLocation getTexture() - { - return texture; - } - - public void setTexture(ResourceLocation texture) - { - this.texture = texture; - } - - public ItemStack getItem() - { - return item; - } - - public void setItem(ItemStack item) - { - this.item = item; - } - - public int getCraftCost() - { - return craftCost; - } - - public void setCraftCost(int craftCost) - { - this.craftCost = craftCost; - } - - public IWandRodOnUpdate getOnUpdate() - { - return onUpdate; - } - - public void setOnUpdate(IWandRodOnUpdate onUpdate) - { - this.onUpdate = onUpdate; - } - - public boolean isGlowing() - { - return glow; - } - - public void setGlowing(boolean hasGlow) - { - this.glow = hasGlow; - } - - // Some examples: - // WandRod WAND_ROD_WOOD = new WandRod("wood",25,new ItemStack(Item.stick),1); - // WandRod WAND_ROD_BLAZE = new WandRod("blaze",100,new ItemStack(Item.blazeRod),7,new WandRodBlazeOnUpdate()); -} diff --git a/BM_src/thaumcraft/api/wands/WandTriggerRegistry.java b/BM_src/thaumcraft/api/wands/WandTriggerRegistry.java deleted file mode 100644 index ac2d337b..00000000 --- a/BM_src/thaumcraft/api/wands/WandTriggerRegistry.java +++ /dev/null @@ -1,84 +0,0 @@ -package thaumcraft.api.wands; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -/** - * This class serves a similar function to IWandable in that it allows wands to interact - * with object in the world. In this case it is most useful for adding interaction with non-mod - * blocks where you can't control what happens in their code. - * Example where it is used is in crafting the thaumonomicon from a bookshelf and the - * crucible from a cauldron - * - * @author azanor - */ -public class WandTriggerRegistry -{ - /** - * Registers an action to perform when a casting wand right clicks on a specific block. - * A manager class needs to be created that implements IWandTriggerManager. - * - * @param manager - * @param event a logical number that you can use to differentiate different events or actions - * @param blockid - * @param meta send -1 as a wildcard value for all possible meta values - */ - public static void registerWandBlockTrigger(IWandTriggerManager manager, int event, int blockid, int meta) - { - triggers.put(Arrays.asList(blockid, meta), - Arrays.asList(manager, event)); - } - - private static HashMap,List> triggers = new HashMap,List>(); - - public static boolean hasTrigger(int blockid, int meta) - { - if (triggers.containsKey(Arrays.asList(blockid, meta)) || - triggers.containsKey(Arrays.asList(blockid, -1))) - { - return true; - } - - return false; - } - - /** - * This is called by the onItemUseFirst function in wands. - * Parameters and return value functions like you would expect for that function. - * - * @param world - * @param wand - * @param player - * @param x - * @param y - * @param z - * @param side - * @param blockid - * @param meta - * @return - */ - public static boolean performTrigger(World world, ItemStack wand, EntityPlayer player, - int x, int y, int z, int side, int blockid, int meta) - { - List l = triggers.get(Arrays.asList(blockid, meta)); - - if (l == null) - { - l = triggers.get(Arrays.asList(blockid, -1)); - } - - if (l == null) - { - return false; - } - - IWandTriggerManager manager = (IWandTriggerManager) l.get(0); - int event = (Integer) l.get(1); - return manager.performTrigger(world, wand, player, x, y, z, side, event); - } -} From e4c92e646a1709938999084ff08818eb8aadc4f8 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 8 Mar 2014 16:11:29 -0500 Subject: [PATCH 29/33] Yay more fixes! --- BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java | 2 +- .../common/altarRecipeRegistry/AltarRecipeRegistry.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index d02d3e30..346aaabe 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -110,7 +110,7 @@ import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.relauncher.Side; -@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.7.2") +@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.7.3c") @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {"BloodAltar", "particle", "SetLifeEssence", "GetLifeEssence", "Ritual", "GetAltarEssence", "TESocket", "TEWritingTable", "CustomParticle", "SetPlayerVel", "SetPlayerPos", "TEPedestal", "TEPlinth", "TETeleposer", "InfiniteLPPath", "TEOrientor"}, packetHandler = PacketHandler.class) public class AlchemicalWizardry diff --git a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java index e4ee3444..bec8eac5 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -40,7 +40,7 @@ public class AltarRecipeRegistry registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Item.enderPearl),4,2000,10,10,false); registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); - registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); + registerAltarRecipe(new ItemStack(ModItems.demonicSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); registerAltarRecipe(new ItemStack(ModItems.duskScribeTool), new ItemStack(Block.coalBlock),4,2000,20,10,false); registerAltarRecipe(new ItemStack(ModBlocks.bloodSocket), new ItemStack(ModBlocks.emptySocket),3,30000,40,10,false); registerAltarRecipe(new ItemStack(ModItems.earthScribeTool), new ItemStack(Block.obsidian),3,1000,5,5,false); From 50c44a66a72935f238bf4fb48023aac0b73111e6 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 8 Mar 2014 16:12:48 -0500 Subject: [PATCH 30/33] More API stuff? From a4a02b411811220c4508b6f6526e1a6a1fd6d538 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 8 Mar 2014 16:12:56 -0500 Subject: [PATCH 31/33] Test From fa9112493c086af27233a611d2d460469c0deafb Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 15 Mar 2014 17:43:59 -0400 Subject: [PATCH 32/33] Pushing changes in 1.7.2 to 1.6.4 build --- .../AlchemicalWizardry.java | 72 +++- .../BloodMagicConfiguration.java | 2 + .../alchemicalWizardry/ModItems.java | 10 + .../client/ClientProxy.java | 12 +- .../common/AlchemicalWizardryEventHooks.java | 21 +- .../AltarRecipeRegistry.java | 2 +- .../common/block/BlockOrientable.java | 2 + .../common/block/BlockSpellModifier.java | 18 + .../common/block/BlockSpellParadigm.java | 32 +- .../common/items/EnergyItems.java | 2 +- .../common/items/IHolding.java | 6 + .../common/items/ItemAlchemyBase.java | 107 ++++++ .../common/items/ItemComponents.java | 4 +- .../common/items/potion/AlchemyFlask.java | 1 - .../sigil/ItemSigilOfEnderSeverance.java | 171 +++++++++ .../items/sigil/SigilOfElementalAffinity.java | 1 - .../common/items/sigil/SigilOfHolding.java | 8 + .../common/potion/PotionPlanarBinding.java | 18 + .../block/RenderSpellModifierBlock.java | 49 +++ .../block/RenderSpellParadigmBlock.java | 49 +++ .../TESpellModifierBlockItemRenderer.java | 108 ++++++ .../TESpellParadigmBlockItemRenderer.java | 107 ++++++ .../model/ModelSpellModifierBlock.java | 303 ++++++++++++++++ .../model/ModelSpellParadigmBlock.java | 234 ++++++++++++ .../rituals/RitualEffectSummonPlayer.java | 103 ++++++ .../complex/effect/SpellEffectEarth.java | 51 ++- .../spell/complex/effect/SpellHelper.java | 42 +++ .../MeleeSpellCenteredWorldEffect.java | 13 +- .../earth/MeleeDefaultEarth.java | 13 +- .../earth/MeleeDefensiveEarth.java | 39 ++ .../earth/MeleeEnvironmentalEarth.java | 47 +++ .../earth/MeleeOffensiveEarth.java | 34 ++ .../impactEffects/earth/SelfDefaultEarth.java | 51 +++ .../earth/SelfDefensiveEarth.java | 27 ++ .../earth/SelfEnvironmentalEarth.java | 45 +++ .../earth/SelfOffensiveEarth.java | 43 +++ .../impactEffects/fire/SelfOffensiveFire.java | 2 +- .../common/tileEntity/TEMasterStone.java | 13 + .../tileEntity/TESpellEnhancementBlock.java | 36 +- .../tileEntity/TESpellModifierBlock.java | 13 + .../tileEntity/TESpellParadigmBlock.java | 23 ++ .../items/baseItemCrackedRunicPlate.png | Bin 0 -> 522 bytes .../textures/items/baseItemDefaultCore.png | Bin 0 -> 327 bytes .../textures/items/baseItemDefensiveCore.png | Bin 0 -> 502 bytes .../textures/items/baseItemEarthenCore.png | Bin 0 -> 454 bytes .../textures/items/baseItemEmptyCore.png | Bin 0 -> 237 bytes .../items/baseItemEnvironmentalCore.png | Bin 0 -> 370 bytes .../textures/items/baseItemFlameCore.png | Bin 0 -> 488 bytes .../textures/items/baseItemGustCore.png | Bin 0 -> 488 bytes .../textures/items/baseItemIcyCore.png | Bin 0 -> 551 bytes .../textures/items/baseItemInputCable.png | Bin 0 -> 291 bytes .../textures/items/baseItemMagicalesCable.png | Bin 0 -> 284 bytes .../textures/items/baseItemMeleeCore.png | Bin 0 -> 461 bytes .../textures/items/baseItemOffensiveCore.png | Bin 0 -> 353 bytes .../textures/items/baseItemOutputCable.png | Bin 0 -> 290 bytes .../items/baseItemParadigmBackPlate.png | Bin 0 -> 306 bytes .../textures/items/baseItemProjectileCore.png | Bin 0 -> 478 bytes .../textures/items/baseItemRunicPlate.png | Bin 0 -> 420 bytes .../items/baseItemScribedRunicPlate.png | Bin 0 -> 481 bytes .../textures/items/baseItemSelfCore.png | Bin 0 -> 433 bytes .../textures/items/baseItemStoneBrace.png | Bin 0 -> 308 bytes .../textures/items/baseItemWoodBrace.png | Bin 0 -> 316 bytes .../textures/models/SpellModifierDefault.png | Bin 0 -> 1193 bytes .../models/SpellModifierDefensive.png | Bin 0 -> 1608 bytes .../models/SpellModifierEnvironmental.png | Bin 0 -> 1398 bytes .../models/SpellModifierOffensive.png | Bin 0 -> 1350 bytes .../textures/models/SpellParadigmMelee.png | Bin 0 -> 1230 bytes .../models/SpellParadigmProjectile.png | Bin 0 -> 1229 bytes .../textures/models/SpellParadigmSelf.png | Bin 0 -> 1193 bytes 1.7.2/resources/assets/forge/lang/ru_RU.lang | 5 - .../AlchemicalWizardry.java | 85 ++++- .../BloodMagicConfiguration.java | 7 + .../alchemicalWizardry/ModItems.java | 5 + .../client/ClientProxy.java | 17 +- .../common/AlchemicalWizardryEventHooks.java | 48 ++- .../common/PotionFireFuse.java | 18 + .../common/PotionHeavyHeart.java | 18 + .../common/PotionPlanarBinding.java | 18 + .../common/block/BlockSpellEnhancement.java | 18 + .../common/block/BlockSpellModifier.java | 18 + .../common/block/BlockSpellParadigm.java | 18 + .../common/items/EnergyBattery.java | 7 +- .../common/items/ItemAlchemyBase.java | 107 ++++++ .../common/items/ItemComponents.java | 75 ++++ .../block/RenderSpellEnhancementBlock.java | 49 +++ .../block/RenderSpellModifierBlock.java | 49 +++ .../block/RenderSpellParadigmBlock.java | 49 +++ .../TESpellEnhancementBlockItemRenderer.java | 114 ++++++ .../TESpellModifierBlockItemRenderer.java | 108 ++++++ .../TESpellParadigmBlockItemRenderer.java | 107 ++++++ .../model/ModelSpellEnhancementBlock.java | 334 ++++++++++++++++++ .../model/ModelSpellModifierBlock.java | 303 ++++++++++++++++ .../model/ModelSpellParadigmBlock.java | 234 ++++++++++++ .../rituals/RitualEffectFeatheredKnife.java | 5 +- .../spell/complex/EntitySpellProjectile.java | 2 +- .../complex/effect/SpellEffectEarth.java | 79 ++--- .../spell/complex/effect/SpellEffectFire.java | 35 +- .../spell/complex/effect/SpellEffectWind.java | 21 +- .../spell/complex/effect/SpellHelper.java | 96 ++++- .../IProjectileImpactEffect.java | 2 +- .../MeleeSpellCenteredWorldEffect.java | 33 ++ .../earth/MeleeDefaultEarth.java | 41 +++ .../earth/MeleeDefensiveEarth.java | 37 ++ .../earth/MeleeEnvironmentalEarth.java | 48 +++ .../earth/MeleeOffensiveEarth.java | 34 ++ .../earth/ProjectileDefaultEarth.java | 57 +++ .../earth/ProjectileDefensiveEarth.java | 66 ++++ .../earth/ProjectileEnvironmentalEarth.java | 14 +- .../earth/ProjectileOffensiveEarth.java | 91 +++++ .../impactEffects/earth/SelfDefaultEarth.java | 52 +++ .../earth/SelfDefensiveEarth.java | 27 ++ .../earth/SelfEnvironmentalEarth.java | 45 +++ .../earth/SelfOffensiveEarth.java | 43 +++ .../fire/ProjectileDefaultFire.java | 58 ++- .../fire/ProjectileDefensiveFire.java | 47 +++ .../fire/ProjectileEnvironmentalFire.java | 46 +++ .../fire/ProjectileOffensiveFire.java | 81 +++++ .../impactEffects/fire/SelfDefensiveFire.java | 27 +- .../impactEffects/fire/SelfOffensiveFire.java | 2 +- .../impactEffects/ice/MeleeOffensiveIce.java | 3 - .../ice/ProjectileDefaultIce.java | 3 +- .../ice/ProjectileDefensiveIce.java | 2 +- .../ice/ProjectileOffensiveIce.java | 2 +- .../impactEffects/ice/SelfDefaultIce.java | 6 +- .../wind/ProjectileDefaultWind.java | 33 ++ .../wind/ProjectileEnvironmentalWind.java | 1 + .../wind/ProjectileOffensiveWind.java | 33 ++ .../tileEntity/TESpellEnhancementBlock.java | 55 ++- .../tileEntity/TESpellModifierBlock.java | 13 + .../tileEntity/TESpellParadigmBlock.java | 26 +- .../assets/alchemicalwizardry/lang/en_US.lang | 64 ++-- .../items/baseItemCrackedRunicPlate.png | Bin 0 -> 522 bytes .../textures/items/baseItemDefaultCore.png | Bin 0 -> 327 bytes .../textures/items/baseItemDefensiveCore.png | Bin 0 -> 502 bytes .../textures/items/baseItemEarthenCore.png | Bin 0 -> 454 bytes .../textures/items/baseItemEmptyCore.png | Bin 0 -> 237 bytes .../items/baseItemEnvironmentalCore.png | Bin 0 -> 370 bytes .../textures/items/baseItemFlameCore.png | Bin 0 -> 488 bytes .../textures/items/baseItemGustCore.png | Bin 0 -> 488 bytes .../textures/items/baseItemIcyCore.png | Bin 0 -> 551 bytes .../textures/items/baseItemInputCable.png | Bin 0 -> 291 bytes .../textures/items/baseItemMagicalesCable.png | Bin 0 -> 284 bytes .../textures/items/baseItemMeleeCore.png | Bin 0 -> 461 bytes .../textures/items/baseItemOffensiveCore.png | Bin 0 -> 353 bytes .../textures/items/baseItemOutputCable.png | Bin 0 -> 290 bytes .../items/baseItemParadigmBackPlate.png | Bin 0 -> 306 bytes .../textures/items/baseItemProjectileCore.png | Bin 0 -> 478 bytes .../textures/items/baseItemQuartzRod.png | Bin 0 -> 251 bytes .../textures/items/baseItemRunicPlate.png | Bin 0 -> 420 bytes .../items/baseItemScribedRunicPlate.png | Bin 0 -> 481 bytes .../textures/items/baseItemSelfCore.png | Bin 0 -> 433 bytes .../textures/items/baseItemStoneBrace.png | Bin 0 -> 308 bytes .../textures/items/baseItemWoodBrace.png | Bin 0 -> 316 bytes .../textures/models/ParadigmBlock.png | Bin 0 -> 923 bytes .../textures/models/SpellEnhancementCost1.png | Bin 0 -> 4871 bytes .../textures/models/SpellEnhancementCost2.png | Bin 0 -> 3603 bytes .../textures/models/SpellEnhancementCost3.png | Bin 0 -> 4025 bytes .../models/SpellEnhancementPotency1.png | Bin 0 -> 4329 bytes .../models/SpellEnhancementPotency2.png | Bin 0 -> 3539 bytes .../models/SpellEnhancementPotency3.png | Bin 0 -> 3951 bytes .../models/SpellEnhancementPower1.png | Bin 0 -> 4449 bytes .../models/SpellEnhancementPower2.png | Bin 0 -> 3738 bytes .../models/SpellEnhancementPower3.png | Bin 0 -> 4068 bytes .../textures/models/SpellModifierDefault.png | Bin 0 -> 1193 bytes .../models/SpellModifierDefensive.png | Bin 0 -> 1608 bytes .../models/SpellModifierEnvironmental.png | Bin 0 -> 1398 bytes .../models/SpellModifierOffensive.png | Bin 0 -> 1350 bytes .../textures/models/SpellParadigmMelee.png | Bin 0 -> 1230 bytes .../models/SpellParadigmProjectile.png | Bin 0 -> 1229 bytes .../textures/models/SpellParadigmSelf.png | Bin 0 -> 1193 bytes 170 files changed, 4803 insertions(+), 272 deletions(-) create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/IHolding.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeEnvironmentalEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeOffensiveEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefaultEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java create mode 100644 1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemCrackedRunicPlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemEmptyCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemEnvironmentalCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemFlameCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemGustCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemIcyCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemInputCable.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemOutputCable.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefault.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierEnvironmental.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierOffensive.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png create mode 100644 1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmSelf.png delete mode 100644 1.7.2/resources/assets/forge/lang/ru_RU.lang create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/PotionFireFuse.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/PotionHeavyHeart.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/PotionPlanarBinding.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeEnvironmentalEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeOffensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileOffensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefaultEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefensiveFire.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileEnvironmentalFire.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileOffensiveFire.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java create mode 100644 BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java rename 1.7.2/resources/assets/alchemicalwizardry/lang/ru_RU.lang => resources/assets/alchemicalwizardry/lang/en_US.lang (71%) create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemCrackedRunicPlate.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemEmptyCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemEnvironmentalCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemFlameCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemGustCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemIcyCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemInputCable.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemOutputCable.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost1.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost3.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency2.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency3.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellModifierDefault.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellModifierEnvironmental.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellModifierOffensive.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png create mode 100644 resources/assets/alchemicalwizardry/textures/models/SpellParadigmSelf.png diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 62f88d07..ebcfbe95 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -56,6 +56,7 @@ import WayofTime.alchemicalWizardry.common.potion.PotionFlight; import WayofTime.alchemicalWizardry.common.potion.PotionHeavyHeart; import WayofTime.alchemicalWizardry.common.potion.PotionIceCloak; import WayofTime.alchemicalWizardry.common.potion.PotionInhibit; +import WayofTime.alchemicalWizardry.common.potion.PotionPlanarBinding; import WayofTime.alchemicalWizardry.common.potion.PotionProjectileProtect; import WayofTime.alchemicalWizardry.common.potion.PotionReciprocation; import WayofTime.alchemicalWizardry.common.rituals.Rituals; @@ -99,7 +100,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; -@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.8.0") +@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v1.0.0Beta") //@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {"BloodAltar", "particle", "SetLifeEssence", "GetLifeEssence", "Ritual", "GetAltarEssence", "TESocket", "TEWritingTable", "CustomParticle", "SetPlayerVel", "SetPlayerPos", "TEPedestal", "TEPlinth", "TETeleposer", "InfiniteLPPath", "TEOrientor"}, packetHandler = PacketHandler.class) public class AlchemicalWizardry @@ -113,6 +114,8 @@ public class AlchemicalWizardry public static int ironBlockMeteorRadius; public static String[] netherStarMeteorArray; public static int netherStarMeteorRadius; + + public static String[] allowedCrushedOresArray; public static Potion customPotionDrowning; public static Potion customPotionBoost; @@ -124,6 +127,7 @@ public class AlchemicalWizardry public static Potion customPotionIceCloak; public static Potion customPotionHeavyHeart; public static Potion customPotionFireFuse; + public static Potion customPotionPlanarBinding; public static int customPotionDrowningID; public static int customPotionBoostID; @@ -135,6 +139,7 @@ public class AlchemicalWizardry public static int customPotionIceCloakID; public static int customPotionHeavyHeartID; public static int customPotionFireFuseID; + public static int customPotionPlanarBindingID; public static boolean isThaumcraftLoaded; public static boolean isForestryLoaded; @@ -259,7 +264,7 @@ public class AlchemicalWizardry ItemStack lavaBucketStack = new ItemStack(Items.lava_bucket); ItemStack cobblestoneStack = new ItemStack(Blocks.cobblestone); ItemStack glassStack = new ItemStack(Blocks.glass, 1, craftingConstant); - ItemStack ironStack = new ItemStack(Items.iron_ingot); + ItemStack ironIngotStack = new ItemStack(Items.iron_ingot); ItemStack diamondStack = new ItemStack(Items.diamond, 1, craftingConstant); ItemStack woolStack = new ItemStack(Blocks.wool); ItemStack goldNuggetStack = new ItemStack(Items.gold_nugget); @@ -362,18 +367,18 @@ public class AlchemicalWizardry ItemStack magicalesStack = new ItemStack(ModItems.magicales); //All crafting goes here // GameRegistry.addRecipe(orbOfTestingStack, "x x", " ", "x x", 'x', cobblestoneStack); - //GameRegistry.addRecipe(glassShardStack, " x", "y ", 'x', ironStack, 'y', glassStack); + //GameRegistry.addRecipe(glassShardStack, " x", "y ", 'x', ironIngotStack, 'y', glassStack); //GameRegistry.addRecipe(weakBloodOrbStackCrafted, "xxx", "xdx", "www", 'x', bloodiedShardStack, 'd', diamondStack, 'w', woolStack); - GameRegistry.addRecipe(sacrificialDaggerStack, "ggg", " dg", "i g", 'g', glassStack, 'd', goldIngotStack, 'i', ironStack); - //GameRegistry.addRecipe(blankSlateStack, "sgs", "gig", "sgs", 's', stoneStack, 'g', goldNuggetStack, 'i', ironStack); - //GameRegistry.addRecipe(reinforcedSlateStack, "rir", "ibi", "gig", 'r', redstoneStack, 'i', ironStack, 'b', blankSlateStack, 'g', glowstoneBlockStack); + GameRegistry.addRecipe(sacrificialDaggerStack, "ggg", " dg", "i g", 'g', glassStack, 'd', goldIngotStack, 'i', ironIngotStack); + //GameRegistry.addRecipe(blankSlateStack, "sgs", "gig", "sgs", 's', stoneStack, 'g', goldNuggetStack, 'i', ironIngotStack); + //GameRegistry.addRecipe(reinforcedSlateStack, "rir", "ibi", "gig", 'r', redstoneStack, 'i', ironIngotStack, 'b', blankSlateStack, 'g', glowstoneBlockStack); GameRegistry.addRecipe(lavaCrystalStackCrafted, "glg", "lbl", "odo", 'g', glassStack, 'l', lavaBucketStack, 'b', weakBloodOrbStack, 'd', diamondStack, 'o', obsidianStack); GameRegistry.addRecipe(waterSigilStackCrafted, "www", "wbw", "wow", 'w', waterBucketStack, 'b', blankSlateStack, 'o', weakBloodOrbStack); GameRegistry.addRecipe(lavaSigilStackCrafted, "lml", "lbl", "lcl", 'l', lavaBucketStack, 'b', blankSlateStack, 'm', magmaCreamStack, 'c', lavaCrystalStack); GameRegistry.addRecipe(voidSigilStackCrafted, "ese", "ere", "eoe", 'e', emptyBucketStack, 'r', reinforcedSlateStack, 'o', apprenticeBloodOrbStack, 's', stringStack); GameRegistry.addRecipe(bloodAltarStack, "s s", "scs", "gdg", 's', stoneStack, 'c', furnaceStack, 'd', diamondStack, 'g', goldIngotStack); //GameRegistry.addRecipe(energySwordStack, " o ", " o ", " s ", 'o', weakBloodOrbStack, 's', diamondSwordStack); - //GameRegistry.addRecipe(energyBlasterStack, "oi ", "gdi", " rd", 'o', weakBloodOrbStack, 'i', ironStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); + //GameRegistry.addRecipe(energyBlasterStack, "oi ", "gdi", " rd", 'o', weakBloodOrbStack, 'i', ironIngotStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); GameRegistry.addRecipe(bloodRuneCraftedStack, "sss", "ror", "sss", 's', stoneStack, 'o', weakBloodOrbStack, 'r', blankSlateStack); GameRegistry.addRecipe(speedRuneStack, "sbs", "uru", "sbs", 'u', sugarStack, 's', stoneStack, 'r', bloodRuneStack, 'b', blankSlateStack); //GameRegistry.addRecipe(efficiencyRuneStack, "sbs", "rur", "sbs", 'r', redstoneStack, 's', stoneStack, 'u', bloodRuneStack,'b',blankSlateStack); @@ -431,6 +436,7 @@ public class AlchemicalWizardry customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); customPotionHeavyHeart = (new PotionHeavyHeart(customPotionHeavyHeartID,true,0).setIconIndex(0, 0).setPotionName("Heavy Heart")); customPotionFireFuse = (new PotionFireFuse(customPotionFireFuseID,true,0).setIconIndex(0, 0).setPotionName("Fire Fuse")); + customPotionPlanarBinding = (new PotionPlanarBinding(customPotionPlanarBindingID,true,0).setIconIndex(0,0).setPotionName("Planar Binding")); //FluidStack lifeEssenceFluidStack = new FluidStack(lifeEssenceFluid, 1); @@ -583,9 +589,55 @@ public class AlchemicalWizardry MeteorRegistry.registerMeteorParadigm(stoneStack, this.stoneMeteorArray, this.stoneMeteorRadius); MeteorRegistry.registerMeteorParadigm(ironBlockStack, this.ironBlockMeteorArray, this.ironBlockMeteorRadius); MeteorRegistry.registerMeteorParadigm(new ItemStack(Items.nether_star), this.netherStarMeteorArray, this.netherStarMeteorRadius); -// sanguineHelmet = new ItemSanguineArmour(sanguineHelmetItemID).setUnlocalizedName("sanguineHelmet"); -// -// LanguageRegistry.addName(sanguineHelmet,"Sanguine Helmet"); + + //Register spell component recipes + ItemStack quartzRodStack = new ItemStack(ModItems.baseItems,1,0); + ItemStack emptyCoreStack = new ItemStack(ModItems.baseItems,1,1); + ItemStack magicalesCableStack = new ItemStack(ModItems.baseItems,1,2); + ItemStack woodBraceStack = new ItemStack(ModItems.baseItems,1,3); + ItemStack stoneBraceStack = new ItemStack(ModItems.baseItems,1,4); + ItemStack projectileCoreStack = new ItemStack(ModItems.baseItems,1,5); + ItemStack selfCoreStack = new ItemStack(ModItems.baseItems,1,6); + ItemStack meleeCoreStack = new ItemStack(ModItems.baseItems,1,7); + ItemStack paradigmBackPlateStack = new ItemStack(ModItems.baseItems,1,8); + ItemStack outputCableStack = new ItemStack(ModItems.baseItems,1,9); + ItemStack flameCoreStack = new ItemStack(ModItems.baseItems,1,10); + ItemStack iceCoreStack = new ItemStack(ModItems.baseItems,1,11); + ItemStack windCoreStack = new ItemStack(ModItems.baseItems,1,12); + ItemStack earthCoreStack = new ItemStack(ModItems.baseItems,1,13); + ItemStack inputCableStack = new ItemStack(ModItems.baseItems,1,14); + + ItemStack magicalesCraftedCableStack = new ItemStack(ModItems.baseItems,5,2); + + GameRegistry.addRecipe(quartzRodStack, "qqq", 'q', new ItemStack(Items.quartz)); + GameRegistry.addRecipe(emptyCoreStack,"gig","nrn","gig",'n',goldIngotStack,'i',ironIngotStack,'g',glassStack,'r',simpleCatalystStack); + GameRegistry.addRecipe(magicalesCraftedCableStack,"sss","mmm","sss",'s',new ItemStack(Items.string),'m',magicalesStack); + GameRegistry.addRecipe(woodBraceStack," il","ili","li ",'l', new ItemStack(Blocks.log,1,craftingConstant),'i',new ItemStack(Items.string)); + GameRegistry.addRecipe(stoneBraceStack," is","isi","si ",'i', ironIngotStack,'s',reinforcedSlateStack); + + GameRegistry.addRecipe(projectileCoreStack, "mbm","aca","mom",'c', emptyCoreStack,'b',weakBloodShardStack,'m', magicalesStack,'o', magicianBloodOrbStack,'a',new ItemStack(Items.arrow)); + GameRegistry.addRecipe(selfCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',sanctusStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',glowstoneDustStack); + GameRegistry.addRecipe(meleeCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',incendiumStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',new ItemStack(Items.flint_and_steel)); + GameRegistry.addRecipe(paradigmBackPlateStack,"isi","rgr","isi",'i',ironIngotStack,'r',stoneStack,'g',goldIngotStack,'s',reinforcedSlateStack); + GameRegistry.addRecipe(outputCableStack, " si","s c"," si",'s',stoneStack,'i',ironIngotStack,'c',simpleCatalystStack); + + GameRegistry.addRecipe(flameCoreStack,"mdm","scs","mom",'m',incendiumStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(iceCoreStack,"mdm","scs","mom",'m',crystallosStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(windCoreStack,"mdm","scs","mom",'m',aetherStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(earthCoreStack,"mdm","scs","mom",'m',terraeStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + + GameRegistry.addRecipe(inputCableStack, "ws ","rcs","ws ",'w',blankSlateStack,'s',stoneStack,'r',imbuedSlateStack,'c',simpleCatalystStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockConduit,1,0),"q q","ccc","q q",'q', quartzRodStack,'c', magicalesCableStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,0),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', projectileCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,1),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', selfCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,2),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', meleeCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,0),"bgb","ico","bgb",'c',flameCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,1),"bgb","ico","bgb",'c',iceCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,2),"bgb","ico","bgb",'c',windCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,3),"bgb","ico","bgb",'c',earthCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); } @EventHandler diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 88184381..e2b55612 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -48,6 +48,7 @@ public class BloodMagicConfiguration AlchemicalWizardry.customPotionIceCloakID = config.get("Potion ID","IceCloak",107).getInt(); AlchemicalWizardry.customPotionHeavyHeartID = config.get("Potion ID","HeavyHeart",108).getInt(); AlchemicalWizardry.customPotionFireFuseID = config.get("Potion ID","FireFuse",109).getInt(); + AlchemicalWizardry.customPotionPlanarBindingID = config.get("Potion ID","PlanarBinding",110).getInt(); MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); @@ -60,6 +61,7 @@ public class BloodMagicConfiguration AlchemicalWizardry.netherStarMeteorArray = config.get("meteor", "netherStarMeteor", new String[]{"oreDiamond", "150", "oreEmerald", "100", "oreQuartz", "250", "oreSunstone", "5", "oreMoonstone", "50", "oreIridium", "5", "oreCertusQuartz", "150"}).getStringList(); AlchemicalWizardry.netherStarMeteorRadius = config.get("meteor", "netherStarMeteorRadius", 3).getInt(); + AlchemicalWizardry.allowedCrushedOresArray = config.get("oreCrushing", "allowedOres", new String[]{"iron","gold","copper","tin","lead","silver","osmium"}).getStringList(); // AlchemicalWizardry.testingBlockBlockID = config.getBlock("TestingBlock", 1400).getInt(); // AlchemicalWizardry.lifeEssenceFlowingBlockID = config.getBlock("LifeEssenceFlowing", 1401).getInt(); // AlchemicalWizardry.lifeEssenceStillBlockID = config.getBlock("LifeEssenceStill", 1402).getInt(); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java index ba96f5d8..82ae2cff 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/ModItems.java @@ -27,6 +27,7 @@ import WayofTime.alchemicalWizardry.common.items.EnergyBlast; import WayofTime.alchemicalWizardry.common.items.EnergySword; import WayofTime.alchemicalWizardry.common.items.EnhancedTelepositionFocus; import WayofTime.alchemicalWizardry.common.items.FireScribeTool; +import WayofTime.alchemicalWizardry.common.items.ItemAlchemyBase; import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; import WayofTime.alchemicalWizardry.common.items.ItemComponents; import WayofTime.alchemicalWizardry.common.items.ItemDiabloKey; @@ -55,6 +56,7 @@ import WayofTime.alchemicalWizardry.common.items.potion.WeakFillingAgent; import WayofTime.alchemicalWizardry.common.items.sigil.AirSigil; import WayofTime.alchemicalWizardry.common.items.sigil.DivinationSigil; import WayofTime.alchemicalWizardry.common.items.sigil.ItemBloodLightSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSigilOfEnderSeverance; import WayofTime.alchemicalWizardry.common.items.sigil.LavaSigil; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfElementalAffinity; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfGrowth; @@ -145,6 +147,7 @@ public class ModItems public static Item demonPlacer; public static Item baseItems; + public static Item baseAlchemyItems; public static Item weakFillingAgent; public static Item standardFillingAgent; @@ -161,6 +164,8 @@ public class ModItems public static Item itemComplexSpellCrystal; public static Item itemBloodFrame; + public static Item itemSigilOfEnderSeverance; + public static Item bucketLife; public static void init() @@ -243,7 +248,9 @@ public class ModItems itemBloodLightSigil = new ItemBloodLightSigil().setUnlocalizedName("bloodLightSigil"); itemComplexSpellCrystal = new ItemComplexSpellCrystal().setUnlocalizedName("itemComplexSpellCrystal"); bucketLife = (new LifeBucket(ModBlocks.blockLifeEssence)).setUnlocalizedName("bucketLife").setContainerItem(Items.bucket).setCreativeTab(CreativeTabs.tabMisc); + itemSigilOfEnderSeverance = (new ItemSigilOfEnderSeverance()).setUnlocalizedName("itemSigilOfEnderSeverance"); baseItems = new ItemComponents().setUnlocalizedName("baseItems"); + baseAlchemyItems = new ItemAlchemyBase().setUnlocalizedName("baseAlchemyItems"); } public static void registerItems() @@ -330,9 +337,12 @@ public class ModItems GameRegistry.registerItem(ModItems.energyBazooka, "energyBazooka"); GameRegistry.registerItem(ModItems.itemBloodLightSigil, "itemBloodLightSigil"); GameRegistry.registerItem(ModItems.itemComplexSpellCrystal, "itemComplexSpellCrystal"); + GameRegistry.registerItem(ModItems.itemSigilOfEnderSeverance, "sigilOfEnderSeverance"); + GameRegistry.registerItem(ModItems.bucketLife, "bucketLife"); GameRegistry.registerItem(ModItems.baseItems, "bloodMagicBaseItems"); + GameRegistry.registerItem(ModItems.baseAlchemyItems, "bloodMagicBaseAlchemyItems"); //GameRegistry.registerItem(ModItems.itemBloodFrame, "itemBloodFrame"); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java index 48986b0f..c60e734d 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -27,12 +27,16 @@ import WayofTime.alchemicalWizardry.common.renderer.block.RenderPedestal; import WayofTime.alchemicalWizardry.common.renderer.block.RenderPlinth; import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEffectBlock; import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellParadigmBlock; import WayofTime.alchemicalWizardry.common.renderer.block.RenderWritingTable; import WayofTime.alchemicalWizardry.common.renderer.block.TEAltarRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEAltarItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEConduitItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEffectBlockItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEnhancementBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellModifierBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellParadigmBlockItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBileDemon; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBoulderFist; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderElemental; @@ -61,6 +65,8 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; @@ -114,12 +120,16 @@ public class ClientProxy extends CommonProxy ClientRegistry.bindTileEntitySpecialRenderer(TEConduit.class, new RenderConduit()); ClientRegistry.bindTileEntitySpecialRenderer(TESpellEffectBlock.class, new RenderSpellEffectBlock()); ClientRegistry.bindTileEntitySpecialRenderer(TESpellEnhancementBlock.class, new RenderSpellEnhancementBlock()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellParadigmBlock.class, new RenderSpellParadigmBlock()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellModifierBlock.class, new RenderSpellModifierBlock()); //Item Renderer stuff MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockConduit), new TEConduitItemRenderer()); MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellEffect), new TESpellEffectBlockItemRenderer()); MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellEnhancement), new TESpellEnhancementBlockItemRenderer()); - + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellParadigm), new TESpellParadigmBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockSpellModifier), new TESpellModifierBlockItemRenderer()); + //RenderingRegistry.registerEntityRenderingHandler(FireProjectile.class, new RenderFireProjectile()); //RenderingRegistry.registerBlockHandler(new AltarRenderer()); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index 040af219..281792d0 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -16,6 +16,7 @@ import net.minecraft.potion.Potion; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.Vec3; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; @@ -49,6 +50,15 @@ public class AlchemicalWizardryEventHooks event.entityLiving.motionY = 0; } } + + @SubscribeEvent + public void onEndermanTeleportEvent(EnderTeleportEvent event) + { + if(event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionPlanarBinding) && event.isCancelable()) + { + event.setCanceled(true); + } + } @SubscribeEvent public void onEntityDamaged(LivingAttackEvent event) @@ -149,18 +159,15 @@ public class AlchemicalWizardryEventHooks EntityLivingBase entity = event.entityLiving; //if(!entity.isSneaking()) { - double percentIncrease = (i + 1) * 0.03d; + float percentIncrease = (i + 1) * 0.05f; if (event.entityLiving instanceof EntityPlayer) { EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; entityPlayer.stepHeight = 1.0f; - if (!entityPlayer.worldObj.isRemote) - { - float speed = ((Float) ReflectionHelper.getPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, new String[]{"walkSpeed", "g", "field_75097_g"})).floatValue(); - ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(speed + (float) percentIncrease), new String[]{"walkSpeed", "g", "field_75097_g"}); //CAUTION - } + if((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) + entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease/2.0f) : percentIncrease); } } } @@ -312,7 +319,7 @@ public class AlchemicalWizardryEventHooks int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionHeavyHeart).getAmplifier(); double decrease = 0.025*(i+1); - if(entityLiving.motionY>-0.5) + if(entityLiving.motionY>-0.9) { entityLiving.motionY-=decrease; } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java index 2808aa54..45d8d91c 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/altarRecipeRegistry/AltarRecipeRegistry.java @@ -42,7 +42,7 @@ public class AltarRecipeRegistry registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Items.ender_pearl),4,2000,10,10,false); registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); - registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); + registerAltarRecipe(new ItemStack(ModItems.demonicSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); registerAltarRecipe(new ItemStack(ModItems.duskScribeTool), new ItemStack(Blocks.coal_block),4,2000,20,10,false); registerAltarRecipe(new ItemStack(ModBlocks.bloodSocket), new ItemStack(ModBlocks.emptySocket),3,30000,40,10,false); registerAltarRecipe(new ItemStack(ModItems.earthScribeTool), new ItemStack(Blocks.obsidian),3,1000,5,5,false); diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java index 4af2d1f6..10da3ed7 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -249,4 +249,6 @@ public class BlockOrientable extends BlockContainer { return metadata; } + + } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java index 5eb514c0..ae4e028f 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java @@ -42,4 +42,22 @@ public class BlockSpellModifier extends BlockOrientable super.getSubBlocks(par1, par2CreativeTabs, par3List); } } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java index 4f9b9bd6..0f31468c 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -91,23 +91,23 @@ public class BlockSpellParadigm extends BlockOrientable return super.onBlockActivated(world, x, y, z, player, side, what, these, are); } -// @Override -// public boolean isOpaqueCube() -// { -// return false; -// } -// -// @Override -// public boolean renderAsNormalBlock() -// { -// return false; -// } + @Override + public boolean isOpaqueCube() + { + return false; + } -// @Override -// public int getRenderType() -// { -// return -1; -// } + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } //TODO Need to make a renderer for the paradigm blocks and other spell blocks. /* diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java index 8f426c85..cafe19bf 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java @@ -289,7 +289,7 @@ public class EnergyItems extends Item implements IBindable } } - public String getOwnerName(ItemStack item) + public static String getOwnerName(ItemStack item) { if (item.stackTagCompound == null) { diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/IHolding.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/IHolding.java new file mode 100644 index 00000000..29de5115 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/IHolding.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.common.items; + +public interface IHolding +{ + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java new file mode 100644 index 00000000..f7bcfabb --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemAlchemyBase extends Item +{ + private static final String[] ITEM_NAMES = new String[]{}; + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public ItemAlchemyBase() + { + super(); + this.maxStackSize = 64; + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + icons = new IIcon[ITEM_NAMES.length]; + + for (int i = 0; i < ITEM_NAMES.length; ++i) + { + icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "baseAlchemyItem" + ITEM_NAMES[i]); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + //This is what will do all the localisation things on the alchemy components so you dont have to set it :D + int meta = MathHelper.clamp_int(itemStack.getItemDamage(), 0, ITEM_NAMES.length - 1); + return ("" + "item.bloodMagicAlchemyItem." + ITEM_NAMES[meta]); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) + { + int j = MathHelper.clamp_int(meta, 0, ITEM_NAMES.length - 1); + return icons[j]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item id, CreativeTabs creativeTab, List list) + { + for (int meta = 0; meta < ITEM_NAMES.length; ++meta) + { + list.add(new ItemStack(id, 1, meta)); + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java index 51b1e7d2..ff839d08 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java @@ -21,7 +21,7 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemComponents extends Item { - private static final String[] ITEM_NAMES = new String[]{"QuartzRod"}; + private static final String[] ITEM_NAMES = new String[]{"QuartzRod", "EmptyCore", "MagicalesCable", "WoodBrace", "StoneBrace", "ProjectileCore", "SelfCore","MeleeCore","ParadigmBackPlate","OutputCable","FlameCore","IcyCore","GustCore","EarthenCore","InputCable","CrackedRunicPlate","RunicPlate","ScribedRunicPlate","DefaultCore","OffensiveCore","DefensiveCore","EnvironmentalCore"}; @SideOnly(Side.CLIENT) private IIcon[] icons; @@ -29,7 +29,7 @@ public class ItemComponents extends Item public ItemComponents() { super(); - this.maxStackSize = 1; + this.maxStackSize = 64; this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); this.hasSubtypes = true; } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java index 56fba9c8..2e625415 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java @@ -42,7 +42,6 @@ public class AlchemyFlask extends Item this.setMaxDamage(8); this.setMaxStackSize(1); setCreativeTab(AlchemicalWizardry.tabBloodMagic); - setNoRepair(); // TODO Auto-generated constructor stub } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java new file mode 100644 index 00000000..b2751264 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java @@ -0,0 +1,171 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.items.IHolding; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemSigilOfEnderSeverance extends EnergyItems implements IHolding +{ + @SideOnly(Side.CLIENT) + private static IIcon activeIcon; + @SideOnly(Side.CLIENT) + private static IIcon passiveIcon; + + public ItemSigilOfEnderSeverance() + { + super(); + this.maxStackSize = 1; + setEnergyUsed(200); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Put those endermen in a Dire situation!"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + par3List.add("Activated"); + } else + { + par3List.add("Deactivated"); + } + + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfTheFastMiner"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:ElementalSigil_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:ElementalSigil_deactivated"); + } + + @Override + public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) + { + if (stack.stackTagCompound == null) + { + stack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = stack.stackTagCompound; + + if (tag.getBoolean("isActive")) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int par1) + { + if (par1 == 1) + { + return this.activeIcon; + } else + { + return this.passiveIcon; + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer); + + if (par3EntityPlayer.isSneaking()) + { + return par1ItemStack; + } + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = par1ItemStack.stackTagCompound; + tag.setBoolean("isActive", !(tag.getBoolean("isActive"))); + + if (tag.getBoolean("isActive")) + { + par1ItemStack.setItemDamage(1); + tag.setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); + + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } else + { + par1ItemStack.setItemDamage(par1ItemStack.getMaxDamage()); + } + + return par1ItemStack; + } + + @Override + public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) + { + if (!(par3Entity instanceof EntityPlayer)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + List list = SpellHelper.getEntitiesInRange(par2World, par3Entity.posX, par3Entity.posY, par3Entity.posZ, 4.5, 4.5); + for(Entity entity : list) + { + if(!entity.equals(par3Entity)&&entity instanceof EntityLiving) + { + ((EntityLiving)entity).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionPlanarBinding.id,2,0)); + } + } + } + + if (par2World.getWorldTime() % 200 == par1ItemStack.stackTagCompound.getInteger("worldTimeDelay") && par1ItemStack.stackTagCompound.getBoolean("isActive")) + { + //par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 2400,99)); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed()); + } + } + + return; + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java index 3b1bd3cf..daa017a1 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java @@ -27,7 +27,6 @@ public class SigilOfElementalAffinity extends EnergyItems { super(); this.maxStackSize = 1; - setMaxDamage(100); setEnergyUsed(200); setCreativeTab(AlchemicalWizardry.tabBloodMagic); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java index 9cc9dcd3..db18ae01 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java @@ -16,6 +16,7 @@ import net.minecraftforge.common.util.Constants; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.items.IHolding; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -304,6 +305,13 @@ public class SigilOfHolding extends EnergyItems return false; } + if(addedItemStack.getItem() instanceof IHolding) + { + inv[candidateSlot] = addedItemStack; + saveInternalInventory(sigilItemStack, inv); + return true; + } + for (ItemStack i : allowedSigils) { if (i != null && i.getItem() == item) diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java new file mode 100644 index 00000000..54d6cd72 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +import net.minecraft.potion.Potion; + +public class PotionPlanarBinding extends Potion +{ + public PotionPlanarBinding(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java new file mode 100644 index 00000000..a01c0726 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellModifierBlock extends TileEntitySpecialRenderer +{ + private ModelSpellModifierBlock modelSpellModifierBlock = new ModelSpellModifierBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellModifierBlock) + { + TESpellModifierBlock tileSpellBlock = (TESpellModifierBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellModifier.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellModifierBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java new file mode 100644 index 00000000..47a5b271 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellParadigmBlock extends TileEntitySpecialRenderer +{ + private ModelSpellParadigmBlock modelSpellParadigmBlock = new ModelSpellParadigmBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileSpellBlock = (TESpellParadigmBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellParadigm.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellParadigmBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java new file mode 100644 index 00000000..c7809540 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java @@ -0,0 +1,108 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellModifierBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellModifierBlockItemRenderer implements IItemRenderer +{ + private ModelSpellModifierBlock modelSpellBlock = new ModelSpellModifierBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellModifierDefault.png"; + case 1: return "alchemicalwizardry:textures/models/SpellModifierOffensive.png"; + case 2: return "alchemicalwizardry:textures/models/SpellModifierDefensive.png"; + case 3: return "alchemicalwizardry:textures/models/SpellModifierEnvironmental.png"; + } + return "alchemicalwizardry:textures/models/SpellModifierDefault.png"; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java new file mode 100644 index 00000000..7b706c26 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.util.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellParadigmBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellParadigmBlockItemRenderer implements IItemRenderer +{ + private ModelSpellParadigmBlock modelSpellBlock = new ModelSpellParadigmBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + case 1: return "alchemicalwizardry:textures/models/SpellParadigmSelf.png"; + case 2: return "alchemicalwizardry:textures/models/SpellParadigmMelee.png"; + } + return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java new file mode 100644 index 00000000..3ceed7e9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java @@ -0,0 +1,303 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.util.ForgeDirection; + +public class ModelSpellModifierBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer inputMain; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + ModelRenderer Shape6; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + ModelRenderer outputMain; + ModelRenderer Shape11; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + + public ModelSpellModifierBlock() + { + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + inputMain = new ModelRenderer(this, 25, 18); + inputMain.addBox(-2F, -2F, -8F, 4, 4, 1); + inputMain.setRotationPoint(0F, 16F, 0F); + inputMain.setTextureSize(64, 64); + inputMain.mirror = true; + setRotation(inputMain, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 0, 13); + Shape2.addBox(-5F, -5F, -8F, 10, 2, 2); + Shape2.setRotationPoint(0F, 16F, 0F); + Shape2.setTextureSize(64, 64); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 27); + Shape3.addBox(-5F, 3F, -8F, 10, 2, 2); + Shape3.setRotationPoint(0F, 16F, 0F); + Shape3.setTextureSize(64, 64); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 16, 18); + Shape4.addBox(3F, -3F, -8F, 2, 6, 2); + Shape4.setRotationPoint(0F, 16F, 0F); + Shape4.setTextureSize(64, 64); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + Shape5 = new ModelRenderer(this, 0, 18); + Shape5.addBox(-5F, -3F, -8F, 2, 6, 2); + Shape5.setRotationPoint(0F, 16F, 0F); + Shape5.setTextureSize(64, 64); + Shape5.mirror = true; + setRotation(Shape5, 0F, 0F, 0F); + Shape6 = new ModelRenderer(this, 0, 32); + Shape6.addBox(-1F, -6F, -7F, 2, 1, 5); + Shape6.setRotationPoint(0F, 16F, 0F); + Shape6.setTextureSize(64, 64); + Shape6.mirror = true; + setRotation(Shape6, 0F, 0F, 0F); + Shape7 = new ModelRenderer(this, 15, 32); + Shape7.addBox(-2F, -6F, -2F, 4, 1, 4); + Shape7.setRotationPoint(0F, 16F, 0F); + Shape7.setTextureSize(64, 64); + Shape7.mirror = true; + setRotation(Shape7, 0F, 0F, 0F); + Shape8 = new ModelRenderer(this, 15, 39); + Shape8.addBox(-2F, 5F, -2F, 4, 1, 4); + Shape8.setRotationPoint(0F, 16F, 0F); + Shape8.setTextureSize(64, 64); + Shape8.mirror = true; + setRotation(Shape8, 0F, 0F, 0F); + Shape9 = new ModelRenderer(this, 0, 39); + Shape9.addBox(-1F, 5F, -7F, 2, 1, 5); + Shape9.setRotationPoint(0F, 16F, 0F); + Shape9.setTextureSize(64, 64); + Shape9.mirror = true; + setRotation(Shape9, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 51, 23); + outputMain.addBox(7F, -2F, -2F, 1, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(64, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + Shape11 = new ModelRenderer(this, 13, 46); + Shape11.addBox(5F, -2F, -2F, 1, 4, 4); + Shape11.setRotationPoint(0F, 16F, 0F); + Shape11.setTextureSize(64, 64); + Shape11.mirror = true; + setRotation(Shape11, 0F, 0F, 0F); + Shape12 = new ModelRenderer(this, 0, 46); + Shape12.addBox(5F, -1F, -7F, 1, 2, 5); + Shape12.setRotationPoint(0F, 16F, 0F); + Shape12.setTextureSize(64, 64); + Shape12.mirror = true; + setRotation(Shape12, 0F, 0F, 0F); + Shape13 = new ModelRenderer(this, 0, 56); + Shape13.addBox(-6F, -1F, -7F, 1, 2, 5); + Shape13.setRotationPoint(0F, 16F, 0F); + Shape13.setTextureSize(64, 64); + Shape13.mirror = true; + setRotation(Shape13, 0F, 0F, 0F); + Shape14 = new ModelRenderer(this, 13, 56); + Shape14.addBox(-6F, -2F, -2F, 1, 4, 4); + Shape14.setRotationPoint(0F, 16F, 0F); + Shape14.setTextureSize(64, 64); + Shape14.mirror = true; + setRotation(Shape14, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 51, 18); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(64, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 51, 18); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(64, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 51, 18); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(64, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 51, 18); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(64, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputMain, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape2, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape3, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape4, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape5, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape6, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape7, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape8, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape9, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape12, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape11, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape13, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape14, xInputRot, yInputRot, zInputRot); + + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + + + core.render(f5); + inputMain.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + Shape5.render(f5); + Shape6.render(f5); + Shape7.render(f5); + Shape8.render(f5); + Shape9.render(f5); + outputMain.render(f5); + Shape11.render(f5); + Shape12.render(f5); + Shape13.render(f5); + Shape14.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} + diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java new file mode 100644 index 00000000..da48b87d --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java @@ -0,0 +1,234 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +//Date: 07/03/2014 9:30:25 PM +//Template version 1.1 +//Java generated by Techne +//Keep in mind that you still need to fill in some blanks +//- ZeuX + + + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.util.ForgeDirection; + +public class ModelSpellParadigmBlock extends ModelBase +{ +//fields + ModelRenderer core; + ModelRenderer outputMain; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + +public ModelSpellParadigmBlock() +{ + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 0, 13); + outputMain.addBox(6F, -2F, -2F, 2, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(64, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 0, 22); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(64, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 0, 22); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(64, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 0, 22); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(64, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 0, 22); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(64, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + Shape1 = new ModelRenderer(this, 0, 28); + Shape1.addBox(-5F, -5F, -1F, 10, 1, 2); + Shape1.setRotationPoint(0F, 16F, 0F); + Shape1.setTextureSize(64, 64); + Shape1.mirror = true; + setRotation(Shape1, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 25, 28); + Shape2.addBox(-5F, -4F, -4F, 1, 8, 8); + Shape2.setRotationPoint(0F, 16F, 0F); + Shape2.setTextureSize(64, 64); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 33); + Shape3.addBox(-5F, 4F, -1F, 10, 1, 2); + Shape3.setRotationPoint(0F, 16F, 0F); + Shape3.setTextureSize(64, 64); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 0, 38); + Shape4.addBox(-5F, -1F, -5F, 10, 2, 1); + Shape4.setRotationPoint(0F, 16F, 0F); + Shape4.setTextureSize(64, 64); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + Shape5 = new ModelRenderer(this, 0, 43); + Shape5.addBox(-5F, -1F, 4F, 10, 2, 1); + Shape5.setRotationPoint(0F, 16F, 0F); + Shape5.setTextureSize(64, 64); + Shape5.mirror = true; + setRotation(Shape5, 0F, 0F, 0F); +} + +public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) +{ + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape4, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape5, xOutputRot, yOutputRot, zOutputRot); + core.render(f5); + outputMain.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + Shape1.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + Shape5.render(f5); +} + +private void setRotation(ModelRenderer model, float x, float y, float z) +{ + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; +} + +public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) +{ + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); +} + +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java new file mode 100644 index 00000000..38863ff0 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java @@ -0,0 +1,103 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.List; + +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.IBindable; +import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; + +public class RitualEffectSummonPlayer extends RitualEffect //Summons a player via the bound item +{ + @Override + public void performEffect(TEMasterStone 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.getWorldObj(); + int x = ritualStone.xCoord; + int y = ritualStone.yCoord; + int z = ritualStone.zCoord; + + if (ritualStone.getCooldown() > 0) + { + ritualStone.setCooldown(0); + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + List entities = world.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(x, y + 1, z, x + 1, y + 2, z + 1)); + + if (entities == null) + { + return; + } + + for (EntityItem entityItem : entities) + { + if (entityItem != null && entityItem.getEntityItem().getItem() instanceof IBindable) + { + String str = EnergyItems.getOwnerName(entityItem.getEntityItem()); + + EntityPlayer entityPlayer = MinecraftServer.getServer().getConfigurationManager().getPlayerForUsername(str); + if(entityPlayer!=null) + { + entityPlayer.posX = x; + entityPlayer.posY = y+1; + entityPlayer.posZ = z; + + if(entityPlayer instanceof EntityPlayerMP) + { + ((EntityPlayerMP)entityPlayer).mcServer.getConfigurationManager().transferPlayerToDimension(((EntityPlayerMP)entityPlayer), 0); + } + + entityItem.setDead(); + + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + break; + } + } + +// EnergyBlastProjectile proj = new EnergyBlastProjectile(world, x, y+20, z); +// proj.motionX = 0.0d; +// proj.motionZ = 0.0d; +// proj.motionY = -1.0d; +// world.spawnEntityInWorld(proj); + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index c168d34b..030abd06 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -4,10 +4,17 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeDefensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeOffensiveEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefaultEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefensiveEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileEnvironmentalEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileOffensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfDefensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfOffensiveEarth; public class SpellEffectEarth extends SpellEffect { @@ -38,29 +45,25 @@ public class SpellEffectEarth extends SpellEffect @Override public void defaultModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void offensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfOffensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); } @Override public void defensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfDefensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); } @Override public void environmentalModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -72,22 +75,19 @@ public class SpellEffectEarth extends SpellEffect @Override public void offensiveModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeOffensiveEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeDefensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void environmentalModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeEnvironmentalEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override @@ -100,7 +100,7 @@ public class SpellEffectEarth extends SpellEffect protected int getCostForOffenseProjectile() { - return (int)(3*(1.5*this.potencyEnhancement+1)*(Math.pow(1*this.powerEnhancement+1,2))*Math.pow(0.8, costEnhancement)); + return (int)(10*(1.5*this.potencyEnhancement+1)*(Math.pow(1*this.powerEnhancement+1,2))*Math.pow(0.8, costEnhancement)); } @Override @@ -118,22 +118,19 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForDefaultSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(20*Math.pow(1.5*powerEnhancement+1,2)*(2*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow(2*this.powerEnhancement+1,2)*(this.potencyEnhancement+1)); } @Override protected int getCostForDefenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(750*(1.1*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -146,28 +143,24 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForDefaultMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(50*Math.pow(1.5*this.potencyEnhancement + 1,3)*(0.5*this.powerEnhancement + 1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(20*Math.pow(1.5*this.powerEnhancement+1,3)*(0.25*this.powerEnhancement+1)); } @Override protected int getCostForDefenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(5*(1.2*this.powerEnhancement+1)*(1.0f/3.0f*Math.pow(this.potencyEnhancement,2)+2+1.0f/2.0f*this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(500*Math.pow(2*this.potencyEnhancement+1, 3)*(0.25*this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index d10a6494..30cc07dd 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; +import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -16,6 +17,8 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.NewPacketHandler; public class SpellHelper @@ -201,14 +204,17 @@ public class SpellHelper if(block==Blocks.stone) { world.setBlock(posX, posY, posZ, Blocks.cobblestone); + return; } else if(block==Blocks.cobblestone) { world.setBlock(posX, posY, posZ, Blocks.gravel); + return; } else if(block==Blocks.gravel) { world.setBlock(posX, posY, posZ, Blocks.sand); + return; } } @@ -226,4 +232,40 @@ public class SpellHelper world.setBlockToAir(posX, posY, posZ); } } + + public static ItemStack getDustForOre(ItemStack item) + { + String oreName = OreDictionary.getOreName(OreDictionary.getOreID(item)); + + if(oreName.contains("ore")) + { + String lowercaseOre = oreName; + lowercaseOre.toLowerCase(); + boolean isAllowed = false; + + for(String str : AlchemicalWizardry.allowedCrushedOresArray) + { + if(lowercaseOre.contains(str)) + { + isAllowed = true; + } + } + + if(!isAllowed) + { + return null; + } + + String dustName = oreName.replace("ore", "dust"); + + ArrayList items = OreDictionary.getOres(dustName); + + if(items!=null && items.size()>=1) + { + return(items.get(0).copy()); + } + } + + return null; + } } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java index 1ab9f89c..f4ab64e1 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java @@ -11,18 +11,17 @@ public abstract class MeleeSpellCenteredWorldEffect extends MeleeSpellWorldEffec public MeleeSpellCenteredWorldEffect(int power, int potency, int cost) { super(power, potency, cost); - range = 0; } @Override public void onWorldEffect(World world, EntityPlayer entityPlayer) { - Vec3 lookVec = entityPlayer.getLook(range); - int x = (int)(entityPlayer.posX + lookVec.xCoord); - int y = (int)(entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord); - int z = (int)(entityPlayer.posZ + lookVec.zCoord); + Vec3 lookVec = entityPlayer.getLook(range).normalize(); + int x = (int)(entityPlayer.posX + lookVec.xCoord*range); + int y = (int)(entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord*range); + int z = (int)(entityPlayer.posZ + lookVec.zCoord*range); - this.onCenteredWorldEffect(world, x, y, z); + this.onCenteredWorldEffect(entityPlayer, world, x, y, z); } public void setRange(float range) @@ -30,5 +29,5 @@ public abstract class MeleeSpellCenteredWorldEffect extends MeleeSpellWorldEffec this.range = range; } - public abstract void onCenteredWorldEffect(World world, int posX, int posY, int posZ); + public abstract void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ); } diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java index bed566cc..8a9d4313 100644 --- a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.e import net.minecraft.block.Block; import net.minecraft.entity.item.EntityFallingBlock; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellCenteredWorldEffect; @@ -10,17 +11,19 @@ public class MeleeDefaultEarth extends MeleeSpellCenteredWorldEffect public MeleeDefaultEarth(int power, int potency, int cost) { super(power, potency, cost); - this.setRange(2); + this.setRange(3*power + 2); } @Override - public void onCenteredWorldEffect(World world, int posX, int posY, int posZ) + public void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ) { - for(int i=-3; i<=3; i++) + int radius = this.potencyUpgrades; + + for(int i=-radius; i<=radius; i++) { - for(int j=-3; j<=3; j++) + for(int j=-radius; j<=radius; j++) { - for(int k=-3; k<=3; k++) + for(int k=-radius; k<=radius; k++) { if(!world.isAirBlock(posX + i, posY + j, posZ + k) && world.getTileEntity(posX + i, posY + j, posZ + k)==null) { diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java new file mode 100644 index 00000000..2177e6b9 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityFallingBlock; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellCenteredWorldEffect; + +public class MeleeDefensiveEarth extends MeleeSpellCenteredWorldEffect +{ + public MeleeDefensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3*power+2); + } + + @Override + public void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ) + { + ForgeDirection dir = SpellHelper.getDirectionForLookVector(player.getLook(1)); + + int vertRadius = (int)(2 + 1.0f/2.0f*Math.pow(this.potencyUpgrades,2)+1.0f/2.0f*this.potencyUpgrades); + int horizRadius = this.potencyUpgrades+1; + + int xOff = dir.offsetX; + int zOff = dir.offsetZ; + + for(int i=-horizRadius; i<=horizRadius; i++) + { + for(int j=0; j=-vertRange; j--) + { + if(!world.isAirBlock(posX+i, posY+j, posZ+k)&&!SpellHelper.isBlockFluid(world.getBlock(posX+i, posY+j, posZ+k))) + { + BlockTeleposer.swapBlocks(world, world, posX+i, posY, posZ+k, posX+i, posY+j, posZ+k); + + break; + } + } + } + } + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java new file mode 100644 index 00000000..d0053320 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfDefensiveEarth extends SelfSpellEffect +{ + + public SelfDefensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + int pot = 2*this.potencyUpgrades + 1; + int duration = 20*60*(this.powerUpgrades+1); + + player.addPotionEffect(new PotionEffect(Potion.field_76434_w.id,duration, pot)); + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id, duration, pot)); + } +} diff --git a/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java new file mode 100644 index 00000000..a19b3f39 --- /dev/null +++ b/1.7.2/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfEnvironmentalEarth extends SelfSpellEffect +{ + public SelfEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + int horizRadius = this.powerUpgrades + 1; + int vertRadius = this.potencyUpgrades + 2; + + Vec3 blockVec = SpellHelper.getEntityBlockVector(player); + + int posX = (int)(blockVec.xCoord); + int posY = (int)(blockVec.yCoord); + int posZ = (int)(blockVec.zCoord); + + for(int i=-horizRadius; i<=horizRadius; i++) + { + for(int j=0; jigP)WFU8GbZ8()Nlj2>E@cM*00C}EL_t(I%cYasisC>J zhQDq%2ML-46Ez~}mG8ChE^}cDAtn%##;&>ApzEy5?ABFNG=Kl6Hmb`1jQwg^mZg?u zss9XMt>thyP*s&~w_80Pk3ateU>+qHVk6%EXebmD2iCG*Dun3{H{GsQ_klz-g}nIC8~;Z4r2^eRZaH*>bf>h47~Sr zUB@_%0K{>ObB^2X#%wkNU>rxXEPM5!EKA+(b~xv-)*>RraZKO$L{Y?YxkN-Aw6xLhuH?*RycU^+KVLl6Ws zP4kq-9{okAT)t>+e!;rr3xn8g4TL6zhsyZ?JHo&|21j~-hG}&Q0;s5{u M07*qoM6N<$f}m#GP5=M^ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fa7764537254147c35c1e356ab75ec29a1e0ef GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_-VEMl2N~A^MK}vQ zB8wRq_zr_GH=O_Iu2Hj2h<4_wMck3SIGZaSX9IeRh(s&_M@**8MD^ zT+;*AHF~c+B^mOx=-anLO`n84TYAn0n*3N;FJ+pHO&Xs%KVy->PS|EHewtRV$z?l$E`3Pp_ z$^wB8E6S3*k9IftvC1%{ug<;QueVwfUZ7v!=>Z=Db+|6Zw5=!tJK z&%vJ5ghh8;xq>PK>Si&Ceh4jO`m!%_NkF&BB@X|r=blogx|6b%S2F%PU&*i~!a4QN T)b3e8|1o&F`njxgN@xNATKIKf literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png new file mode 100644 index 0000000000000000000000000000000000000000..49c595c35c93ee2a7ef35adaf6c89dfeeda9cdbf GIT binary patch literal 502 zcmVZ5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-UAK{6Dsi0t2_Vz0fR|I zK~y-)&62%t6G0S4&+g2umvwd>DW(G2Q1~541r)%0SaM+r35f@wK%$~R;(a1&KLElK zP~kYp-ktUQ>|dG$WlbXJ;I?;kbiTPC{ObvBTfBbtvh&^}g&>L|-n@Mm{1sq6n|1)t zp1;65hp#+BNsIG+1ML2E7R0S+da~MV^ypDWxvhZntD@ z$G7ia5kj)f^B$mQa5Nqh1mL~n;2=e7jgpGQnBEn_{VUwN|A3}$`Lg^>kr!yK@l}PjmMl$wD^l+dt}Fl^9v>5_ s2x|>=0Y6q}*WdiP%2$otga3zf0cPm98WtUqV*mgE07*qoM6N<$f=tNOvj6}9 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png new file mode 100644 index 0000000000000000000000000000000000000000..d275736f943f4192cade3ef5c7f388dd7d1877a1 GIT binary patch literal 454 zcmV;%0XhDOP)VGd000McNliru-UA5@F&gc!k3IkZ0aHmt zK~y-)y_4T7L_rkCKWAp{y)GgzQg|V1Np1Xlvhv{XyHY$TdGsSn?B2aUW{!u+Zi^Ku z=WUuf-!tDIM-KM8{G|+kEH~|_KfWz%VRdrHCo8*My3r701!+_1emx@@>CIZ+Dw1Qy?A~Ff! zn-XnG0)PSmf(L6E=@7g{#gWcbpKS~tOaguwxrSy;P#kCp)nJKw@G@ckNQ2|^u3X%M z2-r08HUgGNL6aQga_$!^POrvRehQMw;&cu1N7XZUpW?$DmRm@E5F}ODwBYM^3WnyMF0Q*07*qoM6N<$g55j4eEYueawTGU=YH*LbS$-n(?x42AQ e;`99u2gCAY&!hiyH=O_Iu2HJo=ha+Rc?fq5qyPjv*GO&rUk+ci4f)wLksR z1us#dHI9EcJKm>VJn!hSRQihhq?tQ)=7?PqxF}ok{QAby+#lJSR~~t5yh$>GA+@6Z z=gw=(q@I^AU~zR|e>?lR`Rc^}x#s$E4y;~`LPuCW+JW?!#xCy$tUDvPW*Ub{qH4RB+MPWEU@Ev0%GuaU{upD>J9l z-Tccx)RY^zp6EW=c0M{j#!*#6^ujK^`%CQ^&9v9V{@$gw;Kz{)-rcq@t{$xXeOff7 zuHNc|^>sy#O$VL{%;J{wP)VGd000McNliru-UA5@DIA8^vQhv50d+}4 zK~y-)#ga{K(_j#WpZRRZc0-60+(Mv;RW~d^+@Lq;o@;R#&H&3Ukf;Py>LNCUKpV%2 z?Qez!2oX#wc71pA_vjtXz->!*70Nw~^{+tTU`KB+S%UFG*gHDJT?H_V;9Rj_qigTjgev|9K=JemO%r#hjq^CEa_Ee`h?n>5=|aaTn7yNB~_8 ehd1=zu6_WnH==*`+Ut=30000P)VGd000McNliru-UA5@H3pr+7Igps0d+}4 zK~y-)#gfTR8$l3;zouv69^(bGNJxNCSY$Xrl$VK=Cq!`J4LEQ^IYbr-0tFC?*^JFH z2G4k=d%C$<*fIifp>CzB`fB^(vrW7f@HeXNrLTV;iFX0~jj9WzVr6|5i>0A&iETo7 z&>RX9gT;&M%amk+Fzi9xTjD%z@IAkZFC>9bjCn@_!0R^S}N0ZEn; z+k}U#&7@ah%Byf^?irV5gngpoP2h|LKR+DM{!tSbfBtik-XM`APBZRTxQzc1c5e_u z5qTExY_jhQ-rx-$vksB%qMf0oTU@pGaoQkMfufqHEA-n!0w`4jx^bN-3K4-q)@R-p e(nqBH`SuKE>#Zxx%kgXg0000VGd000McNliru-UA5@G7UvhSvmj!0kla( zK~y-)y_3Oe6Hyd~zkBaYGLtj}8%J#+6&J;gi_+OB?tF$Sf-6_<6kOFOh#=xqxKIK< zNj5GNL3$FGuXMp7&!MVwe5((hc~jcKs&=+g!YC(obY*W(Her%P&eR0$LNQplm)4C z%L<$`RFq&+mfgT( zI2D@C(GP}DYS5Ks1@Zkul@1fW)-yt@3ACo+8BD2Y=#r5?fy9RspZM`pwVFh|0H+`j z3>L4nL?X0OfxG}$gL=Lm<@nJv#rIQw4u)9Y66PS|1vv$bH6-W651*^QlKA_qZ(qw+ p*gOc03&Bbd^HSNl@ zoxV36|yh`RVo8B|;Swmf2cp84PckZ^} jP&1s-oFLSE{0HM=TVIavpN{VZx}Cw()z4*}Q$iB}5pr$7 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png new file mode 100644 index 0000000000000000000000000000000000000000..40606587c0ad2ab997f8922a98b01baaa799046a GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({xitX5C6w)^mS#w$IQvV%lzs6S&&gHJzX3_EKa|@WaxJ|K*05)@qNCC zO$@B5>^l6NQx&ewXcG&RIKDBN-_=9XRVnw~m+<_wxSZGG*8^fs`a1CPYrTIP%~$3B zF~{iEOCQUon=DR&A#%xYxBl+Ai=P(S4H^(T{c{G zI^Qm?zB+5a;PDP`J-6l~GpgCyYs>cem}M2N^l09)IV1Glxw{X9vakN%e_>A9PScM% a`%nI~J#jyG$3CE=89ZJ6T-G@yGywpJRc-|U literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png new file mode 100644 index 0000000000000000000000000000000000000000..77af87239ab5a01dcd417af7f5bb35a3a012ebb7 GIT binary patch literal 461 zcmV;;0W$uHP)VGd000McNliru-UA5?IUwS=wzB{L0a{5! zK~y-)#nMe{Q$ZBQ@!!o&n?@5`6jXH6t^~ndcPd@Qjp9P^yZI%=t+b$m1y^p>jVKiH zElF<^)BBQ_adEY`wTasv7-r6y^ZaM#%;BspTC}mfE*$soeV(5iEfRL_-y}ce@E7OX zc6L6^1x5dgJDm+KU1#qd@e<>_9PtwAz;2(ryOpkX>Q0w8=zS^Yan2~ANJ$4^nw?BP z0=(K3I*&H#?a{he21m&${#Kh8x2pQo|1RPc)atBW;p5x#)F}!qquD%)rC%#x1!y$M zM;!blO-tdq76HQv{k#OdXPC@+LYPfC_(AfG80`z}=fr_VL1RV_eOj$KfZH#N=*{=E z+L;yXHyO^D%;@3+Pa_^A)i2bK7ic;f&_IS-#?`D84wdzou+skHFS6Hngza@9JQTtW zAuJ1FO?VOs&l)GY^S`b9{F;z;>5f^g^LV^C_iXJqNK=L_`VB}A00000NkvXXu0mjf Dqb$tE literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png new file mode 100644 index 0000000000000000000000000000000000000000..33dc2d425064582429903fa52f7d197d814c2a3d GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_-VEMl2N~A^MK}vQ zB8wRq_zr_GH=O_Iu2HJgh=TyqA>%h2D9(IEGl9K03)T@2~-n>wFFM z0&eja6IOaZpQo69Dzj+WJ+;V5hofoZqL?iOy%m!CgRRZQ*HdBVip8H-oJuM) zan!vXajD%xu(qCcQrJ{hx98@Hxxwf6mWY>`b_xm{w-r|LaJtU_^3BJ2ryOsbcBwP% iRM9=#`uDH-K1QZhMO!V^U1tNG&fw|l=d#Wzp$PzReQR9+ literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..2b84b9765924ce2c92b0dd29a9d3551d3cd44f83 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)2d5J`7&lR{mZK6yYrJ zh%9Dc;5!V$jK}j=qyPokOFVsD+3zuP@^Yx}cJ`YJ6x#3U;uvCadTH=M-opw!CLNrU z{>)tXHo-$s>laZ=pUpdtS)VZc!(dodF5v#YYxBbQ33tmZWIQ-7^DHiJoxpO| zbBfN+he=VJdY>4ab>-2E>Ak?E`*d08O6ixjeu5Qg|I}=nc5VvGUi^aL_pM8ARpAc} y{(hSJ(ni8c!P{r1b*9|1{8CnigtfVOkJ-=cD{3q4x&9aE6$VdNKbLh*2~7a3)^U0O literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png new file mode 100644 index 0000000000000000000000000000000000000000..6719e820c1817ac7267f3075894610f562221dd5 GIT binary patch literal 478 zcmV<40U`d0P)VGd000McNliru-UA5%3?V;O*T4V(0c%M_ zK~y-)t<%A36JZp^@!vO-WC&K#hSHT-72m*xAc9>8E=An&?q}>sH5y&l+|4(`rGFvIGFvOM|KGpyH_~v4 URlWBA>Hq)$07*qoM6N<$f|@eYhyVZp literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..1f1ed624ed757122da3135c7f70715cad8de4f4b GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqGY^BY`i}31&H#mEGeaUuobz*YQ}arITm}Z`qSVBa z)D(sC%#sWRcTeAd6une-1_nkBPZ!4!i_=RdTd!_45NJ_%e9ITLqqV7{_y2!;PP1hK zB0ZHkc}r!!R_yJ6J88q@oBG0nP6z6}>Tanla&UQgo+-%dN@?#R4Y}4Mzd4*Zo>a=+ z+Sa;NEKtNTyLa7d28P219h)7#?Bh^ekSWEXc;L*1C}xIJo9?(A( zb(i&l+WYVO_;@C%G=7(hdVM=BnP-#EZYPyR0imKjhW$^D7q$d>#Yh+!@A1~*=M{neamzemgM85!1J=e}%WtNt-2-F<)AhsnQ~*y`qOTRVB1ASkdrUHx3v IIVCg!0PX3a4*&oF literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..bd01c9b96e850de88cae7c55b017238717c659a7 GIT binary patch literal 481 zcmV<70UrK|P)WFU8GbZ8()Nlj2>E@cM*00BiwL_t(I%cYYsPr^_T z$A3qRwM173CPTu&=IF<;3=$Iu62F{_fyv3i&DGgR!a&mKU_c75VC^}0uT~&v$~LRA?qejPk%;~q0MMz|X^Uv<7m$=o5D`v6JIy9(5D<>XxH#r2O#$et z$}(W5{GzHvB50QJHW-jQ#|&s$pf9To`k^2a(aT1IEJ+x}F*y(b@3sTH0C)D>Rh1PF zG|O0wMg%|zd;lqs0M1}1>pW;zt9ntZk@Wk;p#v7c0Wde%6YvQ1EVodwa1P|Fw9IY- z5MbhCOqKVmFfkI*^Dso@+hl*ESkM%>HxF)0CKd{=f!T0aP%D-!z|2$~0{ff#!2hN* zOPB&VuxGVD05?m$AnRtqgN}h+;5iJL%;&u3`ARd%reX4+BVh2CPF!9-VbfsAw&VN> X6Wy4XZvL^Y00000NkvXXu0mjf2G+tI literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e9bab691060a86a3e2d010919ee944e055dd4a GIT binary patch literal 433 zcmV;i0Z#sjP)VGd000McNliru-UA5?C>IIbFsuLo0X|7Y zK~y-)#gffR0#O)-pBbk@X%P{D$UsE}bp@^31c5GsT34GcArQI(!Apo%<|6trq;<3k zx&c=%Z6kpe>6szZw?&gUzOFM{&j znz~(|-EA9~1*U*1=cPIThx^f@+?H1*Z(TA;$)qK7B$-Lc&|ifj8pPP4i|v4#z%q(& z0uMk8tW>0^J!pMrD+WxXcqVx50CS*rA8@b-gD#w(L#NXMd|(61y9XWv{`N0b&mZEz z_v^qsAm9`5!e9a2?^dNUgrL{^0IEO>cnM1i=mopLbt49Hb(56Lie#2Tlh-@a8&U&h zPr|?8ghF9C!1GYs08GH*!XMGRxSUa;h|~&HUy+*VIEzlt!s;WVoXev|10=9*$md2R baIEzOzk`?B*H-nU00000NkvXXu0mjf0PC^| literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1103225d80d74642e7008218ac4b0c1816f2c3 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({F}bqv)PWuGwvMK}vQ zB8wRq_zr_GH=O_Iu2n4BGq_?M$&ip@W_-jv*GOljqD@ecpjHLCO7c z%iH*W{x|+TweMm)(bQt%?(UjU?pPAS!ffZ9Fl)MA^ud4!Cl7ZdIW(&CKfaWzT_Dxu zYuv_NAlc+?%nSs|+aek=Z*0qDKm40tUZNoLSSABd^zfm_I{%9|6-&IkyT3Wu_+CcM z|A)+n_x>)Im?9D?!NSVo;mv-cZk|yoSM&7g?B{MIDv8|sIIaG}F+O3#z*haPnH`;4 wHEjlhizV+0^klTm?C>|%JK(g=O@e_T{nWfIWxIb&1$u_T)78&qol`;+0ORv*1^@s6 literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png b/1.7.2/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png new file mode 100644 index 0000000000000000000000000000000000000000..329d46bc7e70fef9460479dc10ab5b83ff5cb8b7 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(}u{avAiwtIJG*BAf*t zk;M!Qe1}1p@p%4<6rdn`iKnkC`#ok(22s=feg`H2g-&|9IEGl9PQG*E!YK#N1SR*& zJg0B|PmehFuRn=llY-(|JGDPIVjmZ5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-UAK+7#*WPM5_P*1U5-T zK~#9!?VG=E6h{=tKYO>t=U)LUq=3YVqWlw)6{SEakf(Cto`MJ}DoUhCQ97b1MH-x7xYeGZ%Yj*(a@TZ)V4L@B7|--}jBq z2?4taZW~Cwu}RYCZhC-eYU}l5;4cy2q{wksYsUo0ZVVidMRr{g z{akzeUy)#25uFtvTfmw!BLig`c&W^2DVrV(q{;)3$dNHcvgMKBp5CwNbshLeU}W0h zG4MHs zS57$9{0xu@k0<={aoPjMY5jq&NgAtu8O&}T+`?VCZ2(wWv^;wOXB0wz{PM3CyE>uW zJ{4RH`gkH)rVDg!f2W8$Ex3p-Py;N;3Oy-So zqxeIyZiNIO17XmY&4U%oJ}*Ur@9Ny3^?8#0KQm?C826R6>;w0V;iBzk=d}W9(mD>5 zi+E;f(e`l1uv|3AUeP_OLn3bDs2nitwkTSkJ+q)ltQd2o&l)BR=d5MRD|3ki+waEo zd`>IR;338zmJpA+c2qW{W-L{jJMT=RCjCAi?3XIJJHUO7eWTL&o#%J@E@|AaYdi^C_4LI( z@BV_d>;S)IW7gKQ84CF_XDuDzjsWn#Q=twBIn*!ZtFRSrg1ajx=d5L00_YEoeQhlh zfu5i_5*tO^>#tj|wny_XSX;^85RAMV%r`uP8lc(%uwu-i(?#!V4M1$s59)xjwLQP* zi?YF=UjXNiRpCf22`Ruqf~XGXfsHj~u!d!D-WcZxVj0|WpN{aoFM}i90?Rp;&u@b& z5@%Yb!wa3)Rj~|a&0W@nU03@57zlRl%HXg7G**U5%k2G89jruI2CJ;~k6j16w*XYR z)(@=%@=Q9Y-iN@5;lD`IV)C+uf+#D0zRWEWJ}U*s&$ZhEdFNx0y`{Inuw7rM8Z>7H zjWtTJQG$&UY?NT51gi}|*WV{AuYjS_5>V6XiL%TF)$0o!;&00000NkvXX Hu0mjfa$77s literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbdeed6610c8302c0d1391c2fc6d144e0e04403 GIT binary patch literal 1608 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 IM6N<$f>z{NK>z>% literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png new file mode 100644 index 0000000000000000000000000000000000000000..c74a2dd85c136aa12372adaffdb62bdd5826758b GIT binary patch literal 1230 zcmV;<1Tp)GP)VGd000McNliru-UA315i5ZB>SX``1Y1c& zK~#9!?U_q!8&?#^f9K8}Nq*FEDJ>7$f|X@P!g`NP`0onIOw8+}`H^7l;Yj zo31gAVUG~VChT8HcmOht;*!H)h=Gh`nR;`Bcldm^H3no5vP8s;Gse#J+x{TII!Z=z z#9J;QFo^@yn;d}CZi6Dt)>y|Ui-T%JtUePsWDr7p0(?fWh%rpPndFeT_Z^VI06w>I zaS6#{Xiy{I5Cv4TKnBG@fD9H#T=r-nNYWJ)P~7CFaYUqzzG#ldCnikPURE+m%mq*) zB4X-PsI#kk_%v`NCe%8U2sHv!-ZZEe4a1&GC_p!{o z4Ai}+bH$^l3SR@T;%%TP-xlt)*CImko3EPd)lE#WHc$>Q6UkuXeNA+>udeZ6mcY%$JQZRp zPyZUa5=hZPv-jWAn$7E6v8Yu$tC7tQmkux}wM4&X5#k{Tyc|_~e|Q`CL{x!M3=ZHT z%ok?(vs4<$+P5cFU=D{I5TO_(z0dVJZ?!Ubdl@~cVlQSmhn%|zXSAYt9X!+58BkTU+Wc0_tCz3!)yvlxE&+Sdx;YyCqme(E2^WcK zOKDD(hO`bZOJGA^0{^QHxK0x686k9Cc<<1wCxMD^k)pNe>Cb+cV2-6(-8?E+7{ zG7k&+j^}>!*0IS13gCBdojUL!DUEJ)fh!@wUT%ZZBCHQF>@1vhc4?v1H{TD2{xXyz sMT!(DQlv|Jkz&~JA4WtSF1RdZaR2}S07*qoM6N<$f)%SOAOHXW literal 0 HcmV?d00001 diff --git a/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png b/1.7.2/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..f579c0283fc36a62f396b78694fa9720358bea1d GIT binary patch literal 1229 zcmV;;1Ty=HP)VGd000McNliru-UA2%9t^mLB3b|d1X@W% zK~#9!?V34{97Pz0pQ`F(=h)c`)@YIc2LTxgY)giKK>{2sk$(e`<%r+lY=jU5hyYMo z`~i@#GY13~5i1Z0Fgr(2PhUka-Mw?IykmLRbM!mGOm}@lZqJmMC#gIM@ET>B0>@pBocu{p@@hG7*L^#K&*!ZEG#;- z8RCZ=AO<!|^Nw%4Bb?NW+)N34diDV+Dc`hy*g6T6g;4(E)bmV7 zD|&P}@v1!2f8*ft8^3Jyj!%d>pie|pw6fda>*Cb&ib(gT?xV1>#wVmh2Mdcgy&8|S z78~yYqs}lzqS)gA2dAhEOROMHJ;>)0(4GxA-06>(;*J>ZnP=9Iez;K}2s=E>uy3roOSR5#(=*$-G^uIa^$HQ z;&Pj1oJPq-V!-qCKfd7UXX{>6EFNIryF6^okuScj1&M9|vo>2%2iV!4G;SmdT)LGW zcj0SKFwb^gN&AOx<5J<4=N7IlkbNvOx*8jo4OYj*Bw2Q zK>l80`g&Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-UA313NWLq=o0_{1U5-T zK~#9!?U_w)TSXLxpEGl>?Ibmjblsl=2{94~C6+1>9}*J3fmPKNzaa}m7DcE@79i?= zz&~hr{R@#`L7TM6wH@1c=CGK1;|~&AS2*>@eOLC(+$*1V&ikG-W8o4sd!qitB4v-1 z{rR|_M94LVloV|m)C;ESSQdmCM0DANb_9BYp2nyXsCcC0QD@L+2C>;fQK&j*73NX` zUPRyp@<6)=5O6@xpl1f{3Pg&YnfW6?Ry?GFL<$0wJ?aE`H$|2mverXlMczr#)*KR` zEdxfO;vrH{kl3S%g|dS)gH%&U&40XQmNUR+seWoh+ILMLCGve)#EO3&Ln<>%fF#c% z#R(cK7)2rtf%;7EmJpy5P{R0%3!b2W4bR{O^%Ane3Ff^NVCt)bQ7^&F+6IO2xnn}m zX{ZEL(?CQyNP)x#SyUYoE0h%VAVv|RXw%|fTKuVC6vgrf(jaYXjzCosKA*J(rB6qP=ShribB&uk064q^`K=?1yazCg_1{G5=fYS6U=t+%s|EA73gO5Kgm+q2`s13mdqOjZ14lI2K;@}AwoqhtO>cN9F4Kyv*26v|&j8HoU1jL6RMM62Gla;@gg|0zX(m;v_ znl`k{OP&JLUIs@84tE*K+Z$gY3&lvYZFI9%)8xeJX04|49Coi2`!xV|wj1+HNUr(KT1}G|R+GQu^Y6{J(ZTsm;HQ7VD;k&i9JULe(@wwAj4*@rpccrZ7IPIo=2J-M+?>mM2dfz>E3F%3z&BT za)<95U&P)Ie`HOOA^EE`*B#+d6_8~IPQp!Z+aT9mINcSPUf;^I^Kcg(?PA~PEU>W0 z;lo`tuloSEZ+#EIt=r!XJ+QOg;C0sBZ!~0_ogDX>iJb;#2`xoi8q)sBzM=o;!@e{epwfA;}c*xvdOfP;Gt{82>xi}lG8FlhtK z-@o_sL-0`lY$K3x=Ml%h_Ag>r*GtsDd4K3#`v(s=x*JYplempC<9NWU^gkHzg={am z^WXvMpRW(i=fUs&_. Subcommands are tps, track -commands.forge.usage.tracking=Use /forge track . Valid types are te (Tile Entities). Duration is < 60. -commands.forge.tps.summary=%s : Mean tick time: %d ms. Mean TPS: %d - -commands.forge.tracking.te.enabled=Tile Entity tracking enabled for %d seconds. \ No newline at end of file diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 346aaabe..6337e32c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -22,7 +22,6 @@ import net.minecraftforge.oredict.OreDictionary; import thaumcraft.api.ItemApi; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks; import WayofTime.alchemicalWizardry.common.AlchemicalWizardryFuelHandler; -import WayofTime.alchemicalWizardry.common.AlchemicalWizardryTickHandler; import WayofTime.alchemicalWizardry.common.CommonProxy; import WayofTime.alchemicalWizardry.common.EntityAirElemental; import WayofTime.alchemicalWizardry.common.LifeBucketHandler; @@ -30,10 +29,13 @@ import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent; import WayofTime.alchemicalWizardry.common.PacketHandler; import WayofTime.alchemicalWizardry.common.PotionBoost; import WayofTime.alchemicalWizardry.common.PotionDrowning; +import WayofTime.alchemicalWizardry.common.PotionFireFuse; import WayofTime.alchemicalWizardry.common.PotionFlameCloak; import WayofTime.alchemicalWizardry.common.PotionFlight; +import WayofTime.alchemicalWizardry.common.PotionHeavyHeart; import WayofTime.alchemicalWizardry.common.PotionIceCloak; import WayofTime.alchemicalWizardry.common.PotionInhibit; +import WayofTime.alchemicalWizardry.common.PotionPlanarBinding; import WayofTime.alchemicalWizardry.common.PotionProjectileProtect; import WayofTime.alchemicalWizardry.common.PotionReciprocation; import WayofTime.alchemicalWizardry.common.alchemy.AlchemicalPotionCreationHandler; @@ -62,7 +64,6 @@ import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; import WayofTime.alchemicalWizardry.common.items.LifeBucket; -import WayofTime.alchemicalWizardry.common.items.forestry.ItemBloodFrame; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; import WayofTime.alchemicalWizardry.common.rituals.Rituals; @@ -107,10 +108,8 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; -import cpw.mods.fml.common.registry.TickRegistry; -import cpw.mods.fml.relauncher.Side; -@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.7.3c") +@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v0.7.3e") @NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {"BloodAltar", "particle", "SetLifeEssence", "GetLifeEssence", "Ritual", "GetAltarEssence", "TESocket", "TEWritingTable", "CustomParticle", "SetPlayerVel", "SetPlayerPos", "TEPedestal", "TEPlinth", "TETeleposer", "InfiniteLPPath", "TEOrientor"}, packetHandler = PacketHandler.class) public class AlchemicalWizardry @@ -124,6 +123,8 @@ public class AlchemicalWizardry public static int ironBlockMeteorRadius; public static String[] netherStarMeteorArray; public static int netherStarMeteorRadius; + + public static String[] allowedCrushedOresArray; public static Potion customPotionDrowning; public static Potion customPotionBoost; @@ -133,6 +134,9 @@ public class AlchemicalWizardry public static Potion customPotionReciprocation; public static Potion customPotionFlameCloak; public static Potion customPotionIceCloak; + public static Potion customPotionHeavyHeart; + public static Potion customPotionFireFuse; + public static Potion customPotionPlanarBinding; public static int customPotionDrowningID; public static int customPotionBoostID; @@ -142,6 +146,9 @@ public class AlchemicalWizardry public static int customPotionReciprocationID; public static int customPotionFlameCloakID; public static int customPotionIceCloakID; + public static int customPotionHeavyHeartID; + public static int customPotionFireFuseID; + public static int customPotionPlanarBindingID; public static boolean isThaumcraftLoaded; public static boolean isForestryLoaded; @@ -274,6 +281,8 @@ public class AlchemicalWizardry public static int itemBloodLightSigilItemID; public static int itemComplexSpellCrystalItemID; public static int itemBloodFrameItemID; + public static int baseComponentsItemID; + public static int baseAlchemyComponentsItemID; public static int testingBlockBlockID; public static int lifeEssenceFlowingBlockID; @@ -392,7 +401,7 @@ public class AlchemicalWizardry ItemStack lavaBucketStack = new ItemStack(Item.bucketLava); ItemStack cobblestoneStack = new ItemStack(Block.cobblestone); ItemStack glassStack = new ItemStack(Block.glass, 1, craftingConstant); - ItemStack ironStack = new ItemStack(Item.ingotIron); + ItemStack ironIngotStack = new ItemStack(Item.ingotIron); ItemStack diamondStack = new ItemStack(Item.diamond, 1, craftingConstant); ItemStack woolStack = new ItemStack(Block.cloth); ItemStack goldNuggetStack = new ItemStack(Item.goldNugget); @@ -495,18 +504,18 @@ public class AlchemicalWizardry ItemStack magicalesStack = new ItemStack(ModItems.magicales); //All crafting goes here // GameRegistry.addRecipe(orbOfTestingStack, "x x", " ", "x x", 'x', cobblestoneStack); - //GameRegistry.addRecipe(glassShardStack, " x", "y ", 'x', ironStack, 'y', glassStack); + //GameRegistry.addRecipe(glassShardStack, " x", "y ", 'x', ironIngotStack, 'y', glassStack); //GameRegistry.addRecipe(weakBloodOrbStackCrafted, "xxx", "xdx", "www", 'x', bloodiedShardStack, 'd', diamondStack, 'w', woolStack); - GameRegistry.addRecipe(sacrificialDaggerStack, "ggg", " dg", "i g", 'g', glassStack, 'd', goldIngotStack, 'i', ironStack); - //GameRegistry.addRecipe(blankSlateStack, "sgs", "gig", "sgs", 's', stoneStack, 'g', goldNuggetStack, 'i', ironStack); - //GameRegistry.addRecipe(reinforcedSlateStack, "rir", "ibi", "gig", 'r', redstoneStack, 'i', ironStack, 'b', blankSlateStack, 'g', glowstoneBlockStack); + GameRegistry.addRecipe(sacrificialDaggerStack, "ggg", " dg", "i g", 'g', glassStack, 'd', goldIngotStack, 'i', ironIngotStack); + //GameRegistry.addRecipe(blankSlateStack, "sgs", "gig", "sgs", 's', stoneStack, 'g', goldNuggetStack, 'i', ironIngotStack); + //GameRegistry.addRecipe(reinforcedSlateStack, "rir", "ibi", "gig", 'r', redstoneStack, 'i', ironIngotStack, 'b', blankSlateStack, 'g', glowstoneBlockStack); GameRegistry.addRecipe(lavaCrystalStackCrafted, "glg", "lbl", "odo", 'g', glassStack, 'l', lavaBucketStack, 'b', weakBloodOrbStack, 'd', diamondStack, 'o', obsidianStack); GameRegistry.addRecipe(waterSigilStackCrafted, "www", "wbw", "wow", 'w', waterBucketStack, 'b', blankSlateStack, 'o', weakBloodOrbStack); GameRegistry.addRecipe(lavaSigilStackCrafted, "lml", "lbl", "lcl", 'l', lavaBucketStack, 'b', blankSlateStack, 'm', magmaCreamStack, 'c', lavaCrystalStack); GameRegistry.addRecipe(voidSigilStackCrafted, "ese", "ere", "eoe", 'e', emptyBucketStack, 'r', reinforcedSlateStack, 'o', apprenticeBloodOrbStack, 's', stringStack); GameRegistry.addRecipe(bloodAltarStack, "s s", "scs", "gdg", 's', stoneStack, 'c', furnaceStack, 'd', diamondStack, 'g', goldIngotStack); //GameRegistry.addRecipe(energySwordStack, " o ", " o ", " s ", 'o', weakBloodOrbStack, 's', diamondSwordStack); - //GameRegistry.addRecipe(energyBlasterStack, "oi ", "gdi", " rd", 'o', weakBloodOrbStack, 'i', ironStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); + //GameRegistry.addRecipe(energyBlasterStack, "oi ", "gdi", " rd", 'o', weakBloodOrbStack, 'i', ironIngotStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); GameRegistry.addRecipe(bloodRuneCraftedStack, "sss", "ror", "sss", 's', stoneStack, 'o', weakBloodOrbStack, 'r', blankSlateStack); GameRegistry.addRecipe(speedRuneStack, "sbs", "uru", "sbs", 'u', sugarStack, 's', stoneStack, 'r', bloodRuneStack, 'b', blankSlateStack); //GameRegistry.addRecipe(efficiencyRuneStack, "sbs", "rur", "sbs", 'r', redstoneStack, 's', stoneStack, 'u', bloodRuneStack,'b',blankSlateStack); @@ -562,6 +571,10 @@ public class AlchemicalWizardry customPotionReciprocation = (new PotionReciprocation(customPotionReciprocationID, false, 0xFFFFFF)).setIconIndex(0, 0).setPotionName("Reciprocation"); customPotionFlameCloak = (new PotionFlameCloak(customPotionFlameCloakID,false,0).setIconIndex(0,0).setPotionName("Flame Cloak")); customPotionIceCloak = (new PotionIceCloak(customPotionIceCloakID,false,0).setIconIndex(0,0).setPotionName("Ice Cloak")); + customPotionHeavyHeart = (new PotionHeavyHeart(customPotionHeavyHeartID,true,0).setIconIndex(0, 0).setPotionName("Heavy Heart")); + customPotionFireFuse = (new PotionFireFuse(customPotionFireFuseID,true,0).setIconIndex(0, 0).setPotionName("Fire Fuse")); + customPotionPlanarBinding = (new PotionPlanarBinding(customPotionPlanarBindingID,true,0).setIconIndex(0,0).setPotionName("Planar Binding")); + //All items registered go here //LanguageRegistry.addName(orbOfTesting, "Orb of Testing"); LanguageRegistry.addName(ModItems.weakBloodOrb, "Weak Blood Orb"); @@ -902,6 +915,56 @@ public class AlchemicalWizardry MeteorRegistry.registerMeteorParadigm(stoneStack, this.stoneMeteorArray, this.stoneMeteorRadius); MeteorRegistry.registerMeteorParadigm(ironBlockStack, this.ironBlockMeteorArray, this.ironBlockMeteorRadius); MeteorRegistry.registerMeteorParadigm(new ItemStack(Item.netherStar), this.netherStarMeteorArray, this.netherStarMeteorRadius); + + //Register spell component recipes + ItemStack quartzRodStack = new ItemStack(ModItems.baseItems,1,0); + ItemStack emptyCoreStack = new ItemStack(ModItems.baseItems,1,1); + ItemStack magicalesCableStack = new ItemStack(ModItems.baseItems,1,2); + ItemStack woodBraceStack = new ItemStack(ModItems.baseItems,1,3); + ItemStack stoneBraceStack = new ItemStack(ModItems.baseItems,1,4); + ItemStack projectileCoreStack = new ItemStack(ModItems.baseItems,1,5); + ItemStack selfCoreStack = new ItemStack(ModItems.baseItems,1,6); + ItemStack meleeCoreStack = new ItemStack(ModItems.baseItems,1,7); + ItemStack paradigmBackPlateStack = new ItemStack(ModItems.baseItems,1,8); + ItemStack outputCableStack = new ItemStack(ModItems.baseItems,1,9); + ItemStack flameCoreStack = new ItemStack(ModItems.baseItems,1,10); + ItemStack iceCoreStack = new ItemStack(ModItems.baseItems,1,11); + ItemStack windCoreStack = new ItemStack(ModItems.baseItems,1,12); + ItemStack earthCoreStack = new ItemStack(ModItems.baseItems,1,13); + ItemStack inputCableStack = new ItemStack(ModItems.baseItems,1,14); + + ItemStack magicalesCraftedCableStack = new ItemStack(ModItems.baseItems,5,2); + + GameRegistry.addRecipe(quartzRodStack, "qqq", 'q', new ItemStack(Item.netherQuartz)); + GameRegistry.addRecipe(emptyCoreStack,"gig","nrn","gig",'n',goldIngotStack,'i',ironIngotStack,'g',glassStack,'r',simpleCatalystStack); + GameRegistry.addRecipe(magicalesCraftedCableStack,"sss","mmm","sss",'s',new ItemStack(Item.silk),'m',magicalesStack); + GameRegistry.addRecipe(woodBraceStack," il","ili","li ",'l', new ItemStack(Block.wood,1,craftingConstant),'i',new ItemStack(Item.silk)); + GameRegistry.addRecipe(stoneBraceStack," is","isi","si ",'i', ironIngotStack,'s',reinforcedSlateStack); + + GameRegistry.addRecipe(projectileCoreStack, "mbm","aca","mom",'c', emptyCoreStack,'b',weakBloodShardStack,'m', magicalesStack,'o', magicianBloodOrbStack,'a',new ItemStack(Item.arrow)); + GameRegistry.addRecipe(selfCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',sanctusStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',glowstoneDustStack); + GameRegistry.addRecipe(meleeCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',incendiumStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',new ItemStack(Item.flintAndSteel)); + GameRegistry.addRecipe(paradigmBackPlateStack,"isi","rgr","isi",'i',ironIngotStack,'r',stoneStack,'g',goldIngotStack,'s',reinforcedSlateStack); + GameRegistry.addRecipe(outputCableStack, " si","s c"," si",'s',stoneStack,'i',ironIngotStack,'c',simpleCatalystStack); + + GameRegistry.addRecipe(flameCoreStack,"mdm","scs","mom",'m',incendiumStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(iceCoreStack,"mdm","scs","mom",'m',crystallosStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(windCoreStack,"mdm","scs","mom",'m',aetherStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + GameRegistry.addRecipe(earthCoreStack,"mdm","scs","mom",'m',terraeStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack); + + GameRegistry.addRecipe(inputCableStack, "ws ","rcs","ws ",'w',blankSlateStack,'s',stoneStack,'r',imbuedSlateStack,'c',simpleCatalystStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockConduit,1,0),"q q","ccc","q q",'q', quartzRodStack,'c', magicalesCableStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,0),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', projectileCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,1),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', selfCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,2),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', meleeCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,0),"bgb","ico","bgb",'c',flameCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,1),"bgb","ico","bgb",'c',iceCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,2),"bgb","ico","bgb",'c',windCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,3),"bgb","ico","bgb",'c',earthCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); + // sanguineHelmet = new ItemSanguineArmour(sanguineHelmetItemID).setUnlocalizedName("sanguineHelmet"); // // LanguageRegistry.addName(sanguineHelmet,"Sanguine Helmet"); diff --git a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java index 22676828..4a4b2288 100644 --- a/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java +++ b/BM_src/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -46,6 +46,9 @@ public class BloodMagicConfiguration AlchemicalWizardry.customPotionReciprocationID = config.get("Potion ID", "Reciprocation", 105).getInt(); AlchemicalWizardry.customPotionFlameCloakID = config.get("Potion ID","FlameCloak",106).getInt(); AlchemicalWizardry.customPotionIceCloakID = config.get("Potion ID","IceCloak",107).getInt(); + AlchemicalWizardry.customPotionHeavyHeartID = config.get("Potion ID","HeavyHeart",108).getInt(); + AlchemicalWizardry.customPotionFireFuseID = config.get("Potion ID","FireFuse",109).getInt(); + AlchemicalWizardry.customPotionPlanarBindingID = config.get("Potion ID","PlanarBinding",110).getInt(); MeteorParadigm.maxChance = config.get("meteor", "maxChance", 1000).getInt(); AlchemicalWizardry.doMeteorsDestroyBlocks = config.get("meteor", "doMeteorsDestroyBlocks", true).getBoolean(true); @@ -58,6 +61,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.netherStarMeteorArray = config.get("meteor", "netherStarMeteor", new String[]{"oreDiamond", "150", "oreEmerald", "100", "oreQuartz", "250", "oreSunstone", "5", "oreMoonstone", "50", "oreIridium", "5", "oreCertusQuartz", "150"}).getStringList(); AlchemicalWizardry.netherStarMeteorRadius = config.get("meteor", "netherStarMeteorRadius", 3).getInt(); + AlchemicalWizardry.allowedCrushedOresArray = config.get("oreCrushing", "allowedOres", new String[]{"iron","gold","copper","tin","lead","silver","osmium"}).getStringList(); + AlchemicalWizardry.testingBlockBlockID = config.getBlock("TestingBlock", 1400).getInt(); AlchemicalWizardry.lifeEssenceFlowingBlockID = config.getBlock("LifeEssenceFlowing", 1401).getInt(); AlchemicalWizardry.lifeEssenceStillBlockID = config.getBlock("LifeEssenceStill", 1402).getInt(); @@ -176,6 +181,8 @@ public class BloodMagicConfiguration AlchemicalWizardry.sigilOfMagnetismItemID = config.getItem("SigilOfMagnetism", 17080).getInt(); AlchemicalWizardry.itemComplexSpellCrystalItemID = config.getItem("ComplexSpellCrystal",17081).getInt(); AlchemicalWizardry.itemBloodFrameItemID = config.getItem("BloodFrame", 17082).getInt(); + AlchemicalWizardry.baseComponentsItemID = config.getItem("BaseComponents", 17083).getInt(); + AlchemicalWizardry.baseAlchemyComponentsItemID = config.getItem("BaseAlchemyComponents", 17084).getInt(); } catch (Exception e) { diff --git a/BM_src/WayofTime/alchemicalWizardry/ModItems.java b/BM_src/WayofTime/alchemicalWizardry/ModItems.java index 8cb6a9a0..7a161e8b 100644 --- a/BM_src/WayofTime/alchemicalWizardry/ModItems.java +++ b/BM_src/WayofTime/alchemicalWizardry/ModItems.java @@ -90,6 +90,9 @@ public class ModItems public static Item armourInhibitor; public static Item creativeFiller; public static Item demonPlacer; + + public static Item baseItems; + public static Item baseAlchemyItems; public static Item weakFillingAgent; public static Item standardFillingAgent; @@ -185,5 +188,7 @@ public class ModItems energyBazooka = new EnergyBazooka(AlchemicalWizardry.energyBazookaItemID).setUnlocalizedName("energyBazooka"); itemBloodLightSigil = new ItemBloodLightSigil(AlchemicalWizardry.itemBloodLightSigilItemID).setUnlocalizedName("bloodLightSigil"); itemComplexSpellCrystal = new ItemComplexSpellCrystal(AlchemicalWizardry.itemComplexSpellCrystalItemID).setUnlocalizedName("itemComplexSpellCrystal"); + baseItems = new ItemComponents(AlchemicalWizardry.baseComponentsItemID).setUnlocalizedName("baseItems"); + baseAlchemyItems = new ItemAlchemyBase(AlchemicalWizardry.baseAlchemyComponentsItemID).setUnlocalizedName("baseAlchemyItems"); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java index c3c18cac..6e63aa15 100644 --- a/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/BM_src/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.client; +import net.minecraft.item.ItemBlock; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import WayofTime.alchemicalWizardry.ModBlocks; @@ -25,11 +26,17 @@ import WayofTime.alchemicalWizardry.common.renderer.block.RenderConduit; import WayofTime.alchemicalWizardry.common.renderer.block.RenderPedestal; import WayofTime.alchemicalWizardry.common.renderer.block.RenderPlinth; import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEffectBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.renderer.block.RenderSpellParadigmBlock; import WayofTime.alchemicalWizardry.common.renderer.block.RenderWritingTable; import WayofTime.alchemicalWizardry.common.renderer.block.TEAltarRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEAltarItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TEConduitItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEffectBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellEnhancementBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellModifierBlockItemRenderer; +import WayofTime.alchemicalWizardry.common.renderer.block.itemRender.TESpellParadigmBlockItemRenderer; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBileDemon; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderBoulderFist; import WayofTime.alchemicalWizardry.common.renderer.mob.RenderElemental; @@ -57,6 +64,9 @@ import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.ClientRegistry; @@ -108,10 +118,15 @@ public class ClientProxy extends CommonProxy ClientRegistry.bindTileEntitySpecialRenderer(TEWritingTable.class, new RenderWritingTable()); ClientRegistry.bindTileEntitySpecialRenderer(TEConduit.class, new RenderConduit()); ClientRegistry.bindTileEntitySpecialRenderer(TESpellEffectBlock.class, new RenderSpellEffectBlock()); - + ClientRegistry.bindTileEntitySpecialRenderer(TESpellEnhancementBlock.class, new RenderSpellEnhancementBlock()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellParadigmBlock.class, new RenderSpellParadigmBlock()); + ClientRegistry.bindTileEntitySpecialRenderer(TESpellModifierBlock.class, new RenderSpellModifierBlock()); //Item Renderer stuff MinecraftForgeClient.registerItemRenderer(ModBlocks.blockConduit.blockID, new TEConduitItemRenderer()); MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellEffect.blockID, new TESpellEffectBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellEnhancement.blockID, new TESpellEnhancementBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellParadigm.blockID, new TESpellParadigmBlockItemRenderer()); + MinecraftForgeClient.registerItemRenderer(ModBlocks.blockSpellModifier.blockID, new TESpellModifierBlockItemRenderer()); //RenderingRegistry.registerEntityRenderingHandler(FireProjectile.class, new RenderFireProjectile()); //RenderingRegistry.registerBlockHandler(new AltarRenderer()); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index e3cb2c94..66512d4c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -10,21 +10,19 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IProjectile; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.PlayerCapabilities; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.potion.Potion; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.Vec3; import net.minecraftforge.event.ForgeSubscribe; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.entity.projectile.EnergyBlastProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import cpw.mods.fml.common.ObfuscationReflectionHelper; -import cpw.mods.fml.relauncher.ReflectionHelper; public class AlchemicalWizardryEventHooks { @@ -41,6 +39,15 @@ public class AlchemicalWizardryEventHooks event.entityLiving.motionY += (0.1f) * (2 + i); } } + + @ForgeSubscribe + public void onEndermanTeleportEvent(EnderTeleportEvent event) + { + if(event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionPlanarBinding) && event.isCancelable()) + { + event.setCanceled(true); + } + } @ForgeSubscribe public void onEntityDamaged(LivingAttackEvent event) @@ -136,13 +143,6 @@ public class AlchemicalWizardryEventHooks if((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease/2.0f) : percentIncrease); - - -// if (!entityPlayer.worldObj.isRemote) -// { -// float speed = ((Float) ReflectionHelper.getPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, new String[]{"walkSpeed", "g", "field_75097_g"})).floatValue(); -// ObfuscationReflectionHelper.setPrivateValue(PlayerCapabilities.class, entityPlayer.capabilities, Float.valueOf(speed + (float) percentIncrease), new String[]{"walkSpeed", "g", "field_75097_g"}); //CAUTION -// } } } } @@ -285,6 +285,32 @@ public class AlchemicalWizardryEventHooks } } } - } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionHeavyHeart)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int i = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionHeavyHeart).getAmplifier(); + double decrease = 0.025*(i+1); + + if(entityLiving.motionY>-0.9) + { + entityLiving.motionY-=decrease; + } + } + + if(entityLiving.isPotionActive(AlchemicalWizardry.customPotionFireFuse)) + { + entityLiving.worldObj.spawnParticle("flame", x+SpellHelper.gaussian(1),y-1.3+SpellHelper.gaussian(0.3),z+SpellHelper.gaussian(1), 0, 0.06d, 0); + + int r = event.entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFireFuse).getAmplifier(); + int radius = r+1; + + if(entityLiving.getActivePotionEffect(AlchemicalWizardry.customPotionFireFuse).getDuration()<=2) + { + entityLiving.worldObj.createExplosion(null, x, y, z, radius, false); + } + } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PotionFireFuse.java b/BM_src/WayofTime/alchemicalWizardry/common/PotionFireFuse.java new file mode 100644 index 00000000..213ffbf4 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/PotionFireFuse.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionFireFuse extends Potion +{ + public PotionFireFuse(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PotionHeavyHeart.java b/BM_src/WayofTime/alchemicalWizardry/common/PotionHeavyHeart.java new file mode 100644 index 00000000..18bfcaf1 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/PotionHeavyHeart.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionHeavyHeart extends Potion +{ + public PotionHeavyHeart(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/PotionPlanarBinding.java b/BM_src/WayofTime/alchemicalWizardry/common/PotionPlanarBinding.java new file mode 100644 index 00000000..8cd8fb59 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/PotionPlanarBinding.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common; + +import net.minecraft.potion.Potion; + +public class PotionPlanarBinding extends Potion +{ + public PotionPlanarBinding(int par1, boolean par2, int par3) + { + super(par1, par2, par3); + } + + @Override + public Potion setIconIndex(int par1, int par2) + { + super.setIconIndex(par1, par2); + return this; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java index 3d166d8e..cd564c0c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java @@ -28,6 +28,24 @@ public class BlockSpellEnhancement extends BlockOrientable return new TESpellEnhancementBlock(); } + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java index 1b8fb41e..31a0034f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java @@ -27,6 +27,24 @@ public class BlockSpellModifier extends BlockOrientable return new TESpellModifierBlock(); } + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java index e022e4c5..47bb376e 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -52,6 +52,24 @@ public class BlockSpellParadigm extends BlockOrientable // return this.projectileIcons; // } + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + @Override public TileEntity createNewTileEntity(World world) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java index 729b9ec1..3f825f95 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java @@ -82,12 +82,11 @@ public class EnergyBattery extends Item implements ArmourUpgrade, IBindable world.playSoundEffect((double) ((float) posX + 0.5F), (double) ((float) posY + 0.5F), (double) ((float) posZ + 0.5F), "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); PacketDispatcher.sendPacketToAllAround(posX, posY, posZ, 20, world.provider.dimensionId, TEAltar.getParticlePacket(posX, posY, posZ, (short) 4)); } - - if (!par3EntityPlayer.worldObj.isRemote && !(par3EntityPlayer.getClass().equals(EntityPlayerMP.class))) + + if(!world.isRemote) { - return par1ItemStack; + return par1ItemStack; } - // if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) // { // return par1ItemStack; diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java new file mode 100644 index 00000000..ac224ecf --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import org.lwjgl.input.Keyboard; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemAlchemyBase extends Item +{ + private static final String[] ITEM_NAMES = new String[]{}; + + @SideOnly(Side.CLIENT) + private Icon[] icons; + + public ItemAlchemyBase(int id) + { + super(id); + this.maxStackSize = 64; + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + icons = new Icon[ITEM_NAMES.length]; + + for (int i = 0; i < ITEM_NAMES.length; ++i) + { + icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "baseAlchemyItem" + ITEM_NAMES[i]); + } + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Used in alchemy"); + + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + //This is what will do all the localisation things on the alchemy components so you dont have to set it :D + int meta = MathHelper.clamp_int(itemStack.getItemDamage(), 0, ITEM_NAMES.length - 1); + return ("" + "item.bloodMagicAlchemyItem." + ITEM_NAMES[meta]); + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIconFromDamage(int meta) + { + int j = MathHelper.clamp_int(meta, 0, ITEM_NAMES.length - 1); + return icons[j]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(int id, CreativeTabs creativeTab, List list) + { + for (int meta = 0; meta < ITEM_NAMES.length; ++meta) + { + list.add(new ItemStack(id, 1, meta)); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java new file mode 100644 index 00000000..9b734084 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java @@ -0,0 +1,75 @@ +package WayofTime.alchemicalWizardry.common.items; + +import java.util.List; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemComponents extends Item +{ + private static final String[] ITEM_NAMES = new String[]{"QuartzRod", "EmptyCore", "MagicalesCable", "WoodBrace", "StoneBrace", "ProjectileCore", "SelfCore","MeleeCore","ParadigmBackPlate","OutputCable","FlameCore","IcyCore","GustCore","EarthenCore","InputCable","CrackedRunicPlate","RunicPlate","ScribedRunicPlate","DefaultCore","OffensiveCore","DefensiveCore","EnvironmentalCore"}; + + @SideOnly(Side.CLIENT) + private Icon[] icons; + + public ItemComponents(int id) + { + super(id); + this.maxStackSize = 64; + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.hasSubtypes = true; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + icons = new Icon[ITEM_NAMES.length]; + + for (int i = 0; i < ITEM_NAMES.length; ++i) + { + icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "baseItem" + ITEM_NAMES[i]); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + //This is what will do all the localisation things on the alchemy components so you dont have to set it :D + int meta = MathHelper.clamp_int(itemStack.getItemDamage(), 0, ITEM_NAMES.length - 1); + return ("" + "item.bloodMagicBaseItem." + ITEM_NAMES[meta]); + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIconFromDamage(int meta) + { + int j = MathHelper.clamp_int(meta, 0, ITEM_NAMES.length - 1); + return icons[j]; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(int id, CreativeTabs creativeTab, List list) + { + for (int meta = 0; meta < ITEM_NAMES.length; ++meta) + { + list.add(new ItemStack(id, 1, meta)); + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java new file mode 100644 index 00000000..ae2b9f2c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellEnhancementBlock extends TileEntitySpecialRenderer +{ + private ModelSpellEnhancementBlock modelSpellEnhancementBlock = new ModelSpellEnhancementBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellEnhancementBlock) + { + TESpellEnhancementBlock tileSpellBlock = (TESpellEnhancementBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellEnhancementPower1.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellEnhancementBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java new file mode 100644 index 00000000..a01c0726 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellModifierBlock extends TileEntitySpecialRenderer +{ + private ModelSpellModifierBlock modelSpellModifierBlock = new ModelSpellModifierBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellModifierBlock) + { + TESpellModifierBlock tileSpellBlock = (TESpellModifierBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellModifier.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellModifierBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java new file mode 100644 index 00000000..47a5b271 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.renderer.block; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class RenderSpellParadigmBlock extends TileEntitySpecialRenderer +{ + private ModelSpellParadigmBlock modelSpellParadigmBlock = new ModelSpellParadigmBlock(); + + @Override + public void renderTileEntityAt(TileEntity tileEntity, double d0, double d1, double d2, float f) + { + if (tileEntity instanceof TESpellParadigmBlock) + { + TESpellParadigmBlock tileSpellBlock = (TESpellParadigmBlock) tileEntity; + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) d0 + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F); + ResourceLocation test = new ResourceLocation("alchemicalwizardry:textures/models/BlockSpellParadigm.png"); + int meta = tileEntity.getWorldObj().getBlockMetadata(tileEntity.xCoord, tileEntity.yCoord, tileEntity.zCoord); + String resource = tileSpellBlock.getResourceLocationForMeta(meta); + test = new ResourceLocation(resource); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellParadigmBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, tileSpellBlock.getInputDirection(), tileSpellBlock.getOutputDirection()); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + } +} \ No newline at end of file diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java new file mode 100644 index 00000000..3a885ec0 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java @@ -0,0 +1,114 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellEnhancementBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellEnhancementBlockItemRenderer implements IItemRenderer +{ + private ModelSpellEnhancementBlock modelSpellBlock = new ModelSpellEnhancementBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + case 1: return "alchemicalwizardry:textures/models/SpellEnhancementPower2.png"; + case 2: return "alchemicalwizardry:textures/models/SpellEnhancementPower3.png"; + case 5: return "alchemicalwizardry:textures/models/SpellEnhancementCost1.png"; + case 6: return "alchemicalwizardry:textures/models/SpellEnhancementCost2.png"; + case 7: return "alchemicalwizardry:textures/models/SpellEnhancementCost3.png"; + case 10: return "alchemicalwizardry:textures/models/SpellEnhancementPotency1.png"; + case 11: return "alchemicalwizardry:textures/models/SpellEnhancementPotency2.png"; + case 12: return "alchemicalwizardry:textures/models/SpellEnhancementPotency3.png"; + + } + return "alchemicalwizardry:textures/models/SpellEnhancementPower1.png"; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java new file mode 100644 index 00000000..53dd4ca6 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java @@ -0,0 +1,108 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellModifierBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellModifierBlockItemRenderer implements IItemRenderer +{ + private ModelSpellModifierBlock modelSpellBlock = new ModelSpellModifierBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellModifierDefault.png"; + case 1: return "alchemicalwizardry:textures/models/SpellModifierOffensive.png"; + case 2: return "alchemicalwizardry:textures/models/SpellModifierDefensive.png"; + case 3: return "alchemicalwizardry:textures/models/SpellModifierEnvironmental.png"; + } + return "alchemicalwizardry:textures/models/SpellModifierDefault.png"; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java new file mode 100644 index 00000000..131e4212 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java @@ -0,0 +1,107 @@ +package WayofTime.alchemicalWizardry.common.renderer.block.itemRender; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.common.ForgeDirection; + +import org.lwjgl.opengl.GL11; + +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelSpellParadigmBlock; +import cpw.mods.fml.client.FMLClientHandler; + +public class TESpellParadigmBlockItemRenderer implements IItemRenderer +{ + private ModelSpellParadigmBlock modelSpellBlock = new ModelSpellParadigmBlock(); + + private void renderConduitItem(RenderBlocks render, ItemStack item, float translateX, float translateY, float translateZ) + { + Tessellator tessellator = Tessellator.instance; + + Block block = ModBlocks.blockSpellEffect; + //Icon icon = item.getItem().getIconFromDamage(0); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_CULL_FACE); + /** + * Render the ghost item inside of the Altar, slowly spinning + */ + GL11.glPushMatrix(); + GL11.glTranslatef((float) translateX + 0.5F, (float) translateY + 1.5F, (float) translateZ + 0.5F); + ResourceLocation test = new ResourceLocation(this.getResourceLocationForMeta(item.getItemDamage())); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(test); + GL11.glPushMatrix(); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + //GL11.glRotatef(90F, 0.0F, 0.0F, 1.0F); + //A reference to your Model file. Again, very important. + this.modelSpellBlock.render((Entity) null, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, ForgeDirection.DOWN, ForgeDirection.UP); + //Tell it to stop rendering for both the PushMatrix's + GL11.glPopMatrix(); + GL11.glPopMatrix(); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_LIGHTING); + } + + + /** + * IItemRenderer implementation * + */ + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + switch (type) { + case ENTITY: + return true; + case EQUIPPED: + return true; + case EQUIPPED_FIRST_PERSON: + return true; + case INVENTORY: + return true; + default: + return false; + } + } + + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { + return true; + } + + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + switch (type) { + case ENTITY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + case EQUIPPED: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case EQUIPPED_FIRST_PERSON: + renderConduitItem((RenderBlocks) data[0], item, -0.4f, 0.50f, 0.35f); + break; + case INVENTORY: + renderConduitItem((RenderBlocks) data[0], item, -0.5f, -0.5f, -0.5f); + break; + default: + } + } + + public String getResourceLocationForMeta(int meta) + { + switch(meta) + { + case 0: return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + case 1: return "alchemicalwizardry:textures/models/SpellParadigmSelf.png"; + case 2: return "alchemicalwizardry:textures/models/SpellParadigmMelee.png"; + } + return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java new file mode 100644 index 00000000..7283c01c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java @@ -0,0 +1,334 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.ForgeDirection; + + +public class ModelSpellEnhancementBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer frame1; + ModelRenderer frame2; + ModelRenderer frame3; + ModelRenderer frame4; + ModelRenderer frame5; + ModelRenderer frame6; + ModelRenderer frame7; + ModelRenderer frame8; + ModelRenderer frame9; + ModelRenderer frame10; + ModelRenderer frame11; + ModelRenderer frame12; + ModelRenderer outputMain; + ModelRenderer inputMain; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + ModelRenderer input1; + ModelRenderer input2; + ModelRenderer input3; + ModelRenderer input4; + ModelRenderer outputSecond; + + public ModelSpellEnhancementBlock() + { + textureWidth = 128; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(128, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + frame1 = new ModelRenderer(this, 0, 32); + frame1.addBox(-7F, 5F, -7F, 14, 2, 2); + frame1.setRotationPoint(0F, 16F, 0F); + frame1.setTextureSize(128, 64); + frame1.mirror = true; + setRotation(frame1, 0F, 0F, 0F); + frame2 = new ModelRenderer(this, 24, 19); + frame2.addBox(5F, -5F, -7F, 2, 10, 2); + frame2.setRotationPoint(0F, 16F, 0F); + frame2.setTextureSize(128, 64); + frame2.mirror = true; + setRotation(frame2, 0F, 0F, 0F); + frame3 = new ModelRenderer(this, 0, 19); + frame3.addBox(-7F, -5F, -7F, 2, 10, 2); + frame3.setRotationPoint(0F, 16F, 0F); + frame3.setTextureSize(128, 64); + frame3.mirror = true; + setRotation(frame3, 0F, 0F, 0F); + frame4 = new ModelRenderer(this, 0, 14); + frame4.addBox(-7F, -7F, -7F, 14, 2, 2); + frame4.setRotationPoint(0F, 16F, 0F); + frame4.setTextureSize(128, 64); + frame4.mirror = true; + setRotation(frame4, 0F, 0F, 0F); + frame5 = new ModelRenderer(this, 0, 57); + frame5.addBox(-7F, 5F, 5F, 14, 2, 2); + frame5.setRotationPoint(0F, 16F, 0F); + frame5.setTextureSize(128, 64); + frame5.mirror = true; + setRotation(frame5, 0F, 0F, 0F); + frame6 = new ModelRenderer(this, 0, 44); + frame6.addBox(5F, -5F, 5F, 2, 10, 2); + frame6.setRotationPoint(0F, 16F, 0F); + frame6.setTextureSize(128, 64); + frame6.mirror = true; + setRotation(frame6, 0F, 0F, 0F); + frame7 = new ModelRenderer(this, 24, 44); + frame7.addBox(-7F, -5F, 5F, 2, 10, 2); + frame7.setRotationPoint(0F, 16F, 0F); + frame7.setTextureSize(128, 64); + frame7.mirror = true; + setRotation(frame7, 0F, 0F, 0F); + frame8 = new ModelRenderer(this, 0, 39); + frame8.addBox(-7F, -7F, 5F, 14, 2, 2); + frame8.setRotationPoint(0F, 16F, 0F); + frame8.setTextureSize(128, 64); + frame8.mirror = true; + setRotation(frame8, 0F, 0F, 0F); + frame9 = new ModelRenderer(this, 66, 14); + frame9.addBox(5F, 5F, -5F, 2, 2, 10); + frame9.setRotationPoint(0F, 16F, 0F); + frame9.setTextureSize(128, 64); + frame9.mirror = true; + setRotation(frame9, 0F, 0F, 0F); + frame10 = new ModelRenderer(this, 40, 14); + frame10.addBox(-7F, 5F, -5F, 2, 2, 10); + frame10.setRotationPoint(0F, 16F, 0F); + frame10.setTextureSize(128, 64); + frame10.mirror = true; + setRotation(frame10, 0F, 0F, 0F); + frame11 = new ModelRenderer(this, 66, 0); + frame11.addBox(5F, -7F, -5F, 2, 2, 10); + frame11.setRotationPoint(0F, 16F, 0F); + frame11.setTextureSize(128, 64); + frame11.mirror = true; + setRotation(frame11, 0F, 0F, 0F); + frame12 = new ModelRenderer(this, 40, 0); + frame12.addBox(-7F, -7F, -5F, 2, 2, 10); + frame12.setRotationPoint(0F, 16F, 0F); + frame12.setTextureSize(128, 64); + frame12.mirror = true; + setRotation(frame12, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 78, 36); + outputMain.addBox(6F, -2F, -2F, 2, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(128, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + inputMain = new ModelRenderer(this, 40, 36); + inputMain.addBox(-2F, -2F, -8F, 4, 4, 5); + inputMain.setRotationPoint(0F, 16F, 0F); + inputMain.setTextureSize(128, 64); + inputMain.mirror = true; + setRotation(inputMain, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 80, 30); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(128, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 80, 30); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(128, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 80, 30); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(128, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 80, 30); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(128, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + input1 = new ModelRenderer(this, 40, 27); + input1.addBox(3F, -5F, -8F, 2, 2, 5); + input1.setRotationPoint(0F, 16F, 0F); + input1.setTextureSize(128, 64); + input1.mirror = true; + setRotation(input1, 0F, 0F, 0F); + input2 = new ModelRenderer(this, 40, 27); + input2.addBox(-5F, -5F, -8F, 2, 2, 5); + input2.setRotationPoint(0F, 16F, 0F); + input2.setTextureSize(128, 64); + input2.mirror = true; + setRotation(input2, 0F, 0F, 0F); + input3 = new ModelRenderer(this, 40, 27); + input3.addBox(3F, 3F, -8F, 2, 2, 5); + input3.setRotationPoint(0F, 16F, 0F); + input3.setTextureSize(128, 64); + input3.mirror = true; + setRotation(input3, 0F, 0F, 0F); + input4 = new ModelRenderer(this, 40, 27); + input4.addBox(-5F, 3F, -8F, 2, 2, 5); + input4.setRotationPoint(0F, 16F, 0F); + input4.setTextureSize(128, 64); + input4.mirror = true; + setRotation(input4, 0F, 0F, 0F); + outputSecond = new ModelRenderer(this, 78, 47); + outputSecond.addBox(4F, -3F, -3F, 1, 6, 6); + outputSecond.setRotationPoint(0F, 16F, 0F); + outputSecond.setTextureSize(128, 64); + outputSecond.mirror = true; + setRotation(outputSecond, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputMain, xInputRot, yInputRot, zInputRot); + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(input1, xInputRot, yInputRot, zInputRot); + this.setRotation(input2, xInputRot, yInputRot, zInputRot); + this.setRotation(input3, xInputRot, yInputRot, zInputRot); + this.setRotation(input4, xInputRot, yInputRot, zInputRot); + this.setRotation(outputSecond, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + + core.render(f5); + frame1.render(f5); + frame2.render(f5); + frame3.render(f5); + frame4.render(f5); + frame5.render(f5); + frame6.render(f5); + frame7.render(f5); + frame8.render(f5); + frame9.render(f5); + frame10.render(f5); + frame11.render(f5); + frame12.render(f5); + outputMain.render(f5); + inputMain.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + input1.render(f5); + input2.render(f5); + input3.render(f5); + input4.render(f5); + outputSecond.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java new file mode 100644 index 00000000..a17f229c --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java @@ -0,0 +1,303 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.ForgeDirection; + +public class ModelSpellModifierBlock extends ModelBase +{ + //fields + ModelRenderer core; + ModelRenderer inputMain; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + ModelRenderer Shape6; + ModelRenderer Shape7; + ModelRenderer Shape8; + ModelRenderer Shape9; + ModelRenderer outputMain; + ModelRenderer Shape11; + ModelRenderer Shape12; + ModelRenderer Shape13; + ModelRenderer Shape14; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + + public ModelSpellModifierBlock() + { + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + inputMain = new ModelRenderer(this, 25, 18); + inputMain.addBox(-2F, -2F, -8F, 4, 4, 1); + inputMain.setRotationPoint(0F, 16F, 0F); + inputMain.setTextureSize(64, 64); + inputMain.mirror = true; + setRotation(inputMain, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 0, 13); + Shape2.addBox(-5F, -5F, -8F, 10, 2, 2); + Shape2.setRotationPoint(0F, 16F, 0F); + Shape2.setTextureSize(64, 64); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 27); + Shape3.addBox(-5F, 3F, -8F, 10, 2, 2); + Shape3.setRotationPoint(0F, 16F, 0F); + Shape3.setTextureSize(64, 64); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 16, 18); + Shape4.addBox(3F, -3F, -8F, 2, 6, 2); + Shape4.setRotationPoint(0F, 16F, 0F); + Shape4.setTextureSize(64, 64); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + Shape5 = new ModelRenderer(this, 0, 18); + Shape5.addBox(-5F, -3F, -8F, 2, 6, 2); + Shape5.setRotationPoint(0F, 16F, 0F); + Shape5.setTextureSize(64, 64); + Shape5.mirror = true; + setRotation(Shape5, 0F, 0F, 0F); + Shape6 = new ModelRenderer(this, 0, 32); + Shape6.addBox(-1F, -6F, -7F, 2, 1, 5); + Shape6.setRotationPoint(0F, 16F, 0F); + Shape6.setTextureSize(64, 64); + Shape6.mirror = true; + setRotation(Shape6, 0F, 0F, 0F); + Shape7 = new ModelRenderer(this, 15, 32); + Shape7.addBox(-2F, -6F, -2F, 4, 1, 4); + Shape7.setRotationPoint(0F, 16F, 0F); + Shape7.setTextureSize(64, 64); + Shape7.mirror = true; + setRotation(Shape7, 0F, 0F, 0F); + Shape8 = new ModelRenderer(this, 15, 39); + Shape8.addBox(-2F, 5F, -2F, 4, 1, 4); + Shape8.setRotationPoint(0F, 16F, 0F); + Shape8.setTextureSize(64, 64); + Shape8.mirror = true; + setRotation(Shape8, 0F, 0F, 0F); + Shape9 = new ModelRenderer(this, 0, 39); + Shape9.addBox(-1F, 5F, -7F, 2, 1, 5); + Shape9.setRotationPoint(0F, 16F, 0F); + Shape9.setTextureSize(64, 64); + Shape9.mirror = true; + setRotation(Shape9, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 51, 23); + outputMain.addBox(7F, -2F, -2F, 1, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(64, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + Shape11 = new ModelRenderer(this, 13, 46); + Shape11.addBox(5F, -2F, -2F, 1, 4, 4); + Shape11.setRotationPoint(0F, 16F, 0F); + Shape11.setTextureSize(64, 64); + Shape11.mirror = true; + setRotation(Shape11, 0F, 0F, 0F); + Shape12 = new ModelRenderer(this, 0, 46); + Shape12.addBox(5F, -1F, -7F, 1, 2, 5); + Shape12.setRotationPoint(0F, 16F, 0F); + Shape12.setTextureSize(64, 64); + Shape12.mirror = true; + setRotation(Shape12, 0F, 0F, 0F); + Shape13 = new ModelRenderer(this, 0, 56); + Shape13.addBox(-6F, -1F, -7F, 1, 2, 5); + Shape13.setRotationPoint(0F, 16F, 0F); + Shape13.setTextureSize(64, 64); + Shape13.mirror = true; + setRotation(Shape13, 0F, 0F, 0F); + Shape14 = new ModelRenderer(this, 13, 56); + Shape14.addBox(-6F, -2F, -2F, 1, 4, 4); + Shape14.setRotationPoint(0F, 16F, 0F); + Shape14.setTextureSize(64, 64); + Shape14.mirror = true; + setRotation(Shape14, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 51, 18); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(64, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 51, 18); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(64, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 51, 18); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(64, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 51, 18); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(64, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + } + + public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) + { + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(inputMain, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape2, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape3, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape4, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape5, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape6, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape7, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape8, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape9, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape12, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape11, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape13, xInputRot, yInputRot, zInputRot); + this.setRotation(Shape14, xInputRot, yInputRot, zInputRot); + + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + + + core.render(f5); + inputMain.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + Shape5.render(f5); + Shape6.render(f5); + Shape7.render(f5); + Shape8.render(f5); + Shape9.render(f5); + outputMain.render(f5); + Shape11.render(f5); + Shape12.render(f5); + Shape13.render(f5); + Shape14.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + } + + private void setRotation(ModelRenderer model, float x, float y, float z) + { + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) + { + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); + } + +} + diff --git a/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java new file mode 100644 index 00000000..c86c18a4 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java @@ -0,0 +1,234 @@ +package WayofTime.alchemicalWizardry.common.renderer.model; + +//Date: 07/03/2014 9:30:25 PM +//Template version 1.1 +//Java generated by Techne +//Keep in mind that you still need to fill in some blanks +//- ZeuX + + + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.Entity; +import net.minecraftforge.common.ForgeDirection; + +public class ModelSpellParadigmBlock extends ModelBase +{ +//fields + ModelRenderer core; + ModelRenderer outputMain; + ModelRenderer output1; + ModelRenderer output2; + ModelRenderer output3; + ModelRenderer output4; + ModelRenderer Shape1; + ModelRenderer Shape2; + ModelRenderer Shape3; + ModelRenderer Shape4; + ModelRenderer Shape5; + +public ModelSpellParadigmBlock() +{ + textureWidth = 64; + textureHeight = 64; + + core = new ModelRenderer(this, 0, 0); + core.addBox(-3F, -3F, -3F, 6, 6, 6); + core.setRotationPoint(0F, 16F, 0F); + core.setTextureSize(64, 64); + core.mirror = true; + setRotation(core, 0F, 0F, 0F); + outputMain = new ModelRenderer(this, 0, 13); + outputMain.addBox(6F, -2F, -2F, 2, 4, 4); + outputMain.setRotationPoint(0F, 16F, 0F); + outputMain.setTextureSize(64, 64); + outputMain.mirror = true; + setRotation(outputMain, 0F, 0F, 0F); + output1 = new ModelRenderer(this, 0, 22); + output1.addBox(5F, -5F, -5F, 3, 2, 2); + output1.setRotationPoint(0F, 16F, 0F); + output1.setTextureSize(64, 64); + output1.mirror = true; + setRotation(output1, 0F, 0F, 0F); + output2 = new ModelRenderer(this, 0, 22); + output2.addBox(5F, -5F, 3F, 3, 2, 2); + output2.setRotationPoint(0F, 16F, 0F); + output2.setTextureSize(64, 64); + output2.mirror = true; + setRotation(output2, 0F, 0F, 0F); + output3 = new ModelRenderer(this, 0, 22); + output3.addBox(5F, 3F, -5F, 3, 2, 2); + output3.setRotationPoint(0F, 16F, 0F); + output3.setTextureSize(64, 64); + output3.mirror = true; + setRotation(output3, 0F, 0F, 0F); + output4 = new ModelRenderer(this, 0, 22); + output4.addBox(5F, 3F, 3F, 3, 2, 2); + output4.setRotationPoint(0F, 16F, 0F); + output4.setTextureSize(64, 64); + output4.mirror = true; + setRotation(output4, 0F, 0F, 0F); + Shape1 = new ModelRenderer(this, 0, 28); + Shape1.addBox(-5F, -5F, -1F, 10, 1, 2); + Shape1.setRotationPoint(0F, 16F, 0F); + Shape1.setTextureSize(64, 64); + Shape1.mirror = true; + setRotation(Shape1, 0F, 0F, 0F); + Shape2 = new ModelRenderer(this, 25, 28); + Shape2.addBox(-5F, -4F, -4F, 1, 8, 8); + Shape2.setRotationPoint(0F, 16F, 0F); + Shape2.setTextureSize(64, 64); + Shape2.mirror = true; + setRotation(Shape2, 0F, 0F, 0F); + Shape3 = new ModelRenderer(this, 0, 33); + Shape3.addBox(-5F, 4F, -1F, 10, 1, 2); + Shape3.setRotationPoint(0F, 16F, 0F); + Shape3.setTextureSize(64, 64); + Shape3.mirror = true; + setRotation(Shape3, 0F, 0F, 0F); + Shape4 = new ModelRenderer(this, 0, 38); + Shape4.addBox(-5F, -1F, -5F, 10, 2, 1); + Shape4.setRotationPoint(0F, 16F, 0F); + Shape4.setTextureSize(64, 64); + Shape4.mirror = true; + setRotation(Shape4, 0F, 0F, 0F); + Shape5 = new ModelRenderer(this, 0, 43); + Shape5.addBox(-5F, -1F, 4F, 10, 2, 1); + Shape5.setRotationPoint(0F, 16F, 0F); + Shape5.setTextureSize(64, 64); + Shape5.mirror = true; + setRotation(Shape5, 0F, 0F, 0F); +} + +public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5, ForgeDirection input, ForgeDirection output) +{ + super.render(entity, f, f1, f2, f3, f4, f5); + setRotationAngles(f, f1, f2, f3, f4, f5, entity); + float xInputRot = 0.0f; + float yInputRot = 0.0f; + float zInputRot = 0.0f; + float xOutputRot = 0.0f; + float yOutputRot = 0.0f; + float zOutputRot = 0.0f; + + switch (input) + { + case NORTH: + xInputRot = 0.0f; + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case EAST: + xInputRot = 0.0f; + yInputRot = (float) (0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case SOUTH: + xInputRot = 0.0f; + yInputRot = (float) (1.0f * Math.PI); + zInputRot = 0.0f; + break; + + case WEST: + xInputRot = 0.0f; + yInputRot = (float) (-0.5f * Math.PI); + zInputRot = 0.0f; + break; + + case UP: + xInputRot = (float) (-0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + case DOWN: + xInputRot = (float) (0.5f * Math.PI); + yInputRot = 0.0f; + zInputRot = 0.0f; + break; + + default: + break; + } + + switch (output) + { + case NORTH: + xOutputRot = 0.0f; + yOutputRot = (float) (0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case EAST: + xOutputRot = 0.0f; + yOutputRot = (float) (1.0f * Math.PI); + zOutputRot = 0.0f; + break; + + case SOUTH: + xOutputRot = 0.0f; + yOutputRot = (float) (-0.5f * Math.PI); + zOutputRot = 0.0f; + break; + + case WEST: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = 0.0f; + break; + + case UP: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (-0.5f * Math.PI); + break; + + case DOWN: + xOutputRot = 0.0f; + yOutputRot = 0.0f; + zOutputRot = (float) (0.5f * Math.PI); + break; + + default: + break; + } + + this.setRotation(outputMain, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(output4, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape1, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape2, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape3, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape4, xOutputRot, yOutputRot, zOutputRot); + this.setRotation(Shape5, xOutputRot, yOutputRot, zOutputRot); + core.render(f5); + outputMain.render(f5); + output1.render(f5); + output2.render(f5); + output3.render(f5); + output4.render(f5); + Shape1.render(f5); + Shape2.render(f5); + Shape3.render(f5); + Shape4.render(f5); + Shape5.render(f5); +} + +private void setRotation(ModelRenderer model, float x, float y, float z) +{ + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; +} + +public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) +{ + super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); +} + +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java b/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java index cdb5db03..76e2f2c0 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java @@ -1,6 +1,7 @@ package WayofTime.alchemicalWizardry.common.rituals; import WayofTime.alchemicalWizardry.common.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; import net.minecraft.entity.player.EntityPlayer; @@ -84,7 +85,7 @@ public class RitualEffectFeatheredKnife extends RitualEffect { entity = (EntityPlayer) iterator1.next(); - if (entity.getClass().equals(EntityPlayerMP.class) || entity.getClass().equals(EntityPlayer.class)) + if (!SpellHelper.isFakePlayer(world, entity)) { entityCount++; } @@ -110,7 +111,7 @@ public class RitualEffectFeatheredKnife extends RitualEffect entity = (EntityPlayer) iterator2.next(); //entity = (EntityPlayer)iterator1.next(); - if (entity.getClass().equals(EntityPlayerMP.class) || entity.getClass().equals(EntityPlayer.class)) + if (!SpellHelper.isFakePlayer(world, entity)) { if (entity.getHealth() > 6.2f) { diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java index 33d7baab..fbd54cb8 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -524,7 +524,7 @@ public class EntitySpellProjectile extends Entity implements IProjectile { for(IProjectileImpactEffect impactEffect : impactList) { - impactEffect.onEntityImpact(mop); + impactEffect.onEntityImpact(mop,this); } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java index af5709e0..030abd06 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -3,141 +3,134 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeDefensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.MeleeOffensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileDefensiveEarth; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ProjectileOffensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfDefaultEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfDefensiveEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.SelfOffensiveEarth; public class SpellEffectEarth extends SpellEffect { @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileOffensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefensiveEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { parad.addUpdateEffect(new ProjectileEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - } @Override public void defaultModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void offensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfOffensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); } @Override public void defensiveModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfDefensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); } @Override public void environmentalModificationSelf(SpellParadigmSelf parad) { - // TODO Auto-generated method stub - + parad.addSelfSpellEffect(new SelfEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defaultModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void offensiveModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeOffensiveEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeDefensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override public void environmentalModificationMelee(SpellParadigmMelee parad) { - // TODO Auto-generated method stub - + parad.addWorldEffect(new MeleeEnvironmentalEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); } @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow((0.5*(this.powerEnhancement)+1)*2 + 1,3)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + + return (int)(10*(1.5*this.potencyEnhancement+1)*(Math.pow(1*this.powerEnhancement+1,2))*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(3*Math.pow((this.powerEnhancement*2+1),2)*(this.potencyEnhancement*2+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*2*(0.1d*(this.potencyEnhancement+1))*Math.pow(3.47,this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefaultSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(20*Math.pow(1.5*powerEnhancement+1,2)*(2*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow(2*this.powerEnhancement+1,2)*(this.potencyEnhancement+1)); } @Override protected int getCostForDefenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(750*(1.1*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -150,28 +143,24 @@ public class SpellEffectEarth extends SpellEffect @Override protected int getCostForDefaultMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(50*Math.pow(1.5*this.potencyEnhancement + 1,3)*(0.5*this.powerEnhancement + 1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(20*Math.pow(1.5*this.powerEnhancement+1,3)*(0.25*this.powerEnhancement+1)); } @Override protected int getCostForDefenseMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(5*(1.2*this.powerEnhancement+1)*(1.0f/3.0f*Math.pow(this.potencyEnhancement,2)+2+1.0f/2.0f*this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentMelee() { - // TODO Auto-generated method stub - return 0; + return (int)(500*Math.pow(2*this.potencyEnhancement+1, 3)*(0.25*this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java index 65fe51f7..4800871f 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -4,6 +4,9 @@ import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileDefensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileEnvironmentalFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ProjectileOffensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefaultFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfDefensiveFire; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfEnvironmentalFire; @@ -21,25 +24,19 @@ public class SpellEffectFire extends SpellEffect @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileOffensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addImpactEffect(new ProjectileDefensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - parad.addImpactEffect(new ProjectileDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - parad.damage+=this.potencyEnhancement; + parad.addUpdateEffect(new ProjectileEnvironmentalFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override @@ -97,48 +94,43 @@ public class SpellEffectFire extends SpellEffect @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)((5*Math.pow(1.5*this.powerEnhancement+1, 2)*(1.5*this.potencyEnhancement+1)+this.potencyEnhancement*15)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(10*Math.pow((this.powerEnhancement)*1.3+1,2)*((1.5*this.potencyEnhancement+1))*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(25*Math.pow(1*this.powerEnhancement+1,2)*(1*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(75*(0.5*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefaultSelf() { - return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)); + return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseSelf() { - return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)); + return 500*(int)((this.powerEnhancement+1)*Math.pow(2, potencyEnhancement)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForDefenseSelf() { - // TODO Auto-generated method stub - return 0; + return (int)(25*(3*this.potencyEnhancement+1)*(2*this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -174,5 +166,4 @@ public class SpellEffectFire extends SpellEffect // TODO Auto-generated method stub return 0; } - } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java index de3ca561..0edb3596 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -3,36 +3,34 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmMelee; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmProjectile; import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmSelf; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileDefaultWind; import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileEnvironmentalWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ProjectileOffensiveWind; public class SpellEffectWind extends SpellEffect { @Override public void defaultModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileDefaultWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void offensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.addImpactEffect(new ProjectileOffensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); } @Override public void defensiveModificationProjectile(SpellParadigmProjectile parad) { - // TODO Auto-generated method stub - + parad.ricochetMax+=this.potencyEnhancement; } @Override public void environmentalModificationProjectile(SpellParadigmProjectile parad) { parad.addUpdateEffect(new ProjectileEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); - } @Override @@ -94,15 +92,13 @@ public class SpellEffectWind extends SpellEffect @Override protected int getCostForDefaultProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override protected int getCostForOffenseProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(100*(0.5*this.potencyEnhancement+1)*(this.powerEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override @@ -115,8 +111,7 @@ public class SpellEffectWind extends SpellEffect @Override protected int getCostForEnvironmentProjectile() { - // TODO Auto-generated method stub - return 0; + return (int)(50*(this.powerEnhancement+1)*(this.potencyEnhancement+1)*Math.pow(0.8, costEnhancement)); } @Override diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 17717243..7d82d9d7 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -1,10 +1,11 @@ package WayofTime.alchemicalWizardry.common.spell.complex.effect; +import java.util.ArrayList; import java.util.List; import java.util.Random; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; import net.minecraft.block.Block; +import net.minecraft.block.BlockFluid; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -16,6 +17,11 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.FakePlayer; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.PacketHandler; +import cpw.mods.fml.common.network.PacketDispatcher; +import cpw.mods.fml.common.network.Player; public class SpellHelper { @@ -46,6 +52,11 @@ public class SpellHelper return world.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(posX-0.5f, posY-0.5f, posZ-0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(horizontalRadius, verticalRadius, horizontalRadius)); } + public static List getPlayersInRange(World world, double posX, double posY, double posZ, double horizontalRadius, double verticalRadius) + { + return world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(posX-0.5f, posY-0.5f, posZ-0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(horizontalRadius, verticalRadius, horizontalRadius)); + } + public static double gaussian(double d) { return d * ((rand.nextFloat() - 0.5D)); @@ -110,6 +121,11 @@ public class SpellHelper } } + public static String getUsername(EntityPlayer player) + { + return player.getDisplayName(); + } + public static boolean isFakePlayer(World world, EntityPlayer player) { if(world.isRemote) @@ -135,4 +151,82 @@ public class SpellHelper return false; } + + public static void smashBlock(World world, int posX, int posY, int posZ) + { + Block block = Block.blocksList[world.getBlockId(posX, posY, posZ)]; + + if(block==Block.stone) + { + world.setBlock(posX, posY, posZ, Block.cobblestone.blockID); + return; + } + else if(block==Block.cobblestone) + { + world.setBlock(posX, posY, posZ, Block.gravel.blockID); + return; + } + else if(block==Block.gravel) + { + world.setBlock(posX, posY, posZ, Block.sand.blockID); + return; + } + } + + public static boolean isBlockFluid(Block block) + { + return block instanceof BlockFluid; + } + + public static void evaporateWaterBlock(World world, int posX, int posY, int posZ) + { + Block block = Block.blocksList[world.getBlockId(posX, posY, posZ)]; + + if(block == Block.waterMoving || block == Block.waterStill) + { + world.setBlockToAir(posX, posY, posZ); + } + } + + public static ItemStack getDustForOre(ItemStack item) + { + String oreName = OreDictionary.getOreName(OreDictionary.getOreID(item)); + + if(oreName.contains("ore")) + { + String lowercaseOre = oreName; + lowercaseOre.toLowerCase(); + boolean isAllowed = false; + + for(String str : AlchemicalWizardry.allowedCrushedOresArray) + { + if(lowercaseOre.contains(str)) + { + isAllowed = true; + } + } + + if(!isAllowed) + { + return null; + } + + String dustName = oreName.replace("ore", "dust"); + + ArrayList items = OreDictionary.getOres(dustName); + + if(items!=null && items.size()>=1) + { + return(items.get(0).copy()); + } + } + + return null; + } + + public static void setPlayerSpeedFromServer(EntityPlayer player, double xVel, double yVel, double zVel) + { + PacketDispatcher.sendPacketToPlayer(PacketHandler.getPlayerVelocitySettingPacket(xVel, yVel, zVel), (Player)player); + + } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java index 2f2cbf92..3893f578 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java @@ -6,6 +6,6 @@ import net.minecraft.world.World; public interface IProjectileImpactEffect { - public void onEntityImpact(Entity mop); + public void onEntityImpact(Entity mop, Entity proj); public void onTileImpact(World world, MovingObjectPosition mop); } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java new file mode 100644 index 00000000..f4ab64e1 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public abstract class MeleeSpellCenteredWorldEffect extends MeleeSpellWorldEffect +{ + protected float range; + + public MeleeSpellCenteredWorldEffect(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onWorldEffect(World world, EntityPlayer entityPlayer) + { + Vec3 lookVec = entityPlayer.getLook(range).normalize(); + int x = (int)(entityPlayer.posX + lookVec.xCoord*range); + int y = (int)(entityPlayer.posY + entityPlayer.getEyeHeight() + lookVec.yCoord*range); + int z = (int)(entityPlayer.posZ + lookVec.zCoord*range); + + this.onCenteredWorldEffect(entityPlayer, world, x, y, z); + } + + public void setRange(float range) + { + this.range = range; + } + + public abstract void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ); +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java new file mode 100644 index 00000000..28bd2dd1 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java @@ -0,0 +1,41 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityFallingSand; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellCenteredWorldEffect; + +public class MeleeDefaultEarth extends MeleeSpellCenteredWorldEffect +{ + public MeleeDefaultEarth(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3*power + 2); + } + + @Override + public void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ) + { + int radius = this.potencyUpgrades; + + for(int i=-radius; i<=radius; i++) + { + for(int j=-radius; j<=radius; j++) + { + for(int k=-radius; k<=radius; k++) + { + if(!world.isAirBlock(posX + i, posY + j, posZ + k) && world.getBlockTileEntity(posX + i, posY + j, posZ + k)==null) + { + int id = world.getBlockId(posX + i, posY + j, posZ + k); + int meta = world.getBlockMetadata(posX + i, posY + j, posZ + k); + + EntityFallingSand entity = new EntityFallingSand(world, posX + i + 0.5f, posY + j + 0.5f, posZ + k + 0.5f, id, meta); + world.spawnEntityInWorld(entity); + } + } + } + } + + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java new file mode 100644 index 00000000..49b3081d --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java @@ -0,0 +1,37 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.MeleeSpellCenteredWorldEffect; + +public class MeleeDefensiveEarth extends MeleeSpellCenteredWorldEffect +{ + public MeleeDefensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3*power+2); + } + + @Override + public void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ) + { + ForgeDirection dir = SpellHelper.getDirectionForLookVector(player.getLook(1)); + + int vertRadius = (int)(2 + 1.0f/2.0f*Math.pow(this.potencyUpgrades,2)+1.0f/2.0f*this.potencyUpgrades); + int horizRadius = this.potencyUpgrades+1; + + int xOff = dir.offsetX; + int zOff = dir.offsetZ; + + for(int i=-horizRadius; i<=horizRadius; i++) + { + for(int j=0; j=-vertRange; j--) + { + if(!world.isAirBlock(posX+i, posY+j, posZ+k)&&!SpellHelper.isBlockFluid(Block.blocksList[world.getBlockId(posX+i, posY+j, posZ+k)])) + { + BlockTeleposer.swapBlocks(world, world, posX+i, posY, posZ+k, posX+i, posY+j, posZ+k); + + break; + } + } + } + } + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java new file mode 100644 index 00000000..d0053320 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfDefensiveEarth extends SelfSpellEffect +{ + + public SelfDefensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + int pot = 2*this.potencyUpgrades + 1; + int duration = 20*60*(this.powerUpgrades+1); + + player.addPotionEffect(new PotionEffect(Potion.field_76434_w.id,duration, pot)); + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id, duration, pot)); + } +} diff --git a/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java new file mode 100644 index 00000000..a19b3f39 --- /dev/null +++ b/BM_src/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfEnvironmentalEarth extends SelfSpellEffect +{ + public SelfEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + int horizRadius = this.powerUpgrades + 1; + int vertRadius = this.potencyUpgrades + 2; + + Vec3 blockVec = SpellHelper.getEntityBlockVector(player); + + int posX = (int)(blockVec.xCoord); + int posY = (int)(blockVec.yCoord); + int posZ = (int)(blockVec.zCoord); + + for(int i=-horizRadius; i<=horizRadius; i++) + { + for(int j=0; jigP)WFU8GbZ8()Nlj2>E@cM*00C}EL_t(I%cYasisC>J zhQDq%2ML-46Ez~}mG8ChE^}cDAtn%##;&>ApzEy5?ABFNG=Kl6Hmb`1jQwg^mZg?u zss9XMt>thyP*s&~w_80Pk3ateU>+qHVk6%EXebmD2iCG*Dun3{H{GsQ_klz-g}nIC8~;Z4r2^eRZaH*>bf>h47~Sr zUB@_%0K{>ObB^2X#%wkNU>rxXEPM5!EKA+(b~xv-)*>RraZKO$L{Y?YxkN-Aw6xLhuH?*RycU^+KVLl6Ws zP4kq-9{okAT)t>+e!;rr3xn8g4TL6zhsyZ?JHo&|21j~-hG}&Q0;s5{u M07*qoM6N<$f}m#GP5=M^ literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fa7764537254147c35c1e356ab75ec29a1e0ef GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_-VEMl2N~A^MK}vQ zB8wRq_zr_GH=O_Iu2Hj2h<4_wMck3SIGZaSX9IeRh(s&_M@**8MD^ zT+;*AHF~c+B^mOx=-anLO`n84TYAn0n*3N;FJ+pHO&Xs%KVy->PS|EHewtRV$z?l$E`3Pp_ z$^wB8E6S3*k9IftvC1%{ug<;QueVwfUZ7v!=>Z=Db+|6Zw5=!tJK z&%vJ5ghh8;xq>PK>Si&Ceh4jO`m!%_NkF&BB@X|r=blogx|6b%S2F%PU&*i~!a4QN T)b3e8|1o&F`njxgN@xNATKIKf literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png new file mode 100644 index 0000000000000000000000000000000000000000..49c595c35c93ee2a7ef35adaf6c89dfeeda9cdbf GIT binary patch literal 502 zcmVZ5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-UAK{6Dsi0t2_Vz0fR|I zK~y-)&62%t6G0S4&+g2umvwd>DW(G2Q1~541r)%0SaM+r35f@wK%$~R;(a1&KLElK zP~kYp-ktUQ>|dG$WlbXJ;I?;kbiTPC{ObvBTfBbtvh&^}g&>L|-n@Mm{1sq6n|1)t zp1;65hp#+BNsIG+1ML2E7R0S+da~MV^ypDWxvhZntD@ z$G7ia5kj)f^B$mQa5Nqh1mL~n;2=e7jgpGQnBEn_{VUwN|A3}$`Lg^>kr!yK@l}PjmMl$wD^l+dt}Fl^9v>5_ s2x|>=0Y6q}*WdiP%2$otga3zf0cPm98WtUqV*mgE07*qoM6N<$f=tNOvj6}9 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png new file mode 100644 index 0000000000000000000000000000000000000000..d275736f943f4192cade3ef5c7f388dd7d1877a1 GIT binary patch literal 454 zcmV;%0XhDOP)VGd000McNliru-UA5@F&gc!k3IkZ0aHmt zK~y-)y_4T7L_rkCKWAp{y)GgzQg|V1Np1Xlvhv{XyHY$TdGsSn?B2aUW{!u+Zi^Ku z=WUuf-!tDIM-KM8{G|+kEH~|_KfWz%VRdrHCo8*My3r701!+_1emx@@>CIZ+Dw1Qy?A~Ff! zn-XnG0)PSmf(L6E=@7g{#gWcbpKS~tOaguwxrSy;P#kCp)nJKw@G@ckNQ2|^u3X%M z2-r08HUgGNL6aQga_$!^POrvRehQMw;&cu1N7XZUpW?$DmRm@E5F}ODwBYM^3WnyMF0Q*07*qoM6N<$g55j4eEYueawTGU=YH*LbS$-n(?x42AQ e;`99u2gCAY&!hiyH=O_Iu2HJo=ha+Rc?fq5qyPjv*GO&rUk+ci4f)wLksR z1us#dHI9EcJKm>VJn!hSRQihhq?tQ)=7?PqxF}ok{QAby+#lJSR~~t5yh$>GA+@6Z z=gw=(q@I^AU~zR|e>?lR`Rc^}x#s$E4y;~`LPuCW+JW?!#xCy$tUDvPW*Ub{qH4RB+MPWEU@Ev0%GuaU{upD>J9l z-Tccx)RY^zp6EW=c0M{j#!*#6^ujK^`%CQ^&9v9V{@$gw;Kz{)-rcq@t{$xXeOff7 zuHNc|^>sy#O$VL{%;J{wP)VGd000McNliru-UA5@DIA8^vQhv50d+}4 zK~y-)#ga{K(_j#WpZRRZc0-60+(Mv;RW~d^+@Lq;o@;R#&H&3Ukf;Py>LNCUKpV%2 z?Qez!2oX#wc71pA_vjtXz->!*70Nw~^{+tTU`KB+S%UFG*gHDJT?H_V;9Rj_qigTjgev|9K=JemO%r#hjq^CEa_Ee`h?n>5=|aaTn7yNB~_8 ehd1=zu6_WnH==*`+Ut=30000P)VGd000McNliru-UA5@H3pr+7Igps0d+}4 zK~y-)#gfTR8$l3;zouv69^(bGNJxNCSY$Xrl$VK=Cq!`J4LEQ^IYbr-0tFC?*^JFH z2G4k=d%C$<*fIifp>CzB`fB^(vrW7f@HeXNrLTV;iFX0~jj9WzVr6|5i>0A&iETo7 z&>RX9gT;&M%amk+Fzi9xTjD%z@IAkZFC>9bjCn@_!0R^S}N0ZEn; z+k}U#&7@ah%Byf^?irV5gngpoP2h|LKR+DM{!tSbfBtik-XM`APBZRTxQzc1c5e_u z5qTExY_jhQ-rx-$vksB%qMf0oTU@pGaoQkMfufqHEA-n!0w`4jx^bN-3K4-q)@R-p e(nqBH`SuKE>#Zxx%kgXg0000VGd000McNliru-UA5@G7UvhSvmj!0kla( zK~y-)y_3Oe6Hyd~zkBaYGLtj}8%J#+6&J;gi_+OB?tF$Sf-6_<6kOFOh#=xqxKIK< zNj5GNL3$FGuXMp7&!MVwe5((hc~jcKs&=+g!YC(obY*W(Her%P&eR0$LNQplm)4C z%L<$`RFq&+mfgT( zI2D@C(GP}DYS5Ks1@Zkul@1fW)-yt@3ACo+8BD2Y=#r5?fy9RspZM`pwVFh|0H+`j z3>L4nL?X0OfxG}$gL=Lm<@nJv#rIQw4u)9Y66PS|1vv$bH6-W651*^QlKA_qZ(qw+ p*gOc03&Bbd^HSNl@ zoxV36|yh`RVo8B|;Swmf2cp84PckZ^} jP&1s-oFLSE{0HM=TVIavpN{VZx}Cw()z4*}Q$iB}5pr$7 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png b/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png new file mode 100644 index 0000000000000000000000000000000000000000..40606587c0ad2ab997f8922a98b01baaa799046a GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({xitX5C6w)^mS#w$IQvV%lzs6S&&gHJzX3_EKa|@WaxJ|K*05)@qNCC zO$@B5>^l6NQx&ewXcG&RIKDBN-_=9XRVnw~m+<_wxSZGG*8^fs`a1CPYrTIP%~$3B zF~{iEOCQUon=DR&A#%xYxBl+Ai=P(S4H^(T{c{G zI^Qm?zB+5a;PDP`J-6l~GpgCyYs>cem}M2N^l09)IV1Glxw{X9vakN%e_>A9PScM% a`%nI~J#jyG$3CE=89ZJ6T-G@yGywpJRc-|U literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png new file mode 100644 index 0000000000000000000000000000000000000000..77af87239ab5a01dcd417af7f5bb35a3a012ebb7 GIT binary patch literal 461 zcmV;;0W$uHP)VGd000McNliru-UA5?IUwS=wzB{L0a{5! zK~y-)#nMe{Q$ZBQ@!!o&n?@5`6jXH6t^~ndcPd@Qjp9P^yZI%=t+b$m1y^p>jVKiH zElF<^)BBQ_adEY`wTasv7-r6y^ZaM#%;BspTC}mfE*$soeV(5iEfRL_-y}ce@E7OX zc6L6^1x5dgJDm+KU1#qd@e<>_9PtwAz;2(ryOpkX>Q0w8=zS^Yan2~ANJ$4^nw?BP z0=(K3I*&H#?a{he21m&${#Kh8x2pQo|1RPc)atBW;p5x#)F}!qquD%)rC%#x1!y$M zM;!blO-tdq76HQv{k#OdXPC@+LYPfC_(AfG80`z}=fr_VL1RV_eOj$KfZH#N=*{=E z+L;yXHyO^D%;@3+Pa_^A)i2bK7ic;f&_IS-#?`D84wdzou+skHFS6Hngza@9JQTtW zAuJ1FO?VOs&l)GY^S`b9{F;z;>5f^g^LV^C_iXJqNK=L_`VB}A00000NkvXXu0mjf Dqb$tE literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png new file mode 100644 index 0000000000000000000000000000000000000000..33dc2d425064582429903fa52f7d197d814c2a3d GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_-VEMl2N~A^MK}vQ zB8wRq_zr_GH=O_Iu2HJgh=TyqA>%h2D9(IEGl9K03)T@2~-n>wFFM z0&eja6IOaZpQo69Dzj+WJ+;V5hofoZqL?iOy%m!CgRRZQ*HdBVip8H-oJuM) zan!vXajD%xu(qCcQrJ{hx98@Hxxwf6mWY>`b_xm{w-r|LaJtU_^3BJ2ryOsbcBwP% iRM9=#`uDH-K1QZhMO!V^U1tNG&fw|l=d#Wzp$PzReQR9+ literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png b/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..2b84b9765924ce2c92b0dd29a9d3551d3cd44f83 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)2d5J`7&lR{mZK6yYrJ zh%9Dc;5!V$jK}j=qyPokOFVsD+3zuP@^Yx}cJ`YJ6x#3U;uvCadTH=M-opw!CLNrU z{>)tXHo-$s>laZ=pUpdtS)VZc!(dodF5v#YYxBbQ33tmZWIQ-7^DHiJoxpO| zbBfN+he=VJdY>4ab>-2E>Ak?E`*d08O6ixjeu5Qg|I}=nc5VvGUi^aL_pM8ARpAc} y{(hSJ(ni8c!P{r1b*9|1{8CnigtfVOkJ-=cD{3q4x&9aE6$VdNKbLh*2~7a3)^U0O literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png new file mode 100644 index 0000000000000000000000000000000000000000..6719e820c1817ac7267f3075894610f562221dd5 GIT binary patch literal 478 zcmV<40U`d0P)VGd000McNliru-UA5%3?V;O*T4V(0c%M_ zK~y-)t<%A36JZp^@!vO-WC&K#hSHT-72m*xAc9>8E=An&?q}>sH5y&l+|4(`rGFvIGFvOM|KGpyH_~v4 URlWBA>Hq)$07*qoM6N<$f|@eYhyVZp literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png b/resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png new file mode 100644 index 0000000000000000000000000000000000000000..46e59b32a340819bda956cc1a8e0e8c29e9c6ae2 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkETanla&UQgo+-%dN@?#R4Y}4Mzd4*Zo>a=+ z+Sa;NEKtNTyLa7d28P219h)7#?Bh^ekSWEXc;L*1C}xIJo9?(A( zb(i&l+WYVO_;@C%G=7(hdVM=BnP-#EZYPyR0imKjhW$^D7q$d>#Yh+!@A1~*=M{neamzemgM85!1J=e}%WtNt-2-F<)AhsnQ~*y`qOTRVB1ASkdrUHx3v IIVCg!0PX3a4*&oF literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png b/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..bd01c9b96e850de88cae7c55b017238717c659a7 GIT binary patch literal 481 zcmV<70UrK|P)WFU8GbZ8()Nlj2>E@cM*00BiwL_t(I%cYYsPr^_T z$A3qRwM173CPTu&=IF<;3=$Iu62F{_fyv3i&DGgR!a&mKU_c75VC^}0uT~&v$~LRA?qejPk%;~q0MMz|X^Uv<7m$=o5D`v6JIy9(5D<>XxH#r2O#$et z$}(W5{GzHvB50QJHW-jQ#|&s$pf9To`k^2a(aT1IEJ+x}F*y(b@3sTH0C)D>Rh1PF zG|O0wMg%|zd;lqs0M1}1>pW;zt9ntZk@Wk;p#v7c0Wde%6YvQ1EVodwa1P|Fw9IY- z5MbhCOqKVmFfkI*^Dso@+hl*ESkM%>HxF)0CKd{=f!T0aP%D-!z|2$~0{ff#!2hN* zOPB&VuxGVD05?m$AnRtqgN}h+;5iJL%;&u3`ARd%reX4+BVh2CPF!9-VbfsAw&VN> X6Wy4XZvL^Y00000NkvXXu0mjf2G+tI literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e9bab691060a86a3e2d010919ee944e055dd4a GIT binary patch literal 433 zcmV;i0Z#sjP)VGd000McNliru-UA5?C>IIbFsuLo0X|7Y zK~y-)#gffR0#O)-pBbk@X%P{D$UsE}bp@^31c5GsT34GcArQI(!Apo%<|6trq;<3k zx&c=%Z6kpe>6szZw?&gUzOFM{&j znz~(|-EA9~1*U*1=cPIThx^f@+?H1*Z(TA;$)qK7B$-Lc&|ifj8pPP4i|v4#z%q(& z0uMk8tW>0^J!pMrD+WxXcqVx50CS*rA8@b-gD#w(L#NXMd|(61y9XWv{`N0b&mZEz z_v^qsAm9`5!e9a2?^dNUgrL{^0IEO>cnM1i=mopLbt49Hb(56Lie#2Tlh-@a8&U&h zPr|?8ghF9C!1GYs08GH*!XMGRxSUa;h|~&HUy+*VIEzlt!s;WVoXev|10=9*$md2R baIEzOzk`?B*H-nU00000NkvXXu0mjf0PC^| literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png b/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1103225d80d74642e7008218ac4b0c1816f2c3 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({F}bqv)PWuGwvMK}vQ zB8wRq_zr_GH=O_Iu2n4BGq_?M$&ip@W_-jv*GOljqD@ecpjHLCO7c z%iH*W{x|+TweMm)(bQt%?(UjU?pPAS!ffZ9Fl)MA^ud4!Cl7ZdIW(&CKfaWzT_Dxu zYuv_NAlc+?%nSs|+aek=Z*0qDKm40tUZNoLSSABd^zfm_I{%9|6-&IkyT3Wu_+CcM z|A)+n_x>)Im?9D?!NSVo;mv-cZk|yoSM&7g?B{MIDv8|sIIaG}F+O3#z*haPnH`;4 wHEjlhizV+0^klTm?C>|%JK(g=O@e_T{nWfIWxIb&1$u_T)78&qol`;+0ORv*1^@s6 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png b/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png new file mode 100644 index 0000000000000000000000000000000000000000..329d46bc7e70fef9460479dc10ab5b83ff5cb8b7 GIT binary patch literal 316 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 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png b/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a340ef754b97c9b9be376f9c2e8d0faabd8734b GIT binary patch literal 3603 zcmV+u4(#!XP)VGd000McNliru-U1pIF${MG%?JPh4WLOx zK~#9!?VaCm9M^TnKljee?u;Z$vfR}1gPQ^+QDx<&O4|)k@A;l{F4ebQeMtb`ICDvn6Z@YL{sg!Udyc*}p5H)3f`S$?tSJ zxUS2vi(Ov%nS_7^>;!gz+=M^f@i`(TeB%BuY7eM8AT7Y({DH)A+&4w@eIKngTI-=# zfOSV86;RtjIe-GS18)BJZI-=d2q9huiGj{w4CKhcui{p#1VPYq1(=yWfKrNPvpM`0 zVBLXg5DV1fz%9Um=HpFtC0X%WfD{uD4~P>+NQP7a>{AHM)aQpFZBTpCqb-o%fvP4J0F@|%@=^tf zQYR9D{e6Tmd5;1cH2DwWFcD}dW^`MmuE zO2Hq)Pg#yuP`5$uB$KYbkec`icqEAmq?6zSNP*&=WYQ%{jv>HrQl;sWoS0qc3o4J} zm{ao?QA!~qTL1($VWqvyO>UufgZG$=t?VTBkCO-hFP&&7d9SJ2x~SmPHtbTSEcbQJWk32EV`k2f}uQhX<8}CeJ?}B#iT)16_kB9Pk5UTDvU;j$q@08A`$Mk)%Kj$=Nmje@?ePuJ zE5H|09$*z)hn!Q!Ga44-Y=gkhMV`}BJ!W*1Vhlvo#YJTKBD~yz#C`YE&wyb*7bM%2!f%{ z2I?}H38RQ84C!<_+2osJ#(#!k$n@09nQzU%@{%dxbGWIi*W)VW`iYsByhr{*uN%FMOfZCux-QmL?ia#G?r z&KSuuF3?&Rn7l9U+b6~f=I>MfURbI)GT_#X&4kY8w^b??I-SnIf?hihWR4zsY1IiE zEqYuFD4D{_`?>yFDO!MIIT~7Pon_wgmAc!uZCjHZa$R>-8M$$NWm$_33Sj)T=XvMT^1x@K*}8r8x|Bhc=eo4oZEVYWC<`-)wDR6s zO_q)~pb2B=Yb?FmNTPw)2D@#>zTTt4iEb&-Fp2yRsJ}4gldL#)pe=xTQ=ga+r4*zU zKPHyVSI1hGRZwSbSsXp|60`Fc3uDzlZNGSFdN(@P}VpOg{9}y%QbPm>3hk~$(n9LHRH z|NRGA8ShRNF~y7XcU_D*mj7%d_fUXxOnqwpB8VVstll%{eu8b=L{U^=^YW%Xze**J zv)aK^hP5k27TwAQj%0%vV3@@IK0=iES}dTNm|Y1#`4E1u|Kl1~a>^b?1&}z|z=CZ_ z*`bo8KT+8ryEf-Hneumo3x-98a+90!b2X?WtAG4#jj^+}WCybeLsg3CAse~k@P8d;Xb*lcm4 z$4=Lhem^#6^_8QWVPPi=7Qn>WQ4|q`VIi$~Vs-(EVeadN;X%QrMP-W7}ED zcs_hIE5n4DmSt^th5XmdV)lM%rol(AB&?g`I4r%^=$p^qTdT?5T20FS|HSM9=5zBJ z_$c7i{Kc$ZZ!OI>D}C3lU0HXn@B6Ewf%%1ZvJkIaUtkof;y4^l3pMVUtoQ*U9jIS^ zns&R*(rXRmCXCM~7GUY622z3Xg&MBwa{bU1&@lGnqJ`)-5wp6A`mQV;ZGcn!4FgRC zb3m8 zDIGtS!%%}77OK2S%a>pE+GO7E_3a-Z(t_~|wamN|v;{B|lyBVV_5-W$-!Ep5-HlxT;Fteg z0M7s7H)^f_ulLzV)=_|o{rja81XQb4L?qb-E7!oWQAH@PeB%!d*c`QpZ88s_w8pJg zX{RgSgmAs6t@k{yP|7__jM;-K{IDptt&}RXaciYeDVw#{j#v*X)pR50ZeDXFT_%D6 z+P=@!fv*%0Y&RIPa+=t-?JdzeQ?Js?+fplQvLPA94xs;`EH$cH( zo%<5EZ{Hrs@!G!c6sq3%^YEQ2x&WQ-EHZq^-*IDVvNuGq@&hlGG?Z zLSphOfD0=tE68n7PYmEV@;=RV-Mc%5q^sYAiR*3ZkUy@JLTk;TufI?@XW?J|4H4ni zty>xJ8}^RgJjI>IIA*8t@?S68zI{7)?%Wx;1yP7t!!RTW0y>=zK@b!MVg6r!nP|a$ z&-eYp29qad7r1%zCe3D(UAuPmbO*0~i{m&f9dGdA;cKg&6Ts4IjjTdxP-$z2tW9R9|OnUWY&X;#DWBd=_!-u`@AxZIpFs7)){OrYro`YcU# zUAOQm$MQ4N2k<-($8l&jo7v>U-6oSLiU@*WRny5VGd000McNliru-U1pE95$9I=7|6R4@OBu zK~#9!?VVq2TX|N;Kj-@TCQh6sn8bfukT z8IX2C0`bJYEilpmD`u9J_Ibn$(n_FeUXX(jVpprxsM|?9YCBb$H2)ks{_pF1c({LZ z?K-iY*iO>viJ~~U*S>##=brOD-}5K(jkkYK0UrJ0r$R{Xeq~je0Sdq_=r~9MFhMr} z8)OWqgDU*yf8K0*|FGp=rm8h+j4_5F+*mdSaz6Jnbxle#_&vQ;IMwSusThZDaX>$J zzcD}zFn6Mie>%>nF#-Zk1)Lhl_~~CrL?Xn9QKLqQ(!h=rB}!iNyewk2KKX&zKm?cs z;-GoB5TB(X%Jb26WE!LhS_Z18e<5|PGcMx@LQQJ}JI+P9$fj-*C+_{FaK07bunlT~ znBL+FNF4H?6{ugVgAL9eNCc=I^(n)Xgd|W^9Grn3XOm6pQfG}dqC~lR&Mm;9E z2$1&n8ii82M8m2>6^t5)uO!atUr14lOvnUf$^%t`GG!`MsA%P-Z~?|qTciYR1N-hG zJ1HAmY}5v|!P#=H17`pRMTqc3pI~5MV-M^&w%Q~}xW~|!00Z3p!&Rl^`FtC+0x}(_ zJNgV{1c-VIT?2`E3exaYr~!Asx~kajYXq2eKjN()4JSG<#bk~-@|qv00>p?>(;5>@ zFv=(l5O5CVzKzyKxoFNI0z39DdyO1Y04=(UE(@NCZvYc6=Fu?nj{rq?(Y4`jLxIPh z(hNy#waJsGK?4hG;K!SmX-v#>uK)%m$W`{pvyV(cEH#QLrW^Y^ZUjKgTj;3!T1G%6 zw9Ns=J+L?mMjVV0mm@e0S8!P_4>sbU&aUnb9B>Xr0V<6OStH9;BAVv%G z;5-A}KQRB;F6x&_@5#48bGYw`c>AS*x#3@oqRhw)6$S^;%9JrNv9NfmPtQLFK-^GI zfTB|X1Dre<4Hx+v7l1v`x)&MLK|JuI5swYDfE~{g2Izl5B9sd?1<0s6(~@l61Wfxiv?L=mtA&r z2NRPq#>kTo_WR#VMceIXV>2aFjO#cxYQb^No&v-{_q^XKuKzZsJOU`{E;3d%;tfkOT=5WHrl%Y+zte7uQ60v!CnRTyPg5 zLXspoa`?3Jwr;b-4izexn50N`wO?A&)U{5LqH9&Dokm<;Vv5;Zs6fmTN&4m}C-wd6~yn zyKNXWCv!xJVq&^}l{!_b?6T|na1uPzXGDoMktqEZ3yYlQc%n}R8lJVg#&fLz_cL|P zu1sr{Dxc|Rl(oz(v*b08gF~4zKhd9%BZrDompZoClqs{v9wkal$|Nyj0RS>Eh!e-b zAxpOHfgfZXUC)eZKNrTgLa)hd1G`}*N)#wiqT~@l=Uf3=Idmfg3tDfgt@aCCxUDvM zJz(HkZ%~qC;6hrNv@sd$+l91RoIy!D3wf?FfLl4^o8*x;yQI9I8{A^V+s9^s1Rvbn zRBbf)`mdzrgL}Jr=hloI&i~pim~*esV8(31D-0+fP}M4PGRKbY5FIAhJ!la4(@ajo zAg-H|DtEzOeBDlt^ZC6<7_V&T#=vgaHrrTwKol_mJaZ}_uocAhU(*Kr`GPPnF2grS z5IDyiCMFIJV~m}D3-IZRt*Gno%an;pj3`kat+?6lt4k-NFdt+bZP4(X$OduZ#3jzX zm8#m<++G^*izO&hq(+Thc0J&k8psW6&>%qq1A{4Rojd^Zy(?o~pa^PTCfJlNitSIsfNn>Duq>7Ai!E1}^SF#?d0hLs?BhaJN^Rw&ycw zC)P7b^6X{M`?6F6jI1L(9sRq16 zRHCFj|KH8N!HsAsDf1P@!J$Bbw4{&Rewc+DX6e`mf4r&ycYbhF9_^YghMTsJR6MiO zg$Kob#}q$aZbj&2%HEART5d15fKkXz|yUsqg9P#}#F+CSp`^vj-( z+J3YhJhLvKwU(|#DM$wOgX%0$2&{{b(EWmmQ5ikfXMUV{+(aS&#`5C1PRR62?)>1O z0JqbV{{j&dA;P@Ov&kmwy3RGZ7MSjnh#xN>Rxok!6m>6)EaKo`V7wG{d3}pe5;qh; za}VSzzwAU{wfe_( z0sdk<*XIN^aebsZ{dl=dnJ7_;6q#j~7%}hZ?fnV%YyZNv3#TpjGj)CX{v#;C!e3nD z$v=Dsz+3-zV3zM?sy)?BEG+ew&(Pe1;8>lW{6GO*@Z*D;WZ!ShLHo3CO(sqpJGZ*4 zGr_1~ppQVVd6`Lr7dnTcM0<)LhEcE;)C4|Qanw>5tQi~X3Ri;gu0|~g@3Lf>les2k2m`}UGH$=1iP;oRhCd@Nacu7k zg$bG9>XOsdlkZ>q=HIUS?3Y_Dopd42;@j7`v24iwOueW3bYs~Vg5vryxz>Y|^7-yG zX=Y`Xd6{RDNoJT~MrPR8eWFCUB$t9Gve#;&UZl0vt6lL&_!#Y;&g0ZNbZd?LYnMr{ zU&6#?36-X-bg%bmD8TV1H}#@i2dbzAsv?d0c~;*r+i&E*95R;t`u8hQCaAiy(y77#T}^o5p4 zl59%f=Ez}UazQS*N+N}!GGs?BZl{G0Ta;GDv)Q6-cu(WYuK?$=FW~N1SCxkAYXf4> z^tzU+@Ya6}e_qjfC8y41Riip?n;K*8fGSb9KT%B3#Oa*VWiDf5hbZ*(A?LC&v{O3tFfiwbEs7E$5>(1qSV4`xDJCT? z1wayDd}%|DueAn?e|kMQZiNcTcV~lhI}W{kQrTgrf`@^*Ntq<4xu8;} zK%oQk2iv-RqB4`G|MG}SUthq%Vf~+D}v~m)+mj^e8&-__tU)|w~2TdFn77h+IYE-BMp<#mt{*c5H zCDwKQh1&Rn7I1Kg5TQ<;amL-Q9ddy(jmjv`SJ1D$_q!b_%e%k5s#=4qf9XE)k3W2f z<~i`Q+u#FwODw3s-QQo;#dod;q?3tBVrjdtpe#u;;1#ZLrO8U}y!V`)=yTHVTna+o zUZRkuaQOwx(q{$mhbuN{1O=ht6Dz5k9!`*;Mvc7YnUu*Fl17K+`~5)*Ns>+P?^;G& z!1wt5hb;cdbr#>g&b-X?-+%XCV8QKgy%}UJKmD6~NDkC&CY@$vW&ozsJk(0=vIQj$ zZG}7Pz3sx~fhxdj%cgvAZ%&M(KMIXM&ICTZ_=Erc5jq=~jPhJ2!TZq3Mz09TF& z`tH7Nem}sEKl)+kGu-#yI@+AIMBR@HE8yd?hwcz7vz-F=*NkqlMT!(PYV5NgI^BI< z`?FirwASPr!WqkUbr(m`=KXG>Y2pDESn!7&Xqeac$V^^eK3Ph5ZDrJ-(xEL=I>ZBm zbaVk_xbfGoyIITk)=*&V-3iyVeBU*Zzxs_|W0ze%dv6tqK;oOJp-t#GjGg?0bYAP_ zeLl)xIy1vw|1hMgj%K7ec~&{UUV9_i`xTNkz6BEMSr9u#2EeF2@2 zZnu2cr}b?QUM0t7to0; zq6>_1FH;R%M)*8U%z!q1%2RGHjdSgVuHfO0b)R}S)L6$80>~}rVwcApzvm)VhIZNl&p3!8meE}xsk<&E0Re-ZnMH{k8TA{+uKR!om zaP`lxqh29ljvU36H#GN8tK?({>z!LoC2+l#hlk!f7z{ATzJTyBg?7y$bn%3AOPdZ; z{1WelZ(hU3ZrcX$C!}gLm%#N}9zMthQ`1(Pn8dKuYC8k>q|zxx+|4kjFE39V3NcTs zrsdIl54rO0)h6ZK|85qi1ljBkuYdm*tKYo`CM0NhN_J&h9UQiFixC;2tmURi z$DdW`XC+4%AxDne%j1$=ndX@9?Y{-+)V=GEJ6~tLyYcJV{YdvU*0^~Jt~K!yXNk*@*LhvLso{H~Pr5E)>apDErAgd`)55Ji3f(rX z4BeHzDQ{{;E0ie{AwrQNb23LoD>yh@kPB??72wrBjQC>9tA7~r fN&#NU7g_!vH_LTG9beMv00000NkvXXu0mjf)oQ}C literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png b/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png new file mode 100644 index 0000000000000000000000000000000000000000..1266816fb829c147baa4ba7fa95222e322e9fe37 GIT binary patch literal 4329 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 XI*x2&VGd000McNliru-U1pE8Vc_mJ%|7R4PZ$` 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 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png b/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d61b2ed1da398b77b78dc87dad339f2d04be5f GIT binary patch literal 3738 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 Eg3IVN761SM literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png b/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b6fd536d7e18b2643c559e1f7c2f32b369971c GIT binary patch literal 4068 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 Hu0mjfa$77s literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png b/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbdeed6610c8302c0d1391c2fc6d144e0e04403 GIT binary patch literal 1608 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 IM6N<$f>z{NK>z>% literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png b/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png new file mode 100644 index 0000000000000000000000000000000000000000..c74a2dd85c136aa12372adaffdb62bdd5826758b GIT binary patch literal 1230 zcmV;<1Tp)GP)VGd000McNliru-UA315i5ZB>SX``1Y1c& zK~#9!?U_q!8&?#^f9K8}Nq*FEDJ>7$f|X@P!g`NP`0onIOw8+}`H^7l;Yj zo31gAVUG~VChT8HcmOht;*!H)h=Gh`nR;`Bcldm^H3no5vP8s;Gse#J+x{TII!Z=z z#9J;QFo^@yn;d}CZi6Dt)>y|Ui-T%JtUePsWDr7p0(?fWh%rpPndFeT_Z^VI06w>I zaS6#{Xiy{I5Cv4TKnBG@fD9H#T=r-nNYWJ)P~7CFaYUqzzG#ldCnikPURE+m%mq*) zB4X-PsI#kk_%v`NCe%8U2sHv!-ZZEe4a1&GC_p!{o z4Ai}+bH$^l3SR@T;%%TP-xlt)*CImko3EPd)lE#WHc$>Q6UkuXeNA+>udeZ6mcY%$JQZRp zPyZUa5=hZPv-jWAn$7E6v8Yu$tC7tQmkux}wM4&X5#k{Tyc|_~e|Q`CL{x!M3=ZHT z%ok?(vs4<$+P5cFU=D{I5TO_(z0dVJZ?!Ubdl@~cVlQSmhn%|zXSAYt9X!+58BkTU+Wc0_tCz3!)yvlxE&+Sdx;YyCqme(E2^WcK zOKDD(hO`bZOJGA^0{^QHxK0x686k9Cc<<1wCxMD^k)pNe>Cb+cV2-6(-8?E+7{ zG7k&+j^}>!*0IS13gCBdojUL!DUEJ)fh!@wUT%ZZBCHQF>@1vhc4?v1H{TD2{xXyz sMT!(DQlv|Jkz&~JA4WtSF1RdZaR2}S07*qoM6N<$f)%SOAOHXW literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png b/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..f579c0283fc36a62f396b78694fa9720358bea1d GIT binary patch literal 1229 zcmV;;1Ty=HP)VGd000McNliru-UA2%9t^mLB3b|d1X@W% zK~#9!?V34{97Pz0pQ`F(=h)c`)@YIc2LTxgY)giKK>{2sk$(e`<%r+lY=jU5hyYMo z`~i@#GY13~5i1Z0Fgr(2PhUka-Mw?IykmLRbM!mGOm}@lZqJmMC#gIM@ET>B0>@pBocu{p@@hG7*L^#K&*!ZEG#;- z8RCZ=AO<!|^Nw%4Bb?NW+)N34diDV+Dc`hy*g6T6g;4(E)bmV7 zD|&P}@v1!2f8*ft8^3Jyj!%d>pie|pw6fda>*Cb&ib(gT?xV1>#wVmh2Mdcgy&8|S z78~yYqs}lzqS)gA2dAhEOROMHJ;>)0(4GxA-06>(;*J>ZnP=9Iez;K}2s=E>uy3roOSR5#(=*$-G^uIa^$HQ z;&Pj1oJPq-V!-qCKfd7UXX{>6EFNIryF6^okuScj1&M9|vo>2%2iV!4G;SmdT)LGW zcj0SKFwb^gN&AOx<5J<4=N7IlkbNvOx*8jo4OYj*Bw2Q zK>l80`g&Z5010qNS#tmY4#NNd4#NS*Z>VGd000McNliru-UA313NWLq=o0_{1U5-T zK~#9!?U_w)TSXLxpEGl>?Ibmjblsl=2{94~C6+1>9}*J3fmPKNzaa}m7DcE@79i?= zz&~hr{R@#`L7TM6wH@1c=CGK1;|~&AS2*>@eOLC(+$*1V&ikG-W8o4sd!qitB4v-1 z{rR|_M94LVloV|m)C;ESSQdmCM0DANb_9BYp2nyXsCcC0QD@L+2C>;fQK&j*73NX` zUPRyp@<6)=5O6@xpl1f{3Pg&YnfW6?Ry?GFL<$0wJ?aE`H$|2mverXlMczr#)*KR` zEdxfO;vrH{kl3S%g|dS)gH%&U&40XQmNUR+seWoh+ILMLCGve)#EO3&Ln<>%fF#c% z#R(cK7)2rtf%;7EmJpy5P{R0%3!b2W4bR{O^%Ane3Ff^NVCt)bQ7^&F+6IO2xnn}m zX{ZEL(?CQyNP)x#SyUYoE0h%VAVv|RXw%|fTKuVC6vgrf(jaYXjzCosKA*J(rB6qP=ShribB&uk064q^`K=?1yazCg_1{G5=fYS6U=t+%s|EA73gO5Kgm+q2`s13mdqOjZ14lI2K;@}AwoqhtO>cN9F4Kyv*26v|&j8HoU1jL6RMM62Gla;@gg|0zX(m;v_ znl`k{OP&JLUIs@84tE*K+Z$gY3&lvYZFI9%)8xeJX04|49Coi2`!xV|wj1+HNUr(KT1}G|R+GQu^Y6{J(ZTsm;HQ7VD;k&i9JULe(@wwAj4*@rpccrZ7IPIo=2J-M+?>mM2dfz>E3F%3z&BT za)<95U&P)Ie`HOOA^EE`*B#+d6_8~IPQp!Z+aT9mINcSPUf;^I^Kcg(?PA~PEU>W0 z;lo`tuloSEZ+#EIt=r!XJ+QOg;C0sBZ!~0_ogDX>iJb;#2`xoi8q)sBzM=o;!@e{epwfA;}c*xvdOfP;Gt{82>xi}lG8FlhtK z-@o_sL-0`lY$K3x=Ml%h_Ag>r*GtsDd4K3#`v(s=x*JYplempC<9NWU^gkHzg={am z^WXvMpRW(i=fUs&_ Date: Sun, 16 Mar 2014 15:11:09 -0400 Subject: [PATCH 33/33] Added in a few more alchemy stuff --- .../AlchemicalWizardry.java | 86 +++++++++++++++++- .../common/alchemy/AlchemyRecipeRegistry.java | 2 +- .../common/items/ItemAlchemyBase.java | 12 ++- .../common/items/ItemComponents.java | 37 +++++++- .../baseAlchemyItemConcentratedCatalyst.png | Bin 0 -> 478 bytes .../items/baseAlchemyItemFracturedBone.png | Bin 0 -> 377 bytes .../textures/items/baseAlchemyItemOffensa.png | Bin 0 -> 367 bytes .../items/baseAlchemyItemOrbisTerrae.png | Bin 0 -> 425 bytes .../items/baseAlchemyItemPraesidium.png | Bin 0 -> 456 bytes .../baseAlchemyItemStrengthenedCatalyst.png | Bin 0 -> 430 bytes .../textures/items/baseItemCostCore.png | Bin 0 -> 471 bytes .../textures/items/baseItemPotencyCore.png | Bin 0 -> 378 bytes .../textures/items/baseItemPowerCore.png | Bin 0 -> 381 bytes .../textures/items/baseItemRunicPlate.png | Bin 420 -> 442 bytes .../items/baseItemScribedRunicPlate.png | Bin 481 -> 513 bytes 15 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemConcentratedCatalyst.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemFracturedBone.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOffensa.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOrbisTerrae.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemPraesidium.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemStrengthenedCatalyst.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemCostCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemPotencyCore.png create mode 100644 resources/assets/alchemicalwizardry/textures/items/baseItemPowerCore.png diff --git a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 6337e32c..65f52adb 100644 --- a/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/BM_src/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -824,11 +824,23 @@ public class AlchemicalWizardry // comp[i] = redstoneStack; // } // AlchemyRecipeRegistry.registerRecipe(glowstoneDustStack, 2, comp, 2); + ItemStack offensaStack = new ItemStack(ModItems.baseAlchemyItems,1,0); + ItemStack praesidiumStack = new ItemStack(ModItems.baseAlchemyItems,1,1); + ItemStack orbisTerraeStack = new ItemStack(ModItems.baseAlchemyItems,1,2); + ItemStack strengthenedCatalystStack = new ItemStack(ModItems.baseAlchemyItems,1,3); + ItemStack concentratedCatalystStack = new ItemStack(ModItems.baseAlchemyItems,1,4); + ItemStack fracturedBoneStack = new ItemStack(ModItems.baseAlchemyItems,1,5); + + ItemStack strengthenedCatalystStackCrafted = new ItemStack(ModItems.baseAlchemyItems,2,3); + ItemStack fracturedBoneStackCrafted = new ItemStack(ModItems.baseAlchemyItems,4,5); + + + //TODO NEW RECIPES! AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.weakBindingAgent), 10, new ItemStack[]{simpleCatalystStack, simpleCatalystStack, new ItemStack(Item.clay)}, 2); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.standardBindingAgent), 15, new ItemStack[]{new ItemStack(ModItems.weakBindingAgent), sanctusStack, new ItemStack(ModItems.crystallos)}, 3); AlchemyRecipeRegistry.registerRecipe(simpleCatalystStack, 2, new ItemStack[]{sugarStack, redstoneStack, redstoneStack, glowstoneDustStack, new ItemStack(Item.gunpowder)}, 1); - AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.incendium), 5, new ItemStack[]{lavaBucketStack, new ItemStack(Item.blazePowder), new ItemStack(Item.blazePowder), new ItemStack(Block.netherrack), simpleCatalystStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.incendium), 5, new ItemStack[]{lavaBucketStack, new ItemStack(Item.blazePowder), new ItemStack(Item.blazePowder), new ItemStack(Block.netherrack), simpleCatalystStack}, 2); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.aether), 5, new ItemStack[]{featherStack, featherStack, glowstoneDustStack, ghastTearStack, simpleCatalystStack}, 2); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.sanctus), 5, new ItemStack[]{glowstoneDustStack, new ItemStack(Item.goldNugget), glowstoneDustStack, glassStack, simpleCatalystStack}, 2); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.crepitous), 5, new ItemStack[]{new ItemStack(Item.gunpowder), new ItemStack(Item.gunpowder), cobblestoneStack, cobblestoneStack, simpleCatalystStack}, 2); @@ -848,6 +860,17 @@ public class AlchemicalWizardry AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.enhancedFillingAgent), 25, new ItemStack[]{new ItemStack(ModItems.standardFillingAgent), new ItemStack(ModItems.aquasalus), new ItemStack(ModItems.magicales)}, 4); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.activationCrystal, 1, 1), 100, new ItemStack[]{new ItemStack(ModItems.activationCrystal, 1, 0), new ItemStack(ModItems.demonBloodShard), incendiumStack, aquasalusStack, aetherStack}, 4); AlchemyRecipeRegistry.registerRecipe(new ItemStack(ModItems.activationCrystal, 1, 1), 100, new ItemStack[]{new ItemStack(ModItems.activationCrystal, 1, 0), new ItemStack(Item.netherStar), incendiumStack, aquasalusStack, aetherStack}, 4); + + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Block.web),2,new ItemStack[]{new ItemStack(Item.silk),new ItemStack(Item.silk),new ItemStack(Item.silk),new ItemStack(Item.silk),new ItemStack(Item.silk)},1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Item.gunpowder,2,0), 2, new ItemStack[]{new ItemStack(Item.gunpowder), new ItemStack(Item.coal), new ItemStack(Block.sand)}, 1); + + AlchemyRecipeRegistry.registerRecipe(strengthenedCatalystStackCrafted, 10, new ItemStack[]{simpleCatalystStack, simpleCatalystStack, new ItemStack(Item.dyePowder,1,15), new ItemStack(Item.netherStalkSeeds)}, 3); + AlchemyRecipeRegistry.registerRecipe(offensaStack,10, new ItemStack[]{strengthenedCatalystStack,incendiumStack, new ItemStack(Item.arrow), new ItemStack(Item.flint), new ItemStack(Item.arrow)},3); + AlchemyRecipeRegistry.registerRecipe(praesidiumStack, 10, new ItemStack[]{strengthenedCatalystStack,tennebraeStack,ironIngotStack,new ItemStack(Block.web),redstoneStack}, 3); + AlchemyRecipeRegistry.registerRecipe(orbisTerraeStack, 10, new ItemStack[]{strengthenedCatalystStack,terraeStack, new ItemStack(Item.gunpowder), new ItemStack(Block.netherrack), new ItemStack(Block.sand)}, 3); + AlchemyRecipeRegistry.registerRecipe(concentratedCatalystStack,10,new ItemStack[]{strengthenedCatalystStack,fracturedBoneStack,goldNuggetStack},4); + AlchemyRecipeRegistry.registerRecipe(fracturedBoneStackCrafted, 2, new ItemStack[]{new ItemStack(Item.bone), new ItemStack(Item.bone),new ItemStack(Item.bone),new ItemStack(Item.bone), new ItemStack(Item.gunpowder)},1); + HomSpellRegistry.registerBasicSpell(new ItemStack(Item.flintAndSteel), new SpellFireBurst()); HomSpellRegistry.registerBasicSpell(new ItemStack(Block.ice), new SpellFrozenWater()); HomSpellRegistry.registerBasicSpell(new ItemStack(Block.tnt), new SpellExplosions()); @@ -916,7 +939,7 @@ public class AlchemicalWizardry MeteorRegistry.registerMeteorParadigm(ironBlockStack, this.ironBlockMeteorArray, this.ironBlockMeteorRadius); MeteorRegistry.registerMeteorParadigm(new ItemStack(Item.netherStar), this.netherStarMeteorArray, this.netherStarMeteorRadius); - //Register spell component recipes + //Register spell component recipes ItemStack quartzRodStack = new ItemStack(ModItems.baseItems,1,0); ItemStack emptyCoreStack = new ItemStack(ModItems.baseItems,1,1); ItemStack magicalesCableStack = new ItemStack(ModItems.baseItems,1,2); @@ -932,8 +955,17 @@ public class AlchemicalWizardry ItemStack windCoreStack = new ItemStack(ModItems.baseItems,1,12); ItemStack earthCoreStack = new ItemStack(ModItems.baseItems,1,13); ItemStack inputCableStack = new ItemStack(ModItems.baseItems,1,14); + ItemStack crackedRunicPlateStack = new ItemStack(ModItems.baseItems,1,15); + ItemStack runicPlateStack = new ItemStack(ModItems.baseItems,1,16); + ItemStack imbuedRunicPlateStack = new ItemStack(ModItems.baseItems,1,17); + ItemStack defaultCoreStack = new ItemStack(ModItems.baseItems,1,18); + ItemStack offenseCoreStack = new ItemStack(ModItems.baseItems,1,19); + ItemStack defensiveCoreStack = new ItemStack(ModItems.baseItems,1,20); + ItemStack environmentalCoreStack = new ItemStack(ModItems.baseItems,1,21); ItemStack magicalesCraftedCableStack = new ItemStack(ModItems.baseItems,5,2); + ItemStack crackedRunicPlateStackCrafted = new ItemStack(ModItems.baseItems,2,15); + ItemStack runicPlateStackCrafted = new ItemStack(ModItems.baseItems,2,16); GameRegistry.addRecipe(quartzRodStack, "qqq", 'q', new ItemStack(Item.netherQuartz)); GameRegistry.addRecipe(emptyCoreStack,"gig","nrn","gig",'n',goldIngotStack,'i',ironIngotStack,'g',glassStack,'r',simpleCatalystStack); @@ -954,6 +986,15 @@ public class AlchemicalWizardry GameRegistry.addRecipe(inputCableStack, "ws ","rcs","ws ",'w',blankSlateStack,'s',stoneStack,'r',imbuedSlateStack,'c',simpleCatalystStack); + GameRegistry.addRecipe(defaultCoreStack,"msm","geg","mom",'m', strengthenedCatalystStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack); + GameRegistry.addRecipe(offenseCoreStack,"msm","geg","mom",'m', offensaStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack); + GameRegistry.addRecipe(defensiveCoreStack,"msm","geg","mom",'m', praesidiumStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack); + GameRegistry.addRecipe(environmentalCoreStack,"msm","geg","mom",'m', orbisTerraeStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack); + + AlchemyRecipeRegistry.registerRecipe(crackedRunicPlateStackCrafted, 10, new ItemStack[]{imbuedSlateStack,imbuedSlateStack,concentratedCatalystStack}, 4); + AlchemyRecipeRegistry.registerRecipe(runicPlateStack, 30, new ItemStack[]{crackedRunicPlateStack,terraeStack}, 5); + AlchemyRecipeRegistry.registerRecipe(imbuedRunicPlateStack, 100, new ItemStack[]{magicalesStack,incendiumStack,runicPlateStack, runicPlateStack,aquasalusStack}, 5); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockConduit,1,0),"q q","ccc","q q",'q', quartzRodStack,'c', magicalesCableStack); GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellParadigm,1,0),"gb ","pcw","gb ",'p',paradigmBackPlateStack,'c', projectileCoreStack,'g',goldIngotStack,'b',stoneBraceStack,'w',outputCableStack); @@ -965,9 +1006,44 @@ public class AlchemicalWizardry GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,2),"bgb","ico","bgb",'c',windCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEffect,1,3),"bgb","ico","bgb",'c',earthCoreStack,'b',stoneBraceStack,'g',goldIngotStack,'i',inputCableStack,'o',outputCableStack); -// sanguineHelmet = new ItemSanguineArmour(sanguineHelmetItemID).setUnlocalizedName("sanguineHelmet"); -// -// LanguageRegistry.addName(sanguineHelmet,"Sanguine Helmet"); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellModifier,1,0),"bgb","ico","bgb",'c',defaultCoreStack,'i',inputCableStack,'o',outputCableStack,'b',stoneBraceStack,'g',ironIngotStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellModifier,1,1),"bgb","ico","bgb",'c',offenseCoreStack,'i',inputCableStack,'o',outputCableStack,'b',stoneBraceStack,'g',ironIngotStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellModifier,1,2),"bgb","ico","bgb",'c',defensiveCoreStack,'i',inputCableStack,'o',outputCableStack,'b',stoneBraceStack,'g',ironIngotStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellModifier,1,3),"bgb","ico","bgb",'c',environmentalCoreStack,'i',inputCableStack,'o',outputCableStack,'b',stoneBraceStack,'g',ironIngotStack); + + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,0),"bpb","ico","bpb",'c', emptyCoreStack,'b',woodBraceStack,'p',crackedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + + GameRegistry.addShapelessRecipe(new ItemStack(Item.dyePowder,5,15),fracturedBoneStack); + + LanguageRegistry.addName(strengthenedCatalystStack, "Strengthened Catalyst"); + LanguageRegistry.addName(offensaStack, "Offensa"); + LanguageRegistry.addName(praesidiumStack,"Praesidium"); + LanguageRegistry.addName(orbisTerraeStack, "Orbis Terrae"); + LanguageRegistry.addName(fracturedBoneStack,"Fractured Bone"); + LanguageRegistry.addName(concentratedCatalystStack, "Concentrated Catalyst"); + + LanguageRegistry.addName(quartzRodStack, "Quartz Rod"); + LanguageRegistry.addName(emptyCoreStack,"Empty Core"); + LanguageRegistry.addName(magicalesCableStack,"Magicales Cable"); + LanguageRegistry.addName(woodBraceStack,"Wooden Brace"); + LanguageRegistry.addName(stoneBraceStack,"Stone Brace"); + LanguageRegistry.addName(projectileCoreStack,"Projectile Core"); + LanguageRegistry.addName(selfCoreStack,"Self Core"); + LanguageRegistry.addName(meleeCoreStack,"Melee Core"); + LanguageRegistry.addName(paradigmBackPlateStack,"Paradigm Plate"); + LanguageRegistry.addName(outputCableStack,"Output Spell Cable"); + LanguageRegistry.addName(inputCableStack,"Input Spell Cable"); + LanguageRegistry.addName(flameCoreStack,"Fire Core"); + LanguageRegistry.addName(iceCoreStack,"Icy Core"); + LanguageRegistry.addName(windCoreStack,"Gusty Core"); + LanguageRegistry.addName(earthCoreStack,"Earthen Core"); + LanguageRegistry.addName(defaultCoreStack,"Unattuned Core"); + LanguageRegistry.addName(offenseCoreStack,"Offensive Core"); + LanguageRegistry.addName(defensiveCoreStack,"Defensive Core"); + LanguageRegistry.addName(environmentalCoreStack,"Environmental Core"); + LanguageRegistry.addName(crackedRunicPlateStack,"Cracked Runic Plate"); + LanguageRegistry.addName(runicPlateStack,"Runic Plate"); + LanguageRegistry.addName(imbuedRunicPlateStack,"Imbued Runic Plate"); } @EventHandler diff --git a/BM_src/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipeRegistry.java b/BM_src/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipeRegistry.java index 297697a0..fc88a0e1 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipeRegistry.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/alchemy/AlchemyRecipeRegistry.java @@ -75,7 +75,7 @@ public class AlchemyRecipeRegistry { if (result.isItemEqual(itemStack)) { - return ar.getRecipe(); + return ar.getRecipe().clone(); } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java index ac224ecf..e5a66c2d 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java @@ -21,7 +21,7 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemAlchemyBase extends Item { - private static final String[] ITEM_NAMES = new String[]{}; + private static final String[] ITEM_NAMES = new String[]{"Offensa","Praesidium","OrbisTerrae","StrengthenedCatalyst","ConcentratedCatalyst","FracturedBone"}; @SideOnly(Side.CLIENT) private Icon[] icons; @@ -49,14 +49,13 @@ public class ItemAlchemyBase extends Item @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Used in alchemy"); - if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); if (recipe != null) { + par3List.add("Used in alchemy"); par3List.add(EnumChatFormatting.BLUE + "Recipe:"); for (ItemStack item : recipe) @@ -69,7 +68,12 @@ public class ItemAlchemyBase extends Item } } else { - par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + if(recipe!=null) + { + par3List.add("Used in alchemy"); + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } } } diff --git a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java index 9b734084..d5e35b3c 100644 --- a/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java +++ b/BM_src/WayofTime/alchemicalWizardry/common/items/ItemComponents.java @@ -2,21 +2,25 @@ package WayofTime.alchemicalWizardry.common.items; import java.util.List; +import org.lwjgl.input.Keyboard; + import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.alchemy.AlchemyRecipeRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class ItemComponents extends Item { - private static final String[] ITEM_NAMES = new String[]{"QuartzRod", "EmptyCore", "MagicalesCable", "WoodBrace", "StoneBrace", "ProjectileCore", "SelfCore","MeleeCore","ParadigmBackPlate","OutputCable","FlameCore","IcyCore","GustCore","EarthenCore","InputCable","CrackedRunicPlate","RunicPlate","ScribedRunicPlate","DefaultCore","OffensiveCore","DefensiveCore","EnvironmentalCore"}; + private static final String[] ITEM_NAMES = new String[]{"QuartzRod", "EmptyCore", "MagicalesCable", "WoodBrace", "StoneBrace", "ProjectileCore", "SelfCore","MeleeCore","ParadigmBackPlate","OutputCable","FlameCore","IcyCore","GustCore","EarthenCore","InputCable","CrackedRunicPlate","RunicPlate","ScribedRunicPlate","DefaultCore","OffensiveCore","DefensiveCore","EnvironmentalCore","PowerCore","CostCore","PotencyCore"}; @SideOnly(Side.CLIENT) private Icon[] icons; @@ -40,6 +44,37 @@ public class ItemComponents extends Item icons[i] = iconRegister.registerIcon("AlchemicalWizardry:" + "baseItem" + ITEM_NAMES[i]); } } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + if (Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + + if (recipe != null) + { + par3List.add("Used in alchemy"); + par3List.add(EnumChatFormatting.BLUE + "Recipe:"); + + for (ItemStack item : recipe) + { + if (item != null) + { + par3List.add("" + item.getDisplayName()); + } + } + } + } else + { + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(par1ItemStack); + if(recipe!=null) + { + par3List.add("Used in alchemy"); + par3List.add("-Press " + EnumChatFormatting.BLUE + "shift" + EnumChatFormatting.GRAY + " for Recipe-"); + } + } + } @Override public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) diff --git a/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemConcentratedCatalyst.png b/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemConcentratedCatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..21976c29172f2766691e4c859ee8f2ee19a620cc GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqvw#pE*QB+cc0eK7%#er@=ltB<)VvZPmw~~#C^fMp zHASI3vm`^o-P1Q9MK6_|fq~J<)5S5w;`GwVzTQlM60P$)4_TFaWHLCVhxHyEbW-8bkBJ zh7vvghQ}7iH15w4VP|3e^zk2)gVpr^!hJur_rhP4 z-TI+avDa=N$F(lg_|AiJC04OQp54Emi{JjO`c_UNaetxF`gI3pvVDFezP$TQAsGbEzKIX^cyHLnE7WngeFN=+qYZTFAU%(Aa{J({E9F)4-p#HKf29=}3y2B6R%PZ!4!i_=>t@AYDK6lvWryf{## z=f;w)K_8Bam@pm<3W|z|yzwJO%&w(XKslxK`;C~xr8C!bSQN}mJvS%++@Cc$pQm5@ zefCN5$(`&6%+ep+DG#ka=XKC5`GZC8bg?MSnCAS0<_}i)rD(}M3i%{w!2W85_=9uT z`r9og?va0{b%x>a1uI73lkACW8gdh~Uphb7#2U$@r_!HvG*U=A;rr`j4ZaUd9Dn_M zth|bS4SR;D~-mv_+eLo^=J{$MR?f<9jy$lQo22WQ% Jmvv4FO#ljslotR1 literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOrbisTerrae.png b/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOrbisTerrae.png new file mode 100644 index 0000000000000000000000000000000000000000..33ffb99d7df2c9fd1a2a6ba78f69ccd8e6cb7665 GIT binary patch literal 425 zcmV;a0apHrP)#zsXS!TSAft(b zqP6Np*V7+GwWun;DZ?-8Z-IP}X+FsGM?i1Ct!Bj#Z(F`X76QG4Ov80cvTk^}sE9Y0 zBcFioUZz1Rv~tVjQHeJqsz<*RF&|&HZA02Ol=n4SDkv1UQ|c1JjwL^8A~M^9e2}Sk zLb_{k&&unKW2GCS3dRCf@TKAfaGtA^ku(z2CB&OTmQ|Wku8x6bM%ZH&RSwNVX#gmdxPhY%JA7jaW!`BGg0J5uVN`P=gzKYzotH z&DHUH{KgDs)jw=&T`0*`fUgt~{6tYzOiZJBAuzv%ZsOkPkaL0;#e-h=Q;Lcdfx4Y(Y~6 z{iu5N`n3`f{w3c22K=Garwo9I@cxj$JCB$zFGPg8uBEPPdBlvdN<{cjiXWp4uv{)> zu~=ZO<$Arc*=*FSwbUyS*Xy+uMZsh;!CDLOWs@fno2HRG&$-=hSZgWEk}S(e)0C!Z z89zVC_S81MbSBuNtbzUO#6;=Mo*zfl^=V;rO zD2kX)r_Ul*Ri#d+6CnipzQ-6t6h&BT(OT1W9a?LQF`qPedd6Q$=Xp*Df%ExH2!XEa yNYj+C010qNS#tmY3ljhU3ljkVnw%H_000McNliru-UAQ}8ZjHN`85Cl0Xs=V zK~y-)rIS5N!%!54pOn(prfPAMIuwx#QaU=h6k4cD{+eB!{1;A|NYSB#xCjQpEM~M$ zwrP{J^yWBd9MVtqg$tK^cpuJr4_6Zr{-e~gV%yMY8`|FhmSq8mzEhI#`}%;`Ts%4@ ze^3Wl3=xr;W16O{^Clvs7qxbAekSSkS9v;}Qm#~gm4Q~SR8dNyl#0#TT7Y>*+LM8bZ<=>ErYwxH9_DrnT#2S6T)n`8W2P7 zyB$VDk4S{T4~ax5=!MyJB|np8SpwiXHpAhF&8-5xw|9HsvGO>HS435u08t^};B YPg^*}N6O9Z`~Uy|07*qoM6N<$f+o7J-T(jq literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemCostCore.png b/resources/assets/alchemicalwizardry/textures/items/baseItemCostCore.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdfd2d42c57d7a144fcf36771e7b6e1799d5ff2 GIT binary patch literal 471 zcmV;|0Vw{7P)VGd000McNliru-UAR4IRXrEVK@K)0c1%; zK~y-)&5}KD6G0G$pSim|`+ULjhk~F$bg7`Fqv98&^G~Fprc9R}i6V%~fMhHr6mzz7 zd$+eU6p@VcrKBToHLKM;`_8)q|66kB&1`5_&hIOE7+^Lu@{IAD7huq}p0M8Hzf`w^ z2FdIA}ie6r$i0d zryA2OPExw(0nU@Ve<43Qz?B8DZjjFnm=RtYXvA72ehcuimYWXtlT96>*=4{rhMC3#++p#S@^Nc7eBh z_fZbkzaN|C&6%Do{h{UMhR=@`x32D=pH?W{ASAx=+1p3cm)}`e!Sj;$jmW>$JVGd000McNliru-UAR4I0cIi#o7P>0SZY( zK~y-)#nQb_0#OhJ;18l~#6N;2CSYPgZR?Bp0=}IUg|YG-q%rXcG$9&AY>>O_?pk=o zbqQK}ntSK(%*o8~-)O7~TvDbL`*cO_lJkmk6Fbp!mYiW9=atZc;J)3~ijF5tYsE!WH^W`4wXC2&n;CUF z+So->BM5lGZIU=lzxT8D^~o`qPTll+vOE{E%wRH6;5tdni$Z~u5Pqopv4tV!QDp|B zZ+ed~Q=5Sxmmk00000NkvXXu0mjfEn1=g literal 0 HcmV?d00001 diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png b/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png index 1f1ed624ed757122da3135c7f70715cad8de4f4b..6f6a6e08593393d5131e4edc8569fac45c7d21f5 100644 GIT binary patch delta 328 zcmV-O0k{671G)o{QwR_eC^6u8BR-K^EPozJL_t(I%cYaes)H~TguevsuC$A0(LgC~ z`h>njY2Q+CQx}B_2BXPcC1{lE{W&`gerIMf3hzDt8M*dSDdm+?{?7m@CD-ef^ZC39 z5>pF82u`Pyzuj(FYss<VQ0q}agL<-2J58iuSw=I!Znt9`M~pE%9uLa01fVR-2`8091u}x+kY0$ zIjrl7JHUP4?~V=(k|crm9$M?$W@8MpEW1J^qEJ;8j4_Yo$8m&GN?aH)Grae=jmxrt znRi~h01<_0tSAbwyl%45dZ)H07*qoM6N<$ Ef>u_Dl>h($ diff --git a/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png b/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png index bd01c9b96e850de88cae7c55b017238717c659a7..81a8df869afc1077e9394600998779ea162d1fac 100644 GIT binary patch delta 440 zcmV;p0Z0Df1AzpPDlskqE&wiRw@g0(000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^k^5-BeOY%d&r-U7b2eONVZb@+MKlL9|JS z7Pq4RoP$5XAA@FnI=WYAhC-=|v?k`8+An!7`IeZ5DE4me-Fpw5bI%DmXJ@I#tj~4` zxgA3OZvfa@TCy2JUjGYFn4}Ow&?0ZGt{N^ZC=L&mdwU)ahv0vC&S4th{Ny9&tQ~?} zRep54MrCP$_3>a$YZ9n2&Hd5J3jMydPDhFRDY=sp*uae`jZSHhtID^70}T{-8>442 zx|xy^$GARA#LZ?iKU`kc-`N50VstAd16;=I7~M_DSA4_^!XE&?%90S=PRUxQ;~1}E z)JjQjJo6+*#e{rbCs$~PkRKF<=HjB>_O=Q`+)K&J7@b3j5BP%jvqXG~!S3$KY3fF6 zOrydTT$<;DTG@^9!cUBF5ufo1Z>GEuW@VuUx`qqbFABY*Bi~1(Q)UYD!c+rYMfYEv iI9>I^ykLd1#`!l2@T2rVSLOTw0000y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2i^k=0U0W&?-*{8TP%M?Nkl!Ohj#NWwtU=wLt!uVC#tc&}Cs>(L2vhHIfqLGOH8vxL$ z*J+Dr>lcueOArxGK|9SRX%G;O$GAA=Dop|Cs>(88r~IO-L?VA^mhm3a(s%*>G4;E0!$4%v2o$`t?}&j)7g^ zISiT1=e*|mN;Ao(Ve+6OVDOhtTwXq5(_qQA