From cabc296b21ce20c29254dac085bb00a300a9f37e Mon Sep 17 00:00:00 2001 From: WayofTime Date: Fri, 27 Jun 2014 19:43:09 -0400 Subject: [PATCH] 1.7.10 commit of I-still-can't-do-any-branches --- 1.7.10/api/java/thaumcraft/api/IGoggles.java | 22 + .../api/java/thaumcraft/api/IRepairable.java | 13 + .../thaumcraft/api/IRepairableExtended.java | 17 + .../api/java/thaumcraft/api/IRunicArmor.java | 23 + .../api/java/thaumcraft/api/IScribeTools.java | 14 + .../java/thaumcraft/api/IVisDiscountGear.java | 20 + 1.7.10/api/java/thaumcraft/api/ItemApi.java | 70 + 1.7.10/api/java/thaumcraft/api/ItemRunic.java | 21 + .../java/thaumcraft/api/ThaumcraftApi.java | 469 +++++++ .../thaumcraft/api/ThaumcraftApiHelper.java | 268 ++++ .../java/thaumcraft/api/aspects/Aspect.java | 201 +++ .../thaumcraft/api/aspects/AspectList.java | 256 ++++ .../api/aspects/AspectSourceHelper.java | 36 + .../api/aspects/IAspectContainer.java | 80 ++ .../thaumcraft/api/aspects/IAspectSource.java | 16 + .../api/aspects/IEssentiaContainerItem.java | 37 + .../api/aspects/IEssentiaTransport.java | 100 ++ .../api/crafting/CrucibleRecipe.java | 74 ++ .../api/crafting/IArcaneRecipe.java | 35 + .../api/crafting/IInfusionStabiliser.java | 19 + .../crafting/InfusionEnchantmentRecipe.java | 156 +++ .../api/crafting/InfusionRecipe.java | 128 ++ .../api/crafting/ShapedArcaneRecipe.java | 261 ++++ .../api/crafting/ShapelessArcaneRecipe.java | 157 +++ .../api/java/thaumcraft/api/nodes/INode.java | 53 + .../java/thaumcraft/api/nodes/IRevealer.java | 22 + .../thaumcraft/api/nodes/NodeModifier.java | 6 + .../java/thaumcraft/api/nodes/NodeType.java | 6 + .../api/research/IScanEventHandler.java | 9 + .../api/research/ResearchCategories.java | 101 ++ .../api/research/ResearchCategoryList.java | 37 + .../thaumcraft/api/research/ResearchItem.java | 367 ++++++ .../thaumcraft/api/research/ResearchPage.java | 174 +++ .../thaumcraft/api/research/ScanResult.java | 39 + .../java/thaumcraft/api/wands/IWandFocus.java | 64 + .../api/wands/IWandRodOnUpdate.java | 16 + .../api/wands/IWandTriggerManager.java | 12 + .../java/thaumcraft/api/wands/IWandable.java | 25 + .../thaumcraft/api/wands/ItemFocusBasic.java | 166 +++ .../java/thaumcraft/api/wands/StaffRod.java | 48 + .../java/thaumcraft/api/wands/WandCap.java | 122 ++ .../java/thaumcraft/api/wands/WandRod.java | 151 +++ .../api/wands/WandTriggerRegistry.java | 72 + .../Blood Magic API - v1.0.1g+ (1.7.10).zip | Bin 0 -> 22027 bytes .../AlchemicalWizardry.java | 979 ++++++++++++++ .../BloodMagicConfiguration.java | 96 ++ .../alchemicalWizardry/ModBlocks.java | 162 +++ .../alchemicalWizardry/ModItems.java | 366 ++++++ .../AlchemicalPotionCreationHandler.java | 79 ++ .../AlchemyPotionHandlerComponent.java | 52 + .../api/alchemy/AlchemyPotionHelper.java | 76 ++ .../api/alchemy/AlchemyRecipe.java | 143 ++ .../api/alchemy/AlchemyRecipeRegistry.java | 85 ++ .../api/altarRecipeRegistry/AltarRecipe.java | 70 + .../AltarRecipeRegistry.java | 60 + .../api/bindingRegistry/BindingRecipe.java | 30 + .../api/bindingRegistry/BindingRegistry.java | 67 + .../api/items/ShapedBloodOrbRecipe.java | 227 ++++ .../api/items/ShapelessBloodOrbRecipe.java | 140 ++ .../api/items/interfaces/ArmourUpgrade.java | 15 + .../api/items/interfaces/IBindable.java | 5 + .../api/items/interfaces/IBloodOrb.java | 8 + .../api/items/interfaces/IHolding.java | 6 + .../api/rituals/IMasterRitualStone.java | 30 + .../api/rituals/IRitualStone.java | 6 + .../api/rituals/RitualComponent.java | 43 + .../api/rituals/RitualEffect.java | 17 + .../api/rituals/Rituals.java | 333 +++++ .../api/soulNetwork/LifeEssenceNetwork.java | 26 + .../api/soulNetwork/SoulNetworkHandler.java | 228 ++++ .../summoningRegistry/SummoningHelper.java | 21 + .../summoningRegistry/SummoningRegistry.java | 70 + .../SummoningRegistryComponent.java | 231 ++++ .../api/tile/IBloodAltar.java | 26 + .../client/ClientProxy.java | 150 +++ .../common/AlchemicalWizardryEventHooks.java | 341 +++++ .../common/AlchemicalWizardryFuelHandler.java | 72 + .../common/AlchemicalWizardryTickHandler.java | 47 + .../common/ArmourComponent.java | 23 + .../common/CommonProxy.java | 91 ++ .../common/EntityAIFly.java | 5 + .../common/EntityAITargetAggro.java | 24 + .../common/EntityAirElemental.java | 33 + .../common/IBindingAgent.java | 6 + .../alchemicalWizardry/common/ICatalyst.java | 8 + .../alchemicalWizardry/common/IDemon.java | 10 + .../common/IFillingAgent.java | 6 + .../alchemicalWizardry/common/Int3.java | 16 + .../common/LifeBucketHandler.java | 42 + .../common/LifeEssence.java | 28 + .../common/ModLivingDropsEvent.java | 36 + .../common/NewPacketHandler.java | 809 ++++++++++++ .../common/PacketHandler.java | 966 ++++++++++++++ .../common/PlinthComponent.java | 37 + .../common/block/ArmourForge.java | 336 +++++ .../common/block/BlockAltar.java | 311 +++++ .../common/block/BlockBloodLightSource.java | 75 ++ .../common/block/BlockConduit.java | 101 ++ .../common/block/BlockDemonPortal.java | 43 + .../common/block/BlockHomHeart.java | 101 ++ .../common/block/BlockMasterStone.java | 72 + .../common/block/BlockOrientable.java | 254 ++++ .../common/block/BlockPedestal.java | 193 +++ .../common/block/BlockPlinth.java | 193 +++ .../common/block/BlockSchematicSaver.java | 43 + .../common/block/BlockSocket.java | 163 +++ .../common/block/BlockSpectralContainer.java | 75 ++ .../common/block/BlockSpellEffect.java | 62 + .../common/block/BlockSpellEnhancement.java | 64 + .../common/block/BlockSpellModifier.java | 63 + .../common/block/BlockSpellParadigm.java | 212 +++ .../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 | 62 + .../common/block/RitualStone.java | 121 ++ .../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/demonVillage/BlockSet.java | 195 +++ .../demonVillage/BuildingSchematic.java | 129 ++ .../common/demonVillage/DemonBuilding.java | 115 ++ .../common/demonVillage/DemonCrosspath.java | 22 + .../common/demonVillage/DemonVillagePath.java | 135 ++ .../common/demonVillage/GridSpace.java | 77 ++ .../common/demonVillage/GridSpaceHolder.java | 292 +++++ .../common/entity/mob/EntityBileDemon.java | 494 +++++++ .../common/entity/mob/EntityBoulderFist.java | 500 +++++++ .../common/entity/mob/EntityDemon.java | 99 ++ .../entity/mob/EntityEarthElemental.java | 28 + .../common/entity/mob/EntityElemental.java | 750 +++++++++++ .../common/entity/mob/EntityFallenAngel.java | 508 ++++++++ .../entity/mob/EntityFireElemental.java | 26 + .../entity/mob/EntityHolyElemental.java | 28 + .../common/entity/mob/EntityIceDemon.java | 529 ++++++++ .../entity/mob/EntityLowerGuardian.java | 492 +++++++ .../common/entity/mob/EntityShade.java | 499 +++++++ .../entity/mob/EntityShadeElemental.java | 27 + .../entity/mob/EntitySmallEarthGolem.java | 506 ++++++++ .../entity/mob/EntityWaterElemental.java | 25 + .../entity/mob/EntityWingedFireDemon.java | 509 ++++++++ .../projectile/EnergyBlastProjectile.java | 526 ++++++++ .../EntityBloodLightProjectile.java | 131 ++ .../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 | 594 +++++++++ .../common/items/BoundAxe.java | 384 ++++++ .../common/items/BoundPickaxe.java | 395 ++++++ .../common/items/BoundShovel.java | 391 ++++++ .../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 | 252 ++++ .../common/items/EnergyBazooka.java | 219 ++++ .../common/items/EnergyBlast.java | 214 +++ .../common/items/EnergyItems.java | 357 +++++ .../common/items/EnergySword.java | 238 ++++ .../items/EnhancedTelepositionFocus.java | 46 + .../common/items/FireScribeTool.java | 20 + .../common/items/ItemAlchemyBase.java | 107 ++ .../common/items/ItemBloodRuneBlock.java | 59 + .../common/items/ItemComplexSpellCrystal.java | 108 ++ .../common/items/ItemComponents.java | 80 ++ .../common/items/ItemDiabloKey.java | 128 ++ .../common/items/ItemRitualDiviner.java | 304 +++++ .../common/items/ItemSpellEffectBlock.java | 59 + .../items/ItemSpellEnhancementBlock.java | 99 ++ .../common/items/ItemSpellModifierBlock.java | 59 + .../common/items/ItemSpellParadigmBlock.java | 58 + .../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 | 159 +++ .../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/ItemFluidSigil.java | 597 +++++++++ .../common/items/sigil/ItemSeerSigil.java | 67 + .../sigil/ItemSigilOfEnderSeverance.java | 171 +++ .../items/sigil/ItemSigilOfSupression.java | 270 ++++ .../common/items/sigil/LavaSigil.java | 310 +++++ .../items/sigil/SigilOfElementalAffinity.java | 171 +++ .../common/items/sigil/SigilOfGrowth.java | 302 +++++ .../common/items/sigil/SigilOfHaste.java | 198 +++ .../common/items/sigil/SigilOfHolding.java | 371 ++++++ .../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 | 195 +++ .../common/items/sigil/WaterSigil.java | 285 ++++ .../items/spell/ItemSpellMultiTool.java | 861 ++++++++++++ .../common/items/thaumcraft/FocusBase.java | 169 +++ .../items/thaumcraft/FocusBloodBlast.java | 191 +++ .../items/thaumcraft/FocusGravityWell.java | 263 ++++ .../items/thaumcraft/ItemSanguineArmour.java | 103 ++ .../alchemicalWizardry/common/mcmod.info | 22 + .../common/potion/PotionBoost.java | 18 + .../common/potion/PotionDrowning.java | 18 + .../common/potion/PotionFireFuse.java | 18 + .../common/potion/PotionFlameCloak.java | 18 + .../common/potion/PotionFlight.java | 18 + .../common/potion/PotionHeavyHeart.java | 18 + .../common/potion/PotionIceCloak.java | 18 + .../common/potion/PotionInhibit.java | 18 + .../common/potion/PotionPlanarBinding.java | 18 + .../potion/PotionProjectileProtect.java | 18 + .../common/potion/PotionReciprocation.java | 18 + .../common/renderer/block/RenderConduit.java | 43 + .../common/renderer/block/RenderPedestal.java | 252 ++++ .../common/renderer/block/RenderPlinth.java | 256 ++++ .../block/RenderSpellEffectBlock.java | 49 + .../block/RenderSpellEnhancementBlock.java | 49 + .../block/RenderSpellModifierBlock.java | 49 + .../block/RenderSpellParadigmBlock.java | 49 + .../renderer/block/RenderWritingTable.java | 333 +++++ .../renderer/block/TEAltarRenderer.java | 241 ++++ .../block/itemRender/TEAltarItemRenderer.java | 81 ++ .../itemRender/TEConduitItemRenderer.java | 95 ++ .../TESpellEffectBlockItemRenderer.java | 108 ++ .../TESpellEnhancementBlockItemRenderer.java | 114 ++ .../TESpellModifierBlockItemRenderer.java | 108 ++ .../TESpellParadigmBlockItemRenderer.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 +++++ .../model/ModelSpellEnhancementBlock.java | 334 +++++ .../model/ModelSpellModifierBlock.java | 303 +++++ .../model/ModelSpellParadigmBlock.java | 234 ++++ .../renderer/model/ModelWingedFireDemon.java | 203 +++ .../renderer/model/ModelWritingTable.java | 138 ++ .../RenderEnergyBazookaMainProjectile.java | 39 + .../RenderEnergyBlastProjectile.java | 101 ++ .../projectile/RenderFireProjectile.java | 41 + .../renderer/projectile/RenderMeteor.java | 39 + .../rituals/RitualEffectAnimalGrowth.java | 120 ++ .../rituals/RitualEffectApiaryOverclock.java | 100 ++ .../rituals/RitualEffectAutoAlchemy.java | 431 ++++++ .../rituals/RitualEffectBiomeChanger.java | 448 +++++++ .../rituals/RitualEffectContainment.java | 127 ++ .../common/rituals/RitualEffectCrushing.java | 301 +++++ .../common/rituals/RitualEffectExpulsion.java | 286 ++++ .../rituals/RitualEffectFeatheredEarth.java | 141 ++ .../rituals/RitualEffectFeatheredKnife.java | 192 +++ .../common/rituals/RitualEffectFlight.java | 180 +++ .../common/rituals/RitualEffectGrowth.java | 104 ++ .../common/rituals/RitualEffectHealing.java | 181 +++ .../rituals/RitualEffectInterdiction.java | 112 ++ .../rituals/RitualEffectItemSuction.java | 166 +++ .../common/rituals/RitualEffectJumping.java | 114 ++ .../common/rituals/RitualEffectLava.java | 86 ++ .../common/rituals/RitualEffectLeap.java | 158 +++ .../common/rituals/RitualEffectMagnetic.java | 179 +++ .../common/rituals/RitualEffectSoulBound.java | 199 +++ .../rituals/RitualEffectSummonMeteor.java | 204 +++ .../rituals/RitualEffectSummonPlayer.java | 112 ++ .../rituals/RitualEffectSupression.java | 180 +++ .../common/rituals/RitualEffectUnbinding.java | 206 +++ .../common/rituals/RitualEffectWater.java | 83 ++ .../rituals/RitualEffectWellOfSuffering.java | 182 +++ .../spell/complex/EntitySpellProjectile.java | 624 +++++++++ .../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 | 163 +++ .../spell/complex/SpellParadigmMelee.java | 70 + .../complex/SpellParadigmProjectile.java | 102 ++ .../spell/complex/SpellParadigmSelf.java | 58 + .../spell/complex/SpellParadigmTool.java | 486 +++++++ .../spell/complex/effect/SpellEffect.java | 259 ++++ .../complex/effect/SpellEffectEarth.java | 284 ++++ .../spell/complex/effect/SpellEffectFire.java | 218 ++++ .../spell/complex/effect/SpellEffectIce.java | 241 ++++ .../spell/complex/effect/SpellEffectWind.java | 242 ++++ .../spell/complex/effect/SpellHelper.java | 392 ++++++ .../ExtrapolatedMeleeEntityEffect.java | 74 ++ .../IMeleeSpellEntityEffect.java | 9 + .../impactEffects/IMeleeSpellWorldEffect.java | 10 + .../IProjectileImpactEffect.java | 11 + .../IProjectileUpdateEffect.java | 8 + .../impactEffects/ISelfSpellEffect.java | 9 + .../MeleeSpellCenteredWorldEffect.java | 33 + .../impactEffects/MeleeSpellWorldEffect.java | 21 + .../impactEffects/ProjectileImpactEffect.java | 15 + .../impactEffects/ProjectileUpdateEffect.java | 15 + .../effect/impactEffects/SelfSpellEffect.java | 18 + .../earth/MeleeDefaultEarth.java | 45 + .../earth/MeleeDefensiveEarth.java | 37 + .../earth/MeleeEnvironmentalEarth.java | 48 + .../earth/MeleeOffensiveEarth.java | 34 + .../earth/ProjectileDefaultEarth.java | 57 + .../earth/ProjectileDefensiveEarth.java | 66 + .../earth/ProjectileEnvironmentalEarth.java | 82 ++ .../earth/ProjectileOffensiveEarth.java | 92 ++ .../impactEffects/earth/SelfDefaultEarth.java | 52 + .../earth/SelfDefensiveEarth.java | 27 + .../earth/SelfEnvironmentalEarth.java | 37 + .../earth/SelfOffensiveEarth.java | 43 + .../earth/ToolEnvironmentalEarth.java | 86 ++ .../earth/ToolOffensiveEarth.java | 58 + .../impactEffects/fire/MeleeDefaultFire.java | 30 + .../fire/MeleeDefensiveFire.java | 49 + .../fire/MeleeEnvironmentalFire.java | 32 + .../fire/MeleeOffensiveFire.java | 32 + .../fire/ProjectileDefaultFire.java | 70 + .../fire/ProjectileDefensiveFire.java | 47 + .../fire/ProjectileEnvironmentalFire.java | 46 + .../fire/ProjectileOffensiveFire.java | 81 ++ .../impactEffects/fire/SelfDefaultFire.java | 22 + .../impactEffects/fire/SelfDefensiveFire.java | 43 + .../fire/SelfEnvironmentalFire.java | 56 + .../impactEffects/fire/SelfOffensiveFire.java | 21 + .../impactEffects/fire/ToolDefaultFire.java | 38 + .../impactEffects/fire/ToolOffensiveFire.java | 21 + .../impactEffects/ice/MeleeDefaultIce.java | 28 + .../impactEffects/ice/MeleeDefensiveIce.java | 48 + .../ice/MeleeEnvironmentalIce.java | 40 + .../impactEffects/ice/MeleeOffensiveIce.java | 46 + .../ice/ProjectileDefaultIce.java | 40 + .../ice/ProjectileDefensiveIce.java | 49 + .../ice/ProjectileEnvironmentalIce.java | 39 + .../ice/ProjectileOffensiveIce.java | 32 + .../impactEffects/ice/SelfDefaultIce.java | 41 + .../impactEffects/ice/SelfDefensiveIce.java | 21 + .../ice/SelfEnvironmentalIce.java | 46 + .../impactEffects/ice/SelfOffensiveIce.java | 52 + .../impactEffects/ice/ToolDefaultIce.java | 30 + .../impactEffects/ice/ToolDefensiveIce.java | 62 + .../impactEffects/tool/DigAreaEffect.java | 138 ++ .../impactEffects/tool/DigAreaTunnel.java | 171 +++ .../impactEffects/tool/IDigAreaEffect.java | 12 + .../impactEffects/tool/IItemManipulator.java | 10 + .../impactEffects/tool/ILeftClickEffect.java | 11 + .../impactEffects/tool/IOnBanishTool.java | 10 + .../impactEffects/tool/IOnBreakBlock.java | 12 + .../impactEffects/tool/IOnSummonTool.java | 10 + .../impactEffects/tool/IRightClickEffect.java | 15 + .../tool/ISpecialDamageEffect.java | 10 + .../impactEffects/tool/IToolUpdateEffect.java | 10 + .../impactEffects/tool/ItemManipulator.java | 22 + .../impactEffects/tool/LeftClickEffect.java | 21 + .../tool/OnBreakBlockEffect.java | 21 + .../impactEffects/tool/RightClickEffect.java | 15 + .../impactEffects/tool/RightClickTunnel.java | 177 +++ .../impactEffects/tool/SummonToolEffect.java | 15 + .../impactEffects/wind/MeleeDefaultWind.java | 40 + .../wind/MeleeDefensiveWind.java | 33 + .../wind/MeleeEnvironmentalWind.java | 36 + .../wind/MeleeOffensiveWind.java | 40 + .../wind/ProjectileDefaultWind.java | 33 + .../wind/ProjectileEnvironmentalWind.java | 53 + .../wind/ProjectileOffensiveWind.java | 33 + .../impactEffects/wind/SelfDefaultWind.java | 27 + .../impactEffects/wind/SelfDefensiveWind.java | 39 + .../wind/SelfEnvironmentalWind.java | 45 + .../impactEffects/wind/SelfOffensiveWind.java | 32 + .../impactEffects/wind/ToolDefensiveWind.java | 32 + .../wind/ToolEnvironmentalWind.java | 41 + .../impactEffects/wind/ToolOffensiveWind.java | 24 + .../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 | 175 +++ .../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 | 20 + .../common/summoning/SummoningHelperAW.java | 109 ++ .../summoning/meteor/MeteorParadigm.java | 86 ++ .../meteor/MeteorParadigmComponent.java | 54 + .../summoning/meteor/MeteorRegistry.java | 61 + .../common/tileEntity/TEAltar.java | 1084 ++++++++++++++++ .../common/tileEntity/TEConduit.java | 34 + .../common/tileEntity/TEDemonPortal.java | 1153 +++++++++++++++++ .../common/tileEntity/TEHomHeart.java | 167 +++ .../tileEntity/TEImperfectRitualStone.java | 11 + .../common/tileEntity/TEMasterStone.java | 235 ++++ .../common/tileEntity/TEOrientable.java | 109 ++ .../common/tileEntity/TEPedestal.java | 268 ++++ .../common/tileEntity/TEPlinth.java | 694 ++++++++++ .../common/tileEntity/TESchematicSaver.java | 158 +++ .../common/tileEntity/TESocket.java | 255 ++++ .../tileEntity/TESpectralContainer.java | 149 +++ .../common/tileEntity/TESpellBlock.java | 48 + .../common/tileEntity/TESpellEffectBlock.java | 43 + .../tileEntity/TESpellEnhancementBlock.java | 155 +++ .../tileEntity/TESpellModifierBlock.java | 43 + .../tileEntity/TESpellParadigmBlock.java | 98 ++ .../common/tileEntity/TETeleposer.java | 374 ++++++ .../common/tileEntity/TEWritingTable.java | 815 ++++++++++++ .../tileEntity/container/ContainerAltar.java | 96 ++ .../container/ContainerTeleposer.java | 106 ++ .../container/ContainerWritingTable.java | 104 ++ .../common/tileEntity/gui/GuiHandler.java | 73 ++ .../common/tileEntity/gui/GuiTeleposer.java | 47 + .../tileEntity/gui/GuiWritingTable.java | 45 + .../ShapedBloodOrbRecipe.java | 227 ++++ .../ShapelessBloodOrbRecipe.java | 140 ++ .../nei/NEIAlchemyRecipeHandler.java | 153 +++ .../nei/NEIAltarRecipeHandler.java | 182 +++ .../nei/NEIBloodOrbShapedHandler.java | 141 ++ .../nei/NEIBloodOrbShapelessHandler.java | 130 ++ .../alchemicalWizardy/nei/NEIConfig.java | 33 + .../assets/alchemicalwizardry/altar.png | Bin 0 -> 59034 bytes .../alchemicalwizardry/books/architect.xml | 106 ++ .../alchemicalwizardry/gui/Teleposer.png | Bin 0 -> 986 bytes .../alchemicalwizardry/gui/WritingTable.png | Bin 0 -> 1186 bytes .../alchemicalwizardry/gui/bookleft.png | Bin 0 -> 11940 bytes .../alchemicalwizardry/gui/nei/alchemy.png | Bin 0 -> 1400 bytes .../alchemicalwizardry/gui/nei/altar.png | Bin 0 -> 4204 bytes .../assets/alchemicalwizardry/lang/de_DE.lang | 181 +++ .../assets/alchemicalwizardry/lang/en_US.lang | 181 +++ .../assets/alchemicalwizardry/lang/it_IT.lang | 181 +++ .../assets/alchemicalwizardry/lang/zh_CN.lang | 173 +++ .../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 .../schematics/building/buildings.zip | Bin 0 -> 766 bytes .../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/gui/bookcrafting.png | Bin 0 -> 3756 bytes .../textures/gui/bookfurnace.png | Bin 0 -> 1664 bytes .../textures/gui/bookleft.png | Bin 0 -> 11940 bytes .../textures/gui/bookright.png | Bin 0 -> 8536 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/BoundTool.png | Bin 0 -> 376 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/ComplexCrystal.png | Bin 0 -> 414 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/SeerSigil.png | Bin 0 -> 593 bytes .../textures/items/SheathedItem.png | Bin 0 -> 474 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 .../items/SigilOfSeverance_activated.png | Bin 0 -> 597 bytes .../items/SigilOfSeverance_deactivated.png | Bin 0 -> 614 bytes .../items/SigilOfSupression_activated.png | Bin 0 -> 637 bytes .../items/SigilOfSupression_deactivated.png | Bin 0 -> 645 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 .../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/baseAlchemyItemPotentia.png | Bin 0 -> 433 bytes .../items/baseAlchemyItemPraesidium.png | Bin 0 -> 456 bytes .../items/baseAlchemyItemReductus.png | Bin 0 -> 429 bytes .../baseAlchemyItemStrengthenedCatalyst.png | Bin 0 -> 430 bytes .../textures/items/baseAlchemyItemVirtus.png | Bin 0 -> 417 bytes .../textures/items/baseItemCostCore.png | Bin 0 -> 471 bytes .../items/baseItemCrackedRunicPlate.png | Bin 0 -> 523 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/baseItemObsidianBrace.png | Bin 0 -> 325 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/baseItemPotencyCore.png | Bin 0 -> 378 bytes .../textures/items/baseItemPowerCore.png | Bin 0 -> 381 bytes .../textures/items/baseItemProjectileCore.png | Bin 0 -> 478 bytes .../textures/items/baseItemQuartzRod.png | Bin 0 -> 251 bytes .../textures/items/baseItemRunicPlate.png | Bin 0 -> 442 bytes .../items/baseItemScribedRunicPlate.png | Bin 0 -> 513 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/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/ParadigmBlock.png | Bin 0 -> 923 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/SpellEnhancementCost1.png | Bin 0 -> 4871 bytes .../textures/models/SpellEnhancementCost2.png | Bin 0 -> 3603 bytes .../textures/models/SpellEnhancementCost3.png | Bin 0 -> 4021 bytes .../models/SpellEnhancementPotency1.png | Bin 0 -> 4329 bytes .../models/SpellEnhancementPotency2.png | Bin 0 -> 3539 bytes .../models/SpellEnhancementPotency3.png | Bin 0 -> 3947 bytes .../models/SpellEnhancementPower1.png | Bin 0 -> 4449 bytes .../models/SpellEnhancementPower2.png | Bin 0 -> 3738 bytes .../models/SpellEnhancementPower3.png | Bin 0 -> 4062 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 .../textures/models/SpellParadigmTool.png | Bin 0 -> 594 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 .../resources/assets/forge/lang/en_US.lang | 5 + .../resources/assets/forge/lang/es_ES.lang | 5 + .../resources/assets/forge/lang/fr_FR.lang | 5 + 1.7.10/main/resources/mcmod.info | 16 + 763 files changed, 64290 insertions(+) create mode 100644 1.7.10/api/java/thaumcraft/api/IGoggles.java create mode 100644 1.7.10/api/java/thaumcraft/api/IRepairable.java create mode 100644 1.7.10/api/java/thaumcraft/api/IRepairableExtended.java create mode 100644 1.7.10/api/java/thaumcraft/api/IRunicArmor.java create mode 100644 1.7.10/api/java/thaumcraft/api/IScribeTools.java create mode 100644 1.7.10/api/java/thaumcraft/api/IVisDiscountGear.java create mode 100644 1.7.10/api/java/thaumcraft/api/ItemApi.java create mode 100644 1.7.10/api/java/thaumcraft/api/ItemRunic.java create mode 100644 1.7.10/api/java/thaumcraft/api/ThaumcraftApi.java create mode 100644 1.7.10/api/java/thaumcraft/api/ThaumcraftApiHelper.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/Aspect.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/AspectList.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/AspectSourceHelper.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/IAspectContainer.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/IAspectSource.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/IEssentiaContainerItem.java create mode 100644 1.7.10/api/java/thaumcraft/api/aspects/IEssentiaTransport.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/CrucibleRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/IArcaneRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/IInfusionStabiliser.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/InfusionRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java create mode 100644 1.7.10/api/java/thaumcraft/api/nodes/INode.java create mode 100644 1.7.10/api/java/thaumcraft/api/nodes/IRevealer.java create mode 100644 1.7.10/api/java/thaumcraft/api/nodes/NodeModifier.java create mode 100644 1.7.10/api/java/thaumcraft/api/nodes/NodeType.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/IScanEventHandler.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/ResearchCategories.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/ResearchCategoryList.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/ResearchItem.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/ResearchPage.java create mode 100644 1.7.10/api/java/thaumcraft/api/research/ScanResult.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/IWandFocus.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/IWandTriggerManager.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/IWandable.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/ItemFocusBasic.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/StaffRod.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/WandCap.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/WandRod.java create mode 100644 1.7.10/api/java/thaumcraft/api/wands/WandTriggerRegistry.java create mode 100644 1.7.10/main/java/Blood Magic API - v1.0.1g+ (1.7.10).zip create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/ModBlocks.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/ModItems.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemicalPotionCreationHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHandlerComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHelper.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipeRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipeRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRecipe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapedBloodOrbRecipe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapelessBloodOrbRecipe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/ArmourUpgrade.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBindable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBloodOrb.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IHolding.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IMasterRitualStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IRitualStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/Rituals.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/LifeEssenceNetwork.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningHelper.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistryComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/api/tile/IBloodAltar.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/CommonProxy.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/ICatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/IDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/Int3.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeEssence.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/PacketHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockDemonPortal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSchematicSaver.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpectralContainer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/BlockSet.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/BuildingSchematic.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonCrosspath.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonVillagePath.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpace.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/GridSpaceHolder.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemFluidSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSeerSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfSupression.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/mcmod.info create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectExpulsion.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSupression.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IMeleeSpellEntityEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IMeleeSpellWorldEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileImpactEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/IProjectileUpdateEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ISelfSpellEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellCenteredWorldEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/MeleeSpellWorldEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileImpactEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ProjectileUpdateEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/SelfSpellEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefaultEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeDefensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeEnvironmentalEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/MeleeOffensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefaultEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileDefensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileEnvironmentalEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ProjectileOffensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefaultEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolOffensiveEarth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefaultFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeEnvironmentalFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeOffensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefaultFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileDefensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileEnvironmentalFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ProjectileOffensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefaultFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfDefensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfEnvironmentalFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/SelfOffensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ToolDefaultFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ToolOffensiveFire.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeEnvironmentalIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeOffensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefaultIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileDefensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileEnvironmentalIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ProjectileOffensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefaultIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfDefensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfEnvironmentalIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/SelfOffensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefaultIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaTunnel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IDigAreaEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IItemManipulator.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ILeftClickEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBanishTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBreakBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnSummonTool.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IRightClickEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ISpecialDamageEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IToolUpdateEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ItemManipulator.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/LeftClickEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/OnBreakBlockEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickTunnel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/SummonToolEffect.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefaultWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeEnvironmentalWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeOffensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefaultWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfEnvironmentalWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfOffensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolDefensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolEnvironmentalWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolOffensiveWind.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelperAW.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESchematicSaver.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpectralContainer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEffectBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellEnhancementBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellModifierBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpellParadigmBlock.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java create mode 100644 1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/ShapedBloodOrbRecipe.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/ShapelessBloodOrbRecipe.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAlchemyRecipeHandler.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAltarRecipeHandler.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapedHandler.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapelessHandler.java create mode 100644 1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIConfig.java create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/altar.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/books/architect.xml create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/gui/Teleposer.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/gui/WritingTable.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/gui/bookleft.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/alchemy.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/altar.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/lang/de_DE.lang create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/lang/en_US.lang create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/lang/it_IT.lang create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/lang/zh_CN.lang create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/armor - Shortcut.lnk create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/models/armor/sanguineArmour_layer_1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/schematics/building/buildings.zip create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/AirRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/AlchemicChemistrySet.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/AltarCapacityRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/ArcanePedestal.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/ArcanePlinth.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BlankRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Bottom.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_SideType1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_SideType2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Top.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodSocket.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodStoneBrick.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/DislocationRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/DuskRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/EarthRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/EfficiencyRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/EmptySocket.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/FireRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_bottom.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_side.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/ImperfectRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/LargeBloodStoneBrick.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/MasterStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/OrbCapacityRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/RitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSacrifice.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSelfSacrifice.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/SoulForge.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/SpectralBlock.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/SpeedRune.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Side.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Top.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/Testing.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/WaterRitualStone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_input.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_upArrow.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceFlowing.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceStill.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/energyBlastProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/explosionProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/fireProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/holyProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/lightningProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/mudProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/waterProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/windGustProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/GuiTrap.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookcrafting.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookfurnace.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookleft.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookright.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/8wWtY8d.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Aether.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AirScribeTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AirSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AlchemyFlask.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ApprenticeBloodOrb.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Aquasalus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ArchmageBloodOrb.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ArmourInhibitor_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ArmourInhibitor_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AverageLengtheningCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AveragePowerCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BlankSlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BlankSpell.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BloodFrame.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BloodLightSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundAxe_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundBoots.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundHelmet.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundLeggings.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundPlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundShovel_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundSword_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/CeremonialDagger.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ComplexCrystal.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Crepitous.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Crystallos.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DaggerOfSacrifice.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DemonBloodShard.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DemonPlacer.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DemonSlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DemonicTeleposerFocus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DiabloKey.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DivinationSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/DuskScribeTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EarthScribeTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkAir.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkEarth.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkFire.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkWater.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EnergyBattery.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EnergyBazooka_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EnergyBlaster_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EnhancedFillingAgent.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/EnhancedTeleposerFocus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/FireScribeTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/GreaterLengtheningCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/GreaterPowerCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/GrowthSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/GrowthSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/HasteSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/HasteSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/IceSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/IceSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Incendium.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/InfusedSlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/LavaCrystal.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/LavaSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/LifeBucket.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Magicales.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MagicianBloodOrb.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MasterBloodOrb.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MiningSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MiningSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MundaneLengtheningCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/MundanePowerCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/PotionFlask.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ReinforcedSlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/ReinforcedTeleposerFocus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/RitualDiviner.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SacrificialDagger.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Sanctus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SanguineHelmet.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SeerSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfHolding.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfMagnetism_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfMagnetism_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSeverance_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSeverance_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSupression_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSupression_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SimpleCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/StandardBindingAgent.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/StandardFillingAgent.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/TeleposerFocus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Tennebrae.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Terrae.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/UntamedCrystal.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/VoidSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WarriorSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WarriorSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WaterScribeTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WaterSigil.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WeakBindingAgent.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WeakBloodShard.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WeakFillingAgent.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WindSigil_activated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/WindSigil_deactivated.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/activationCrystalAwakened.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/activationCrystalWeak.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemConcentratedCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemFracturedBone.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOffensa.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOrbisTerrae.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemPotentia.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemPraesidium.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemReductus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemStrengthenedCatalyst.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemVirtus.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemCostCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemCrackedRunicPlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemDefaultCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemEmptyCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemEnvironmentalCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemFlameCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemGustCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemIcyCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemInputCable.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemObsidianBrace.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemOutputCable.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemPotencyCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemPowerCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemRunicPlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemSelfCore.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/bloodBlastOrn.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/focusBloodBlastOrn.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/items/tYf5ft9.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/AirFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/BileDemon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/Bird.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/BoulderFist.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/Conduit.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/DarkFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/EarthFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/FireFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/FloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/HolyFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/IceDemon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/LowerGuardian.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/Meteor.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/Pedestal.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/Plinth.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/ShadeMob.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SmallEarthGolem.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost3.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPotency3.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefault.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierEnvironmental.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierOffensive.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmSelf.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmTool.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/WaterFloatingBeacon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/WingedAngel.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/WingedFireDemon.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/WritingTable.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/altar.png create mode 100644 1.7.10/main/resources/assets/alchemicalwizardry/textures/models/blood.png create mode 100644 1.7.10/main/resources/assets/forge/lang/en_US.lang create mode 100644 1.7.10/main/resources/assets/forge/lang/es_ES.lang create mode 100644 1.7.10/main/resources/assets/forge/lang/fr_FR.lang create mode 100644 1.7.10/main/resources/mcmod.info diff --git a/1.7.10/api/java/thaumcraft/api/IGoggles.java b/1.7.10/api/java/thaumcraft/api/IGoggles.java new file mode 100644 index 00000000..2f53d816 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IGoggles.java @@ -0,0 +1,22 @@ +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/1.7.10/api/java/thaumcraft/api/IRepairable.java b/1.7.10/api/java/thaumcraft/api/IRepairable.java new file mode 100644 index 00000000..48c6dff9 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IRepairable.java @@ -0,0 +1,13 @@ +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/1.7.10/api/java/thaumcraft/api/IRepairableExtended.java b/1.7.10/api/java/thaumcraft/api/IRepairableExtended.java new file mode 100644 index 00000000..33827124 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IRepairableExtended.java @@ -0,0 +1,17 @@ +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/1.7.10/api/java/thaumcraft/api/IRunicArmor.java b/1.7.10/api/java/thaumcraft/api/IRunicArmor.java new file mode 100644 index 00000000..89d3c379 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IRunicArmor.java @@ -0,0 +1,23 @@ +package thaumcraft.api; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +/** + * + * @author Azanor + * + * Armor or bauble slot items that implement this interface can provide runic shielding. + * Recharging, hardening, etc. is handled internally by thaumcraft. + * + */ + +public interface IRunicArmor { + + /** + * returns how much charge this item can provide. This is the base shielding value - any hardening is stored and calculated internally. + */ + public int getRunicCharge(ItemStack itemstack); + + +} diff --git a/1.7.10/api/java/thaumcraft/api/IScribeTools.java b/1.7.10/api/java/thaumcraft/api/IScribeTools.java new file mode 100644 index 00000000..8800fa57 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IScribeTools.java @@ -0,0 +1,14 @@ +package thaumcraft.api; + + +/** + * + * @author Azanor + * + * Interface used to identify scribing tool items used in research table + * + */ + +public interface IScribeTools { + +} diff --git a/1.7.10/api/java/thaumcraft/api/IVisDiscountGear.java b/1.7.10/api/java/thaumcraft/api/IVisDiscountGear.java new file mode 100644 index 00000000..3793ea3e --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/IVisDiscountGear.java @@ -0,0 +1,20 @@ +package thaumcraft.api; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import thaumcraft.api.aspects.Aspect; + + + + +/** + * @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 IVisDiscountGear { + + int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect); + +} diff --git a/1.7.10/api/java/thaumcraft/api/ItemApi.java b/1.7.10/api/java/thaumcraft/api/ItemApi.java new file mode 100644 index 00000000..25dda282 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/ItemApi.java @@ -0,0 +1,70 @@ +package thaumcraft.api; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.FMLLog; + +/** + * @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/1.7.10/api/java/thaumcraft/api/ItemRunic.java b/1.7.10/api/java/thaumcraft/api/ItemRunic.java new file mode 100644 index 00000000..80251f59 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/ItemRunic.java @@ -0,0 +1,21 @@ +package thaumcraft.api; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemRunic extends Item implements IRunicArmor { + + int charge; + + public ItemRunic (int charge) + { + super(); + this.charge = charge; + } + + @Override + public int getRunicCharge(ItemStack itemstack) { + return charge; + } + +} diff --git a/1.7.10/api/java/thaumcraft/api/ThaumcraftApi.java b/1.7.10/api/java/thaumcraft/api/ThaumcraftApi.java new file mode 100644 index 00000000..9dd0b6d2 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/ThaumcraftApi.java @@ -0,0 +1,469 @@ +package thaumcraft.api; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.item.ItemArmor.ArmorMaterial; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.oredict.OreDictionary; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.crafting.CrucibleRecipe; +import thaumcraft.api.crafting.InfusionEnchantmentRecipe; +import thaumcraft.api.crafting.InfusionRecipe; +import thaumcraft.api.crafting.ShapedArcaneRecipe; +import thaumcraft.api.crafting.ShapelessArcaneRecipe; +import thaumcraft.api.research.IScanEventHandler; +import thaumcraft.api.research.ResearchCategories; +import thaumcraft.api.research.ResearchCategoryList; +import thaumcraft.api.research.ResearchItem; +import thaumcraft.api.research.ResearchPage; + + +/** + * @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 ToolMaterial toolMatThaumium = EnumHelper.addToolMaterial("THAUMIUM", 3, 400, 7F, 2, 22); + public static ToolMaterial toolMatElemental = EnumHelper.addToolMaterial("THAUMIUM_ELEMENTAL", 3, 1500, 10F, 3, 18); + public static ArmorMaterial armorMatThaumium = EnumHelper.addArmorMaterial("THAUMIUM", 25, new int[] { 2, 6, 5, 2 }, 25); + public static ArmorMaterial 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 EntityTagsNBT { + public EntityTagsNBT(String name, Object value) { + this.name = name; + this.value = value; + } + public String name; + public Object value; + } + public static class EntityTags { + public EntityTags(String entityName, AspectList aspects, EntityTagsNBT... nbts) { + this.entityName = entityName; + this.nbts = nbts; + this.aspects = aspects; + } + public String entityName; + public EntityTagsNBT[] 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, EntityTagsNBT... nbt ) { + scanEntities.add(new EntityTags(entityName,aspects,nbt)); + } + + //RECIPES///////////////////////////////////////// + private static ArrayList craftingRecipes = new ArrayList(); + private static HashMap smeltingBonus = new HashMap(); + + /** + * This method is used to determine what bonus items are generated when the infernal furnace smelts items + * @param in The input of the smelting operation. e.g. new ItemStack(Block.oreGold) + * @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(Item.getIdFromItem(in.getItem()),in.getItemDamage()), + new ItemStack(out.getItem(),0,out.getItemDamage())); + } + + /** + * This method is used to determine what bonus items are generated when the infernal furnace smelts items + * @param in The ore dictionary input of the smelting operation. e.g. "oreGold" + * @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(String in, ItemStack out) { + smeltingBonus.put( in, new ItemStack(out.getItem(),0,out.getItemDamage())); + } + + /** + * Returns the bonus item produced from a smelting operation in the infernal furnace + * @param in The input of the smelting operation. e.g. new ItemStack(oreGold) + * @return the The bonus item that can be produced + */ + public static ItemStack getSmeltingBonus(ItemStack in) { + ItemStack out = smeltingBonus.get(Arrays.asList(Item.getIdFromItem(in.getItem()),in.getItemDamage())); + if (out==null) { + out = smeltingBonus.get(Arrays.asList(Item.getIdFromItem(in.getItem()),OreDictionary.WILDCARD_VALUE)); + } + if (out==null) { + String od = OreDictionary.getOreName( OreDictionary.getOreID(in)); + out = smeltingBonus.get(od); + } + return out; + } + + 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 Object[])) 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).getRecipeOutput() instanceof ItemStack) { + if (((ItemStack) ((InfusionRecipe)r).getRecipeOutput()).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).getRecipeOutput().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[] {Item.getIdFromItem(stack.getItem()),stack.getItemDamage()}; + if (keyCache.containsKey(key)) { + if (keyCache.get(key)==null) return null; + if (ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), (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 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(Item item, int meta) { + AspectList tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,meta)); + if (tmp==null) { + tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,OreDictionary.WILDCARD_VALUE)); + if (meta==OreDictionary.WILDCARD_VALUE && tmp==null) { + int index=0; + do { + tmp = ThaumcraftApi.objectTags.get(Arrays.asList(item,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(new ItemStack(Blocks.cobblestone), (new AspectList()).add(Aspect.ENTROPY, 1).add(Aspect.EARTH, 1)); + * @param item the item passed. Pass OreDictionary.WILDCARD_VALUE 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(ItemStack item, AspectList aspects) { + if (aspects==null) aspects=new AspectList(); + try { + objectTags.put(Arrays.asList(item.getItem(),item.getItemDamage()), aspects); + } catch (Exception e) {} + } + + + /** + * Used to assign apsects to the given item/block. Here is an example of the declaration for cobblestone:

+ * ThaumcraftApi.registerObjectTag(new ItemStack(Blocks.cobblestone), new int[]{0,1}, (new AspectList()).add(Aspect.ENTROPY, 1).add(Aspect.EARTH, 1)); + * @param item + * @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(ItemStack item, int[] meta, AspectList aspects) { + if (aspects==null) aspects=new AspectList(); + try { + objectTags.put(Arrays.asList(item.getItem(),meta), aspects); + } catch (Exception e) {} + } + + /** + * 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) { + try { + objectTags.put(Arrays.asList(ore.getItem(), ore.getItemDamage()), aspects); + } catch (Exception e) {} + } + } + } + + /** + * 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(new ItemStack(Blocks.cobblestone), (new AspectList()).add(Aspect.MECHANISM, 2).add(Aspect.MOTION, 4)); + * @param item, pass OreDictionary.WILDCARD_VALUE to meta 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(ItemStack item, AspectList aspects ) { + if (!exists(item.getItem(),item.getItemDamage())) { + AspectList tmp = ThaumcraftApiHelper.generateTags(item.getItem(), item.getItemDamage()); + if (tmp != null && tmp.size()>0) { + for(Aspect tag:tmp.getAspects()) { + aspects.add(tag, tmp.getAmount(tag)); + } + } + registerObjectTag(item,aspects); + } else { + AspectList tmp = ThaumcraftApiHelper.getObjectAspects(item); + for(Aspect tag:aspects.getAspects()) { + tmp.merge(tag, tmp.getAmount(tag)); + } + registerObjectTag(item,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. Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get + * checked. + * 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. + * Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get checked. + * 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)); + * + * Stacked crops (like reeds) are crops that you wish the bottom block should remain after harvesting. + * 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. Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the actualy md won't get + * checked. If it has the order upgrade it will only harvest if the crop is more than one block high. + * Example: + * FMLInterModComms.sendMessage("Thaumcraft", "harvestStackedCrop", new ItemStack(Block.reed,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 (default 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"); + */ + + //LAMP OF GROWTH BLACKLIST /////////////////////////////////////////////////////////////////////////// + /** + * You can blacklist crops that should not be effected by the Lamp of Growth via FMLInterModComms + * in your @Mod.Init method using the "lampBlacklist" itemstack message. + * Sending a metadata of [OreDictionary.WILDCARD_VALUE] will mean the metadata won't get checked. + * Example for vanilla wheat: + * FMLInterModComms.sendMessage("Thaumcraft", "lampBlacklist", new ItemStack(Block.crops,1,OreDictionary.WILDCARD_VALUE)); + */ + + //DIMENSION BLACKLIST /////////////////////////////////////////////////////////////////////////// + /** + * You can blacklist a dimension to not spawn certain thaumcraft features + * in your @Mod.Init method using the "dimensionBlacklist" string message in the format "[dimension]:[level]" + * The level values are as follows: + * [0] stop all tc spawning and generation + * [1] allow ore and node generation + * [2] allow mob spawning + * [3] allow ore and node gen + mob spawning + * Example: + * FMLInterModComms.sendMessage("Thaumcraft", "dimensionBlacklist", "15:1"); + */ + + //BIOME BLACKLIST /////////////////////////////////////////////////////////////////////////// + /** + * You can blacklist a biome to not spawn certain thaumcraft features + * in your @Mod.Init method using the "biomeBlacklist" string message in the format "[biome id]:[level]" + * The level values are as follows: + * [0] stop all tc spawning and generation + * [1] allow ore and node generation + * [2] allow mob spawning + * [3] allow ore and node gen + mob spawning + * Example: + * FMLInterModComms.sendMessage("Thaumcraft", "biomeBlacklist", "180:2"); + */ +} diff --git a/1.7.10/api/java/thaumcraft/api/ThaumcraftApiHelper.java b/1.7.10/api/java/thaumcraft/api/ThaumcraftApiHelper.java new file mode 100644 index 00000000..b5feb068 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/ThaumcraftApiHelper.java @@ -0,0 +1,268 @@ +package thaumcraft.api; + +import java.lang.reflect.Method; +import java.util.HashMap; + +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.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.IEssentiaTransport; +import cpw.mods.fml.common.FMLLog; + +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) 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); + } + + static Method consumeVisFromWand; + /** + * Use to subtract vis from a wand for most operations + * Wands store vis differently so "real" vis costs need to be multiplied by 100 before calling this method + * @param wand the wand itemstack + * @param player the player using the wand + * @param cost the cost of the operation. + * @param doit actually subtract the vis from the wand if true - if false just simulate the result + * @param crafting is this a crafting operation or not - if + * false then things like frugal and potency will apply to the costs + * @return was the vis successfully subtracted + */ + public static boolean consumeVisFromWand(ItemStack wand, EntityPlayer player, + AspectList cost, boolean doit, boolean crafting) { + boolean ot = false; + try { + if(consumeVisFromWand == null) { + Class fake = Class.forName("thaumcraft.common.items.wands.ItemWandCasting"); + consumeVisFromWand = fake.getMethod("consumeAllVis", + ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class, boolean.class); + } + ot = (Boolean) consumeVisFromWand.invoke( + consumeVisFromWand.getDeclaringClass().cast(wand.getItem()), wand, player, cost, doit, crafting); + } catch(Exception ex) { + FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.ItemWandCasting method consumeAllVis"); + } + return ot; + } + + static Method consumeVisFromWandCrafting; + /** + * Subtract vis for use by a crafting mechanic. Costs are calculated slightly + * differently and things like the frugal enchant is ignored + * Must NOT be multiplied by 100 - send the actual vis cost + * @param wand the wand itemstack + * @param player the player using the wand + * @param cost the cost of the operation. + * @param doit actually subtract the vis from the wand if true - if false just simulate the result + * @return was the vis successfully subtracted + */ + public static boolean consumeVisFromWandCrafting(ItemStack wand, EntityPlayer player, + AspectList cost, boolean doit) { + boolean ot = false; + try { + if(consumeVisFromWandCrafting == null) { + Class fake = Class.forName("thaumcraft.common.items.wands.ItemWandCasting"); + consumeVisFromWandCrafting = fake.getMethod("consumeAllVisCrafting", + ItemStack.class, EntityPlayer.class, AspectList.class, boolean.class); + } + ot = (Boolean) consumeVisFromWandCrafting.invoke( + consumeVisFromWandCrafting.getDeclaringClass().cast(wand.getItem()), wand, player, cost, doit); + } catch(Exception ex) { + FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.ItemWandCasting method consumeAllVisCrafting"); + } + return ot; + } + + static Method consumeVisFromInventory; + /** + * Subtract vis from a wand the player is carrying. Works like consumeVisFromWand in that actual vis + * costs should be multiplied by 100. The costs are handled like crafting however and things like + * frugal don't effect them + * @param player the player using the wand + * @param cost the cost of the operation. + * @return was the vis successfully subtracted + */ + public static boolean consumeVisFromInventory(EntityPlayer player, AspectList cost) { + boolean ot = false; + try { + if(consumeVisFromInventory == null) { + Class fake = Class.forName("thaumcraft.common.items.wands.WandManager"); + consumeVisFromInventory = fake.getMethod("consumeVisFromInventory", + EntityPlayer.class, AspectList.class); + } + ot = (Boolean) consumeVisFromInventory.invoke(null, player, cost); + } catch(Exception ex) { + FMLLog.warning("[Thaumcraft API] Could not invoke thaumcraft.common.items.wands.WandManager method consumeVisFromInventory"); + } + return ot; + } +} diff --git a/1.7.10/api/java/thaumcraft/api/aspects/Aspect.java b/1.7.10/api/java/thaumcraft/api/aspects/Aspect.java new file mode 100644 index 00000000..3c33a4a7 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/aspects/Aspect.java @@ -0,0 +1,201 @@ +package thaumcraft.api.aspects; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; + +import org.apache.commons.lang3.text.WordUtils; + +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 + 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 WEATHER = new Aspect("tempestas",0xFFFFFF, new Aspect[] {AIR, WATER}); + public static final Aspect MOTION = new Aspect("motus",0xcdccf4, new Aspect[] {AIR, ORDER}); + public static final Aspect COLD = new Aspect("gelum",0xe1ffff, new Aspect[] {FIRE, ENTROPY}); + public static final Aspect CRYSTAL = new Aspect("vitreus",0x80ffff, new Aspect[] {EARTH, ORDER}); + public static final Aspect LIFE = new Aspect("victus",0xde0005, new Aspect[] {WATER, EARTH}); + public static final Aspect POISON = new Aspect("venenum",0x89f000, new Aspect[] {WATER, ENTROPY}); + public static final Aspect ENERGY = new Aspect("potentia",0xc0ffff, new Aspect[] {ORDER, FIRE}); + public static final Aspect EXCHANGE = new Aspect("permutatio",0x578357, new Aspect[] {ENTROPY, ORDER}); +// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {AIR, EARTH}); +// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {FIRE, EARTH}); +// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {FIRE, WATER}); +// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {ORDER, WATER}); +// public static final Aspect ?? = new Aspect("??",0xcdccf4, new Aspect[] {EARTH, ENTROPY}); + + //TERTIARY + public static final Aspect METAL = new Aspect("metallum",0xb5b5cd, new Aspect[] {EARTH, CRYSTAL}); + 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, ORDER}); + public static final Aspect TRAVEL = new Aspect("iter",0xe0585b, new Aspect[] {MOTION, EARTH}); + 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 SLIME = new Aspect("limus",0x01f800, new Aspect[] {LIFE, WATER}); + public static final Aspect PLANT = new Aspect("herba",0x01ac00, new Aspect[] {LIFE, EARTH}); + public static final Aspect TREE = new Aspect("arbor",0x876531, new Aspect[] {AIR, 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[] {PLANT, MAN}); + public static final Aspect MINE = new Aspect("perfodio",0xdcd2d8, new Aspect[] {MAN, EARTH}); + public static final Aspect TOOL = new Aspect("instrumentum",0x4040ee, new Aspect[] {MAN, ORDER}); + public static final Aspect HARVEST = new Aspect("meto",0xeead82, new Aspect[] {CROP, TOOL}); + 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}); + + +} diff --git a/1.7.10/api/java/thaumcraft/api/aspects/AspectList.java b/1.7.10/api/java/thaumcraft/api/aspects/AspectList.java new file mode 100644 index 00000000..6b9dfcef --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/aspects/AspectList.java @@ -0,0 +1,256 @@ +package thaumcraft.api.aspects; + +import java.io.Serializable; +import java.util.LinkedHashMap; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import thaumcraft.api.ThaumcraftApiHelper; + +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 the itemstack of the given item + */ + public AspectList(ItemStack stack) { + try { + AspectList temp = ThaumcraftApiHelper.getObjectAspects(stack); + 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() { + try { + Aspect[] out = aspects.keySet().toArray(new Aspect[1]); + boolean change=false; + do { + change=false; + for(int a=0;a0) { + out[a] = e2; + out[a+1] = e1; + change = true; + break; + } + } + } while (change==true); + return out; + } catch (Exception e) { + return this.getAspects(); + } + } + + /** + * @return an array of all the aspects in this collection sorted by amount + */ + public Aspect[] getAspectsSortedAmount() { + try { + Aspect[] out = aspects.keySet().toArray(new Aspect[1]); + boolean change=false; + do { + change=false; + for(int a=0;a0 && 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; + } catch (Exception e) { + return this.getAspects(); + } + } + + /** + * @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 (amount0?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/1.7.10/api/java/thaumcraft/api/aspects/IEssentiaTransport.java b/1.7.10/api/java/thaumcraft/api/aspects/IEssentiaTransport.java new file mode 100644 index 00000000..fecbc160 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/aspects/IEssentiaTransport.java @@ -0,0 +1,100 @@ +package thaumcraft.api.aspects; + +import net.minecraftforge.common.util.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); + + /** + * Sets the amount of suction this block will apply + * @param suction + */ + public void setSuction(Aspect aspect, int amount); + + /** + * Returns the type of suction this block is applying. + * @param loc + * the location from where the suction is being checked + * @return + * a return type of null indicates the suction is untyped and the first thing available will be drawn + */ + public Aspect getSuctionType(ForgeDirection face); + + /** + * Returns the strength of suction this block is applying. + * @param loc + * the location from where the suction is being checked + * @return + */ + public int getSuctionAmount(ForgeDirection face); + + /** + * remove the specified amount of essentia from this transport tile + * @return how much was actually taken + */ + public int takeEssentia(Aspect aspect, int amount, ForgeDirection face); + + /** + * add the specified amount of essentia to this transport tile + * @return how much was actually added + */ + public int addEssentia(Aspect aspect, int amount, ForgeDirection face); + + /** + * What type of essentia this contains + * @param face + * @return + */ + public Aspect getEssentiaType(ForgeDirection face); + + /** + * How much essentia this block contains + * @param face + * @return + */ + public int getEssentiaAmount(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/1.7.10/api/java/thaumcraft/api/crafting/CrucibleRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/CrucibleRecipe.java new file mode 100644 index 00000000..ebd84791 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/CrucibleRecipe.java @@ -0,0 +1,74 @@ +package thaumcraft.api.crafting; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; +import thaumcraft.api.ThaumcraftApiHelper; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; + +public class CrucibleRecipe { + + private 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))catalyst).size()>0) { + if (ThaumcraftApiHelper.containsMatch(true, + ((ArrayList)catalyst).toArray(new ItemStack[]{}), cat)) return true; + } + return false; + } + + 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; + } + + public ItemStack getRecipeOutput() { + return recipeOutput; + } + +} diff --git a/1.7.10/api/java/thaumcraft/api/crafting/IArcaneRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/IArcaneRecipe.java new file mode 100644 index 00000000..bb5036d2 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/IArcaneRecipe.java @@ -0,0 +1,35 @@ +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(); + AspectList getAspects(IInventory var1); + String getResearch(); + + +} diff --git a/1.7.10/api/java/thaumcraft/api/crafting/IInfusionStabiliser.java b/1.7.10/api/java/thaumcraft/api/crafting/IInfusionStabiliser.java new file mode 100644 index 00000000..d137ff24 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/IInfusionStabiliser.java @@ -0,0 +1,19 @@ +package thaumcraft.api.crafting; + +import net.minecraft.world.World; + +/** + * + * @author Azanor + * + * Blocks that implement this interface act as infusion crafting stabilisers like candles and skulls + * + */ +public interface IInfusionStabiliser { + + /** + * returns true if the block can stabilise things + */ + public boolean canStabaliseInfusion(World world, int x, int y, int z); + +} diff --git a/1.7.10/api/java/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java new file mode 100644 index 00000000..6fb4d63d --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/InfusionEnchantmentRecipe.java @@ -0,0 +1,156 @@ +package thaumcraft.api.crafting; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Map; + +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; + +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.getCommandSenderName(), research)) { + return false; + } + + if (!enchantment.canApply(central) || !central.getItem().isItemTool(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 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/1.7.10/api/java/thaumcraft/api/crafting/InfusionRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/InfusionRecipe.java new file mode 100644 index 00000000..fef0a347 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/InfusionRecipe.java @@ -0,0 +1,128 @@ +package thaumcraft.api.crafting; + +import java.util.ArrayList; + +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; + +public class InfusionRecipe +{ + protected AspectList aspects; + protected String research; + private ItemStack[] components; + private ItemStack recipeInput; + protected Object recipeOutput; + protected 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 (getRecipeInput()==null) return false; + + if (research.length()>0 && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), research)) { + return false; + } + + ItemStack i2 = central.copy(); + if (getRecipeInput().getItemDamage()==OreDictionary.WILDCARD_VALUE) { + i2.setItemDamage(OreDictionary.WILDCARD_VALUE); + } + + if (!areItemStacksEqual(i2, getRecipeInput(), true)) return false; + + ArrayList ii = new ArrayList(); + for (ItemStack is:input) { + ii.add(is.copy()); + } + + for (ItemStack comp:getComponents()) { + boolean b=false; + for (int a=0;a stack0.getMaxStackSize() ? false : t1)); + } + + + public Object getRecipeOutput() { + return getRecipeOutput(this.getRecipeInput()); + } + + public AspectList getAspects() { + return getAspects(this.getRecipeInput()); + } + + public int getInstability() { + return getInstability(this.getRecipeInput()); + } + + public String getResearch() { + return research; + } + + public ItemStack getRecipeInput() { + return recipeInput; + } + + public ItemStack[] getComponents() { + return components; + } + + public Object getRecipeOutput(ItemStack input) { + return recipeOutput; + } + + public AspectList getAspects(ItemStack input) { + return aspects; + } + + public int getInstability(ItemStack input) { + return instability; + } +} diff --git a/1.7.10/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java new file mode 100644 index 00000000..40c7bc27 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/ShapedArcaneRecipe.java @@ -0,0 +1,261 @@ +package thaumcraft.api.crafting; + +import java.util.ArrayList; +import java.util.HashMap; + +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; + +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.getCommandSenderName(), 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.getItem() == input.getItem() && + (!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 AspectList getAspects(IInventory inv) { + return aspects; + } + + @Override + public String getResearch() { + return research; + } +} diff --git a/1.7.10/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java b/1.7.10/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java new file mode 100644 index 00000000..3d4ed508 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/crafting/ShapelessArcaneRecipe.java @@ -0,0 +1,157 @@ +package thaumcraft.api.crafting; + +import java.util.ArrayList; +import java.util.Iterator; + +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; + +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.getCommandSenderName(), 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.getItem() == input.getItem() && + (!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 AspectList getAspects(IInventory inv) { + return aspects; + } + + @Override + public String getResearch() { + return research; + } +} diff --git a/1.7.10/api/java/thaumcraft/api/nodes/INode.java b/1.7.10/api/java/thaumcraft/api/nodes/INode.java new file mode 100644 index 00000000..8c71414d --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/nodes/INode.java @@ -0,0 +1,53 @@ +package thaumcraft.api.nodes; + +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +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(); + + public AspectList getAspectsBase(); + + /** + * 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(Aspect aspect); + + /** + * Set the maximum capacity of each aspect the node can hold + * @return + */ + public void setNodeVisBase(Aspect aspect, short nodeVisBase); + +} diff --git a/1.7.10/api/java/thaumcraft/api/nodes/IRevealer.java b/1.7.10/api/java/thaumcraft/api/nodes/IRevealer.java new file mode 100644 index 00000000..14a19b54 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/nodes/IRevealer.java @@ -0,0 +1,22 @@ +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/1.7.10/api/java/thaumcraft/api/nodes/NodeModifier.java b/1.7.10/api/java/thaumcraft/api/nodes/NodeModifier.java new file mode 100644 index 00000000..885b8678 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/nodes/NodeModifier.java @@ -0,0 +1,6 @@ +package thaumcraft.api.nodes; + +public enum NodeModifier +{ + BRIGHT, PALE, FADING +} \ No newline at end of file diff --git a/1.7.10/api/java/thaumcraft/api/nodes/NodeType.java b/1.7.10/api/java/thaumcraft/api/nodes/NodeType.java new file mode 100644 index 00000000..355324b5 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/nodes/NodeType.java @@ -0,0 +1,6 @@ +package thaumcraft.api.nodes; + +public enum NodeType +{ + NORMAL, UNSTABLE, DARK, TAINTED, HUNGRY, PURE +} \ No newline at end of file diff --git a/1.7.10/api/java/thaumcraft/api/research/IScanEventHandler.java b/1.7.10/api/java/thaumcraft/api/research/IScanEventHandler.java new file mode 100644 index 00000000..d0efac5f --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/IScanEventHandler.java @@ -0,0 +1,9 @@ +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/1.7.10/api/java/thaumcraft/api/research/ResearchCategories.java b/1.7.10/api/java/thaumcraft/api/research/ResearchCategories.java new file mode 100644 index 00000000..82309b36 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/ResearchCategories.java @@ -0,0 +1,101 @@ +package thaumcraft.api.research; + +import java.util.Collection; +import java.util.LinkedHashMap; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; + +import org.apache.logging.log4j.Level; + +import cpw.mods.fml.common.FMLLog; + +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; + } + + /** + * This should only be done at the PostInit stage + * @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)) { + + if (!ri.isVirtual()) { + for (ResearchItem rr:rl.research.values()) { + if (rr.displayColumn == ri.displayColumn && rr.displayRow == ri.displayRow) { + FMLLog.log(Level.FATAL, "[Thaumcraft] Research ["+ri.getName()+"] not added as it overlaps with existing research ["+rr.getName()+"]"); + return; + } + } + } + + + 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/1.7.10/api/java/thaumcraft/api/research/ResearchCategoryList.java b/1.7.10/api/java/thaumcraft/api/research/ResearchCategoryList.java new file mode 100644 index 00000000..7eed0101 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/ResearchCategoryList.java @@ -0,0 +1,37 @@ +package thaumcraft.api.research; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.util.ResourceLocation; + +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/1.7.10/api/java/thaumcraft/api/research/ResearchItem.java b/1.7.10/api/java/thaumcraft/api/research/ResearchItem.java new file mode 100644 index 00000000..55b3820c --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/ResearchItem.java @@ -0,0 +1,367 @@ +package thaumcraft.api.research; + +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 3. + */ + private int complexity; + + /** + * Special research has a spiky border. Used for important research milestones. + */ + private boolean isSpecial; + + /** + * Research that can be directly purchased with RP in normal research difficulty. + */ + private boolean isSecondary; + + /** + * 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; + + @Deprecated + private boolean isLost; + + /** + * Concealed research does not display in the thaumonomicon until parent researches are discovered. + */ + private boolean isConcealed; + + /** + * Hidden research can only be discovered via scanning or knowledge fragments + */ + private boolean isHidden; + + /** + * These research items will automatically unlock for all players on game start + */ + private boolean isAutoUnlock; + + /** + * Scanning these items will have a chance of revealing hidden knowledge in the thaumonomicon + */ + private ItemStack[] itemTriggers; + + /** + * Scanning these entities will have a chance of revealing hidden knowledge in the thaumonomicon + */ + private String[] entityTriggers; + + /** + * Scanning things with these aspects will have a chance of revealing hidden knowledge in the thaumonomicon + */ + private Aspect[] aspectTriggers; + + private ResearchPage[] pages = null; + + public ResearchItem(String key, String category) + { + this.key = key; + this.category = category; + this.tags = new AspectList(); + this.icon_resource = null; + this.icon_item = null; + this.displayColumn = 0; + this.displayRow = 0; + this.setVirtual(); + + } + + public ResearchItem(String key, String category, AspectList tags, int col, int row, int complex, ResourceLocation icon) + { + this.key = key; + this.category = category; + this.tags = tags; + this.icon_resource = icon; + this.icon_item = null; + this.displayColumn = col; + this.displayRow = row; + this.complexity = complex; + if (complexity < 1) this.complexity = 1; + if (complexity > 3) this.complexity = 3; + } + + public ResearchItem(String key, String category, AspectList tags, int col, int row, int complex, ItemStack icon) + { + this.key = key; + this.category = category; + this.tags = tags; + this.icon_item = icon; + this.icon_resource = null; + this.displayColumn = col; + this.displayRow = row; + this.complexity = complex; + if (complexity < 1) this.complexity = 1; + if (complexity > 3) this.complexity = 3; + } + + public ResearchItem setSpecial() + { + this.isSpecial = true; + return this; + } + + public ResearchItem setStub() + { + this.isStub = true; + return this; + } + + @Deprecated + public ResearchItem setLost() + { + this.isLost = true; + return this; + } + + public ResearchItem setConcealed() + { + this.isConcealed = true; + return this; + } + + public ResearchItem setHidden() + { + this.isHidden = 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 setItemTriggers(ItemStack... par) + { + this.itemTriggers = par; + return this; + } + + public ResearchItem setEntityTriggers(String... par) + { + this.entityTriggers = par; + return this; + } + + public ResearchItem setAspectTriggers(Aspect... par) + { + this.aspectTriggers = par; + return this; + } + + public ItemStack[] getItemTriggers() { + return itemTriggers; + } + + public String[] getEntityTriggers() { + return entityTriggers; + } + + public Aspect[] getAspectTriggers() { + return aspectTriggers; + } + + public ResearchItem registerResearchItem() + { + ResearchCategories.addResearch(this); + return this; + } + + public String getName() + { + return StatCollector.translateToLocal("tc.research_name."+key); + } + + public String getText() + { + return StatCollector.translateToLocal("tc.research_text."+key); + } + + public boolean isSpecial() + { + return this.isSpecial; + } + + public boolean isStub() + { + return this.isStub; + } + + @Deprecated + public boolean isLost() + { + return this.isLost; + } + + public boolean isConcealed() + { + return this.isConcealed; + } + + public boolean isHidden() + { + return this.isHidden; + } + + 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 boolean isSecondary() { + return isSecondary; + } + + public ResearchItem setSecondary() { + this.isSecondary = 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/1.7.10/api/java/thaumcraft/api/research/ResearchPage.java b/1.7.10/api/java/thaumcraft/api/research/ResearchPage.java new file mode 100644 index 00000000..a2e7824a --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/ResearchPage.java @@ -0,0 +1,174 @@ +package thaumcraft.api.research; + +import java.util.List; + +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; + +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.getRecipeOutput(); + } + + /** + * @param recipe an infusion crafting recipe. + */ + public ResearchPage(InfusionRecipe recipe) { + this.type = PageType.INFUSION_CRAFTING; + this.recipe = recipe; + if (recipe.getRecipeOutput() instanceof ItemStack) { + this.recipeOutput = (ItemStack) recipe.getRecipeOutput(); + } else { + this.recipeOutput = recipe.getRecipeInput(); + } + } + + /** + * @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/1.7.10/api/java/thaumcraft/api/research/ScanResult.java b/1.7.10/api/java/thaumcraft/api/research/ScanResult.java new file mode 100644 index 00000000..e1498f31 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/research/ScanResult.java @@ -0,0 +1,39 @@ +package thaumcraft.api.research; + +import net.minecraft.entity.Entity; + +public class ScanResult { + public byte type = 0; //1=blocks,2=entities,3=phenomena + public int id; + public int meta; + public Entity entity; + public String phenomena; + + public ScanResult(byte type, int blockId, int blockMeta, Entity entity, + String phenomena) { + super(); + this.type = type; + this.id = blockId; + this.meta = 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 + && (id != sr.id || meta != sr.meta)) + return false; + if (type == 2 && entity.getEntityId() != sr.entity.getEntityId()) + return false; + if (type == 3 && !phenomena.equals(sr.phenomena)) + return false; + } + return true; + } + +} diff --git a/1.7.10/api/java/thaumcraft/api/wands/IWandFocus.java b/1.7.10/api/java/thaumcraft/api/wands/IWandFocus.java new file mode 100644 index 00000000..da4b9ae9 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/IWandFocus.java @@ -0,0 +1,64 @@ +package thaumcraft.api.wands; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +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". + */ + IIcon getFocusDepthLayerIcon(); + + public IIcon 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/1.7.10/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java b/1.7.10/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java new file mode 100644 index 00000000..4ef8c849 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/IWandRodOnUpdate.java @@ -0,0 +1,16 @@ +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/1.7.10/api/java/thaumcraft/api/wands/IWandTriggerManager.java b/1.7.10/api/java/thaumcraft/api/wands/IWandTriggerManager.java new file mode 100644 index 00000000..47465552 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/IWandTriggerManager.java @@ -0,0 +1,12 @@ +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/1.7.10/api/java/thaumcraft/api/wands/IWandable.java b/1.7.10/api/java/thaumcraft/api/wands/IWandable.java new file mode 100644 index 00000000..aeb9bac7 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/IWandable.java @@ -0,0 +1,25 @@ +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/1.7.10/api/java/thaumcraft/api/wands/ItemFocusBasic.java b/1.7.10/api/java/thaumcraft/api/wands/ItemFocusBasic.java new file mode 100644 index 00000000..35900520 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/ItemFocusBasic.java @@ -0,0 +1,166 @@ +package thaumcraft.api.wands; + +import java.text.DecimalFormat; +import java.util.List; +import java.util.Map; + +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.IIcon; +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 cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemFocusBasic extends Item implements IWandFocus { + + public ItemFocusBasic () + { + super(); + maxStackSize = 1; + canRepair=false; + this.setMaxDamage(0); + } + + public IIcon icon; + + @SideOnly(Side.CLIENT) + @Override + public IIcon 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 IIcon 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 IIcon getFocusDepthLayerIcon() { + // TODO Auto-generated method stub + return null; + } + + /** + * @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/1.7.10/api/java/thaumcraft/api/wands/StaffRod.java b/1.7.10/api/java/thaumcraft/api/wands/StaffRod.java new file mode 100644 index 00000000..e7ae90f0 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/StaffRod.java @@ -0,0 +1,48 @@ +package thaumcraft.api.wands; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +/** + * + * @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 StaffRod extends WandRod { + + boolean runes=false; + + public StaffRod(String tag, int capacity, ItemStack item, int craftCost) { + super(tag+"_staff", capacity, item, craftCost); + this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+tag+".png"); + } + + public StaffRod(String tag, int capacity, ItemStack item, int craftCost, + IWandRodOnUpdate onUpdate, ResourceLocation texture) { + super(tag+"_staff", capacity, item, craftCost, onUpdate, texture); + } + + public StaffRod(String tag, int capacity, ItemStack item, int craftCost, + IWandRodOnUpdate onUpdate) { + super(tag+"_staff", capacity, item, craftCost, onUpdate); + this.texture = new ResourceLocation("thaumcraft","textures/models/wand_rod_"+tag+".png"); + } + + public StaffRod(String tag, int capacity, ItemStack item, int craftCost, + ResourceLocation texture) { + super(tag+"_staff", capacity, item, craftCost, texture); + } + + public boolean hasRunes() { + return runes; + } + + public void setRunes(boolean hasRunes) { + this.runes = hasRunes; + } + + +} diff --git a/1.7.10/api/java/thaumcraft/api/wands/WandCap.java b/1.7.10/api/java/thaumcraft/api/wands/WandCap.java new file mode 100644 index 00000000..1fc9ba1c --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/WandCap.java @@ -0,0 +1,122 @@ +package thaumcraft.api.wands; + +import java.util.LinkedHashMap; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import thaumcraft.api.aspects.Aspect; + +/** + * 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/1.7.10/api/java/thaumcraft/api/wands/WandRod.java b/1.7.10/api/java/thaumcraft/api/wands/WandRod.java new file mode 100644 index 00000000..6b43cd47 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/WandRod.java @@ -0,0 +1,151 @@ +package thaumcraft.api.wands; + +import java.util.LinkedHashMap; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +/** + * + * @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 + */ + protected 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/1.7.10/api/java/thaumcraft/api/wands/WandTriggerRegistry.java b/1.7.10/api/java/thaumcraft/api/wands/WandTriggerRegistry.java new file mode 100644 index 00000000..68655cb7 --- /dev/null +++ b/1.7.10/api/java/thaumcraft/api/wands/WandTriggerRegistry.java @@ -0,0 +1,72 @@ +package thaumcraft.api.wands; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * 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 block + * @param meta send -1 as a wildcard value for all possible meta values + */ + public static void registerWandBlockTrigger(IWandTriggerManager manager, int event, Block block, int meta) { + triggers.put(Arrays.asList(block,meta), + Arrays.asList(manager,event)); + + } + + private static HashMap triggers = new HashMap(); + + public static boolean hasTrigger(Block block, int meta) { + if (triggers.containsKey(Arrays.asList(block,meta)) || + triggers.containsKey(Arrays.asList(block,-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 block + * @param meta + * @return + */ + public static boolean performTrigger(World world, ItemStack wand, EntityPlayer player, + int x, int y, int z, int side, Block block, int meta) { + + List l = triggers.get(Arrays.asList(block,meta)); + if (l==null) l = triggers.get(Arrays.asList(block,-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); + } + +} diff --git a/1.7.10/main/java/Blood Magic API - v1.0.1g+ (1.7.10).zip b/1.7.10/main/java/Blood Magic API - v1.0.1g+ (1.7.10).zip new file mode 100644 index 0000000000000000000000000000000000000000..0f6c3d9d017e12d5ba6ac88363d2f4b045170cae GIT binary patch literal 22027 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 3L) + { + continue; + } + FileOutputStream out = new FileOutputStream(file); + + byte[] buffer = new byte[8192]; + int len; + while((len = zipStream.read(buffer)) != -1) + { + out.write(buffer, 0, len); + } + out.close(); + + extractCount++; + } + } + } + catch(Exception e) + { + + } + } + + TEDemonPortal.loadBuildingList(); + + 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); + } + } + AlchemicalWizardry.lifeEssenceFluid = new LifeEssence("Life Essence"); + FluidRegistry.registerFluid(lifeEssenceFluid); + + ModBlocks.init(); + + + ModBlocks.registerBlocksInPre(); + + ModItems.init(); + + ModItems.registerItems(); + + RecipeSorter.INSTANCE.register("AWWayofTime:shapedorb", ShapedBloodOrbRecipe.class, Category.SHAPED, "before:minecraft:shapeless"); + RecipeSorter.INSTANCE.register("AWWayofTime:shapelessorb", ShapelessBloodOrbRecipe.class, Category.SHAPELESS, "after:minecraft:shapeless"); + + //FMLCommonHandler.instance().bus().register(new AlchemicalWizardryEventHooks()); + MinecraftForge.EVENT_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.registerBlocksInInit(); + //blocks + + proxy.registerRenderers(); + proxy.registerEntities(); + proxy.registerEntityTrackers(); + //ItemStacks used for crafting go here + ItemStack lapisStack = new ItemStack(Items.dye,1,4); + ItemStack lavaBucketStack = new ItemStack(Items.lava_bucket); + ItemStack cobblestoneStack = new ItemStack(Blocks.cobblestone); + ItemStack glassStack = new ItemStack(Blocks.glass, 1, craftingConstant); + 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); + 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,1,0); + 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', 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', 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(new ShapedBloodOrbRecipe(lavaCrystalStackCrafted, "glg", "lbl", "odo", 'g', glassStack, 'l', lavaBucketStack, 'b', weakBloodOrbStack, 'd', diamondStack, 'o', obsidianStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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(new ShapedBloodOrbRecipe(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', ironIngotStack, 'd', diamondStack, 'r', reinforcedSlateStack, 'g', goldIngotStack); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(new ItemStack(ModBlocks.bloodRune, 1, 1), "sbs", "bob", "srs", 's', stoneStack, 'o', magicianBloodOrbStack, 'b', emptyBucketStack, 'r', new ItemStack(ModItems.imbuedSlate))); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModBlocks.bloodRune, 1, 2), "sbs", "bob", "srs", 's', stoneStack, 'o', magicianBloodOrbStack, 'b', waterBucketStack, 'r', new ItemStack(ModItems.imbuedSlate))); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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(new ShapedBloodOrbRecipe(airSigilStack, "fgf", "fsf", "fof", 'f', featherStack, 'g', ghastTearStack, 's', reinforcedSlateStack, 'o', apprenticeBloodOrbStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(miningSigilStackCrafted, "sps", "hra", "sos", 'o', apprenticeBloodOrbStack, 's', stoneStack, 'p', ironPickaxeStack, 'h', ironShovelStack, 'a', ironAxeStack, 'r', reinforcedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(runeOfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', goldIngotStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(runeOfSelfSacrificeStack, "srs", "gog", "srs", 's', stoneStack, 'g', glowstoneDustStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(divinationSigilStackCrafted, "ggg", "gsg", "gog", 'g', glassStack, 's', blankSlateStack, 'o', weakBloodOrbStack)); +// GameRegistry.addRecipe(waterScribeToolStack, "f", "i", 'f', featherStack, 'i', elementalInkWaterStack); +// GameRegistry.addRecipe(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(new ShapedBloodOrbRecipe(ritualStoneStackCrafted, "srs", "ror", "srs", 's', obsidianStack, 'o', apprenticeBloodOrbStack, 'r', reinforcedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(masterRitualStoneStack, "brb", "ror", "brb", 'b', obsidianStack, 'o', magicianBloodOrbStack, 'r', ritualStoneStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(imperfectRitualStoneStack, "bsb", "sos", "bsb", 's', stoneStack, 'b', obsidianStack, 'o', weakBloodOrbStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(sigilOfElementalAffinityStackCrafted, "oao", "wsl", "oro", 'o', obsidianStack, 'a', airSigilStack, 'w', waterSigilStack, 'l', lavaSigilStack, 'r', magicianBloodOrbStack, 's', imbuedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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(new ShapedBloodOrbRecipe(armourForgeStack, "sfs", "fof", "sfs", 'f', bloodSocketStack, 's', stoneStack, 'o', magicianBloodOrbStack)); + GameRegistry.addShapelessRecipe(largeBloodStoneBrickStackCrafted, weakBloodShardStack, stoneStack); + GameRegistry.addRecipe(bloodStoneBrickStackCrafted, "bb", "bb", 'b', largeBloodStoneBrickStack); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(growthSigilStack, "srs", "rer", "sos", 's', saplingStack, 'r', reedStack, 'o', apprenticeBloodOrbStack, 'e', reinforcedSlateStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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.addRecipe(new ShapelessBloodOrbRecipe(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 ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(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")); + 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")); + + ItemStack masterBloodOrbStack = new ItemStack(ModItems.masterBloodOrb); + + //FluidStack lifeEssenceFluidStack = new FluidStack(lifeEssenceFluid, 1); + //LiquidStack lifeEssence = new LiquidStack(lifeEssenceFlowing, 1); + //LiquidDictionary.getOrCreateLiquid("Life Essence", lifeEssence); + + +// ModBlocks.blockLifeEssence.setUnlocalizedName("lifeEssenceBlock"); + FluidContainerRegistry.registerFluidContainer(lifeEssenceFluid, new ItemStack(ModItems.bucketLife), FluidContainerRegistry.EMPTY_BUCKET); + + //lifeEssenceFluid.setUnlocalizedName("lifeEssence"); + //LiquidContainerRegistry.registerLiquid(new LiquidContainerData(LiquidDictionary.getLiquid("Life Essence", LiquidContainerRegistry.BUCKET_VOLUME), new ItemStack(AlchemicalWizardry.bucketLife), new ItemStack(Items.bucketEmpty))); + //GameRegistry.registerBlock(testingBlock, "testingBlock"); + //LanguageRegistry.addName(testingBlock, "Testing Block"); + //(testingBlock, "pickaxe", 0); + 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"); + GameRegistry.registerTileEntity(TESpectralContainer.class,"spectralContainerTileEntity"); + GameRegistry.registerTileEntity(TEDemonPortal.class, "containerDemonPortal"); + GameRegistry.registerTileEntity(TESchematicSaver.class, "containerSchematicSaver"); + //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); + + //Gui registration + // NetworkRegistry.instance().registerGuiHandler(this, new GuiHandlerAltar()); + UpgradedAltars.loadAltars(); + SigilOfHolding.initiateSigilOfHolding(); + ArmourForge.initializeRecipes(); + TEPlinth.initialize(); + + this.initAlchemyPotionRecipes(); + this.initAltarRecipes(); + this.initRituals(); + this.initBindingRecipes(); + + //MinecraftForge.setToolClass(ModItems.boundPickaxe, "pickaxe", 5); + //MinecraftForge.setToolClass(ModItems.boundAxe, "axe", 5); + //MinecraftForge.setToolClass(ModItems.boundShovel, "shovel", 5); + MinecraftForge.EVENT_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); + + ItemStack gunpowderStack = new ItemStack(Items.gunpowder); + + 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 virtusStack = new ItemStack(ModItems.baseAlchemyItems,1,6); + ItemStack reductusStack = new ItemStack(ModItems.baseAlchemyItems,1,7); + ItemStack potentiaStack = new ItemStack(ModItems.baseAlchemyItems,1,8); + + 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(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}, 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(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); + + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.web),2,new ItemStack[]{new ItemStack(Items.string),new ItemStack(Items.string),new ItemStack(Items.string),new ItemStack(Items.string),new ItemStack(Items.string)},1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.gunpowder,2,0), 2, new ItemStack[]{gunpowderStack, new ItemStack(Items.coal), new ItemStack(Blocks.sand)}, 1); + + AlchemyRecipeRegistry.registerRecipe(strengthenedCatalystStackCrafted, 10, new ItemStack[]{simpleCatalystStack, simpleCatalystStack, new ItemStack(Items.dye,1,15), new ItemStack(Items.nether_wart)}, 3); + AlchemyRecipeRegistry.registerRecipe(offensaStack,10, new ItemStack[]{strengthenedCatalystStack,incendiumStack, new ItemStack(Items.arrow), new ItemStack(Items.flint), new ItemStack(Items.arrow)},3); + AlchemyRecipeRegistry.registerRecipe(praesidiumStack, 10, new ItemStack[]{strengthenedCatalystStack,tennebraeStack,ironIngotStack,new ItemStack(Blocks.web),redstoneStack}, 3); + AlchemyRecipeRegistry.registerRecipe(orbisTerraeStack, 10, new ItemStack[]{strengthenedCatalystStack,terraeStack, gunpowderStack, new ItemStack(Blocks.netherrack), new ItemStack(Blocks.sand)}, 3); + AlchemyRecipeRegistry.registerRecipe(concentratedCatalystStack,10,new ItemStack[]{strengthenedCatalystStack,fracturedBoneStack,goldNuggetStack},4); + AlchemyRecipeRegistry.registerRecipe(fracturedBoneStackCrafted, 2, new ItemStack[]{new ItemStack(Items.bone), new ItemStack(Items.bone),new ItemStack(Items.bone),new ItemStack(Items.bone), gunpowderStack},1); + AlchemyRecipeRegistry.registerRecipe(virtusStack,20, new ItemStack[]{redstoneStack, new ItemStack(Items.coal),strengthenedCatalystStack,redstoneStack,gunpowderStack}, 3); + AlchemyRecipeRegistry.registerRecipe(reductusStack,20,new ItemStack[]{redstoneStack, goldIngotStack, strengthenedCatalystStack,new ItemStack(Blocks.soul_sand), new ItemStack(Items.carrot)},3); + AlchemyRecipeRegistry.registerRecipe(potentiaStack,20, new ItemStack[]{glowstoneDustStack,strengthenedCatalystStack,lapisStack,lapisStack,new ItemStack(Items.quartz)}, 3); + + + 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 SummoningHelperAW(this.entityFallenAngelID), new ItemStack[]{sanctusStack, sanctusStack, sanctusStack, aetherStack, tennebraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(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 SummoningHelperAW(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 SummoningHelperAW(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 SummoningHelperAW(this.entitySmallEarthGolemID), new ItemStack[]{new ItemStack(Items.clay_ball), terraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityIceDemonID), new ItemStack[]{crystallosStack, crystallosStack, aquasalusStack, crystallosStack, sanctusStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(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 SummoningHelperAW(this.entityShadeID), new ItemStack[]{tennebraeStack, tennebraeStack, tennebraeStack, aetherStack, glassStack, new ItemStack(Items.glass_bottle)}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityAirElementalID), new ItemStack[]{aetherStack, aetherStack, aetherStack, aetherStack, aetherStack, aetherStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityWaterElementalID), new ItemStack[]{aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack, aquasalusStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityEarthElementalID), new ItemStack[]{terraeStack, terraeStack, terraeStack, terraeStack, terraeStack, terraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityFireElementalID), new ItemStack[]{incendiumStack, incendiumStack, incendiumStack, incendiumStack, incendiumStack, incendiumStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(this.entityShadeElementalID), new ItemStack[]{tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack,tennebraeStack}, new ItemStack[]{}, new ItemStack[]{}, 0, 4); + SummoningRegistry.registerSummon(new SummoningHelperAW(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); + 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); + + //Register spell component recipes + ItemStack complexSpellCrystalStack = new ItemStack(ModItems.itemComplexSpellCrystal); + 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 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 powerCoreStack = new ItemStack(ModItems.baseItems,1,22); + ItemStack costCoreStack = new ItemStack(ModItems.baseItems,1,23); + ItemStack potencyCoreStack = new ItemStack(ModItems.baseItems,1,24); + ItemStack obsidianBraceStack = new ItemStack(ModItems.baseItems,1,25); + + 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(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(obsidianBraceStack," is","ibi","si ",'i', obsidianStack,'s',reinforcedSlateStack,'b',stoneBraceStack); + + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(projectileCoreStack, "mbm","aca","mom",'c', emptyCoreStack,'b',weakBloodShardStack,'m', magicalesStack,'o', magicianBloodOrbStack,'a',new ItemStack(Items.arrow))); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(selfCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',sanctusStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',glowstoneDustStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(meleeCoreStack,"sbs","ncn","sos",'c', emptyCoreStack, 's',incendiumStack,'b', weakBloodShardStack,'o', magicianBloodOrbStack,'n',new ItemStack(Items.fire_charge))); + 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(new ShapedBloodOrbRecipe(flameCoreStack,"mdm","scs","mom",'m',incendiumStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(iceCoreStack,"mdm","scs","mom",'m',crystallosStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(windCoreStack,"mdm","scs","mom",'m',aetherStack,'c',emptyCoreStack,'o',magicianBloodOrbStack,'d',diamondStack,'s',weakBloodShardStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(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 ShapedBloodOrbRecipe(defaultCoreStack,"msm","geg","mom",'m', strengthenedCatalystStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(offenseCoreStack,"msm","geg","mom",'m', offensaStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(defensiveCoreStack,"msm","geg","mom",'m', praesidiumStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(environmentalCoreStack,"msm","geg","mom",'m', orbisTerraeStack,'e', emptyCoreStack, 'o', magicianBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(powerCoreStack,"msm","geg","mom",'m', virtusStack,'e', emptyCoreStack, 'o', masterBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(costCoreStack,"msm","geg","mom",'m', reductusStack,'e', emptyCoreStack, 'o', masterBloodOrbStack, 's',weakBloodShardStack, 'g', goldIngotStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(potencyCoreStack,"msm","geg","mom",'m', potentiaStack,'e', emptyCoreStack, 'o', masterBloodOrbStack, '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); + AlchemyRecipeRegistry.registerRecipe(complexSpellCrystalStack,50,new ItemStack[]{new ItemStack(ModItems.blankSpell), weakBloodShardStack, weakBloodShardStack, diamondStack,goldIngotStack},3); + + 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); + + 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', powerCoreStack,'b',woodBraceStack,'p',crackedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,1),"bpb","ico","bpb",'c', powerCoreStack,'b',stoneBraceStack,'p',runicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,2),"bpb","ico","bpb",'c', powerCoreStack,'b',obsidianBraceStack,'p',imbuedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,5),"bpb","ico","bpb",'c', costCoreStack,'b',woodBraceStack,'p',crackedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,6),"bpb","ico","bpb",'c', costCoreStack,'b',stoneBraceStack,'p',runicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,7),"bpb","ico","bpb",'c', costCoreStack,'b',obsidianBraceStack,'p',imbuedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,10),"bpb","ico","bpb",'c', potencyCoreStack,'b',woodBraceStack,'p',crackedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,11),"bpb","ico","bpb",'c', potencyCoreStack,'b',stoneBraceStack,'p',runicPlateStack,'i',inputCableStack,'o',outputCableStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockSpellEnhancement,1,12),"bpb","ico","bpb",'c', potencyCoreStack,'b',obsidianBraceStack,'p',imbuedRunicPlateStack,'i',inputCableStack,'o',outputCableStack); + + GameRegistry.addShapelessRecipe(new ItemStack(Items.dye,5,15),fracturedBoneStack); + + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.itemSigilOfSupression),"wtl","wvl","wol",'v',new ItemStack(ModItems.voidSigil),'t',new ItemStack(ModBlocks.blockTeleposer),'o',masterBloodOrbStack,'l',lavaBucketStack,'w',waterBucketStack)); + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(new ItemStack(ModItems.itemSigilOfEnderSeverance),"ptp","ese","pop",'s',new ItemStack(ModItems.demonicSlate),'t',weakBloodShardStack,'o',masterBloodOrbStack,'e',new ItemStack(Items.ender_eye),'p', new ItemStack(Items.ender_pearl))); + + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.flint,2,0), 1, new ItemStack[]{new ItemStack(Blocks.gravel),new ItemStack(Items.flint)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.grass), 2, new ItemStack[]{new ItemStack(Blocks.dirt),new ItemStack(Items.dye,1,15),new ItemStack(Items.wheat_seeds),new ItemStack(Items.wheat_seeds)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.leather,3,0), 2, new ItemStack[]{new ItemStack(Items.rotten_flesh),new ItemStack(Items.rotten_flesh),new ItemStack(Items.rotten_flesh),waterBucketStack,new ItemStack(Items.flint)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.bread), 1, new ItemStack[]{new ItemStack(Items.wheat),new ItemStack(Items.sugar)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.fire_charge,5,0), 3, new ItemStack[]{new ItemStack(Items.coal),new ItemStack(Items.blaze_powder),gunpowderStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.sand,2,0), 1, new ItemStack[]{new ItemStack(Blocks.cobblestone),gunpowderStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.clay,4,0), 2, new ItemStack[]{new ItemStack(Blocks.hardened_clay,1,craftingConstant),new ItemStack(Blocks.hardened_clay,1,craftingConstant),new ItemStack(Blocks.hardened_clay,1,craftingConstant),new ItemStack(Blocks.hardened_clay,1,craftingConstant),waterBucketStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.string,4,0), 1, new ItemStack[]{new ItemStack(Blocks.wool,1,craftingConstant),new ItemStack(Items.flint)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.gravel,2,0), 1, new ItemStack[]{new ItemStack(Blocks.stone),gunpowderStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.obsidian), 1, new ItemStack[]{waterBucketStack,lavaBucketStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.paper), 1, new ItemStack[]{new ItemStack(Items.reeds)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.soul_sand,3,0), 3, new ItemStack[]{new ItemStack(Blocks.sand),new ItemStack(Blocks.sand),new ItemStack(Blocks.sand),waterBucketStack,weakBloodShardStack}, 3); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.mycelium,1,0), 5, new ItemStack[]{new ItemStack(Blocks.grass),new ItemStack(Blocks.brown_mushroom), new ItemStack(Blocks.red_mushroom)}, 2); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.ice), 2, new ItemStack[]{waterBucketStack,new ItemStack(Items.snowball)}, 1); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) + { + //TODO Thaumcraft Integration + if (Loader.isModLoaded("Thaumcraft")) + { + this.isThaumcraftLoaded = true; + + try + { + //do stuff + ModItems.sanguineHelmet = new ItemSanguineArmour().setUnlocalizedName("sanguineHelmet"); + GameRegistry.registerItem(ModItems.sanguineHelmet, "sanguineHelmet"); + + ItemStack itemGoggles = ItemApi.getItem("itemGoggles", 0); + + if (itemGoggles != null) + { + BindingRegistry.registerRecipe(new ItemStack(ModItems.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; + } + } + + public static void initAlchemyPotionRecipes() + { + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.ghast_tear), Potion.regeneration.id, 450); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.golden_carrot), Potion.nightVision.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.magma_cream), Potion.fireResistance.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.water_bucket), Potion.waterBreathing.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.sugar), Potion.moveSpeed.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.speckled_melon), Potion.heal.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.spider_eye), Potion.poison.id, 450); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.fermented_spider_eye), Potion.weakness.id, 450); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.blaze_powder), Potion.damageBoost.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(ModItems.aether), Potion.jump.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.clay_ball), Potion.moveSlowdown.id, 450); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.redstone), Potion.digSpeed.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.potionitem, 1, 0), AlchemicalWizardry.customPotionDrowning.id, 450); + //AlchemicalPotionCreationHandler.addPotion(new ItemStack(Item.goldenCarrot),Potion.nightVision.id,2*60*20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.glass_bottle), Potion.invisibility.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.diamond), Potion.resistance.id, 2 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.poisonous_potato), Potion.field_76443_y.id, 2); //saturation + AlchemicalPotionCreationHandler.addPotion(new ItemStack(ModItems.demonBloodShard), Potion.field_76434_w.id, 4 * 60 * 20); //health boost + AlchemicalPotionCreationHandler.addPotion(new ItemStack(ModItems.weakBloodShard), Potion.field_76444_x.id, 4 * 60 * 20); //Absorption + AlchemicalPotionCreationHandler.addPotion(new ItemStack(ModItems.terrae), AlchemicalWizardry.customPotionBoost.id, 1 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.feather), AlchemicalWizardry.customPotionFlight.id, 1 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.arrow), AlchemicalWizardry.customPotionReciprocation.id, 1 * 60 * 20); + AlchemicalPotionCreationHandler.addPotion(new ItemStack(Items.ender_pearl),AlchemicalWizardry.customPotionPlanarBinding.id,1*60*20); + } + + public static void initAltarRecipes() + { + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.weakBloodOrb), new ItemStack(Items.diamond),1,2000,2,1,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.apprenticeBloodOrb), new ItemStack(Items.emerald),2,5000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.magicianBloodOrb), new ItemStack(Blocks.gold_block),3,25000,20,20,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.masterBloodOrb), new ItemStack(ModItems.weakBloodShard),4,40000,30,50,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.archmageBloodOrb), new ItemStack(ModItems.demonBloodShard),5,75000,50,100,false); + + AltarRecipeRegistry.registerAltarOrbRecipe(new ItemStack(ModItems.weakBloodOrb),1,2); + AltarRecipeRegistry.registerAltarOrbRecipe(new ItemStack(ModItems.apprenticeBloodOrb),2,5); + AltarRecipeRegistry.registerAltarOrbRecipe(new ItemStack(ModItems.magicianBloodOrb),3,15); + AltarRecipeRegistry.registerAltarOrbRecipe(new ItemStack(ModItems.masterBloodOrb),4,25); + AltarRecipeRegistry.registerAltarOrbRecipe(new ItemStack(ModItems.archmageBloodOrb),5,50); + + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.telepositionFocus), new ItemStack(Items.ender_pearl),4,2000,10,10,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.enhancedTelepositionFocus), new ItemStack(ModItems.telepositionFocus),4,10000,25,15,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.demonicSlate), new ItemStack(ModItems.imbuedSlate),4,15000,20,20,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.duskScribeTool), new ItemStack(Blocks.coal_block),4,2000,20,10,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModBlocks.bloodSocket), new ItemStack(ModBlocks.emptySocket),3,30000,40,10,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.earthScribeTool), new ItemStack(Blocks.obsidian),3,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.waterScribeTool), new ItemStack(Blocks.lapis_block),3,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.blankSpell), new ItemStack(Blocks.glass),2,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.blankSlate), new ItemStack(Blocks.stone),1,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.activationCrystal), new ItemStack(ModItems.lavaCrystal),3,10000,20,10,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.fireScribeTool), new ItemStack(Items.magma_cream),3,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.airScribeTool), new ItemStack(Items.ghast_tear),3,1000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.imbuedSlate), new ItemStack(ModItems.reinforcedSlate),3,5000,15,10,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.daggerOfSacrifice), new ItemStack(Items.iron_sword),2,3000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.alchemyFlask), new ItemStack(Items.glass_bottle),2,2000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.reinforcedSlate), new ItemStack(ModItems.blankSlate),2,2000,5,5,false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.bucketLife), new ItemStack(Items.bucket),1,1000,5,0,false); + } + + public static void initRituals() + { + Rituals.registerRitual("AW001Water", 1, 500, new RitualEffectWater(), "Ritual of the Full Spring"); + Rituals.registerRitual("AW002Lava", 1, 10000, new RitualEffectLava(), "Serenade of the Nether"); + Rituals.registerRitual("AW003GreenGrove", 1, 1000, new RitualEffectGrowth(), "Ritual of the Green Grove"); + Rituals.registerRitual("AW004Interdiction", 1, 1000, new RitualEffectInterdiction(), "Interdiction Ritual"); + Rituals.registerRitual("AW005Containment", 1, 2000, new RitualEffectContainment(), "Ritual of Containment"); + Rituals.registerRitual("AW006Binding", 1, 5000, new RitualEffectSoulBound(), "Ritual of Binding"); + Rituals.registerRitual("AW007Unbinding", 1, 30000, new RitualEffectUnbinding(), "Ritual of Unbinding"); + Rituals.registerRitual("AW008HighJump", 1, 1000, new RitualEffectJumping(), "Ritual of the High Jump"); + Rituals.registerRitual("AW009Magnetism", 1, 5000, new RitualEffectMagnetic(), "Ritual of Magnetism"); + Rituals.registerRitual("AW010Crusher", 1, 2500, new RitualEffectCrushing(), "Ritual of the Crusher"); + Rituals.registerRitual("AW011Speed", 1, 1000, new RitualEffectLeap(), "Ritual of Speed"); + Rituals.registerRitual("AW012AnimalGrowth", 1, 10000, new RitualEffectAnimalGrowth(), "Ritual of the Shepherd"); + Rituals.registerRitual("AW013Suffering", 1, 50000, new RitualEffectWellOfSuffering(), "Well of Suffering"); + Rituals.registerRitual("AW014Regen", 1, 25000, new RitualEffectHealing(), "Ritual of Regeneration"); + Rituals.registerRitual("AW015FeatheredKnife", 1, 50000, new RitualEffectFeatheredKnife(), "Ritual of the Feathered Knife"); + Rituals.registerRitual("AW016FeatheredEarth", 2, 100000, new RitualEffectFeatheredEarth(), "Ritual of the Feathered Earth"); + Rituals.registerRitual("AW017Gaia", 2, 1000000, new RitualEffectBiomeChanger(), "Ritual of Gaia's Transformation"); + Rituals.registerRitual("AW018Condor", 2, 1000000, new RitualEffectFlight(), "Reverence of the Condor"); + Rituals.registerRitual("AW019FallingTower", 2, 1000000, new RitualEffectSummonMeteor(), "Mark of the Falling Tower"); + Rituals.registerRitual("AW020BalladOfAlchemy", 1, 20000, new RitualEffectAutoAlchemy(), "Ballad of Alchemy"); + Rituals.registerRitual("AW021Expulsion", 1, 1000000, new RitualEffectExpulsion(), "Aura of Expulsion"); + Rituals.registerRitual("AW022Supression", 1, 10000, new RitualEffectSupression(), "Dome of Supression"); + Rituals.registerRitual("AW023Zephyr", 1, 25000, new RitualEffectItemSuction(),"Call of the Zephyr"); + //Rituals.registerRitual(1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); + } + + public static void initBindingRecipes() + { + BindingRegistry.registerRecipe(new ItemStack(ModItems.boundPickaxe), new ItemStack(Items.diamond_pickaxe)); + BindingRegistry.registerRecipe(new ItemStack(ModItems.boundAxe), new ItemStack(Items.diamond_axe)); + BindingRegistry.registerRecipe(new ItemStack(ModItems.boundShovel), new ItemStack(Items.diamond_shovel)); + BindingRegistry.registerRecipe(new ItemStack(ModItems.energySword), new ItemStack(Items.diamond_sword)); + BindingRegistry.registerRecipe(new ItemStack(ModItems.energyBlaster), new ItemStack(ModItems.apprenticeBloodOrb)); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java new file mode 100644 index 00000000..b13dcdd9 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/BloodMagicConfiguration.java @@ -0,0 +1,96 @@ +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(); + 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); + 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.allowedCrushedOresArray = config.get("oreCrushing", "allowedOres", new String[]{"iron","gold","copper","tin","lead","silver","osmium"}).getStringList(); + + AlchemicalWizardry.wimpySettings = config.get("WimpySettings","IDontLikeFun",false).getBoolean(false); + + } 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.10/main/java/WayofTime/alchemicalWizardry/ModBlocks.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/ModBlocks.java new file mode 100644 index 00000000..bb5625a4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/ModBlocks.java @@ -0,0 +1,162 @@ +package WayofTime.alchemicalWizardry; + +import net.minecraft.block.Block; +import WayofTime.alchemicalWizardry.common.block.ArmourForge; +import WayofTime.alchemicalWizardry.common.block.BlockAltar; +import WayofTime.alchemicalWizardry.common.block.BlockBloodLightSource; +import WayofTime.alchemicalWizardry.common.block.BlockConduit; +import WayofTime.alchemicalWizardry.common.block.BlockDemonPortal; +import WayofTime.alchemicalWizardry.common.block.BlockHomHeart; +import WayofTime.alchemicalWizardry.common.block.BlockMasterStone; +import WayofTime.alchemicalWizardry.common.block.BlockPedestal; +import WayofTime.alchemicalWizardry.common.block.BlockPlinth; +import WayofTime.alchemicalWizardry.common.block.BlockSchematicSaver; +import WayofTime.alchemicalWizardry.common.block.BlockSocket; +import WayofTime.alchemicalWizardry.common.block.BlockSpectralContainer; +import WayofTime.alchemicalWizardry.common.block.BlockSpellEffect; +import WayofTime.alchemicalWizardry.common.block.BlockSpellEnhancement; +import WayofTime.alchemicalWizardry.common.block.BlockSpellModifier; +import WayofTime.alchemicalWizardry.common.block.BlockSpellParadigm; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.block.BlockWritingTable; +import WayofTime.alchemicalWizardry.common.block.BloodRune; +import WayofTime.alchemicalWizardry.common.block.BloodStoneBrick; +import WayofTime.alchemicalWizardry.common.block.EfficiencyRune; +import WayofTime.alchemicalWizardry.common.block.EmptySocket; +import WayofTime.alchemicalWizardry.common.block.ImperfectRitualStone; +import WayofTime.alchemicalWizardry.common.block.LargeBloodStoneBrick; +import WayofTime.alchemicalWizardry.common.block.LifeEssenceBlock; +import WayofTime.alchemicalWizardry.common.block.RitualStone; +import WayofTime.alchemicalWizardry.common.block.RuneOfSacrifice; +import WayofTime.alchemicalWizardry.common.block.RuneOfSelfSacrifice; +import WayofTime.alchemicalWizardry.common.block.SpectralBlock; +import WayofTime.alchemicalWizardry.common.block.SpeedRune; +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 cpw.mods.fml.common.registry.GameRegistry; + +/** + * 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 Block blockSpectralContainer; + public static Block blockBuildingSchematicSaver; + public static Block blockDemonPortal; + + public static void init() + { + blockAltar = new BlockAltar(); + bloodRune = new BloodRune(); + speedRune = new SpeedRune(); + efficiencyRune = new EfficiencyRune(); + runeOfSacrifice = new RuneOfSacrifice(); + runeOfSelfSacrifice = new RuneOfSelfSacrifice(); + + 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(); + blockSpectralContainer = new BlockSpectralContainer(); + blockDemonPortal = new BlockDemonPortal(); + blockBuildingSchematicSaver = new BlockSchematicSaver(); + + blockLifeEssence = new LifeEssenceBlock(); + } + + public static void registerBlocksInPre() + { + 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.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"); + 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.blockSpectralContainer, "spectralContainer"); + GameRegistry.registerBlock(ModBlocks.blockDemonPortal, "demonPortalMain"); + GameRegistry.registerBlock(ModBlocks.blockBuildingSchematicSaver, "blockSchemSaver"); + + } + + public static void registerBlocksInInit() + { + //GameRegistry.registerBlock(ModBlocks.blockLifeEssence, "lifeEssence"); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/ModItems.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/ModItems.java new file mode 100644 index 00000000..e1cc8f3a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/ModItems.java @@ -0,0 +1,366 @@ +package WayofTime.alchemicalWizardry; + +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.ItemAlchemyBase; +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.ItemFluidSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSeerSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSigilOfEnderSeverance; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSigilOfSupression; +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 WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; +import cpw.mods.fml.common.registry.GameRegistry; + +/** + * 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 baseItems; + public static Item baseAlchemyItems; + + 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 itemSigilOfEnderSeverance; + public static Item itemSigilOfSupression; + public static Item itemFluidSigil; + public static Item itemSeerSigil; + + public static Item customTool; + + 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); + itemSigilOfEnderSeverance = (new ItemSigilOfEnderSeverance()).setUnlocalizedName("itemSigilOfEnderSeverance"); + baseItems = new ItemComponents().setUnlocalizedName("baseItems"); + baseAlchemyItems = new ItemAlchemyBase().setUnlocalizedName("baseAlchemyItems"); + itemSigilOfSupression = new ItemSigilOfSupression().setUnlocalizedName("itemSigilOfSupression"); + itemFluidSigil = new ItemFluidSigil().setUnlocalizedName("itemFluidSigil"); + itemSeerSigil = new ItemSeerSigil().setUnlocalizedName("itemSeerSigil"); + customTool = new ItemSpellMultiTool().setUnlocalizedName("multiTool"); + } + + 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.itemSigilOfSupression, "sigilOfSupression"); + GameRegistry.registerItem(ModItems.itemSigilOfEnderSeverance, "sigilOfEnderSeverance"); + GameRegistry.registerItem(ModItems.itemFluidSigil, "fluidSigil"); + GameRegistry.registerItem(ModItems.itemSeerSigil, "seerSigil"); + + GameRegistry.registerItem(ModItems.customTool, "customTool"); + + 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.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemicalPotionCreationHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemicalPotionCreationHandler.java new file mode 100644 index 00000000..4a4b40e0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemicalPotionCreationHandler.java @@ -0,0 +1,79 @@ +package WayofTime.alchemicalWizardry.api.alchemy; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; + +public class AlchemicalPotionCreationHandler +{ + public static ArrayList registeredPotionEffects = new ArrayList(); + + 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.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHandlerComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHandlerComponent.java new file mode 100644 index 00000000..6f0d461d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHandlerComponent.java @@ -0,0 +1,52 @@ +package WayofTime.alchemicalWizardry.api.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.getItem().equals(itemStack.getItem()) && comparedStack.getItemDamage() == itemStack.getItemDamage(); + } + } else if (!(itemStack.getItem() instanceof ItemBlock)) + { + return comparedStack.getItem().equals(itemStack.getItem()) && 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.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHelper.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHelper.java new file mode 100644 index 00000000..d3462552 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyPotionHelper.java @@ -0,0 +1,76 @@ +package WayofTime.alchemicalWizardry.api.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.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipe.java new file mode 100644 index 00000000..f773d063 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipe.java @@ -0,0 +1,143 @@ +package WayofTime.alchemicalWizardry.api.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.getItem()==recipeItemStack.getItem()) + { + test = true; + checkList[j] = true; + break; + } + } + + if (!test) + { + return false; + } + } + + return true; + } + + public ItemStack getResult() + { + return output.copy(); + } + + public int getAmountNeeded() + { + return this.amountNeeded; + } + + public ItemStack[] getRecipe() + { + return this.recipe; + } + + public int getOrbLevel() + { + return this.bloodOrbLevel; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipeRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipeRegistry.java new file mode 100644 index 00000000..5753cff2 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/alchemy/AlchemyRecipeRegistry.java @@ -0,0 +1,85 @@ +package WayofTime.alchemicalWizardry.api.alchemy; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.ItemStack; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; + +public class AlchemyRecipeRegistry +{ + public static List 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 IBloodOrb)) + { + return null; + } + + int bloodOrbLevel = ((IBloodOrb) 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 IBloodOrb)) + { + return 0; + } + + int bloodOrbLevel = ((IBloodOrb) 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.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipe.java new file mode 100644 index 00000000..624f219b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipe.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.api.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.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipeRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipeRegistry.java new file mode 100644 index 00000000..89c0be46 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/altarRecipeRegistry/AltarRecipeRegistry.java @@ -0,0 +1,60 @@ +package WayofTime.alchemicalWizardry.api.altarRecipeRegistry; + +import java.util.LinkedList; +import java.util.List; + +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 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 ItemStack.copyItemStack(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.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRecipe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRecipe.java new file mode 100644 index 00000000..f8d63855 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRecipe.java @@ -0,0 +1,30 @@ +package WayofTime.alchemicalWizardry.api.bindingRegistry; + +import net.minecraft.item.ItemStack; + +public class BindingRecipe +{ + public ItemStack requiredItem; + public ItemStack outputItem; + + public BindingRecipe(ItemStack outputItem, ItemStack requiredItem) + { + this.requiredItem = requiredItem; + this.outputItem = outputItem; + } + + public boolean doesRequiredItemMatch(ItemStack testStack) + { + if(testStack == null || this.requiredItem == null) + { + return false; + } + + return this.requiredItem.isItemEqual(testStack); + } + + public ItemStack getResult() + { + return this.outputItem; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRegistry.java new file mode 100644 index 00000000..68f34e4c --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/bindingRegistry/BindingRegistry.java @@ -0,0 +1,67 @@ +package WayofTime.alchemicalWizardry.api.bindingRegistry; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.item.ItemStack; + +public class BindingRegistry +{ + public static List bindingRecipes = new LinkedList(); + + public static void registerRecipe(ItemStack output, ItemStack input) + { + bindingRecipes.add(new BindingRecipe(output, input)); + } + + public static boolean isRequiredItemValid(ItemStack testItem) + { + for(BindingRecipe recipe : bindingRecipes) + { + if(recipe.doesRequiredItemMatch(testItem)) + { + return true; + } + } + + return false; + } + + public static ItemStack getItemForItemAndTier(ItemStack testItem) + { + for(BindingRecipe recipe : bindingRecipes) + { + if(recipe.doesRequiredItemMatch(testItem)) + { + return recipe.getResult().copy(); + } + } + + return null; + } + + public static int getIndexForItem(ItemStack testItem) + { + int i=0; + for(BindingRecipe recipe : bindingRecipes) + { + if(recipe.doesRequiredItemMatch(testItem)) + { + return i; + } + i++; + } + + return -1; + } + + public static ItemStack getOutputForIndex(int index) + { + if(bindingRecipes.size()<=index) + { + return null; + } + + return bindingRecipes.get(index).getResult(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapedBloodOrbRecipe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapedBloodOrbRecipe.java new file mode 100644 index 00000000..cdf82e6e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapedBloodOrbRecipe.java @@ -0,0 +1,227 @@ +package WayofTime.alchemicalWizardry.api.items; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; + +/** Shaped Blood Orb Recipe Handler by joshie **/ +public class ShapedBloodOrbRecipe implements IRecipe { + private static final int MAX_CRAFT_GRID_WIDTH = 3; + private static final int MAX_CRAFT_GRID_HEIGHT = 3; + + private ItemStack output = null; + private Object[] input = null; + public int width = 0; + public int height = 0; + private boolean mirrored = true; + + public ShapedBloodOrbRecipe(Block result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapedBloodOrbRecipe(Item result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapedBloodOrbRecipe(ItemStack result, Object... recipe) { + output = result.copy(); + + 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 IBloodOrb || (in instanceof ItemStack && ((ItemStack)in).getItem() instanceof IBloodOrb)) { //If the item is an instanceof IBloodOrb then save the level of the orb + if(in instanceof ItemStack) itemMap.put(chr, (Integer)(((IBloodOrb)((ItemStack)in).getItem()).getOrbLevel())); + else itemMap.put(chr, (Integer)(((IBloodOrb)in).getOrbLevel())); + } else 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); + } + } + + ShapedBloodOrbRecipe(ShapedRecipes recipe, Map replacements) { + output = recipe.getRecipeOutput(); + width = recipe.recipeWidth; + height = recipe.recipeHeight; + + input = new Object[recipe.recipeItems.length]; + + for (int i = 0; i < input.length; i++) { + ItemStack ingred = recipe.recipeItems[i]; + + if (ingred == null) + continue; + + input[i] = recipe.recipeItems[i]; + + for (Entry replace : replacements.entrySet()) { + if (OreDictionary.itemMatches(replace.getKey(), ingred, true)) { + input[i] = OreDictionary.getOres(replace.getValue()); + break; + } + } + } + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting var1) { + return output.copy(); + } + + @Override + public int getRecipeSize() { + return input.length; + } + + @Override + public ItemStack getRecipeOutput() { + return output; + } + + @Override + public boolean matches(InventoryCrafting inv, World world) { + 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; + } + + @SuppressWarnings("unchecked") + private boolean checkMatch(InventoryCrafting 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 = inv.getStackInRowAndColumn(x, y); + //If target is integer, then we should be check the blood orb value of the item instead + if(target instanceof Integer) { + if(slot != null && slot.getItem() instanceof IBloodOrb) { + IBloodOrb orb = (IBloodOrb) slot.getItem(); + if(orb.getOrbLevel() < (Integer)target) { + return false; + } + } else return false; + } else if (target instanceof ItemStack) { + if (!OreDictionary.itemMatches((ItemStack) target, slot, false)) { + return false; + } + } else if (target instanceof ArrayList) { + boolean matched = false; + + Iterator itr = ((ArrayList) target).iterator(); + while (itr.hasNext() && !matched) { + matched = OreDictionary.itemMatches(itr.next(), slot, false); + } + + if (!matched) { + return false; + } + } else if (target == null && slot != null) { + return false; + } + } + } + + return true; + } + + public ShapedBloodOrbRecipe setMirrored(boolean mirror) { + mirrored = mirror; + return this; + } + + public Object[] getInput() { + return this.input; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapelessBloodOrbRecipe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapelessBloodOrbRecipe.java new file mode 100644 index 00000000..fbf28a45 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/ShapelessBloodOrbRecipe.java @@ -0,0 +1,140 @@ +package WayofTime.alchemicalWizardry.api.items; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; + +/** Shapeless Blood Orb Recipe Handler by joshie **/ +public class ShapelessBloodOrbRecipe implements IRecipe { + private ItemStack output = null; + private ArrayList input = new ArrayList(); + + public ShapelessBloodOrbRecipe(Block result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapelessBloodOrbRecipe(Item result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapelessBloodOrbRecipe(ItemStack result, Object... recipe) { + output = result.copy(); + for (Object in : recipe) { + if (in instanceof ItemStack) { + input.add(((ItemStack) in).copy()); + } else if (in instanceof IBloodOrb) { //If the item is an instanceof IBloodOrb then save the level of the orb + input.add((Integer)(((IBloodOrb)in).getOrbLevel())); + } 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); + } + } + } + + @SuppressWarnings("unchecked") + ShapelessBloodOrbRecipe(ShapelessRecipes recipe, Map replacements) { + output = recipe.getRecipeOutput(); + + for (ItemStack ingred : ((List) recipe.recipeItems)) { + Object finalObj = ingred; + for (Entry replace : replacements.entrySet()) { + if (OreDictionary.itemMatches(replace.getKey(), ingred, false)) { + finalObj = OreDictionary.getOres(replace.getValue()); + break; + } + } + input.add(finalObj); + } + } + + @Override + public int getRecipeSize() { + return input.size(); + } + + @Override + public ItemStack getRecipeOutput() { + return output; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting var1) { + return output.copy(); + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(InventoryCrafting var1, World world) { + ArrayList required = new ArrayList(input); + + for (int x = 0; x < var1.getSizeInventory(); 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 target is integer, then we should be check the blood orb value of the item instead + if(next instanceof Integer) { + if(slot != null && slot.getItem() instanceof IBloodOrb) { + IBloodOrb orb = (IBloodOrb) slot.getItem(); + if(orb.getOrbLevel() < (Integer)next) { + return false; + } + } else return false; + } else if (next instanceof ItemStack) { + match = OreDictionary.itemMatches((ItemStack) next, slot, false); + } else if (next instanceof ArrayList) { + Iterator itr = ((ArrayList) next).iterator(); + while (itr.hasNext() && !match) { + match = OreDictionary.itemMatches(itr.next(), slot, false); + } + } + + if (match) { + inRecipe = true; + required.remove(next); + break; + } + } + + if (!inRecipe) { + return false; + } + } + } + + return required.isEmpty(); + } + + public ArrayList getInput() { + return this.input; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/ArmourUpgrade.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/ArmourUpgrade.java new file mode 100644 index 00000000..7fce7cd0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/ArmourUpgrade.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.api.items.interfaces; + +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.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBindable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBindable.java new file mode 100644 index 00000000..46a79939 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBindable.java @@ -0,0 +1,5 @@ +package WayofTime.alchemicalWizardry.api.items.interfaces; + +public interface IBindable +{ +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBloodOrb.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBloodOrb.java new file mode 100644 index 00000000..794172cc --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IBloodOrb.java @@ -0,0 +1,8 @@ +package WayofTime.alchemicalWizardry.api.items.interfaces; + +public interface IBloodOrb +{ + public int getMaxEssence(); + + public int getOrbLevel(); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IHolding.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IHolding.java new file mode 100644 index 00000000..cb07b998 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/items/interfaces/IHolding.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.api.items.interfaces; + +public interface IHolding +{ + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IMasterRitualStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IMasterRitualStone.java new file mode 100644 index 00000000..9777093f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IMasterRitualStone.java @@ -0,0 +1,30 @@ +package WayofTime.alchemicalWizardry.api.rituals; + +import net.minecraft.world.World; + +public interface IMasterRitualStone +{ + public void performRitual(World world, int x, int y, int z, String ritualID); + + public String getOwner(); + + public void setCooldown(int newCooldown); + + public int getCooldown(); + + public void setVar1(int newVar1); + + public int getVar1(); + + public void setActive(boolean active); + + public int getDirection(); + + public World getWorld(); + + public int getXCoord(); + + public int getYCoord(); + + public int getZCoord(); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IRitualStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IRitualStone.java new file mode 100644 index 00000000..078cfd40 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/IRitualStone.java @@ -0,0 +1,6 @@ +package WayofTime.alchemicalWizardry.api.rituals; + +public interface IRitualStone +{ + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualComponent.java new file mode 100644 index 00000000..b7149858 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualComponent.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.api.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.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualEffect.java new file mode 100644 index 00000000..70f89f59 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/RitualEffect.java @@ -0,0 +1,17 @@ +package WayofTime.alchemicalWizardry.api.rituals; + +import java.util.List; + +public abstract class RitualEffect +{ + public abstract void performEffect(IMasterRitualStone ritualStone); + + public abstract int getCostPerRefresh(); + + public int getInitialCooldown() + { + return 0; + } + + public abstract List getRitualComponentList(); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/Rituals.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/Rituals.java new file mode 100644 index 00000000..7eca627a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/rituals/Rituals.java @@ -0,0 +1,333 @@ +package WayofTime.alchemicalWizardry.api.rituals; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import scala.reflect.internal.Trees.This; +import net.minecraft.block.Block; +import net.minecraft.world.World; + +public class Rituals +{ + private int crystalLevel; + private int actCost; + private RitualEffect effect; + private String name; + + public static Map ritualMap = new HashMap(); + @Deprecated + public static List ritualList = new LinkedList(); + public static List keyList = new LinkedList(); + + public Rituals(int crystalLevel, int actCost, RitualEffect effect, String name) + { + this.crystalLevel = crystalLevel; //For a test commit + this.actCost = actCost; + this.effect = effect; + this.name = name; + keyList.add(name); + ritualMap.put(name, this); + } + + /** + * Static method to register a ritual to the Ritual Registry + * @param key Unique identification key - must be different from all others to properly register + * @param crystalLevel Crystal level required to activate + * @param actCost LP amount required to activate + * @param effect The effect that will be ticked + * @param name The name of the ritual + * @return Returns true if properly registered, or false if the key is already used + */ + public static boolean registerRitual(String key, int crystalLevel, int actCost, RitualEffect effect, String name) + { + if(ritualMap.containsKey(key)) + { + return false; + } + else + { + Rituals ritual = new Rituals(crystalLevel, actCost, effect, name); + ritual.removeRitualFromList(); + ritualMap.put(key, ritual); + keyList.add(key); + return true; + } + } + + public void removeRitualFromList() + { + if(ritualMap.containsValue(this)) + { + ritualMap.remove(ritualMap.remove(this.name)); + } + if(keyList.contains(this.name)) + { + keyList.remove(this.name); + } + } + + public static String checkValidRitual(World world, int x, int y, int z) + { + for(String key : ritualMap.keySet()) + { + if(checkRitualIsValid(world,x,y,z,key)) + { + return key; + } + } + + return ""; + } + + public static boolean canCrystalActivate(String ritualID, int crystalLevel) + { + if(ritualMap.containsKey(ritualID)) + { + Rituals ritual = ritualMap.get(ritualID); + if(ritual != null) + { + return ritual.getCrystalLevel() <= crystalLevel; + } + } + + return false; + } + + public static boolean checkRitualIsValid(World world, int x, int y, int z, String ritualID) + { + int direction = Rituals.getDirectionOfRitual(world, x, y, z, ritualID); + + if (direction != -1) + { + return true; + } + + return false; + } + + /** + * 1 - NORTH + * 2 - EAST + * 3 - SOUTH + * 4 - WEST + */ + public static boolean checkDirectionOfRitualValid(World world, int x, int y, int z, String 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 IRitualStone)) + { + 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.getZ(), y + rc.getY(), z + rc.getX()); + + if (!(test instanceof IRitualStone)) + { + 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 IRitualStone)) + { + 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.getZ(), y + rc.getY(), z - rc.getX()); + + if (!(test instanceof IRitualStone)) + { + 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, String ritualID) + { + for (int i = 1; i <= 4; i++) + { + if (Rituals.checkDirectionOfRitualValid(world, x, y, z, ritualID, i)) + { + return i; + } + } + + return -1; + } + + public static int getCostForActivation(String ritualID) + { + if(ritualMap.containsKey(ritualID)) + { + Rituals ritual = ritualMap.get(ritualID); + if(ritual != null) + { + return ritual.actCost; + } + } + + return 0; + } + + public static int getInitialCooldown(String ritualID) + { + if(ritualMap.containsKey(ritualID)) + { + Rituals ritual = ritualMap.get(ritualID); + if(ritual != null && ritual.effect != null) + { + return ritual.effect.getInitialCooldown(); + } + } + + return 0; + } + + public static List getRitualList(String ritualID) + { + if(ritualMap.containsKey(ritualID)) + { + Rituals ritual = ritualMap.get(ritualID); + if(ritual != null) + { + return ritual.obtainComponents(); + }else + { + return null; + } + }else + { + return null; + } + } + + private List obtainComponents() + { + return this.effect.getRitualComponentList(); + } + + private int getCrystalLevel() + { + return this.crystalLevel; + } + + public static void performEffect(IMasterRitualStone ritualStone, String ritualID) + { + if(ritualMap.containsKey(ritualID)) + { + Rituals ritual = ritualMap.get(ritualID); + if(ritual != null && ritual.effect != null) + { + ritual.effect.performEffect(ritualStone); + } + } + } + + public static int getNumberOfRituals() + { + return ritualMap.size(); + } + + public String getRitualName() + { + return this.name; + } + + public static String getNameOfRitual(String id) + { + if(ritualMap.containsKey(id)) + { + Rituals ritual = ritualMap.get(id); + if(ritual != null) + { + return ritual.getRitualName(); + } + } + + return ""; + } + + public static String getNextRitualKey(String key) + { + boolean hasSpotted = false; + String firstKey = ""; + + for(String str : keyList) + { + if(firstKey.equals("")) + { + firstKey = str; + } + if(hasSpotted) + { + return str; + } + if(str.equals(key)) + { + hasSpotted = true; + } + } + + return firstKey; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/LifeEssenceNetwork.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/LifeEssenceNetwork.java new file mode 100644 index 00000000..61d24eee --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/LifeEssenceNetwork.java @@ -0,0 +1,26 @@ +package WayofTime.alchemicalWizardry.api.soulNetwork; + +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.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java new file mode 100644 index 00000000..a4d68583 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java @@ -0,0 +1,228 @@ +package WayofTime.alchemicalWizardry.api.soulNetwork; + +import net.minecraft.entity.player.EntityPlayer; +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; + +public class SoulNetworkHandler +{ + public static int syphonFromNetwork(ItemStack ist, int damageToBeDone) + { + if (ist.getTagCompound() != null && !(ist.getTagCompound().getString("ownerName").equals(""))) + { + String ownerName = ist.getTagCompound().getString("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); + } + + if (data.currentEssence >= damageToBeDone) + { + data.currentEssence -= damageToBeDone; + data.markDirty(); + return damageToBeDone; + } + } + return 0; + } + + /** + * Master method used to syphon from the player's network, and will damage them accordingly if they do not have enough LP. + * Does not drain on the client side. + * + * @param ist Owned itemStack + * @param player Player using the item + * @param damageToBeDone + * @return True if server-sided, false if client-sided + */ + public static boolean syphonAndDamageFromNetwork(ItemStack ist, EntityPlayer player, int damageToBeDone) + { + if(player.worldObj.isRemote) + { + return false; + } + + int amount = SoulNetworkHandler.syphonFromNetwork(ist, damageToBeDone); + + hurtPlayer(player, damageToBeDone-amount); + + return true; + } + + public static boolean canSyphonFromOnlyNetwork(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; + } + + return false; + } + + 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 essence) + { + 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 = essence; + data.markDirty(); + } + + /** + * A method to add to an owner's network up to a maximum value. + * + * @param ownerName + * @param addedEssence + * @param maximum + * @return amount added to the network + */ + public static int addCurrentEssenceToMaximum(String ownerName, int addedEssence, int maximum) + { + 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); + } + + int currEss = data.currentEssence; + + if(currEss>=maximum) + { + return 0; + } + + int newEss = Math.min(maximum, currEss+addedEssence); + data.currentEssence = newEss; + + return newEss-currEss; + } + + public static void hurtPlayer(EntityPlayer user, int energySyphoned) + { + if (energySyphoned < 100 && energySyphoned > 0) + { + if (!user.capabilities.isCreativeMode) + { + user.setHealth((user.getHealth() - 1)); + + if (user.getHealth() <= 0.0005f) + { + user.onDeath(DamageSource.generic); + } + } + } else if (energySyphoned >= 100) + { + if (!user.capabilities.isCreativeMode) + { + for (int i = 0; i < ((energySyphoned + 99) / 100); i++) + { + user.setHealth((user.getHealth() - 1)); + + if (user.getHealth() <= 0.0005f) + { + user.onDeath(DamageSource.generic); + break; + } + } + } + } + } + + 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", SoulNetworkHandler.getUsername(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 String getUsername(EntityPlayer player) + { + return player.getDisplayName(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningHelper.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningHelper.java new file mode 100644 index 00000000..cccfe3f4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningHelper.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.api.summoningRegistry; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.World; + +public abstract class SummoningHelper +{ + protected int id; + + public SummoningHelper(int id) + { + this.id = id; + } + + public abstract EntityLivingBase getEntity(World worldObj); + + public int getSummoningHelperID() + { + return id; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistry.java new file mode 100644 index 00000000..9fda5822 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistry.java @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.api.summoningRegistry; + +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.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistryComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistryComponent.java new file mode 100644 index 00000000..8496b0f2 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/summoningRegistry/SummoningRegistryComponent.java @@ -0,0 +1,231 @@ +package WayofTime.alchemicalWizardry.api.summoningRegistry; + +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.10/main/java/WayofTime/alchemicalWizardry/api/tile/IBloodAltar.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/tile/IBloodAltar.java new file mode 100644 index 00000000..c70d6188 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/api/tile/IBloodAltar.java @@ -0,0 +1,26 @@ +package WayofTime.alchemicalWizardry.api.tile; + +/** + * Created by Pokefenn. + */ +public interface IBloodAltar +{ + + public int getCapacity(); + + public int getCurrentBlood(); + + public int getTier(); + + public int getProgress(); + + public float getSacrificeMultiplier(); + + public float getSelfSacrificeMultiplier(); + + public float getOrbMultiplier(); + + public float getDislocationMultiplier(); + + public int getBufferCapacity(); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java new file mode 100644 index 00000000..c60e734d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -0,0 +1,150 @@ +package WayofTime.alchemicalWizardry.client; + +import net.minecraft.item.ItemBlock; +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.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; +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.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; +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(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()); + 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()); + } + + @Override + public World getClientWorld() + { + return FMLClientHandler.instance().getClient().theWorld; + } + + @Override + public void InitRendering() + { + + MinecraftForgeClient.registerItemRenderer(ItemBlock.getItemFromBlock(ModBlocks.blockAltar), new TEAltarItemRenderer()); + //MinecraftForgeClient.registerItemRenderer(AlchemicalWizardry.blockWritingTable.blockID, new TEWritingTableItemRenderer()); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java new file mode 100644 index 00000000..34575633 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -0,0 +1,341 @@ +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.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.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); + } + + if(event.entityLiving.isPotionActive(AlchemicalWizardry.customPotionHeavyHeart)) + { + 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) + { + 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) + { + 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; + 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()) + { + float percentIncrease = (i + 1) * 0.05f; + + if (event.entityLiving instanceof EntityPlayer) + { + EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving; + entityPlayer.stepHeight = 1.0f; + + if((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) + entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease/2.0f) : percentIncrease); + } + } + } + + 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.getBoundingBox(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); + } + } + } + } + } + + 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/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java new file mode 100644 index 00000000..157237ab --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryFuelHandler.java @@ -0,0 +1,72 @@ +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 WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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 = SpellHelper.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.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryTickHandler.java new file mode 100644 index 00000000..40eaf0f1 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/ArmourComponent.java new file mode 100644 index 00000000..fb4f155b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/CommonProxy.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/CommonProxy.java new file mode 100644 index 00000000..d4c1198e --- /dev/null +++ b/1.7.10/main/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, 120, 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.10/main/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java new file mode 100644 index 00000000..dffc65cf --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAIFly.java @@ -0,0 +1,5 @@ +package WayofTime.alchemicalWizardry.common; + +public class EntityAIFly +{ +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAITargetAggro.java new file mode 100644 index 00000000..2b6fb25a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/EntityAirElemental.java new file mode 100644 index 00000000..cc5ab8ed --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/IBindingAgent.java new file mode 100644 index 00000000..534d4b68 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/ICatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/ICatalyst.java new file mode 100644 index 00000000..230cd51c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/IDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/IDemon.java new file mode 100644 index 00000000..eab1d15e --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/IFillingAgent.java new file mode 100644 index 00000000..2202a20d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/Int3.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/Int3.java new file mode 100644 index 00000000..e1d8d5b4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/Int3.java @@ -0,0 +1,16 @@ +package WayofTime.alchemicalWizardry.common; + + +public class Int3 +{ + public int xCoord; + public int yCoord; + public int zCoord; + + public Int3(int xCoord, int yCoord, int zCoord) + { + this.xCoord = xCoord; + this.yCoord = yCoord; + this.zCoord = zCoord; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeBucketHandler.java new file mode 100644 index 00000000..a7739d1b --- /dev/null +++ b/1.7.10/main/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.setBlockToAir(pos.blockX, pos.blockY, pos.blockZ); + return new ItemStack(ModItems.bucketLife); + } else + { + return null; + } + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeEssence.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/LifeEssence.java new file mode 100644 index 00000000..22ede879 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/ModLivingDropsEvent.java new file mode 100644 index 00000000..3659dbfe --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java new file mode 100644 index 00000000..8e55d286 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/NewPacketHandler.java @@ -0,0 +1,809 @@ +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.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; +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.FMLOutboundHandler; +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()); + 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); + + String tileAltarCodec = clientChannel.findChannelHandlerNameForType(TEAltarCodec.class); + 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()); + 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()); + } + + + /** + * 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); + } + } + } + + 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 BMMessage + { + int index; + } + + public static class TEAltarMessage extends BMMessage + { + int x; + int y; + int z; + + int[] items; + int[] fluids; + int capacity; + } + + public static class TEOrientableMessage extends BMMessage + { + int x; + int y; + int z; + + int input; + int output; + } + + public static class TEPedestalMessage extends BMMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TEPlinthMessage extends BMMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TESocketMessage extends BMMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TETeleposerMessage extends BMMessage + { + int x; + int y; + int z; + + int[] items; + } + + public static class TEWritingTableMessage extends BMMessage + { + int x; + int y; + int z; + + 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 + { + 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, BMMessage msg, ByteBuf target) throws Exception + { + 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(((TEAltarMessage)msg).items != null); + if (((TEAltarMessage)msg).items != null) + { + int[] items = ((TEAltarMessage)msg).items; + for (int j = 0; j < items.length; j++) + { + int i = items[j]; + target.writeInt(i); + } + } + + target.writeBoolean(((TEAltarMessage)msg).fluids != null); + if(((TEAltarMessage)msg).fluids != null) + { + int[] fluids = ((TEAltarMessage)msg).fluids; + for (int j = 0; j < fluids.length; j++) + { + int i = fluids[j]; + target.writeInt(i); + } + } + + 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 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.10/main/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/PlinthComponent.java new file mode 100644 index 00000000..6232828a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java new file mode 100644 index 00000000..d1bc6a1d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/ArmourForge.java @@ -0,0 +1,336 @@ +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.api.items.interfaces.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.ArmourComponent; +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); + this.setBlockName("armourForge"); + //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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java new file mode 100644 index 00000000..0cdb4272 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockAltar.java @@ -0,0 +1,311 @@ +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); + this.setBlockName("bloodAltar"); + //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); + }else + { + tileEntity.sendChatInfoToPlayer(player); + } + + return true; + } + else if(playerItem.getItem().equals(ModItems.itemSeerSigil)) + { + if (player.worldObj.isRemote) + { + world.markBlockForUpdate(x, y, z); + }else + { + tileEntity.sendMoreChatInfoToPlayer(player); + } + + 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); + }else + { + tileEntity.sendChatInfoToPlayer(player); + } + + return true; + } + else if(item !=null && item.getItem().equals(ModItems.itemSeerSigil)) + { + if (player.worldObj.isRemote) + { + world.markBlockForUpdate(x, y, z); + }else + { + tileEntity.sendMoreChatInfoToPlayer(player); + } + + 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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockBloodLightSource.java new file mode 100644 index 00000000..2ffc83e6 --- /dev/null +++ b/1.7.10/main/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.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockConduit.java new file mode 100644 index 00000000..c92daea7 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockDemonPortal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockDemonPortal.java new file mode 100644 index 00000000..c9d74de3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockDemonPortal.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEDemonPortal; + +public class BlockDemonPortal extends BlockContainer +{ + public BlockDemonPortal() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setBlockName("demonPortal"); + } + + @Override + public TileEntity createNewTileEntity(World var1, int var2) + { + return new TEDemonPortal(); + } + + @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; + } + + TEDemonPortal tileEntity = (TEDemonPortal) world.getTileEntity(x, y, z); + + tileEntity.rightClickBlock(player, side); + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockHomHeart.java new file mode 100644 index 00000000..730b31f3 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockMasterStone.java new file mode 100644 index 00000000..da201c0c --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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), player); + world.markBlockForUpdate(x, y, z); + return true; + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + return new TEMasterStone(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java new file mode 100644 index 00000000..10da3ed7 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -0,0 +1,254 @@ +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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPedestal.java new file mode 100644 index 00000000..85dc2d68 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockPlinth.java new file mode 100644 index 00000000..619f61f1 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSchematicSaver.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSchematicSaver.java new file mode 100644 index 00000000..9c85e4fa --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSchematicSaver.java @@ -0,0 +1,43 @@ +package WayofTime.alchemicalWizardry.common.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.tileEntity.TEDemonPortal; +import WayofTime.alchemicalWizardry.common.tileEntity.TESchematicSaver; + +public class BlockSchematicSaver extends BlockContainer +{ + public BlockSchematicSaver() + { + super(Material.rock); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setBlockName("schematicSaver"); + } + + @Override + public TileEntity createNewTileEntity(World var1, int var2) + { + return new TESchematicSaver(); + } + + @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; + } + + TESchematicSaver tileEntity = (TESchematicSaver) world.getTileEntity(x, y, z); + + tileEntity.rightClickBlock(player, side); + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSocket.java new file mode 100644 index 00000000..e4e53890 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpectralContainer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpectralContainer.java new file mode 100644 index 00000000..95a48ce3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpectralContainer.java @@ -0,0 +1,75 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; +import java.util.Random; + +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.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralContainer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockSpectralContainer extends BlockContainer +{ + public BlockSpectralContainer() + { + super(Material.cloth); + //setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setBlockName("blockSpectralContainer"); + this.setBlockBounds(0,0,0,0,0,0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:BlockBloodLight"); + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public void addCollisionBoxesToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) + { + + } + + public int quantityDropped(Random par1Random) + { + return 0; + } + + @Override + public boolean isReplaceable(IBlockAccess world, int x, int y, int z) + { + return true; + } + + @Override + public boolean isAir(IBlockAccess world, int x, int y, int z) + { + return true; + } + + @Override + public TileEntity createNewTileEntity(World var1, int var2) + { + return new TESpectralContainer(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEffect.java new file mode 100644 index 00000000..14846d23 --- /dev/null +++ b/1.7.10/main/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(); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java new file mode 100644 index 00000000..14dc4af5 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellEnhancement.java @@ -0,0 +1,64 @@ +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(); + this.setBlockName("blockSpellEnhancement"); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) + { + 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(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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java new file mode 100644 index 00000000..ae4e028f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellModifier.java @@ -0,0 +1,63 @@ +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(); + this.setBlockName("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); + } + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public int getRenderType() + { + return -1; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java new file mode 100644 index 00000000..faadb7e8 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockSpellParadigm.java @@ -0,0 +1,212 @@ +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(); + this.setBlockName("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)); + par3List.add(new ItemStack(par1, 1, 3)); + } 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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockTeleposer.java new file mode 100644 index 00000000..3580220b --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BlockWritingTable.java new file mode 100644 index 00000000..e7890015 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodRune.java new file mode 100644 index 00000000..00f0a83f --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/BloodStoneBrick.java new file mode 100644 index 00000000..0e33c138 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("bloodStoneBrick"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:BloodStoneBrick"); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/EfficiencyRune.java new file mode 100644 index 00000000..337b3e90 --- /dev/null +++ b/1.7.10/main/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(); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/EmptySocket.java new file mode 100644 index 00000000..ec78e760 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/IOrientable.java new file mode 100644 index 00000000..93b170b0 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/ImperfectRitualStone.java new file mode 100644 index 00000000..c3467192 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LargeBloodStoneBrick.java new file mode 100644 index 00000000..1969c452 --- /dev/null +++ b/1.7.10/main/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); + this.setBlockName("largeBloodStoneBrick"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:LargeBloodStoneBrick"); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java new file mode 100644 index 00000000..34676410 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/LifeEssenceBlock.java @@ -0,0 +1,62 @@ +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); + this.setBlockName("lifeEssenceFluidBlock"); + } + + @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"); + AlchemicalWizardry.lifeEssenceFluid.setFlowingIcon(blockIcon); + AlchemicalWizardry.lifeEssenceFluid.setStillIcon(blockIcon); + //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.10/main/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java new file mode 100644 index 00000000..a847c360 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RitualStone.java @@ -0,0 +1,121 @@ +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.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.api.rituals.IRitualStone; +import WayofTime.alchemicalWizardry.common.items.ScribeTool; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class RitualStone extends Block implements IRitualStone +{ + @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); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSacrifice.java new file mode 100644 index 00000000..d06ec80f --- /dev/null +++ b/1.7.10/main/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(); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/RuneOfSelfSacrifice.java new file mode 100644 index 00000000..4032044d --- /dev/null +++ b/1.7.10/main/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(); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/SpectralBlock.java new file mode 100644 index 00000000..44b283c0 --- /dev/null +++ b/1.7.10/main/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.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/block/SpeedRune.java new file mode 100644 index 00000000..0680b066 --- /dev/null +++ b/1.7.10/main/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(); + this.setBlockName("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.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarComponent.java new file mode 100644 index 00000000..4aeb4e75 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/AltarUpgradeComponent.java new file mode 100644 index 00000000..acdede16 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java new file mode 100644 index 00000000..d5db3638 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/BlockSet.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/BlockSet.java new file mode 100644 index 00000000..008ef748 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/BlockSet.java @@ -0,0 +1,195 @@ +package WayofTime.alchemicalWizardry.common.demonVillage; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockStairs; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.Int3; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.GameRegistry.UniqueIdentifier; + +public class BlockSet +{ + private String blockid; + private int[] metadata; + private List positions; + + public BlockSet() + { + this(Blocks.stone); + } + + public BlockSet(String blockid) + { + this.blockid = blockid; + this.metadata = new int[4]; + positions = new ArrayList(); + } + + public BlockSet(Block block) + { + this(BlockSet.getPairedIdForBlock(block)); + } + + public BlockSet(Block block, int meta) + { + this(block); + for(int i=0; i getPositions() + { + return positions; + } + + public void addPositionToBlock(int xOffset, int yOffset, int zOffset) + { + positions.add(new Int3(xOffset, yOffset, zOffset)); + } + + public Block getBlock() + { + return this.getBlockForString(blockid); + } + + public static String getPairedIdForBlock(Block block) + { + UniqueIdentifier un = GameRegistry.findUniqueIdentifierFor(block); + String name = ""; + + if(un != null) + { + name = un.modId + ":" + un.name; + } + + return name; + } + + public static Block getBlockForString(String str) + { + String[] parts = str.split(":"); + String modId = parts[0]; + String name = parts[1]; + return GameRegistry.findBlock(modId, name); + } + + public int getMetaForDirection(ForgeDirection dir) + { + if(metadata.length < 4) + { + return 0; + } + + switch(dir) + { + case NORTH: + return metadata[0]; + case SOUTH: + return metadata[1]; + case WEST: + return metadata[2]; + case EAST: + return metadata[3]; + default: + return 0; + } + } + + public void buildAtIndex(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir, int index) + { + Block block = this.getBlock(); + if(index >= positions.size() || block == null) + { + return; + } + + Int3 position = positions.get(index); + int xOff = position.xCoord; + int yOff = position.yCoord; + int zOff = position.zCoord; + int meta = this.getMetaForDirection(dir); + + switch(dir) + { + case NORTH: + break; + case SOUTH: + xOff *= -1; + zOff *= -1; + break; + case WEST: + int temp = zOff; + zOff = xOff * -1; + xOff = temp; + break; + case EAST: + int temp2 = zOff * -1; + zOff = xOff; + xOff = temp2; + break; + default: + } + + world.setBlock(xCoord + xOff, yCoord + yOff, zCoord + zOff, block, meta, 3); + } + + public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + for(int i=0; i blockList; + + public BuildingSchematic() + { + this(""); + } + + public BuildingSchematic(String name) + { + this.name = name; + blockList = new ArrayList(); + this.doorX = 0; + this.doorZ = 0; + this.doorY = 0; + this.buildingTier = 0; + this.buildingType = DemonBuilding.BUILDING_HOUSE; + } + + public void addBlockWithMeta(Block block, int meta, int xOffset, int yOffset, int zOffset) + { + for(BlockSet set : blockList) + { + if(set.isContained(block, meta)) + { + set.addPositionToBlock(xOffset, yOffset, zOffset); + return; + } + } + + BlockSet set = new BlockSet(block, meta); + set.addPositionToBlock(xOffset, yOffset, zOffset); + blockList.add(set); + } + + public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + for(BlockSet set : blockList) + { + set.buildAll(world, xCoord, yCoord, zCoord, dir); + } + } + + public GridSpaceHolder createGSH() + { + GridSpaceHolder holder = new GridSpaceHolder(); + + for(BlockSet set : blockList) + { + for(Int3 coords : set.getPositions()) + { + int gridX = (int)((coords.xCoord+2*Math.signum(coords.xCoord))/5); + int gridZ = (int)((coords.zCoord+2*Math.signum(coords.zCoord))/5); + + holder.setGridSpace(gridX, gridZ, new GridSpace(GridSpace.HOUSE,0)); + } + } + + return holder; + } + + public Int3 getGridSpotOfDoor() + { + int gridX = (int)((doorX+2*Math.signum(doorX))/5); + int gridZ = (int)((doorZ+2*Math.signum(doorZ))/5); + + return new Int3(gridX, doorY, gridZ); + } + + public void destroyAllInField(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + GridSpaceHolder grid = this.createGSH(); + for(int i=this.getMinY(); i<=this.getMaxY(); i++) + { + grid.destroyAllInGridSpaces(world, xCoord, yCoord + i, zCoord, dir); + } + } + + public int getMinY() + { + int min = 0; + for(BlockSet set : blockList) + { + for(Int3 pos : set.getPositions()) + { + if(pos.yCoord < min) + { + min = pos.yCoord; + } + } + } + + return min; + } + + public int getMaxY() + { + int max = 0; + for(BlockSet set : blockList) + { + for(Int3 pos : set.getPositions()) + { + if(pos.yCoord > max) + { + max = pos.yCoord; + } + } + } + + return max; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java new file mode 100644 index 00000000..f6f97f03 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonBuilding.java @@ -0,0 +1,115 @@ +package WayofTime.alchemicalWizardry.common.demonVillage; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.Int3; + +public class DemonBuilding +{ + public static final int BUILDING_HOUSE = 0; + public static final int BUILDING_PORTAL = 1; + + public BuildingSchematic schematic; + public GridSpaceHolder area; + public int buildingTier; + public int buildingType; + public Int3 doorGridSpace; + + public DemonBuilding(BuildingSchematic schematic) + { + this.schematic = schematic; + this.buildingType = schematic.buildingType; + this.buildingTier = schematic.buildingTier; + this.area = this.createGSHForSchematic(schematic); + this.doorGridSpace = schematic.getGridSpotOfDoor(); + } + + public String getName() + { + return schematic.name; + } + + public boolean isValid(GridSpaceHolder master, int gridX, int gridZ, ForgeDirection dir) + { + return area.doesContainAll(master, gridX, gridZ, dir); + } + + public void buildAll(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + schematic.buildAll(world, xCoord, yCoord, zCoord, dir); + } + + public void setAllGridSpaces(int xInit, int zInit, int yLevel, ForgeDirection dir, int type, GridSpaceHolder master) + { + area.setAllGridSpaces(xInit, zInit, yLevel, dir, type, master); + } + + public GridSpaceHolder createGSHForSchematic(BuildingSchematic scheme) + { + switch(this.buildingType) + { + case DemonBuilding.BUILDING_HOUSE: + return scheme.createGSH(); + case DemonBuilding.BUILDING_PORTAL: + + } + return scheme.createGSH(); + } + + public Int3 getDoorSpace(ForgeDirection dir) + { + int x = 0; + int z = 0; + switch(dir) + { + case SOUTH: + x = -doorGridSpace.xCoord; + z = -doorGridSpace.zCoord; + break; + case WEST: + x = doorGridSpace.zCoord; + z = -doorGridSpace.xCoord; + break; + case EAST: + x = -doorGridSpace.zCoord; + z = doorGridSpace.xCoord; + break; + default: + x = doorGridSpace.xCoord; + z = doorGridSpace.zCoord; + break; + } + + return new Int3(x, doorGridSpace.yCoord, z); + } + + public Int3 getGridOffsetFromRoad(ForgeDirection sideOfRoad, int yLevel) + { + Int3 doorSpace = this.getDoorSpace(sideOfRoad); + int x = doorSpace.xCoord; + int z = doorSpace.zCoord; + + switch(sideOfRoad) + { + case SOUTH: + z++; + break; + case EAST: + x++; + break; + case WEST: + x--; + break; + default: + z--; + break; + } + + return new Int3(x, yLevel, z); + } + + public void destroyAllInField(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + schematic.destroyAllInField(world, xCoord, yCoord, zCoord, dir); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonCrosspath.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonCrosspath.java new file mode 100644 index 00000000..3b8a7a71 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonCrosspath.java @@ -0,0 +1,22 @@ +package WayofTime.alchemicalWizardry.common.demonVillage; + +import net.minecraft.world.World; + +public class DemonCrosspath +{ + private int xCoord; + private int yLevel; + private int zCoord; + + public DemonCrosspath(int xCoord, int yLevel, int zCoord) + { + this.xCoord = xCoord; + this.yLevel = yLevel; + this.zCoord = zCoord; + } + + public void createCrosspath(World world) + { + + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonVillagePath.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonVillagePath.java new file mode 100644 index 00000000..01645f35 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/demonVillage/DemonVillagePath.java @@ -0,0 +1,135 @@ +package WayofTime.alchemicalWizardry.common.demonVillage; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.Int3; + +public class DemonVillagePath +{ + public int xi; + public int yi; + public int zi; + public ForgeDirection dir; + public int length; + + public DemonVillagePath(int xi, int yi, int zi, ForgeDirection dir, int length) + { + this.xi = xi; + this.yi = yi; + this.zi = zi; + this.dir = dir; + this.length = length; + } + + public Int3 constructFullPath(World world, int clearance, Block block, int meta) + { + int xPos = this.xi; + int yPos = this.yi; + int zPos = this.zi; + int rad = this.getRoadRadius(); + + for(int i=-rad; i<=rad; i++) + { + this.constructPartialPath(world, clearance, block, meta, xPos-rad*dir.offsetX+i*dir.offsetZ, yPos, zPos-rad*dir.offsetZ+i*dir.offsetX, dir, length+2*rad); + } + + return this.getFinalLocation(world, clearance); + } + + public void constructPartialPath(World world, int clearance, Block roadBlock, int meta, int xi, int yi, int zi, ForgeDirection dir, int length) + { + int xPos = xi; + int yPos = yi; + int zPos = zi; + + for(int i=0; i posXRadius|| x < -negXRadius || z > posZRadius || z < -negZRadius) + { + return new GridSpace(); + }else + { + return (area[x + negXRadius][z + negZRadius]); + } + } + + public void setGridSpace(int x, int z, GridSpace space) + { + if(x > posXRadius) + { + this.expandAreaInPosX(); + this.setGridSpace(x, z, space); + return; + }else if(x < -negXRadius) + { + this.expandAreaInNegX(); + this.setGridSpace(x, z, space); + return; + }else if(z > posZRadius) + { + this.expandAreaInPosZ(); + this.setGridSpace(x, z, space); + return; + }else if(z < -negZRadius) + { + this.expandAreaInNegZ(); + this.setGridSpace(x, z, space); + return; + }else + { + area[x + negXRadius][z + negZRadius] = space; + } + } + + public boolean doesContainAll(GridSpaceHolder master, int xInit, int zInit, ForgeDirection dir) + { + if(master != null) + { + System.out.println("negXRadius: " + negXRadius + " posXRadius: " + posXRadius + " negZRadius: " + negZRadius + " posZRadius: " + posZRadius); + for(int i=-negXRadius; i<=posXRadius; i++) + { + for(int j=-negZRadius; j<=posZRadius; j++) + { + GridSpace thisSpace = this.getGridSpace(i, j); + if(thisSpace.isEmpty()) + { + continue; + } + + System.out.println("x: " + i + " z: " + j); + + int xOff = 0; + int zOff = 0; + + switch(dir) + { + case SOUTH: + xOff = -i; + zOff = -j; + break; + case WEST: + xOff = j; + zOff = -i; + break; + case EAST: + xOff = -j; + zOff = i; + break; + default: + xOff = i; + zOff = j; + break; + } + if(!master.getGridSpace(xInit + xOff, zInit + zOff).isEmpty()) + { + return false; + } + } + } + return true; + } + return false; + } + + public void setAllGridSpaces(int xInit, int zInit, int yLevel, ForgeDirection dir, int type, GridSpaceHolder master) + { + System.out.println("Grid space selected: (" + xInit + "," + zInit + ")"); + if(master != null) + { + for(int i=-negXRadius; i<=posXRadius; i++) + { + for(int j=-negZRadius; j<=posZRadius; j++) + { + GridSpace thisSpace = this.getGridSpace(i, j); + if(thisSpace.isEmpty()) + { + continue; + } + + int xOff = 0; + int zOff = 0; + + switch(dir) + { + case SOUTH: + xOff = -i; + zOff = -j; + break; + case WEST: + xOff = j; + zOff = -i; + break; + case EAST: + xOff = -j; + zOff = i; + break; + default: + xOff = i; + zOff = j; + break; + } + + System.out.println("Grid space (" + (xInit + xOff) + "," + (zInit + zOff) + ")"); + + master.setGridSpace(xInit + xOff, zInit + zOff, new GridSpace(type, yLevel)); + } + } + } + } + + public void destroyAllInGridSpaces(World world, int xCoord, int yCoord, int zCoord, ForgeDirection dir) + { + for(int i=-negXRadius; i<=posXRadius; i++) + { + for(int j=-negZRadius; j<=posZRadius; j++) + { + GridSpace thisSpace = this.getGridSpace(i, j); + if(thisSpace.isEmpty()) + { + continue; + } + + int xOff = 0; + int zOff = 0; + + switch(dir) + { + case SOUTH: + xOff = -i; + zOff = -j; + break; + case WEST: + xOff = j; + zOff = -i; + break; + case EAST: + xOff = -j; + zOff = i; + break; + default: + xOff = i; + zOff = j; + break; + } + + for(int l = -2; l<=2; l++) + { + for(int m = -2; m<=2; m++) + { + Block block = world.getBlock(xCoord + xOff*5 + l, yCoord, zCoord + zOff*5 + m); + if(block == ModBlocks.blockDemonPortal) + { + continue; + } + world.setBlockToAir(xCoord + xOff*5 + l, yCoord, zCoord + zOff*5 + m); + } + } + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java new file mode 100644 index 00000000..5a766314 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBileDemon.java @@ -0,0 +1,494 @@ +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java new file mode 100644 index 00000000..edea165f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityBoulderFist.java @@ -0,0 +1,500 @@ +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 WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java new file mode 100644 index 00000000..97872e73 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityDemon.java @@ -0,0 +1,99 @@ +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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) + { + if(!(this.getOwner() instanceof EntityPlayer)) + { + return; + } + ItemStack drop = new ItemStack(ModItems.demonPlacer, 1, this.getDemonID()); + DemonPlacer.setOwnerName(drop, SpellHelper.getUsername((EntityPlayer)this.getOwner())); + + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityEarthElemental.java new file mode 100644 index 00000000..5d7b5045 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityElemental.java new file mode 100644 index 00000000..f07dc92c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.java new file mode 100644 index 00000000..ff62e2d1 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFallenAngel.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.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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityFireElemental.java new file mode 100644 index 00000000..a599be7c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityHolyElemental.java new file mode 100644 index 00000000..c4c626a0 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityIceDemon.java new file mode 100644 index 00000000..1e809dc8 --- /dev/null +++ b/1.7.10/main/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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java new file mode 100644 index 00000000..366f136a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityLowerGuardian.java @@ -0,0 +1,492 @@ +package WayofTime.alchemicalWizardry.common.entity.mob; + +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.EntityAITargetAggro; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.java new file mode 100644 index 00000000..b51bee98 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShade.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 WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityShadeElemental.java new file mode 100644 index 00000000..004fcce4 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java new file mode 100644 index 00000000..e0f45f6d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntitySmallEarthGolem.java @@ -0,0 +1,506 @@ +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWaterElemental.java new file mode 100644 index 00000000..ab141887 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java new file mode 100644 index 00000000..bf1d220e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/mob/EntityWingedFireDemon.java @@ -0,0 +1,509 @@ +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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 (this.getOwner() instanceof EntityPlayer && SpellHelper.getUsername(par1EntityPlayer).equalsIgnoreCase(SpellHelper.getUsername((EntityPlayer)this.getOwner())) && !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.func_152115_b(par1EntityPlayer.getUniqueID().toString()); + 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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java new file mode 100644 index 00000000..3b5d6e71 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EnergyBlastProjectile.java @@ -0,0 +1,526 @@ +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.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, IThrowableEntity +{ + 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); + this.maxTicksInAir = 600; + } + + 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; + this.maxTicksInAir = 600; + } + + 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(Vec3.createVectorHelper(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 = Vec3.createVectorHelper(posX, posY, posZ); + Vec3 var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); + var17 = Vec3.createVectorHelper(posX, posY, posZ); + var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = Vec3.createVectorHelper(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; + } + + @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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java new file mode 100644 index 00000000..4a1729a0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityBloodLightProjectile.java @@ -0,0 +1,131 @@ +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).setRevengeTarget(shootingEntity); + + doDamage(1, 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, Blocks.fire); + } + + spawnHitParticles("magicCrit", 8); + this.setDead(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..9c55f452 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityEnergyBazookaSecondaryProjectile.java new file mode 100644 index 00000000..cdbf72f4 --- /dev/null +++ b/1.7.10/main/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(Vec3.createVectorHelper(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 = Vec3.createVectorHelper(posX, posY, posZ); + Vec3 var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); + var17 = Vec3.createVectorHelper(posX, posY, posZ); + var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = Vec3.createVectorHelper(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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/EntityMeteor.java new file mode 100644 index 00000000..221dc58a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/ExplosionProjectile.java new file mode 100644 index 00000000..569aaf0b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/FireProjectile.java new file mode 100644 index 00000000..7ab8f052 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/HolyProjectile.java new file mode 100644 index 00000000..062ccbf7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/IceProjectile.java new file mode 100644 index 00000000..06867d81 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/LightningBoltProjectile.java new file mode 100644 index 00000000..106cf420 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/MudProjectile.java new file mode 100644 index 00000000..2c944959 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/TeleportProjectile.java new file mode 100644 index 00000000..c448fadf --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WaterProjectile.java new file mode 100644 index 00000000..8fa7704c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/entity/projectile/WindGustProjectile.java new file mode 100644 index 00000000..46fa01d7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/AWBaseItems.java new file mode 100644 index 00000000..dd3e4a69 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ActivationCrystal.java new file mode 100644 index 00000000..6c6c6fc2 --- /dev/null +++ b/1.7.10/main/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.api.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.10/main/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/AirScribeTool.java new file mode 100644 index 00000000..9f20b743 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ApprenticeBloodOrb.java new file mode 100644 index 00000000..3bc4a2eb --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ArchmageBloodOrb.java new file mode 100644 index 00000000..6bd83098 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ArmourInhibitor.java new file mode 100644 index 00000000..1b42a0de --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BlankSpell.java new file mode 100644 index 00000000..58c004d3 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodShard.java new file mode 100644 index 00000000..43b5e5b8 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BloodboundSword.java new file mode 100644 index 00000000..07b4ac20 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java new file mode 100644 index 00000000..e756bc86 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundArmour.java @@ -0,0 +1,594 @@ +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 net.minecraftforge.common.util.Constants; +import thaumcraft.api.IGoggles; +import thaumcraft.api.nodes.IRevealer; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.api.items.interfaces.ArmourUpgrade; +import WayofTime.alchemicalWizardry.api.items.interfaces.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; + +@Optional.InterfaceList(value = {@Interface(iface="thaumcraft.api.nodes.IRevealer", modid = "Thaumcraft"), @Interface(iface="thaumcraft.api.IGoggles", modid = "Thaumcraft")}) +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.getItem().equals(ModItems.boundHelmet) || plate.getItem().equals(ModItems.boundPlate) || leggings.getItem().equals(ModItems.boundLeggings) || boots.getItem().equals(ModItems.boundBoots)) + { + if (source.isUnblockable()) + { + return new ArmorProperties(-1, 3, 4); + } + + 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.getItem().equals(ModItems.weakBloodShard)) + { + max = Math.max(max, 1); + } + + if (itemStack.getItem().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()); + } + + 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 boolean isImmuneToVoid(ItemStack itemStack) + { + ItemStack[] inv = getInternalInventory(itemStack); + + if (inv == null) + { + return false; + } + + for (ItemStack item : inv) + { + if (item == null) + { + continue; + } + + if (item.getItem().equals(ModItems.voidSigil)) + { + return true; + } + } + + return false; + } + + @Optional.Method(modid = "Thaumcraft") + 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; + } + + @Optional.Method(modid = "Thaumcraft") + 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.getItem().equals(ModItems.weakBloodOrb)) + { + return 0.75f; + } + + if (item.getItem().equals(ModItems.apprenticeBloodOrb)) + { + return 0.50f; + } + + if (item.getItem().equals(ModItems.magicianBloodOrb)) + { + return 0.25f; + } + + if (item.getItem().equals(ModItems.masterBloodOrb)) + { + return 0.0f; + } + + if (item.getItem().equals(ModItems.archmageBloodOrb)) + { + return 0.0f; + } + } + + return 1.0f; + } + + public int getItemEnchantability() + { + return 0; + } + + @Override + @Optional.Method(modid = "Thaumcraft") + public boolean showNodes(ItemStack itemstack, EntityLivingBase player) + { + return this.hasIRevealer(itemstack); + } + + @Override + @Optional.Method(modid = "Thaumcraft") + public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) + { + return this.hasIGoggles(itemstack); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java new file mode 100644 index 00000000..3f5f7ec1 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java @@ -0,0 +1,384 @@ +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.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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; + } + + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (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; + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java new file mode 100644 index 00000000..9b369c81 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java @@ -0,0 +1,395 @@ +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.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +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.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +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; + } + + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (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; + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java new file mode 100644 index 00000000..f4f6333e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java @@ -0,0 +1,391 @@ +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.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +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; + } + + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int posX = (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; + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/CheatyItem.java new file mode 100644 index 00000000..8b44398d --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.api.soulNetwork.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.10/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java new file mode 100644 index 00000000..361a95dc --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonPlacer.java new file mode 100644 index 00000000..6708cd74 --- /dev/null +++ b/1.7.10/main/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.api.summoningRegistry.SummoningRegistry; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityDemon; +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).func_152115_b(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.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DemonicTelepositionFocus.java new file mode 100644 index 00000000..d26de12d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/DuskScribeTool.java new file mode 100644 index 00000000..ddbdbfe9 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EarthScribeTool.java new file mode 100644 index 00000000..290c6f91 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java new file mode 100644 index 00000000..e935437e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBattery.java @@ -0,0 +1,252 @@ +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 WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.ArmourUpgrade; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class EnergyBattery extends Item implements ArmourUpgrade, IBindable, IBloodOrb +{ + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBazooka.java new file mode 100644 index 00000000..be0eddc2 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyBlast.java new file mode 100644 index 00000000..298c950d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java new file mode 100644 index 00000000..a82f268f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergyItems.java @@ -0,0 +1,357 @@ +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.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.api.soulNetwork.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.0005) + { + player.inventory.dropAllItems(); + break; + } + } + } + + 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.0005f) + { + 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.0005f) + { + user.onDeath(DamageSource.generic); + break; + } + } + } + } + } + + 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 static 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) + { + 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); + } + + 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); + } + + if(data.currentEssence>=maximum) + { + return; + } + + data.currentEssence = Math.min(maximum, data.currentEssence + amount); + data.markDirty(); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnergySword.java new file mode 100644 index 00000000..a4578599 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/EnhancedTelepositionFocus.java new file mode 100644 index 00000000..4753fc05 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/FireScribeTool.java new file mode 100644 index 00000000..18fc3a52 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemAlchemyBase.java new file mode 100644 index 00000000..8319c4a8 --- /dev/null +++ b/1.7.10/main/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.api.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[]{"Offensa","Praesidium","OrbisTerrae","StrengthenedCatalyst","ConcentratedCatalyst","FracturedBone","Virtus","Reductus","Potentia"}; + + @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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemBloodRuneBlock.java new file mode 100644 index 00000000..420cc8c5 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComplexSpellCrystal.java new file mode 100644 index 00000000..e2261961 --- /dev/null +++ b/1.7.10/main/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:ComplexCrystal"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Crystal of unimaginable power"); + + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemComponents.java new file mode 100644 index 00000000..9f9d949f --- /dev/null +++ b/1.7.10/main/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.api.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","PowerCore","CostCore","PotencyCore","ObsidianBrace"}; + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public ItemComponents() + { + 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:" + "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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemDiabloKey.java new file mode 100644 index 00000000..c172a714 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java new file mode 100644 index 00000000..00d9c533 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java @@ -0,0 +1,304 @@ +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.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.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)) + { + String ritualID = this.getCurrentRitual(par1ItemStack); + //TODO + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + par3List.add("RitualID: " + ritualID); + List ritualList = Rituals.getRitualList(this.getCurrentRitual(par1ItemStack)); + if(ritualList == null) + { + return; + } + + 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)) + { + String ritualID = this.getCurrentRitual(par1ItemStack); + if(ritualID.equals("")) + { + return super.getItemStackDisplayName(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)); + 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(); + String currentRitualID = this.getCurrentRitual(par1ItemStack); + + this.setCurrentRitual(par1ItemStack, Rituals.getNextRitualKey(currentRitualID)); + + 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 String getCurrentRitual(ItemStack par1ItemStack) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + return par1ItemStack.stackTagCompound.getString("ritualID"); + } + + public void setCurrentRitual(ItemStack par1ItemStack, String ritualID) + { + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + par1ItemStack.stackTagCompound.setString("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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEffectBlock.java new file mode 100644 index 00000000..2c5e106d --- /dev/null +++ b/1.7.10/main/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 = "earth"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellEnhancementBlock.java new file mode 100644 index 00000000..670cbce8 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.java new file mode 100644 index 00000000..acd47516 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellModifierBlock.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 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 = "default"; + break; + } + + case 1: + { + name = "offensive"; + break; + } + + case 2: + name = "defensive"; + break; + + case 3: + name = "environmental"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + public int getMetadata(int par1) + + { + return par1; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java new file mode 100644 index 00000000..5fb0b9e3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ItemSpellParadigmBlock.java @@ -0,0 +1,58 @@ +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; + + case 3: + name = "tool"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + @Override + public int getMetadata(int par1) + { + return par1; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/LavaCrystal.java new file mode 100644 index 00000000..87610c5e --- /dev/null +++ b/1.7.10/main/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.api.soulNetwork.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.10/main/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/LifeBucket.java new file mode 100644 index 00000000..80a29ed3 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/MagicianBloodOrb.java new file mode 100644 index 00000000..e6081180 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/MasterBloodOrb.java new file mode 100644 index 00000000..5e9c19c7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/OrbOfTesting.java new file mode 100644 index 00000000..06482ac3 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ReinforcedTelepositionFocus.java new file mode 100644 index 00000000..37134dbc --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java new file mode 100644 index 00000000..98a41bfd --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/SacrificialDagger.java @@ -0,0 +1,159 @@ +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) + { + if(AlchemicalWizardry.wimpySettings) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SheathedItem"); + }else + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SacrificialDagger"); + } + } + + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + if(AlchemicalWizardry.wimpySettings) + { + par3List.add("A slight draining feeling tickles your fingers"); + }else + { + 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.001f) + { + //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; + } + + @Override + public String getItemStackDisplayName(ItemStack par1ItemStack) + { + if(AlchemicalWizardry.wimpySettings) + { + return "Sacrificial Orb"; + } + return super.getItemStackDisplayName(par1ItemStack); + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/ScribeTool.java new file mode 100644 index 00000000..0dd3cd63 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/TelepositionFocus.java new file mode 100644 index 00000000..192f34f4 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/WaterScribeTool.java new file mode 100644 index 00000000..86132c84 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/forestry/ItemBloodFrame.java new file mode 100644 index 00000000..32da83be --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyFlask.java new file mode 100644 index 00000000..11588be5 --- /dev/null +++ b/1.7.10/main/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.api.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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AlchemyReagent.java new file mode 100644 index 00000000..3987c581 --- /dev/null +++ b/1.7.10/main/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.api.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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AverageLengtheningCatalyst.java new file mode 100644 index 00000000..841a9729 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/AveragePowerCatalyst.java new file mode 100644 index 00000000..3ce2cde9 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/EnhancedFillingAgent.java new file mode 100644 index 00000000..ecbad19d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterLengtheningCatalyst.java new file mode 100644 index 00000000..65bb052e --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/GreaterPowerCatalyst.java new file mode 100644 index 00000000..e5dd6d47 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/LengtheningCatalyst.java new file mode 100644 index 00000000..7476f689 --- /dev/null +++ b/1.7.10/main/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.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.ICatalyst; +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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundaneLengtheningCatalyst.java new file mode 100644 index 00000000..e945ed22 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/MundanePowerCatalyst.java new file mode 100644 index 00000000..86291dec --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/PowerCatalyst.java new file mode 100644 index 00000000..60d98566 --- /dev/null +++ b/1.7.10/main/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.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.ICatalyst; +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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardBindingAgent.java new file mode 100644 index 00000000..6a2edc0b --- /dev/null +++ b/1.7.10/main/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.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.IBindingAgent; +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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/StandardFillingAgent.java new file mode 100644 index 00000000..0cc4c9a8 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakBindingAgent.java new file mode 100644 index 00000000..24ee6f0b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/potion/WeakFillingAgent.java new file mode 100644 index 00000000..cd858f16 --- /dev/null +++ b/1.7.10/main/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.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.common.IFillingAgent; +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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/AirSigil.java new file mode 100644 index 00000000..8858819b --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/DivinationSigil.java new file mode 100644 index 00000000..a5d61a79 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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: " + EnergyItems.getCurrentEssence(ownerName) + "LP")); + + 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,true)); + } + + @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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java new file mode 100644 index 00000000..2eed1e0b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemFluidSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemFluidSigil.java new file mode 100644 index 00000000..fd8931f4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemFluidSigil.java @@ -0,0 +1,597 @@ +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.init.Blocks; +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.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import net.minecraftforge.fluids.IFluidHandler; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemFluidSigil extends Item implements IFluidContainerItem +{ + private int capacity = 128 * 1000; + private static final int STATE_SYPHON = 0; + private static final int STATE_FORCE_SYPHON = 1; + private static final int STATE_PLACE = 2; + private static final int STATE_INPUT_TANK = 3; + private static final int STATE_DRAIN_TANK = 4; + private static final int maxNumOfStates = 5; + + public ItemFluidSigil() + { + super(); + this.setMaxDamage(0); + this.setMaxStackSize(1); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("A sigil with a lovely affinity for fluids"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + //par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + + switch(this.getActionState(par1ItemStack)) + { + case STATE_SYPHON: + par3List.add("Syphoning Mode"); + break; + case STATE_FORCE_SYPHON: + par3List.add("Force-syphon Mode"); + break; + case STATE_PLACE: + par3List.add("Fluid Placement Mode"); + break; + case STATE_INPUT_TANK: + par3List.add("Fill Tank Mode"); + break; + case STATE_DRAIN_TANK: + par3List.add("Drain Tank Mode"); + break; + } + + FluidStack fluid = this.getFluid(par1ItemStack); + if(fluid!=null && fluid.amount>0) + { + String str = fluid.getFluid().getName(); + int amount = fluid.amount; + + par3List.add("" + amount + "mB of " + str); + }else + { + par3List.add("Empty"); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:WaterSigil"); + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if(par3EntityPlayer.isSneaking()) + { + int curState = this.cycleActionState(par1ItemStack); + this.sendMessageViaState(curState, par3EntityPlayer); + return par1ItemStack; + } + +// if(par2World.isRemote) +// { +// return par1ItemStack; +// } + + switch(this.getActionState(par1ItemStack)) + { + case STATE_SYPHON: + return this.fillItemFromWorld(par1ItemStack, par2World, par3EntityPlayer,false); + case STATE_FORCE_SYPHON: + return this.fillItemFromWorld(par1ItemStack, par2World, par3EntityPlayer,true); + case STATE_PLACE: + return this.emptyItemToWorld(par1ItemStack, par2World, par3EntityPlayer); + case STATE_INPUT_TANK: + return this.fillSelectedTank(par1ItemStack, par2World, par3EntityPlayer); + case STATE_DRAIN_TANK: + return this.drainSelectedTank(par1ItemStack, par2World, par3EntityPlayer); + } + + return par1ItemStack; + } + + public int getActionState(ItemStack item) + { + if (item.stackTagCompound == null) + { + item.setTagCompound(new NBTTagCompound()); + } + + return item.stackTagCompound.getInteger("actionState"); + } + + public void setActionState(ItemStack item, int actionState) + { + if (item.stackTagCompound == null) + { + item.setTagCompound(new NBTTagCompound()); + } + + item.stackTagCompound.setInteger("actionState", actionState); + } + + public int cycleActionState(ItemStack item) + { + int state = this.getActionState(item); + + state++; + + if(state>=maxNumOfStates) + { + state = 0; + } + + this.setActionState(item, state); + + return state; + } + + public void sendMessageViaState(int state, EntityPlayer player) + { + if(player.worldObj.isRemote) + { + ChatComponentText cmc = new ChatComponentText(""); + switch(state) + { + case STATE_SYPHON: + cmc.appendText("Now in Syphoning Mode"); + break; + case STATE_FORCE_SYPHON: + cmc.appendText("Now in Force-syphon Mode"); + break; + case STATE_PLACE: + cmc.appendText("Now in Fluid Placement Mode"); + break; + case STATE_INPUT_TANK: + cmc.appendText("Now in Fill Tank Mode"); + break; + case STATE_DRAIN_TANK: + cmc.appendText("Now in Drain Tank Mode"); + break; + } + player.addChatComponentMessage(cmc); + } + } + + public ItemStack fillItemFromWorld(ItemStack container, World world, EntityPlayer player, boolean forceFill) + { + float f = 1.0F; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double)f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double)f + 1.62D - (double)player.yOffset; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)f; + boolean flag = true; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, flag); + + if (movingobjectposition == null) + { + return container; + } + else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) + { + return container; + } + + if (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, container)) + { + return container; + } + + if (world.getBlock(i, j, k) != null && world.getBlock(i, j, k).getMaterial() instanceof MaterialLiquid) + { + Block block = world.getBlock(i, j, k); + Fluid fluid = FluidRegistry.lookupFluidForBlock(block); + + if(fluid==null) + { + return container; + } + + FluidStack fillStack = new FluidStack(fluid,1000); + + int amount = this.fill(container, fillStack, false); + + if((amount > 0 && forceFill) || (amount >=1000 && !forceFill)) + { + if(!player.capabilities.isCreativeMode) + { + world.setBlockToAir(i, j, k); + } + + this.fill(container, new FluidStack(fluid,1000), true); + + if (!player.capabilities.isCreativeMode) + { +// if (!EnergyItems.syphonBatteries(container, player, getEnergyUsed())) +// { +// } + } + else + { + return container; + } + } + } + } + + return container; + } + } + + public ItemStack emptyItemToWorld(ItemStack container, World world, EntityPlayer player) + { + FluidStack simStack = this.drain(container, 1000, false); + + if(simStack!=null && simStack.amount>=1000) + { + Block fluidBlock = simStack.getFluid().getBlock(); + + float f = 1.0F; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double)f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double)f + 1.62D - (double)player.yOffset; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)f; + boolean flag = false; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, flag); + + if (movingobjectposition == null) + { + return container; + } + else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + if (!world.canMineBlock(player, i, j, k)) + { + return container; + } + + 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 (!player.canPlayerEdit(i, j, k, movingobjectposition.sideHit, container)) + { + return container; + } + + if (this.tryPlaceContainedLiquid(world, fluidBlock, d0, d1, d2, i, j, k) && !player.capabilities.isCreativeMode) + { + this.drain(container, 1000, true); + + return container; + } + + } + + return container; + } + } + + return container; + } + + public boolean tryPlaceContainedLiquid(World par1World, Block block, double par2, double par4, double par6, int par8, int par9, int par10) + { + if (!par1World.isAirBlock(par8, par9, par10) && par1World.getBlock(par8, par9, par10).func_149730_j()) + { + return false; + } + else if ((par1World.getBlock(par8, par9, par10).getMaterial() instanceof MaterialLiquid && (par1World.getBlockMetadata(par8, par9, par10) == 0))) + { + return false; + } + else + { + if ((block == Blocks.water || block == Blocks.flowing_water) && 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, block, 0, 3); + } + + return true; + } + } + + public ItemStack fillSelectedTank(ItemStack container, World world, EntityPlayer player) + { + FluidStack fluid = this.getFluid(container); + + if(fluid == null) + { + return container; + } + + float f = 1.0F; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double)f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double)f + 1.62D - (double)player.yOffset; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)f; + boolean flag = false; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, flag); + + if (movingobjectposition == null) + { + return container; + } + else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + TileEntity tile = world.getTileEntity(i, j, k); + + if(tile instanceof IFluidHandler) + { + int amount = ((IFluidHandler) tile).fill(ForgeDirection.getOrientation(movingobjectposition.sideHit), fluid, true); + + this.drain(container, amount, true); + } + } + } + + return container; + } + + public ItemStack drainSelectedTank(ItemStack container, World world, EntityPlayer player) + { + float f = 1.0F; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double)f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double)f + 1.62D - (double)player.yOffset; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double)f; + boolean flag = false; + MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, flag); + + if (movingobjectposition == null) + { + return container; + } + else + { + if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) + { + int i = movingobjectposition.blockX; + int j = movingobjectposition.blockY; + int k = movingobjectposition.blockZ; + + TileEntity tile = world.getTileEntity(i, j, k); + + if(tile instanceof IFluidHandler) + { + FluidStack fluidAmount = ((IFluidHandler) tile).drain(ForgeDirection.getOrientation(movingobjectposition.sideHit), this.getCapacity(container), false); + + int amount = this.fill(container, fluidAmount, false); + + if(amount>0) + { + ((IFluidHandler) tile).drain(ForgeDirection.getOrientation(movingobjectposition.sideHit), this.getCapacity(container), true); + + this.fill(container, fluidAmount, true); + } + } + } + } + + return container; + } + + /* IFluidContainerItem */ + @Override + public FluidStack getFluid(ItemStack container) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return null; + } + return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + } + + @Override + public int getCapacity(ItemStack container) + { + return capacity; + } + + @Override + public int fill(ItemStack container, FluidStack resource, boolean doFill) + { + if (resource == null) + { + return 0; + } + + if (!doFill) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return Math.min(capacity, resource.amount); + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + + if (stack == null || stack.amount <= 0) + { + return Math.min(capacity, resource.amount); + } + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + return Math.min(capacity - stack.amount, resource.amount); + } + + if (container.stackTagCompound == null) + { + container.stackTagCompound = new NBTTagCompound(); + } + + if (!container.stackTagCompound.hasKey("Fluid")) + { + NBTTagCompound fluidTag = resource.writeToNBT(new NBTTagCompound()); + + if (capacity < resource.amount) + { + fluidTag.setInteger("Amount", capacity); + container.stackTagCompound.setTag("Fluid", fluidTag); + return capacity; + } + + container.stackTagCompound.setTag("Fluid", fluidTag); + return resource.amount; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid"); + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + + if(stack==null || stack.amount<=0) + { + NBTTagCompound fluidTag1 = resource.writeToNBT(new NBTTagCompound()); + + if (capacity < resource.amount) + { + fluidTag1.setInteger("Amount", capacity); + container.stackTagCompound.setTag("Fluid", fluidTag1); + return capacity; + } + + container.stackTagCompound.setTag("Fluid", fluidTag1); + return resource.amount; + } + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + int filled = capacity - stack.amount; + if (resource.amount < filled) + { + stack.amount += resource.amount; + filled = resource.amount; + } + else + { + stack.amount = capacity; + } + + container.stackTagCompound.setTag("Fluid", stack.writeToNBT(fluidTag)); + return filled; + } + + @Override + public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Fluid")) + { + return null; + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("Fluid")); + if (stack == null) + { + return null; + } + + stack.amount = Math.min(stack.amount, maxDrain); + if (doDrain) + { + if (maxDrain >= capacity) + { + container.stackTagCompound.removeTag("Fluid"); + + if (container.stackTagCompound.hasNoTags()) + { + container.stackTagCompound = null; + } + return stack; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("Fluid"); + fluidTag.setInteger("Amount", fluidTag.getInteger("Amount") - maxDrain); + container.stackTagCompound.setTag("Fluid", fluidTag); + } + return stack; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSeerSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSeerSigil.java new file mode 100644 index 00000000..827a3244 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSeerSigil.java @@ -0,0 +1,67 @@ +package WayofTime.alchemicalWizardry.common.items.sigil; + +import java.util.List; + +import net.minecraft.client.Minecraft; +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.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IHolding; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemSeerSigil extends Item implements IHolding +{ + public ItemSeerSigil() + { + super(); + this.maxStackSize = 1; + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SeerSigil"); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("When seeing all is not enough"); + + 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"); + + return par1ItemStack; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfEnderSeverance.java new file mode 100644 index 00000000..b341e859 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.IHolding; +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 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:SigilOfSeverance_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfSeverance_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfSeverance_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,5,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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfSupression.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfSupression.java new file mode 100644 index 00000000..c7c607c4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemSigilOfSupression.java @@ -0,0 +1,270 @@ +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.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralContainer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemSigilOfSupression extends EnergyItems implements ArmourUpgrade +{ + private static IIcon activeIcon; + private static IIcon passiveIcon; + private int tickDelay = 200; + private int radius = 5; + private int refresh = 100; + + public ItemSigilOfSupression() + { + super(); + this.maxStackSize = 1; + setEnergyUsed(400); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Better than telekinesis"); + + 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:SigilOfSupression_deactivated"); + this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfSupression_activated"); + this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfSupression_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(SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) + { + return par1ItemStack; + } + + 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; + } + + if(SpellHelper.isFakePlayer(par2World, (EntityPlayer)par3Entity)) + { + return; + } + + EntityPlayer par3EntityPlayer = (EntityPlayer) par3Entity; + + if (par1ItemStack.stackTagCompound == null) + { + par1ItemStack.setTagCompound(new NBTTagCompound()); + } + + if (par1ItemStack.stackTagCompound.getBoolean("isActive")&&(!par2World.isRemote)) + { + Vec3 blockVec = SpellHelper.getEntityBlockVector(par3EntityPlayer); + int x = (int)blockVec.xCoord; + int y = (int)blockVec.yCoord; + int z = (int)blockVec.zCoord; + + 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; + } + + Block block = par2World.getBlock(x+i, y+j, z+k); + + + if(SpellHelper.isBlockFluid(block)) + { + if(par2World.getTileEntity(x+i, y+j, z+k)!=null) + { + par2World.setBlockToAir(x+i, y+j, z+k); + } + TESpectralContainer.createSpectralBlockAtLocation(par2World, x+i, y+j, z+k, refresh); + } + else + { + TileEntity tile = par2World.getTileEntity(x+i, y+j, z+k); + if(tile instanceof TESpectralContainer) + { + ((TESpectralContainer) tile).resetDuration(refresh); + } + } + } + } + } + } + + 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; + } + + @Override + public void onArmourUpdate(World world, EntityPlayer player, ItemStack thisItemStack) + { + Vec3 blockVec = SpellHelper.getEntityBlockVector(player); + int x = (int)blockVec.xCoord; + int y = (int)blockVec.yCoord; + int z = (int)blockVec.zCoord; + + 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; + } + + Block block = world.getBlock(x+i, y+j, z+k); + + + if(SpellHelper.isBlockFluid(block)) + { + if(world.getTileEntity(x+i, y+j, z+k)!=null) + { + world.setBlockToAir(x+i, y+j, z+k); + } + TESpectralContainer.createSpectralBlockAtLocation(world, x+i, y+j, z+k, refresh); + } + else + { + TileEntity tile = world.getTileEntity(x+i, y+j, z+k); + if(tile instanceof TESpectralContainer) + { + ((TESpectralContainer) tile).resetDuration(refresh); + } + } + } + } + } + } + + @Override + public boolean isUpgrade() + { + return true; + } + + @Override + public int getEnergyForTenSeconds() + { + return 200; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java new file mode 100644 index 00000000..75028002 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/LavaSigil.java @@ -0,0 +1,310 @@ +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.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.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; + } + + TileEntity tile = par2World.getTileEntity(i, j, k); + if(tile instanceof IFluidHandler) + { + FluidStack fluid = new FluidStack(FluidRegistry.LAVA,1000); + int amount = ((IFluidHandler) tile).fill(ForgeDirection.getOrientation(movingobjectposition.sideHit), fluid, false); + + if(amount>0) + { + ((IFluidHandler) tile).fill(ForgeDirection.getOrientation(movingobjectposition.sideHit), fluid, true); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + 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,true)); + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.java new file mode 100644 index 00000000..daa017a1 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfElementalAffinity.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.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; + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfGrowth.java new file mode 100644 index 00000000..710b3315 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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) + { + + } + 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_); + } + + + } + + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHaste.java new file mode 100644 index 00000000..2aecbf25 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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,true)); + } + + @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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java new file mode 100644 index 00000000..03b1f730 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfHolding.java @@ -0,0 +1,371 @@ +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.api.items.interfaces.IHolding; +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()); + return null; + } + + 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; + } + + if(addedItemStack.getItem() instanceof IHolding) + { + inv[candidateSlot] = addedItemStack; + saveInternalInventory(sigilItemStack, inv); + return true; + } + + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfMagnetism.java new file mode 100644 index 00000000..5693d17f --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheBridge.java new file mode 100644 index 00000000..a4575728 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java new file mode 100644 index 00000000..4f439bfe --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfWind.java new file mode 100644 index 00000000..752797a7 --- /dev/null +++ b/1.7.10/main/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.api.items.interfaces.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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java new file mode 100644 index 00000000..54695d21 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/VoidSigil.java @@ -0,0 +1,195 @@ +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.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.entity.player.FillBucketEvent; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.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; + } + + @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; + } + + TileEntity tile = par2World.getTileEntity(i, j, k); + if(tile instanceof IFluidHandler) + { + FluidStack amount = ((IFluidHandler) tile).drain(ForgeDirection.getOrientation(movingobjectposition.sideHit), 1000, false); + + if(amount != null && amount.amount > 0) + { + ((IFluidHandler) tile).drain(ForgeDirection.getOrientation(movingobjectposition.sideHit), 1000, true); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + 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.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.java new file mode 100644 index 00000000..e8378c7a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/sigil/WaterSigil.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.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.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.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; + } + + TileEntity tile = par2World.getTileEntity(i, j, k); + if(tile instanceof IFluidHandler) + { + FluidStack fluid = new FluidStack(FluidRegistry.WATER,1000); + int amount = ((IFluidHandler) tile).fill(ForgeDirection.getOrientation(movingobjectposition.sideHit), fluid, false); + + if(amount>0) + { + ((IFluidHandler) tile).fill(ForgeDirection.getOrientation(movingobjectposition.sideHit), fluid, true); + if (!par3EntityPlayer.capabilities.isCreativeMode) + { + if (!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, getEnergyUsed())) + { + } + } + } + + 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,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.10/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java new file mode 100644 index 00000000..f770c9dd --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/spell/ItemSpellMultiTool.java @@ -0,0 +1,861 @@ +package WayofTime.alchemicalWizardry.common.items.spell; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.Set; + +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class ItemSpellMultiTool extends Item +{ + private static final String harvestLevelSuffix = "harvestLvl"; + private static final String digLevelSuffix = "digLvl"; + private static final String tagName = "BloodMagicTool"; + private Random rand = new Random(); + + public ItemSpellMultiTool() + { + super(); + this.setMaxDamage(0); + this.setMaxStackSize(1); + this.setFull3D(); + } + + @Override + public void registerIcons (IIconRegister iconRegister) + { + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:BoundTool"); + } + + @Override + public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) + { + float damage = this.getCustomItemAttack(par1ItemStack); + + SpellParadigmTool parad = this.loadParadigmFromStack(par1ItemStack); + + if(parad != null) + { + parad.onLeftClickEntity(par1ItemStack, par2EntityLivingBase, par3EntityLivingBase); + } + + damage += parad.getAddedDamageForEntity(par2EntityLivingBase); + + if(rand.nextFloat() < this.getCritChance(par1ItemStack)) + { + damage *= 1.75f; + } + + if(par3EntityLivingBase instanceof EntityPlayer) + { + par2EntityLivingBase.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer)par3EntityLivingBase), damage); + } + else + { + par2EntityLivingBase.attackEntityFrom(DamageSource.causeMobDamage(par3EntityLivingBase), damage); + } + + return true; + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) + { + SpellParadigmTool parad = this.loadParadigmFromStack(stack); + + if(parad != null && entity instanceof EntityLivingBase) + { + parad.onLeftClickEntity(stack, (EntityLivingBase)entity, player); + } + + return false; + } + + @Override + public boolean onBlockStartBreak (ItemStack stack, int x, int y, int z, EntityPlayer player) + { + if(player.worldObj.isRemote) + { + return false; + } + + if (!stack.hasTagCompound()) + return false; + + World world = player.worldObj; + Block block = player.worldObj.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + // Block block = Block.blocksList[bID]; + if (block == null || block == Blocks.air) + return false; + int hlvl = -1; + float blockHardness = block.getBlockHardness(world, x, y, z); + + MovingObjectPosition mop = SpellHelper.raytraceFromEntity(world, player, true, 5.0D); + + Block localBlock = world.getBlock(x, y, z); + int localMeta = world.getBlockMetadata(x, y, z); + String toolClass = block.getHarvestTool(meta); + if (toolClass != null && this.getHarvestLevel(stack, toolClass) != -1) + hlvl = block.getHarvestLevel(meta); + int toolLevel = this.getHarvestLevel(stack, toolClass); + + float localHardness = localBlock == null ? Float.MAX_VALUE : localBlock.getBlockHardness(world, x, y, z); + + if (hlvl <= toolLevel && localHardness - 1.5 <= blockHardness) + { + boolean cancelHarvest = false; + + if (!cancelHarvest) + { + if (localBlock != null && !(localHardness < 0)) + { + boolean isEffective = false; + + String localToolClass = this.getToolClassForMaterial(localBlock.getMaterial()); + + if(localToolClass != null && this.getHarvestLevel(stack, toolClass) >= localBlock.getHarvestLevel(localMeta)) + { + isEffective = true; + } + + + if (localBlock.getMaterial().isToolNotRequired()) + { + isEffective = true; + } + + if (!player.capabilities.isCreativeMode) + { + if (isEffective) + { + if (localBlock.removedByPlayer(world, player, x, y, z)) + { + localBlock.onBlockDestroyedByPlayer(world, x, y, z, localMeta); + } + //localBlock.harvestBlock(world, player, x, y, z, localMeta); + localBlock.onBlockHarvested(world, x, y, z, localMeta, player); + if (blockHardness > 0f) + onBlockDestroyed(stack, world, localBlock, x, y, z, player); + + List items = SpellHelper.getItemsFromBlock(world, localBlock, x, y, z, localMeta, this.getSilkTouch(stack), this.getFortuneLevel(stack)); + + SpellParadigmTool parad = this.loadParadigmFromStack(stack); + List newItems = parad.handleItemList(stack, items); + + if(!world.isRemote) + { + SpellHelper.spawnItemListInWorld(newItems, world, x + 0.5f, y + 0.5f, z + 0.5f); + } + + world.func_147479_m(x, y, z); + + int cost = 0; + + cost += parad.digSurroundingArea(stack, world, player, mop, localToolClass, localHardness, toolLevel, this); + + cost += parad.onBreakBlock(stack, world, player, localBlock, localMeta, x, y, z, ForgeDirection.getOrientation(mop.sideHit)); + + if(cost > 0) + { + EnergyItems.syphonAndDamageWhileInContainer(stack, player, cost); + } + } + else + { + world.setBlockToAir(x, y, z); + world.func_147479_m(x, y, z); + } + + } + else + { + world.setBlockToAir(x, y, z); + world.func_147479_m(x, y, z); + } + } + } + } + + if (!world.isRemote) + world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (meta << 12)); + return true; + + } + + public Material[] getMaterialsForToolclass(String toolClass) + { + if("pickaxe".equals(toolClass)) + { + return new Material[] { Material.rock, Material.iron, Material.ice, Material.glass, Material.piston, Material.anvil, Material.circuits }; + } + else if("shovel".equals(toolClass)) + { + return new Material[]{ Material.grass, Material.ground, Material.sand, Material.snow, Material.craftedSnow, Material.clay }; + } + else if("axe".equals(toolClass)) + { + return new Material[]{ Material.wood, Material.vine, Material.circuits, Material.cactus }; + } + return new Material[0]; + } + + public String getToolClassForMaterial(Material mat) + { + String testString = "pickaxe"; + + Material[] matList = this.getMaterialsForToolclass(testString); + for(int i=0; i < matList.length; i++) + { + if(matList[i] == mat) + { + return testString; + } + } + + testString = "shovel"; + matList = this.getMaterialsForToolclass(testString); + for(int i=0; i < matList.length; i++) + { + if(matList[i] == mat) + { + return testString; + } + } + + testString = "axe"; + matList = this.getMaterialsForToolclass(testString); + for(int i=0; i < matList.length; i++) + { + if(matList[i] == mat) + { + return testString; + } + } + + return null; + } + + public Set getToolClasses(ItemStack stack) + { + Set set = new HashSet(); + + if(this.getHarvestLevel(stack, "pickaxe") > -1) + { + set.add("pickaxe"); + } + + if(this.getHarvestLevel(stack, "axe") > -1) + { + set.add("axe"); + } + + if(this.getHarvestLevel(stack, "shovel") > -1) + { + set.add("shovel"); + } + + return set; + } + +// @Override +// public boolean onBlockDestroyed (ItemStack itemstack, World world, Block block, int x, int y, int z, EntityLivingBase player) +// { +// if (block != null && block.getMaterial() == Material.leaves) +// return false; +// +// +// return AbilityHelper.onBlockChanged(itemstack, world, block, x, y, z, player, random); +// } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta) + { + String toolClass = block.getHarvestTool(meta); + + if(toolClass == null || toolClass.equals("")) + { + return 1.0f; + } + + //if (ForgeHooks.isToolEffective(stack, block, meta)) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + return tag.getFloat(digLevelSuffix + toolClass); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + } + } + + return 1.0f; + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + if(tag.hasKey(harvestLevelSuffix + toolClass)) + { + return tag.getInteger(harvestLevelSuffix + toolClass); + }else + { + return -1; + } + } + else + { + stack.setTagCompound(new NBTTagCompound()); + } + + return -1; + } + +// @Override +// public float func_150893_a(ItemStack p_150893_1_, Block p_150893_2_) +// { +// return p_150893_2_.getMaterial() != Material.iron && p_150893_2_.getMaterial() != Material.anvil && p_150893_2_.getMaterial() != Material.rock ? super.func_150893_a(p_150893_1_, p_150893_2_) : 15; +// } + + @Override + public boolean canHarvestBlock(Block par1Block, ItemStack itemStack) + { + + return true; + } + + @Override + public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) + { + return false; + } + + @Override + public void onUpdate(ItemStack toolStack, World world, Entity par3Entity, int par4, boolean par5) + { + if(world.isRemote) + { + return; + } + + SpellParadigmTool parad = this.loadParadigmFromStack(toolStack); + int cost = parad.onUpdate(toolStack, world, par3Entity, par4, par5); + + if(par3Entity instanceof EntityPlayer && cost > 0) + EnergyItems.syphonAndDamageWhileInContainer(toolStack, (EntityPlayer)par3Entity, cost); + + int duration = Math.max(this.getDuration(toolStack, world), 0); + + if(duration <= 0 && par3Entity instanceof EntityPlayer) + { + int banishCost = parad.onBanishTool(toolStack, world, par3Entity, par4, par5); + EnergyItems.syphonAndDamageWhileInContainer(toolStack, (EntityPlayer)par3Entity, banishCost); + ((EntityPlayer) par3Entity).inventory.mainInventory[par4] = this.getContainedCrystal(toolStack); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + if(par3EntityPlayer.isSneaking()) + { + par3EntityPlayer.setCurrentItemOrArmor(0, this.getContainedCrystal(par1ItemStack)); + return par1ItemStack; + } + + SpellParadigmTool parad = this.loadParadigmFromStack(par1ItemStack); + + MovingObjectPosition mop = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, false); + + int cost = 0; + + if(mop != null && mop.typeOfHit.equals(MovingObjectPosition.MovingObjectType.BLOCK)) + { + cost = parad.onRightClickBlock(par1ItemStack, par3EntityPlayer, par2World, mop); + }else + { + cost = parad.onRightClickAir(par1ItemStack, par2World, par3EntityPlayer); + } + + if(cost > 0) + { + EnergyItems.syphonAndDamageWhileInContainer(par1ItemStack, par3EntityPlayer, cost); + } + + return par1ItemStack; + } + + @Override + public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) + { + par3List.add("Here's a 'Tool Tip' :D"); + + if (!(par1ItemStack.stackTagCompound == null)) + { + if (!par1ItemStack.stackTagCompound.getString("ownerName").equals("")) + { + par3List.add("Current owner: " + par1ItemStack.stackTagCompound.getString("ownerName")); + } + + for(String str : this.getToolListString(par1ItemStack)) + { + par3List.add(str); + } + + par3List.add(""); + float damage = this.getCustomItemAttack(par1ItemStack); + par3List.add("\u00A79+" + ((int)(damage*10))/10.0f + " " + "Attack Damage"); + float critChance = ((int)(this.getCritChance(par1ItemStack)*1000))/10; + par3List.add("\u00A79+" + critChance + "% " + "Crit Chance"); + } + } + + //--------------Custom methods--------------// + + public void setHarvestLevel(ItemStack stack, String toolClass, int harvestLevel) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setInteger(harvestLevelSuffix + toolClass, Math.max(-1,harvestLevel)); + + stack.getTagCompound().setTag(tagName, tag); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setInteger(harvestLevelSuffix + toolClass, Math.max(-1,harvestLevel)); + + stack.getTagCompound().setTag(tagName, tag); + } + } + + public void setDigSpeed(ItemStack stack, String toolClass, float digSpeed) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setFloat(digLevelSuffix + toolClass, digSpeed); + + stack.getTagCompound().setTag(tagName, tag); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setFloat(digLevelSuffix + toolClass, digSpeed); + + stack.getTagCompound().setTag(tagName, tag); + } + } + + public float getDigSpeed(ItemStack stack, String toolClass) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + return tag.getFloat(digLevelSuffix + toolClass); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + return 0.0f; + } + } + + public void setItemAttack(ItemStack stack, float damage) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setFloat("itemAttack", Math.max(damage, 0.0f)); + + stack.stackTagCompound.setTag(tagName, tag); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setFloat("itemAttack", Math.max(damage, 0.0f)); + + stack.stackTagCompound.setTag(tagName, tag); + } + } + + public float getCustomItemAttack(ItemStack stack) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + return tag.getFloat("itemAttack"); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + return 0.0f; + } + } + + public ItemStack getContainedCrystal(ItemStack container) + { + if(container.hasTagCompound()) + { + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName).getCompoundTag("heldItem"); + + return ItemStack.loadItemStackFromNBT(tag); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + return null; + } + } + + public void setContainedCrystal(ItemStack container, ItemStack crystal) + { + if(container.hasTagCompound()) + { + NBTTagCompound compTag = container.getTagCompound().getCompoundTag(tagName); + NBTTagCompound tag = compTag.getCompoundTag("heldItem"); + + crystal.writeToNBT(tag); + + compTag.setTag("heldItem", tag); + container.getTagCompound().setTag(tagName, compTag); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + NBTTagCompound compTag = container.getTagCompound().getCompoundTag(tagName); + NBTTagCompound tag = compTag.getCompoundTag("heldItem"); + + crystal.writeToNBT(tag); + + compTag.setTag("heldItem", tag); + container.getTagCompound().setTag(tagName, compTag); + } + } + + public void setDuration(ItemStack container, World world, int duration) + { + if(world.isRemote) + { + return; + }else + { + World overWorld = DimensionManager.getWorld(0); + long worldtime = overWorld.getTotalWorldTime(); + + if(container.hasTagCompound()) + { + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + tag.setLong("duration", Math.max(duration + worldtime, worldtime)); + + container.getTagCompound().setTag(tagName, tag); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + tag.setLong("duration", Math.max(duration + worldtime, worldtime)); + + container.getTagCompound().setTag(tagName, tag); + } + } + } + + public int getDuration(ItemStack container, World world) + { + if(world.isRemote) + { + return 0; + } + else + { + World overWorld = DimensionManager.getWorld(0); + long worldtime = overWorld.getTotalWorldTime(); + + if(container.hasTagCompound()) + { + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + return (int)(tag.getLong("duration") - worldtime); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + return 0; + } + } +// if(container.hasTagCompound()) +// { +// NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); +// +// return tag.getInteger("duration"); +// } +// else +// { +// container.setTagCompound(new NBTTagCompound()); +// +// return 0; +// } + } + + public void loadParadigmIntoStack(ItemStack container, List list) + { + if(!container.hasTagCompound()) + { + container.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tagiest = container.getTagCompound().getCompoundTag(tagName); + + NBTTagList effectList = new NBTTagList(); + + for(SpellEffect eff : list) + { + effectList.appendTag(eff.getTag()); + } + + tagiest.setTag("Effects", effectList); + + container.getTagCompound().setTag(tagName, tagiest); + } + + public SpellParadigmTool loadParadigmFromStack(ItemStack container) + { + if(!container.hasTagCompound()) + { + container.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound tagiest = container.getTagCompound().getCompoundTag(tagName); + + NBTTagList tagList = tagiest.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); + } + } + + return SpellParadigmTool.getParadigmForEffectArray(spellEffectList); + } + + public void setSilkTouch(ItemStack stack, boolean silkTouch) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setBoolean("silkTouch", silkTouch); + + stack.stackTagCompound.setTag(tagName, tag); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setBoolean("silkTouch", silkTouch); + + stack.stackTagCompound.setTag(tagName, tag); + } + } + + public boolean getSilkTouch(ItemStack stack) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + return tag.getBoolean("silkTouch"); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + return false; + } + } + + public void setFortuneLevel(ItemStack stack, int fortune) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setInteger("fortuneLevel", Math.max(fortune, 0)); + + stack.stackTagCompound.setTag(tagName, tag); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + tag.setInteger("fortuneLevel", Math.max(fortune, 0)); + + stack.stackTagCompound.setTag(tagName, tag); + } + } + + public int getFortuneLevel(ItemStack stack) + { + if(stack.hasTagCompound()) + { + NBTTagCompound tag = stack.getTagCompound().getCompoundTag(tagName); + + return tag.getInteger("fortuneLevel"); + } + else + { + stack.setTagCompound(new NBTTagCompound()); + + return 0; + } + } + + public List getToolListString(ItemStack container) + { + if(!container.hasTagCompound()) + { + container.setTagCompound(new NBTTagCompound()); + } + NBTTagCompound tagiest = container.getTagCompound().getCompoundTag(tagName); + + NBTTagList tagList = tagiest.getTagList("ToolTips",Constants.NBT.TAG_COMPOUND); + + List toolTipList = new LinkedList(); + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + + String str = tag.getString("tip"); + if(str!=null) + { + toolTipList.add(str); + } + } + + return toolTipList; + } + + public void setToolListString(ItemStack container, List toolTipString) + { + if(!container.hasTagCompound()) + { + container.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tagiest = container.getTagCompound().getCompoundTag(tagName); + + NBTTagList stringList = new NBTTagList(); + + for(String str : toolTipString) + { + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("tip", str); + + stringList.appendTag(tag); + } + + tagiest.setTag("ToolTips", stringList); + + container.getTagCompound().setTag(tagName, tagiest); + } + + public void setCritChance(ItemStack container, float chance) + { + if(container.hasTagCompound()) + { + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + tag.setFloat("critChance", Math.max(chance, 0)); + + container.stackTagCompound.setTag(tagName, tag); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + tag.setFloat("critChance", Math.max(chance, 0)); + + container.stackTagCompound.setTag(tagName, tag); + } + } + + public float getCritChance(ItemStack container) + { + if(container.hasTagCompound()) + { + NBTTagCompound tag = container.getTagCompound().getCompoundTag(tagName); + + return tag.getFloat("critChance"); + } + else + { + container.setTagCompound(new NBTTagCompound()); + + return 0; + } + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBase.java new file mode 100644 index 00000000..469c0ff6 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusBloodBlast.java new file mode 100644 index 00000000..8d377041 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/FocusGravityWell.java new file mode 100644 index 00000000..8a0e3678 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java new file mode 100644 index 00000000..7cdef813 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/items/thaumcraft/ItemSanguineArmour.java @@ -0,0 +1,103 @@ +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 thaumcraft.api.IGoggles; +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.api.items.interfaces.ArmourUpgrade; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemSanguineArmour extends ItemArmor implements ArmourUpgrade, IGoggles, IVisDiscountGear, 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: " + 8 + "%"); + } + + +// @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 false; + } + + @Override + public int getEnergyForTenSeconds() + { + return 0; + } + + @Override + public boolean showNodes(ItemStack itemstack, EntityLivingBase player) + { + return true; + } + + @Override + public int getVisDiscount(ItemStack stack, EntityPlayer player, Aspect aspect) + { + return 8; + } + + @Override + public boolean showIngamePopups(ItemStack itemstack, EntityLivingBase player) + { + return true; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/mcmod.info b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/mcmod.info new file mode 100644 index 00000000..cd89dc4c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java new file mode 100644 index 00000000..132205bb --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionBoost.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java new file mode 100644 index 00000000..87558f26 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionDrowning.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFireFuse.java new file mode 100644 index 00000000..8fe5d527 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java new file mode 100644 index 00000000..b885d240 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlameCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java new file mode 100644 index 00000000..23e93e57 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionFlight.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionHeavyHeart.java new file mode 100644 index 00000000..952fb59c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java new file mode 100644 index 00000000..d169b4d9 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionIceCloak.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java new file mode 100644 index 00000000..2214e105 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionInhibit.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionPlanarBinding.java new file mode 100644 index 00000000..54d6cd72 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java new file mode 100644 index 00000000..317edd54 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionProjectileProtect.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java new file mode 100644 index 00000000..ddceed0b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/potion/PotionReciprocation.java @@ -0,0 +1,18 @@ +package WayofTime.alchemicalWizardry.common.potion; + +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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderConduit.java new file mode 100644 index 00000000..6c93e00e --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPedestal.java new file mode 100644 index 00000000..b1f5b4ec --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderPlinth.java new file mode 100644 index 00000000..14063a37 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEffectBlock.java new file mode 100644 index 00000000..134a3f98 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellEnhancementBlock.java new file mode 100644 index 00000000..ae2b9f2c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellModifierBlock.java new file mode 100644 index 00000000..a01c0726 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderSpellParadigmBlock.java new file mode 100644 index 00000000..47a5b271 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java new file mode 100644 index 00000000..ef098839 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java new file mode 100644 index 00000000..20353e77 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEAltarItemRenderer.java new file mode 100644 index 00000000..70cc34f7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEConduitItemRenderer.java new file mode 100644 index 00000000..bf875589 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEffectBlockItemRenderer.java new file mode 100644 index 00000000..30cb938a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellEnhancementBlockItemRenderer.java new file mode 100644 index 00000000..a25da6d7 --- /dev/null +++ b/1.7.10/main/java/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.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"; + 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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellModifierBlockItemRenderer.java new file mode 100644 index 00000000..c7809540 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.java new file mode 100644 index 00000000..848d36ae --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TESpellParadigmBlockItemRenderer.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.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"; + case 3: return "alchemicalwizardry:textures/models/SpellParadigmTool.png"; + } + return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/block/itemRender/TEWritingTableItemRenderer.java new file mode 100644 index 00000000..9705879c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBileDemon.java new file mode 100644 index 00000000..b09c6ca7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderBoulderFist.java new file mode 100644 index 00000000..6db35edd --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderElemental.java new file mode 100644 index 00000000..485adc3a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderFallenAngel.java new file mode 100644 index 00000000..28a18eaa --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderIceDemon.java new file mode 100644 index 00000000..e7dd7219 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderLowerGuardian.java new file mode 100644 index 00000000..4eeaa4d3 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderShade.java new file mode 100644 index 00000000..38868202 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderSmallEarthGolem.java new file mode 100644 index 00000000..16772df4 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/mob/RenderWingedFireDemon.java new file mode 100644 index 00000000..826f7832 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBileDemon.java new file mode 100644 index 00000000..e09db58e --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBloodAltar.java new file mode 100644 index 00000000..eba407bb --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelBoulderFist.java new file mode 100644 index 00000000..a2cebd46 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelConduit.java new file mode 100644 index 00000000..a6a510c4 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelElemental.java new file mode 100644 index 00000000..25cb2814 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..de8e7e6b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelFallenAngel.java new file mode 100644 index 00000000..aacef80d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelIceDemon.java new file mode 100644 index 00000000..9c6d3c32 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelLowerGuardian.java new file mode 100644 index 00000000..61d7b85d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelMeteor.java new file mode 100644 index 00000000..26a94989 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPedestal.java new file mode 100644 index 00000000..753df6a5 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelPlinth.java new file mode 100644 index 00000000..f4190b5d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelShade.java new file mode 100644 index 00000000..8a7f2632 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSmallEarthGolem.java new file mode 100644 index 00000000..45a232de --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEffectBlock.java new file mode 100644 index 00000000..61110926 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellEnhancementBlock.java new file mode 100644 index 00000000..f56dca24 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellModifierBlock.java new file mode 100644 index 00000000..3ceed7e9 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelSpellParadigmBlock.java new file mode 100644 index 00000000..da48b87d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWingedFireDemon.java new file mode 100644 index 00000000..07164ffd --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/model/ModelWritingTable.java new file mode 100644 index 00000000..15dede34 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBazookaMainProjectile.java new file mode 100644 index 00000000..57df9912 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java new file mode 100644 index 00000000..5e988929 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderEnergyBlastProjectile.java @@ -0,0 +1,101 @@ +package WayofTime.alchemicalWizardry.common.renderer.projectile; + +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(Entity 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 IProjectile) + { + this.doRenderEnergyBlastProjectile(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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderFireProjectile.java new file mode 100644 index 00000000..cda739fe --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/renderer/projectile/RenderMeteor.java new file mode 100644 index 00000000..c39dcb11 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java new file mode 100644 index 00000000..bc03fe33 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAnimalGrowth.java @@ -0,0 +1,120 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectAnimalGrowth extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (world.getWorldTime() % 20 != 0) + { + return; + } + + int d0 = 2; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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 = SpellHelper.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() + { + + return 2; + } + + @Override + public List getRitualComponentList() + { + 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)); + return animalGrowthRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java new file mode 100644 index 00000000..58977230 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectApiaryOverclock.java @@ -0,0 +1,100 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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 WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectApiaryOverclock extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return apiaryRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java new file mode 100644 index 00000000..f0d3df22 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java @@ -0,0 +1,431 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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 net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; + +public class RitualEffectAutoAlchemy extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()*6) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int flag = 0; + + TileEntity topEntity = world.getTileEntity(x, y+1, z); + if(!(topEntity instanceof TEAltar)) + { + return; + } + + TEAltar tileAltar = (TEAltar)topEntity; + ItemStack targetStack = tileAltar.getStackInSlot(0); + if(targetStack == null) + { + return; + } + + ItemStack[] recipe = AlchemyRecipeRegistry.getRecipeForItemStack(targetStack); + if(recipe!=null) + { + TEWritingTable alchemyEntity; + IInventory outputInv = null; + IInventory inputInv1 = null; + IInventory inputInv2 = null; + + TileEntity northEntity = world.getTileEntity(x,y,z-1); + TileEntity southEntity = world.getTileEntity(x,y,z+1); + TileEntity eastEntity = world.getTileEntity(x+1,y,z); + TileEntity westEntity = world.getTileEntity(x-1,y,z); + + if(northEntity instanceof TEWritingTable) + { + alchemyEntity = (TEWritingTable)northEntity; + if(southEntity instanceof IInventory && !(southEntity instanceof TEWritingTable)) + { + outputInv = (IInventory)southEntity; + } + if(eastEntity instanceof IInventory && !(eastEntity instanceof TEWritingTable)) + { + inputInv1 = (IInventory)eastEntity; + } + if(westEntity instanceof IInventory && !(westEntity instanceof TEWritingTable)) + { + inputInv2 = (IInventory)westEntity; + } + }else if(southEntity instanceof TEWritingTable) + { + alchemyEntity = (TEWritingTable)southEntity; + if(northEntity instanceof IInventory && !(northEntity instanceof TEWritingTable)) + { + outputInv = (IInventory)northEntity; + } + if(eastEntity instanceof IInventory && !(eastEntity instanceof TEWritingTable)) + { + inputInv1 = (IInventory)eastEntity; + } + if(westEntity instanceof IInventory && !(westEntity instanceof TEWritingTable)) + { + inputInv2 = (IInventory)westEntity; + } + }else if(eastEntity instanceof TEWritingTable) + { + alchemyEntity = (TEWritingTable)eastEntity; + if(westEntity instanceof IInventory && !(westEntity instanceof TEWritingTable)) + { + outputInv = (IInventory)westEntity; + } + if(northEntity instanceof IInventory && !(northEntity instanceof TEWritingTable)) + { + inputInv1 = (IInventory)northEntity; + } + if(southEntity instanceof IInventory && !(southEntity instanceof TEWritingTable)) + { + inputInv2 = (IInventory)southEntity; + } + }else if(westEntity instanceof TEWritingTable) + { + alchemyEntity = (TEWritingTable)westEntity; + if(eastEntity instanceof IInventory && !(eastEntity instanceof TEWritingTable)) + { + outputInv = (IInventory)eastEntity; + } + if(northEntity instanceof IInventory && !(northEntity instanceof TEWritingTable)) + { + inputInv1 = (IInventory)northEntity; + } + if(southEntity instanceof IInventory && !(southEntity instanceof TEWritingTable)) + { + inputInv2 = (IInventory)southEntity; + } + }else + { + return; + } + + if(outputInv!=null) + { + ItemStack outputStack = alchemyEntity.getStackInSlot(6); + if(outputStack!=null) + { + for(int i=0; i=alchStack.getMaxStackSize())) + { + continue; + } + + for(int j=0;j=alchStack.getMaxStackSize())) + { + continue; + } + + for(int j=0;j0) + { + world.markBlockForUpdate(x, y, z+1); + world.markBlockForUpdate(x, y, z-1); + world.markBlockForUpdate(x+1, y, z); + world.markBlockForUpdate(x-1, y, z); + data.currentEssence = currentEssence - this.getCostPerRefresh()*flag; + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 10; + } + + @Override + public List getRitualComponentList() + { + ArrayList autoAlchemyRitual = new ArrayList(); + autoAlchemyRitual.add(new RitualComponent(1,0,1, RitualComponent.DUSK)); + autoAlchemyRitual.add(new RitualComponent(1,0,-1, RitualComponent.DUSK)); + autoAlchemyRitual.add(new RitualComponent(-1,0,-1, RitualComponent.DUSK)); + autoAlchemyRitual.add(new RitualComponent(-1,0,1, RitualComponent.DUSK)); + autoAlchemyRitual.add(new RitualComponent(2,0,2, RitualComponent.WATER)); + autoAlchemyRitual.add(new RitualComponent(2,0,-2, RitualComponent.WATER)); + autoAlchemyRitual.add(new RitualComponent(-2,0,-2, RitualComponent.WATER)); + autoAlchemyRitual.add(new RitualComponent(-2,0,2, RitualComponent.WATER)); + autoAlchemyRitual.add(new RitualComponent(-3,0,-2, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(-2,0,-3, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(-3,0,2, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(-2,0,3, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(3,0,-2, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(2,0,-3, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(3,0,2, RitualComponent.FIRE)); + autoAlchemyRitual.add(new RitualComponent(2,0,3, RitualComponent.FIRE)); + return autoAlchemyRitual; + } + + public boolean areItemStacksEqualWithWildcard(ItemStack recipeStack, ItemStack comparedStack) + { + return recipeStack.isItemEqual(comparedStack) || (recipeStack.getItemDamage() == OreDictionary.WILDCARD_VALUE && recipeStack.getItem() == comparedStack.getItem()); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java new file mode 100644 index 00000000..e899cb6b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectBiomeChanger.java @@ -0,0 +1,448 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; + +public class RitualEffectBiomeChanger extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int cooldown = ritualStone.getCooldown(); + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + if (cooldown > 0) + { + ritualStone.setCooldown(cooldown - 1); + + if (world.rand.nextInt(15) == 0) + { + world.addWeatherEffect(new EntityLightningBolt(world, x - 1 + world.rand.nextInt(3), y + 1, z - 1 + world.rand.nextInt(3))); + } + + return; + } + + int currentEssence = data.currentEssence; + + + int range = 10; + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return biomeChangerRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java new file mode 100644 index 00000000..43b45471 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectContainment.java @@ -0,0 +1,127 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectContainment extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 5; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return containmentRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java new file mode 100644 index 00000000..97d09d04 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrushing.java @@ -0,0 +1,301 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +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.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.ModBlocks; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectCrushing extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + + if (world.getWorldTime() % 40 != 20) + { + return; + } + + + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + TileEntity tile = world.getTileEntity(x, y + 1, z); + IInventory tileEntity; + + if (tile instanceof IInventory) + { + tileEntity = (IInventory) tile; + } else + { + return; + } + + if (tileEntity.getSizeInventory() <= 0) + { + return; + } + + boolean isSilkTouch = this.isSilkTouch(world, x, y, z); + int fortuneLevel = this.getFortuneLevel(world, x, y, z); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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 && !world.isAirBlock(x + i, y + j, z + k)) + { + if ((block.equals(ModBlocks.ritualStone) || block.equals(ModBlocks.blockMasterStone))) + { + continue; + } + + if(isSilkTouch && block.canSilkHarvest(world, null, x + i, y + j, z + k, meta)) + { + int invSize = tileEntity.getSizeInventory(); + + ItemStack item = new ItemStack(block,1,meta); + 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, item); + copyStack.stackSize = 0; + } else + { + if (itemStack.getItem().equals(copyStack.getItem()) && itemStack.getItemDamage() == copyStack.getItemDamage()) + { + 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; + } + + } + else + { + ArrayList itemDropList = block.getDrops(world, x + i, y + j, z + k, meta, fortuneLevel); + + 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, item); + copyStack.stackSize = 0; + } else + { + if (itemStack.getItem().equals(copyStack.getItem()) && itemStack.getItemDamage() == copyStack.getItemDamage()) + { + 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; + } + } + } + } + } + } + + public boolean isSilkTouch(World world, int x, int y, int z) + { + int index = 0; + for(int i=-2; i<=2; i++) + { + for(int j=-2; j<=2; j++) + { + int index1 = Math.abs(i); + int index2 = Math.abs(j); + + if((index1 == 2 && (index2 == 2 || index2 == 1)) || (index1 == 1 && index2 == 2)) + { + Block block = world.getBlock(x + i, y + 1, z + j); + if(block == Blocks.gold_block) + { + index++; + } + } + } + } + + return index>=12; + } + + public int getFortuneLevel(World world, int x, int y, int z) + { + int index = 0; + for(int i=-2; i<=2; i++) + { + for(int j=-2; j<=2; j++) + { + int index1 = Math.abs(i); + int index2 = Math.abs(j); + + if((index1 == 2 && (index2 == 2 || index2 == 1)) || (index1 == 1 && index2 == 2)) + { + Block block = world.getBlock(x + i, y + 1, z + j); + if(block == Blocks.emerald_block || block == Blocks.diamond_block) + { + index++; + } + } + } + } + + if(index>=12) + { + return 3; + }else if(index>=8) + { + return 2; + }else if(index>=4) + { + return 1; + } + + return 0; + } + + @Override + public int getCostPerRefresh() + { + return 7; + } + + @Override + public List getRitualComponentList() + { + 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)); + return crushingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectExpulsion.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectExpulsion.java new file mode 100644 index 00000000..07bf3a9b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectExpulsion.java @@ -0,0 +1,286 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.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.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.EnderTeleportEvent; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellTeleport; + +public class RitualEffectExpulsion extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 25; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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(EntityPlayer.class, axisalignedbb); + Iterator iterator = list.iterator(); + EntityPlayer entityplayer; + boolean flag = false; + + while (iterator.hasNext()) + { + entityplayer = (EntityPlayer) iterator.next(); + + if (!(SpellHelper.getUsername(entityplayer).equals(owner))) + { + if(entityplayer.isPotionActive(AlchemicalWizardry.customPotionPlanarBinding)||entityplayer.capabilities.isCreativeMode) + { + continue; + } + + flag = teleportRandomly(entityplayer,100); + } + } + + if (flag) + { + data.currentEssence = currentEssence - this.getCostPerRefresh(); + data.markDirty(); + } + } + } + + @Override + public int getCostPerRefresh() + { + return 1000; + } + + public 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 (!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); + } + + public 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); + int l; + + if (entityLiving.worldObj.blockExists(i, j, k)) + { + boolean flag1 = false; + + while (!flag1 && j > 0) + { + Block block = entityLiving.worldObj.getBlock(i, j - 1, k); + + if (block != null && block.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 (l = 0; l < short1; ++l) + { + double d6 = (double) l / ((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 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.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); + } + } + + @Override + public List getRitualComponentList() + { + ArrayList expulsionRitual = new ArrayList(); + expulsionRitual.add(new RitualComponent(2,0,2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(2,0,1, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(1,0,2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(2,0,-2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(2,0,-1, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-1,0,2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-2,0,2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-2,0,1, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(1,0,-2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-2,0,-2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-2,0,-1, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-1,0,-2, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(4,0,2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(5,0,2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(4,0,-2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(5,0,-2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-4,0,2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-5,0,2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-4,0,-2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-5,0,-2, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(2,0,4, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(2,0,5, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-2,0,4, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-2,0,5, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(2,0,-4, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(2,0,-5, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-2,0,-4, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(-2,0,-5, RitualComponent.AIR)); + expulsionRitual.add(new RitualComponent(0,0,6, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(0,0,-6, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(6,0,0, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-6,0,0, RitualComponent.EARTH)); + expulsionRitual.add(new RitualComponent(-5,0,0, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(-6,0,1, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(-6,0,-1, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(5,0,0, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(6,0,1, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(6,0,-1, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(0,0,5, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(1,0,6, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(-1,0,6, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(0,0,-5, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(1,0,-6, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(-1,0,-6, RitualComponent.DUSK)); + expulsionRitual.add(new RitualComponent(4,0,4, RitualComponent.FIRE)); + expulsionRitual.add(new RitualComponent(4,0,-4, RitualComponent.FIRE)); + expulsionRitual.add(new RitualComponent(-4,0,4, RitualComponent.FIRE)); + expulsionRitual.add(new RitualComponent(-4,0,-4, RitualComponent.FIRE)); + return expulsionRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java new file mode 100644 index 00000000..51929c20 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredEarth.java @@ -0,0 +1,141 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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 WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectFeatheredEarth extends RitualEffect //Nullifies all fall damage in the area of effect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + 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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return featheredEarthRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java new file mode 100644 index 00000000..95a6638b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFeatheredKnife.java @@ -0,0 +1,192 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + +public class RitualEffectFeatheredKnife extends RitualEffect +{ + public final int timeDelay = 20; + public final int amount = 100; + + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + 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.getBoundingBox((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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return featheredKnifeRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java new file mode 100644 index 00000000..208d70ed --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectFlight.java @@ -0,0 +1,180 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectFlight extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + 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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + } + return flightRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java new file mode 100644 index 00000000..d0945428 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectGrowth.java @@ -0,0 +1,104 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectGrowth extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return growthRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java new file mode 100644 index 00000000..98bcca3d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectHealing.java @@ -0,0 +1,181 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectHealing extends RitualEffect +{ + public final int timeDelay = 50; + //public final int amount = 10; + + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + 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.getBoundingBox((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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return healingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java new file mode 100644 index 00000000..5c912ee0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectInterdiction.java @@ -0,0 +1,112 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectInterdiction extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 5; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return interdictionRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java new file mode 100644 index 00000000..76bb9631 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectItemSuction.java @@ -0,0 +1,166 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +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.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.ModBlocks; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectItemSuction extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + 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()*100) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + List itemDropList = SpellHelper.getItemsInRange(world, x+0.5f, y+0.5f, z+0.5f, 10, 10); + + int count = 0; + + if (itemDropList != null) + { + int invSize = tileEntity.getSizeInventory(); + + for (EntityItem itemEntity : itemDropList) + { + ItemStack item = itemEntity.getEntityItem(); + ItemStack copyStack = itemEntity.getEntityItem().copy(); + + count++; + + 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, item); + copyStack.stackSize = 0; + } else + { + if (itemStack.getItem().equals(copyStack.getItem()) && itemStack.getItemDamage() == copyStack.getItemDamage()) + { + 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) + { + itemEntity.setDead(); + } + + if (copyStack.stackSize > 0) + { + itemEntity.getEntityItem().stackSize = copyStack.stackSize; + } + } + } + + if(count>0) + { + data.currentEssence = currentEssence - this.getCostPerRefresh()*Math.min(count, 100); + data.markDirty(); + return; + } + } + } + + @Override + public int getCostPerRefresh() + { + return 5; + } + + @Override + public List getRitualComponentList() + { + ArrayList suctionRitual = new ArrayList(); + suctionRitual.add(new RitualComponent(2, 0, 0, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(-2, 0, 0, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(0, 0, 2, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(0, 0, -2, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(1, 1, 1, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(1, 1, -1, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(-1, 1, 1, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(-1, 1, -1, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(1, -1, 0, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(-1, -1, 0, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(0, -1, 1, RitualComponent.AIR)); + suctionRitual.add(new RitualComponent(0, -1, -1, RitualComponent.AIR)); + return suctionRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java new file mode 100644 index 00000000..381e42c3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectJumping.java @@ -0,0 +1,114 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectJumping extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 0; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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; + } + + @Override + public List getRitualComponentList() + { + 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)); + } + return jumpingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java new file mode 100644 index 00000000..d23bb029 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLava.java @@ -0,0 +1,86 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.block.BlockSpectralContainer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectLava extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + Block block = world.getBlock(x, y + 1, z); + + if (world.isAirBlock(x, y + 1, z) && !(block instanceof BlockSpectralContainer)) + { + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return lavaRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java new file mode 100644 index 00000000..54685c0a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLeap.java @@ -0,0 +1,158 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectLeap extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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.getBoundingBox((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; + } + + @Override + public List getRitualComponentList() + { + 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)); + } + return leapingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java new file mode 100644 index 00000000..4589086c --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectMagnetic.java @@ -0,0 +1,179 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +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; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectMagnetic extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (world.getWorldTime() % 40 != 0) + { + return; + } + + Block powerBlock = world.getBlock(x, y-1, z); + int radius = this.getRadiusForModifierBlock(powerBlock); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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 = -radius; i <= radius; i++) + { + for (int k = -radius; k <= radius; 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; + } + + @Override + public List getRitualComponentList() + { + ArrayList magneticRitual = new ArrayList(); + magneticRitual.add(new RitualComponent(1, 0, 1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(1, 0, -1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-1, 0, 1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-1, 0, -1, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(2, 1, 0, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(0, 1, 2, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(-2, 1, 0, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(0, 1, -2, RitualComponent.EARTH)); + magneticRitual.add(new RitualComponent(2, 1, 2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(2, 1, -2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(-2, 1, 2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(-2, 1, -2, RitualComponent.AIR)); + magneticRitual.add(new RitualComponent(2, 2, 0, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(0, 2, 2, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(-2, 2, 0, RitualComponent.FIRE)); + magneticRitual.add(new RitualComponent(0, 2, -2, RitualComponent.FIRE)); + return magneticRitual; + } + + public int getRadiusForModifierBlock(Block block) + { + if(block == null) + { + return 3; + } + + if(block == Blocks.diamond_block) + { + return 31; + } + + if(block == Blocks.gold_block) + { + return 15; + } + + if(block == Blocks.iron_block) + { + return 7; + } + + return 3; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java new file mode 100644 index 00000000..99c60d07 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java @@ -0,0 +1,199 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.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.api.bindingRegistry.BindingRegistry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectSoulBound extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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.getBoundingBox((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(BindingRegistry.isRequiredItemValid(itemStack)) + { + ritualStone.setVar1(BindingRegistry.getIndexForItem(itemStack)+1); + world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); + ritualStone.setCooldown(ritualStone.getCooldown() - 1); + item.setDead(); + 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(); + } 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 = BindingRegistry.getOutputForIndex(ritualStone.getVar1()-1); + + if (spawnedItem != null) + { + EntityItem newItem = new EntityItem(world, x + 0.5, y + 1, z + 0.5, spawnedItem.copy()); + world.spawnEntityInWorld(newItem); + } + + ritualStone.setActive(false); + } + } + } + } + + @Override + public int getCostPerRefresh() + { + return 0; + } + + @Override + public int getInitialCooldown() + { + return 200; + } + + @Override + public List getRitualComponentList() + { + 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)); + return boundSoulRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java new file mode 100644 index 00000000..2ec9a0f6 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonMeteor.java @@ -0,0 +1,204 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +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 WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.entity.projectile.EntityMeteor; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorRegistry; + +public class RitualEffectSummonMeteor extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (ritualStone.getCooldown() > 0) + { + ritualStone.setCooldown(0); + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return meteorRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java new file mode 100644 index 00000000..556f3295 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSummonPlayer.java @@ -0,0 +1,112 @@ +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.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectSummonPlayer extends RitualEffect //Summons a player via the bound item +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (ritualStone.getCooldown() > 0) + { + ritualStone.setCooldown(0); + } + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSupression.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSupression.java new file mode 100644 index 00000000..704b189b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSupression.java @@ -0,0 +1,180 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralContainer; + +public class RitualEffectSupression extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + Block blockish = world.getBlock(x, y-1, z); + int costMod = this.getCostModifier(blockish); + int radius = this.getRadiusForModifierBlock(blockish); + int masterRadius = radius; + + int yIndex = (int)(world.getWorldTime() % (2*radius + 1))-radius; + boolean expansion = false; + + if(ritualStone.getVar1()<(radius+1)) + { + expansion = true; + radius = ritualStone.getVar1(); + ritualStone.setVar1(ritualStone.getVar1() + 1); + } + + if (currentEssence < this.getCostPerRefresh()*costMod) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + for (int i = -radius; i <= radius; i++) + { + for (int j = (expansion ? -radius : yIndex); j <= (expansion ? radius : yIndex); j++) + { + for(int k = -radius; k <= radius; k++) + { + if (i * i + j * j + k * k >= (radius + 0.50f) * (radius + 0.50f)) + { + continue; + } + + Block block = world.getBlock(x+i, y+j, z+k); + + + if(SpellHelper.isBlockFluid(block)) + { + TESpectralContainer.createSpectralBlockAtLocation(world, x+i, y+j, z+k, 3*masterRadius); + } + else + { + TileEntity tile = world.getTileEntity(x+i, y+j, z+k); + if(tile instanceof TESpectralContainer) + { + ((TESpectralContainer) tile).resetDuration(3*masterRadius); + } + } + } + } + } + + + data.currentEssence = currentEssence - this.getCostPerRefresh()*costMod; + data.markDirty(); + + } + } + + @Override + public int getCostPerRefresh() + { + return 2; + } + + @Override + public List getRitualComponentList() + { + ArrayList supressionRitual = new ArrayList(); + supressionRitual.add(new RitualComponent(2,0,2, RitualComponent.WATER)); + supressionRitual.add(new RitualComponent(2,0,-2, RitualComponent.WATER)); + supressionRitual.add(new RitualComponent(-2,0,2, RitualComponent.WATER)); + supressionRitual.add(new RitualComponent(-2,0,-2, RitualComponent.WATER)); + supressionRitual.add(new RitualComponent(-2,0,-1, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(-1,0,-2, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(-2,0,1, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(1,0,-2, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(2,0,1, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(1,0,2, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(2,0,-1, RitualComponent.AIR)); + supressionRitual.add(new RitualComponent(-1,0,2, RitualComponent.AIR)); + return supressionRitual; + } + + public int getRadiusForModifierBlock(Block block) + { + if(block == null) + { + return 10; + } + + if(block == Blocks.diamond_block) + { + return 30; + } + + if(block == Blocks.gold_block) + { + return 20; + } + + if(block == Blocks.iron_block) + { + return 15; + } + + return 10; + } + + public int getCostModifier(Block block) + { + if(block == null) + { + return 1; + } + + if(block == Blocks.diamond_block) + { + return 20; + } + + if(block == Blocks.gold_block) + { + return 10; + } + + if(block == Blocks.iron_block) + { + return 5; + } + + return 1; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java new file mode 100644 index 00000000..e4ad5c51 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectUnbinding.java @@ -0,0 +1,206 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.items.BoundArmour; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectUnbinding extends RitualEffect +{ + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.getPlayerForUsername(owner); + + if (entityOwner == null) + { + return; + } + + entityOwner.addPotionEffect(new PotionEffect(Potion.confusion.id, 80)); + } else + { + int d0 = 0; + AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return unbindingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java new file mode 100644 index 00000000..860d5fa0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWater.java @@ -0,0 +1,83 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.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.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.block.BlockSpectralContainer; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectWater extends RitualEffect +{ + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + Block block = world.getBlock(x, y + 1, z); + + if (world.isAirBlock(x, y + 1, z) && !(block instanceof BlockSpectralContainer)) + { + if (currentEssence < this.getCostPerRefresh()) + { + EntityPlayer entityOwner = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return waterRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java new file mode 100644 index 00000000..1cf3a37e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java @@ -0,0 +1,182 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +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.util.DamageSource; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + +public class RitualEffectWellOfSuffering extends RitualEffect +{ + public final int timeDelay = 25; + public final int amount = 10; + + @Override + public void performEffect(IMasterRitualStone ritualStone) + { + String owner = ritualStone.getOwner(); + World worldSave = MinecraftServer.getServer().worldServers[0]; + LifeEssenceNetwork data = (LifeEssenceNetwork) worldSave.loadItemData(LifeEssenceNetwork.class, owner); + + if (data == null) + { + data = new LifeEssenceNetwork(owner); + worldSave.setItemData(owner, data); + } + + int currentEssence = data.currentEssence; + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + 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.getBoundingBox((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 = SpellHelper.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; + } + + @Override + public List getRitualComponentList() + { + 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)); + return wellOfSufferingRitual; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java new file mode 100644 index 00000000..767b22f3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/EntitySpellProjectile.java @@ -0,0 +1,624 @@ +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; + private boolean isSilkTouch = 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(Vec3.createVectorHelper(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 = Vec3.createVectorHelper(posX, posY, posZ); + Vec3 var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + MovingObjectPosition var4 = worldObj.func_147447_a(var17, var3, true, false, false); + var17 = Vec3.createVectorHelper(posX, posY, posZ); + var3 = Vec3.createVectorHelper(posX + motionX, posY + motionY, posZ + motionZ); + + if (var4 != null) + { + var3 = Vec3.createVectorHelper(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); + par1NBTTagCompound.setBoolean("isSilkTouch", isSilkTouch); + } + + /** + * (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"); + isSilkTouch = par1NBTTagCompound.getBoolean("isSilkTouch"); + + 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, this); + } + } + } + + 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; + } + + public boolean getIsSilkTouch() + { + return this.isSilkTouch; + } + + public void setIsSilkTouch(boolean bool) + { + this.isSilkTouch = bool; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifier.java new file mode 100644 index 00000000..39297530 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefault.java new file mode 100644 index 00000000..fd379ae1 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierDefensive.java new file mode 100644 index 00000000..f9f69dbe --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierEnvironmental.java new file mode 100644 index 00000000..ff9ef7f4 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellModifierOffensive.java new file mode 100644 index 00000000..783ab1e3 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java new file mode 100644 index 00000000..75bad220 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigm.java @@ -0,0 +1,163 @@ +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 LinkedList(); + 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(); + } + }else if(this instanceof SpellParadigmTool) + { + for(SpellEffect effect : bufferedEffectList) + { + cost+=effect.getCostForTool(); + } + } + + 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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmMelee.java new file mode 100644 index 00000000..b1cac7de --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java new file mode 100644 index 00000000..8bb44f6a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmProjectile.java @@ -0,0 +1,102 @@ +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 boolean isSilkTouch; + + 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; + this.isSilkTouch = false; + } + + @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.setIsSilkTouch(isSilkTouch); + 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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmSelf.java new file mode 100644 index 00000000..94a7186a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmTool.java new file mode 100644 index 00000000..a9390285 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/SpellParadigmTool.java @@ -0,0 +1,486 @@ +package WayofTime.alchemicalWizardry.common.spell.complex; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IDigAreaEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IItemManipulator; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.ILeftClickEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IOnBanishTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IOnBreakBlock; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IOnSummonTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IRightClickEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.ISpecialDamageEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.IToolUpdateEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.RightClickTunnel; +import WayofTime.alchemicalWizardry.common.spell.complex.enhancement.SpellEnhancement; + +public class SpellParadigmTool extends SpellParadigm +{ + private List leftClickEffectList; + private List rightClickEffectList; + private List toolUpdateEffectList; + private List toolSummonEffectList; + private List toolBanishEffectList; + private List breakBlockEffectList; + private List itemManipulatorEffectList; + private List digAreaEffectList; + private List specialDamageEffectList; + + private float maxDamage; + private HashMap harvestLevel; + private HashMap digSpeed; + private HashMap maxDamageHash; + private HashMap critChanceHash; + + private HashMap toolInfoString; + + private int fortuneLevel; + private boolean silkTouch; + + private int duration; + + public SpellParadigmTool() + { + this.leftClickEffectList = new LinkedList(); + this.rightClickEffectList = new LinkedList(); + this.toolUpdateEffectList = new LinkedList(); + this.toolSummonEffectList = new LinkedList(); + this.toolBanishEffectList = new LinkedList(); + this.breakBlockEffectList = new LinkedList(); + this.itemManipulatorEffectList = new LinkedList(); + this.digAreaEffectList = new LinkedList(); + + this.toolInfoString = new HashMap(); + this.critChanceHash = new HashMap(); + + this.maxDamage = 5; + + this.harvestLevel = new HashMap(); + this.harvestLevel.put("pickaxe", 2); + this.harvestLevel.put("shovel", -1); + this.harvestLevel.put("axe", -1); + + this.digSpeed = new HashMap(); + this.digSpeed.put("pickaxe", 6.0f); + this.digSpeed.put("shovel", 1.0f); + this.digSpeed.put("axe", 1.0f); + + this.maxDamageHash = new HashMap(); + this.maxDamageHash.put("default", 5.0f); + + this.fortuneLevel = 0; + this.silkTouch = false; + + this.duration = 2400; + + //this.addRightClickEffect(new RightClickTunnel(0,0,0)); + + //this.addItemManipulatorEffect(new ToolDefaultFire(0,0,0)); + //this.addDigAreaEffect(new DigAreaEffect(0,0,0)); + } + + @Override + public void enhanceParadigm(SpellEnhancement enh) + { + + } + + @Override + public void castSpell(World world, EntityPlayer entityPlayer, ItemStack crystal) + { + if(entityPlayer.worldObj.isRemote) + { + return; + } + + int cost = this.getTotalCost(); + + EnergyItems.syphonBatteries(crystal, entityPlayer, cost); + + ItemStack toolStack = this.prepareTool(crystal, world); + + entityPlayer.setCurrentItemOrArmor(0, toolStack); + + this.onSummonTool(toolStack, world, entityPlayer); + } + + /** + * + * @param crystalStack + * @return stack containing the new multitool + */ + public ItemStack prepareTool(ItemStack crystalStack, World world) + { + ItemStack toolStack = new ItemStack(ModItems.customTool,1); + + ItemSpellMultiTool itemTool = (ItemSpellMultiTool) ModItems.customTool; + + itemTool.setItemAttack(toolStack, this.composeMaxDamageFromHash()); + + Set> harvestLevelSet = this.harvestLevel.entrySet(); + + for(Entry testMap : harvestLevelSet) + { + String tool = testMap.getKey(); + int level = testMap.getValue(); + + itemTool.setHarvestLevel(toolStack, tool, level); + } + + Set> digSpeedSet = this.digSpeed.entrySet(); + + for(Entry testMap : digSpeedSet) + { + String tool = testMap.getKey(); + float speed = testMap.getValue(); + + itemTool.setDigSpeed(toolStack, tool, speed); + } + + itemTool.setFortuneLevel(toolStack, getFortuneLevel()); + itemTool.setSilkTouch(toolStack, this.getSilkTouch()); + + if(this.getSilkTouch()) + { + this.addToolString("SilkTouch", "Silk Touch" + " " + SpellHelper.getNumeralForInt(1)); + } + + if(this.getFortuneLevel() > 0) + { + this.addToolString("Fortune", "Fortune" + " " + SpellHelper.getNumeralForInt(this.getFortuneLevel())); + } + + itemTool.setCritChance(toolStack, this.getCritChance()/100f); + + List toolStringList = new LinkedList(); + + for(String str : this.toolInfoString.values()) + { + toolStringList.add(str); + } + + itemTool.setToolListString(toolStack, toolStringList); + + itemTool.setDuration(toolStack, world, this.duration); + itemTool.loadParadigmIntoStack(toolStack, this.bufferedEffectList); + + EnergyItems.checkAndSetItemOwner(toolStack, EnergyItems.getOwnerName(crystalStack)); + + itemTool.setContainedCrystal(toolStack, crystalStack); + + return toolStack; + } + + @Override + public int getDefaultCost() + { + return 100; + } + + public static SpellParadigmTool getParadigmForEffectArray(List effectList) + { + SpellParadigmTool parad = new SpellParadigmTool(); + + for(SpellEffect eff : effectList) + { + parad.addBufferedEffect(eff); + } + + parad.applyAllSpellEffects(); + + return parad; + } + + public void addLeftClickEffect(ILeftClickEffect eff) + { + if(eff != null) + { + this.leftClickEffectList.add(eff); + } + } + + public void addRightClickEffect(IRightClickEffect eff) + { + if(eff != null) + { + this.rightClickEffectList.add(eff); + } + } + + public void addUpdateEffect(IToolUpdateEffect eff) + { + if(eff != null) + { + this.toolUpdateEffectList.add(eff); + } + } + + public void addToolSummonEffect(IOnSummonTool eff) + { + if(eff != null) + { + this.toolSummonEffectList.add(eff); + } + } + + public void addToolBanishEffect(IOnBanishTool eff) + { + if(eff != null) + { + this.toolBanishEffectList.add(eff); + } + } + + public void addBlockBreakEffect(IOnBreakBlock eff) + { + if(eff != null) + { + this.breakBlockEffectList.add(eff); + } + } + + public void addItemManipulatorEffect(IItemManipulator eff) + { + if(eff != null) + { + this.itemManipulatorEffectList.add(eff); + } + } + + public void addDigAreaEffect(IDigAreaEffect eff) + { + if(eff != null) + { + this.digAreaEffectList.add(eff); + } + } + + public void addSpecialDamageEffect(ISpecialDamageEffect eff) + { + if(eff != null) + { + this.specialDamageEffectList.add(eff); + } + } + + public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) + { + int total = 0; + for(ILeftClickEffect effect : this.leftClickEffectList) + { + total += effect.onLeftClickEntity(stack, attacked, weilder); + } + + return total; + } + + public int onRightClickBlock(ItemStack toolStack, EntityLivingBase weilder, World world, MovingObjectPosition mop) + { + int total = 0; + for(IRightClickEffect effect : this.rightClickEffectList) + { + total += effect.onRightClickBlock(toolStack, weilder, world, mop); + } + + return total; + } + + public int onRightClickAir(ItemStack toolStack, World world, EntityPlayer player) + { + int total = 0; + for(IRightClickEffect effect : this.rightClickEffectList) + { + total += effect.onRightClickAir(toolStack, player); + } + + return total; + } + + public int onUpdate(ItemStack toolStack, World world, Entity par3Entity, int invSlot, boolean inHand) + { + int total = 0; + for(IToolUpdateEffect effect : this.toolUpdateEffectList) + { + total += effect.onUpdate(toolStack, world, par3Entity, invSlot, inHand); + } + + return total; + } + + public int onSummonTool(ItemStack toolStack, World world, Entity entity) + { + int total = 0; + for(IOnSummonTool effect : this.toolSummonEffectList) + { + total += effect.onSummonTool(toolStack, world, entity); + } + + return total; + } + + public int onBanishTool(ItemStack toolStack, World world, Entity entity, int invSlot, boolean inHand) + { + int total = 0; + for(IOnBanishTool effect : this.toolBanishEffectList) + { + total += effect.onBanishTool(toolStack, world, entity, invSlot, inHand); + } + + return total; + } + + public int onBreakBlock(ItemStack container, World world, EntityPlayer player, Block block, int meta, int x, int y, int z, ForgeDirection sideBroken) + { + int total = 0; + for(IOnBreakBlock effect : this.breakBlockEffectList) + { + total += effect.onBlockBroken(container, world, player, block, meta, x, y, z, sideBroken); + } + + return total; + } + + public List handleItemList(ItemStack toolStack, List items) + { + List heldList = items; + + for(IItemManipulator eff : this.itemManipulatorEffectList) + { + List newHeldList = eff.handleItemsOnBlockBroken(toolStack, heldList); + heldList = newHeldList; + } + + return heldList; + } + + public int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool) + { + int cost = 0; + + for(IDigAreaEffect effect : this.digAreaEffectList) + { + cost += effect.digSurroundingArea(container, world, player, blockPos, usedToolClass, blockHardness, harvestLvl, itemTool); + } + + return cost; + } + + public int getFortuneLevel() + { + return this.fortuneLevel; + } + + public void setFortuneLevel(int fortuneLevel) + { + this.fortuneLevel = fortuneLevel; + } + + public boolean getSilkTouch() + { + return this.silkTouch; + } + + public void setSilkTouch(boolean silkTouch) + { + this.silkTouch = silkTouch; + } + + public int getDuration() + { + return this.duration; + } + + public void setDuration(int duration) + { + this.duration = duration; + } + + public void setDigSpeed(String toolClass, float digSpeed) + { + this.digSpeed.put(toolClass, digSpeed); + } + + public void setHarvestLevel(String toolClass, int hlvl) + { + this.harvestLevel.put(toolClass, hlvl); + } + + public float composeMaxDamageFromHash() + { + float damage = 0.0f; + + for(float f : this.maxDamageHash.values()) + { + damage += f; + } + + return damage; + } + + public void addDamageToHash(String key, float dmg) + { + this.maxDamageHash.put(key, dmg); + } + + public void addToolString(String key, String str) + { + if(str != null && key != null) + { + this.toolInfoString.put(key, str); + } + } + + public void addCritChance(String key, float chance) + { + //Chance is in percentage chance i.e. chance = 1.0 means 1.0% + this.critChanceHash.put(key, chance); + } + + public float getCritChance() + { + float chance = 0.0f; + + for(float fl : this.critChanceHash.values()) + { + chance += fl; + } + + return chance; + } + + public float getAddedDamageForEntity(Entity entity) + { + HashMap hash = new HashMap(); + + for(ISpecialDamageEffect effect : this.specialDamageEffectList) + { + hash.put(effect.getKey(), effect.getDamageForEntity(entity)); + } + + float addedDmg = 0.0f; + + for(float fl : hash.values()) + { + addedDmg += fl; + } + + return addedDmg; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java new file mode 100644 index 00000000..d241917e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffect.java @@ -0,0 +1,259 @@ +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.SpellParadigmTool; +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); + } + if(parad instanceof SpellParadigmTool) + { + this.modifyToolParadigm((SpellParadigmTool)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 void modifyToolParadigm(SpellParadigmTool parad) + { + switch(modifierState) + { + case SpellModifier.DEFAULT: this.defaultModificationTool(parad); break; + case SpellModifier.OFFENSIVE: this.offensiveModificationTool(parad); break; + case SpellModifier.DEFENSIVE: this.defensiveModificationTool(parad); break; + case SpellModifier.ENVIRONMENTAL: this.environmentalModificationTool(parad); break; + } + } + + public abstract void defaultModificationTool(SpellParadigmTool parad); + public abstract void offensiveModificationTool(SpellParadigmTool parad); + public abstract void defensiveModificationTool(SpellParadigmTool parad); + public abstract void environmentalModificationTool(SpellParadigmTool 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 getCostForTool() + { + switch(this.modifierState) + { + case SpellModifier.DEFAULT: return this.getCostForDefaultTool(); + case SpellModifier.OFFENSIVE: return this.getCostForOffenseTool(); + case SpellModifier.DEFENSIVE: return this.getCostForDefenseTool(); + case SpellModifier.ENVIRONMENTAL: return this.getCostForEnvironmentTool(); + } + return 0; + } + + protected abstract int getCostForDefaultTool(); + protected abstract int getCostForOffenseTool(); + protected abstract int getCostForDefenseTool(); + protected abstract int getCostForEnvironmentTool(); + + 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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java new file mode 100644 index 00000000..96e284b2 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectEarth.java @@ -0,0 +1,284 @@ +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.SpellParadigmTool; +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ToolEnvironmentalEarth; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth.ToolOffensiveEarth; + +public class SpellEffectEarth extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileOffensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + 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) + { + parad.addSelfSpellEffect(new SelfDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfOffensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefensiveEarth(this.powerEnhancement,this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfEnvironmentalEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeDefaultEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeOffensiveEarth(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeDefensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeEnvironmentalEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + protected int getCostForDefaultProjectile() + { + return (int)(10*Math.pow((0.5*(this.powerEnhancement)+1)*2 + 1,3)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseProjectile() + { + + return (int)(10*(1.5*this.potencyEnhancement+1)*(Math.pow(1*this.powerEnhancement+1,2))*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseProjectile() + { + return (int)(3*Math.pow((this.powerEnhancement*2+1),2)*(this.potencyEnhancement*2+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentProjectile() + { + return (int)(10*2*(0.1d*(this.potencyEnhancement+1))*Math.pow(3.47,this.potencyEnhancement)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultSelf() + { + return (int)(20*Math.pow(1.5*powerEnhancement+1,2)*(2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + return (int)(10*Math.pow(2*this.powerEnhancement+1,2)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseSelf() + { + return (int)(750*(1.1*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentSelf() + { + return (int)(250*(1.2*this.potencyEnhancement+1)*(3*this.powerEnhancement+2.5)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultMelee() + { + return (int)(50*Math.pow(1.5*this.potencyEnhancement + 1,3)*(0.5*this.powerEnhancement + 1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseMelee() + { + return (int)(20*Math.pow(1.5*this.powerEnhancement+1,3)*(0.25*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseMelee() + { + 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.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentMelee() + { + return (int)(500*Math.pow(2*this.potencyEnhancement+1, 3)*(0.25*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + public void defaultModificationTool(SpellParadigmTool parad) + { + String toolClass = "pickaxe"; + + + float digSpeed = 7.0f; + + + switch(this.powerEnhancement) + { + case 1: + digSpeed = 9.0f; + break; + case 2: + digSpeed = 12.0f; + break; + case 3: + digSpeed = 16.0f; + break; + case 4: + digSpeed = 21.0f; + break; + case 5: + digSpeed = 27.0f; + break; + } + + + parad.setDigSpeed(toolClass, digSpeed); + + + int hlvl = this.potencyEnhancement + 2; + parad.setHarvestLevel(toolClass, hlvl); + } + + + @Override + public void offensiveModificationTool(SpellParadigmTool parad) + { + parad.addItemManipulatorEffect(new ToolOffensiveEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void defensiveModificationTool(SpellParadigmTool parad) + { + String toolClass = "shovel"; + + + float digSpeed = 7.0f; + + + switch(this.powerEnhancement) + { + case 1: + digSpeed = 9.0f; + break; + case 2: + digSpeed = 12.0f; + break; + case 3: + digSpeed = 16.0f; + break; + case 4: + digSpeed = 21.0f; + break; + case 5: + digSpeed = 27.0f; + break; + } + + + parad.setDigSpeed(toolClass, digSpeed); + + + int hlvl = this.potencyEnhancement + 2; + parad.setHarvestLevel(toolClass, hlvl); + } + + + @Override + public void environmentalModificationTool(SpellParadigmTool parad) + { + parad.addDigAreaEffect(new ToolEnvironmentalEarth(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + + @Override + protected int getCostForDefaultTool() + { + return (int)(1000 * (1 + this.potencyEnhancement*0.1f) * (1 + this.powerEnhancement*0.2f) * Math.pow(0.85, costEnhancement)); + } + + + @Override + protected int getCostForOffenseTool() + { + // TODO Auto-generated method stub + return 0; + } + + + @Override + protected int getCostForDefenseTool() + { + return (int)(1000 * (1 + this.potencyEnhancement*0.1f) * (1 + this.powerEnhancement*0.2f) * Math.pow(0.85, costEnhancement)); + } + + + @Override + protected int getCostForEnvironmentTool() + { + return (int)(10 * (1+this.potencyEnhancement*0.8) * Math.pow(1.5*this.powerEnhancement + 3, 2) * Math.pow(0.85, this.costEnhancement)); + } + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java new file mode 100644 index 00000000..48595b37 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectFire.java @@ -0,0 +1,218 @@ +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.SpellParadigmTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.MeleeDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.MeleeDefensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.MeleeEnvironmentalFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.MeleeOffensiveFire; +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.SelfOffensiveFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ToolDefaultFire; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire.ToolOffensiveFire; + +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) + { + parad.addImpactEffect(new ProjectileOffensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileDefensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + parad.addUpdateEffect(new ProjectileEnvironmentalFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @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) + { + parad.addEntityEffect(new MeleeDefaultFire(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeOffensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeDefensiveFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeEnvironmentalFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + protected int getCostForDefaultProjectile() + { + return (int)((5*Math.pow(1.5*this.powerEnhancement+1, 2)*(1.5*this.potencyEnhancement+1)+this.potencyEnhancement*15)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseProjectile() + { + return (int)(10*Math.pow((this.powerEnhancement)*1.3+1,2)*((1.5*this.potencyEnhancement+1))*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseProjectile() + { + return (int)(25*Math.pow(1*this.powerEnhancement+1,2)*(1*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentProjectile() + { + return (int)(75*(0.5*this.powerEnhancement+1)*(0.5*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultSelf() + { + return 10*(int)(10*Math.pow(1.5, this.powerEnhancement+1.5*this.potencyEnhancement)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + return (int)(300*(3*powerEnhancement+1)*(2*potencyEnhancement + 1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseSelf() + { + return (int)(25*(3*this.potencyEnhancement+1)*(2*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentSelf() + { + return (int)((15*Math.pow(1.7, powerEnhancement)+10*Math.pow(potencyEnhancement,1.8))*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultMelee() + { + return (int)(25*(1.2*this.potencyEnhancement+1)*(2.5*this.powerEnhancement+2)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseMelee() + { + return (int)(500*(1+this.potencyEnhancement)*(this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseMelee() + { + return (int)(30*(1.5*potencyEnhancement+1)*(3*powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentMelee() + { + return (int)(25*Math.pow(1.5*this.powerEnhancement+1,3)*(0.25*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + public void defaultModificationTool(SpellParadigmTool parad) + { + parad.addItemManipulatorEffect(new ToolDefaultFire(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationTool(SpellParadigmTool parad) + { + parad.addLeftClickEffect(new ToolOffensiveFire(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + + parad.addToolString("offFire", "Fire Aspect" + " " + SpellHelper.getNumeralForInt(this.powerEnhancement + 1)); + } + + @Override + public void defensiveModificationTool(SpellParadigmTool parad) { + // TODO Auto-generated method stub + + } + + @Override + public void environmentalModificationTool(SpellParadigmTool parad) { + // TODO Auto-generated method stub + + } + + @Override + protected int getCostForDefaultTool() + { + return 1000; + } + + @Override + protected int getCostForOffenseTool() + { + return (int)(0); //TODO + } + + @Override + protected int getCostForDefenseTool() { + // TODO Auto-generated method stub + return 0; + } + + @Override + protected int getCostForEnvironmentTool() { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java new file mode 100644 index 00000000..ee85fb46 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectIce.java @@ -0,0 +1,241 @@ +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.SpellParadigmTool; +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ToolDefaultIce; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice.ToolDefensiveIce; + +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)); + } + + @Override + public void defaultModificationTool(SpellParadigmTool parad) + { + parad.addLeftClickEffect(new ToolDefaultIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + + + parad.addToolString("FrostTouch", "FrostTouch" + " " + SpellHelper.getNumeralForInt((this.powerEnhancement+1))); + + + parad.addCritChance("FrostCrit", this.potencyEnhancement * 0.5f); + } + + + @Override + public void offensiveModificationTool(SpellParadigmTool parad) + { + parad.addDamageToHash("Sharpness", (this.powerEnhancement+1)*1.5f); + + + parad.addToolString("Sharpness", "Sharpness" + " " + SpellHelper.getNumeralForInt((this.powerEnhancement+1))); + + + parad.addCritChance("SharpCrit", this.potencyEnhancement); + } + + + @Override + public void defensiveModificationTool(SpellParadigmTool parad) + { + parad.addToolSummonEffect(new ToolDefensiveIce(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + + @Override + public void environmentalModificationTool(SpellParadigmTool parad) + { + parad.addToolString("SilkTouch", "Silk Touch" + " " + SpellHelper.getNumeralForInt((this.powerEnhancement+1))); + + + parad.setSilkTouch(true); + } + + + @Override + protected int getCostForDefaultTool() + { + return (int)(500 * (1 + this.powerEnhancement*0.3f) * (1 + this.potencyEnhancement*0.1f) * Math.pow(0.85, costEnhancement)); + } + + + @Override + protected int getCostForOffenseTool() + { + return (int)(1000 * (1 + this.powerEnhancement*0.3f) * (1 + this.potencyEnhancement*0.2f) * Math.pow(0.85, costEnhancement)); + } + + + @Override + protected int getCostForDefenseTool() + { + return (int)(500 * (1 + this.powerEnhancement*0.2) * (1 + this.potencyEnhancement*0.5) * Math.pow(0.85, costEnhancement)); + } + + + @Override + protected int getCostForEnvironmentTool() + { + return (int)(1000 * Math.pow(0.85, costEnhancement)); + } + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java new file mode 100644 index 00000000..7bf6ec80 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellEffectWind.java @@ -0,0 +1,242 @@ +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.SpellParadigmTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.MeleeDefaultWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.MeleeDefensiveWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.MeleeEnvironmentalWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.MeleeOffensiveWind; +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; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.SelfDefaultWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.SelfDefensiveWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.SelfEnvironmentalWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.SelfOffensiveWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ToolDefensiveWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ToolEnvironmentalWind; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind.ToolOffensiveWind; + +public class SpellEffectWind extends SpellEffect +{ + @Override + public void defaultModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileDefaultWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.addImpactEffect(new ProjectileOffensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationProjectile(SpellParadigmProjectile parad) + { + parad.isSilkTouch = true; + } + + @Override + public void environmentalModificationProjectile(SpellParadigmProjectile parad) + { + parad.addUpdateEffect(new ProjectileEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defaultModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefaultWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfOffensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfDefensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationSelf(SpellParadigmSelf parad) + { + parad.addSelfSpellEffect(new SelfEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defaultModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeDefaultWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void offensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeOffensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void defensiveModificationMelee(SpellParadigmMelee parad) + { + parad.addEntityEffect(new MeleeDefensiveWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + public void environmentalModificationMelee(SpellParadigmMelee parad) + { + parad.addWorldEffect(new MeleeEnvironmentalWind(this.powerEnhancement,this.potencyEnhancement,this.costEnhancement)); + } + + @Override + protected int getCostForDefaultProjectile() + { + return (int)(100*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseProjectile() + { + return (int)(100*(0.5*this.potencyEnhancement+1)*(this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseProjectile() + { + return (int)(100*(this.potencyEnhancement+1)); + } + + @Override + protected int getCostForEnvironmentProjectile() + { + return (int)(50*(this.powerEnhancement+1)*(this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultSelf() + { + return (int)(100*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseSelf() + { + return (int)(100*(0.5*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseSelf() + { + return (int)(500*(0.7d*this.powerEnhancement+1)*(0.8*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentSelf() + { + return (int)(500*(0.7d*this.powerEnhancement+1)*(0.2*this.potencyEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefaultMelee() + { + return (int)(350*(1.0*this.potencyEnhancement+1)*(1.2*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseMelee() + { + return (int)(250*(1.0*this.potencyEnhancement+1)*(0.7*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForDefenseMelee() + { + return (int)(150*(1.0*this.potencyEnhancement+1)*(0.7*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentMelee() + { + return (int)(100*(1.0*this.potencyEnhancement+1)*(0.7*this.powerEnhancement+1)*Math.pow(0.85, costEnhancement)); + } + + @Override + public void defaultModificationTool(SpellParadigmTool parad) + { + String toolClass = "axe"; + + float digSpeed = 7.0f; + + switch(this.powerEnhancement) + { + case 1: + digSpeed = 9.0f; + break; + case 2: + digSpeed = 12.0f; + break; + case 3: + digSpeed = 16.0f; + break; + case 4: + digSpeed = 21.0f; + break; + case 5: + digSpeed = 27.0f; + break; + } + + parad.setDigSpeed(toolClass, digSpeed); + + int hlvl = this.potencyEnhancement + 2; + parad.setHarvestLevel(toolClass, hlvl); + } + + @Override + public void offensiveModificationTool(SpellParadigmTool parad) + { + parad.addLeftClickEffect(new ToolOffensiveWind(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + public void defensiveModificationTool(SpellParadigmTool parad) + { + parad.addLeftClickEffect(new ToolDefensiveWind(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + parad.addToolString("DefWind", "Knockback" + " " + SpellHelper.getNumeralForInt(this.powerEnhancement + 1)); + } + + @Override + public void environmentalModificationTool(SpellParadigmTool parad) + { + parad.addBlockBreakEffect(new ToolEnvironmentalWind(this.powerEnhancement, this.potencyEnhancement, this.costEnhancement)); + } + + @Override + protected int getCostForDefaultTool() + { + return (int)(1000 * (1 + this.potencyEnhancement*0.1f) * (1 + this.powerEnhancement*0.2f) * Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForOffenseTool() + { + return 0; //Cost is on the attack method + } + + @Override + protected int getCostForDefenseTool() + { + return (int)(150 * (1+this.powerEnhancement*0.4f) * (1+this.potencyEnhancement*0.3f) * Math.pow(0.85, costEnhancement)); + } + + @Override + protected int getCostForEnvironmentTool() + { + return (int)(150 * (1+this.powerEnhancement) * Math.pow(0.85, costEnhancement)); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java new file mode 100644 index 00000000..eed5897a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -0,0 +1,392 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockLiquid; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +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; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.management.ServerConfigurationManager; +import net.minecraft.util.AxisAlignedBB; +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.FakePlayer; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; + +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 getItemsInRange(World world, double posX, double posY, double posZ, double horizontalRadius, double verticalRadius) + { + return world.getEntitiesWithinAABB(EntityItem.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 SoulNetworkHandler.getUsername(player); + } + + public static EntityPlayer getPlayerForUsername(String str) + { + if(MinecraftServer.getServer() == null) + { + return null; + } + return MinecraftServer.getServer().getConfigurationManager().func_152612_a(str); + } + + 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) + { + 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); + 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; + 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); + } + break; + } + } + + 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) + { + if(player instanceof EntityPlayerMP) + { + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getVelSettingPacket(motionX, motionY, motionZ), (EntityPlayerMP) player); + } + } + + public static boolean isFakePlayer(World world, EntityPlayer player) + { + if(world.isRemote) + { + return false; + } + + if(player instanceof FakePlayer || SpellHelper.getUsername(player).contains("[CoFH]")) + { + return true; + } + + String str = player.getClass().getSimpleName(); + if(str.contains("GC")) + { + return false; + } + + if(player.getClass().equals(EntityPlayerMP.class)) + { + return false; + } + + return false; + } + + 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); + 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; + } + } + + 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); + } + } + + public static ItemStack getDustForOre(ItemStack item) + { + String oreName = OreDictionary.getOreName(OreDictionary.getOreID(item)); + + if(oreName.contains("ore")) + { + String lowercaseOre = oreName.toLowerCase(); + boolean isAllowed = false; + + for(String str : AlchemicalWizardry.allowedCrushedOresArray) + { + String testStr = str.toLowerCase(); + + if(lowercaseOre.contains(testStr)) + { + isAllowed = true; + break; + } + } + + 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 List getItemsFromBlock(World world, Block block, int x, int y, int z, int meta, boolean silkTouch, int fortune) + { + boolean canSilk = block.canSilkHarvest(world, null, x, y, z, meta); + + if(canSilk && silkTouch) + { + ArrayList items = new ArrayList(); + ItemStack item = new ItemStack(block, 1, meta); + + items.add(item); + + return items; + }else + { + return block.getDrops(world, x, y, z, meta, fortune); + } + } + + public static void spawnItemListInWorld(List items, World world, float x, float y, float z) + { + for(ItemStack stack : items) + { + EntityItem itemEntity = new EntityItem(world, x, y, z, stack); + itemEntity.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(itemEntity); + } + } + + public static MovingObjectPosition raytraceFromEntity (World world, Entity player, boolean par3, double range) + { + float f = 1.0F; + float f1 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * f; + float f2 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * f; + double d0 = player.prevPosX + (player.posX - player.prevPosX) * (double) f; + double d1 = player.prevPosY + (player.posY - player.prevPosY) * (double) f; + if (!world.isRemote && player instanceof EntityPlayer) + d1 += 1.62D; + double d2 = player.prevPosZ + (player.posZ - player.prevPosZ) * (double) f; + Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); + float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); + float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = range; + if (player instanceof EntityPlayerMP) + { + d3 = ((EntityPlayerMP) player).theItemInWorldManager.getBlockReachDistance(); + } + Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + return world.func_147447_a(vec3, vec31, par3, !par3, par3); + } + + public static String getNumeralForInt(int num) + { + switch(num) + { + case 1: return "I"; + case 2: return "II"; + case 3: return "III"; + case 4: return "IV"; + case 5: return "V"; + case 6: return "VI"; + case 7: return "VII"; + case 8: return "VIII"; + case 9: return "IX"; + case 10: return "X"; + default: return ""; + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ExtrapolatedMeleeEntityEffect.java new file mode 100644 index 00000000..7e48b5a8 --- /dev/null +++ b/1.7.10/main/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(hit=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=-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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfDefensiveEarth.java new file mode 100644 index 00000000..d0053320 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java new file mode 100644 index 00000000..d73381ee --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfEnvironmentalEarth.java @@ -0,0 +1,37 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +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 SelfEnvironmentalEarth extends SelfSpellEffect +{ + public SelfEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + float radius = this.powerUpgrades*2 + 1.5f; + int dur = this.powerUpgrades*5*20 + 60; + + List entities = SpellHelper.getEntitiesInRange(world, player.posX, player.posY, player.posZ, radius, radius); + + for(Entity entity : entities) + { + if(entity instanceof EntityLiving) + { + ((EntityLiving) entity).addPotionEffect(new PotionEffect(Potion.weakness.id,dur,this.potencyUpgrades)); + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java new file mode 100644 index 00000000..6637e9d8 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/SelfOffensiveEarth.java @@ -0,0 +1,43 @@ +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.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfOffensiveEarth extends SelfSpellEffect +{ + + public SelfOffensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + int horizRadius = this.powerUpgrades; + int vertRadius = this.potencyUpgrades + 1; + + 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=-vertRadius; j<0; j++) + { + for(int k=-horizRadius; k<=horizRadius; k++) + { + if(world.rand.nextFloat()<0.7f) + { + SpellHelper.smashBlock(world, posX+i, posY+j, posZ+k); + } + } + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java new file mode 100644 index 00000000..a6f03bc1 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolEnvironmentalEarth.java @@ -0,0 +1,86 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.DigAreaEffect; + +public class ToolEnvironmentalEarth extends DigAreaEffect +{ + public ToolEnvironmentalEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool) + { + if(!blockPos.typeOfHit.equals(MovingObjectPosition.MovingObjectType.BLOCK)) + { + return 0; + } + + int x = blockPos.blockX; + int y = blockPos.blockY; + int z = blockPos.blockZ; + ForgeDirection sidehit = ForgeDirection.getOrientation(blockPos.sideHit); + + int radius = 2; + int depth = 5; + + depth--; + + int posX = radius; + int negX = radius; + int posY = radius; + int negY = radius; + int posZ = radius; + int negZ = radius; + + switch(sidehit) + { + case UP: + posY = 0; + negY = depth; + break; + case DOWN: + negY = 0; + posY = depth; + break; + case SOUTH: + posZ = 0; + negZ = depth; + break; + case NORTH: + negZ = 0; + posZ = depth; + break; + case WEST: + negX = 0; + posX = depth; + break; + case EAST: + posX = 0; + negX = depth; + break; + + default: + } + + for(int xPos = x-negX; xPos <= x+posX; xPos++) + { + for(int yPos = y-negY; yPos <= y+posY; yPos++) + { + for(int zPos = z-negZ; zPos <= z+posZ; zPos++) + { + this.breakBlock(container, world, player, blockHardness, xPos, yPos, zPos, itemTool); + } + } + } + + return 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolOffensiveEarth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolOffensiveEarth.java new file mode 100644 index 00000000..240bef61 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/earth/ToolOffensiveEarth.java @@ -0,0 +1,58 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.earth; + + +import java.util.LinkedList; +import java.util.List; + + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.ItemManipulator; + + +public class ToolOffensiveEarth extends ItemManipulator +{ + public static Block[] mundaneList = new Block[]{Blocks.stone,Blocks.cobblestone,Blocks.sand,Blocks.gravel,Blocks.netherrack,Blocks.dirt}; + + + public ToolOffensiveEarth(int power, int potency, int cost) + { + super(power, potency, cost); + } + + + @Override + public List handleItemsOnBlockBroken(ItemStack toolStack, List itemList) + { + List newList = new LinkedList(); + + + for(ItemStack stack : itemList) + { + if(stack != null && stack.getItem() instanceof ItemBlock && !this.isMundaneBlock(((ItemBlock)stack.getItem()).field_150939_a)) + { + newList.add(stack); + } + } + + + return newList; + } + + + public boolean isMundaneBlock(Block block) + { + for(Block test : mundaneList) + { + if(test.equals(block)) + { + return true; + } + } + + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefaultFire.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefaultFire.java new file mode 100644 index 00000000..af369dea --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefaultFire.java @@ -0,0 +1,30 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeDefaultFire extends ExtrapolatedMeleeEntityEffect +{ + public MeleeDefaultFire(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3+0.3f*potency); + this.setRadius(2+0.3f*potency); + this.setMaxNumberHit(potency+1); + } + + @Override + protected boolean entityEffect(World world, Entity entity, EntityPlayer entityPlayer) + { + if(entity instanceof EntityLiving) + { + entity.setFire(3*this.powerUpgrades+3); + return true; + } + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefensiveFire.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefensiveFire.java new file mode 100644 index 00000000..3fb3d275 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/MeleeDefensiveFire.java @@ -0,0 +1,49 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; + +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 MeleeDefensiveFire extends MeleeSpellWorldEffect +{ + public MeleeDefensiveFire(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.potencyUpgrades + 1; + int length = 5*this.powerUpgrades + 3; + + int xOffset = look.offsetX; + int zOffset = look.offsetZ; + + Vec3 lookVec = SpellHelper.getEntityBlockVector(entityPlayer); + + int xStart = (int)(lookVec.xCoord)+1*xOffset; + int zStart = (int)(lookVec.zCoord)+1*zOffset; + int yStart = (int)(lookVec.yCoord)-1; + + for(int i=-width; i<=width; i++) + { + for(int j=0; j handleItemsOnBlockBroken(ItemStack toolStack, List itemList) + { + LinkedList newList = new LinkedList(); + for(ItemStack item : itemList) + { + ItemStack newItem = FurnaceRecipes.smelting().getSmeltingResult(item); + if(newItem != null) + { + newList.add(newItem); + } + else + { + newList.add(item); + } + } + + return newList; + } + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ToolOffensiveFire.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ToolOffensiveFire.java new file mode 100644 index 00000000..40a59bf0 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/fire/ToolOffensiveFire.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.fire; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.LeftClickEffect; + +public class ToolOffensiveFire extends LeftClickEffect +{ + public ToolOffensiveFire(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) + { + attacked.setFire(3 + 4*this.powerUpgrades); + + return (int)(10*(1+this.powerUpgrades)*Math.pow(0.85, this.costUpgrades)); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java new file mode 100644 index 00000000..7992509e --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefaultIce.java @@ -0,0 +1,28 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeDefaultIce extends ExtrapolatedMeleeEntityEffect { + + public MeleeDefaultIce(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3+0.3f*potency); + this.setRadius(2+0.3f*potency); + this.setMaxNumberHit(potency+1); + } + + @Override + protected boolean entityEffect(World world, Entity entity, EntityPlayer entityPlayer) + { + if(entity.hurtResistantTime>0) + { + entity.hurtResistantTime = Math.max(0, -(potencyUpgrades+1)+entity.hurtResistantTime); + } + + return true; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/MeleeDefensiveIce.java new file mode 100644 index 00000000..03471ca7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefaultIce.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefaultIce.java new file mode 100644 index 00000000..295ed906 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefaultIce.java @@ -0,0 +1,30 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ice; + + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.LeftClickEffect; + + +public class ToolDefaultIce extends LeftClickEffect +{ + public ToolDefaultIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + + @Override + public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) + { + int duration = 200; + + + attacked.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id,duration,this.powerUpgrades)); + + + return 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java new file mode 100644 index 00000000..4a4fac77 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/ice/ToolDefensiveIce.java @@ -0,0 +1,62 @@ +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.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +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.tool.SummonToolEffect; + +public class ToolDefensiveIce extends SummonToolEffect +{ + public ToolDefensiveIce(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onSummonTool(ItemStack toolStack, World world, Entity entity) + { + int horizRadius = this.powerUpgrades*2+2; + int vertRadius = this.powerUpgrades * 3 + 2; + List entityList = SpellHelper.getEntitiesInRange(world, entity.posX, entity.posY, entity.posZ, horizRadius, vertRadius); + + for(Entity ent : entityList) + { + if(ent instanceof EntityLivingBase && !ent.equals(entity)) + { + ((EntityLivingBase)ent).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id,200,this.potencyUpgrades*2)); + } + } + + Vec3 blockVec = SpellHelper.getEntityBlockVector(entity); + + int x = (int)(blockVec.xCoord); + int y = (int)(blockVec.yCoord); + int z = (int)(blockVec.zCoord); + + for(int posX = x-horizRadius; posX <= x+horizRadius; posX++) + { + for(int posY = y-vertRadius; posY <= y+vertRadius; posY++) + { + for(int posZ = z-horizRadius; posZ <= z+horizRadius; posZ++) + { + SpellHelper.freezeWaterBlock(world, posX, posY, posZ); + if(world.isSideSolid(posX, posY, posZ, ForgeDirection.UP) && world.isAirBlock(posX, posY+1, posZ)) + { + world.setBlock(posX, posY+1, posZ, Blocks.snow_layer); + } + } + } + } + + return 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaEffect.java new file mode 100644 index 00000000..c1e9511f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaEffect.java @@ -0,0 +1,138 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; +import WayofTime.alchemicalWizardry.common.spell.complex.SpellParadigmTool; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class DigAreaEffect implements IDigAreaEffect +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public DigAreaEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } + + @Override + public int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool) + { + if(!blockPos.typeOfHit.equals(MovingObjectPosition.MovingObjectType.BLOCK)) + { + return 0; + } + + int x = blockPos.blockX; + int y = blockPos.blockY; + int z = blockPos.blockZ; + ForgeDirection sidehit = ForgeDirection.getOrientation(blockPos.sideHit); + + for(int xPos = x-1; xPos <= x+1; xPos++) + { + for(int yPos = y-1; yPos <= y+1; yPos++) + { + for(int zPos = z-1; zPos <= z+1; zPos++) + { + this.breakBlock(container, world, player, blockHardness, xPos, yPos, zPos, itemTool); + } + } + } + + return 0; + } + + public void breakBlock(ItemStack container, World world, EntityPlayer player, float blockHardness, int x, int y, int z, ItemSpellMultiTool itemTool) + { + int hlvl = -1; + Block localBlock = world.getBlock(x, y, z); + int localMeta = world.getBlockMetadata(x, y, z); + String toolClass = localBlock.getHarvestTool(localMeta); + if (toolClass != null && itemTool.getHarvestLevel(container, toolClass) != -1) + hlvl = localBlock.getHarvestLevel(localMeta); + int toolLevel = itemTool.getHarvestLevel(container, toolClass); + + float localHardness = localBlock == null ? Float.MAX_VALUE : localBlock.getBlockHardness(world, x, y, z); + + if (hlvl <= toolLevel && localHardness - this.getHardnessDifference() <= blockHardness) + { + boolean cancelHarvest = false; + + if (!cancelHarvest) + { + if (localBlock != null && !(localHardness < 0)) + { + boolean isEffective = false; + + String localToolClass = itemTool.getToolClassForMaterial(localBlock.getMaterial()); + + if(localToolClass != null && itemTool.getHarvestLevel(container, toolClass) >= localBlock.getHarvestLevel(localMeta)) + { + isEffective = true; + } + + + if (localBlock.getMaterial().isToolNotRequired()) + { + isEffective = true; + } + + + if (!player.capabilities.isCreativeMode) + { + if (isEffective) + { + if (localBlock.removedByPlayer(world, player, x, y, z)) + { + localBlock.onBlockDestroyedByPlayer(world, x, y, z, localMeta); + } + //localBlock.harvestBlock(world, player, x, y, z, localMeta); + localBlock.onBlockHarvested(world, x, y, z, localMeta, player); + if (localHardness > 0f) + itemTool.onBlockDestroyed(container, world, localBlock, x, y, z, player); + + List items = SpellHelper.getItemsFromBlock(world, localBlock, x, y, z, localMeta, itemTool.getSilkTouch(container), itemTool.getFortuneLevel(container)); + + SpellParadigmTool parad = itemTool.loadParadigmFromStack(container); + items = parad.handleItemList(container, items); + + if(!world.isRemote) + { + SpellHelper.spawnItemListInWorld(items, world, x + 0.5f, y + 0.5f, z + 0.5f); + } + + world.func_147479_m(x, y, z); + } + else + { +// world.setBlockToAir(x, y, z); +// world.func_147479_m(x, y, z); + } + + + } + else + { + world.setBlockToAir(x, y, z); + world.func_147479_m(x, y, z); + } + } + } + } + } + + public float getHardnessDifference() + { + return 1.5f; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaTunnel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaTunnel.java new file mode 100644 index 00000000..323ab050 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/DigAreaTunnel.java @@ -0,0 +1,171 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; + +public class DigAreaTunnel extends DigAreaEffect +{ + Random rand = new Random(); + + public DigAreaTunnel(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool) + { + if(!blockPos.typeOfHit.equals(MovingObjectPosition.MovingObjectType.BLOCK)) + { + return 0; + } + + List vectorLine = new LinkedList(); + + double initialX = blockPos.blockX; + double initialY = blockPos.blockY; + double initialZ = blockPos.blockZ; + ForgeDirection sidehit = ForgeDirection.getOrientation(blockPos.sideHit); + ForgeDirection opposite = sidehit.getOpposite(); + + System.out.println(opposite.toString()); + + double initialLength = this.getRandomVectorLength(); + + Vec3 initialVector = Vec3.createVectorHelper(opposite.offsetX*initialLength, opposite.offsetY*initialLength, opposite.offsetZ*initialLength); + + Vec3 lastVec = Vec3.createVectorHelper(initialVector.xCoord, initialVector.yCoord, initialVector.zCoord); + vectorLine.add(initialVector); + + double currentLength = lastVec.lengthVector(); + double totalLength = this.totalLength(); + + while(currentLength < totalLength-0.01) + { + Vec3 tempVec = lastVec.addVector(0, 0, 0); + + tempVec = tempVec.normalize(); + + double varr = this.varyRate(); + + tempVec = tempVec.addVector(varr*(rand.nextFloat() - rand.nextFloat()), varr*(rand.nextFloat() - rand.nextFloat()), varr*(rand.nextFloat() - rand.nextFloat())); + + tempVec = tempVec.normalize(); + + double length = Math.min(this.getRandomVectorLength(), totalLength-currentLength); + + tempVec.xCoord = tempVec.xCoord*length; + tempVec.yCoord = tempVec.yCoord*length; + tempVec.zCoord = tempVec.zCoord*length; + + vectorLine.add(tempVec); + + lastVec = tempVec; + + currentLength += tempVec.lengthVector(); + } + + for(Vec3 testVec : vectorLine) + { + this.travelVector(testVec, world, initialX, initialY, initialZ); + + initialX += testVec.xCoord; + initialY += testVec.yCoord; + initialZ += testVec.zCoord; + } + + this.travelVector(lastVec, world, initialX, initialY, initialZ); + + return 0; + } + + public double totalLength() + { + return 100; + } + + public double getStepSize() + { + return 1; + } + + public double varyRate() + { + return 0.5; + } + + public double getRandomVectorLength() + { + return 10; + } + + public double getRandomStepLength() + { + return 0.5; + } + + public int getRandomRadius() + { + return 3; + } + + public void destroySphereOfMundane(World world, double x, double y, double z, int radius) + { + 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; + } + + int newX = (int)(i + x + 0.5); + int newY = (int)(j + y + 0.5); + int newZ = (int)(k + z + 0.5); + + this.destroyMunadeAt(world, newX, newY, newZ); + } + } + } + } + + public void destroyMunadeAt(World world, int x, int y, int z) + { + world.setBlockToAir(x, y, z); + } + + public void travelVector(Vec3 vector, World world, double x, double y, double z) + { + double vecLength = vector.lengthVector(); + System.out.println(vecLength); + Vec3 normVec = Vec3.createVectorHelper(vector.xCoord, vector.yCoord, vector.zCoord); + normVec = normVec.normalize(); + + Vec3 prevVec = Vec3.createVectorHelper(0, 0, 0); + double distanceTravelled = 0; + + while(distanceTravelled < vecLength) + { + System.out.println(distanceTravelled); + double stepLength = this.getRandomStepLength(); + + prevVec = prevVec.addVector(stepLength*normVec.xCoord, stepLength*normVec.yCoord, normVec.zCoord); + + this.destroySphereOfMundane(world, prevVec.xCoord + x, prevVec.yCoord + y, prevVec.zCoord + z, this.getRandomRadius()); + + distanceTravelled = prevVec.lengthVector(); + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IDigAreaEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IDigAreaEffect.java new file mode 100644 index 00000000..8e993b49 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IDigAreaEffect.java @@ -0,0 +1,12 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; + +public interface IDigAreaEffect +{ + public abstract int digSurroundingArea(ItemStack container, World world, EntityPlayer player, MovingObjectPosition blockPos, String usedToolClass, float blockHardness, int harvestLvl, ItemSpellMultiTool itemTool); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IItemManipulator.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IItemManipulator.java new file mode 100644 index 00000000..4df354e2 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IItemManipulator.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IItemManipulator +{ + public List handleItemsOnBlockBroken(ItemStack toolStack, List itemList); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ILeftClickEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ILeftClickEffect.java new file mode 100644 index 00000000..64ee0ce9 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ILeftClickEffect.java @@ -0,0 +1,11 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface ILeftClickEffect +{ + public abstract int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBanishTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBanishTool.java new file mode 100644 index 00000000..d734154a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBanishTool.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IOnBanishTool +{ + public abstract int onBanishTool(ItemStack toolStack, World world, Entity entity, int invSlot, boolean inHand); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBreakBlock.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBreakBlock.java new file mode 100644 index 00000000..0bb58be6 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnBreakBlock.java @@ -0,0 +1,12 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IOnBreakBlock +{ + public abstract int onBlockBroken(ItemStack container, World world, EntityPlayer player, Block block, int meta, int x, int y, int z, ForgeDirection sideBroken); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnSummonTool.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnSummonTool.java new file mode 100644 index 00000000..612e23c8 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IOnSummonTool.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IOnSummonTool +{ + public abstract int onSummonTool(ItemStack toolStack, World world, Entity entity); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IRightClickEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IRightClickEffect.java new file mode 100644 index 00000000..9bd8db88 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IRightClickEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public interface IRightClickEffect +{ + //public abstract int onRightClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder); + + public abstract int onRightClickBlock(ItemStack stack, EntityLivingBase weilder, World world, MovingObjectPosition mop); + + public abstract int onRightClickAir(ItemStack stack, EntityLivingBase weilder); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ISpecialDamageEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ISpecialDamageEffect.java new file mode 100644 index 00000000..3882fd6c --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ISpecialDamageEffect.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.Entity; + +public interface ISpecialDamageEffect +{ + public float getDamageForEntity(Entity entity); + + public String getKey(); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IToolUpdateEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IToolUpdateEffect.java new file mode 100644 index 00000000..ffb0d6cf --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/IToolUpdateEffect.java @@ -0,0 +1,10 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface IToolUpdateEffect +{ + public abstract int onUpdate(ItemStack toolStack, World world, Entity par3Entity, int invSlot, boolean inHand); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ItemManipulator.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ItemManipulator.java new file mode 100644 index 00000000..079b7e98 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/ItemManipulator.java @@ -0,0 +1,22 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public abstract class ItemManipulator implements IItemManipulator +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public ItemManipulator(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } + + @Override + public abstract List handleItemsOnBlockBroken(ItemStack toolStack,List itemList); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/LeftClickEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/LeftClickEffect.java new file mode 100644 index 00000000..63e0629a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/LeftClickEffect.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; + +public abstract class LeftClickEffect implements ILeftClickEffect +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public LeftClickEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } + + @Override + public abstract int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder); +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/OnBreakBlockEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/OnBreakBlockEffect.java new file mode 100644 index 00000000..d8521990 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/OnBreakBlockEffect.java @@ -0,0 +1,21 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class OnBreakBlockEffect implements IOnBreakBlock +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public OnBreakBlockEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickEffect.java new file mode 100644 index 00000000..e047b01a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +public abstract class RightClickEffect implements IRightClickEffect +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public RightClickEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickTunnel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickTunnel.java new file mode 100644 index 00000000..6f300afb --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/RightClickTunnel.java @@ -0,0 +1,177 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class RightClickTunnel extends RightClickEffect +{ + Random rand = new Random(); + public RightClickTunnel(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onRightClickBlock(ItemStack stack, EntityLivingBase weilder, World world, MovingObjectPosition mop) + { + if(weilder.worldObj.isRemote) + { + return 0; + } + if(!mop.typeOfHit.equals(MovingObjectPosition.MovingObjectType.BLOCK)) + { + return 0; + } + + List vectorLine = new LinkedList(); + + double initialX = mop.blockX; + double initialY = mop.blockY; + double initialZ = mop.blockZ; + ForgeDirection sidehit = ForgeDirection.getOrientation(mop.sideHit); + ForgeDirection opposite = sidehit.getOpposite(); + + double initialLength = this.getRandomVectorLength(); + + Vec3 initialVector = Vec3.createVectorHelper(opposite.offsetX*initialLength, opposite.offsetY*initialLength, opposite.offsetZ*initialLength); + + Vec3 lastVec = Vec3.createVectorHelper(initialVector.xCoord, initialVector.yCoord, initialVector.zCoord); + vectorLine.add(initialVector); + + double currentLength = lastVec.lengthVector(); + double totalLength = this.totalLength(); + + while(currentLength < totalLength-0.01) + { + Vec3 tempVec = lastVec.addVector(0, 0, 0); + + tempVec = tempVec.normalize(); + + double varr = this.varyRate(); + + tempVec = tempVec.addVector(varr*(rand.nextFloat() - rand.nextFloat()), varr*(rand.nextFloat() - rand.nextFloat()), varr*(rand.nextFloat() - rand.nextFloat())); + + tempVec = tempVec.normalize(); + + double length = Math.min(this.getRandomVectorLength(), totalLength-currentLength); + + tempVec.xCoord = tempVec.xCoord*length; + tempVec.yCoord = tempVec.yCoord*length; + tempVec.zCoord = tempVec.zCoord*length; + + vectorLine.add(tempVec); + + lastVec = tempVec; + + currentLength += tempVec.lengthVector(); + } + + for(Vec3 testVec : vectorLine) + { + this.travelVector(testVec, world, initialX, initialY, initialZ); + + initialX += testVec.xCoord; + initialY += testVec.yCoord; + initialZ += testVec.zCoord; + } + + this.travelVector(lastVec, world, initialX, initialY, initialZ); + + return 0; + } + + @Override + public int onRightClickAir(ItemStack stack, EntityLivingBase weilder) + { + //Empty Method + return 0; + } + + public double totalLength() + { + return 100; + } + + public double getStepSize() + { + return 1; + } + + public double varyRate() + { + return 0.5; + } + + public double getRandomVectorLength() + { + return 10; + } + + public double getRandomStepLength() + { + return 0.5; + } + + public int getRandomRadius() + { + return 3; + } + + public void destroySphereOfMundane(World world, double x, double y, double z, int radius) + { + 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; + } + + int newX = (int)(i + x + 0.5); + int newY = (int)(j + y + 0.5); + int newZ = (int)(k + z + 0.5); + + this.destroyMunadeAt(world, newX, newY, newZ); + } + } + } + } + + public void destroyMunadeAt(World world, int x, int y, int z) + { + world.setBlockToAir(x, y, z); + } + + public void travelVector(Vec3 vector, World world, double x, double y, double z) + { + double vecLength = vector.lengthVector(); + + Vec3 normVec = Vec3.createVectorHelper(vector.xCoord, vector.yCoord, vector.zCoord); + normVec = normVec.normalize(); + + Vec3 prevVec = Vec3.createVectorHelper(0, 0, 0); + double distanceTravelled = 0; + + while(distanceTravelled < vecLength) + { + double stepLength = this.getRandomStepLength(); + + prevVec = prevVec.addVector(stepLength*normVec.xCoord, stepLength*normVec.yCoord, normVec.zCoord); + + this.destroySphereOfMundane(world, prevVec.xCoord + x, prevVec.yCoord + y, prevVec.zCoord + z, this.getRandomRadius()); + + distanceTravelled = prevVec.lengthVector(); + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/SummonToolEffect.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/SummonToolEffect.java new file mode 100644 index 00000000..e8bb04a4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/tool/SummonToolEffect.java @@ -0,0 +1,15 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool; + +public abstract class SummonToolEffect implements IOnSummonTool +{ + protected int powerUpgrades; + protected int potencyUpgrades; + protected int costUpgrades; + + public SummonToolEffect(int power, int potency, int cost) + { + this.powerUpgrades = power; + this.potencyUpgrades = potency; + this.costUpgrades = cost; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefaultWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefaultWind.java new file mode 100644 index 00000000..31b324ef --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefaultWind.java @@ -0,0 +1,40 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeDefaultWind extends ExtrapolatedMeleeEntityEffect +{ + public MeleeDefaultWind(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(4+2.0f*potency); + this.setRadius(4+2.0f*potency); + this.setMaxNumberHit(potency+1); + } + + @Override + protected boolean entityEffect(World world, Entity entity, EntityPlayer player) + { + double wantedVel = -(0.5d+0.7d*this.powerUpgrades); + + if(entity instanceof EntityLiving) + { + double dist = Math.sqrt(entity.getDistanceToEntity(player)); + double xVel = wantedVel*(entity.posX - player.posX)/dist; + double yVel = wantedVel*(entity.posY - player.posY)/dist; + double zVel = wantedVel*(entity.posZ - player.posZ)/dist; + + entity.motionX = xVel; + entity.motionY = yVel; + entity.motionZ = zVel; + + return true; + } + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefensiveWind.java new file mode 100644 index 00000000..5f146e25 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeDefensiveWind.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeDefensiveWind extends ExtrapolatedMeleeEntityEffect +{ + public MeleeDefensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3+0.3f*potency); + this.setRadius(2+0.3f*potency); + this.setMaxNumberHit(potency+1); + } + + @Override + protected boolean entityEffect(World world, Entity entity, EntityPlayer player) + { + double wantedVel = 0.5d+0.5d*this.powerUpgrades; + + if(entity instanceof EntityLiving) + { + entity.motionY = wantedVel; + + return true; + } + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeEnvironmentalWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeEnvironmentalWind.java new file mode 100644 index 00000000..2eed2c73 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeEnvironmentalWind.java @@ -0,0 +1,36 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +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.MeleeSpellCenteredWorldEffect; + +public class MeleeEnvironmentalWind extends MeleeSpellCenteredWorldEffect +{ + public MeleeEnvironmentalWind(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(5*power + 5); + } + + @Override + public void onCenteredWorldEffect(EntityPlayer player, World world, int posX, int posY, int posZ) + { + int radius = 5*this.potencyUpgrades + 3; + + List entities = SpellHelper.getEntitiesInRange(world, posX, posY, posZ, radius, radius); + + for(Entity entity : entities) + { + if(entity instanceof EntityItem) + { + ((EntityItem)entity).delayBeforeCanPickup = 0; + entity.onCollideWithPlayer((EntityPlayer)player); + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeOffensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeOffensiveWind.java new file mode 100644 index 00000000..dd283246 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/MeleeOffensiveWind.java @@ -0,0 +1,40 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ExtrapolatedMeleeEntityEffect; + +public class MeleeOffensiveWind extends ExtrapolatedMeleeEntityEffect +{ + public MeleeOffensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + this.setRange(3+0.3f*potency); + this.setRadius(2+0.3f*potency); + this.setMaxNumberHit(potency+1); + } + + @Override + protected boolean entityEffect(World world, Entity entity, EntityPlayer player) + { + double wantedVel = 1.0d+1.0d*this.powerUpgrades; + + if(entity instanceof EntityLiving) + { + double dist = Math.sqrt(entity.getDistanceToEntity(player)); + double xVel = wantedVel*(entity.posX - player.posX)/dist; + double yVel = wantedVel*(entity.posY - player.posY+0.5f)/dist; + double zVel = wantedVel*(entity.posZ - player.posZ)/dist; + + entity.motionX = xVel; + entity.motionY = yVel; + entity.motionZ = zVel; + + return true; + } + + return false; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java new file mode 100644 index 00000000..a50dcbd3 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileDefaultWind.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileDefaultWind extends ProjectileImpactEffect +{ + public ProjectileDefaultWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop, Entity proj) + { + float wantedYVel = (float)((0.5)*(0.5*this.potencyUpgrades + 1)); + + mop.motionX = proj.motionX; + mop.motionY = mop.motionY += wantedYVel; + mop.motionZ = proj.motionZ; + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + return; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java new file mode 100644 index 00000000..e1871678 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileEnvironmentalWind.java @@ -0,0 +1,53 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +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.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 ProjectileEnvironmentalWind extends ProjectileUpdateEffect +{ + public ProjectileEnvironmentalWind(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 = 1*this.potencyUpgrades+1; + + World worldObj = projectile.worldObj; + + if(projectile instanceof EntitySpellProjectile) + { + Entity shooter = ((EntitySpellProjectile) projectile).shootingEntity; + if(shooter instanceof EntityPlayer) + { + List 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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java new file mode 100644 index 00000000..661fa367 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ProjectileOffensiveWind.java @@ -0,0 +1,33 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.ProjectileImpactEffect; + +public class ProjectileOffensiveWind extends ProjectileImpactEffect +{ + + public ProjectileOffensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onEntityImpact(Entity mop, Entity proj) + { + if(mop instanceof EntityLiving) + { + ((EntityLiving) mop).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id,(int)(100*(2*this.powerUpgrades+1)*(1/(this.potencyUpgrades+1))),this.potencyUpgrades)); + } + } + + @Override + public void onTileImpact(World world, MovingObjectPosition mop) + { + return; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefaultWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefaultWind.java new file mode 100644 index 00000000..3e13568a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefaultWind.java @@ -0,0 +1,27 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +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.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfDefaultWind extends SelfSpellEffect +{ + public SelfDefaultWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + player.extinguish(); + player.fallDistance = 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefensiveWind.java new file mode 100644 index 00000000..125ef17d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfDefensiveWind.java @@ -0,0 +1,39 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +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.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfDefensiveWind extends SelfSpellEffect +{ + public SelfDefensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + double radius = 1.5d*this.powerUpgrades+1.5d; + double posX = player.posX; + double posY = player.posY; + double posZ = player.posZ; + + List entities = SpellHelper.getEntitiesInRange(world, posX, posY, posZ, radius, radius); + + for(Entity entity: entities) + { + if((!entity.equals(player))&&entity instanceof EntityLiving) + { + ((EntityLiving)entity).addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id,200,this.potencyUpgrades)); + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfEnvironmentalWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfEnvironmentalWind.java new file mode 100644 index 00000000..3ea0f86b --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfEnvironmentalWind.java @@ -0,0 +1,45 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +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 SelfEnvironmentalWind extends SelfSpellEffect +{ + public SelfEnvironmentalWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + double radius = 1.5d*this.potencyUpgrades+1; + double posX = player.posX; + double posY = player.posY-0.7d; + double posZ = player.posZ; + double wantedVel = 0.7d+0.7d*this.powerUpgrades; + + List entities = SpellHelper.getEntitiesInRange(world, posX, posY, posZ, radius, radius); + + for(Entity entity: entities) + { + if((!entity.equals(player))&&entity instanceof EntityLiving) + { + double dist = Math.sqrt(entity.getDistanceToEntity(player)); + double xVel = wantedVel*(entity.posX - posX)/dist; + double yVel = wantedVel*(entity.posY - posY)/dist; + double zVel = wantedVel*(entity.posZ - posZ)/dist; + + entity.motionX = xVel; + entity.motionY = yVel; + entity.motionZ = zVel; + } + } + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfOffensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfOffensiveWind.java new file mode 100644 index 00000000..74dd6e13 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/SelfOffensiveWind.java @@ -0,0 +1,32 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.SelfSpellEffect; + +public class SelfOffensiveWind extends SelfSpellEffect +{ + public SelfOffensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public void onSelfUse(World world, EntityPlayer player) + { + Vec3 vec = player.getLookVec(); + double wantedVelocity = 1.5 + this.powerUpgrades*0.4; + + SpellHelper.setPlayerSpeedFromServer(player, vec.xCoord * wantedVelocity, vec.yCoord * wantedVelocity, vec.zCoord * wantedVelocity); + + player.fallDistance = 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolDefensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolDefensiveWind.java new file mode 100644 index 00000000..02dd42dc --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolDefensiveWind.java @@ -0,0 +1,32 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Vec3; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.LeftClickEffect; + +public class ToolDefensiveWind extends LeftClickEffect +{ + + public ToolDefensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) + { + Vec3 vec = weilder.getLookVec(); + vec.yCoord = 0; + vec.normalize(); + + float velocity = 0.5f*(1+this.powerUpgrades*0.8f); + float ratio = 0.1f + 0.3f*this.potencyUpgrades; + + attacked.motionX += vec.xCoord*velocity; + attacked.motionY += velocity*ratio; + attacked.motionZ += vec.zCoord*velocity; + + return 0; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolEnvironmentalWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolEnvironmentalWind.java new file mode 100644 index 00000000..082c27e2 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolEnvironmentalWind.java @@ -0,0 +1,41 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +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.tool.OnBreakBlockEffect; + +public class ToolEnvironmentalWind extends OnBreakBlockEffect +{ + public ToolEnvironmentalWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onBlockBroken(ItemStack container, World world, EntityPlayer player, Block block, int meta, int x, int y, int z, ForgeDirection sideBroken) + { + double vertRange = 0.5 + (this.powerUpgrades*this.powerUpgrades + this.powerUpgrades)/2; + double horizRange = vertRange; + + List itemList = SpellHelper.getItemsInRange(world, x + 0.5f, y + 0.5f, z + 0.5f, horizRange, vertRange); + + for(EntityItem entity : itemList) + { + if(!world.isRemote) + { + entity.delayBeforeCanPickup = 0; + entity.onCollideWithPlayer(player); + } + } + + return 0; + } + +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolOffensiveWind.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolOffensiveWind.java new file mode 100644 index 00000000..5d08d2df --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/impactEffects/wind/ToolOffensiveWind.java @@ -0,0 +1,24 @@ +package WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.wind; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.PotionEffect; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.impactEffects.tool.LeftClickEffect; + +public class ToolOffensiveWind extends LeftClickEffect +{ + public ToolOffensiveWind(int power, int potency, int cost) + { + super(power, potency, cost); + } + + @Override + public int onLeftClickEntity(ItemStack stack, EntityLivingBase attacked, EntityLivingBase weilder) + { + attacked.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id,(int)(100*(2*this.powerUpgrades+1)*(1/(this.potencyUpgrades+1))),this.potencyUpgrades)); + + return (int)(100*(0.5*this.potencyUpgrades+1)*(this.powerUpgrades+1)*Math.pow(0.85, costUpgrades)); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancement.java new file mode 100644 index 00000000..b17c5659 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementCost.java new file mode 100644 index 00000000..2e0df1fb --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPotency.java new file mode 100644 index 00000000..6231c8a7 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/complex/enhancement/SpellEnhancementPower.java new file mode 100644 index 00000000..527dfe46 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpell.java new file mode 100644 index 00000000..903f4fb9 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellComponent.java new file mode 100644 index 00000000..41cfcaab --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/HomSpellRegistry.java new file mode 100644 index 00000000..645bd99c --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/ISimpleSpell.java new file mode 100644 index 00000000..77a8799d --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellEarthBender.java new file mode 100644 index 00000000..e4a31e55 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellExplosions.java new file mode 100644 index 00000000..44ede225 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java new file mode 100644 index 00000000..2d02fdaa --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFireBurst.java @@ -0,0 +1,175 @@ +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)); + FireProjectile proj = new FireProjectile(par2World, par3EntityPlayer, 7); + par2World.spawnEntityInWorld(proj); + } + + 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.getBoundingBox((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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellFrozenWater.java new file mode 100644 index 00000000..bfa441eb --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellHolyBlast.java new file mode 100644 index 00000000..f712073f --- /dev/null +++ b/1.7.10/main/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.getBoundingBox(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.getBoundingBox((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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellLightningBolt.java new file mode 100644 index 00000000..576b9884 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellTeleport.java new file mode 100644 index 00000000..b1276d95 --- /dev/null +++ b/1.7.10/main/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.getBoundingBox((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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWateryGrave.java new file mode 100644 index 00000000..58450299 --- /dev/null +++ b/1.7.10/main/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.getBoundingBox((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.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/spell/simple/SpellWindGust.java new file mode 100644 index 00000000..0e9e831d --- /dev/null +++ b/1.7.10/main/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.getBoundingBox(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.getBoundingBox((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.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java new file mode 100644 index 00000000..bade513d --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningFallenAngel.java @@ -0,0 +1,20 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningHelper; +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.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelperAW.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelperAW.java new file mode 100644 index 00000000..8d615cf1 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/SummoningHelperAW.java @@ -0,0 +1,109 @@ +package WayofTime.alchemicalWizardry.common.summoning; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.passive.EntityPig; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningHelper; +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; + +public class SummoningHelperAW extends SummoningHelper +{ + public SummoningHelperAW(int id) + { + super(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.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigm.java new file mode 100644 index 00000000..5d3fcb7b --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorParadigmComponent.java new file mode 100644 index 00000000..0daa43a1 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/summoning/meteor/MeteorRegistry.java new file mode 100644 index 00000000..4df585c1 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java new file mode 100644 index 00000000..b5c96375 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEAltar.java @@ -0,0 +1,1084 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; +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.util.ChatComponentText; +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.api.altarRecipeRegistry.AltarRecipe; +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.AltarUpgradeComponent; +import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEAltar extends TileEntity implements IInventory, IFluidTank, IFluidHandler, IBloodAltar +{ + 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 int getCurrentBlood() + { + return getFluidAmount(); + } + + @Override + public int getTier() + { + return upgradeLevel; + } + + @Override + public int getProgress() + { + return progress; + } + + @Override + public float getSacrificeMultiplier() + { + return sacrificeEfficiencyMultiplier; + } + + @Override + public float getSelfSacrificeMultiplier() + { + return selfSacrificeEfficiencyMultiplier; + } + + @Override + public float getOrbMultiplier() + { + return orbCapacityMultiplier; + } + + @Override + public float getDislocationMultiplier() + { + return dislocationMultiplier; + } + + @Override + public int getBufferCapacity() + { + return bufferCapacity; + } + + @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)); + + //The tile is never null, so we dont need this + 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; + } + + //Never null, so not needed :P + 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; + } + + //This is never null, so its un needed :D + 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; + } + + //o,o this is always true + 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 IBloodOrb)) + { + return; + } + + IBloodOrb item = (IBloodOrb) (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) + { + return slot == 0; + } + + @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 + //I changed this, since fluidstack != fluid... :p dunno if it was a accident? so you might wanna check this + return this.fluidInput != null && this.fluid.getFluid().equals(fluidInput.getFluid()); + } + + @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; + } + + 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")); + } + + public void sendMoreChatInfoToPlayer(EntityPlayer player) + { + if(getStackInSlot(0) != null) + { + int stackSize = getStackInSlot(0).stackSize; + player.addChatMessage(new ChatComponentText("Altar's Progress: " + progress + "LP/" + liquidRequired * stackSize + "LP")); + player.addChatMessage(new ChatComponentText("Consumption rate: " + (int)(consumptionRate * (1+consumptionMultiplier)) + "LP/t")); + } + player.addChatMessage(new ChatComponentText("Altar's Current Essence: " + this.fluid.amount + "LP")); + player.addChatMessage(new ChatComponentText(" Input tank: " + this.fluidInput.amount + "LP")); + player.addChatMessage(new ChatComponentText(" Output tank: " + this.fluidOutput.amount + "LP")); + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java new file mode 100644 index 00000000..a4d475fb --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEConduit.java @@ -0,0 +1,34 @@ +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 + protected void applySpellChange(SpellParadigm parad) + { + return; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java new file mode 100644 index 00000000..457f05a5 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEDemonPortal.java @@ -0,0 +1,1153 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.ForgeDirection; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.Int3; +import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; +import WayofTime.alchemicalWizardry.common.demonVillage.BuildingSchematic; +import WayofTime.alchemicalWizardry.common.demonVillage.DemonBuilding; +import WayofTime.alchemicalWizardry.common.demonVillage.DemonCrosspath; +import WayofTime.alchemicalWizardry.common.demonVillage.DemonVillagePath; +import WayofTime.alchemicalWizardry.common.demonVillage.GridSpace; +import WayofTime.alchemicalWizardry.common.demonVillage.GridSpaceHolder; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class TEDemonPortal extends TileEntity +{ + public static List buildingList = new ArrayList(); + public Random rand = new Random(); + private GridSpace[][] area; + + private int negXRadius; //These variables indicate how much the grid has expanded from the 1x1 + private int posXRadius; //matrix in each direction + private int negZRadius; + private int posZRadius; + + private boolean isInitialized; + + public TEDemonPortal() + { + super(); + + negXRadius = posXRadius = negZRadius = posZRadius = 1; + + area = new GridSpace[negXRadius + posXRadius + 1][negZRadius + posZRadius + 1]; + for(int xIndex = -negXRadius; xIndex <= posXRadius; xIndex++) + { + for(int zIndex = -negZRadius; zIndex <= posZRadius; zIndex++) + { + if(Math.abs(xIndex) == 1 || Math.abs(zIndex) == 1) + { + this.setGridSpace(xIndex, zIndex, new GridSpace(GridSpace.ROAD,4)); + }else + { + this.setGridSpace(xIndex, zIndex, new GridSpace()); + } + } + } + + isInitialized = false; + + this.setGridSpace(0, 0, new GridSpace(GridSpace.MAIN_PORTAL, yCoord)); + } + + public void initialize() + { + if(isInitialized) + { + return; + } + + for(int xIndex = -negXRadius; xIndex <= posXRadius; xIndex++) + { + for(int zIndex = -negZRadius; zIndex <= posZRadius; zIndex++) + { + if(Math.abs(xIndex) == 1 || Math.abs(zIndex) == 1) + { + this.setGridSpace(xIndex, zIndex, new GridSpace(GridSpace.ROAD,yCoord)); + }else + { + this.setGridSpace(xIndex, zIndex, new GridSpace()); + } + } + } + + isInitialized = true; + } + + @Override + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + super.readFromNBT(par1NBTTagCompound); + this.negXRadius = par1NBTTagCompound.getInteger("negXRadius"); + this.negZRadius = par1NBTTagCompound.getInteger("negZRadius"); + this.posXRadius = par1NBTTagCompound.getInteger("posXRadius"); + this.posZRadius = par1NBTTagCompound.getInteger("posZRadius"); + + area = new GridSpace[negXRadius + posXRadius + 1][negZRadius + posZRadius + 1]; + + NBTTagList tagList = par1NBTTagCompound.getTagList("Grid",Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < tagList.tagCount(); i++) + { + int length = (negZRadius+posZRadius+1); + + int x = i/length; + int z = i%length; + + NBTTagCompound tag = (NBTTagCompound) tagList.getCompoundTagAt(i); + GridSpace space = GridSpace.getGridFromTag(tag); + + area[x][z] = space; + } + + this.isInitialized = par1NBTTagCompound.getBoolean("init"); + } + + @Override + public void writeToNBT(NBTTagCompound par1NBTTagCompound) + { + super.writeToNBT(par1NBTTagCompound); + par1NBTTagCompound.setInteger("negXRadius", negXRadius); + par1NBTTagCompound.setInteger("negZRadius", negZRadius); + par1NBTTagCompound.setInteger("posXRadius", posXRadius); + par1NBTTagCompound.setInteger("posZRadius", posZRadius); + + NBTTagList gridList = new NBTTagList(); + + for(int i=0; i<=negXRadius+posXRadius; i++) + { + for(int j=0; j<=negZRadius+posZRadius; j++) + { + int index = i + (negZRadius+posZRadius+1)*j; + + GridSpace space = area[i][j]; + NBTTagCompound nextTag; + + if(space == null) + { + nextTag = new GridSpace().getTag(); + }else + { + nextTag = space.getTag(); + } + + gridList.appendTag(nextTag); + } + } + + par1NBTTagCompound.setTag("Grid", gridList); + + par1NBTTagCompound.setBoolean("init", isInitialized); + } + + public void createRandomRoad() + { + int next = rand.nextInt(4); + ForgeDirection dir; + + switch(next) + { + case 0: + dir = ForgeDirection.NORTH; + break; + case 1: + dir = ForgeDirection.SOUTH; + break; + case 2: + dir = ForgeDirection.EAST; + break; + case 3: + dir = ForgeDirection.WEST; + break; + default: + dir = ForgeDirection.NORTH; + } + + int length = 5; + + Int3 road = findRoadSpaceFromDirection(dir, (rand.nextInt(negXRadius + negZRadius + posXRadius + posZRadius))+1); + + int x = road.xCoord; + int yLevel = road.yCoord; + int z = road.zCoord; + + System.out.println("X: " + x + " Z: " + z + " Direction: " + dir.toString()); + + List directions = this.findValidExtentionDirection(x, z); + + if(directions.size() <= 0) + { + return; + } + + int maxDistance = 5; + + int distance = 0; + ForgeDirection dominantDirection = null; + + for(ForgeDirection direction: directions) + { + int amt = this.getLength(direction, maxDistance, x, z); + if(amt > distance) + { + distance = amt; + dominantDirection = direction; + }else if(amt == distance && rand.nextBoolean()) + { + dominantDirection = direction; + } + } + + if(dominantDirection == null) + { + return; + } + System.out.println("I got here!"); + System.out.println("Distance: " + distance + " Direction: " + dominantDirection.toString() + " yLevel: " + yLevel); + + this.createGriddedRoad(x, yLevel, z, dominantDirection, distance+1, true); + } + + public List findValidExtentionDirection(int x, int z) + { + List directions = new LinkedList(); + + if(this.getGridSpace(x, z) == null || !this.getGridSpace(x, z).isRoadSegment()) + { + return directions; + } + + GridSpace nextGrid = this.getGridSpace(x+1, z); + if(nextGrid.isEmpty()) + { + directions.add(ForgeDirection.EAST); + } + + nextGrid = this.getGridSpace(x-1, z); + if(nextGrid.isEmpty()) + { + directions.add(ForgeDirection.WEST); + } + + nextGrid = this.getGridSpace(x, z+1); + if(nextGrid.isEmpty()) + { + directions.add(ForgeDirection.SOUTH); + } + + nextGrid = this.getGridSpace(x, z-1); + if(nextGrid.isEmpty()) + { + directions.add(ForgeDirection.NORTH); + } + + return directions; + } + + public int getLength(ForgeDirection dir, int maxLength, int x, int z) //Number of spaces forward + { + for(int i=1; i<=maxLength; i++) + { + GridSpace space = this.getGridSpace(x + i*dir.offsetX, z + i*dir.offsetZ); + if(space.isEmpty()) + { + for(int k=1; k<=this.getRoadSpacer(); k++) + { + GridSpace space1 = this.getGridSpace(x + i*dir.offsetX + dir.offsetZ*k, z + i*dir.offsetZ + dir.offsetX*k); + GridSpace space2 = this.getGridSpace(x + i*dir.offsetX - dir.offsetZ*k, z + i*dir.offsetZ - dir.offsetX*k); + + if(space1.isRoadSegment() || space2.isRoadSegment()) + { + return i-1; + } + } + + continue; + } + if(space.isRoadSegment()) + { + return i; + }else + { + return i-1; + } + } + return maxLength; + } + + public Int3 findRoadSpaceFromDirection(ForgeDirection dir, int amount) + { + int index = 0; + if(dir == ForgeDirection.NORTH) + { + System.out.print("NORTH!"); + for(int i=0; i<= negZRadius + posZRadius; i++) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + if(space.isRoadSegment()) + { + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,space.getYLevel(),i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.SOUTH) + { + for(int i=negZRadius + posZRadius; i >= 0 ; i--) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + if(space.isRoadSegment()) + { + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,space.getYLevel(),i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.EAST) + { + for(int i=negXRadius + posXRadius; i >= 0; i--) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + if(space.isRoadSegment()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,space.getYLevel(),j-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.WEST) + { + for(int i=0; i <= negXRadius + posXRadius; i++) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + if(space.isRoadSegment()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,space.getYLevel(),j-negZRadius); + } + } + } + } + } + + return new Int3(0,0,0); + } + + public Int3 findEmptySpaceNearRoad(ForgeDirection dir, int amount, int closeness) + { + int index = 0; + if(dir == ForgeDirection.NORTH) + { + System.out.print("NORTH!"); + for(int i=0; i<= negZRadius + posZRadius; i++) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + if(space.isEmpty()) + { + int yLevel = this.findNearestRoadYLevel(j-negXRadius, i-negZRadius, closeness); + if(yLevel == -1) + { + continue; + } + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,yLevel,i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.SOUTH) + { + for(int i=negZRadius + posZRadius; i >= 0 ; i--) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + int yLevel = this.findNearestRoadYLevel(j-negXRadius, i-negZRadius, closeness); + if(yLevel == -1) + { + continue; + } + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,yLevel,i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.EAST) + { + for(int i=negXRadius + posXRadius; i >= 0; i--) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + int yLevel = this.findNearestRoadYLevel(i-negXRadius, j-negZRadius, closeness); + if(yLevel == -1) + { + continue; + } + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,yLevel,j-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.WEST) + { + for(int i=0; i <= negXRadius + posXRadius; i++) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + int yLevel = this.findNearestRoadYLevel(i-negXRadius, j-negZRadius, closeness); + if(yLevel == -1) + { + continue; + } + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,yLevel,j-negZRadius); + } + } + } + } + } + + return new Int3(0,0,0); + } + + public Int3 findEmptySpaceFromDirection(ForgeDirection dir, int amount) + { + int index = 0; + if(dir == ForgeDirection.NORTH) + { + System.out.print("NORTH!"); + for(int i=0; i<= negZRadius + posZRadius; i++) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,space.getYLevel(),i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.SOUTH) + { + for(int i=negZRadius + posZRadius; i >= 0 ; i--) + { + for(int j=0; j<= negXRadius + posXRadius; j++) + { + GridSpace space = area[j][i]; + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(j-negXRadius,space.getYLevel(),i-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.EAST) + { + for(int i=negXRadius + posXRadius; i >= 0; i--) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,space.getYLevel(),j-negZRadius); + } + } + } + } + }else if(dir == ForgeDirection.WEST) + { + for(int i=0; i <= negXRadius + posXRadius; i++) + { + for(int j=0; j <= negZRadius + posZRadius ; j++) + { + GridSpace space = area[i][j]; + if(space.isEmpty()) + { + index++; + if(index >= amount) + { + return new Int3(i-negXRadius,space.getYLevel(),j-negZRadius); + } + } + } + } + } + + return new Int3(0,0,0); + } + + public void createGriddedRoad(int gridXi, int yi, int gridZi, ForgeDirection dir, int gridLength, boolean convertStarter) //Total grid length + { + if(gridLength == 0 || gridLength == 1) + { + return; + } + + if(convertStarter) + { + + } + + int initGridX = gridXi; + int initGridZ = gridZi; + int initY = yi; + + if(convertStarter) + { + this.setGridSpace(initGridX, initGridZ, new GridSpace(GridSpace.CROSSROAD,initY)); + + DemonCrosspath crosspath = new DemonCrosspath(xCoord + initGridX*5, initY, zCoord + initGridZ*5); + crosspath.createCrosspath(worldObj); + } + + for(int index=0; index posXRadius|| x < -negXRadius || z > posZRadius || z < -negZRadius) + { + return new GridSpace(); + }else + { + return (area[x + negXRadius][z + negZRadius]); + } + } + + public void setGridSpace(int x, int z, GridSpace space) + { + if(x > posXRadius) + { + this.expandAreaInPosX(); + this.setGridSpace(x, z, space); + return; + }else if(x < -negXRadius) + { + this.expandAreaInNegX(); + this.setGridSpace(x, z, space); + return; + }else if(z > posZRadius) + { + this.expandAreaInPosZ(); + this.setGridSpace(x, z, space); + return; + }else if(z < -negZRadius) + { + this.expandAreaInNegZ(); + this.setGridSpace(x, z, space); + return; + }else + { + area[x + negXRadius][z + negZRadius] = space; + } + } + + public void rightClickBlock(EntityPlayer player, int side) + { + if(worldObj.isRemote) + { + return; + } + Int3 roadMarker = this.getNextRoadMarker(); + + this.initialize(); + + if(ForgeDirection.getOrientation(side) == ForgeDirection.UP) + { + this.createRandomBuilding(DemonBuilding.BUILDING_HOUSE, 0); + }else + { + this.createRandomRoad(); + } + } + + public void createRandomBuilding(int type, int tier) + { + switch(type) + { + case DemonBuilding.BUILDING_HOUSE: + this.createRandomHouse(tier); + break; + case DemonBuilding.BUILDING_PORTAL: + this.createPortalBuilding(tier); + break; + } + } + + public void createPortalBuilding(int buildingTier) + { + int x = 0; + int z = 0; + + GridSpace home = this.getGridSpace(x, z); + int yLevel = home.getYLevel(); + + GridSpaceHolder grid = this.createGSH(); + + List directions = new ArrayList(); + + for(int i=2; i<6; i++) + { + ForgeDirection testDir = ForgeDirection.getOrientation(i); + if(this.getGridSpace(x + testDir.offsetX, z + testDir.offsetZ).isEmpty()) + { + directions.add(testDir); + } + } + + if(directions.isEmpty()) + { + return; + } + + HashMap> schemMap = new HashMap(); + + for(ForgeDirection nextDir : directions) + { + for(DemonBuilding build : TEDemonPortal.buildingList) + { + if(schemMap.containsKey(nextDir)) + { + schemMap.get(nextDir).add(build); + }else + { + schemMap.put(nextDir, new ArrayList()); + schemMap.get(nextDir).add(build); + } + } + } + + if(schemMap.keySet().isEmpty()) + { + return; + } + + ForgeDirection chosenDirection = (ForgeDirection) schemMap.keySet().toArray()[new Random().nextInt(schemMap.keySet().size())]; + DemonBuilding build = schemMap.get(chosenDirection).get(new Random().nextInt(schemMap.get(chosenDirection).size())); + + build.destroyAllInField(worldObj, xCoord + (x)*5, yLevel, zCoord + (z)*5, chosenDirection.getOpposite()); + + Int3 portalSpace = build.getDoorSpace(chosenDirection); + int yOffset = portalSpace.yCoord; + + for(int i=0; i<256; i++) + { + Block block = worldObj.getBlock(xCoord + (x)*5, i, zCoord + (z)*5); + if(block == ModBlocks.blockDemonPortal) + { + BlockTeleposer.swapBlocks(worldObj, worldObj, xCoord, i, zCoord, xCoord, yLevel + yOffset, zCoord); + break; + } + } + + build.buildAll(worldObj, xCoord + (x)*5, yLevel, zCoord + (z)*5, chosenDirection.getOpposite()); + build.setAllGridSpaces(x, z, yLevel, chosenDirection.getOpposite(), GridSpace.MAIN_PORTAL, grid); + this.loadGSH(grid); + } + + public void createRandomHouse(int buildingTier) + { + int next = rand.nextInt(4); + ForgeDirection dir; + + switch(next) + { + case 0: + dir = ForgeDirection.NORTH; + break; + case 1: + dir = ForgeDirection.SOUTH; + break; + case 2: + dir = ForgeDirection.EAST; + break; + case 3: + dir = ForgeDirection.WEST; + break; + default: + dir = ForgeDirection.NORTH; + } + + int length = 5; + + boolean newProtocol = true; + + if(newProtocol) + { + Int3 space = this.findRoadSpaceFromDirection(dir, 1*(rand.nextInt(negXRadius + negZRadius + posXRadius + posZRadius))+1); + + int x = space.xCoord; + int z = space.zCoord; + int yLevel = space.yCoord; + + System.out.println("Road space - x: " + x + " z: " + z); + + GridSpaceHolder grid = this.createGSH(); + + if(!this.getGridSpace(x, z).isRoadSegment()) + { + return; + } + + List directions = new ArrayList(); + + for(int i=2; i<6; i++) + { + ForgeDirection testDir = ForgeDirection.getOrientation(i); + if(this.getGridSpace(x + testDir.offsetX, z + testDir.offsetZ).isEmpty()) + { + directions.add(testDir); + } + } + + if(directions.isEmpty()) + { + return; + } + + HashMap> schemMap = new HashMap(); + + for(ForgeDirection nextDir : directions) + { + for(DemonBuilding build : TEDemonPortal.buildingList) + { + if(build.buildingTier != buildingTier || build.buildingType != DemonBuilding.BUILDING_HOUSE) + { + continue; + } + Int3 offsetSpace = build.getGridOffsetFromRoad(nextDir, yLevel); + int xOff = offsetSpace.xCoord; + int zOff = offsetSpace.zCoord; + + if(build.isValid(grid, x + xOff, z + zOff, nextDir.getOpposite())) + { + if(schemMap.containsKey(nextDir)) + { + schemMap.get(nextDir).add(build); + }else + { + schemMap.put(nextDir, new ArrayList()); + schemMap.get(nextDir).add(build); + } + }else + { + System.out.println("This ISN'T valid!"); + } + } + } + + if(schemMap.keySet().isEmpty()) + { + return; + } + + ForgeDirection chosenDirection = (ForgeDirection) schemMap.keySet().toArray()[new Random().nextInt(schemMap.keySet().size())]; + DemonBuilding build = schemMap.get(chosenDirection).get(new Random().nextInt(schemMap.get(chosenDirection).size())); + + Int3 offsetSpace = build.getGridOffsetFromRoad(chosenDirection, yLevel); + int xOff = offsetSpace.xCoord; + int zOff = offsetSpace.zCoord; + + build.destroyAllInField(worldObj, xCoord + (x + xOff)*5, yLevel, zCoord + (z + zOff)*5, chosenDirection.getOpposite()); + build.buildAll(worldObj, xCoord + (x + xOff)*5, yLevel, zCoord + (z + zOff)*5, chosenDirection.getOpposite()); + build.setAllGridSpaces(x + xOff, z + zOff, yLevel, chosenDirection.getOpposite(), GridSpace.HOUSE, grid); + this.loadGSH(grid); + }else + { + Int3 space = findEmptySpaceNearRoad(dir, 3*(rand.nextInt(negXRadius + negZRadius + posXRadius + posZRadius))+1, 2); + + int x = space.xCoord; + int z = space.zCoord; + int yLevel = space.yCoord; + + GridSpace newSpace = this.getGridSpace(x, z); + if(!newSpace.isEmpty()) + { + return; + } + + if(yLevel == -1) + { + return; + } + + GridSpaceHolder grid = this.createGSH(); + + ForgeDirection chosenDirection = ForgeDirection.NORTH; + + HashMap> bigList = new HashMap(); + + for(DemonBuilding build : TEDemonPortal.buildingList) + { + for(int i=2; i<6; i++) + { + chosenDirection = ForgeDirection.getOrientation(i); + System.out.println("" + chosenDirection.toString()); + if(build.isValid(grid, x, z, chosenDirection)) + { + System.out.println("Valid!"); + if(bigList.containsKey(chosenDirection)) + { + bigList.get(chosenDirection).add(build); + }else + { + bigList.put(chosenDirection, new ArrayList()); + bigList.get(chosenDirection).add(build); + } + } + } + } + + chosenDirection = ForgeDirection.getOrientation(new Random().nextInt(4) + 2); //Change to favour a direction with a road nearby + + List buildingList = bigList.get(chosenDirection); + DemonBuilding build; + + if(buildingList != null && buildingList.size() > 0) + { + build = buildingList.get(new Random().nextInt(buildingList.size())); + }else + { + return; + } + //TODO: Finish the selection algorythm + //TODO: Should favour those directions that have a road right next to them. + + build.buildAll(worldObj, xCoord + x*5, yLevel, zCoord + z*5, chosenDirection); + build.setAllGridSpaces(x, z, yLevel, chosenDirection, GridSpace.HOUSE, grid); + this.loadGSH(grid); + + System.out.println("X: " + x + " Z: " + z + " Direction: " + chosenDirection.toString()); + } + } + + public int findNearestRoadYLevel(int xCoord, int zCoord, int maxDistance) + { + for(int l=1; l<=maxDistance; l++) + { + for(int i=-l; i<=l; i++) + { + for(int j=-l; j<=l; j++) + { + if(Math.abs(i)!=l && Math.abs(j)!=l) + { + continue; + } + + if(this.getGridSpace(xCoord + i, zCoord + j).isRoadSegment()) + { + return this.getGridSpace(xCoord + i, zCoord + j).getYLevel(); + } + } + } + } + + return -1; + } + + public void createRoad(int xi, int yi, int zi, ForgeDirection dir, int length, boolean doesNotDrop) + { + int curX = xi; + int curY = yi; + int curZ = zi; + int roadRadius = this.getRoadRadius(); + + if(dir.offsetY != 0) + { + return; + } + + DemonVillagePath path = new DemonVillagePath(xi, yi, zi, dir, length); + + path.constructFullPath(worldObj, this.getRoadStepClearance(), this.getRoadBlock(), this.getRoadMeta()); + } + + public int placeMaterialOnNextAvailable() + { + return 0; + } + + public int getRoadRadius() + { + return 1; + } + + public Block getRoadBlock() + { + return Blocks.nether_brick; + } + + public int getRoadMeta() + { + return 0; + } + + public int getRoadStepClearance() + { + return 10; + } + + public Block getRoadMarker() + { + return ModBlocks.ritualStone; + } + + public Int3 getNextRoadMarker() + { + int horizSearchMax = 25; + int vertSearchMax = 10; + + for(int xPos=xCoord-horizSearchMax; xPos<=xCoord+horizSearchMax; xPos++) + { + for(int zPos=zCoord-horizSearchMax; zPos<=zCoord+horizSearchMax; zPos++) + { + for(int yPos=yCoord-vertSearchMax; yPos<=yCoord+vertSearchMax; yPos++) + { + Block block = worldObj.getBlock(xPos, yPos, zPos); + if(block == this.getRoadMarker()) + { + return new Int3(xPos,yPos,zPos); + } + } + } + } + + return null; + } + + public int getRoadSpacer() + { + return 1; + } + + public GridSpaceHolder createGSH() + { + GridSpaceHolder grid = new GridSpaceHolder(); + grid.area = this.area; + grid.negXRadius = this.negXRadius; + grid.negZRadius = this.negZRadius; + grid.posXRadius = this.posXRadius; + grid.posZRadius = this.posZRadius; + + return grid; + } + + public void loadGSH(GridSpaceHolder grid) + { + this.area = grid.area; + this.negXRadius = grid.negXRadius; + this.negZRadius = grid.negZRadius; + this.posXRadius = grid.posXRadius; + this.posZRadius = grid.posZRadius; + } + + public static void loadBuildingList() + { + String folder = "config/BloodMagic/schematics"; + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + File file = new File(folder); + File[] files = file.listFiles(); + BufferedReader br; + + try{ + for(File f : files) + { + br = new BufferedReader(new FileReader(f)); + BuildingSchematic schema = gson.fromJson(br, BuildingSchematic.class); + TEDemonPortal.buildingList.add(new DemonBuilding(schema)); + } + }catch(FileNotFoundException e) + { + e.printStackTrace(); + } +// +// try { +// br = new BufferedReader(new FileReader(folder + "test3.json")); +// BuildingSchematic schema = gson.fromJson(br, BuildingSchematic.class); +// TEDemonPortal.buildingList.add(new DemonBuilding(schema)); +// } catch (FileNotFoundException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + + + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEHomHeart.java new file mode 100644 index 00000000..180b0d35 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEImperfectRitualStone.java new file mode 100644 index 00000000..110996ea --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java new file mode 100644 index 00000000..897b7857 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEMasterStone.java @@ -0,0 +1,235 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.Rituals; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class TEMasterStone extends TileEntity implements IMasterRitualStone +{ + //private int currentRitual; + private String currentRitualString; + private boolean isActive; + private String owner; + private String varString1; + private int cooldown; + private int var1; + private int direction; + + public TEMasterStone() + { + //currentRitual = 0; + isActive = false; + owner = ""; + cooldown = 0; + var1 = 0; + direction = 0; + varString1 = ""; + currentRitualString = ""; + } + + @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"); + currentRitualString = par1NBTTagCompound.getString("currentRitualString"); +// varString1 = par1NBTTagCompound.getString("varString1"); + } + + @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); + par1NBTTagCompound.setString("currentRitualString", currentRitualString); +// par1NBTTagCompound.setString("varString1", varString1); + } + + public void activateRitual(World world, int crystalLevel, EntityPlayer player) + { + if (world.isRemote) + { + return; + } + + String testRitual = Rituals.checkValidRitual(world, xCoord, yCoord, zCoord); + + if (testRitual.equals("")) + { + player.addChatMessage(new ChatComponentText("Nothing appears to have happened...")); + return; + } + + boolean testLevel = Rituals.canCrystalActivate(testRitual, crystalLevel); + + if (!testLevel) + { + player.addChatMessage(new ChatComponentText("Your crystal vibrates pathetically.")); + + 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)) + { + player.addChatMessage(new ChatComponentText("You feel a pull, but you are too weak to push any further.")); + + //TODO Bad stuff + return; + } + + if (!world.isRemote) + { + data.currentEssence = currentEssence - Rituals.getCostForActivation(testRitual); + data.markDirty(); + + player.addChatMessage(new ChatComponentText("A rush of energy flows through the ritual!")); + + 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; + currentRitualString = 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, currentRitualString, direction); + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + + if (!testRunes) + { + isActive = false; + currentRitualString = ""; + 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, currentRitualString); + } + + public void performRitual(World world, int x, int y, int z, String currentRitualString2) + { + Rituals.performEffect(this, currentRitualString2); + } + + 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; + } + + @Override + public World getWorld() + { + return this.getWorldObj(); + } + + @Override + public int getXCoord() + { + return xCoord; + } + + @Override + public int getYCoord() + { + return yCoord; + } + + @Override + public int getZCoord() + { + return zCoord; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java new file mode 100644 index 00000000..991f6e64 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEOrientable.java @@ -0,0 +1,109 @@ +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; +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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java new file mode 100644 index 00000000..d83006cc --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java @@ -0,0 +1,268 @@ +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.network.play.server.S35PacketUpdateTileEntity; +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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java new file mode 100644 index 00000000..f9cfdbf4 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java @@ -0,0 +1,694 @@ +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.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistry; +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistryComponent; +import WayofTime.alchemicalWizardry.common.IDemon; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.PlinthComponent; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; + +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); + if(((TEPedestal) tileEntity).getStackInSlot(0) !=null && ((TEPedestal) tileEntity).getStackInSlot(0).stackSize==0) + { + ((TEPedestal) tileEntity).setInventorySlotContents(0, null); + } + ((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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESchematicSaver.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESchematicSaver.java new file mode 100644 index 00000000..8558b667 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESchematicSaver.java @@ -0,0 +1,158 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.common.demonVillage.BuildingSchematic; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class TESchematicSaver extends TileEntity +{ + public Block targetBlock = ModBlocks.largeBloodStoneBrick; + + public void rightClickBlock(EntityPlayer player, int side) + { + BuildingSchematic schematic = new BuildingSchematic(); + + int negX = this.getNegXLimit(); + int negY = this.getNegYLimit(); + int negZ = this.getNegZLimit(); + int posX = this.getPosXLimit(); + int posY = this.getPosYLimit(); + int posZ = this.getPosZLimit(); + + for(int i=-negX+1; i<=posX-1; i++) + { + for(int j=-negY+1; j<=posY-1; j++) + { + for(int k=-negZ+1; k<=posZ-1; k++) + { + int meta = worldObj.getBlockMetadata(xCoord + i, yCoord + j, zCoord + k); + Block block = worldObj.getBlock(xCoord + i, yCoord + j, zCoord + k); + + if(!block.isAir(worldObj, xCoord + i, yCoord + j, zCoord + k)) + { + schematic.addBlockWithMeta(block, meta, i, j, k); + } + + } + } + + System.out.println("" + i); + } + + System.out.println("I got here!"); + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + String json = gson.toJson(schematic); + System.out.println("Here, too!"); + Writer writer; + try + { + writer = new FileWriter("config/BloodMagic/schematics/" + new Random().nextInt() + ".json"); + writer.write(json); + writer.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public int getPosYLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord, yCoord + i, zCoord))) + { + return i; + } + + i++; + } + return 1; + } + + public int getNegYLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord, yCoord - i, zCoord))) + { + return i; + } + + i++; + } + return 1; + } + + public int getPosXLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord + i, yCoord, zCoord))) + { + return i; + } + + i++; + } + return 1; + } + + public int getNegXLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord - i, yCoord, zCoord))) + { + return i; + } + + i++; + } + return 1; + } + + public int getPosZLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord, yCoord, zCoord + i))) + { + return i; + } + + i++; + } + return 1; + } + + public int getNegZLimit() + { + int i=1; + while(i<100) + { + if(targetBlock == (worldObj.getBlock(xCoord, yCoord, zCoord - i))) + { + return i; + } + + i++; + } + return 1; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java new file mode 100644 index 00000000..9f43b483 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java @@ -0,0 +1,255 @@ +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.network.play.server.S35PacketUpdateTileEntity; +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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpectralContainer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpectralContainer.java new file mode 100644 index 00000000..25994003 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESpectralContainer.java @@ -0,0 +1,149 @@ +package WayofTime.alchemicalWizardry.common.tileEntity; + +import net.minecraft.block.Block; +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.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fluids.IFluidBlock; +import WayofTime.alchemicalWizardry.ModBlocks; + +public class TESpectralContainer extends TileEntity +{ + private ItemStack[] inv; + + private int ticksRemaining; + + public TESpectralContainer() + { + this.inv = new ItemStack[1]; + + ticksRemaining = 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); + } + } + + ticksRemaining = par1NBTTagCompound.getInteger("ticksRemaining"); + } + + @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); + par1NBTTagCompound.setInteger("ticksRemaining", ticksRemaining); + } + + @Override + public void updateEntity() + { + super.updateEntity(); + + this.ticksRemaining--; + + if(this.ticksRemaining<=0) + { + this.returnContainedBlock(); + } + } + + public static boolean createSpectralBlockAtLocation(World world, int x, int y, int z, int duration) + { + Block block = world.getBlock(x, y, z); + + if(block==null) + { + return false; + } + + if(world.getTileEntity(x, y, z)==null || block instanceof IFluidBlock) + { + int meta = world.getBlockMetadata(x, y, z); + ItemStack item = new ItemStack(block, 1, meta); + + world.setBlock(x, y, z, ModBlocks.blockSpectralContainer); + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TESpectralContainer) + { + ((TESpectralContainer) tile).setContainedItem(item); + ((TESpectralContainer) tile).setDuration(duration); + return true; + } + } + + return false; + } + + public void setDuration(int dur) + { + this.ticksRemaining = dur; + } + + public void resetDuration(int dur) + { + if(this.ticksRemaining 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); + } + + } + + @Override + 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"; + case 3: return "alchemicalwizardry:textures/models/SpellParadigmTool.png"; + } + return "alchemicalwizardry:textures/models/SpellParadigmProjectile.png"; + } + + @Override + public void setInputDirection(ForgeDirection direction) + { + + } + + @Override + public ForgeDirection getInputDirection() + { + return ForgeDirection.UNKNOWN; + } +} diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java new file mode 100644 index 00000000..0113303f --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java @@ -0,0 +1,374 @@ +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.network.play.server.S35PacketUpdateTileEntity; +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.getBoundingBox((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.getBoundingBox(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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java new file mode 100644 index 00000000..bc005c4a --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java @@ -0,0 +1,815 @@ +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 net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemicalPotionCreationHandler; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipe; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import WayofTime.alchemicalWizardry.common.IBindingAgent; +import WayofTime.alchemicalWizardry.common.ICatalyst; +import WayofTime.alchemicalWizardry.common.IFillingAgent; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +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 (!EnergyItems.syphonWhileInContainer(getStackInSlot(0), amountUsed)) + { + return; + } + + if (worldTime % 4 == 0) + { + SpellHelper.sendIndexedParticleToAllAround(worldObj, xCoord, yCoord, zCoord, 20, worldObj.provider.dimensionId, 1, xCoord, yCoord, zCoord); + } + + progress++; + + if (progress >= progressNeeded) + { + progress = 0; + this.setInventorySlotContents(6, getResultingItemStack()); + + ItemStack[] composedRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + composedRecipe[i] = inv[i + 1]; + } + + this.decrementSlots(this.getRecipeForItems(composedRecipe, inv[0])); + + 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); + + ItemStack[] composedRecipe = new ItemStack[5]; + + for (int i = 0; i < 5; i++) + { + composedRecipe[i] = inv[i + 1]; + } + + this.decrementSlots(this.getRecipeForItems(composedRecipe, inv[0])); + + if (worldObj != null) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + } + + //worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + public void decrementSlots(ItemStack[] recipe) //TODO Fix this. This doesn't work. + { + boolean[] decrementedList = new boolean[]{false,false,false,false,false}; + + for(int i=0; i<(Math.min(recipe.length,5)); i++) + { + ItemStack decStack = recipe[i]; + + if(decStack == null) + { + continue; + } + + for(int j=0; j<5; j++) + { + ItemStack testStack = this.getStackInSlot(j+1); + + if(testStack != null && (testStack.isItemEqual(decStack) || (testStack.getItem() == decStack.getItem() && decStack.getItemDamage() == OreDictionary.WILDCARD_VALUE)) && !(decrementedList[j])) + { + if(testStack.getItem().hasContainerItem(testStack)) + { + this.inv[j+1] = testStack.getItem().getContainerItem(testStack); + }else + { + this.decrStackSize(j+1, 1); + } + + decrementedList[j] = true; + break; + } + } + } + } + + public ItemStack[] getRecipeForItems(ItemStack[] recipe, ItemStack bloodOrb) + { + if (bloodOrb == null) + { + return null; + } + + if (!(bloodOrb.getItem() instanceof IBloodOrb)) + { + return null; + } + + int bloodOrbLevel = ((IBloodOrb) bloodOrb.getItem()).getOrbLevel(); + + for (AlchemyRecipe ar : AlchemyRecipeRegistry.recipes) + { + if (ar.doesRecipeMatch(recipe, bloodOrbLevel)) + { + return ar.getRecipe(); + } + } + + return null; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerAltar.java new file mode 100644 index 00000000..9f926427 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerTeleposer.java new file mode 100644 index 00000000..09104284 --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java new file mode 100644 index 00000000..03c42933 --- /dev/null +++ b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/container/ContainerWritingTable.java @@ -0,0 +1,104 @@ +package WayofTime.alchemicalWizardry.common.tileEntity.container; + +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; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; + +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(); + + //merges the item into player inventory since its in the tileEntity + if (slot <= 6) + { + if (!this.mergeItemStack(stackInSlot, 7, 43, true)) + { + return null; + } + } + else if(stack.getItem() instanceof IBloodOrb) + { + if (!this.mergeItemStack(stackInSlot, 0, 1, false)) + { + return null; + } + } + //places it into the tileEntity is possible since its in the player inventory + else if (!this.mergeItemStack(stackInSlot, 1, 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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java new file mode 100644 index 00000000..2c50234a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiTeleposer.java new file mode 100644 index 00000000..a6d5f58a --- /dev/null +++ b/1.7.10/main/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.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java b/1.7.10/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiWritingTable.java new file mode 100644 index 00000000..53a74f19 --- /dev/null +++ b/1.7.10/main/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.10/main/java/joshie/alchemicalWizardy/ShapedBloodOrbRecipe.java b/1.7.10/main/java/joshie/alchemicalWizardy/ShapedBloodOrbRecipe.java new file mode 100644 index 00000000..f508fe6a --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/ShapedBloodOrbRecipe.java @@ -0,0 +1,227 @@ +package joshie.alchemicalWizardy; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; + +/** Shaped Blood Orb Recipe Handler by joshie **/ +public class ShapedBloodOrbRecipe implements IRecipe { + private static final int MAX_CRAFT_GRID_WIDTH = 3; + private static final int MAX_CRAFT_GRID_HEIGHT = 3; + + private ItemStack output = null; + private Object[] input = null; + public int width = 0; + public int height = 0; + private boolean mirrored = true; + + public ShapedBloodOrbRecipe(Block result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapedBloodOrbRecipe(Item result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapedBloodOrbRecipe(ItemStack result, Object... recipe) { + output = result.copy(); + + 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 IBloodOrb || (in instanceof ItemStack && ((ItemStack)in).getItem() instanceof IBloodOrb)) { //If the item is an instanceof IBloodOrb then save the level of the orb + if(in instanceof ItemStack) itemMap.put(chr, (Integer)(((IBloodOrb)((ItemStack)in).getItem()).getOrbLevel())); + else itemMap.put(chr, (Integer)(((IBloodOrb)in).getOrbLevel())); + } else 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); + } + } + + ShapedBloodOrbRecipe(ShapedRecipes recipe, Map replacements) { + output = recipe.getRecipeOutput(); + width = recipe.recipeWidth; + height = recipe.recipeHeight; + + input = new Object[recipe.recipeItems.length]; + + for (int i = 0; i < input.length; i++) { + ItemStack ingred = recipe.recipeItems[i]; + + if (ingred == null) + continue; + + input[i] = recipe.recipeItems[i]; + + for (Entry replace : replacements.entrySet()) { + if (OreDictionary.itemMatches(replace.getKey(), ingred, true)) { + input[i] = OreDictionary.getOres(replace.getValue()); + break; + } + } + } + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting var1) { + return output.copy(); + } + + @Override + public int getRecipeSize() { + return input.length; + } + + @Override + public ItemStack getRecipeOutput() { + return output; + } + + @Override + public boolean matches(InventoryCrafting inv, World world) { + 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; + } + + @SuppressWarnings("unchecked") + private boolean checkMatch(InventoryCrafting 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 = inv.getStackInRowAndColumn(x, y); + //If target is integer, then we should be check the blood orb value of the item instead + if(target instanceof Integer) { + if(slot != null && slot.getItem() instanceof IBloodOrb) { + IBloodOrb orb = (IBloodOrb) slot.getItem(); + if(orb.getOrbLevel() < (Integer)target) { + return false; + } + } else return false; + } else if (target instanceof ItemStack) { + if (!OreDictionary.itemMatches((ItemStack) target, slot, false)) { + return false; + } + } else if (target instanceof ArrayList) { + boolean matched = false; + + Iterator itr = ((ArrayList) target).iterator(); + while (itr.hasNext() && !matched) { + matched = OreDictionary.itemMatches(itr.next(), slot, false); + } + + if (!matched) { + return false; + } + } else if (target == null && slot != null) { + return false; + } + } + } + + return true; + } + + public ShapedBloodOrbRecipe setMirrored(boolean mirror) { + mirrored = mirror; + return this; + } + + public Object[] getInput() { + return this.input; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/ShapelessBloodOrbRecipe.java b/1.7.10/main/java/joshie/alchemicalWizardy/ShapelessBloodOrbRecipe.java new file mode 100644 index 00000000..f33f9158 --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/ShapelessBloodOrbRecipe.java @@ -0,0 +1,140 @@ +package joshie.alchemicalWizardy; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.block.Block; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; + +/** Shapeless Blood Orb Recipe Handler by joshie **/ +public class ShapelessBloodOrbRecipe implements IRecipe { + private ItemStack output = null; + private ArrayList input = new ArrayList(); + + public ShapelessBloodOrbRecipe(Block result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapelessBloodOrbRecipe(Item result, Object... recipe) { + this(new ItemStack(result), recipe); + } + + public ShapelessBloodOrbRecipe(ItemStack result, Object... recipe) { + output = result.copy(); + for (Object in : recipe) { + if (in instanceof ItemStack) { + input.add(((ItemStack) in).copy()); + } else if (in instanceof IBloodOrb) { //If the item is an instanceof IBloodOrb then save the level of the orb + input.add((Integer)(((IBloodOrb)in).getOrbLevel())); + } 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); + } + } + } + + @SuppressWarnings("unchecked") + ShapelessBloodOrbRecipe(ShapelessRecipes recipe, Map replacements) { + output = recipe.getRecipeOutput(); + + for (ItemStack ingred : ((List) recipe.recipeItems)) { + Object finalObj = ingred; + for (Entry replace : replacements.entrySet()) { + if (OreDictionary.itemMatches(replace.getKey(), ingred, false)) { + finalObj = OreDictionary.getOres(replace.getValue()); + break; + } + } + input.add(finalObj); + } + } + + @Override + public int getRecipeSize() { + return input.size(); + } + + @Override + public ItemStack getRecipeOutput() { + return output; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting var1) { + return output.copy(); + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(InventoryCrafting var1, World world) { + ArrayList required = new ArrayList(input); + + for (int x = 0; x < var1.getSizeInventory(); 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 target is integer, then we should be check the blood orb value of the item instead + if(next instanceof Integer) { + if(slot != null && slot.getItem() instanceof IBloodOrb) { + IBloodOrb orb = (IBloodOrb) slot.getItem(); + if(orb.getOrbLevel() < (Integer)next) { + return false; + } + } else return false; + } else if (next instanceof ItemStack) { + match = OreDictionary.itemMatches((ItemStack) next, slot, false); + } else if (next instanceof ArrayList) { + Iterator itr = ((ArrayList) next).iterator(); + while (itr.hasNext() && !match) { + match = OreDictionary.itemMatches(itr.next(), slot, false); + } + } + + if (match) { + inRecipe = true; + required.remove(next); + break; + } + } + + if (!inRecipe) { + return false; + } + } + } + + return required.isEmpty(); + } + + public ArrayList getInput() { + return this.input; + } +} \ No newline at end of file diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAlchemyRecipeHandler.java b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAlchemyRecipeHandler.java new file mode 100644 index 00000000..55765d28 --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAlchemyRecipeHandler.java @@ -0,0 +1,153 @@ +package joshie.alchemicalWizardy.nei; + +import static joshie.alchemicalWizardy.nei.NEIConfig.bloodOrbs; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipe; +import WayofTime.alchemicalWizardry.api.alchemy.AlchemyRecipeRegistry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import codechicken.nei.ItemList; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.TemplateRecipeHandler; + +public class NEIAlchemyRecipeHandler extends TemplateRecipeHandler { + public class CachedAlchemyRecipe extends CachedRecipe { + public class BloodOrbs { + public PositionedStack stack; + public BloodOrbs(ItemStack orb) { + this.stack = new PositionedStack(orb, 136, 47, false); + } + } + + ArrayList orbs; + PositionedStack output; + List inputs; + int lp; + + public CachedAlchemyRecipe(AlchemyRecipe recipe, ItemStack orb) { + this(recipe); + this.orbs = new ArrayList(); + orbs.add(new BloodOrbs(orb)); + } + + public CachedAlchemyRecipe(AlchemyRecipe recipe) { + List inputs = new ArrayList(); + ItemStack[] stacks = recipe.getRecipe(); + if(stacks.length > 0) + inputs.add(new PositionedStack(stacks[0], 76, 3)); + if(stacks.length > 1) + inputs.add(new PositionedStack(stacks[1], 51, 19)); + if(stacks.length > 2) + inputs.add(new PositionedStack(stacks[2], 101, 19)); + if(stacks.length > 3) + inputs.add(new PositionedStack(stacks[3], 64, 47)); + if(stacks.length > 4) + inputs.add(new PositionedStack(stacks[4], 88, 47)); + this.inputs = inputs; + this.output = new PositionedStack(recipe.getResult(), 76, 25); + this.lp = recipe.getAmountNeeded() * 100; + this.orbs = new ArrayList(); + for(Item orb: bloodOrbs) { + if(((IBloodOrb)orb).getOrbLevel() >= recipe.getOrbLevel()) { + orbs.add(new BloodOrbs(new ItemStack(orb))); + } + } + } + + @Override + public List getIngredients() { + return inputs; + } + + @Override + public PositionedStack getResult() { + return output; + } + + @Override + public PositionedStack getOtherStack() { + if(orbs == null || orbs.size() <= 0) return null; + return orbs.get((cycleticks/48) % orbs.size()).stack; + } + } + + @Override + public TemplateRecipeHandler newInstance() { + for(ItemStack item : ItemList.items) { + if(item != null && item.getItem() instanceof IBloodOrb) { + bloodOrbs.add(item.getItem()); + } + } + + return super.newInstance(); + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for(AlchemyRecipe recipe: AlchemyRecipeRegistry.recipes) { + ItemStack output = recipe.getResult(); + if(NEIServerUtils.areStacksSameTypeCrafting(result, recipe.getResult())) { + arecipes.add(new CachedAlchemyRecipe(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if(ingredient.getItem() instanceof IBloodOrb) { + for(AlchemyRecipe recipe: AlchemyRecipeRegistry.recipes) { + if(((IBloodOrb)ingredient.getItem()).getOrbLevel() >= recipe.getOrbLevel()) { + arecipes.add(new CachedAlchemyRecipe(recipe, ingredient)); + } + } + } else { + for(AlchemyRecipe recipe: AlchemyRecipeRegistry.recipes) { + ItemStack[] stacks = recipe.getRecipe(); + for(ItemStack stack: stacks) { + if(NEIServerUtils.areStacksSameTypeCrafting(stack, ingredient)) { + arecipes.add(new CachedAlchemyRecipe(recipe)); + break; + } + } + } + } + } + + @Override + public void drawExtras(int id) { + CachedAlchemyRecipe cache = (CachedAlchemyRecipe) arecipes.get(id); + Minecraft.getMinecraft().fontRenderer.drawString("\u00a77" + cache.lp + "LP", getLPX(cache.lp), 34, 0); + } + + public int getLPX(int lp) { + if(lp < 10) + return 122; + else if (lp < 100) + return 122; + else if (lp < 1000) + return 130; + else if (lp < 10000) + return 127; + else if (lp < 100000) + return 124; + return 122; + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("tile.blockWritingTable.name"); + } + + @Override + public String getGuiTexture() { + return new ResourceLocation("alchemicalwizardry", "gui/nei/alchemy.png").toString(); + } +} diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAltarRecipeHandler.java b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAltarRecipeHandler.java new file mode 100644 index 00000000..38b97903 --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIAltarRecipeHandler.java @@ -0,0 +1,182 @@ +package joshie.alchemicalWizardy.nei; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.lang.reflect.Field; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; + +import org.lwjgl.input.Mouse; + +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipe; +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.TemplateRecipeHandler; + +public class NEIAltarRecipeHandler extends TemplateRecipeHandler { + public class CachedAltarRecipe extends CachedRecipe { + PositionedStack input; + PositionedStack output; + int tier, lp_amount, consumption, drain; + + public CachedAltarRecipe(AltarRecipe recipe) { + input = new PositionedStack(recipe.requiredItem, 38, 2, false); + output = new PositionedStack(recipe.result, 132, 32, false); + tier = recipe.minTier; + lp_amount = recipe.liquidRequired; + consumption = recipe.consumptionRate; + drain = recipe.drainRate; + } + + @Override + public PositionedStack getIngredient() { + return input; + } + + @Override + public PositionedStack getResult() { + return output; + } + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("altarrecipes") && getClass() == NEIAltarRecipeHandler.class) { + for(AltarRecipe recipe: AltarRecipeRegistry.altarRecipes) { + if(recipe.result != null) arecipes.add(new CachedAltarRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for(AltarRecipe recipe: AltarRecipeRegistry.altarRecipes) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe.result, result)) { + if(recipe.result != null) arecipes.add(new CachedAltarRecipe(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for(AltarRecipe recipe: AltarRecipeRegistry.altarRecipes) { + if(NEIServerUtils.areStacksSameTypeCrafting(recipe.requiredItem, ingredient)) { + if(recipe.result != null) arecipes.add(new CachedAltarRecipe(recipe)); + } + } + } + + //Mouse Position helper + public Point getMouse(int width, int height) { + Point mousepos = this.getMousePosition(); + int guiLeft = (width - 176) / 2; + int guiTop = (height - 166) / 2; + Point relMouse = new Point(mousepos.x - guiLeft, mousepos.y - guiTop); + return relMouse; + } + + //width helper, getting width normal way hates me on compile + public int getGuiWidth(GuiRecipe gui) { + try { + Field f = gui.getClass().getField("width"); + return (Integer) f.get(gui); + } catch (NoSuchFieldException e) { + try { + Field f = gui.getClass().getField("field_146294_l"); + return (Integer) f.get(gui); + } catch (Exception e2) { + return 0; + } + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + //height helper, getting height normal way hates me on compile + public int getGuiHeight(GuiRecipe gui) { + try { + Field f = gui.getClass().getField("height"); + return (Integer) f.get(gui); + } catch (NoSuchFieldException e) { + try { + Field f = gui.getClass().getField("field_146295_m"); + return (Integer) f.get(gui); + } catch (Exception e2) { + return 0; + } + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + @Override + public void drawExtras(int id) { + CachedAltarRecipe recipe = (CachedAltarRecipe) arecipes.get(id); + Minecraft.getMinecraft().fontRenderer.drawString("\u00a77" + StatCollector.translateToLocal("bm.string.tier") + ": " + recipe.tier, 78, 5, 0); + Minecraft.getMinecraft().fontRenderer.drawString("\u00a77" + "LP: " + recipe.lp_amount, 78, 15, 0); + } + + @Override + public List handleTooltip(GuiRecipe gui, List currenttip, int id) { + currenttip = super.handleTooltip(gui, currenttip, id); + Point mouse = getMouse(getGuiWidth(gui), getGuiHeight(gui)); + CachedAltarRecipe recipe = (CachedAltarRecipe) arecipes.get(id); + int yLow = id % 2 == 0 ? 38 : 102; + int yHigh = id % 2 == 0 ? 72 : 136; + if(mouse.x >= 19 && mouse.x <= 80 && mouse.y >= yLow && mouse.y <= yHigh) { + currenttip.add(StatCollector.translateToLocal("bm.string.consume") + ": " + recipe.consumption + "LP/t"); + currenttip.add(StatCollector.translateToLocal("bm.string.drain") + ": " + recipe.drain + "LP/t"); + } + + return currenttip; + } + + @Override + public String getOverlayIdentifier() { + return "altarrecipes"; + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(90, 32, 22, 16), "altarrecipes")); + } + + @Override + public String getRecipeName() { + return " " + StatCollector.translateToLocal("tile.bloodAltar.name"); + } + + @Override + public String getGuiTexture() { + return new ResourceLocation("alchemicalwizardry", "gui/nei/altar.png").toString(); + } + + public static Point getMousePosition() { + Dimension size = displaySize(); + Dimension res = displayRes(); + return new Point(Mouse.getX() * size.width / res.width, size.height - Mouse.getY() * size.height / res.height - 1); + } + + public static Dimension displaySize() { + Minecraft mc = Minecraft.getMinecraft(); + ScaledResolution res = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + return new Dimension(res.getScaledWidth(), res.getScaledHeight()); + } + + public static Dimension displayRes() { + Minecraft mc = Minecraft.getMinecraft(); + return new Dimension(mc.displayWidth, mc.displayHeight); + } +} diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapedHandler.java b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapedHandler.java new file mode 100644 index 00000000..95faa19b --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapedHandler.java @@ -0,0 +1,141 @@ +package joshie.alchemicalWizardy.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.List; + +import joshie.alchemicalWizardy.ShapedBloodOrbRecipe; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.StatCollector; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import codechicken.core.ReflectionManager; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.ShapedRecipeHandler; +import codechicken.nei.recipe.TemplateRecipeHandler.RecipeTransferRect; + +/** Extended from the default recipe handler **/ +public class NEIBloodOrbShapedHandler extends ShapedRecipeHandler { + public class CachedBloodOrbRecipe extends CachedShapedRecipe { + public CachedBloodOrbRecipe(int width, int height, Object[] items, ItemStack out) { + super(width, height, items, out); + } + + @Override + public void setIngredients(int width, int height, Object[] items) { + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (items[y * width + x] == null) + continue; + + Object o = items[y * width + x]; + if (o instanceof ItemStack) { + PositionedStack stack = new PositionedStack(items[y * width + x], 25 + x * 18, 6 + y * 18, false); + stack.setMaxSize(1); + ingredients.add(stack); + } else if (o instanceof Integer) { + ArrayList orbs = new ArrayList(); + for (Item item : NEIConfig.bloodOrbs) { + if (((IBloodOrb) item).getOrbLevel() >= (Integer) o) { + orbs.add(new ItemStack(item)); + } + } + + PositionedStack stack = new PositionedStack(orbs, 25 + x * 18, 6 + y * 18, false); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + } + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("orbCrafting") && getClass() == NEIBloodOrbShapedHandler.class) { + for (IRecipe irecipe : (List) CraftingManager.getInstance().getRecipeList()) { + if (irecipe instanceof ShapedBloodOrbRecipe) { + CachedBloodOrbRecipe recipe = forgeShapedRecipe((ShapedBloodOrbRecipe) irecipe); + if (recipe == null) + continue; + + recipe.computeVisuals(); + arecipes.add(recipe); + } + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (IRecipe irecipe : (List) CraftingManager.getInstance().getRecipeList()) { + if (irecipe instanceof ShapedBloodOrbRecipe) { + CachedBloodOrbRecipe recipe = forgeShapedRecipe((ShapedBloodOrbRecipe) irecipe); + if (recipe == null || !NEIServerUtils.areStacksSameTypeCrafting(recipe.result.item, result)) + continue; + + recipe.computeVisuals(); + arecipes.add(recipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (IRecipe irecipe : (List) CraftingManager.getInstance().getRecipeList()) { + CachedShapedRecipe recipe = null; + if (irecipe instanceof ShapedBloodOrbRecipe) + recipe = forgeShapedRecipe((ShapedBloodOrbRecipe) irecipe); + + if (recipe == null || !recipe.contains(recipe.ingredients, ingredient.getItem())) + continue; + + recipe.computeVisuals(); + if (recipe.contains(recipe.ingredients, ingredient)) { + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + } + + private CachedBloodOrbRecipe forgeShapedRecipe(ShapedBloodOrbRecipe recipe) { + int width; + int height; + try { + width = recipe.width; + height = recipe.height; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + Object[] items = recipe.getInput(); + for (Object item : items) + if (item instanceof List && ((List) item).isEmpty())// ore + // handler, + // no ores + return null; + + return new CachedBloodOrbRecipe(width, height, items, recipe.getRecipeOutput()); + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "orbCrafting")); + } + + @Override + public String getOverlayIdentifier() { + return "orbCrafting"; + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("bm.string.crafting.orb.shaped"); + } +} diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapelessHandler.java b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapelessHandler.java new file mode 100644 index 00000000..a82a6b35 --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIBloodOrbShapelessHandler.java @@ -0,0 +1,130 @@ +package joshie.alchemicalWizardy.nei; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.List; + +import joshie.alchemicalWizardy.ShapelessBloodOrbRecipe; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.util.StatCollector; +import net.minecraftforge.oredict.ShapelessOreRecipe; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBloodOrb; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.ShapelessRecipeHandler; +import codechicken.nei.recipe.ShapelessRecipeHandler.CachedShapelessRecipe; + +public class NEIBloodOrbShapelessHandler extends ShapelessRecipeHandler { + public class CachedBloodOrbRecipe extends CachedShapelessRecipe { + public CachedBloodOrbRecipe(ArrayList items, ItemStack recipeOutput) { + super(items, recipeOutput); + } + + @Override + public void setIngredients(List items) { + ingredients.clear(); + for (int ingred = 0; ingred < items.size(); ingred++) { + Object o = items.get(ingred); + if (o instanceof ItemStack) { + PositionedStack stack = new PositionedStack(items.get(ingred), 25 + stackorder[ingred][0] * 18, 6 + stackorder[ingred][1] * 18); + stack.setMaxSize(1); + ingredients.add(stack); + } else if (o instanceof Integer) { + ArrayList orbs = new ArrayList(); + for (Item item : NEIConfig.bloodOrbs) { + if (((IBloodOrb) item).getOrbLevel() >= (Integer) o) { + orbs.add(new ItemStack(item)); + } + } + + PositionedStack stack = new PositionedStack(orbs, 25 + stackorder[ingred][0] * 18, 6 + stackorder[ingred][1] * 18); + stack.setMaxSize(1); + ingredients.add(stack); + } + } + } + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals("orbCrafting") && getClass() == NEIBloodOrbShapelessHandler.class) { + List allrecipes = CraftingManager.getInstance().getRecipeList(); + for (IRecipe irecipe : allrecipes) { + CachedBloodOrbRecipe recipe = null; + if (irecipe instanceof ShapelessBloodOrbRecipe) + recipe = forgeShapelessRecipe((ShapelessBloodOrbRecipe) irecipe); + + if (recipe == null) + continue; + + arecipes.add(recipe); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + List allrecipes = CraftingManager.getInstance().getRecipeList(); + for (IRecipe irecipe : allrecipes) { + if (NEIServerUtils.areStacksSameTypeCrafting(irecipe.getRecipeOutput(), result)) { + CachedBloodOrbRecipe recipe = null; + if (irecipe instanceof ShapelessBloodOrbRecipe) + recipe = forgeShapelessRecipe((ShapelessBloodOrbRecipe) irecipe); + + if (recipe == null) + continue; + + arecipes.add(recipe); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + List allrecipes = CraftingManager.getInstance().getRecipeList(); + for (IRecipe irecipe : allrecipes) { + CachedBloodOrbRecipe recipe = null; + if (irecipe instanceof ShapelessBloodOrbRecipe) + recipe = forgeShapelessRecipe((ShapelessBloodOrbRecipe) irecipe); + + if (recipe == null) + continue; + + if (recipe.contains(recipe.ingredients, ingredient)) { + recipe.setIngredientPermutation(recipe.ingredients, ingredient); + arecipes.add(recipe); + } + } + } + + public CachedBloodOrbRecipe forgeShapelessRecipe(ShapelessBloodOrbRecipe recipe) { + ArrayList items = recipe.getInput(); + + for (Object item : items) + if (item instanceof List && ((List) item).isEmpty())//ore handler, no ores + return null; + + return new CachedBloodOrbRecipe(items, recipe.getRecipeOutput()); + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "orbCrafting")); + } + + @Override + public String getOverlayIdentifier() { + return "orbCrafting"; + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("bm.string.crafting.orb.shapeless"); + } +} diff --git a/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIConfig.java b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIConfig.java new file mode 100644 index 00000000..90703207 --- /dev/null +++ b/1.7.10/main/java/joshie/alchemicalWizardy/nei/NEIConfig.java @@ -0,0 +1,33 @@ +package joshie.alchemicalWizardy.nei; + +import java.util.ArrayList; + +import net.minecraft.item.Item; +import codechicken.nei.api.API; +import codechicken.nei.api.IConfigureNEI; + +public class NEIConfig implements IConfigureNEI { + public static ArrayList bloodOrbs = new ArrayList(); + + @Override + public void loadConfig() { + API.registerRecipeHandler(new NEIAlchemyRecipeHandler()); + API.registerUsageHandler(new NEIAlchemyRecipeHandler()); + API.registerRecipeHandler(new NEIAltarRecipeHandler()); + API.registerUsageHandler(new NEIAltarRecipeHandler()); + API.registerRecipeHandler(new NEIBloodOrbShapedHandler()); + API.registerUsageHandler(new NEIBloodOrbShapedHandler()); + API.registerRecipeHandler(new NEIBloodOrbShapelessHandler()); + API.registerUsageHandler(new NEIBloodOrbShapelessHandler()); + } + + @Override + public String getName() { + return "Blood Magic NEI"; + } + + @Override + public String getVersion() { + return "1.2"; + } +} diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/altar.png b/1.7.10/main/resources/assets/alchemicalwizardry/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6ac12e2fc7b3b2884e97a899c6630c43da9e5a GIT binary patch literal 59034 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 + + + + The Architect + +My name is Tiberius. I was a kid when the demons came for my village during The Wars. They ransacked the houses and turned the shacks into splinters, wielding fire and water to blast the land asunder. I woke up to some travelling merchants that were passing by, equipping the warriors who were futily trying to drive off the demons that still clawed the village. + +I was brought to a village nearby, where a magician named Magus helped tend to my wounds. The magic that he used was something that I had never seen before – it wasn’t Thaumaturgy, nor Alchemy, and it was definitely not Botany. He winked at me once he saw that my eyes were open, holding his finger to his lips. + + + + + Fast-forward several years, and I have learned almost everything from Master Magus, being his third student ever to master his arts. Against his wishes, I have recorded my research and put several wards and spells on this book. So welcome, apprentice. I am known as The Architect, and I am a Blood Mage. + +It took several years of pestering before I managed to convince Magus to teach me. He kept on telling me that, “Magic that uses the life essence of living beings requires patience and preparation in order to master it. One false move, go a little past your natural endurance, and you may find yourself taking a nice vacation in Tartarus.” The thing was, I wanted to go there – I had some unfinished business with the demons. + + + + + The process that Magus originally constructed required powerful artifacts that he constructed himself, but were rather lacking where teaching was concerned. After studying a bit of alchemy and the process of “Equivalent Exchange,” I managed to construct myself an altar that would transmute items inside of its basin into new powerful forms. The only issue was that it needed a worthy catalyst, and so with a prick of the finger I set the Blood Altar alight! + + + + + The Blood Altar + +To start any form of transmutation involving blood, you would need to construct a blood altar and a sacrificial knife, as well as have a solitary diamond in your possession. After placing the blood altar down, Magus advised me to be careful as I filled it slowly with my blood, and said that I would need to be really close to the altar (about a metre) for the knife to work. With about 2 buckets of blood in the altar, which Master Magus reminds me is about 10 hearts worth, I placed the diamond inside of the altar by activating it with the diamond in hand. + +The blood dissipated in a cloud of red swirls as I waited for the atoms of the diamond to shift and reform. There were a few + + + + + moments where the particles turned gray, which meant that the altar was empty and I had to hurry to fill it. After the diamond burst in a shower of red particles, what finally sat in the altar was a Weak Blood Orb. + + + + + + Blood Altar + + bloodAltar + three + + + + + Sacrificial Knife + + sacrificialKnife + three + + + + + The Soul Network + +One thing that I initially didn’t understand was the overarching connection between the blood orb and myself. When I initially met Magus, I could see many sparkling strands branching off of him, flowing throughout his house and linking with intricate stones and runic drawings. I asked Magus about the strands, but he had no clue what I was talking about. It took three years of thorough research to finally find the answer, and when I brought my notes to him he was really impressed with what I have found. + +When you send power into the orb, the energy is transmitted from the strand connecting the orb and into the very soul of the person the orb is bound to. Similarly, and Magus + + + + + + managed to show this effect with several of his rituals, when you use something that drains energy it will drain the energy directly from the soul. The thing is that if you use an item whose owner has no energy left, the item will instead grab the requisite energy from the user of the item. Directly. From his or her life force. As such, the unit of measurement is called “Life Points,” or LP. I experimented with this, and one heart equals 200 LP. + +I have christened this system to be the “Soul Network,” and is used in all branches of Blood Magic indirectly. + + + + + + Sigils + +Magus is a master at rituals. His power in the intricate layering of stones and inks is unmatched. The problem is that these rituals are rather… static in nature. Sure, being able to summon a meteor is all fine and dandy, but won’t exactly protect you when you are on fire. To this end, I decided to link my soul network to powerful items that I have created. To start, I decided to transmute a piece of smooth stone in the Blood Altar with just 1kLP to create a blank slate. + +The first thing I did was to arrange the blank slate with some reflective glass and my weak blood orb. Pouring my power into the configuration created a Divination Sigil, which I could link to my network and see + + + + + + how much power that my soul network holds. What is more, holding the sigil to the Blood Altar flooded my mind with information, giving me the knowledge about its current tier, capacity, and even how much it was holding. + + Happy with the sigil, I brought a fresh unbound one to Master Magus for him to use. When I took the divination sigil back in my hands and tried to use it to view his network, for some reason I could not gleam any information from him. I don’t really see why this is, considering that I used this same method for other people and I saw that they had no power at all, but to gleam actually … nothing from Magus is strange. + + + + + Divination Sigil + + divinationSigil + three + + + + + + + + + + + \ No newline at end of file diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/gui/Teleposer.png b/1.7.10/main/resources/assets/alchemicalwizardry/gui/Teleposer.png new file mode 100644 index 0000000000000000000000000000000000000000..394b08ad78281189973442d0c0532e437a8abc9e GIT binary patch literal 986 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/alchemy.png b/1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/alchemy.png new file mode 100644 index 0000000000000000000000000000000000000000..70819322dbb723c5af4eb70e5fdf6fd4631fb262 GIT binary patch literal 1400 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%N?Bp530R%N1DIGvQXMsm# zF;M+_5N34R|6B_wC{yAZQ4*Y=R#Ki=l*-_klAn~S;FejGTAp8&U98|7Z1!T$rXHYK zpFCY0Ln`LHy&IS(>?z`KG3&^x4`x-$6Zi1zABl922s_K(oHog^@nGJix7FvwJs$3q zJsSSf>rce9ImtbS(^7waW52P}^7*HW*FR|3^?!VO^uI03hVuIQyd}$XfBP-|MmU(=bQP7pA_#fIm}=n3f*wtFZ(0# z-s=Av=bQglzF_Ft__zA&^-|gApMNep{zJ5kZ$oQ4|AA|M%O{JAwLj%yIK%=*a~SWO z;IwsDV<>;nGH-DaH$x&54#fX=c0>KEy}zQXr#wIS&!&Vy?&;oN{hw@Z$Zuy5P=ldw z7up-@n}nHbcw9Hd3hMRbf;ogm^)9){C=aB#VtJ0UD?t%ZG`lje}_itTXKfitl zYl8tJ(dajdS-FzQXDpvfBu892pctb!-SC*i_1C3mET{ADo8yeIAD6!{#ow=EsjjNp z^^@^hsqFdl=bz2^e7hJJKWB@7Y@Gj&CFc6qW$YI7&p-b8^QKI3U3Fh*>Fq+eFELHS z6nX!SIpTWhob%6T%O8;`zOg*D$M88Y-F=*Yl-rDH=H_E)B!A47S2^RRP+Vqz z+-<>I3udB22^gNzjc0EDmD!f8Ji&7J{AA?|WjQQH>EDZUSZ?(hGjIqKjW!FOm~;1h zqV@YcmL}Uxf-mae3G>G8_J(atvq7%j&Qxpc3A=#-P85s_tkvadO*LJp+f%j_xTLK zthY($^W6T{yB{9y?+<5Wh>~G)A~Np`17$bj+wPkF$>(xi1S};PJYD@<);T3K0RW;= B{^S4v literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/altar.png b/1.7.10/main/resources/assets/alchemicalwizardry/gui/nei/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..b1de616ac851daf73b82273aca4dbc6db7331e48 GIT binary patch literal 4204 zcmd^DcT^K=-X0L?DEAu5rR$|z2r4Qd2qHp&4JDyTmnNY}LhqnP1w=s*kfL-GB%ugM zD8b96E1@GuQR&?f2tpv)alh}Lv%BZ+x8K=+cg~qJ^P8FXd4K(VpLu8oHxS?z;{^af z0A_g20sz>+TQ-236TH}?UwMER4$M^;k{diCx!oRsGS6*8TMYO;@yE$_mAs$~K9mU5 zw+Te}djy8KpxpsoH~*XNGS|J(?jinYZ;Xr{;=*EMRT2Okorhi1MTX|AO-}kFhnXEz zN_3|1@>ZNM-@~?7vE}v&2{x)`um{(m24cRAqkMNn)U>GfIeaR;_wI^*o&GEr8tr9r zKJ_J)?Tza1$nWXG-Eo`W2JxXrc5p9G`V=`a>~;zLOJ6U75k*cdSqh|&d&}FtXc`%h zAg&qK7-c=+c+Fh{ulKIF@g3)M%pB6stUP-u`PfhF_r45#uN=rx$6VjC;cHDv69J~9 z8NR!yL;E7hlA7``jp+Tii#(?uXEV4SNmsNv?4Jg#PO<|~&?Np}0icx|Xo3E(Nb7Nk zV_AiS>{RtEuC5{@A|lvOhh85!DGwAO4>>010hW=BIg{$Zex{$JSH6CV~((bg{d z`CNeLbpXKr1jM><0M4Rpe=3$|8pmmBY7P$$BGyqrS$6_YES(-KOapk6jswm%w&4J# ze50AhEEi`nxV8nPV$tKup+dvn>tMshCHMD61;>Rxgo6r76#Js@Da)cztf3)ZwwLLcMN zM<5b@Gc$+4%+t=iPmxd%7fyK^o)ihu=N)+Wl|+b~w%#7E*>qK18g-&A(+MbJnm*ue zF#>B*Ge~|_USpZMwc1~}H!Xf~_EK^I6e-G)5U*nn=?aig;xBfyfD3kFBzBusrg!Gr zZYEe-cG04`f`kkcijabL^K){{xLeI!O02(xCD>c%7s+r3u6GM*MQpv2#evA)$r4Hj zBJ624un1ssaxy%hXd1;QVcQBtJ~8Y}fs_$?FN|N?Q|q8vJkm;l$o7cK+!;P7V$Zmy3$o z(;~SmZ0a;p3>7Vw6{Si#b_pvU4Kx>sl8HR)5~;xtC8cALW}?g+k5rLKfRywEL^;7p zjf&i}Mra9xycHwD$%|T-ZC>@pXkV<*2nq^Hce?_@o=x-R{x+3D_H1CKLhk10X@w&* z3=D*d?gK6-@}XJCOhZLOc|>b`;IF-m+}*Au)?gDB8ltUZQIchlRTv#^LGAV@FO3x% zRAUZVphTZ!336DKRdML7&pP@06S16JH0DOzO_?OteZ<;VAW|1b*eVKS*`6#h$zZ;Bk;er52!f(nIY>dQ5vMLbrBwW_ zwWS=HbfXfFAL^e9fF!ofMmR2~ISCe>*{t8t-c?gWm*Fiie1tMq_VXKWsGiJT6Hc&p z5`N*#(T*ZbShgse4@l{(E456V2{tge|NQxL*$Eyg&2E z9eX(R%bh^OYfC+MBw^-YjHA3NL=wTQpL~n)oN6b#_XtaBM~3!lSdCl8-355_Phf#j zqLa0&YvB~wAYqvMEj5*@k0wazk_!>dM4O3}Lvez3pgIj-?dtr7-`(M|9)iXSwxH9`1H#Kp*Mzgtop{X8@QG_E|Fz! zIJdKs(FKl7B7+=8^Vr_mDI<|?Xa=wLrSLjTlE$nth zZLFfFLT3cDw)*sF>sMUm_z#^GJ@VNxec$8d#5!w*NG5#w;!^HJb}TF`+}j#79UdAg zYKqvwmy}%hq~uw8dzWFcSlKx)13#kkag1bto&Piek5>jQ2%9>Pz8q?{L1snQ_GY>0 z$Q5$MMp&i-nNc&Q*Bu;kmseJX`}$te7AQRd5?b3sh%rv-#~ni0{3FuZrzo_ocU;nL zbq?J=2h0OT(Dt(B+C)7fL&a&N*7uX}1j{GOv4yoyd$H5Fv3shxzc;9;lFr6eF{atrvW(LgBf!Wz2iH?2|r^x(A;upJjq67p4mg*Ps5HT_2-dxSnPsK%2bm8%hCG#$fg@|$ih-`fk1+8(wZug8=U92!cxx?sD_L~t6gh$or9 z-Qz<$SaThb=))mOWtAG5WVQCcwT68<%Fo{!&r*HKF)SuJQlGDYT4?qofd2HD+qca=)%lO!Ija3CQAFiOE48$=#1o05ot+O* zC=}Ap?&N5Y+Jy@x^Yb3Lm%}U&;No3isHUbSHyK@fGe-dE&R5imZ6mRWjhjZbaWyqH zUJUx$jfUWIsfbn8ADQGm^4k1FO5ft*E2)_M0Il8Gry7BaPx3;)@_@c4%>KmvnPEJJei++m}^%#_&UvFMS%;z|+&Gn8K&!1bI%^Cs~ zpJOzG^>SWI%YnY;8B;qv!ne4*Y+-6@T3;6Tv+|yxOdSI({~DK8PT%o2Fl&N+|JK%< zXy)#M`bGy4jQqvv$U+0@DCCC^A4rkA=&?G=fr(wMj}qP58ojo*cA3zV8PC~rbutD9 zHkNGKc1lXhl_vV2=@pofgX-H%wBHL&ew($UN86SW-=tbr6J7CmJa1EC0u&5hTwGk+ zG&iy$o)a+8adyW&aDT^^#`Wjh(b=J(&bD=7@Z*Z{im;&7F$lR%V2`QT!m-*TLfeQQ+Gx*n{&%13v<8OQU>eXBj z?&Vqa)B?o>*(Fmxm5LLBbI7ae)z%yu!K<0FOW&z8si@oumVW>DsvR$$lkDd3wv5&U zowim9!1-f=7T_!wkVE?a^N7E5MSFry8iG3aGSud$2WaKyoCw>WxOcEZaf+p1dtCHi zeswwWr;O)c+w})M`X4+A2qpd`JGe{>#qr(;Im#cz=JX|=PJBxmf@ki%qmbym)*tuO zIjFkBf9%gB%Qz)aXI*NAGSo`K>hKu}>>pezR!DB}z`*6ZMfuDnc;Ni|Uz+V(G6Rpk z90{Ax^6a)d_E`$bW+R%6%%&||L)JbAcJ8)2al_{!GC)Ko2gg5?y?<}|-!a4gmX9k~ ZTxejAW&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.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_1.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_invisible_layer_2.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/models/armor/boundArmour_layer_1.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/AlchemicChemistrySet.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BlockBloodLight.png new file mode 100644 index 0000000000000000000000000000000000000000..67bede34b0014ac5964d4adb386140460a1d1485 GIT binary patch literal 220 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodAltar_Top.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodSocket.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/BloodStoneBrick.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/DislocationRune.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/DuskRitualStone.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_bottom.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/HomHeart_top1.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/RitualStone.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSacrifice.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/RuneOfSelfSacrifice.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/SoulForge.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Side.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/Teleposer_Top.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_blank.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/fireEffectBlock_output.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/blocks/lifeEssenceFlowing.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/entities/energyBlastProjectile.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/entities/explosionProjectile.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/entities/holyProjectile.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/entities/iceProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..9eab38e012662f0b91111f28c67e17062cd1276c GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#E{CuvpUyHlGjX7hY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$ z4iw+(>Eak-ar)?FYktN+f!6&yUr+qH%0$FzN|oT!`Rf&;maZ#?73vFK|=!M(%s3&b2b%Iz5-~5!cxuk#~;S8?X9p z^|>i=ZYJ}4`*Tz6On0x|8|JcM)tbrDOFShW%&=S&&i9>XlJN|Vo|F6@cfH>hF$s2L zzu2Lks226R#BN=E>_5H_a_cm&NWWO3|Il-b*dmU(d`lyyTwT0*;uEiz_xFEf-t{XE z)7O>#E{BMiil$m$M*vVrHZvrm#5q4VH#M&W$Yo$~E=o--Nlj5G&n(GMaQE~LNYP7W z2a2bAx;TbdoL)QGn(u%ChqGbUyZQvS@>N&dY9?J+BPLd-rl2`@`O2&X5*2w0N=6;? z9JLSWv#~Po(5-N0{XE z)7O>#E{BLXtC;N8TRVY5vY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zJ5c<*r;B5V#p%7lw){;7B73fH*zk$Dr&EznM^EqF5&5_06tIPVaYY$K*)dhmFV?SlA@njPR+4UXFDfm3t}U%J|ROtL>IQnDjPbE~5&Q!L{XE z)7O>#E{BMirsy93u311K+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vq_I)5S5w;`GtUj$X`;A};syj~gsVGVuQ1w7o#Fg6-_3;?C7Gf?2La?whZn>Q>l|GV1o(HZBIeP`$v3R+GFk>W1UlO(|_;8=ce7q`EKQ(?003-@Ny5F z#xvjTMrZ2&yKQS_r+r%xHDmK)@lE}PnX{653@UE4rsS7S%xW%P-@UKLZ*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 O0000X~-D_93%-ilB48dh8!hHmdt>NM2UifWZ@-91_wcfAxn^fAt*_r zWQju%h9DsDN)VK^xV!h=y1Vzo{cx*pcXjotQ`P4@&#$YiI{uD(QaaU)9J)<7tSynwbQGs6La(y#1SPWp%R&mgs7fT zOp~o}zeM7jiM@rbJBl_?CI)W zS`mRoQ1E#Jbl^H?Zoe~L5O5r>sCbK~jqE)D3L2*b18w?wZDQAAFK9R6IW{0v6sXNV z^|me;#RR}YlHkPvOap{MXY-o?1;l{;fRiHuxFZbM3p`mH2Td_mqH+KxjXiV4@3*Sx)}fcAa%vTEd~)g$)?i^DGIMhgPQf8<)>}+64p$ss z>)25Wq$tnxS2uQu-R@BqJUU8nt)+$40|gti=KJ2i*{Bz$;AUo4S5~HVy5QCh{pMlk z$PT+U^Rov(!xc}D4!^u#=8KT9jnE`M{?hU3K(FZ9@N@Dg$GNp+&C>?Ti&MxrPnWhM z&H~CrFkr^Y8@+Fz&A0|o%Kf(U4}D#tkp9G_Y6CV^RVqK~=TwTKxK__+Gwn2dOIQ>C@U zjh~rvnQ1}xlzgwq#oA~zr7H9S5>HQKS~SJeBWjJ5K2y~ra3!+rQ5vr(N1Xk|bCX#L z@Tlk9pRCeqyruemKmp5`=A!&5<3-pyWpw}PlS z{?KW-CXkpRLcNV#hBy$;<-n<`Wua$bFs)U>b&XGoewJL8oG8kuLx3l(ME4zk6aCMw ztBw-lu@+iFyps&cjG}a*afmKiK8ARNga9t(igwK#(=moIjj@NuycQX0LON z=SvDr>7|pc;FX0~fb~^pTTL6HDW$C zu%Y=i>nqVgAQg2Cb7W5(Qjjh0D%n*eTj15V*?Prn;|Xj%red<`7^MTSlWe+CCs)U>p$xNM<}(rn*sz%;q^o=I4hhMA-Zp_Ke{X1Q4z`p%XKhY7M& zp(M5pS>k1?@+RE!ES}V|Q?Jty@y4j2#*Wa^%|+?NRu?41?Ll20^C&{Pi@#=Y=5YYD zIr|LKoS;-zS}2E*)R8o=Gu}^kRUso}`y9XUHy~dZ#ANM z`*=2z-m)Egf zf`7Xsv*W%KJNNRF)XSUsmXdxWoxO-JMysPLlrJ;HJQgd$4H1SB$oh3&Q76$<^UA5} zhN8f-BZpm9i-;$@7tR+U7oz|MbpwPX zijPo@u)cC~9P*g^Lz0R--sMN_%(iM`0Zx@!HTh}f)7AD$ZnxfVDV5wu>)Au8L+&)u zcf!9;j*vO5IV5z3Qwc=JMw`c|BzebKu#bvoNe7P3A^aBAeyL@uE#x7^4dvbn>qtYD z%S7%g&dN4PHK}xqxLSUius~aAKhV7@s?pk`T(8E!u1A9b7on zaS)ARDHUN5lFx+c#TndA|5KF?TEdceV~;WLMiNDE2c!eZBRVQG8aIuwfpQw`X+iZv zo_|Yikq+kjC|M-5ii;8`O=;1i)|=0h&u7UE;PRAEl5Z7{e4d)(125y&Ps1WNk!!92 z0~IdOwdWrnCNzk0W{~xH)TLCASPD~M;l*D~tpul_WVJ{abJq`p@%?g{<@vV;w?EbO z<5Of`?7qC%X6Rs8dX6oM(KQ!_Sgf^H+?T6W^a;jO5SU4B#oQ&WP;7jLg?dgHmT#M9 zRfV_mhv<7m+-vWD+FlRx*rGI}Sd9+bnw#3THM9`5T&#Ea6@%tbW{!VW#e`?gVtz6$ zI2W|a5$o0eA!jcAU1@n2&Ux5%%ynaJK{(%czY7whw=(<3+Ou z1@X<1SOo6%2gSw~7fj#Kpn{6&8`A^RU#2oUWApV6Q^yZScQ`^@en@?rz+1N*ohkRd z$D4u7^e0>=Tu!u4>W);Z;>$LUGfzBiD-Aq-wtI-ih|b7(X|Pkc&l8X_B~#<%$y-~R zG(FefpQCpJg{ftz&Hi}Nz0B*a7QC`?M80^$Ni9DckQiFAL^ggs0D^>w-iPPzb#1GMYD<=f0J<^W5~`R6I``H|%MC(VSa_ zv+=;~gtXR&x*lzCO8emXxae%NZHw(KzPqEF z^L<~Cr1-sqyC>W2fpdY7-Pen>hAWS`o(NvJ{j51O8Nr;Sv8AP55EEtZpE^kj<1c@h zq>j3pYQV+sSu;1B0)O;tdUdzAWGI& zQ#B2m-JTnD-`8P^9?eN9`zG@_PBpBNuABxZwCWBf2L<~&zZtDKd_1EvEqlF|)4*Uc zlXyKPjQG*@&$UA5=W=})pXCzT5|mHB`^oGphQ6u{x^hg9THoI=DRe(NQ7TFwBYgjp z@6QfKlu9@q00U4DA5Wh4G~k6#X=yrBirs6S))y6~wkGU$I6;DTu&&!l?z#L50q3m* z+l-gMrSK~N7~uN1;IAB{q=`(73c=nZewsX6(X3|@i$nU@dr zv(has|AGFRlmJ@*{g3s)|LWo2c6oSkyBfk8@lC3Mz%ycC2&_`Zd4KOV@b6LQ+Wq~p zCkB2y`R~DBIr%RC0{bxp*IXH;e#kk3_98$Vs4yz>^aAZ&v;?_b*T0^t}dt z3J)&3T?%OgzZ++S{k+0s(^A7Y??d0K@E@)JDdxX)p=cVx&KMj7Yx0O5Y;~#TpBPU| zH*XY_w*@3s*99DB g)R%AT|6)`eU(w)BON6+#p8hVUt!|)J1-F0tH=0mC;s5{u literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookcrafting.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookcrafting.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ee759fbd6140faf98e3d8357b559b4accd938d GIT binary patch literal 3756 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 DUAT>Y literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookleft.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookleft.png new file mode 100644 index 0000000000000000000000000000000000000000..08b462df1c3a95725497df9fb6e36574e26fa4e7 GIT binary patch literal 11940 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookright.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/gui/bookright.png new file mode 100644 index 0000000000000000000000000000000000000000..8c255a77cb6dfab982d0040a1480c6574eddc29f GIT binary patch literal 8536 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 E7Yh?KnE(I) literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/8wWtY8d.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/Aether.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/Aether.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf829d9d836e98c7c2fe7c0891b73dc0252651d GIT binary patch literal 3540 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/AirSigil.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ApprenticeBloodOrb.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ArchmageBloodOrb.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/AveragePowerCatalyst.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/BlankSpell.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/BoundPickaxe_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/BoundPlate.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/BoundSword_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/BoundTool.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BoundTool.png new file mode 100644 index 0000000000000000000000000000000000000000..f79088b62c785300831b255c1b367bc0e7b0de11 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPqt0W_nWlFla^OtO8uI*xEeAJI7VB|q)^ zTc-blyPAFZ?EhaIE@?QiLCiyLz*?-mHQYAN$Ti znPO3vGi#nYwX9Zn;MB6_gYM?fEal$~LqyLXRxGmI>u0=HD0J$ou1z|Dd+QR+{#CW+ zeq~`OIK~*UU4OOKWR*mTwj8ge+IsaWp{cW$sef31dD|WCeN~bS>*D@(*D&3h*uc6+ T?z=BAj2Jv!{an^LB{Ts5+gp*^ literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/BridgeSigil_activated.png b/1.7.10/main/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>VVQJBnIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^0|O(Ir;B5V#p$J!ef~vC2yx-_HCvyWUqQdqV5<*vNmUw|$t{qH?d>>2jpd z`g___E{Oe_rBar+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.10/main/resources/assets/alchemicalwizardry/textures/items/DaggerOfSacrifice.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/DemonBloodShard.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/DemonPlacer.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/DemonSlate.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/DemonicTeleposerFocus.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/DivinationSigil.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/EarthScribeTool.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkAir.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkFire.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalInkWater.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ElementalSigil_deactivated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/EnergyBattery.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/EnergyBlaster_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/EnhancedFillingAgent.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/EnhancedTeleposerFocus.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/FireScribeTool.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/GreaterLengtheningCatalyst.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/HasteSigil_deactivated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/IceSigil_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/LavaCrystal.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/LifeBucket.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/Magicales.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/MiningSigil_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/MiningSigil_deactivated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/MundaneLengtheningCatalyst.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/PotionFlask.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/ReinforcedSlate.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/SeerSigil.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SeerSigil.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f6c0a0fc444c8510b2d784d51684cf3fee8eb5 GIT binary patch literal 593 zcmV-X0WFU8GbZ8()Nlj2>E@cM*00Fg0L_t(I%bk-=ZWBQe zg}?5avCTL_VFP!F6l4>`saOF@0!IExOo$LHkhlwC#Tq4G$4DR+zC@fEXWTtqEQ}|y z>@31twVtXz^($2wRR!SJr?djpww~6{xrNLE@VMDj5h0FaE~ise6=Mt-1HkEEVAcVm z#bf3i;{CkIT7vf&!2Sd5G#VO0Ktz^+C7=?=pvvq0K}ok(iQ|9>18?ual-J*>s9ni?NpRcwD{6vRMgOKn}ZS6yC08jS9RMlBD4I-Zq2L zXgR_{`>idKB;lZaLaXx#5y2M)0yyu9DiuWh>JYE1-#x(?IPU*g@+Xss4%a|JWJ`A*=_eD#lt|o)cFB zFZQ;Ht5sB$!h2Me_s1igb2s0D0)#*a0V^_JYe1riJkJqp`TXUpx&PqaDga<3Nd({` f%ZgiHz literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SheathedItem.png new file mode 100644 index 0000000000000000000000000000000000000000..beec20e9345d6675b3b7ccb722b767ab541e6f31 GIT binary patch literal 474 zcmV<00VV#4P) zK~y-)#gn~C13?spze$$OC{a{I(D<`pBN#-mv@kwHM6gOqA3$uZ?5u;0U8Hquo2VFPCr_D}n;Rl_0M{4-gm|AYVegMl;qiS%%FYK_ ztpNxGYQ~^d@BSw2a9B;UwfUkVVhpLf^HNM3wr!hF5wudofoj;{_*SuydRCS-6TL{? zu8-?&NXhY$zGn+KxSL{q$yM>V#n9%B>Q_H64~<26Xe>&jbtX|b_3yv&8`%>V!Z literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfHolding.png b/1.7.10/main/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-IqP)WFU8GbZ8()Nlj2>E@cM*00Fs4L_t(I%bk-yYgADX z#eXyRzJ0z##WrLS>l9W7C5>MpAh;j|`~dkl)&YwYAwo!NXlv5mG$vD3_n)F7vY`(~_+;c=} ztVY8DqKaDv1X0Dh_o!u5!fg=&hUK24fGfm;kaAD35{m00000NkvXXu0mjfucz>F literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSeverance_deactivated.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/SigilOfSeverance_deactivated.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcc68cdb991eedc403e6b47e229ba86a0d0888b GIT binary patch literal 614 zcmV-s0-61ZP)WFU8GbZ8()Nlj2>E@cM*00GKLL_t(I%bkG9NLIQ&PXdEQ~0-3~&In^G~u4 zkSv3s3r2c{_yo~_my}3k_-vo;PM1dMl^I6j%3#KM@mW?JG_%(h6-JFZ$nRG*2E;kU zdBi7R2C8g#`@B3j+B!Ks9^W~LYHTJ|Mk4I>2lv)IJZzz+oSYtyS4!v?U!+-nV@Q=k zXN+4d#5qhOL`Bk+YP(IGPjTY^?ZHwz{U6}U>|6}+A+Fp7NvNG);w4=VP?Yh09WzD6 zffKwhVWyZFNjU?ccGg)BFpE@rZ4$qMC*h{~gsqEfZt6AmxY$B26nyS_kZ&b%=!Z05d~y)OweQz`_Cxa-tfQ_IEs%jMYsR}010qNS#tmY3ljhU3ljkVnw%H_000McNliru-UI~{3nzPT<^ccz03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00H4iL_t(I%bkv$uP9#=k-o(KHrXhzeFA5>G6wwH8akaNKd>PJ*RaYina9F=`q?uu1*_Nw5|K zL6nf}ubFuk%dJ@s1@o$Tyy5eG?>ldlhyd{U*#Q7&?|1m0P*cE#x$EMbrzmm&f-pdb zhSC-|@7OK3)jt8}TUW%G2r0p6gDAmDK~WY69t6C2I!Om(T5SJ#rvQQ}$$5u}FzCMF zQM|@->oo!x6A_u1$=nCxR-1mbNkG8OQ}<3Z0b&VV#3b(lFwU0H7?dbN39EKdtYnK= zZ(0BHd>=qh0ef~w%}3Y7hyg&CF@?$)bT{jH2XS>CrVFzk0G!qrW%cC8Iv=M!5Ko{C z%gHOA%3Vs8^8MF0_Uum6gDMG`WYq{y@;hiW{q{y(f1qCAyluRKKALzO-cCDG6p}Me zm*^)IWO%SZZqr(QrUL*+rSP!zlE4S_lMP0PivWx|?`QU)0f?gnr%C`;^V{^h>rB!f zNF}(E-r%T5GbYX_S7p@RVw6>i2n>_Ab^UREi~Z~;yY|mk)&LRVTzpx?LlB1OP~)t{ zdW%sJVW9CiGJDwYpf>T0xg%jMYsR}010qNS#tmY3ljhU3ljkVnw%H_000McNliru-UI~{3pyBSir4@E03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00HSqL_t(I%bk-=Yg0iK zhM&22<|b)So0On`Komc^5wSI<7A(3@X|3Q!aN*jY5QG6b zG$c00dB=9LrTz&xpIZ`RA|wH$4Wa}qF>w+jco6X7DHe(tlVhv6e3MW6O%gTW`|dY(Y-iGgGzn?<(h)xN-=NV{=hm|N*_q2YZzokt$rAy-wf*s^v8rKR41{DXmQH!2}>56>us6pwoXz zwX#aPTL(!6KkmNephr_C&KIuA^4vWdy;Ko_rSjdZ{=WZ$y`=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.10/main/resources/assets/alchemicalwizardry/textures/items/StandardFillingAgent.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/TeleposerFocus.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/Tennebrae.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/Terrae.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WaterSigil.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WeakBindingAgent.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WeakBloodShard.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WeakFillingAgent.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WindSigil_activated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/WindSigil_deactivated.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/activationCrystalAwakened.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/activationCrystalWeak.png b/1.7.10/main/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^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/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemOrbisTerrae.png b/1.7.10/main/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%ZsTk_jYh;)W1r}xZ+`{o_6D}qJ|szU@?5ifa7^dy zW-dg`GdH&*jL~Rq2}2*HEJ`XqK3;jeyA%sQm|m7-sUirz*6CPc5wzNe{LIApY0gqf zX-ZbAK0-LeqXJoIJnu`o(~5{rrOi@N|DA7PfG7achk+tgr1c8fLhzL!}~!;}<;NiNJbr4Ww5_1u~I b{?2>?oh6k!r^M>F00000NkvXXu0mjfg#f)% literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemPraesidium.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemPraesidium.png new file mode 100644 index 0000000000000000000000000000000000000000..8bcc782c5b493ed89cece11842547f6d4cca8a17 GIT binary patch literal 456 zcmV;(0XP1MP)OkPkaL0;#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+o3rO) zrHK-vrTEn|KR#yQf2VP(v2m(#-i*v!-af1Y@Y>F~JuBtcz|OJ8bkpE1gaAUsJ_Wj0 zL4E{wPc&{Eqy&T{5d_F{Pl%CWyX4{gDHmHJ%Qe>X&#i1_pcsW62 zdU?0GL{*hh?&$Z&{Tt;dpav2nK%9Mp#!($r z!RC&qz9oAOcqhDdJhe^1xJd7M#to(sfW782)&|Pb6GCLrDgbC-%=yAB=p*0X_jmFR X^mUPs@aTw)00000NkvXXu0mjfG~u>9 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemStrengthenedCatalyst.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemStrengthenedCatalyst.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc9c8aafc34c7bd8bd311131f9b1f135fc1b926 GIT binary patch literal 430 zcmV;f0a5;mP)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/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemVirtus.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseAlchemyItemVirtus.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fee0063dd8ab90fa81768b2258d4a0c3753ec4 GIT binary patch literal 417 zcmV;S0bc%zP)?=+3fG%`~cq|-bGJwhkM z))nzK1odM?z&Ef2CT0w(%C;7PsA?uybG^m;+@ik~#2V#zji!R|FZb0vnvrQ?)WI9O&oC6=p zFastbumVCGP`|Q4RoTRh2)M)&xDSEX)CC6)%aW-XSFLV%{ao9Su^FGhQH*#JJ)1E# z<1(3Rk4b7a*Na6%9=WRodMT~*)~&-lSFLTjunw~BWBt|GuHX3w(HIKydtBNj00000 LNkvXXu0mjf=~<&E literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemCostCore.png b/1.7.10/main/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=RtYXvA72ehcuimYWXtlT9WFU8GbZ8()Nlj2>E@cM*00D1FL_t(I%cYacj^Z#7 zMUPGAfe?9!7!(9M{{Nd;AQl}9DI}7WSh#vc1_q{QT2m{lWS_cKx2!~j{|WsrX^atL z%s-Jo-cq$@zu!~WwTK95nyTaR_;&?LDU304I2`D@4iRCoSm2!dqoOCk{lPen6JWVq zQkEr2lCWN{UqBzf_nzlDr_+fL0$G+JB6#mnN>SJKbPu3u8ug?ggh1c-jN=GEnx=T~ zxn8f#W-|cBail1UUv1xQG{(qwyTyBt)*5RqX`14kBS{jnEW=t$S(aF9vDPXPd2S&| z5&&+u8(M3+u4A=YF`v&Fh5-QY{WPy>2KVa2F!1^LNeBUeD2k?Y+qOheMBBDBO`~31 zIG@i9!+_SBs;by*HYla&`<@U2T5IAsez8$Ku5wjXA|mW|yD8T+4I)BO6j*DYs=wH1 ztyPaU<#~=$3hzD6xwo6BzWYpfP#niN=eS%h>PLV_kcdnQe+>98z5rm=$*7hJ#T)H=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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemDefensiveCore.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemEarthenCore.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemMagicalesCable.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemMeleeCore.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemObsidianBrace.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemObsidianBrace.png new file mode 100644 index 0000000000000000000000000000000000000000..b4016353ccbb9c01ef9a4479a62e4f527edb957c GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DjSL74G){)!Z!AbW|YuPggKW?^vwZq=#UML?lTo-U3d7N?g^+RN8uAmXZfeyyu8sd$2L(tMc2K<{7TD{Pm*Q RwSc~3@O1TaS?83{1OUTLdwc)@ literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemOffensiveCore.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemParadigmBackPlate.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemPotencyCore.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemPotencyCore.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d993e885cf8f138b93511e7303abbd072ac7ac GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)04gn7Q4@9w@?D;1OBO zz`%DHgc*6>*=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/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemProjectileCore.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemQuartzRod.png b/1.7.10/main/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)RhkE;e!fgJD`wkW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`!Wy>Eak-aeC?Gv#Xj7L|XQvL1>h;%CKmXjrDHP1@ z#NoGm^8UMd5!oj<@g(zvhBAJr+Uvq~Vj2Iv>aIl&9F4_%$vg~EuQPO6PhQ!5O)6XW zutCB8`;x~eKL0G~81*{R&GB{!^P+7U-Pjc=>zYu-@3~ty%8D(=Uh)_-`>6MaFq1tuI&PQmK(ELKF_#4ZCmbj=QXdZ7-!^d zzoxYG&pvj=n=7TB%fw!v_}tR>vd%7p*NzrE3l2XNaF%UL+})Y|pXET^{^y^6=9nAK g4Y{~p^iRq@2C3!iGS1Ak$pHnSr>mdKI;Vst0KJs38UO$Q literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemScribedRunicPlate.png new file mode 100644 index 0000000000000000000000000000000000000000..81a8df869afc1077e9394600998779ea162d1fac GIT binary patch literal 513 zcmV+c0{;DpP)03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Cu5L_t(I%cax5YtvB_ z1@O;{V*LhPojOQMhi;DYCQ-yev`L2+x1#@?gFnF^gJyj?x>sn1LaBs*&j~qaXQ{@l&vpp89YX$Z0N7euvKc~N{|iuTB5$p(8ZIm- z4iA-kdmaym;Caqr8sPloBj>Cgf?QR8bh}1nX@K?dU`=Zhs4>m`(aH+_zO_zAiTf$J zlM>j#jVX;zX^^YRw}S%>6nGn>XEC~&k`l+bK1;;SW-~urUe@2)0qh34X--uAW%L)=Tr z%NU(Qi4XXK_p?NNiox#g$!Y3FYfPiU6VGd000McNliru-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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemStoneBrace.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/items/baseItemWoodBrace.png b/1.7.10/main/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-(|JGDPIVjm9A`q0uLKI&d%8G=Se#D&^Z&m+vuZ+HRKZX4s1H(IOQCWu8 SgBn1i7(8A5T-G@yGywo}^Eqq) literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/items/tYf5ft9.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/BlockSpellEffect.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/BoulderFist.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/EnergyBazookaMainProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..6be1c2b51ac0692f5cc0efc05f8492bca93b02f3 GIT binary patch literal 1948 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/FloatingBeacon.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/ParadigmBlock.png new file mode 100644 index 0000000000000000000000000000000000000000..062cfc791a535fd72d58f2c3ef6956f5e482bc2a GIT binary patch literal 923 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 JPDHLkV1f~wyFLH_ literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SmallEarthGolem.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectEarth.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectFire.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectIce.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEffectWind.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost1.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost1.png new file mode 100644 index 0000000000000000000000000000000000000000..187b96039e3b618ce348401f25a2253247d3bc40 GIT binary patch literal 4871 zcmV+i6Zq_jP)VGd000McNliru-U1pIFgl^9Y0v-w5|l|q zK~#9!?VWp!T-ANYKj*$@X5VK00%IGmUu&-c+i_e#l(bUPrm89hRHBfUh&R{z6^Lw4&_x#R^`|kX_0(j>69}7yzcpSwgKpHp!Dg~kuFhCs! z0uV{S2c;nVDueouH$C^z3N_H*N01L_Y-#4cbvvqlKQGW9g7 zt%O2x#Q6x(0wMz{2jtI#Cy|Qjj?W?2_~VS10F=9+ED%OKxdKET^zTpOPxT=H z*$YAkypgz!ANfH5n$G3T8ete-@Z+3w7a%lHIxr<}1P1Z1c^xwhA^VFzl>G@B;tuSqtC(y zB}%SIAQcCT4rq0;Yw*YKK?H*OR00A?82A_bIOC=`Zs_6~E;0@Es*VH+($)YX8JT){ zD4JAZ#<4&U1%#pjI0@LG`aoP3tqPO^CdJ$jjN>XG3`jO4K!9nQ7yLNmrZ~noP^d`T z3%*^R1g#I48Rr3dLHW^AP#po$1T;mt0nq?zcN{m!*fOXBa|r&nvKU~?S5~TlzBIb7 zz%cOg9-bedDM>PwL;*@k-aiJjT6H|%C-ehyIgi#$TIlc3Vpt|&5Tbk!WXK`c$#V$dBsz#8kLh9>n9LM7QBOXb|qCTP1P@h7DA(|2x!eCCTjtZNL^pM$grwsTh5=G4G#vywIoBhXb+HW%g`}ya zf%~6%x2isI;{(go$rC5h5i~S6vFf`!YvOaq19cqV7@$NJl6A?`e3>#GCOZ-@P=sNK zp~Hd0c^plW&!+J_pZ3V z%hA-B!t-@nniGUFq}6dyQgSGxbD5z?_vZ+d0-?|~4a+tWNrQCG3EJ^>2^b`Cv^==%Xbe5Jdp!cvOTNmaWScCn#>#V5FCej}fpZ80gO(J{690RQqU43=MEGO0o1 z`i|zR^H)M6@O)e^z)mD;_QDF|go=v;4gBV93zhOc`i}Q=$TgXHi3TM3&fSYtsNm7f zl`YpEzh#y>(vw2?{7(Lu(VJsn_m>U2JIJs43D) zUsxHwjY*TFQ#}(}KFVmJ)vpndOe|(=$Zf_c)nuaZw|{>0r{-Ui=*^E zb2Lygt2HDDeNG(D@U<_@RA+9Zc^yc2+25Tf}$$y5?4B|(@S1bJ2* zG{LZZ3sCCl45B=Rl#=&8beS{N!ZsATp1}8mI8R|Pr!@-wZC%4oIn*Up5v7|wStmV^ z!88r*WP%xXfMHpfr50`s<6u}M9rNtQsUh8Z?JNbbZTkW7+;s^BaL=!DBMP2TpU_8s z$Vvqu3`cxM8hOa=3@s)q$ zOAFOU12B8CMPF|}|L~(8QKlV3+FjI>xo!J_;(HiP^NRv-)hv^QU5DqobbqXv>;wQb zG^G#%wpMskpPX$C%Xk0BAq%EE{PP%izPB$*A-{ciyqryyKQM>jMyG)%|9&?`@uIL0HSbO$+A{Vr` z(|vCjWT9qqsSCOo|ipiqdtJ@fta?71JGm(V<+|BM1VNl4LU;sX80m zwkQR0N|QNCM(g23!eJoo4tveA6O`dA&Va94JYBKlcNvy+B4T zkDYJN(E!JBfDB2;0&+Cer)YNqG$jziC~6--GGWnkR5Gb${Hj&oKjIZFjA)3p_hhVE z3J9R%@-qXc!Z3_>T^UAMUPhI7A&HSRKRuA6u0AoM=7&;HiRIYz@;hgxsf9>)IKNjK z1y6)`XD9&AKDbPIULMa221V9`HPkArp$jfcawh$E>^{!&g)OI9jz?bDGcj4`QUET< zrOOj2!pJ{HRT_~qQ$C111domXbKSJ0wP=}cxc$qle&EqD-@}G=-yHOP^#hOA?p75Mkkoru;t?$&dEJ3zrtk2T$}4Vnz?3SLq)u#l!Rf3rfF3V`pQ~>N{cXE z&poU5l`PZxPMqZH$7XTJH5q8`12i7ry@*i3QKR>q2*9ha9j+R$)p!5(5Esxn4lbZV zI5g>;UHeMttJm%4@g0kqVF&!p(mkk?u;KVp_8<0n`cuCfH=lp)%2q-p`QJB=54yH; z`6RBrX0qD;>yJ;ZUOJD84QrO*=L13|$>jocP4Ury&ios0W5cEwhn@Tln_gr=d;6f@ zs~Hm*1rt0|c z!z0+X%_GmhQ`NxGp4Q0ry%_>2p)o-agxIEzQt;@KJz&D;d*(8b3s6A>guT8uOFr*M zeUvEnd1cd!gC@L`y6@@&6EYzgQ3jURs79uiS^|17*M)d($Km0d79p?pAHOesN2*(Z%z~=kn1uaUsa(1AYpS zh50QWhGk-z2LJi%@_pVt7N?WrEa0GkH|AALIqTKk@M_%t?ca)nEiDSAxbx)6v(l2G zg&}v2QX4QP8X!8E#DT@r!eS=zB^8CRE9Tn8Oya*Jqqf3;rLzT)S|AB14PhLGU{>GCim4l}bEds+}?d-Qvz&ASQkW3|6 z+aBf2?|*F(vs!i5wsj(OcAtt&zL)!Lg31WMNaq3^ za!uC%`@YHwL;h-x8s=OcLIt{E^2js4o0z0?nN>Y?E&#*sYORz)p`ErvRyQ^FANH9y zeQf*cpLt+;RGY5}!Z5_k=MkEQX*)Oxn=gI+)pM7mI%Vm^NEphxmv)cJYe9QEKvm)2 z(*$7GVOd1-3VY{D3q>lWeaFfdo&08RdQ3d;pRt3Huz+((*=(-t7W=~TdEWGv^Tz^w zVvac?R==&{6zRyg{|jT_c|KwR1^Tq37 zBDL0t(P-VOt8vpVp`f_Md-GPG?z^LxGxz!SQwfs*=04lbLl39$J%4B-Xj}w9#s6I6 zeB)JC07gsVR7wr?sSy)GqtUM42e|HFH>K+>v~6l1)UIuFdz45aEY=;?G7(gcHXi&$ zNsdGOg?74cfQr2|dZ>7;h)ZR1zFvlxbkp_{yQz$cd*Tqsg0ZQs*3Lea_S3xF#x zlVCU{;FQKMKDmpwb+P8J?n0e}xj$&fG)>;Se-~?ZU5)P>HBAJSqjV;H=4EdswB;)+ z84AYzTW3AJy}hho({U!?+Sml(>X{}=DwOgubc1{_xKN~0x@LZ3*`kyEACHc8ubuNQ z%7dGK*2bGBEV|crq54Z2#8^O)TzFvqTeNL#2L%7qRh#{RPv5gx>AGU=!s!0~@!h#- zN@AM^$~15imNGU*GXBlZg~iGG+7I6sasT3EZ+yk)JO9;B_kCR`50?C38M&N~ZAXPK z8-E$ny{ZcYT(xxtKkrNff>nQ1Ik;wcd7mH*;6 zr8jl~h$3>G_m3-PG)XMS9#kk&aUe57(TO~hb!G_`FbF7#v4GOwLPnx*fpD%KivZceDSpfeE(B>2K{TDQrElhu1-3( zT}?K73Om^Kxt&E`OLwf`w|}-B3|RK^AF%Vr*FnM`zA>K#(;akEXX}5DQ2^G~xG-ex za~1NpqQk7`Zao$4D`4*C$mj1~6P;$(@xn6NwzaeG?yl&cSplx=V%v62wp9rO7EjX# zxy~PC+b_ERFwhYh|8iIy~6xp0x z+FzV)|L6bX9d5mL7IB`xkoO<-z1(lrrYG)Ls7|@g^2g+Qeq3W2N)(dE;uzqGI~EpQ z@Ar0|I&7+7@(aRHaAT#EN~OqTGOYQujhFLCBoo~8)Q+*Hf+PClt6PV~w)Y-}dD9F+ z-(&LhDP=M6(sl(5TmhDC;rSAwOX`v>74;u(Qiq%5T26d{3a<09rTZX+dtaN!70zIH z_t2HmGH`v@($i`o3;lgx6(@W59dAPzEop~NeD~TY9o+U*d(on;dit%(E!i!fX;W3y zYQ~_|7Y!Ix3JVV{PC476l~P!^00|GhHuU!~3BaZ=uTbT+(r4Z@lh6-htrSDFQc#zy tqmuq#ezt1@4V<6}nxF}qpa~j(`hOKH?y%}R#R~uc002ovPDHLkV1gl$UYq~` literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementCost2.png new file mode 100644 index 0000000000000000000000000000000000000000..0a340ef754b97c9b9be376f9c2e8d0faabd8734b GIT binary patch literal 3603 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 bFEafVGd000McNliru-U1pE5h&S+rKbP@5OzsK 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 XI*x2&VGd000McNliru-U1pE8Vc_mJ%|7R4PZ$` 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 FV1kO3i^~82 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower1.png new file mode 100644 index 0000000000000000000000000000000000000000..fb711dc240ddcf80268405f934229e63742af42d GIT binary patch literal 4449 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d61b2ed1da398b77b78dc87dad339f2d04be5f GIT binary patch literal 3738 zcmV;L4rTF)P)VGd000McNliru-U1pCGaj-8qHq8J4kt-O zK~#9!?VVk09M^TnfA`**omqWR9~33I{(|Ee3T0AI6Xc~Y1=^|{KN+Ne>cjlfx z?A+1plC(a!yWAysfPtv_+?jjsIsfxN=gcVPkn8K#$x5X#TBDTWN*og?g%Y78g0B?4 zT4P19Krk_(SU}nK&2LJnR3ZohmP?8Me*afZ|2=1i2KcN0Nu*FHpp+ttB7Sx8;)34y zd_~W-VYyO_S&I^3ERHFOPy{BF;)YU0>A?oD9dIK`sqEj$#BbSk+~8L#6~Zv2+htA# zP=Kct<01e&p*01iC|k=^93#1XKTDDYzY%L~+Y~K|B9u~StrxEX2=J*0lOpt`ZeTn$ z{|_01)BVfV(re6u-^lKr&k_a!)oQin3b1#02TCcXr>DDK0p|2y)4jcNAxS7G#cBW% z3R<%&#Q}xX4P3RBHA=De+O-Ash5KInY2GNY_mx*$f&so5+}`r*v{Sq}O@mUbRElY9 ziIn1DV<>7(Vl60zR*FyKmiUpLK`fRwUz@Tr%*~EB8vb7rZK%uV}6~2zRMzf9>@GLj)}D910VtVJdcSa;X;z| zv9(+RKChu8Zix_TO{jG(glyxD1VMo3c`d(ArBcB&hB%HFg#vg6_>BmwQ$W`v!v9t( ztT%>U-zTV6S*JCh#4#JSX3AOyjp6YiAV?B!B?%u{i?x>GQf=i2q9{VF zMJa`8VN?mYVB{3O?`KM=wPsDh zvLs8gBumo4OyIuPek%J8j^Y`EPC=AS5?)UI?!JSg_`Z))3Y#MQ;i2a;-)f9ODMgYb zD5V(Q^=AOQe)vQkFms&!g>&bc>Jy(H92DoDjWK+9{(MV(?(cr8&^({=0LIDVEWiZbNB|Hw&{)?h739P{+RfJlnM zn{gv~0M|+;&|ODFC>D#|PXy%=?EWJsF`h>f#~5QcFmkGHo9Fv@#^4#l{=+A-ZLc3b zG2@|EtJT_!zw_isa!O^IOxn15fX0xlRSFQtF+)4Pzc?_!iSKU61=4_l=YMwft_NRU zyH+Ggcyw}7U0%CZ9=U#f!Te!6vVrZqPTO1n)CPNVe}6*|eD$t3mLKrD4SwVKyB$0& z7V+jXrLB-42wFy;9y)rON~OZy;T?0beoe6e2S;&?VXNIuTU@}?0|VlKT|Qi^R;w7T z`S8Mpd1=JfZQBHDyt(Ijh)9i<^E{N+oO}QMrfA&OZQCTTT&=P&oBR94v4~+9^8S18 zb$1vj)Oc>CR2JfhNG-eO&%d}bilSNwm;xwcOs%j|>uh~9B#I)IEn8NrWo&U)P(;vL zFOF;=IRyX^YpKRDx`_i+jbnVztDQIH=u72t(_?9CEn%@prBZ3B8*>w7F=PY1BuTPx z=Frj8nO55-$I>E_`OJJ$=Uz>&6UQqY7&$c~GgmH`3B!;=p}^K{+r(O%F_MkAKx_13(N+T zcJF-lp3gs9iWcDI91X3t&N6TLO5J74md#2Ig<&|OjNG}tMwyLNYP4MWH1*3v&(&oI z+sPVUezR7s|Hz9dr0EX z8@}%oMG;!-2T}m%uZzVZQ4}>jv)HZjN8kC50KEIoJIYOxyG;%+@An#kpKgNhay~py zFy;IB9z=e;=Y<9nd~Rv<=R*XE2#K{>EkGXl%r{%NWne%WK~*sfDV583#ypUP=|oz2 zbAP}5-IXi!D8&yqZQ>uUT)_Z;aN|ZtTPN>AiwY;2r9j;zW0R9?NIQntmCH;ALFZcl z_s78CpeUsvt@v@VY`!|y7*kj4uZ>~POF!V?$f>$+VXbur_*|&w!Ys!J+$(T%l}dYu zchptrx{4eZ9_~MKvMwBJ7cks1FpyEhKe>33k40Fa6oK!vDvs%0xsstxn>x2DIM3Eq z(g*4WD&P9#rFbAtl5BB|+wjnHb+K-qPiQRVZbkydRpSI?D;T8o!;}zYD+{qi@%MVh%JqLTBXI znXHhc5!mfYS;jX{{;c-EQc_1mu-0vYqQ$H1CF(8h%B0w4P26WVt{Uv^BXtHWRmcd z=W(G@p+5+ivX&dxl8Er_@$t6bSGST=UNq9|vkVhBFfrZS(n?`}<{cf4?;P|9uBXaqHdE@ln8mkyBZ{-fWuf zW_nLgPu5)%`Ww zy|)*DcP1wI5_rD1moNKWM=5sq_0^rH*+k6DD(XA(@7J!e!SncbPfyFP-&6~b z58?8&*vo}%&dj?OuyVOf++Za}Qm(-FJgl`dEJ&U~oUMm`Hi<>JWi5a5;Wdmg{OQ`Y zZ13&mAIHWxd+i#3ykP^+r^@j9rAtg(%jeb-1OY)1w7g|(wqg&X6jQl^lTL0UQ&4O0 zK!iuW{PMoEv>lBh|G9p>EH{R+N`=4JxG`IQe0&@cVMlJJ9~vL00K~xV_3LqI=p;#+ zJ_8*^J)8e`rQFjS|8g(`2-^5s{pHktQ&{&#zOqTg#37(6cJpR3nQZ3zL*Sk}yqb-0NpnT&- zvme;N)~({+u{)ph@BF>T1>o3!{Z`HP|GCyJ$s7tWxOJ;ks#Ss@KtyV9!OAso%vTW_ zXTI}?4s0&9h%GP=ptL3o0?O&kcOhIWYU_)|VqGbBH!)`StMJ{T*q&0Vu8mtOg-Y41 z+1`ltpc14na&G21m!!!=5I{MK7~1juIt1GchO9A7?0MdzXs&FO6XWCjyiH_OQ!GFu zk<&PM&8T@_j062uvaE}~BjB+lO_dinZmiWjeDOthD8R_*+muQrj4}AWPq|#a>)SQ& zSMq&)zVFx7@+~%5v2rChZrtdeFmUU(ZK43BHKkGssMXiar*o$f73Tq^YnHrULa0;G z{)zE%eBi}LAH{vN%5f?GIx)exwfy-LPjLJ8?T)-(FNz|k1dH~ z_`^<9fL5EN#me-p&^jZ}9Ig>yoiS8_+qZ91P>NgDGC4WPGHM^==r|0J_i14m-g#3< zI{RIiIM+)Z^4r~~)Lwf2dv*Ja{`1cf5pLbOl>xtQ@951_+cOixc|gAaF_ zOp+v_TCL7#I#~?z%*c7=mbtbqQDsZABula+OVT0o|Kh8o$)-;jj{pDw07*qoM6N<$ Eg3IVN761SM literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellEnhancementPower3.png new file mode 100644 index 0000000000000000000000000000000000000000..7150c0b7022447204061dbea110ee9f6d84fe415 GIT binary patch literal 4062 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 Q`~Uy|07*qoM6N<$g6@&Aga7~l literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefault.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefault.png new file mode 100644 index 0000000000000000000000000000000000000000..f72ff9f8b68a33a7c7832535d241de3b10143a23 GIT binary patch literal 1193 zcmV;a1XlZrP)Z5010qNS#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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellModifierDefensive.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmMelee.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png b/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/SpellParadigmProjectile.png new file mode 100644 index 0000000000000000000000000000000000000000..f579c0283fc36a62f396b78694fa9720358bea1d GIT binary patch literal 1229 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 literal 0 HcmV?d00001 diff --git a/1.7.10/main/resources/assets/alchemicalwizardry/textures/models/WaterFloatingBeacon.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/WingedAngel.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/WingedFireDemon.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/WritingTable.png b/1.7.10/main/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.10/main/resources/assets/alchemicalwizardry/textures/models/altar.png b/1.7.10/main/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.10/main/resources/assets/forge/lang/es_ES.lang b/1.7.10/main/resources/assets/forge/lang/es_ES.lang new file mode 100644 index 00000000..b7c198ee --- /dev/null +++ b/1.7.10/main/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.10/main/resources/assets/forge/lang/fr_FR.lang b/1.7.10/main/resources/assets/forge/lang/fr_FR.lang new file mode 100644 index 00000000..bd01daa9 --- /dev/null +++ b/1.7.10/main/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.10/main/resources/mcmod.info b/1.7.10/main/resources/mcmod.info new file mode 100644 index 00000000..7000cb30 --- /dev/null +++ b/1.7.10/main/resources/mcmod.info @@ -0,0 +1,16 @@ +[ +{ + "modid": "AWWayofTime", + "name": "Blood Magic: Alchemical Wizardry", + "description": "Example placeholder mod.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "", + "updateUrl": "", + "authors": ["WayofTime"], + "credits": "", + "logoFile": "", + "screenshots": [], + "dependencies": [] +} +]