From d617911d7a401e4eda08f23075e6523c588761f5 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sat, 24 Oct 2020 08:59:04 -0400 Subject: [PATCH] Creation of 1.16.3 branch Initial publishing of the 1.16.3 branch of the mod. A lot of systems are missing (such as Rituals and Living Armour), but enough is present for a decent Alpha release. --- .settings/BloodMagic1.8IDEA.jar | Bin 1882 -> 0 bytes .settings/org.eclipse.buildship.core.prefs | 2 + .settings/org.eclipse.jdt.core.prefs | 685 ++--- .settings/org.eclipse.jdt.ui.prefs | 25 +- CREDITS.txt | 65 + LICENSE | 87 - LICENSE.txt | 520 ++++ README.md | 120 - README.txt | 53 + build.gradle | 229 +- changelog.txt | 2249 ++++++++--------- gradle.properties | 18 +- gradle/process_mod_info.gradle | 28 - gradle/wrapper/gradle-wrapper.jar | Bin 51017 -> 54708 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 110 +- gradlew.bat | 14 +- runClient.launch | 21 + runData.launch | 27 + runServer.launch | 26 + settings.gradle | 1 - .../bloodmagic/api/BloodMagicPlugin.java | 29 - .../bloodmagic/api/IBloodMagicAPI.java | 77 - .../bloodmagic/api/IBloodMagicBlacklist.java | 47 - .../bloodmagic/api/IBloodMagicPlugin.java | 26 - .../api/IBloodMagicRecipeRegistrar.java | 96 - .../api/IBloodMagicValueManager.java | 42 - .../api/event/BloodMagicCraftedEvent.java | 71 - .../bloodmagic/api/package-info.java | 4 - src/generated/resources/.cache/cache | 170 ++ .../blockstates/accelerationrune.json | 7 + .../blockstates/altarcapacityrune.json | 7 + .../blockstates/bettercapacityrune.json | 7 + .../bloodmagic/blockstates/blankrune.json | 7 + .../bloodmagic/blockstates/bloodlight.json | 7 + .../bloodmagic/blockstates/chargingrune.json | 7 + .../blockstates/dislocationrune.json | 7 + .../blockstates/orbcapacityrune.json | 7 + .../bloodmagic/blockstates/sacrificerune.json | 7 + .../blockstates/selfsacrificerune.json | 7 + .../bloodmagic/blockstates/speedrune.json | 7 + .../assets/bloodmagic/lang/en_us.json | 115 + .../models/block/accelerationrune.json | 6 + .../models/block/altarcapacityrune.json | 6 + .../models/block/bettercapacityrune.json | 6 + .../bloodmagic/models/block/blankrune.json | 6 + .../bloodmagic/models/block/bloodlight.json | 6 + .../bloodmagic/models/block/chargingrune.json | 6 + .../models/block/dislocationrune.json | 6 + .../models/block/orbcapacityrune.json | 6 + .../models/block/sacrificerune.json | 6 + .../models/block/selfsacrificerune.json | 6 + .../bloodmagic/models/block/speedrune.json | 6 + .../models/item/accelerationrune.json | 3 + .../bloodmagic/models/item/airsigil.json | 6 + .../models/item/altarcapacityrune.json | 3 + .../models/item/apprenticebloodorb.json | 6 + .../bloodmagic/models/item/arcaneashes.json | 6 + .../models/item/basemonstersoul.json | 6 + .../item/basemonstersoul_corrosive.json | 6 + .../item/basemonstersoul_destructive.json | 6 + .../item/basemonstersoul_steadfast.json | 6 + .../models/item/basemonstersoul_vengeful.json | 6 + .../models/item/bettercapacityrune.json | 3 + .../bloodmagic/models/item/blankrune.json | 3 + .../bloodmagic/models/item/blankslate.json | 6 + .../models/item/bloodlightsigil.json | 6 + .../bloodmagic/models/item/chargingrune.json | 3 + .../models/item/daggerofsacrifice.json | 6 + .../bloodmagic/models/item/demonslate.json | 6 + .../models/item/dislocationrune.json | 3 + .../models/item/divinationsigil.json | 6 + .../bloodmagic/models/item/etherealslate.json | 6 + .../bloodmagic/models/item/growthsigil.json | 16 + .../bloodmagic/models/item/icesigil.json | 16 + .../bloodmagic/models/item/infusedslate.json | 6 + .../bloodmagic/models/item/lavasigil.json | 6 + .../models/item/magicianbloodorb.json | 6 + .../models/item/masterbloodorb.json | 6 + .../bloodmagic/models/item/miningsigil.json | 16 + .../models/item/orbcapacityrune.json | 3 + .../bloodmagic/models/item/reagentair.json | 6 + .../models/item/reagentbloodlight.json | 6 + .../models/item/reagentfastminer.json | 6 + .../bloodmagic/models/item/reagentgrowth.json | 6 + .../bloodmagic/models/item/reagentlava.json | 6 + .../models/item/reagentmagnetism.json | 6 + .../bloodmagic/models/item/reagentvoid.json | 6 + .../bloodmagic/models/item/reagentwater.json | 6 + .../models/item/reinforcedslate.json | 6 + .../bloodmagic/models/item/sacrificerune.json | 3 + .../models/item/sacrificialdagger.json | 6 + .../models/item/selfsacrificerune.json | 3 + .../models/item/sigilofmagnetism.json | 16 + .../bloodmagic/models/item/soulgemcommon.json | 34 + .../bloodmagic/models/item/soulgemlesser.json | 34 + .../bloodmagic/models/item/soulgempetty.json | 34 + .../bloodmagic/models/item/soulsnare.json | 6 + .../bloodmagic/models/item/soulsword.json | 74 + .../bloodmagic/models/item/speedrune.json | 3 + .../item/variants/growthsigil_activated.json | 6 + .../variants/growthsigil_deactivated.json | 6 + .../item/variants/icesigil_activated.json | 6 + .../item/variants/icesigil_deactivated.json | 6 + .../item/variants/miningsigil_activated.json | 6 + .../variants/miningsigil_deactivated.json | 6 + .../variants/sigilofmagnetism_activated.json | 6 + .../sigilofmagnetism_deactivated.json | 6 + .../models/item/variants/soulgemcommon.json | 6 + .../variants/soulgemcommon_corrosive.json | 6 + .../variants/soulgemcommon_destructive.json | 6 + .../variants/soulgemcommon_steadfast.json | 6 + .../item/variants/soulgemcommon_vengeful.json | 6 + .../models/item/variants/soulgemlesser.json | 6 + .../variants/soulgemlesser_corrosive.json | 6 + .../variants/soulgemlesser_destructive.json | 6 + .../variants/soulgemlesser_steadfast.json | 6 + .../item/variants/soulgemlesser_vengeful.json | 6 + .../models/item/variants/soulgempetty.json | 6 + .../item/variants/soulgempetty_corrosive.json | 6 + .../variants/soulgempetty_destructive.json | 6 + .../item/variants/soulgempetty_steadfast.json | 6 + .../item/variants/soulgempetty_vengeful.json | 6 + .../item/variants/soulsword_activated.json | 6 + .../soulsword_corrosive_activated.json | 6 + .../soulsword_corrosive_deactivated.json | 6 + .../item/variants/soulsword_deactivated.json | 6 + .../soulsword_destructive_activated.json | 6 + .../soulsword_destructive_deactivated.json | 6 + .../soulsword_steadfast_activated.json | 6 + .../soulsword_steadfast_deactivated.json | 6 + .../soulsword_vengeful_activated.json | 6 + .../soulsword_vengeful_deactivated.json | 6 + .../bloodmagic/models/item/voidsigil.json | 6 + .../bloodmagic/models/item/watersigil.json | 6 + .../bloodmagic/models/item/weakbloodorb.json | 6 + .../recipes/bloodmagictab/blood_altar.json | 32 + .../bloodmagictab/blood_rune_blank.json | 32 + .../bloodmagictab/blood_rune_capacity.json | 32 + .../bloodmagictab/blood_rune_charging.json | 32 + .../recipes/bloodmagictab/blood_rune_orb.json | 32 + .../bloodmagictab/blood_rune_sacrifice.json | 32 + .../blood_rune_self_sacrifice.json | 32 + .../bloodmagictab/blood_rune_speed.json | 32 + .../bloodmagictab/sacrificial_dagger.json | 32 + .../recipes/bloodmagictab/soul_forge.json | 32 + .../recipes/bloodmagictab/soul_snare.json | 32 + .../loot_tables/blocks/accelerationrune.json | 19 + .../loot_tables/blocks/alchemyarray.json | 10 + .../bloodmagic/loot_tables/blocks/altar.json | 19 + .../loot_tables/blocks/altarcapacityrune.json | 19 + .../blocks/bettercapacityrune.json | 19 + .../loot_tables/blocks/blankrune.json | 19 + .../loot_tables/blocks/bloodlight.json | 10 + .../loot_tables/blocks/chargingrune.json | 19 + .../loot_tables/blocks/dislocationrune.json | 19 + .../loot_tables/blocks/orbcapacityrune.json | 19 + .../loot_tables/blocks/sacrificerune.json | 19 + .../loot_tables/blocks/selfsacrificerune.json | 19 + .../loot_tables/blocks/soulforge.json | 19 + .../loot_tables/blocks/speedrune.json | 19 + .../recipes/altar/apprenticebloodorb.json | 13 + .../recipes/altar/daggerofsacrifice.json | 13 + .../recipes/altar/demonicslate.json | 13 + .../bloodmagic/recipes/altar/imbuedslate.json | 13 + .../recipes/altar/magicianbloodorb.json | 13 + .../recipes/altar/reinforcedslate.json | 13 + .../data/bloodmagic/recipes/altar/slate.json | 13 + .../recipes/altar/weakbloodorb.json | 13 + .../bloodmagic/recipes/array/airsigil.json | 13 + .../recipes/array/bloodlightsigil.json | 13 + .../recipes/array/divinationsigil.json | 13 + .../recipes/array/fastminersigil.json | 13 + .../bloodmagic/recipes/array/growthsigil.json | 13 + .../bloodmagic/recipes/array/lavasigil.json | 13 + .../recipes/array/magnetismsigil.json | 13 + .../bloodmagic/recipes/array/voidsigil.json | 13 + .../bloodmagic/recipes/array/watersigil.json | 13 + .../data/bloodmagic/recipes/blood_altar.json} | 15 +- .../bloodmagic/recipes/blood_rune_blank.json | 23 + .../recipes/blood_rune_capacity.json | 25 + .../recipes/blood_rune_charging.json | 29 + .../bloodmagic/recipes/blood_rune_orb.json | 27 + .../recipes/blood_rune_sacrifice.json | 29 + .../recipes/blood_rune_self_sacrifice.json | 29 + .../bloodmagic/recipes/blood_rune_speed.json | 25 + .../recipes/sacrificial_dagger.json | 22 + .../data/bloodmagic/recipes/soul_forge.json | 25 + .../data/bloodmagic/recipes/soul_snare.json | 23 + .../recipes/soulforge/arcaneashes.json | 21 + .../recipes/soulforge/commontartaricgem.json | 20 + .../recipes/soulforge/lessertartaricgem.json | 20 + .../recipes/soulforge/pettytartaricgem.json | 20 + .../recipes/soulforge/reagent_fastminer.json | 20 + .../recipes/soulforge/reagent_growth.json | 20 + .../recipes/soulforge/reagent_lava.json | 20 + .../recipes/soulforge/reagent_magnetism.json | 20 + .../recipes/soulforge/reagent_void.json | 20 + .../recipes/soulforge/reagent_water.json | 17 + .../recipes/soulforge/sentientsword.json | 15 + .../java/WayofTime/bloodmagic/BloodMagic.java | 307 ++- .../WayofTime/bloodmagic/ConfigHandler.java | 213 +- .../alchemyArray/AlchemyArrayEffect.java | 33 - .../AlchemyArrayEffectArrowTurret.java | 209 -- .../AlchemyArrayEffectAttractor.java | 393 --- .../AlchemyArrayEffectBinding.java | 71 - .../AlchemyArrayEffectBounce.java | 51 - .../AlchemyArrayEffectCrafting.java | 63 - .../AlchemyArrayEffectCraftingNew.java | 58 - .../AlchemyArrayEffectFurnaceFuel.java | 119 - .../AlchemyArrayEffectLaputa.java | 134 - .../AlchemyArrayEffectMobSacrifice.java | 202 -- .../AlchemyArrayEffectMovement.java | 82 - .../alchemyArray/AlchemyArrayEffectSigil.java | 39 - .../AlchemyArrayEffectSkeletonTurret.java | 186 -- .../alchemyArray/AlchemyArrayEffectSpike.java | 44 - .../AlchemyArrayEffectTeleport.java | 87 - .../AlchemyArrayEffectUpdraft.java | 50 - .../alchemyArray/AlchemyCircleRenderer.java | 151 -- .../bloodmagic/altar/AltarComponent.java | 91 +- .../WayofTime/bloodmagic/altar/AltarTier.java | 283 ++- .../bloodmagic/altar/AltarUpgrade.java | 37 +- .../WayofTime/bloodmagic/altar/AltarUtil.java | 139 +- .../bloodmagic/altar/BloodAltar.java | 1436 ++++++----- .../bloodmagic/altar/ComponentType.java | 34 +- .../bloodmagic/altar/IAltarComponent.java | 15 +- .../bloodmagic/altar/IAltarManipulator.java | 8 - .../bloodmagic/altar/IBloodAltar.java | 63 +- .../bloodmagic/api/impl/BloodMagicAPI.java | 156 +- .../api/impl/BloodMagicBlacklist.java | 106 - .../api/impl/BloodMagicCorePlugin.java | 163 +- .../api/impl/BloodMagicRecipeRegistrar.java | 779 +++--- .../api/impl/BloodMagicValueManager.java | 62 - .../api/impl/recipe/RecipeAlchemyArray.java | 118 +- .../api/impl/recipe/RecipeAlchemyTable.java | 59 - .../api/impl/recipe/RecipeBloodAltar.java | 150 +- .../api/impl/recipe/RecipeSacrificeCraft.java | 43 - .../api/impl/recipe/RecipeTartaricForge.java | 106 +- .../bloodmagic/block/BlockAlchemyArray.java | 166 -- .../bloodmagic/block/BlockAlchemyTable.java | 164 -- .../bloodmagic/block/BlockAltar.java | 224 -- .../bloodmagic/block/BlockBloodLight.java | 112 - .../bloodmagic/block/BlockBloodRune.java | 44 - .../bloodmagic/block/BlockBloodTank.java | 195 -- .../bloodmagic/block/BlockDecorative.java | 33 - .../bloodmagic/block/BlockDemonBase.java | 21 - .../bloodmagic/block/BlockDemonCrucible.java | 172 -- .../bloodmagic/block/BlockDemonCrystal.java | 368 --- .../block/BlockDemonCrystallizer.java | 77 - .../bloodmagic/block/BlockDemonLight.java | 21 - .../block/BlockDemonPillarBase.java | 33 - .../block/BlockDemonPillarCapBase.java | 31 - .../bloodmagic/block/BlockDemonPylon.java | 129 - .../block/BlockDemonStairsBase.java | 27 - .../bloodmagic/block/BlockDemonWallBase.java | 27 - .../block/BlockDimensionalPortal.java | 183 -- .../bloodmagic/block/BlockIncenseAltar.java | 86 - .../block/BlockInputRoutingNode.java | 53 - .../block/BlockInversionPillar.java | 90 - .../block/BlockInversionPillarEnd.java | 57 - .../block/BlockItemRoutingNode.java | 39 - .../bloodmagic/block/BlockLifeEssence.java | 66 - .../block/BlockMasterRoutingNode.java | 43 - .../bloodmagic/block/BlockMimic.java | 227 -- .../block/BlockOutputRoutingNode.java | 53 - .../WayofTime/bloodmagic/block/BlockPath.java | 84 - .../bloodmagic/block/BlockPhantom.java | 82 - .../block/BlockRitualController.java | 136 - .../bloodmagic/block/BlockRitualStone.java | 62 - .../bloodmagic/block/BlockRoutingNode.java | 137 - .../bloodmagic/block/BlockSoulForge.java | 100 - .../bloodmagic/block/BlockSpectral.java | 105 - .../bloodmagic/block/BlockTeleposer.java | 69 - .../WayofTime/bloodmagic/block/IBMBlock.java | 8 - .../bloodmagic/block/base/BlockEnum.java | 98 - .../block/base/BlockEnumPillar.java | 124 - .../block/base/BlockEnumPillarCap.java | 73 - .../block/base/BlockEnumStairs.java | 343 --- .../bloodmagic/block/base/BlockEnumWall.java | 122 - .../bloodmagic/block/base/BlockInteger.java | 81 - .../bloodmagic/block/enums/BloodRuneType.java | 47 +- .../block/enums/EnumDecorative.java | 22 - .../block/enums/EnumDemonBlock1.java | 23 - .../block/enums/EnumDemonBlock2.java | 33 - .../block/enums/EnumDemonBlock3.java | 33 - .../block/enums/EnumInversionCap.java | 28 - .../bloodmagic/block/enums/EnumMimic.java | 23 - .../bloodmagic/block/enums/EnumPath.java | 26 - .../block/enums/EnumRitualController.java | 22 - .../block/enums/EnumSubWillType.java | 33 - .../block/enums/EnumSubWillType1.java | 20 - .../block/enums/EnumSubWillType2.java | 20 - .../block/enums/EnumSubWillType3.java | 19 - .../bloodmagic/block/enums/EnumWillWall.java | 33 - .../bloodmagic/client/IMeshProvider.java | 40 - .../bloodmagic/client/IVariantProvider.java | 13 - .../WayofTime/bloodmagic/client/Sprite.java | 58 - .../client/gui/GuiAlchemyTable.java | 65 - .../client/gui/GuiBloodMagicConfig.java | 64 - .../bloodmagic/client/gui/GuiHandler.java | 64 - .../bloodmagic/client/gui/GuiHolding.java | 57 - .../client/gui/GuiItemRoutingNode.java | 200 -- .../client/gui/GuiMasterRoutingNode.java | 44 - .../bloodmagic/client/gui/GuiSoulForge.java | 56 - .../bloodmagic/client/gui/GuiTeleposer.java | 42 - .../client/helper/ShaderHelper.java | 182 -- .../client/hud/ConfigEntryEditHUD.java | 39 - .../bloodmagic/client/hud/ElementInfo.java | 39 - .../client/hud/ElementRegistry.java | 149 -- .../bloodmagic/client/hud/Elements.java | 136 - .../bloodmagic/client/hud/GuiEditHUD.java | 185 -- .../client/hud/element/ElementDemonAura.java | 78 - .../element/ElementDivinedInformation.java | 64 - .../client/hud/element/ElementHolding.java | 85 - .../client/hud/element/ElementItemStack.java | 23 - .../client/hud/element/ElementSprite.java | 20 - .../client/hud/element/ElementString.java | 36 - .../hud/element/ElementTileInformation.java | 57 - .../client/hud/element/HUDElement.java | 58 - .../bloodmagic/client/key/IKeybindable.java | 8 - .../client/key/KeyBindingBloodMagic.java | 16 - .../bloodmagic/client/key/KeyBindings.java | 97 - .../mesh/CustomMeshDefinitionActivatable.java | 25 - .../mesh/CustomMeshDefinitionMultiWill.java | 27 - .../mesh/CustomMeshDefinitionWillGem.java | 28 - .../client/render/LayerBloodElytra.java | 53 - .../AttractorAlchemyCircleRenderer.java | 142 -- .../BindingAlchemyCircleRenderer.java | 236 -- .../DualAlchemyCircleRenderer.java | 145 -- .../LowAlchemyCircleRenderer.java | 18 - .../LowStaticAlchemyCircleRenderer.java | 24 - .../MobSacrificeAlchemyCircleRenderer.java | 243 -- .../SingleAlchemyCircleRenderer.java | 127 - .../StaticAlchemyCircleRenderer.java | 131 - .../TurretAlchemyCircleRenderer.java | 247 -- .../render/block/RenderAlchemyArray.java | 57 +- .../client/render/block/RenderAltar.java | 363 ++- .../client/render/block/RenderBloodTank.java | 109 - .../render/block/RenderDemonCrucible.java | 55 - .../client/render/block/RenderFakeBlocks.java | 62 - .../render/block/RenderItemRoutingNode.java | 110 - .../client/render/block/RenderMimic.java | 20 - .../entity/BloodLightRenderFactory.java | 13 - .../entity/CorruptedChickenRenderFactory.java | 13 - .../entity/CorruptedSheepRenderFactory.java | 13 - .../entity/CorruptedSpiderRenderFactory.java | 13 - .../entity/CorruptedZombieRenderFactory.java | 13 - .../render/entity/MeteorRenderFactory.java | 13 - .../render/entity/MimicRenderFactory.java | 13 - .../render/entity/RenderCorruptedChicken.java | 33 - .../render/entity/RenderCorruptedSheep.java | 31 - .../render/entity/RenderCorruptedSpider.java | 35 - .../render/entity/RenderCorruptedZombie.java | 65 - .../render/entity/RenderEntityBloodLight.java | 38 - .../render/entity/RenderEntityMeteor.java | 41 - .../render/entity/RenderEntityMimic.java | 117 - .../entity/RenderEntitySentientArrow.java | 108 - .../render/entity/RenderEntitySoulSnare.java | 39 - .../render/entity/RenderSentientSpecter.java | 110 - .../entity/SentientArrowRenderFactory.java | 13 - .../entity/SentientSpecterRenderFactory.java | 13 - .../render/entity/SoulSnareRenderFactory.java | 13 - .../entity/layer/LayerAlchemyCircle.java | 82 - .../entity/layer/LayerCorruptedSheepWool.java | 51 - .../layer/LayerCorruptedSpiderEyes.java | 51 - .../client/render/entity/layer/LayerWill.java | 58 - .../render/model/ModelCorruptedChicken.java | 102 - .../render/model/ModelCorruptedSheep.java | 59 - .../render/model/ModelCorruptedSheep2.java | 46 - .../render/model/ModelCorruptedSpider.java | 166 -- .../client/render/model/ModelMeteor.java | 89 - .../client/render/model/ModelMimic.java | 136 - .../bloodmagic/command/CommandBloodMagic.java | 34 - .../command/sub/SubCommandBind.java | 91 - .../command/sub/SubCommandNetwork.java | 228 -- .../bloodmagic/command/sub/SubCommandOrb.java | 127 - .../command/sub/SubCommandRitual.java | 150 -- .../command/sub/SubCommandTeleposer.java | 329 --- .../bloodmagic/compat/guideapi/BookUtils.java | 62 - .../compat/guideapi/GuideBloodMagic.java | 58 - .../compat/guideapi/book/CategoryAlchemy.java | 153 -- .../guideapi/book/CategoryArchitect.java | 721 ------ .../compat/guideapi/book/CategoryDemon.java | 191 -- .../compat/guideapi/book/CategoryRitual.java | 157 -- .../compat/guideapi/book/CategorySpell.java | 17 - .../compat/guideapi/entry/EntryText.java | 52 - .../guideapi/page/PageAlchemyArray.java | 94 - .../compat/guideapi/page/PageAltarRecipe.java | 70 - .../page/PageTartaricForgeRecipe.java | 125 - .../compat/jei/BloodMagicJEIPlugin.java | 274 +- .../AlchemyArrayCraftingCategory.java | 75 - .../AlchemyArrayCraftingRecipeJEI.java | 33 - .../AlchemyTableRecipeCategory.java | 75 - .../alchemyTable/AlchemyTableRecipeJEI.java | 60 - .../compat/jei/altar/AltarRecipeCategory.java | 68 - .../compat/jei/altar/AltarRecipeJEI.java | 58 - .../ArmourDowngradeRecipeCategory.java | 93 - .../ArmourDowngradeRecipeHandler.java | 32 - .../ArmourDowngradeRecipeJEI.java | 34 - .../ArmourDowngradeRecipeMaker.java | 21 - .../jei/binding/BindingRecipeCategory.java | 75 - .../jei/binding/BindingRecipeHandler.java | 31 - .../compat/jei/binding/BindingRecipeJEI.java | 34 - .../jei/binding/BindingRecipeMaker.java | 39 - .../forge/TartaricForgeRecipeCategory.java | 224 +- .../jei/forge/TartaricForgeRecipeJEI.java | 66 - .../compat/waila/BloodMagicHwylaPlugin.java | 46 - .../provider/DataProviderAlchemyArray.java | 56 - .../provider/DataProviderBloodAltar.java | 116 - .../waila/provider/DataProviderBloodTank.java | 51 - .../waila/provider/DataProviderMimic.java | 57 - .../DataProviderRitualController.java | 80 - .../waila/provider/DataProviderTeleposer.java | 58 - .../compress/AdvancedCompressionHandler.java | 47 - .../compress/BaseCompressionHandler.java | 52 - .../compress/CompressionHandler.java | 70 - .../compress/CompressionRegistry.java | 103 - .../compress/StorageBlockCraftingManager.java | 160 -- ...StorageBlockCraftingRecipeAssimilator.java | 285 --- .../bloodmagic/core/RegistrarBloodMagic.java | 171 +- .../core/RegistrarBloodMagicBlocks.java | 167 -- .../core/RegistrarBloodMagicItems.java | 255 -- .../core/RegistrarBloodMagicRecipes.java | 298 +-- .../core/data/BMWorldSavedData.java | 94 +- .../bloodmagic/core/data/Binding.java | 127 +- .../bloodmagic/core/data/SoulNetwork.java | 432 ++-- .../bloodmagic/core/data/SoulTicket.java | 141 +- .../core/recipe/IngredientBloodOrb.java | 154 +- .../recipe/IngredientBloodOrbFactory.java | 21 - .../registry/AlchemyArrayRecipeRegistry.java | 350 --- .../registry/AlchemyTableRecipeRegistry.java | 39 - .../core/registry/AltarRecipeRegistry.java | 215 -- .../LivingArmourDowngradeRecipeRegistry.java | 60 - .../bloodmagic/core/registry/OrbRegistry.java | 87 +- .../registry/TartaricForgeRecipeRegistry.java | 39 - .../WayofTime/bloodmagic/demonAura/PosXY.java | 65 - .../bloodmagic/demonAura/WillChunk.java | 60 - .../bloodmagic/demonAura/WillWorld.java | 40 - .../demonAura/WorldDemonWillHandler.java | 178 -- .../entity/ai/EntityAIAttackRangedBow.java | 138 - .../entity/ai/EntityAIAttackStealthMelee.java | 142 -- .../entity/ai/EntityAIEatAndCorruptBlock.java | 99 - .../entity/ai/EntityAIFollowOwner.java | 125 - .../ai/EntityAIGrabEffectsFromOwner.java | 136 - .../ai/EntityAIHurtByTargetIgnoreTamed.java | 27 - .../entity/ai/EntityAIMimicReform.java | 27 - .../entity/ai/EntityAIOwnerHurtByTarget.java | 50 - .../entity/ai/EntityAIOwnerHurtTarget.java | 50 - .../entity/ai/EntityAIPickUpAlly.java | 154 -- .../entity/ai/EntityAIProtectAlly.java | 98 - .../entity/ai/EntityAIRetreatToHeal.java | 135 - .../entity/ai/EntityAIStealthRetreat.java | 96 - .../ai/EntityAIStealthTowardsTarget.java | 87 - .../entity/mob/EntityAspectedDemonBase.java | 242 -- .../entity/mob/EntityCorruptedChicken.java | 202 -- .../entity/mob/EntityCorruptedSheep.java | 354 --- .../entity/mob/EntityCorruptedSpider.java | 202 -- .../entity/mob/EntityCorruptedZombie.java | 185 -- .../entity/mob/EntityDemonBase.java | 304 --- .../bloodmagic/entity/mob/EntityMimic.java | 327 --- .../entity/mob/EntitySentientSpecter.java | 483 ---- .../entity/projectile/EntityBloodLight.java | 241 +- .../entity/projectile/EntityMeteor.java | 134 - .../projectile/EntitySentientArrow.java | 295 --- .../entity/projectile/EntitySoulSnare.java | 109 +- .../bloodmagic/event/AddToNetworkEvent.java | 26 - .../bloodmagic/event/AltarCraftedEvent.java | 33 - .../bloodmagic/event/BoundToolEvent.java | 50 - .../bloodmagic/event/ItemBindEvent.java | 57 +- .../bloodmagic/event/RitualEvent.java | 133 - .../event/SacrificeKnifeUsedEvent.java | 62 +- .../bloodmagic/event/SoulNetworkEvent.java | 155 +- .../bloodmagic/event/TeleposeEvent.java | 78 - .../fakePlayer/FakeNetHandlerPlayServer.java | 160 -- .../bloodmagic/fakePlayer/FakePlayerBM.java | 46 - .../bloodmagic/gson/SerializerBase.java | 19 - .../bloodmagic/gson/Serializers.java | 100 - .../bloodmagic/iface/IActivatable.java | 42 +- .../bloodmagic/iface/IAlchemyArray.java | 7 - .../bloodmagic/iface/IAltarReader.java | 7 +- .../WayofTime/bloodmagic/iface/IBindable.java | 64 +- .../bloodmagic/iface/IBloodRune.java | 19 +- .../iface/ICustomAlchemyConsumable.java | 11 - .../bloodmagic/iface/IDemonWillViewer.java | 11 - .../bloodmagic/iface/IDocumentedBlock.java | 32 - .../bloodmagic/iface/IItemLPContainer.java | 14 - .../bloodmagic/iface/IMultiWillTool.java | 11 +- .../bloodmagic/iface/INodeRenderer.java | 8 - .../bloodmagic/iface/IPurificationAsh.java | 11 - .../iface/ISentientSwordEffectProvider.java | 11 - .../bloodmagic/iface/ISentientTool.java | 8 - .../WayofTime/bloodmagic/iface/ISigil.java | 39 +- .../bloodmagic/iface/IUpgradeTrainer.java | 15 - .../incense/EnumTranquilityType.java | 12 - .../bloodmagic/incense/IIncensePath.java | 14 - .../incense/ITranquilityHandler.java | 10 - .../incense/IncenseAltarComponent.java | 55 - .../incense/IncenseAltarHandler.java | 92 - .../incense/IncenseTranquilityRegistry.java | 28 - .../bloodmagic/incense/TranquilityStack.java | 11 - .../inversion/CorruptionHandler.java | 86 - .../inversion/InversionPillarHandler.java | 193 -- .../item/ItemActivationCrystal.java | 65 - .../bloodmagic/item/ItemAlchemicVial.java | 16 - .../bloodmagic/item/ItemAltarMaker.java | 140 - .../bloodmagic/item/ItemArcaneAshes.java | 65 - .../bloodmagic/item/ItemBindableBase.java | 34 - .../bloodmagic/item/ItemBloodOrb.java | 123 - .../bloodmagic/item/ItemBoundAxe.java | 112 - .../bloodmagic/item/ItemBoundPickaxe.java | 123 - .../bloodmagic/item/ItemBoundShovel.java | 113 - .../bloodmagic/item/ItemBoundSword.java | 135 - .../bloodmagic/item/ItemBoundTool.java | 254 -- .../item/ItemDaggerOfSacrifice.java | 84 - .../bloodmagic/item/ItemDemonCrystal.java | 45 - .../bloodmagic/item/ItemDemonWillGauge.java | 47 - .../WayofTime/bloodmagic/item/ItemEnum.java | 60 - .../bloodmagic/item/ItemExperienceBook.java | 184 -- .../bloodmagic/item/ItemInscriptionTool.java | 108 - .../bloodmagic/item/ItemLavaCrystal.java | 109 - .../bloodmagic/item/ItemPotionFlask.java | 133 - .../bloodmagic/item/ItemRitualDismantler.java | 78 - .../bloodmagic/item/ItemRitualDiviner.java | 517 ---- .../bloodmagic/item/ItemRitualReader.java | 280 -- .../item/ItemSacrificialDagger.java | 205 -- .../bloodmagic/item/ItemSanguineBook.java | 115 - .../WayofTime/bloodmagic/item/ItemSlate.java | 50 - .../item/ItemTelepositionFocus.java | 111 - .../bloodmagic/item/ItemUpgradeTome.java | 112 - .../bloodmagic/item/ItemUpgradeTrainer.java | 88 - .../item/alchemy/ItemCuttingFluid.java | 99 - .../ItemLivingArmourPointsUpgrade.java | 105 - .../item/armour/ItemLivingArmour.java | 505 ---- .../item/armour/ItemSentientArmour.java | 583 ----- .../item/block/ItemBlockAlchemyTable.java | 67 - .../item/block/ItemBlockBloodTank.java | 78 - .../item/block/ItemBlockDemonCrystal.java | 46 - .../bloodmagic/item/block/ItemBlockMimic.java | 124 - .../item/block/base/ItemBlockEnum.java | 33 - .../item/block/base/ItemBlockInteger.java | 31 - .../item/gear/ItemPackSacrifice.java | 100 - .../item/gear/ItemPackSelfSacrifice.java | 125 - .../item/inventory/ContainerHolding.java | 153 -- .../item/inventory/InventoryHolding.java | 69 - .../item/inventory/ItemInventory.java | 224 -- .../item/routing/IFluidFilterProvider.java | 12 - .../item/routing/IItemFilterProvider.java | 12 - .../item/routing/IRoutingFilterProvider.java | 14 - .../item/routing/ItemFluidRouterFilter.java | 133 - .../item/routing/ItemNodeRouter.java | 195 -- .../item/routing/ItemRouterFilter.java | 155 -- .../bloodmagic/item/sigil/ItemSigil.java | 39 - .../bloodmagic/item/sigil/ItemSigilAir.java | 71 - .../bloodmagic/item/sigil/ItemSigilBase.java | 53 - .../item/sigil/ItemSigilBloodLight.java | 83 - .../item/sigil/ItemSigilBounce.java | 22 - .../bloodmagic/item/sigil/ItemSigilClaw.java | 22 - .../item/sigil/ItemSigilCompression.java | 31 - .../item/sigil/ItemSigilDivination.java | 49 - .../sigil/ItemSigilElementalAffinity.java | 25 - .../item/sigil/ItemSigilEnderSeverance.java | 30 - .../item/sigil/ItemSigilFastMiner.java | 52 - .../item/sigil/ItemSigilFilledHand.java | 20 - .../item/sigil/ItemSigilFluidBase.java | 178 -- .../bloodmagic/item/sigil/ItemSigilFrost.java | 21 - .../item/sigil/ItemSigilGreenGrove.java | 96 - .../bloodmagic/item/sigil/ItemSigilHaste.java | 22 - .../item/sigil/ItemSigilHolding.java | 303 --- .../bloodmagic/item/sigil/ItemSigilLava.java | 71 - .../item/sigil/ItemSigilMagnetism.java | 43 - .../item/sigil/ItemSigilPhantomBridge.java | 217 -- .../item/sigil/ItemSigilSuppression.java | 50 - .../item/sigil/ItemSigilTeleposition.java | 160 -- .../item/sigil/ItemSigilToggleable.java | 96 - .../item/sigil/ItemSigilToggleableBase.java | 54 - .../item/sigil/ItemSigilTransposition.java | 142 -- .../bloodmagic/item/sigil/ItemSigilVoid.java | 97 - .../bloodmagic/item/sigil/ItemSigilWater.java | 79 - .../item/sigil/ItemSigilWhirlwind.java | 22 - .../bloodmagic/item/soul/ItemMonsterSoul.java | 122 - .../item/soul/ItemSentientArmourGem.java | 80 - .../bloodmagic/item/soul/ItemSentientAxe.java | 489 ---- .../bloodmagic/item/soul/ItemSentientBow.java | 477 ---- .../item/soul/ItemSentientPickaxe.java | 488 ---- .../item/soul/ItemSentientShovel.java | 489 ---- .../item/soul/ItemSentientSword.java | 455 ---- .../bloodmagic/item/soul/ItemSoulGem.java | 267 -- .../bloodmagic/item/soul/ItemSoulSnare.java | 80 - .../item/soulBreath/ItemFlightScroll.java | 274 -- .../soulBreath/ItemSoulBreathContainer.java | 65 - .../item/types/AlchemicVialType.java | 44 - .../bloodmagic/item/types/ComponentTypes.java | 64 - .../bloodmagic/item/types/ISubItem.java | 19 - .../bloodmagic/item/types/ShardType.java | 26 - .../livingArmour/ILivingArmour.java | 47 - .../bloodmagic/livingArmour/LivingArmour.java | 334 --- .../livingArmour/LivingArmourHandler.java | 64 - .../livingArmour/LivingArmourUpgrade.java | 90 - .../bloodmagic/livingArmour/StatTracker.java | 66 - .../LivingArmourUpgradeBattleHungry.java | 71 - .../LivingArmourUpgradeCrippledArm.java | 54 - .../LivingArmourUpgradeDigSlowdown.java | 65 - .../LivingArmourUpgradeDisoriented.java | 63 - .../LivingArmourUpgradeMeleeDecrease.java | 74 - .../LivingArmourUpgradeQuenched.java | 54 - .../LivingArmourUpgradeSlippery.java | 91 - .../LivingArmourUpgradeSlowHeal.java | 62 - .../LivingArmourUpgradeSlowness.java | 72 - .../LivingArmourUpgradeStormTrooper.java | 59 - .../tracker/StatTrackerArrowProtect.java | 104 - .../tracker/StatTrackerArrowShot.java | 104 - .../tracker/StatTrackerCriticalStrike.java | 104 - .../tracker/StatTrackerDigging.java | 104 - .../tracker/StatTrackerExperience.java | 104 - .../tracker/StatTrackerFallProtect.java | 104 - .../tracker/StatTrackerFireResist.java | 89 - .../livingArmour/tracker/StatTrackerFood.java | 108 - .../tracker/StatTrackerGraveDigger.java | 104 - .../tracker/StatTrackerGrimReaperSprint.java | 111 - .../tracker/StatTrackerHealthboost.java | 104 - .../livingArmour/tracker/StatTrackerJump.java | 106 - .../tracker/StatTrackerMeleeDamage.java | 104 - .../tracker/StatTrackerMovement.java | 116 - .../tracker/StatTrackerNightSight.java | 124 - .../tracker/StatTrackerPhysicalProtect.java | 104 - .../tracker/StatTrackerPoison.java | 90 - .../tracker/StatTrackerRepairing.java | 104 - .../tracker/StatTrackerSelfSacrifice.java | 106 - .../tracker/StatTrackerSolarPowered.java | 104 - .../tracker/StatTrackerSprintAttack.java | 104 - .../tracker/StatTrackerStepAssist.java | 114 - .../LivingArmourUpgradeArrowProtect.java | 55 - .../upgrade/LivingArmourUpgradeArrowShot.java | 56 - .../LivingArmourUpgradeCriticalStrike.java | 63 - .../upgrade/LivingArmourUpgradeDigging.java | 75 - .../upgrade/LivingArmourUpgradeElytra.java | 51 - .../LivingArmourUpgradeExperience.java | 48 - .../LivingArmourUpgradeFallProtect.java | 49 - .../LivingArmourUpgradeFireResist.java | 69 - .../LivingArmourUpgradeGraveDigger.java | 61 - .../LivingArmourUpgradeGrimReaperSprint.java | 86 - .../LivingArmourUpgradeHealthboost.java | 69 - .../upgrade/LivingArmourUpgradeJump.java | 63 - .../LivingArmourUpgradeKnockbackResist.java | 67 - .../LivingArmourUpgradeMeleeDamage.java | 69 - .../LivingArmourUpgradeNightSight.java | 72 - .../LivingArmourUpgradePhysicalProtect.java | 55 - .../LivingArmourUpgradePoisonResist.java | 70 - .../upgrade/LivingArmourUpgradeRepairing.java | 73 - .../LivingArmourUpgradeSelfSacrifice.java | 49 - .../LivingArmourUpgradeSolarPowered.java | 79 - .../upgrade/LivingArmourUpgradeSpeed.java | 87 - .../LivingArmourUpgradeSprintAttack.java | 74 - .../LivingArmourUpgradeStepAssist.java | 55 - .../WayofTime/bloodmagic/meteor/Meteor.java | 115 - .../bloodmagic/meteor/MeteorComponent.java | 70 - .../meteor/MeteorConfigHandler.java | 165 -- .../bloodmagic/meteor/MeteorRegistry.java | 44 - .../network/BloodMagicPacketHandler.java | 74 +- .../network/DemonAuraPacketProcessor.java | 57 - .../ItemRouterAmountPacketProcessor.java | 70 - .../ItemRouterButtonPacketProcessor.java | 74 - .../bloodmagic/network/KeyProcessor.java | 52 - .../PlayerFallDistancePacketProcessor.java | 45 - .../PlayerVelocityPacketProcessor.java | 59 - .../network/SigilHoldingPacketProcessor.java | 48 - .../WayofTime/bloodmagic/orb/BloodOrb.java | 109 +- .../WayofTime/bloodmagic/orb/IBloodOrb.java | 15 +- .../bloodmagic/potion/BMPotionUtils.java | 137 - .../bloodmagic/potion/PotionBloodMagic.java | 62 +- .../potion/PotionEventHandlers.java | 192 -- .../bloodmagic/proxy/ClientProxy.java | 145 -- .../bloodmagic/proxy/CommonProxy.java | 40 - .../recipe/LivingArmourDowngradeRecipe.java | 151 -- .../recipe/TartaricForgeRecipe.java | 160 -- .../AlchemyTableCustomRecipe.java | 44 - .../AlchemyTableDyeableRecipe.java | 116 - .../AlchemyTablePotionAugmentRecipe.java | 97 - .../AlchemyTablePotionRecipe.java | 139 - .../alchemyTable/AlchemyTableRecipe.java | 201 -- .../registry/ModArmourTrackers.java | 66 - .../registry/ModCorruptionBlocks.java | 16 - .../bloodmagic/registry/ModRecipes.java | 273 -- .../bloodmagic/registry/ModRituals.java | 28 - .../registry/ModTranquilityHandlers.java | 21 - .../bloodmagic/ritual/AreaDescriptor.java | 549 ---- .../bloodmagic/ritual/CapabilityRuneType.java | 47 - .../ritual/EnumReaderBoundaries.java | 22 - .../ritual/EnumRitualReaderState.java | 8 - .../bloodmagic/ritual/EnumRuneType.java | 64 - .../bloodmagic/ritual/IMasterRitualStone.java | 79 - .../bloodmagic/ritual/IRitualStone.java | 23 - .../WayofTime/bloodmagic/ritual/Ritual.java | 371 --- .../bloodmagic/ritual/RitualComponent.java | 60 - .../bloodmagic/ritual/RitualManager.java | 154 -- .../bloodmagic/ritual/RitualRegister.java | 49 - .../bloodmagic/ritual/RitualRenderer.java | 12 - .../crushing/CrushingHandlerCuttingFluid.java | 49 - .../ritual/crushing/CrushingRegistry.java | 20 - .../ritual/crushing/ICrushingHandler.java | 16 - .../harvest/HarvestHandlerPlantable.java | 120 - .../ritual/harvest/HarvestHandlerStem.java | 58 - .../ritual/harvest/HarvestHandlerTall.java | 46 - .../ritual/harvest/HarvestRegistry.java | 105 - .../ritual/harvest/IHarvestHandler.java | 37 - .../imperfect/IImperfectRitualStone.java | 19 - .../ritual/imperfect/ImperfectRitual.java | 91 - .../ritual/imperfect/package-info.java | 7 - .../ritual/portal/LocationsHandler.java | 108 - .../ritual/types/RitualAltarBuilder.java | 261 -- .../ritual/types/RitualAnimalGrowth.java | 220 -- .../ritual/types/RitualArmourEvolve.java | 87 - .../ritual/types/RitualCobblestone.java | 96 - .../bloodmagic/ritual/types/RitualCondor.java | 89 - .../ritual/types/RitualContainment.java | 71 - .../ritual/types/RitualCrushing.java | 282 --- .../ritual/types/RitualCrystalHarvest.java | 87 - .../ritual/types/RitualCrystalSplit.java | 162 -- .../ritual/types/RitualEllipsoid.java | 238 -- .../ritual/types/RitualEternalSoul.java | 139 - .../ritual/types/RitualExpulsion.java | 237 -- .../ritual/types/RitualFeatheredEarth.java | 93 - .../ritual/types/RitualFeatheredKnife.java | 220 -- .../ritual/types/RitualFelling.java | 110 - .../ritual/types/RitualForsakenSoul.java | 198 -- .../ritual/types/RitualFullStomach.java | 109 - .../ritual/types/RitualGreenGrove.java | 277 -- .../ritual/types/RitualGrounding.java | 199 -- .../ritual/types/RitualHarvest.java | 122 - .../ritual/types/RitualInterdiction.java | 73 - .../ritual/types/RitualJumping.java | 85 - .../bloodmagic/ritual/types/RitualLava.java | 297 --- .../types/RitualLivingArmourDowngrade.java | 208 -- .../ritual/types/RitualMagnetic.java | 164 -- .../bloodmagic/ritual/types/RitualMeteor.java | 155 -- .../bloodmagic/ritual/types/RitualPlacer.java | 104 - .../bloodmagic/ritual/types/RitualPortal.java | 230 -- .../bloodmagic/ritual/types/RitualPump.java | 109 - .../ritual/types/RitualRegeneration.java | 185 -- .../bloodmagic/ritual/types/RitualSpeed.java | 184 -- .../ritual/types/RitualSuppression.java | 76 - .../ritual/types/RitualUpgradeRemove.java | 125 - .../ritual/types/RitualVeilOfEvil.java | 102 - .../types/RitualWardOfSacrosanctity.java | 105 - .../bloodmagic/ritual/types/RitualWater.java | 69 - .../ritual/types/RitualWellOfSuffering.java | 135 - .../bloodmagic/ritual/types/RitualZephyr.java | 95 - .../types/imperfect/ImperfectRitualDay.java | 23 - .../types/imperfect/ImperfectRitualNight.java | 24 - .../types/imperfect/ImperfectRitualRain.java | 29 - .../imperfect/ImperfectRitualResistance.java | 25 - .../imperfect/ImperfectRitualZombie.java | 32 - .../bloodmagic/routing/DefaultItemFilter.java | 117 - .../bloodmagic/routing/IFluidFilter.java | 33 - .../bloodmagic/routing/IFluidRoutingNode.java | 9 - .../routing/IInputFluidRoutingNode.java | 9 - .../routing/IInputItemRoutingNode.java | 9 - .../bloodmagic/routing/IItemFilter.java | 32 - .../bloodmagic/routing/IItemRoutingNode.java | 9 - .../routing/IMasterRoutingNode.java | 17 - .../routing/IOutputFluidRoutingNode.java | 9 - .../routing/IOutputItemRoutingNode.java | 9 - .../bloodmagic/routing/IRoutingFilter.java | 5 - .../bloodmagic/routing/IRoutingNode.java | 26 - .../routing/IgnoreNBTItemFilter.java | 21 - .../bloodmagic/routing/ModIdItemFilter.java | 16 - .../bloodmagic/routing/NodeHelper.java | 21 - .../bloodmagic/routing/OreDictItemFilter.java | 40 - .../routing/RoutingFluidFilter.java | 189 -- .../bloodmagic/routing/TestItemFilter.java | 214 -- .../bloodmagic/soul/DemonWillHolder.java | 81 - .../bloodmagic/soul/EnumDemonWillType.java | 46 - .../WayofTime/bloodmagic/soul/IDemonWill.java | 52 - .../bloodmagic/soul/IDemonWillConduit.java | 18 - .../bloodmagic/soul/IDemonWillGem.java | 27 - .../bloodmagic/soul/IDemonWillWeapon.java | 10 - .../bloodmagic/soul/IDiscreteDemonWill.java | 40 - .../bloodmagic/soul/ISoulBreathContainer.java | 15 - .../soul/PlayerDemonWillHandler.java | 176 -- .../structures/BuildTestStructure.java | 56 - .../bloodmagic/structures/Dungeon.java | 152 -- .../bloodmagic/structures/DungeonRoom.java | 62 - .../structures/DungeonRoomLoader.java | 75 - .../structures/DungeonRoomRegistry.java | 28 - .../structures/DungeonStructure.java | 47 - .../bloodmagic/structures/DungeonTester.java | 82 - .../bloodmagic/structures/DungeonUtil.java | 46 - .../bloodmagic/structures/ModDungeons.java | 26 - .../bloodmagic/teleport/ITeleport.java | 7 - .../bloodmagic/teleport/PortalLocation.java | 90 - .../bloodmagic/teleport/Teleport.java | 70 - .../bloodmagic/teleport/TeleportQueue.java | 37 - .../teleport/TeleporterBloodMagic.java | 32 - .../bloodmagic/teleport/Teleports.java | 248 -- .../bloodmagic/tile/TileAlchemyArray.java | 283 +-- .../bloodmagic/tile/TileAlchemyTable.java | 432 ---- .../WayofTime/bloodmagic/tile/TileAltar.java | 339 +-- .../bloodmagic/tile/TileBloodTank.java | 80 - .../bloodmagic/tile/TileDemonCrucible.java | 214 -- .../bloodmagic/tile/TileDemonCrystal.java | 185 -- .../tile/TileDemonCrystallizer.java | 133 - .../bloodmagic/tile/TileDemonPylon.java | 106 - .../tile/TileDimensionalPortal.java | 41 - .../tile/TileImperfectRitualStone.java | 46 - .../bloodmagic/tile/TileIncenseAltar.java | 160 -- .../bloodmagic/tile/TileInventory.java | 478 ++-- .../bloodmagic/tile/TileInversionPillar.java | 532 ---- .../tile/TileMasterRitualStone.java | 459 ---- .../WayofTime/bloodmagic/tile/TileMimic.java | 369 --- .../bloodmagic/tile/TilePhantomBlock.java | 46 - .../tile/TilePurificationAltar.java | 83 - .../bloodmagic/tile/TileSoulForge.java | 587 +++-- .../bloodmagic/tile/TileSpectralBlock.java | 84 - .../bloodmagic/tile/TileTeleposer.java | 149 -- .../bloodmagic/tile/base/TileBase.java | 204 +- .../bloodmagic/tile/base/TileTicking.java | 55 - .../tile/container/ContainerAlchemyTable.java | 123 - .../container/ContainerItemRoutingNode.java | 235 -- .../container/ContainerMasterRoutingNode.java | 20 - .../tile/container/ContainerSoulForge.java | 105 - .../tile/container/ContainerTeleposer.java | 80 - .../tile/routing/TileFilteredRoutingNode.java | 119 - .../tile/routing/TileInputRoutingNode.java | 73 - .../tile/routing/TileItemRoutingNode.java | 7 - .../tile/routing/TileMasterRoutingNode.java | 405 --- .../tile/routing/TileOutputRoutingNode.java | 73 - .../tile/routing/TileRoutingNode.java | 176 -- .../java/WayofTime/bloodmagic/util/BMLog.java | 116 +- .../WayofTime/bloodmagic/util/BlockStack.java | 68 - .../bloodmagic/util/BooleanResult.java | 42 +- .../WayofTime/bloodmagic/util/ChatUtil.java | 435 ++-- .../WayofTime/bloodmagic/util/Constants.java | 286 +-- .../util/DamageSourceBloodMagic.java | 32 +- .../bloodmagic/util/GhostItemHelper.java | 56 - .../bloodmagic/util/ISigilFluidItem.java | 14 - .../bloodmagic/util/ItemStackWrapper.java | 113 - .../WayofTime/bloodmagic/util/PluginUtil.java | 136 - .../bloodmagic/util/SigilFluidWrapper.java | 81 - .../WayofTime/bloodmagic/util/StateUtil.java | 38 - .../java/WayofTime/bloodmagic/util/Utils.java | 1013 +------- .../bloodmagic/util/handler/IMCHandler.java | 61 - .../util/handler/event/ClientHandler.java | 398 --- .../util/handler/event/CraftingHandler.java | 149 -- .../util/handler/event/GenericHandler.java | 624 +---- .../handler/event/LivingArmourHandler.java | 372 --- .../handler/event/StatTrackerHandler.java | 175 -- .../util/handler/event/WillHandler.java | 253 +- .../util/helper/BindableHelper.java | 79 +- .../bloodmagic/util/helper/IncenseHelper.java | 46 - .../bloodmagic/util/helper/ItemHelper.java | 131 - .../bloodmagic/util/helper/NBTHelper.java | 18 +- .../bloodmagic/util/helper/NetworkHelper.java | 281 +- .../bloodmagic/util/helper/NumeralHelper.java | 51 +- .../bloodmagic/util/helper/PlayerHelper.java | 93 +- .../util/helper/PlayerSacrificeHelper.java | 244 +- .../util/helper/PurificationHelper.java | 33 - .../bloodmagic/util/helper/RecipeHelper.java | 55 - .../bloodmagic/util/helper/RitualHelper.java | 211 -- .../bloodmagic/util/helper/TextHelper.java | 108 +- .../bloodmagic/api/IBloodMagicAPI.java | 80 + .../api/IBloodMagicRecipeRegistrar.java | 100 + .../bloodmagic/api/SerializerHelper.java | 60 + .../api/event/BloodMagicCraftedEvent.java | 84 + .../api/impl/recipe/BloodMagicRecipe.java | 69 + .../api/inventory/IgnoredIInventory.java | 67 + .../api/providers/IBaseProvider.java | 23 + .../api/providers/IEntityTypeProvider.java | 32 + .../api/text/IHasTextComponent.java | 8 + .../api/text/IHasTranslationKey.java | 6 + .../bloodmagic/client/ClientEvents.java | 98 + .../client/render/BloodMagicRenderer.java | 104 + .../client/render/RenderResizableCuboid.java | 168 ++ .../render/RenderResizableQuadrilateral.java | 167 ++ .../alchemyarray/AlchemyArrayRenderer.java | 114 + .../render/entity/BloodLightRenderer.java | 24 + .../render/entity/SoulSnareRenderer.java | 24 + .../bloodmagic/client/screens/ScreenBase.java | 68 + .../client/screens/ScreenSoulForge.java | 85 + .../alchemyarray/AlchemyArrayEffect.java | 15 + .../AlchemyArrayEffectCrafting.java | 69 + .../common/block/BlockAlchemyArray.java | 112 + .../bloodmagic/common/block/BlockAltar.java | 100 + .../common/block/BlockBloodLight.java | 64 + .../common/block/BlockBloodRune.java | 45 + .../common/block/BlockSoulForge.java | 95 + .../common/block/BloodMagicBlocks.java | 88 + .../common/block/BloodstoneBlock.java | 13 + .../common/data/GeneratorBaseRecipes.java | 51 + .../common/data/GeneratorBlockStates.java | 38 + .../common/data/GeneratorItemModels.java | 105 + .../common/data/GeneratorLanguage.java | 161 ++ .../common/data/GeneratorLootTable.java | 99 + .../data/recipe/BaseRecipeProvider.java | 44 + .../data/recipe/BloodMagicRecipeBuilder.java | 145 ++ .../data/recipe/BloodMagicRecipeProvider.java | 25 + .../common/data/recipe/RecipeCriterion.java | 20 + .../builder/AlchemyArrayRecipeBuilder.java | 58 + .../builder/BloodAltarRecipeBuilder.java | 63 + .../builder/TartaricForgeRecipeBuilder.java | 75 + .../common/item/BloodMagicItems.java | 113 + .../common/item/ItemArcaneAshes.java | 98 + .../bloodmagic/common/item/ItemBase.java | 38 + .../common/item/ItemBindableBase.java | 35 + .../bloodmagic/common/item/ItemBloodOrb.java | 106 + .../common/item/ItemDaggerOfSacrifice.java | 75 + .../common/item/ItemSacrificialDagger.java | 204 ++ .../bloodmagic/common/item/ItemSigil.java | 64 + .../common/item/sigil/ItemSigilAir.java | 62 + .../common/item/sigil/ItemSigilBase.java | 51 + .../item/sigil/ItemSigilBloodLight.java | 104 + .../item/sigil/ItemSigilDivination.java | 114 + .../common/item/sigil/ItemSigilFastMiner.java | 61 + .../common/item/sigil/ItemSigilFluidBase.java | 152 ++ .../common/item/sigil/ItemSigilFrost.java | 24 + .../item/sigil/ItemSigilGreenGrove.java | 114 + .../common/item/sigil/ItemSigilLava.java | 90 + .../common/item/sigil/ItemSigilMagnetism.java | 54 + .../item/sigil/ItemSigilToggleable.java | 119 + .../item/sigil/ItemSigilToggleableBase.java | 54 + .../common/item/sigil/ItemSigilVoid.java | 85 + .../common/item/sigil/ItemSigilWater.java | 100 + .../common/item/soul/ItemMonsterSoul.java | 128 + .../common/item/soul/ItemSentientSword.java | 503 ++++ .../common/item/soul/ItemSoulGem.java | 260 ++ .../common/item/soul/ItemSoulSnare.java | 76 + .../recipe/AlchemyArrayRecipeProvider.java | 38 + .../recipe/BloodAltarRecipeProvider.java | 72 + .../common/recipe/BloodMagicRecipeType.java | 13 + .../common/recipe/ISubRecipeProvider.java | 14 + .../recipe/TartaricForgeRecipeProvider.java | 36 + .../AlchemyArrayRecipeSerializer.java | 89 + .../BloodAltarRecipeSerializer.java | 85 + .../TartaricForgeRecipeSerializer.java | 100 + .../common/registration/INamedEntry.java | 11 + .../registration/WrappedDeferredRegister.java | 49 + .../registration/WrappedRegistryObject.java | 32 + .../impl/BloodOrbDeferredRegister.java | 26 + .../impl/BloodOrbRegistryObject.java | 13 + .../impl/EntityTypeDeferredRegister.java | 20 + .../impl/EntityTypeRegistryObject.java | 26 + .../IRecipeSerializerDeferredRegister.java | 23 + .../impl/IRecipeSerializerRegistryObject.java | 24 + .../registries/BloodMagicEntityTypes.java | 22 + .../BloodMagicRecipeSerializers.java | 33 + .../jei/altar/BloodAltarRecipeCategory.java | 130 + .../array/AlchemyArrayCraftingCategory.java | 93 + .../core/registry/AlchemyArrayRegistry.java | 53 + .../AlchemyArrayRendererRegistry.java | 67 + .../bloodmagic/entity/BloodMagicEntities.java | 30 + .../bloodmagic/network/BasePacketHandler.java | 151 ++ .../bloodmagic/potion/BloodMagicPotions.java | 16 + .../bloodmagic/potion/PotionSoulSnare.java | 11 + .../recipe/IRecipeAlchemyArray.java | 31 + .../bloodmagic/recipe/IRecipeBloodAltar.java | 30 + .../recipe/IRecipeTartaricForge.java | 35 + .../tile/contailer/ContainerSoulForge.java | 154 ++ .../bloodmagic/will/DemonWillHolder.java | 99 + .../bloodmagic/will/EnumDemonWillType.java | 33 + .../wayoftime/bloodmagic/will/IDemonWill.java | 45 + .../bloodmagic/will/IDemonWillConduit.java | 19 + .../bloodmagic/will/IDemonWillGem.java | 29 + .../bloodmagic/will/IDemonWillWeapon.java | 11 + .../bloodmagic/will/IDiscreteDemonWill.java | 41 + .../will/PlayerDemonWillHandler.java | 200 ++ src/main/resources/META-INF/mods.toml | 59 + .../armatures/block/pillar_mid.json | 42 - .../asms/block/inversion_pillar.json | 13 - .../blockstates/activation_crystal.json | 26 - .../bloodmagic/blockstates/alchemic_vial.json | 18 - .../bloodmagic/blockstates/alchemy_array.json | 7 +- .../bloodmagic/blockstates/alchemy_table.json | 50 - .../assets/bloodmagic/blockstates/altar.json | 21 +- .../bloodmagic/blockstates/altar_maker.json | 16 - .../bloodmagic/blockstates/arcane_ashes.json | 16 - .../blockstates/base_fluid_filter.json | 16 - .../blockstates/base_item_filter.json | 31 - .../bloodmagic/blockstates/blood_light.json | 10 - .../bloodmagic/blockstates/blood_orb.json | 41 - .../bloodmagic/blockstates/blood_rune.json | 67 - .../bloodmagic/blockstates/blood_shard.json | 21 - .../bloodmagic/blockstates/blood_tank.json | 29 - .../bloodmagic/blockstates/bound_axe.json | 21 - .../bloodmagic/blockstates/bound_pickaxe.json | 21 - .../bloodmagic/blockstates/bound_shovel.json | 21 - .../bloodmagic/blockstates/bound_sword.json | 21 - .../bloodmagic/blockstates/component.json | 176 -- .../bloodmagic/blockstates/cutting_fluid.json | 21 - .../blockstates/dagger_of_sacrifice.json | 16 - .../blockstates/decorative_brick.json | 32 - .../bloodmagic/blockstates/demon_brick_1.json | 35 - .../bloodmagic/blockstates/demon_brick_2.json | 88 - .../blockstates/demon_crucible.json | 14 - .../bloodmagic/blockstates/demon_crystal.json | 146 -- .../blockstates/demon_crystallizer.json | 14 - .../bloodmagic/blockstates/demon_extras.json | 88 - .../bloodmagic/blockstates/demon_light.json | 38 - .../blockstates/demon_pillar_1.json | 58 - .../blockstates/demon_pillar_2.json | 58 - .../blockstates/demon_pillar_cap_1.json | 57 - .../blockstates/demon_pillar_cap_2.json | 57 - .../blockstates/demon_pillar_cap_3.json | 50 - .../bloodmagic/blockstates/demon_pylon.json | 14 - .../blockstates/demon_stairs_1.json | 100 - .../blockstates/demon_stairs_2.json | 100 - .../blockstates/demon_stairs_3.json | 59 - .../bloodmagic/blockstates/demon_wall_1.json | 109 - .../blockstates/demon_will_gauge.json | 16 - .../blockstates/dimensional_portal.json | 14 - .../blockstates/experience_tome.json | 16 - .../bloodmagic/blockstates/icarus_scroll.json | 21 - .../bloodmagic/blockstates/incense_altar.json | 14 - .../blockstates/input_routing_node.json | 66 - .../blockstates/inscription_tool.json | 42 - .../blockstates/inversion_pillar.json | 51 - .../blockstates/inversion_pillar_end.json | 72 - .../blockstates/item_demon_crystal.json | 36 - .../blockstates/item_routing_node.json | 66 - .../bloodmagic/blockstates/lava_crystal.json | 16 - .../bloodmagic/blockstates/life_essence.json | 9 - .../bloodmagic/blockstates/living_armour.json | 31 - .../blockstates/master_routing_node.json | 65 - .../assets/bloodmagic/blockstates/mimic.json | 38 - .../bloodmagic/blockstates/monster_soul.json | 36 - .../bloodmagic/blockstates/node_router.json | 16 - .../blockstates/output_routing_node.json | 66 - .../blockstates/pack_sacrifice.json | 16 - .../blockstates/pack_self_sacrifice.json | 16 - .../assets/bloodmagic/blockstates/path.json | 53 - .../bloodmagic/blockstates/phantom.json | 5 - .../blockstates/points_upgrade.json | 16 - .../bloodmagic/blockstates/potion_flask.json | 23 - .../blockstates/ritual_controller.json | 27 - .../blockstates/ritual_diviner.json | 26 - .../bloodmagic/blockstates/ritual_reader.json | 16 - .../bloodmagic/blockstates/ritual_stone.json | 47 - .../blockstates/sacrificial_dagger.json | 26 - .../bloodmagic/blockstates/sanguine_book.json | 16 - .../blockstates/sentient_armour.json | 111 - .../blockstates/sentient_armour_gem.json | 21 - .../bloodmagic/blockstates/sentient_axe.json | 36 - .../bloodmagic/blockstates/sentient_bow.json | 34 - .../blockstates/sentient_pickaxe.json | 36 - .../blockstates/sentient_shovel.json | 36 - .../blockstates/sentient_sword.json | 36 - .../bloodmagic/blockstates/sigil_air.json | 16 - .../blockstates/sigil_blood_light.json | 16 - .../bloodmagic/blockstates/sigil_bounce.json | 22 - .../bloodmagic/blockstates/sigil_claw.json | 21 - .../blockstates/sigil_compression.json | 21 - .../blockstates/sigil_divination.json | 16 - .../blockstates/sigil_elemental_affinity.json | 21 - .../blockstates/sigil_ender_severance.json | 21 - .../blockstates/sigil_fast_miner.json | 21 - .../bloodmagic/blockstates/sigil_frost.json | 22 - .../blockstates/sigil_green_grove.json | 21 - .../bloodmagic/blockstates/sigil_haste.json | 21 - .../bloodmagic/blockstates/sigil_holding.json | 22 - .../bloodmagic/blockstates/sigil_lava.json | 16 - .../blockstates/sigil_magnetism.json | 21 - .../blockstates/sigil_phantom_bridge.json | 21 - .../bloodmagic/blockstates/sigil_seer.json | 16 - .../blockstates/sigil_suppression.json | 21 - .../blockstates/sigil_teleposition.json | 16 - .../blockstates/sigil_transposition.json | 16 - .../bloodmagic/blockstates/sigil_void.json | 16 - .../bloodmagic/blockstates/sigil_water.json | 16 - .../blockstates/sigil_whirlwind.json | 21 - .../assets/bloodmagic/blockstates/slate.json | 36 - .../bloodmagic/blockstates/soul_forge.json | 14 - .../bloodmagic/blockstates/soul_gem.json | 136 - .../bloodmagic/blockstates/soul_snare.json | 16 - .../bloodmagic/blockstates/soulforge.json | 7 + .../bloodmagic/blockstates/spectral.json | 10 - .../bloodmagic/blockstates/teleposer.json | 17 - .../blockstates/teleposition_focus.json | 31 - .../blockstates/test_spell_block.json | 29 - .../bloodmagic/blockstates/upgrade_tome.json | 16 - .../blockstates/upgrade_trainer.json | 16 - .../assets/bloodmagic/books/architect.xml | 106 - .../assets/bloodmagic/lang/bg_BG.lang | 85 - .../assets/bloodmagic/lang/de_DE.lang | 908 ------- .../assets/bloodmagic/lang/en_US.lang | 954 ------- .../assets/bloodmagic/lang/en_US.lang_old | 542 ---- .../assets/bloodmagic/lang/fr_FR.lang | 649 ----- .../assets/bloodmagic/lang/it_IT.lang | 181 -- .../assets/bloodmagic/lang/ja_JP.lang | 892 ------- .../assets/bloodmagic/lang/ko_KR.lang | 194 -- .../assets/bloodmagic/lang/ru_RU.lang | 572 ----- .../assets/bloodmagic/lang/zh_CN.lang | 890 ------- .../assets/bloodmagic/lang/zh_TW.lang | 404 --- .../bloodmagic/loot_tables/bm_loot_table.json | 25 - .../bloodmagic/models/block/blockaltar.obj | 2 +- .../models/block/blockhellfireforge.obj | 2 +- .../bloodmagic/models/block/bloodaltar.json | 10 + .../bloodmagic/models/block/soulforge.json | 10 + .../assets/bloodmagic/models/item/altar.json | 3 + .../models/item/life_essence_bucket.json | 5 + .../bloodmagic/models/item/soulforge.json | 3 + .../assets/bloodmagic/recipes/_constants.json | 128 - .../assets/bloodmagic/recipes/_factories.json | 5 - .../recipes/activation_crystal.json | 16 - .../bloodmagic/recipes/alchemy_table.json | 29 - .../recipes/base_fluid_filter_0.json | 24 - .../recipes/base_item_filter_0.json | 24 - .../recipes/base_item_filter_1.json | 24 - .../recipes/base_item_filter_2.json | 24 - .../recipes/base_item_filter_3.json | 24 - .../blood_rune/blood_rune_acceleration.json | 32 - .../blood_rune/blood_rune_augcapacity.json | 32 - .../recipes/blood_rune/blood_rune_blank.json | 25 - .../blood_rune/blood_rune_capacity.json | 28 - .../blood_rune/blood_rune_charging.json | 32 - .../blood_rune/blood_rune_displacement.json | 28 - .../recipes/blood_rune/blood_rune_orb.json | 29 - .../blood_rune/blood_rune_sacrifice.json | 32 - .../blood_rune/blood_rune_selfsacrifice.json | 32 - .../recipes/blood_rune/blood_rune_speed.json | 28 - .../recipes/blood_tank/blood_tank_0.json | 25 - .../recipes/blood_tank/blood_tank_1.json | 26 - .../recipes/blood_tank/blood_tank_10.json | 26 - .../recipes/blood_tank/blood_tank_11.json | 26 - .../recipes/blood_tank/blood_tank_12.json | 26 - .../recipes/blood_tank/blood_tank_13.json | 26 - .../recipes/blood_tank/blood_tank_14.json | 26 - .../recipes/blood_tank/blood_tank_15.json | 26 - .../recipes/blood_tank/blood_tank_2.json | 26 - .../recipes/blood_tank/blood_tank_3.json | 26 - .../recipes/blood_tank/blood_tank_4.json | 26 - .../recipes/blood_tank/blood_tank_5.json | 26 - .../recipes/blood_tank/blood_tank_6.json | 26 - .../recipes/blood_tank/blood_tank_7.json | 26 - .../recipes/blood_tank/blood_tank_8.json | 26 - .../recipes/blood_tank/blood_tank_9.json | 26 - .../decorative_brick_bloodstone_brick.json | 18 - .../decorative_brick_bloodstone_tile.json | 17 - .../demon_brick_1_brick1_corrosive.json | 18 - .../demon_brick_1_brick1_destructive.json | 18 - .../demon_decor/demon_brick_1_brick1_raw.json | 18 - .../demon_brick_1_brick1_steadfast.json | 18 - .../demon_brick_1_brick1_vengeful.json | 18 - .../demon_brick_2_smallbrick_corrosive.json | 18 - .../demon_brick_2_smallbrick_destructive.json | 18 - .../demon_brick_2_smallbrick_raw.json | 18 - .../demon_brick_2_smallbrick_steadfast.json | 18 - .../demon_brick_2_smallbrick_vengeful.json | 18 - .../demon_brick_2_tile_corrosive.json | 23 - .../demon_brick_2_tile_destructive.json | 23 - .../demon_decor/demon_brick_2_tile_raw.json | 23 - .../demon_brick_2_tile_steadfast.json | 23 - .../demon_brick_2_tile_vengeful.json | 23 - .../demon_brick_2_tilespecial_corrosive.json | 27 - ...demon_brick_2_tilespecial_destructive.json | 27 - .../demon_brick_2_tilespecial_raw.json | 27 - .../demon_brick_2_tilespecial_steadfast.json | 27 - .../demon_brick_2_tilespecial_vengeful.json | 27 - ...demon_extras_polished_stone_corrosive.json | 18 - ...mon_extras_polished_stone_destructive.json | 18 - .../demon_extras_polished_stone_raw.json | 18 - ...demon_extras_polished_stone_steadfast.json | 18 - .../demon_extras_polished_stone_vengeful.json | 18 - .../demon_extras_stone_corrosive.json | 38 - .../demon_extras_stone_destructive.json | 38 - .../demon_decor/demon_extras_stone_raw.json | 38 - .../demon_extras_stone_steadfast.json | 38 - .../demon_extras_stone_vengeful.json | 38 - .../demon_decor/demon_light_corrosive.json | 22 - .../demon_decor/demon_light_destructive.json | 22 - .../recipes/demon_decor/demon_light_raw.json | 22 - .../demon_decor/demon_light_steadfast.json | 22 - .../demon_decor/demon_light_vengeful.json | 22 - .../demon_decor/demon_pillar_1_corrosive.json | 19 - .../demon_pillar_1_destructive.json | 19 - .../demon_decor/demon_pillar_1_raw.json | 19 - .../demon_decor/demon_pillar_1_steadfast.json | 19 - .../demon_decor/demon_pillar_1_vengeful.json | 19 - .../demon_decor/demon_pillar_2_corrosive.json | 23 - .../demon_pillar_2_destructive.json | 23 - .../demon_decor/demon_pillar_2_raw.json | 23 - .../demon_decor/demon_pillar_2_steadfast.json | 23 - .../demon_decor/demon_pillar_2_vengeful.json | 23 - .../demon_pillar_cap_1_corrosive.json | 18 - .../demon_decor/demon_pillar_cap_1_raw.json | 18 - .../demon_pillar_cap_2_destructive.json | 18 - .../demon_pillar_cap_2_vengeful.json | 18 - .../demon_pillar_cap_3_steadfast.json | 17 - .../demon_decor/demon_stairs_1_corrosive.json | 19 - .../demon_decor/demon_stairs_1_raw.json | 19 - .../demon_stairs_2_destructive.json | 19 - .../demon_decor/demon_stairs_2_vengeful.json | 19 - .../demon_decor/demon_stairs_3_steadfast.json | 18 - .../demon_wall_1_brick_corrosive.json | 18 - .../demon_wall_1_brick_destructive.json | 18 - .../demon_decor/demon_wall_1_brick_raw.json | 18 - .../demon_wall_1_brick_steadfast.json | 18 - .../demon_wall_1_brick_vengeful.json | 18 - .../demon_wall_1_large_corrosive.json | 18 - .../demon_wall_1_large_destructive.json | 18 - .../demon_decor/demon_wall_1_large_raw.json | 18 - .../demon_wall_1_large_steadfast.json | 18 - .../demon_wall_1_large_vengeful.json | 18 - .../demon_wall_1_smallbrick_corrosive.json | 18 - .../demon_wall_1_smallbrick_destructive.json | 18 - .../demon_wall_1_smallbrick_raw.json | 18 - .../demon_wall_1_smallbrick_steadfast.json | 18 - .../demon_wall_1_smallbrick_vengeful.json | 18 - .../bloodmagic/recipes/experience_tome.json | 33 - .../bloodmagic/recipes/incense_altar.json | 27 - .../bloodmagic/recipes/lava_crystal.json | 29 - .../bloodmagic/recipes/mimic_nohitbox.json | 27 - .../bloodmagic/recipes/mimic_solidclear.json | 30 - .../bloodmagic/recipes/mimic_solidlight.json | 33 - .../bloodmagic/recipes/mimic_solidopaque.json | 30 - .../bloodmagic/recipes/pack_sacrifice.json | 29 - .../recipes/pack_self_sacrifice.json | 29 - .../recipes/path/path_obsidian.json | 26 - .../recipes/path/path_obsidiantile.json | 26 - .../bloodmagic/recipes/path/path_stone.json | 26 - .../recipes/path/path_stonetile.json | 26 - .../bloodmagic/recipes/path/path_wood.json | 26 - .../recipes/path/path_woodtile.json | 26 - .../recipes/path/path_wornstone.json | 30 - .../recipes/path/path_wornstonetile.json | 26 - .../recipes/ritual_controller_imperfect.json | 24 - .../recipes/ritual_controller_inverted.json | 20 - .../recipes/ritual_controller_master.json | 25 - .../recipes/ritual_controller_master_alt.json | 13 - .../bloodmagic/recipes/ritual_diviner_0.json | 36 - .../bloodmagic/recipes/ritual_diviner_1.json | 26 - .../bloodmagic/recipes/ritual_reader.json | 27 - .../recipes/ritual_stone_blank.json | 26 - .../recipes/ritual_stone_reset.json | 13 - .../recipes/sacrificial_dagger.json | 23 - .../assets/bloodmagic/recipes/soul_forge.json | 25 - .../assets/bloodmagic/recipes/soul_snare.json | 24 - .../assets/bloodmagic/recipes/teleposer.json | 23 - .../recipes/teleposition_focus_2.json | 17 - .../recipes/teleposition_focus_3.json | 17 - .../bloodmagic/recipes/upgrade_trainer.json | 27 - .../bloodmagic/schematics/corridor1.json | 49 - .../bloodmagic/schematics/hallchest1.json | 41 - .../bloodmagic/schematics/rawbuilding1.json | 47 - .../bloodmagic/schematics/schematics.json | 5 - .../bloodmagic/shaders/beam-broken.frag | 10 - .../assets/bloodmagic/shaders/beam.frag | 12 - .../bloodmagic/structures/building1.nbt | 0 .../bloodmagic/structures/corridor1.nbt | 0 .../bloodmagic/structures/hallchest1.nbt | 0 .../{blocks => block}/accelerationrune.png | Bin .../{blocks => block}/airritualstone.png | Bin .../{blocks => block}/altarcapacityrune.png | Bin .../{blocks => block}/bettercapacityrune.png | Bin .../textures/{blocks => block}/blankrune.png | Bin .../bloodlight.png} | Bin .../{blocks => block}/bloodsocket.png | Bin .../{blocks => block}/bloodstonebrick.png | Bin .../textures/{blocks => block}/bloodtank.png | Bin .../{blocks => block}/chargingrune.png | Bin .../{blocks => block}/dislocationrune.png | Bin .../dungeon/dungeon_brick1.png | Bin .../dungeon/dungeon_brick1_c.png | Bin .../dungeon/dungeon_brick1_d.png | Bin .../dungeon/dungeon_brick1_s.png | Bin .../dungeon/dungeon_brick1_v.png | Bin .../dungeon/dungeon_brick2.png | Bin .../dungeon/dungeon_brick2_c.png | Bin .../dungeon/dungeon_brick2_d.png | Bin .../dungeon/dungeon_brick2_s.png | Bin .../dungeon/dungeon_brick2_v.png | Bin .../dungeon/dungeon_brick3.png | Bin .../dungeon/dungeon_brick3_c.png | Bin .../dungeon/dungeon_brick3_d.png | Bin .../dungeon/dungeon_brick3_s.png | Bin .../dungeon/dungeon_brick3_v.png | Bin .../{blocks => block}/dungeon/dungeon_eye.png | Bin .../dungeon/dungeon_eye_c.png | Bin .../dungeon/dungeon_eye_d.png | Bin .../dungeon/dungeon_eye_s.png | Bin .../dungeon/dungeon_eye_v.png | Bin .../dungeon/dungeon_metal.png | Bin .../dungeon/dungeon_metal_c.png | Bin .../dungeon/dungeon_metal_d.png | Bin .../dungeon/dungeon_metal_s.png | Bin .../dungeon/dungeon_metal_v.png | Bin .../dungeon/dungeon_pillar.png | Bin .../dungeon/dungeon_pillar_c.png | Bin .../dungeon/dungeon_pillar_d.png | Bin .../dungeon/dungeon_pillar_s.png | Bin .../dungeon/dungeon_pillar_v.png | Bin .../dungeon/dungeon_pillarbottom.png | Bin .../dungeon/dungeon_pillarbottom_c.png | Bin .../dungeon/dungeon_pillarbottom_d.png | Bin .../dungeon/dungeon_pillarbottom_s.png | Bin .../dungeon/dungeon_pillarbottom_v.png | Bin .../dungeon/dungeon_pillarheart.png | Bin .../dungeon/dungeon_pillarheart_c.png | Bin .../dungeon/dungeon_pillarheart_d.png | Bin .../dungeon/dungeon_pillarheart_s.png | Bin .../dungeon/dungeon_pillarheart_v.png | Bin .../dungeon/dungeon_pillarspecial.png | Bin .../dungeon/dungeon_pillarspecial_c.png | Bin .../dungeon/dungeon_pillarspecial_d.png | Bin .../dungeon/dungeon_pillarspecial_s.png | Bin .../dungeon/dungeon_pillarspecial_v.png | Bin .../dungeon/dungeon_pillartop.png | Bin .../dungeon/dungeon_pillartop_c.png | Bin .../dungeon/dungeon_pillartop_d.png | Bin .../dungeon/dungeon_pillartop_s.png | Bin .../dungeon/dungeon_pillartop_v.png | Bin .../dungeon/dungeon_polished.png | Bin .../dungeon/dungeon_polished_c.png | Bin .../dungeon/dungeon_polished_d.png | Bin .../dungeon/dungeon_polished_s.png | Bin .../dungeon/dungeon_polished_v.png | Bin .../dungeon/dungeon_smallbrick.png | Bin .../dungeon/dungeon_smallbrick_c.png | Bin .../dungeon/dungeon_smallbrick_d.png | Bin .../dungeon/dungeon_smallbrick_s.png | Bin .../dungeon/dungeon_smallbrick_v.png | Bin .../dungeon/dungeon_stone.png | Bin .../dungeon/dungeon_stone_c.png | Bin .../dungeon/dungeon_stone_d.png | Bin .../dungeon/dungeon_stone_s.png | Bin .../dungeon/dungeon_stone_v.png | Bin .../dungeon/dungeon_tile.png | Bin .../dungeon/dungeon_tile_c.png | Bin .../dungeon/dungeon_tile_d.png | Bin .../dungeon/dungeon_tile_s.png | Bin .../dungeon/dungeon_tile_v.png | Bin .../dungeon/dungeon_tilespecial.png | Bin .../dungeon/dungeon_tilespecial_c.png | Bin .../dungeon/dungeon_tilespecial_d.png | Bin .../dungeon/dungeon_tilespecial_s.png | Bin .../dungeon/dungeon_tilespecial_v.png | Bin .../{blocks => block}/duskritualstone.png | Bin .../{blocks => block}/earthritualstone.png | Bin .../{blocks => block}/efficiencyrune.png | Bin .../textures/{blocks => block}/empty.png | Bin .../{blocks => block}/emptysocket.png | Bin .../{blocks => block}/etherealopaquemimic.png | Bin .../{blocks => block}/fireritualstone.png | Bin .../imperfectritualstone.png | Bin .../textures/block/largebloodstonebrick.png | Bin 0 -> 598 bytes .../{blocks => block}/lifeessenceflowing.png | Bin .../lifeessenceflowing.png.mcmeta | 0 .../{blocks => block}/lifeessencestill.png | Bin .../lifeessencestill.png.mcmeta | 0 .../{blocks => block}/lightritualstone.png | Bin .../{blocks => block}/masterritualstone.png | Bin .../masterritualstone_inverted.png | Bin .../{blocks => block}/obsidianbrickpath.png | Bin .../{blocks => block}/obsidiantilepath.png | Bin .../{blocks => block}/orbcapacityrune.png | Bin .../{blocks => block}/phantomblock.png | Bin .../{blocks => block}/ritualstone.png | Bin .../sacrificerune.png} | Bin .../selfsacrificerune.png} | Bin .../{blocks => block}/sentientmimic.png | Bin .../{blocks => block}/shardcluster.png | Bin .../{blocks => block}/shardclusterbrick.png | Bin .../{blocks => block}/simpletranscircle.png | Bin .../{blocks => block}/solidclearmimic.png | Bin .../{blocks => block}/solidlightmimic.png | Bin .../{blocks => block}/solidopaquemimic.png | Bin .../bloodmagic/textures/block/soul_forge.png | Bin 0 -> 1502 bytes .../textures/{blocks => block}/soulforge.png | Bin .../{blocks => block}/spectralblock.png | Bin .../textures/{blocks => block}/speedrune.png | Bin .../{blocks => block}/stonebrickpath.png | Bin .../{blocks => block}/stonetilepath.png | Bin .../{blocks => block}/teleposer_side.png | Bin .../{blocks => block}/teleposer_top.png | Bin .../{blocks => block}/waterritualstone.png | Bin .../{blocks => block}/woodbrickpath.png | Bin .../{blocks => block}/woodtilepath.png | Bin .../{blocks => block}/wornstonebrickpath.png | Bin .../{blocks => block}/wornstonetilepath.png | Bin .../activationcrystalawakened.png | Bin .../activationcrystalcreative.png | Bin .../{items => item}/activationcrystalweak.png | Bin .../{items => item}/airscribetool.png | Bin .../textures/{items => item}/airsigil.png | Bin .../{items => item}/alchemic_liquid.png | Bin .../{items => item}/alchemic_ribbon.png | Bin .../{items => item}/alchemic_vial.png | Bin .../textures/{items => item}/altarmaker.png | Bin .../textures/{items => item}/ampouleempty.png | Bin .../textures/{items => item}/ampoulefull.png | Bin .../textures/{items => item}/antiseptic.png | Bin .../{items => item}/apprenticebloodorb.png | Bin .../textures/{items => item}/arcaneashes.png | Bin .../{items => item}/archmagebloodorb.png | Bin .../{items => item}/basemonstersoul.png | Bin .../basemonstersoul_corrosive.png | Bin .../basemonstersoul_destructive.png | Bin .../basemonstersoul_steadfast.png | Bin .../basemonstersoul_vengeful.png | Bin .../{items => item}/basiccuttingfluid.png | Bin .../textures/{items => item}/blackpudding.png | Bin .../textures/{items => item}/blanksigil.png | Bin .../textures/{items => item}/blankslate.png | Bin .../{items => item}/bloodlightsigil.png | Bin .../textures/{items => item}/bloodpack.png | Bin .../{items => item}/bouncesigil_activated.png | Bin .../bouncesigil_deactivated.png | Bin .../{items => item}/boundaxe_activated.png | Bin .../boundpickaxe_activated.png | Bin .../{items => item}/boundshovel_activated.png | Bin .../{items => item}/boundsword_activated.png | Bin .../textures/{items => item}/boundtool.png | Bin .../{items => item}/bridgesigil_activated.png | Bin .../bridgesigil_deactivated.png | Bin .../{items => item}/ceremonialdagger.png | Bin .../{items => item}/clawsigil_activated.png | Bin .../{items => item}/clawsigil_deactivated.png | Bin .../textures/{items => item}/coagulant.png | Bin .../textures/{items => item}/coalsand.png | Bin .../{items => item}/componentframeparts.png | Bin .../compressionsigil_activated.png | Bin .../compressionsigil_deactivated.png | Bin .../{items => item}/corrosivecrystal.png | Bin .../{items => item}/crucibleupgrade.png | Bin .../{items => item}/daggerofsacrifice.png | Bin .../{items => item}/dawnscribetool.png | Bin .../{items => item}/defaultcrystal.png | Bin .../{items => item}/demonbloodshard.png | Bin .../{items => item}/demonicteleposerfocus.png | Bin .../textures/{items => item}/demonslate.png | Bin .../{items => item}/demonwillgauge.png | Bin .../{items => item}/destructivecrystal.png | Bin .../{items => item}/divinationsigil.png | Bin .../{items => item}/duskscribetool.png | Bin .../{items => item}/earthscribetool.png | Bin .../elementalsigil_activated.png | Bin .../elementalsigil_deactivated.png | Bin .../enhancedteleposerfocus.png | Bin .../{items => item}/etherealslate.png | Bin .../{items => item}/experiencebook.png | Bin .../{items => item}/explosivepowder.png | Bin .../{items => item}/firescribetool.png | Bin .../fluidrouterfilterexact.png | Bin .../textures/{items => item}/goldsand.png | Bin .../{items => item}/growthsigil_activated.png | Bin .../growthsigil_deactivated.png | Bin .../harvestgoddesssigil_activated.png | Bin .../harvestgoddesssigil_deactivated.png | Bin .../{items => item}/hastesigil_activated.png | Bin .../hastesigil_deactivated.png | Bin .../icarusscroll_activated.png | Bin .../icarusscroll_deactivated.png | Bin .../{items => item}/icesigil_activated.png | Bin .../{items => item}/icesigil_deactivated.png | Bin .../textures/{items => item}/information.png | Bin .../textures/{items => item}/infusedslate.png | Bin .../{items => item}/inputroutingfocus.png | Bin .../textures/{items => item}/ironsand.png | Bin .../{items => item}/item_deactivated.png | Bin .../{items => item}/itemrouterfilterexact.png | Bin .../itemrouterfilterignorenbt.png | Bin .../itemrouterfiltermoditems.png | Bin .../itemrouterfilteroredict.png | Bin .../textures/{items => item}/lavacrystal.png | Bin .../textures/{items => item}/lavasigil.png | Bin .../textures/{items => item}/lifebucket.png | Bin .../textures/{items => item}/livingboots.png | Bin .../textures/{items => item}/livinghelmet.png | Bin .../{items => item}/livingleggings.png | Bin .../textures/{items => item}/livingplate.png | Bin .../{items => item}/magicianbloodorb.png | Bin .../textures/{items => item}/mailorder.png | Bin .../{items => item}/masterbloodorb.png | Bin .../{items => item}/miningsigil_activated.png | Bin .../miningsigil_deactivated.png | Bin .../mundanelengtheningcatalyst.png | Bin .../{items => item}/mundanepowercatalyst.png | Bin .../textures/{items => item}/neurotoxin.png | Bin .../textures/{items => item}/noderouter.png | Bin .../textures/{items => item}/plantfibres.png | Bin .../textures/{items => item}/plantoil.png | Bin .../{items => item}/potionflask_outline.png | Bin .../{items => item}/potionflask_overlay.png | Bin .../{items => item}/potionflask_underlay.png | Bin .../{items => item}/reagentaffinity.png | Bin .../textures/{items => item}/reagentair.png | Bin .../{items => item}/reagentbinding.png | Bin .../{items => item}/reagentbloodlight.png | Bin .../{items => item}/reagentbounce.png | Bin .../{items => item}/reagentbridge.png | Bin .../textures/{items => item}/reagentclaw.png | Bin .../{items => item}/reagentcompression.png | Bin .../{items => item}/reagentfastminer.png | Bin .../textures/{items => item}/reagentfrost.png | Bin .../{items => item}/reagentgrowth.png | Bin .../textures/{items => item}/reagenthaste.png | Bin .../{items => item}/reagentholding.png | Bin .../textures/{items => item}/reagentlava.png | Bin .../{items => item}/reagentmagnetism.png | Bin .../{items => item}/reagentseverance.png | Bin .../textures/{items => item}/reagentsight.png | Bin .../{items => item}/reagentsuppression.png | Bin .../{items => item}/reagentteleposition.png | Bin .../{items => item}/reagenttransposition.png | Bin .../textures/{items => item}/reagentvoid.png | Bin .../textures/{items => item}/reagentwater.png | Bin .../textures/{items => item}/reagentwind.png | Bin .../{items => item}/reinforcedslate.png | Bin .../reinforcedteleposerfocus.png | Bin .../{items => item}/ritual_dismantler.png | Bin .../{items => item}/ritualdiviner.png | Bin .../{items => item}/ritualtinkerer.png | Bin .../{items => item}/sacrificeplate.png | Bin .../{items => item}/sacrificialdagger.png | Bin .../textures/{items => item}/saltpeter.png | Bin .../textures/{items => item}/sanguinebook.png | Bin .../textures/{items => item}/seersigil.png | Bin .../{items => item}/selfsacrificeplate.png | Bin .../sentientarmourgem_activated.png | Bin .../sentientarmourgem_corrosive_activated.png | Bin ...entientarmourgem_corrosive_deactivated.png | Bin .../sentientarmourgem_deactivated.png | Bin ...entientarmourgem_destructive_activated.png | Bin ...tientarmourgem_destructive_deactivated.png | Bin .../sentientarmourgem_steadfast_activated.png | Bin ...entientarmourgem_steadfast_deactivated.png | Bin .../sentientarmourgem_vengeful_activated.png | Bin ...sentientarmourgem_vengeful_deactivated.png | Bin .../{items => item}/sentientarrow.png | Bin .../{items => item}/sentientboots.png | Bin .../sentientboots_corrosive.png | Bin .../sentientboots_destructive.png | Bin .../sentientboots_steadfast.png | Bin .../sentientboots_vengeful.png | Bin .../textures/{items => item}/sentientbow.png | Bin .../{items => item}/sentientbow_corrosive.png | Bin .../sentientbow_corrosive_pulling_0.png | Bin .../sentientbow_corrosive_pulling_1.png | Bin .../sentientbow_corrosive_pulling_2.png | Bin .../sentientbow_destructive.png | Bin .../sentientbow_destructive_pulling_0.png | Bin .../sentientbow_destructive_pulling_1.png | Bin .../sentientbow_destructive_pulling_2.png | Bin .../{items => item}/sentientbow_pulling_0.png | Bin .../{items => item}/sentientbow_pulling_1.png | Bin .../{items => item}/sentientbow_pulling_2.png | Bin .../{items => item}/sentientbow_steadfast.png | Bin .../sentientbow_steadfast_pulling_0.png | Bin .../sentientbow_steadfast_pulling_1.png | Bin .../sentientbow_steadfast_pulling_2.png | Bin .../{items => item}/sentientbow_vengeful.png | Bin .../sentientbow_vengeful_pulling_0.png | Bin .../sentientbow_vengeful_pulling_1.png | Bin .../sentientbow_vengeful_pulling_2.png | Bin .../{items => item}/sentienthelmet.png | Bin .../sentienthelmet_corrosive.png | Bin .../sentienthelmet_destructive.png | Bin .../sentienthelmet_steadfast.png | Bin .../sentienthelmet_vengeful.png | Bin .../{items => item}/sentientleggings.png | Bin .../sentientleggings_corrosive.png | Bin .../sentientleggings_destructive.png | Bin .../sentientleggings_steadfast.png | Bin .../sentientleggings_vengeful.png | Bin .../{items => item}/sentientplate.png | Bin .../sentientplate_corrosive.png | Bin .../sentientplate_destructive.png | Bin .../sentientplate_steadfast.png | Bin .../sentientplate_vengeful.png | Bin .../textures/{items => item}/set_area.png | Bin .../{items => item}/set_will_types.png | Bin .../textures/{items => item}/sheatheditem.png | Bin .../{items => item}/sigilofholding.png | Bin .../sigilofmagnetism_activated.png | Bin .../sigilofmagnetism_deactivated.png | Bin .../sigilofseverance_activated.png | Bin .../sigilofseverance_deactivated.png | Bin .../sigilofsuppression_activated.png | Bin .../sigilofsuppression_deactivated.png | Bin .../textures/{items => item}/sigiloverlay.png | Bin .../textures/{items => item}/soulaxe.png | Bin .../{items => item}/soulaxe_corrosive.png | Bin .../{items => item}/soulaxe_destructive.png | Bin .../{items => item}/soulaxe_steadfast.png | Bin .../{items => item}/soulaxe_vengeful.png | Bin .../{items => item}/soulgemcommon.png | Bin .../soulgemcommon_corrosive.png | Bin .../soulgemcommon_destructive.png | Bin .../soulgemcommon_steadfast.png | Bin .../soulgemcommon_vengeful.png | Bin .../textures/{items => item}/soulgemgrand.png | Bin .../soulgemgrand_corrosive.png | Bin .../soulgemgrand_destructive.png | Bin .../soulgemgrand_steadfast.png | Bin .../{items => item}/soulgemgrand_vengeful.png | Bin .../{items => item}/soulgemgreater.png | Bin .../soulgemgreater_corrosive.png | Bin .../soulgemgreater_destructive.png | Bin .../soulgemgreater_steadfast.png | Bin .../soulgemgreater_vengeful.png | Bin .../{items => item}/soulgemlesser.png | Bin .../soulgemlesser_corrosive.png | Bin .../soulgemlesser_destructive.png | Bin .../soulgemlesser_steadfast.png | Bin .../soulgemlesser_vengeful.png | Bin .../textures/{items => item}/soulgempetty.png | Bin .../soulgempetty_corrosive.png | Bin .../soulgempetty_destructive.png | Bin .../soulgempetty_steadfast.png | Bin .../{items => item}/soulgempetty_vengeful.png | Bin .../textures/{items => item}/soulpickaxe.png | Bin .../{items => item}/soulpickaxe_corrosive.png | Bin .../soulpickaxe_destructive.png | Bin .../{items => item}/soulpickaxe_steadfast.png | Bin .../{items => item}/soulpickaxe_vengeful.png | Bin .../textures/{items => item}/soulshovel.png | Bin .../{items => item}/soulshovel_corrosive.png | Bin .../soulshovel_destructive.png | Bin .../{items => item}/soulshovel_steadfast.png | Bin .../{items => item}/soulshovel_vengeful.png | Bin .../textures/{items => item}/soulsnare.png | Bin .../{items => item}/soulsnare_corrosive.png | Bin .../{items => item}/soulsnare_destructive.png | Bin .../{items => item}/soulsnare_steadfast.png | Bin .../{items => item}/soulsnare_vengeful.png | Bin .../{items => item}/soulsword_activated.png | Bin .../soulsword_corrosive_activated.png | Bin .../soulsword_corrosive_deactivated.png | Bin .../{items => item}/soulsword_deactivated.png | Bin .../soulsword_destructive_activated.png | Bin .../soulsword_destructive_deactivated.png | Bin .../soulsword_steadfast_activated.png | Bin .../soulsword_steadfast_deactivated.png | Bin .../soulsword_vengeful_activated.png | Bin .../soulsword_vengeful_deactivated.png | Bin .../{items => item}/steadfastcrystal.png | Bin .../textures/{items => item}/sulfur.png | Bin .../{items => item}/teleposerfocus.png | Bin .../{items => item}/telepositionsigil.png | Bin .../{items => item}/transcendentbloodorb.png | Bin .../{items => item}/transpositionsigil.png | Bin .../textures/{items => item}/upgradetome.png | Bin .../{items => item}/upgradetrainer.png | Bin .../{items => item}/vengefulcrystal.png | Bin .../textures/{items => item}/voidsigil.png | Bin .../warriorsigil_activated.png | Bin .../warriorsigil_deactivated.png | Bin .../{items => item}/waterscribetool.png | Bin .../textures/{items => item}/watersigil.png | Bin .../textures/{items => item}/weakbloodorb.png | Bin .../{items => item}/weakbloodshard.png | Bin .../{items => item}/windsigil_activated.png | Bin .../{items => item}/windsigil_deactivated.png | Bin .../models/alchemyarrays/basearray.png | Bin 20705 -> 35529 bytes .../assets/bloodmagicguide/lang/de_DE.lang | 288 --- .../assets/bloodmagicguide/lang/en_US.lang | 304 --- .../assets/bloodmagicguide/lang/ru_RU.lang | 239 -- .../assets/bloodmagicguide/lang/zh_CN.lang | 270 -- .../assets/bloodmagicguide/lang/zh_TW.lang | 258 -- .../textures/gui/alchemyarraycrafting.png | Bin 2464 -> 0 bytes .../bloodmagicguide/textures/gui/altar.png | Bin 18703 -> 0 bytes .../textures/gui/bullet_point.png | Bin 17840 -> 0 bytes .../textures/gui/soulforge.png | Bin 3452 -> 0 bytes src/main/resources/mcmod.info | 16 - src/main/resources/pack.mcmeta | 7 + 1662 files changed, 18791 insertions(+), 85075 deletions(-) delete mode 100644 .settings/BloodMagic1.8IDEA.jar create mode 100644 .settings/org.eclipse.buildship.core.prefs create mode 100644 CREDITS.txt delete mode 100644 LICENSE create mode 100644 LICENSE.txt delete mode 100644 README.md create mode 100644 README.txt delete mode 100644 gradle/process_mod_info.gradle create mode 100644 runClient.launch create mode 100644 runData.launch create mode 100644 runServer.launch delete mode 100644 settings.gradle delete mode 100644 src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java delete mode 100644 src/api/java/WayofTime/bloodmagic/api/package-info.java create mode 100644 src/generated/resources/.cache/cache create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/accelerationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/altarcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/bettercapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/blankrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/bloodlight.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/chargingrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/dislocationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/orbcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/sacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/selfsacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/blockstates/speedrune.json create mode 100644 src/generated/resources/assets/bloodmagic/lang/en_us.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/accelerationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/altarcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/bettercapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/blankrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/bloodlight.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/chargingrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/dislocationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/orbcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/sacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/selfsacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/block/speedrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/accelerationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/airsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/altarcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/apprenticebloodorb.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/arcaneashes.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/basemonstersoul.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_corrosive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_destructive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_steadfast.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_vengeful.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/bettercapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/blankrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/blankslate.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/bloodlightsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/chargingrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/daggerofsacrifice.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/demonslate.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/dislocationrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/divinationsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/etherealslate.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/growthsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/icesigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/infusedslate.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/lavasigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/magicianbloodorb.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/masterbloodorb.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/miningsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/orbcapacityrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentair.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentbloodlight.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentfastminer.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentgrowth.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentlava.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentmagnetism.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentvoid.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reagentwater.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/reinforcedslate.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/sacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/sacrificialdagger.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/selfsacrificerune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/sigilofmagnetism.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/soulgemcommon.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/soulgemlesser.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/soulgempetty.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/soulsnare.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/soulsword.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/speedrune.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_corrosive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_destructive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_steadfast.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_vengeful.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_corrosive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_destructive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_steadfast.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_vengeful.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_corrosive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_destructive.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_steadfast.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_vengeful.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_activated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/voidsigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/watersigil.json create mode 100644 src/generated/resources/assets/bloodmagic/models/item/weakbloodorb.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_charging.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_orb.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_sacrifice.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_forge.json create mode 100644 src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/accelerationrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemyarray.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/altar.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/altarcapacityrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/bettercapacityrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/blankrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/bloodlight.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/chargingrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/dislocationrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/orbcapacityrune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/sacrificerune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/selfsacrificerune.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/soulforge.json create mode 100644 src/generated/resources/data/bloodmagic/loot_tables/blocks/speedrune.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/apprenticebloodorb.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/daggerofsacrifice.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/demonicslate.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/imbuedslate.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/magicianbloodorb.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/slate.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/altar/weakbloodorb.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/airsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/bloodlightsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/divinationsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/fastminersigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/growthsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/lavasigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/magnetismsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/voidsigil.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/array/watersigil.json rename src/{main/resources/assets/bloodmagic/recipes/altar.json => generated/resources/data/bloodmagic/recipes/blood_altar.json} (61%) create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_blank.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_capacity.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_charging.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_orb.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_sacrifice.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_self_sacrifice.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/blood_rune_speed.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/sacrificial_dagger.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soul_forge.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soul_snare.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/arcaneashes.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/commontartaricgem.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/lessertartaricgem.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/pettytartaricgem.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_fastminer.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_growth.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_lava.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_magnetism.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_void.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_water.json create mode 100644 src/generated/resources/data/bloodmagic/recipes/soulforge/sentientsword.json delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java delete mode 100644 src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockAltar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockPath.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/IBMBlock.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java delete mode 100644 src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/Sprite.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/Elements.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerWill.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java delete mode 100644 src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java delete mode 100644 src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java delete mode 100644 src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java delete mode 100644 src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java delete mode 100644 src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java delete mode 100644 src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/event/RitualEvent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java delete mode 100644 src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/gson/Serializers.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java delete mode 100644 src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java delete mode 100644 src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemEnum.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemSlate.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/item/types/ShardType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java delete mode 100644 src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java delete mode 100644 src/main/java/WayofTime/bloodmagic/meteor/Meteor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java delete mode 100644 src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java delete mode 100644 src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java delete mode 100644 src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModRituals.java delete mode 100644 src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/Ritual.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java delete mode 100644 src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/Dungeon.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/Teleport.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/teleport/Teleports.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileMimic.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/BlockStack.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/PluginUtil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/StateUtil.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java delete mode 100644 src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/event/BloodMagicCraftedEvent.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/impl/recipe/BloodMagicRecipe.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java create mode 100644 src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/ClientEvents.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/BloodMagicRenderer.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/RenderResizableCuboid.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/RenderResizableQuadrilateral.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/alchemyarray/AlchemyArrayRenderer.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/entity/BloodLightRenderer.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/render/entity/SoulSnareRenderer.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/screens/ScreenBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/screens/ScreenSoulForge.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffect.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffectCrafting.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemyArray.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockBloodLight.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/block/BloodstoneBlock.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/BaseRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeBuilder.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/RecipeCriterion.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemArcaneAshes.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemDaggerOfSacrifice.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFastMiner.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFrost.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilGreenGrove.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilMagnetism.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleableBase.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulSnare.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyArrayRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/ISubRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/INamedEntry.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/WrappedDeferredRegister.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/WrappedRegistryObject.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeDeferredRegister.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerDeferredRegister.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerRegistryObject.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicEntityTypes.java create mode 100644 src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java create mode 100644 src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java create mode 100644 src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java create mode 100644 src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java create mode 100644 src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java create mode 100644 src/main/java/wayoftime/bloodmagic/entity/BloodMagicEntities.java create mode 100644 src/main/java/wayoftime/bloodmagic/network/BasePacketHandler.java create mode 100644 src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java create mode 100644 src/main/java/wayoftime/bloodmagic/potion/PotionSoulSnare.java create mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java create mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java create mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java create mode 100644 src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerSoulForge.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/IDemonWill.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java create mode 100644 src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java create mode 100644 src/main/resources/META-INF/mods.toml delete mode 100644 src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json delete mode 100644 src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/altar_maker.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_light.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_orb.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_rune.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_shard.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/blood_tank.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/bound_axe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/bound_sword.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/component.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_extras.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_light.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/experience_tome.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/incense_altar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/life_essence.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/living_armour.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/mimic.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/monster_soul.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/node_router.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/path.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/phantom.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/potion_flask.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_air.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_void.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_water.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/slate.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/soul_forge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/soul_gem.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/soul_snare.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/soulforge.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/spectral.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/teleposer.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json delete mode 100644 src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json delete mode 100644 src/main/resources/assets/bloodmagic/books/architect.xml delete mode 100644 src/main/resources/assets/bloodmagic/lang/bg_BG.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/de_DE.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/en_US.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/en_US.lang_old delete mode 100644 src/main/resources/assets/bloodmagic/lang/fr_FR.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/it_IT.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/ja_JP.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/ko_KR.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/ru_RU.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/zh_CN.lang delete mode 100644 src/main/resources/assets/bloodmagic/lang/zh_TW.lang delete mode 100644 src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/bloodaltar.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/soulforge.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/altar.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/life_essence_bucket.json create mode 100644 src/main/resources/assets/bloodmagic/models/item/soulforge.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/_constants.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/_factories.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/activation_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/alchemy_table.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/experience_tome.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/incense_altar.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/lava_crystal.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_stone.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wood.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_reader.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/soul_forge.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/soul_snare.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposer.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json delete mode 100644 src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json delete mode 100644 src/main/resources/assets/bloodmagic/schematics/corridor1.json delete mode 100644 src/main/resources/assets/bloodmagic/schematics/hallchest1.json delete mode 100644 src/main/resources/assets/bloodmagic/schematics/rawbuilding1.json delete mode 100644 src/main/resources/assets/bloodmagic/schematics/schematics.json delete mode 100644 src/main/resources/assets/bloodmagic/shaders/beam-broken.frag delete mode 100644 src/main/resources/assets/bloodmagic/shaders/beam.frag delete mode 100644 src/main/resources/assets/bloodmagic/structures/building1.nbt delete mode 100644 src/main/resources/assets/bloodmagic/structures/corridor1.nbt delete mode 100644 src/main/resources/assets/bloodmagic/structures/hallchest1.nbt rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/accelerationrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/airritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/altarcapacityrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/bettercapacityrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/blankrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks/largebloodstonebrick.png => block/bloodlight.png} (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/bloodsocket.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/bloodstonebrick.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/bloodtank.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/chargingrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dislocationrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick1_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick1_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick1_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick1_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick2_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick2_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick2_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick2_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick3.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick3_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick3_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick3_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_brick3_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_eye.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_eye_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_eye_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_eye_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_eye_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_metal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_metal_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_metal_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_metal_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_metal_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillar.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillar_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillar_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillar_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillar_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarbottom.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarbottom_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarbottom_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarbottom_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarbottom_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarheart.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarheart_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarheart_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarheart_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarheart_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarspecial.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarspecial_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarspecial_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarspecial_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillarspecial_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillartop.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillartop_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillartop_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillartop_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_pillartop_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_polished.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_polished_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_polished_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_polished_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_polished_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_smallbrick.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_smallbrick_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_smallbrick_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_smallbrick_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_smallbrick_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_stone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_stone_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_stone_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_stone_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_stone_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tile.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tile_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tile_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tile_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tile_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tilespecial.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tilespecial_c.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tilespecial_d.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tilespecial_s.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/dungeon/dungeon_tilespecial_v.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/duskritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/earthritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/efficiencyrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/empty.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/emptysocket.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/etherealopaquemimic.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/fireritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/imperfectritualstone.png (100%) create mode 100644 src/main/resources/assets/bloodmagic/textures/block/largebloodstonebrick.png rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/lifeessenceflowing.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/lifeessenceflowing.png.mcmeta (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/lifeessencestill.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/lifeessencestill.png.mcmeta (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/lightritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/masterritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/masterritualstone_inverted.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/obsidianbrickpath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/obsidiantilepath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/orbcapacityrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/phantomblock.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/ritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks/runeofsacrifice.png => block/sacrificerune.png} (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks/runeofselfsacrifice.png => block/selfsacrificerune.png} (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/sentientmimic.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/shardcluster.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/shardclusterbrick.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/simpletranscircle.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/solidclearmimic.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/solidlightmimic.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/solidopaquemimic.png (100%) create mode 100644 src/main/resources/assets/bloodmagic/textures/block/soul_forge.png rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/soulforge.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/spectralblock.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/speedrune.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/stonebrickpath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/stonetilepath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/teleposer_side.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/teleposer_top.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/waterritualstone.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/woodbrickpath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/woodtilepath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/wornstonebrickpath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{blocks => block}/wornstonetilepath.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/activationcrystalawakened.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/activationcrystalcreative.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/activationcrystalweak.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/airscribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/airsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/alchemic_liquid.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/alchemic_ribbon.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/alchemic_vial.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/altarmaker.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ampouleempty.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ampoulefull.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/antiseptic.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/apprenticebloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/arcaneashes.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/archmagebloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basemonstersoul.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basemonstersoul_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basemonstersoul_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basemonstersoul_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basemonstersoul_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/basiccuttingfluid.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/blackpudding.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/blanksigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/blankslate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bloodlightsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bloodpack.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bouncesigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bouncesigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/boundaxe_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/boundpickaxe_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/boundshovel_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/boundsword_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/boundtool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bridgesigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/bridgesigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ceremonialdagger.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/clawsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/clawsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/coagulant.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/coalsand.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/componentframeparts.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/compressionsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/compressionsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/corrosivecrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/crucibleupgrade.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/daggerofsacrifice.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/dawnscribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/defaultcrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/demonbloodshard.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/demonicteleposerfocus.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/demonslate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/demonwillgauge.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/destructivecrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/divinationsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/duskscribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/earthscribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/elementalsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/elementalsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/enhancedteleposerfocus.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/etherealslate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/experiencebook.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/explosivepowder.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/firescribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/fluidrouterfilterexact.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/goldsand.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/growthsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/growthsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/harvestgoddesssigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/harvestgoddesssigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/hastesigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/hastesigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/icarusscroll_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/icarusscroll_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/icesigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/icesigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/information.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/infusedslate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/inputroutingfocus.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ironsand.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/item_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/itemrouterfilterexact.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/itemrouterfilterignorenbt.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/itemrouterfiltermoditems.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/itemrouterfilteroredict.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/lavacrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/lavasigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/lifebucket.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/livingboots.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/livinghelmet.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/livingleggings.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/livingplate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/magicianbloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/mailorder.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/masterbloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/miningsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/miningsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/mundanelengtheningcatalyst.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/mundanepowercatalyst.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/neurotoxin.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/noderouter.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/plantfibres.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/plantoil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/potionflask_outline.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/potionflask_overlay.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/potionflask_underlay.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentaffinity.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentair.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentbinding.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentbloodlight.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentbounce.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentbridge.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentclaw.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentcompression.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentfastminer.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentfrost.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentgrowth.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagenthaste.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentholding.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentlava.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentmagnetism.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentseverance.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentsight.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentsuppression.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentteleposition.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagenttransposition.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentvoid.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentwater.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reagentwind.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reinforcedslate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/reinforcedteleposerfocus.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ritual_dismantler.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ritualdiviner.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/ritualtinkerer.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sacrificeplate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sacrificialdagger.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/saltpeter.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sanguinebook.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/seersigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/selfsacrificeplate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_corrosive_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_corrosive_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_destructive_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_destructive_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_steadfast_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_steadfast_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_vengeful_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarmourgem_vengeful_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientarrow.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientboots.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientboots_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientboots_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientboots_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientboots_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_corrosive_pulling_0.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_corrosive_pulling_1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_corrosive_pulling_2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_destructive_pulling_0.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_destructive_pulling_1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_destructive_pulling_2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_pulling_0.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_pulling_1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_pulling_2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_steadfast_pulling_0.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_steadfast_pulling_1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_steadfast_pulling_2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_vengeful_pulling_0.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_vengeful_pulling_1.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientbow_vengeful_pulling_2.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentienthelmet.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentienthelmet_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentienthelmet_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentienthelmet_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentienthelmet_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientleggings.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientleggings_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientleggings_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientleggings_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientleggings_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientplate.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientplate_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientplate_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientplate_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sentientplate_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/set_area.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/set_will_types.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sheatheditem.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofholding.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofmagnetism_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofmagnetism_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofseverance_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofseverance_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofsuppression_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigilofsuppression_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sigiloverlay.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulaxe.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulaxe_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulaxe_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulaxe_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulaxe_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemcommon.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemcommon_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemcommon_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemcommon_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemcommon_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgrand.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgrand_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgrand_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgrand_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgrand_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgreater.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgreater_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgreater_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgreater_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemgreater_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemlesser.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemlesser_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemlesser_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemlesser_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgemlesser_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgempetty.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgempetty_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgempetty_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgempetty_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulgempetty_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulpickaxe.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulpickaxe_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulpickaxe_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulpickaxe_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulpickaxe_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulshovel.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulshovel_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulshovel_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulshovel_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulshovel_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsnare.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsnare_corrosive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsnare_destructive.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsnare_steadfast.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsnare_vengeful.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_corrosive_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_corrosive_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_destructive_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_destructive_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_steadfast_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_steadfast_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_vengeful_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/soulsword_vengeful_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/steadfastcrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/sulfur.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/teleposerfocus.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/telepositionsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/transcendentbloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/transpositionsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/upgradetome.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/upgradetrainer.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/vengefulcrystal.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/voidsigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/warriorsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/warriorsigil_deactivated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/waterscribetool.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/watersigil.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/weakbloodorb.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/weakbloodshard.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/windsigil_activated.png (100%) rename src/main/resources/assets/bloodmagic/textures/{items => item}/windsigil_deactivated.png (100%) delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/de_DE.lang delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/en_US.lang delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang delete mode 100644 src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang delete mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png delete mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/altar.png delete mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png delete mode 100644 src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png delete mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/pack.mcmeta diff --git a/.settings/BloodMagic1.8IDEA.jar b/.settings/BloodMagic1.8IDEA.jar deleted file mode 100644 index 839031f4b68356c13ee33e461722e0551f2acf57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 zcmWIWW@Zs#;Nak32wpeeodF5R0onNlC7Jno#rnzlDXDtJC6zfqGC3nPH?>%=A~$EV zr;f&nlRkbrC(oSU{5U9JgXg*Px+l(ipVbaL;eEz;YiQ9qe@|Y$m1jJ8{myxu_2u=` z)jWB|TR)6RlTGWqKEunFmAt%MMPIo)`OCf)d@b$$Ui_srG)Tkyj3(3jQOHNWkCMDfGtI+V%za_tg zb?f%+ldF9E?AiOq){gTnz7CE#GkcOn+~)6;fBA1l>BPn@PExx=CPZjnaGO&nC3N(C z@Ny?nQ-`x6{yfv0O4b}$I(gTc0_{+qV+%I1rQKS@V1H=ARPEX;NAK4z+q~$;)7y); z`+t6`d3PFnqjiBB-)&3vHUQn|Z(t-$0%8j_K@2NE*pKYf&wSubhNWLVy# z$I6ritXSIxB9j7&ak7BXKZergK)$#o<3&f7)Z>lZ!WD{uYnQmM&HeuX5Hg*8XQiiAj>k&o zr3tQjHtngZKW&3-TIn!Em9>=*B{rPMBx&OGFUEaK+?X`a< z?tkJqbMKS*s>x^5LZ2-A75rrH#aICzbNkg_m)ZPLHJlkWox!)|73==ZNyoe8*_z`n z7=v5 zCBt9MihZUF7f(?5WnR}T;<@VNykNN!hsG~4NBg+V(my0~a|HQJ@qTuxYuQcB-BT90 zzPk2dyT!tb#a$bubAz@$jnEP}IBBg|*oIf-D(d>VtLxt0YEhc-DfCsI=)PE3 zjEi+kiPh1+BLCD=Up+n+fAnkIJ&yNt_};y(K6raqS*?Qg(=)-xJtzWeO? z?v;Q;#m=u+dvEOLvV9Y8J8SXozmFcK%Kc>p6=#k;Y5Y$a85owcBPW(aXvLW% zm89n6WO^xhy0|(jxaZ_2CFUpurAwUK* qib-f03)vi4D8qsb6v_xNm6br42Y9oxft0fXVG=M39|1KmFaQ8c&(xOy diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..e8895216 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 74e1c18e..d06adbc3 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,299 +1,392 @@ -# -#Tue Dec 13 20:41:11 EST 2016 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=1 -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=1 -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.comment.format_line_comments=false -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.alignment_for_compact_if=49 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.lineSplit=600 -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert eclipse.preferences.version=1 -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.codeComplete.argumentPrefixes= +org.eclipse.jdt.core.codeComplete.argumentSuffixes= +org.eclipse.jdt.core.codeComplete.fieldPrefixes= +org.eclipse.jdt.core.codeComplete.fieldSuffixes= +org.eclipse.jdt.core.codeComplete.localPrefixes= +org.eclipse.jdt.core.codeComplete.localSuffixes= +org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=1 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=1 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=1 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=1 +org.eclipse.jdt.core.formatter.alignment_for_assertion_message=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=48 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=1 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=1 +org.eclipse.jdt.core.formatter.alignment_for_record_components=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=1 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=0 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=17 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=next_line +org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=true +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=true +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=true +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=true +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=120 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.text_block_indentation=0 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs index 3f2271a9..1994e3f7 100644 --- a/.settings/org.eclipse.jdt.ui.prefs +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -1,11 +1,12 @@ eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_BloodMagic -formatter_settings_version=12 +formatter_profile=_WayofTime-Dev +formatter_settings_version=20 org.eclipse.jdt.ui.exception.name=e org.eclipse.jdt.ui.gettersetter.use.is=true org.eclipse.jdt.ui.keywordthis=false org.eclipse.jdt.ui.overrideannotation=true +org.eclipse.jdt.ui.text.custom_code_templates= sp_cleanup.add_default_serial_version_id=true sp_cleanup.add_generated_serial_version_id=false sp_cleanup.add_missing_annotations=true @@ -21,29 +22,39 @@ sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=false sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.lazy_logical_operator=false sp_cleanup.make_local_variable_final=true sp_cleanup.make_parameters_final=false sp_cleanup.make_private_fields_final=true sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=false +sp_cleanup.merge_conditional_blocks=false sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.number_suffix=false +sp_cleanup.objects_equals=false sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false +sp_cleanup.organize_imports=true +sp_cleanup.precompile_regex=false +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=false sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false @@ -52,15 +63,19 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=false sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=false sp_cleanup.use_this_for_non_static_field_access=false sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false +sp_cleanup.use_var=false diff --git a/CREDITS.txt b/CREDITS.txt new file mode 100644 index 00000000..a70c53d5 --- /dev/null +++ b/CREDITS.txt @@ -0,0 +1,65 @@ +Minecraft Forge: Credits/Thank You + +Forge is a set of tools and modifications to the Minecraft base game code to assist +mod developers in creating new and exciting content. It has been in development for +several years now, but I would like to take this time thank a few people who have +helped it along it's way. + +First, the people who originally created the Forge projects way back in Minecraft +alpha. Eloraam of RedPower, and SpaceToad of Buildcraft, without their acceptiance +of me taking over the project, who knows what Minecraft modding would be today. + +Secondly, someone who has worked with me, and developed some of the core features +that allow modding to be as functional, and as simple as it is, cpw. For developing +FML, which stabelized the client and server modding ecosystem. As well as the base +loading system that allows us to modify Minecraft's code as elegently as possible. + +Mezz, who has stepped up as the issue and pull request manager. Helping to keep me +sane as well as guiding the community into creating better additions to Forge. + +Searge, Bspks, Fesh0r, ProfMobious, and all the rest over on the MCP team {of which +I am a part}. For creating some of the core tools needed to make Minecraft modding +both possible, and as stable as can be. + On that note, here is some specific information of the MCP data we use: + * Minecraft Coder Pack (MCP) * + Forge Mod Loader and Minecraft Forge have permission to distribute and automatically + download components of MCP and distribute MCP data files. This permission is not + transitive and others wishing to redistribute the Minecraft Forge source independently + should seek permission of MCP or remove the MCP data files and request their users + to download MCP separately. + +And lastly, the countless community members who have spent time submitting bug reports, +pull requests, and just helping out the community in general. Thank you. + +--LexManos + +========================================================================= + +This is Forge Mod Loader. + +You can find the source code at all times at https://github.com/MinecraftForge/MinecraftForge/tree/1.12.x/src/main/java/net/minecraftforge/fml + +This minecraft mod is a clean open source implementation of a mod loader for minecraft servers +and minecraft clients. + +The code is authored by cpw. + +It began by partially implementing an API defined by the client side ModLoader, authored by Risugami. +http://www.minecraftforum.net/topic/75440- +This support has been dropped as of Minecraft release 1.7, as Risugami no longer maintains ModLoader. + +It also contains suggestions and hints and generous helpings of code from LexManos, author of MinecraftForge. +http://www.minecraftforge.net/ + +Additionally, it contains an implementation of topological sort based on that +published at http://keithschwarz.com/interesting/code/?dir=topological-sort + +It also contains code from the Maven project for performing versioned dependency +resolution. http://maven.apache.org/ + +It also contains a partial repackaging of the javaxdelta library from http://sourceforge.net/projects/javaxdelta/ +with credit to it's authors. + +Forge Mod Loader downloads components from the Minecraft Coder Pack +(http://mcp.ocean-labs.de/index.php/Main_Page) with kind permission from the MCP team. + diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 264519f7..00000000 --- a/LICENSE +++ /dev/null @@ -1,87 +0,0 @@ -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -Section 1 – Definitions. - -Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. -Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. -Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. -Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. -Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. -Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. -Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. -Licensor means the individual(s) or entity(ies) granting rights under this Public License. -Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. -Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. -You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. -Section 2 – Scope. - -License grant. -Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: -reproduce and Share the Licensed Material, in whole or in part; and -produce, reproduce, and Share Adapted Material. -Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. -Term. The term of this Public License is specified in Section 6(a). -Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. -Downstream recipients. -Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. -No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. -No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). -Other rights. - -Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. -Patent and trademark rights are not licensed under this Public License. -To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - -Attribution. - -If You Share the Licensed Material (including in modified form), You must: - -retain the following if it is supplied by the Licensor with the Licensed Material: -identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); -a copyright notice; -a notice that refers to this Public License; -a notice that refers to the disclaimer of warranties; -a URI or hyperlink to the Licensed Material to the extent reasonably practicable; -indicate if You modified the Licensed Material and retain an indication of any previous modifications; and -indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. -You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. -If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. -If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - -for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; -if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and -You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. -Section 5 – Disclaimer of Warranties and Limitation of Liability. - -Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. -To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. -The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. -Section 6 – Term and Termination. - -This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. -Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - -automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or -upon express reinstatement by the Licensor. -For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. -For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. -Sections 1, 5, 6, 7, and 8 survive termination of this Public License. -Section 7 – Other Terms and Conditions. - -The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. -Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. -Section 8 – Interpretation. - -For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. -To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. -No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. -Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..b0cbe2b3 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,520 @@ +Unless noted below, Minecraft Forge, Forge Mod Loader, and all +parts herein are licensed under the terms of the LGPL 2.1 found +here http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt and +copied below. + +Homepage: http://minecraftforge.net/ + https://github.com/MinecraftForge/MinecraftForge + + +A note on authorship: +All source artifacts are property of their original author, with +the exclusion of the contents of the patches directory and others +copied from it from time to time. Authorship of the contents of +the patches directory is retained by the Minecraft Forge project. +This is because the patches are partially machine generated +artifacts, and are changed heavily due to the way forge works. +Individual attribution within them is impossible. + +Consent: +All contributions to Forge must consent to the release of any +patch content to the Forge project. + +A note on infectivity: +The LGPL is chosen specifically so that projects may depend on Forge +features without being infected with its license. That is the +purpose of the LGPL. Mods and others using this code via ordinary +Java mechanics for referencing libraries are specifically not bound +by Forge's license for the Mod code. + + +=== MCP Data === +This software includes data from the Minecraft Coder Pack (MCP), with kind permission +from them. The license to MCP data is not transitive - distribution of this data by +third parties requires independent licensing from the MCP team. This data is not +redistributable without permission from the MCP team. + +=== Sharing === +I grant permission for some parts of FML to be redistributed outside the terms of the LGPL, for the benefit of +the minecraft modding community. All contributions to these parts should be licensed under the same additional grant. + +-- Runtime patcher -- +License is granted to redistribute the runtime patcher code (src/main/java/net/minecraftforge/fml/common/patcher +and subdirectories) under any alternative open source license as classified by the OSI (http://opensource.org/licenses) + +-- ASM transformers -- +License is granted to redistribute the ASM transformer code (src/main/java/net/minecraftforge/common/asm/ and subdirectories) +under any alternative open source license as classified by the OSI (http://opensource.org/licenses) + +========================================================================= +This software includes portions from the Apache Maven project at +http://maven.apache.org/ specifically the ComparableVersion.java code. It is +included based on guidelines at +http://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html +with notices intact. The only change is a non-functional change of package name. + +This software contains a partial repackaging of javaxdelta, a BSD licensed program for generating +binary differences and applying them, sourced from the subversion at http://sourceforge.net/projects/javaxdelta/ +authored by genman, heikok, pivot. +The only changes are to replace some Trove collection types with standard Java collections, and repackaged. +========================================================================= + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/README.md b/README.md deleted file mode 100644 index c945030e..00000000 --- a/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# Blood Magic: Alchemical Wizardry [![](http://cf.way2muchnoise.eu/full_blood-magic_downloads.svg)](https://minecraft.curseforge.com/projects/blood-magic) [![Discord](https://img.shields.io/discord/259683256348311552.svg?colorB=7289DA&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAABWAgMAAABnZYq0AAAACVBMVEUAAB38%2FPz%2F%2F%2F%2Bm8P%2F9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfhBxwQJhxy2iqrAAABoElEQVRIx7WWzdGEIAyGgcMeKMESrMJ6rILZCiiBg4eYKr%2Fd1ZAfgXFm98sJfAyGNwno3G9sLucgYGpQ4OGVRxQTREMDZjF7ILSWjoiHo1n%2BE03Aw8p7CNY5IhkYd%2F%2F6MtO3f8BNhR1QWnarCH4tr6myl0cWgUVNcfMcXACP1hKrGMt8wcAyxide7Ymcgqale7hN6846uJCkQxw6GG7h2MH4Czz3cLqD1zHu0VOXMfZjHLoYvsdd0Q7ZvsOkafJ1P4QXxrWFd14wMc60h8JKCbyQvImzlFjyGoZTKzohwWR2UzSONHhYXBQOaKKsySsahwGGDnb%2FiYPJw22sCqzirSULYy1qtHhXGbtgrM0oagBV4XiTJok3GoLoDNH8ooTmBm7ZMsbpFzi2bgPGoXWXME6XT%2BRJ4GLddxJ4PpQy7tmfoU2HPN6cKg%2BledKHBKlF8oNSt5w5g5o8eXhu1IOlpl5kGerDxIVT%2BztzKepulD8utXqpChamkzzuo7xYGk%2FkpSYuviLXun5bzdRf0Krejzqyz7Z3p0I1v2d6HmA07dofmS48njAiuMgAAAAASUVORK5CYII%3D)](https://discord.gg/VtNrGrs) - -### Gruesome? Probably. Worth it? Definitely! -### [Downloads](http://minecraft.curseforge.com/projects/blood-magic/files) - -## Information - -Have you ever picked up a magic mod for Minecraft, and thought that it was too tame? Was there not enough danger involved when creating your next high-tech gadget? Bored with all of those peaceful animals just staring at you without a care in the world? Well then, I am glad you came here! - -Blood Magic is an arcane art that is practiced by mages who attempt to gather a vast amount of power through utilizing a forbidden material: blood. Even though it does grant a huge amount of power, every single action that is performed with this volatile magic can prove deadly. You have been warned. - -## Links -* Twitter: [@WayofTime](https://twitter.com/WayofTime) -* Wiki: Found at [FTBWiki](http://ftbwiki.org/Blood_Magic) -* [Minecraft Forum Thread](http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1290532-bm) -* [Curseforge](http://minecraft.curseforge.com/projects/blood-magic) -* [Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=J7SNY7L82PQ82) -* [Patreon](https://www.patreon.com/BloodMagic) - -## Development Setup - -1. Fork this project to your own Github repository and clone it to your desktop. -2. Navigate to the directory you cloned to. Follow the [Forge Documentation](http://mcforge.readthedocs.io/en/latest/gettingstarted/#from-zero-to-modding) (start at step 4) to setup your workspace. If you use IDEA, follow [this set](http://mcforge.readthedocs.io/en/latest/gettingstarted/#terminal-free-intellij-idea-configuration) of steps. - -#### IntelliJ IDEA extra steps - -1. Navigate to `File > Settings > Plugins > Browse repositories...`. Search for Lombok and install the plugin. -2. Navigate to `File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors`. Check `Enable annotation processing`. - -[Setup video](https://www.youtube.com/watch?v=8VEdtQLuLO0&feature=youtu.be) by LexManos. For more information, refer to the [Forge Forums](http://www.minecraftforge.net/forum/index.php/topic,14048.0.html). - - -## Developing Addons - -Add to your build.gradle: - - repositories { - maven { - url "http://tehnut.info/maven/" - } - } - - dependencies { - deobfCompile "com.wayoftime.bloodmagic:BloodMagic:" - } - -`` can be found on CurseForge (or via the Maven itself), check the file name of the version you want. - -## Custom Builds - -**Custom builds are *unsupported*. If you have an issue while using an unofficial build, it is not guaranteed that you will get support.** - -#### How to make a custom build: - -1. Clone directly from this repository to your desktop. -2. Navigate to the directory you cloned to. Open a command window there and run `gradlew build` -3. Once it completes, your new build will be found at `../build/libs/BloodMagic-*.jar`. You can ignore the `deobf`, `sources`, and `javadoc` jars. - -## License - -![CCA4.0](https://licensebuttons.net/l/by/4.0/88x31.png) - -Blood Magic: AlchemicalWizardry by WayofTime is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). - -## Installation Instructions - -This mod requires "Minecraft Forge" in order to operate. It is incredibly easy to download and set up, so might as well get to it! - -1. Download [Forge](http://files.minecraftforge.net/). Usually "Recommended" is best - you want the "universal", not the source. Forge also has an "install" option now, so all you need to do is launch that program and it will make a lovely Forge profile. If you haven't, look up how to use the installer and the new 1.6.x launcher if you are confused! - -2. Download the latest version of BloodMagic from [Curseforge](http://minecraft.curseforge.com/mc-mods/224791-blood-magic). - -3. Place the mod in the **mods** folder of your .minecraft. If you are unsure of where that is located, it is here: `../Users/you/AppData/roaming/.minecraft`. - -## FAQ - -**Q**: My weak blood orb doesn't show my current LP! Fix it please. - -**A**: The mechanic for viewing the player's essence has changed due to some issues with mechanics. You now need a Divination Sigil to view a player's essence. It does other things, too, so it is worth it! - -**Q**: Why am I dying so much? - -**A**: It might be a good idea to make sure that you have enough essence to do a task. If you don't have enough essence for, say, an imperfect ritual, it will take it out of your health. If your health reaches 0... Well, you don't have to be a genius to see what would happen. - -**Q**: Waffles? - -**A**: Waffles! - -**Q**: Where is x? When I watched spotlight "w," it had an item called x. Don't you need x to make y, before you can create z? - -**A**: It might be wise to look at an updated spotlight, or check the changelogs. I'm not evil, so I do document everything that I can. There was most likely some issues with balance with the item, so it may have been removed for those reasons. Or you just grabbed the item from NEI without seeing it was a test item, in which case: shame on you! - -**Q**: Isn't that armour ... - -**A**: Yes, the armour texture is from the mod EE2. Pahimar and I are good friends, and I decided to use it for the armour and tools. He has given me his express permission for it, so need not worry! -[Proof](https://twitter.com/Pahimar/status/453590600689139712). - -**Q**: My game is crashing with the latest TC4! - -**A**: To help stop this, remove the TC4 API from my Blood Magic zip file (if it is there). It should solve things. - -**Q**: But, my Thaumcraft aspects are messed up! - -**A**: Once again, remove the TC4 API from the Blood Magic zip file to solve this. Azanor changed some aspect combinations. - -**Q**: When will 1.7.2 be released? - -**A**: It's out! Go get it! - -**Q**: Way, I've just had an amazing idea! Why not add an in-game book just like the Thaumonomicon? - -**A**: This has been suggested several times. It I being worked on, and is proceeding quite well. Some framework needs to be completed, but it isn't a priority - ALL of the information you need is on this post, or online. - -**Q**: Why do I not have a Sacrificial Orb? It's only showing up as a knife! - -**A**: This is a config option. The person you saw with an orb had a config that changed the knife to an orb. The orb and knife function exactly the same way, but you can change it in the configs by looking for the "Idontlikefun" option. - -**Q**: When I respawn, I appear to only come back with 3 hearts. What's happening? - -**A**: This is due to another config option in the "WhimpySettings," which is due to my attempt to combat Zerg Rushing. You can disable this if you really want to, but it shouldn't hurt unduly. diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..6904b377 --- /dev/null +++ b/README.txt @@ -0,0 +1,53 @@ +------------------------------------------- +Source installation information for modders +------------------------------------------- +This code follows the Minecraft Forge installation methodology. It will apply +some small patches to the vanilla MCP source code, giving you and it access +to some of the data and functions you need to build a successful mod. + +Note also that the patches are built against "unrenamed" MCP source code (aka +srgnames) - this means that you will not be able to read them directly against +normal code. + +Source pack installation information: + +Standalone source installation +============================== + +See the Forge Documentation online for more detailed instructions: +http://mcforge.readthedocs.io/en/latest/gettingstarted/ + +Step 1: Open your command-line and browse to the folder where you extracted the zip file. + +Step 2: You're left with a choice. +If you prefer to use Eclipse: +1. Run the following command: "gradlew genEclipseRuns" (./gradlew genEclipseRuns if you are on Mac/Linux) +2. Open Eclipse, Import > Existing Gradle Project > Select Folder + or run "gradlew eclipse" to generate the project. +(Current Issue) +4. Open Project > Run/Debug Settings > Edit runClient and runServer > Environment +5. Edit MOD_CLASSES to show [modid]%%[Path]; 2 times rather then the generated 4. + +If you prefer to use IntelliJ: +1. Open IDEA, and import project. +2. Select your build.gradle file and have it import. +3. Run the following command: "gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux) +4. Refresh the Gradle Project in IDEA if required. + +If at any point you are missing libraries in your IDE, or you've run into problems you can run "gradlew --refresh-dependencies" to refresh the local cache. "gradlew clean" to reset everything {this does not affect your code} and then start the processs again. + +Should it still not work, +Refer to #ForgeGradle on EsperNet for more information about the gradle environment. +or the Forge Project Discord discord.gg/UvedJ9m + +Forge source installation +========================= +MinecraftForge ships with this code and installs it as part of the forge +installation process, no further action is required on your part. + +LexManos' Install Video +======================= +https://www.youtube.com/watch?v=8VEdtQLuLO0&feature=youtu.be + +For more details update more often refer to the Forge Forums: +http://www.minecraftforge.net/forum/index.php/topic,14048.0.html diff --git a/build.gradle b/build.gradle index b3c27f49..f06f3e9a 100644 --- a/build.gradle +++ b/build.gradle @@ -8,41 +8,40 @@ buildscript { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true } } - -plugins { - id "com.matthewprenger.cursegradle" version "1.3.0" - id "maven-publish" -} - apply plugin: 'net.minecraftforge.gradle' +// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +apply plugin: 'eclipse' +apply plugin: 'maven-publish' -def build_number = System.getenv('BUILD_NUMBER') != null ? System.getenv('BUILD_NUMBER') : 'CUSTOM' -def username = project.hasProperty('dev_username') ? "${dev_username}" : "${mod_name}" +version = '1.16.3-3.0-0' +group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = 'BloodMagic' -group = package_group -archivesBaseName = mod_name -version = "${mc_version}-${mod_version}-${build_number}" - -repositories { - maven { url "http://dvs1.progwml6.com/files/maven" } - maven { url "http://tehnut.info/maven" } -} - -dependencies { - minecraft "net.minecraftforge:forge:${mc_version}-${forge_version}" - compile fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") - compile fg.deobf("mcp.mobius.waila:Hwyla:${waila_version}") -} +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. +println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) minecraft { - mappings channel: "snapshot", version: "20190912-1.14.3" + // The mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD Snapshot are built nightly. + // stable_# Stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not always work. + // Simply re-run your setup task after changing the mappings to update your workspace. + mappings channel: 'snapshot', version: '20200916-1.16.2' + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. + + // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + // Default run configurations. + // These can be tweaked, removed, or duplicated as needed. runs { client { workingDirectory project.file('run') - property 'forge.logging.markers', '' - property 'forge.logging.console.level', 'info' - property 'username', username + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' mods { bloodmagic { @@ -52,9 +51,31 @@ minecraft { } server { - workingDirectory project.file('run/server') - property 'forge.logging.markers', '' - property 'forge.logging.console.level', 'info' + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + mods { + bloodmagic { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'debug' + + args '--mod', 'bloodmagic', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') mods { bloodmagic { @@ -65,119 +86,79 @@ minecraft { } } -apply from: "gradle/process_mod_info.gradle" - -processResources { - inputs.property "version", project.version - - from(sourceSets.main.resources.srcDirs) { - include '**/*.toml' - - expand 'version': project.version - } - from(sourceSets.main.resources.srcDirs) { - exclude '**/*.toml' +repositories { + maven { + url "http://dvs1.progwml6.com/files/maven/" } } -allprojects { - tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - } +dependencies { + // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed + // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. + // The userdev artifact is a special name and will get all sorts of transformations applied to it. + minecraft 'net.minecraftforge:forge:1.16.3-34.1.11' + + // compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}:api") + // runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}") + + //deobfCompile "mezz.jei:jei_${minecraft_version}:${jei_version}" + + compileOnly fg.deobf("mezz.jei:jei-1.16.2:7.1.3.19:api") + runtimeOnly fg.deobf("mezz.jei:jei-1.16.2:7.1.3.19") + // You may put jars on which you depend on in ./libs or you may define them like so.. + // compile "some.group:artifact:version:classifier" + // compile "some.group:artifact:version" + + // Real examples + // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + // provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // These dependencies get remapped to your current MCP mappings + // deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // For more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + } +// Example for how to get properties into the manifest for reading by the runtime.. jar { - classifier = '' - from sourceSets.main.output - manifest.mainAttributes( - "Built-By": System.getProperty('user.name'), - "Created-By": "${System.getProperty('java.vm.version')} + (${System.getProperty('java.vm.vendor')})", + manifest { + attributes([ + "Specification-Title": "bloodmagic", + "Specification-Vendor": "bloodmagicsareus", + "Specification-Version": "1", // We are version 1 of ourselves "Implementation-Title": project.name, - "Implementation-Version": project.version, - "Built-On": "${mc_version}-${forge_version}" - ) + "Implementation-Version": "${version}", + "Implementation-Vendor" :"bloodmagicsareus", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } } -// API jar -task apiJar(type: Jar) { - classifier = 'api' - include 'com/WayofTime/bloodmagic/api/**/*' - exclude 'com/WayofTime/bloodmagic/api/impl/**/*' - from sourceSets.main.allSource - from sourceSets.main.output -} +// Example configuration to allow publishing using the maven-publish task +// This is the preferred method to reobfuscate your jar file +jar.finalizedBy('reobfJar') +// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing +//publish.dependsOn('reobfJar') -task sourcesJar(type: Jar) { - classifier = 'sources' - from sourceSets.main.allJava -} - -tasks.build.dependsOn apiJar, sourcesJar - -tasks.withType(JavaCompile) { task -> - task.options.encoding = 'UTF-8' +sourceSets.main.resources { + srcDir 'src/generated/resources' } publishing { - tasks.publish.dependsOn 'build' publications { mavenJava(MavenPublication) { artifact jar - artifact sourcesJar - artifact apiJar } } repositories { - if (project.hasProperty('maven_repo')) { - maven { url maven_repo } - } else { - mavenLocal() + maven { + url "file:///${project.projectDir}/mcmodsrepo" } } -} - -String getChangelogText() { - def changelogFile = new File('changelog.txt') - String str = '' - String separator = '---' - int lineCount = 0 - boolean done = false - changelogFile.eachLine { - if (done || it == null) { - return - } - if (lineCount < 3) { - lineCount++ - if (it.startsWith(separator)) { - return - } - } - if (!it.startsWith(separator)) { - str += "$it" + (lineCount < 3 ? ':\n\n' : '\n') - return - } - done = true // once we go past the first version block, parse no more - } - return str -} - -def curseRelations = { - optionalLibrary 'jei' - optionalLibrary 'hwyla' -} - -curseforge { - if (project.hasProperty('curse_key_TehNut')) - apiKey = project.curse_key_TehNut - - project { - id = "${curse_id}" - changelog = getChangelogText() - releaseType = 'beta' - - relations curseRelations - - addArtifact sourcesJar - addArtifact apiJar - } -} +} \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index 4c070f99..64fa0593 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,1196 +1,1053 @@ ------------------------------------------------------- -Version 2.4.2 ------------------------------------------------------- -Now with no guarantees for working textures! - -Blood Altar: - - A Blood Altar with a Redstone Lamp below it will now emit a redstone signal upon finishing crafting (#1635) - - Fixed Blood Altar being able to obtain negative progress (#1649) - -Living Armor: - - Fixed Storm Trooper Level 4 costing 65 instead of -65 upgrade points (#1631) - -Rituals: - - Fixed Ritual of the Eternal Soul (Ritual Stone layout & didn't work) (#1633) - - Fixed Ritual Tinkerer (ritual area is now unique per ritual instance), added the ability to reset the ritual ranges to default (#1636) - -Misc: - - Lava Crystals can now set things on fire (#1652) - - Fixed parts of the German translation. Other translations still need to be reworked to accomodate changed translation keys (#1640) - - Fixed Guidebook showing wrong recipes (Rune of Self-Sacrifice instead of others) (#1641) - - Wooden Paths now behave like wood instead of stone (sound & efficient tool) (#1638) - - -Technical Stuff: - - Fixed Veil of Evil and Ward of Sacrosanctity console spam (which could eventually lead to an out of memory exception) (#1639) - - Fixed GLSL shader compilation errors (affected Mesa driver (AMD GPU) on Linux) (#1624) - - Fixed `/bloodmagic network` command permissions (#1613) - - Fixed a rare crash that could occur when summoning mobs (#1618) - ------------------------------------------------------- -Version 2.4.1 ------------------------------------------------------- - -Nut was too lazy to create a changelog, it's AEon's turn now! -Changes made from Feb 02 - now (Fill end date in later) - - -Living Armor: - - Fixed "Soft Fall" not preventing damage - - "Nocturnal Prowess" should not flash anymore - - "Trickshot" now ignores HurtResistanceTime - - "Trickshot" now works properly with sentient arrows - - "Step Assist" does not take effect while sneaking - -Sentient Bow: - - Fixed Destructive Will arrows exploding continuously - - Fixed Tipped Arrows getting improved even if no Will can be used - -Sigils: - - Buffed "Sigil of the Fast Miner" to be in accordance to the "Sanguine Scientium" - - Fixed a bug where "Sigil of the Fast Miner" would also cause the whirlwind effect - - Added "Whirlwind" to the potion registry - - Fixed broken Sigil tooltip formatting - - Fixed Sigil of Holding not updating some Sigil data, allowing for exploits - - Greatly improved "Sigil of Compression" performance - - Fixed "Sigil of Compression" bug that would eat leftover items (usually everything between 55 and 64 items for a 3x3 compression) - - -Rituals: - - Ported Veil of Evil & Ward of Sacrosanctity - - Fixed "Serenade of the Nether" replacing lava source blocks with lava (fixed underlying function to detect flowing liquids) - - Added configurability to Ritual of the High Jump by modifying a new ritual area with the Ritual Tinkerer - -Misc: - - Fixed routing node oredict filter (crashes) - - Fixed mimic vanishing in some cases - - Fixed "Blood Letter's Pack" and "Coat of Arms" always being used in the main hand slot (action bar/hotbar) - - Stop insertions into Demon Crucible if the inventory is not empty - - Fixed abnormal deaths at your own hands through the sacrificial dagger (hopefully) (Gravestone bugginess) - - Fixed "Unmending" mod incompatibility - - Fixed Teleposers crashing the game if someone force-fed it junk - - added Nut being angery at contributors for messing stuff up - - Added some Russian language strings for the guide book - - Added repair recipes for Sentient Tools & Living Armor to JEI - - Many translation keys have changed which makes affected translations fall back to english - -Technical Stuff no player cares about: - - Formatted Project code - - Fixed BlockState parsing (mimic vanishing) - - Fixed some and streamlined ritual block ranges - - Mystery drain still mysterious - - Use TextFormatting rather than color codes in block lang names - - Fixed world unload crash (may happen if a world is loaded by world generators or JEI Resource graphing) - - Fixed `/bloodmagic network get` command - - Added translation keys for tickethistory command help strings - ------------------------------------------------------- -Version 2.4.0 ------------------------------------------------------- - -It's been a while, eh? Some of you may be asking yourself "whats up with bloodmagic" like that damned recon on a certain -social media site. Well here's what's up: put something snarky here when done writing changelog - -There's so much here, I'm probably going to miss some. Here's a general overview from just skimming commit titles. - -Much of this was done via PR because I'm ~~lazy~~ too busy having fun with Fabric. - -- Fixed harvest moon not working with pumpkins -- [API] Added a way to unregister an altar component -- Moved anything related to Tier 6 behind an opt-in config. Please stop asking me how to get it. -- Fixed small demon stone bricks recipe so it returns 4 instead of 1 -- Ported some old rituals from 1.7 - - Cry of the Eternal Soul - - Reverence of the Condor - - Ritual of the Feathered Earth -- Added a new ritual, Ritual of Grounding -- Optimized bound tool harvesting -- Fixed render issues with demon crystals -- Fixed Hymn of Syphoning not updating some tanks visually -- Added very basic documentation for several rituals to the guide book -- Made meteor costs for Mark of the Falling Tower configurable in the meteor json -- Fluid related sigils should now work identically to buckets of the fluid -- Fixed ritual tinkerer area setting behaving wonkily -- Fixed Seer Sigil not working for incense altars -- Added the ability to buff movement and updraft arrays by providing more of their ingredient -- Ported the ritual dismantler from 1.7.10 -- Logic fix for the Solar Powered - - Now it requires a clear line of sight to the sky as well as it being day time -- Fixed Sigil of Magnetism AOE being offset from the player -- Rewrote commands - - They're different in some way, some how - - Don't ask me how -- Quality of life improvements for the ritual tinkerer -- Changed the activation crystal levels of some rituals to use the awakened crystal - - Mark of the Falling Tower - - All the living armor ones - - It's late and I'm tired don't hate me for being too lazy to look up their names -- Fixed up some bounding boxes for some blocks with fancier models -- Sentient Bow now properly handles modded and potion-ified arrows - -I can't wait for this to turn out to be very broken so I can yell at the contributor :> - ------------------------------------------------------- -Version 2.3.3 ------------------------------------------------------- - -- Fixed Altars not filling orbs of their own tier - ------------------------------------------------------- -Version 2.3.2 ------------------------------------------------------- - -looky bois, we beta now - -- Fixed Sentient Sword attacking mobs and players without being provoked -- Fixed weird Crystal Clusters being weird - - They are now less weird -- Fixed Ritual Reader and Tinkerer not being in the creative tab -- Fixed an NPE that would happen with some blocks in the Ritual of Magnetism's area of effect -- Fixed Mimics not being able to replace blocks during placement -- Fixed issues with inter-dimensional teleportation - - Teleposers and Teleposition Sigils are now fully functional -- Fixed custom arrows not having their effects when fired from the Sentient Bow -- Fixed Splash Potions being unthrowable while Living Armor had the quenched downgrade -- Fixed Ritual Stones being considered Iron instead of Rock -- Fixed the Lava, Water, and Void sigils so they now work properly with tanks -- Fixed an issue where the Teleposer would attempt to damage an offline player -- Fixed the Compression Sigil so it now functions -- Fixed low tier altars being able to fill high tier orbs -- Fixed Sentient Tools having the wrong material -- Fixed Sentient Tools not having a repair material - - It is now demon crystals -- Added a config to disable mob drops from mobs killed by the Well of Suffering -- Added an additional glow to the Dagger of Sacrifice when it has a full incense bonus -- Reworked the Phantom Bridge -- Updated german translation -- Updated chinese translation - ------------------------------------------------------- -Version 2.3.1 ------------------------------------------------------- - -- Fixed Ritual of Magnetism not being registered -- Fixed Mob Sacrifice Array so it no longer kills bosses and players -- Fixed Will type serializer using lowercase names -- Fixed item rendering for the Sigil of Holding HUD -- Added mod id to command localization keys to prevent potential conflicts - ------------------------------------------------------- -Version 2.3.0 ------------------------------------------------------- - -- Fixed Basic Cutting Fluid recipe so it no longer requires an unobtainable potion -- Fixed Teleposer Blacklist not working -- Fixed the bounding box on the Blood Tank -- Fixed crafted Inscription Tools not having their uses tag applied -- Fixed JEI queries with bound Blood Orbs -- Fixed Crushing Ritual not passing a valid player -- Fixed Mending applying to Potion Flasks -- Fixed Teleposition Sigil not checking for a Teleposer at it's destination -- Fixed Lava Crystal not syphoning LP -- Fixed the Laputa array moving unbreakable blocks - - ie: Bedrock -- Fixed the Ritual of the Green Grove not working on Cactus and Reeds -- Added a Mob Sacrifice array -- Updated the HUD system - - You can now edit the HUD layout via the in-game config editor with a drag'n'drop system. - - This screen is only available while in a world. -- Updated the German translation -- Updated the Chinese translation -- [API] Reworked how rituals are registered - - This will break any addons that work with rituals - - If you report an issue to me regarding broken addons, it will be closed without any comment - ------------------------------------------------------- -Version 2.2.12 ------------------------------------------------------- -- Fixed Hellfire Forge and Alchemy Table's shape-crafted-ness. -- Fixed Cutting Fluids so they now work properly. -- Fixed the Fluid filters so that they now work perfectly in the routing system. -- Fixed the Living Armour Upgrade that provides night vision, so it is no longer as finicky. -- Proved that Way could update the version number properly without being told by the maid. - ------------------------------------------------------- -Version 2.2.11 ------------------------------------------------------- -- Fixed the Alchemy Array from voiding items when broken when it shouldn't have. -- Fixed Blood Tank NBT transfer between item/tile form. -- Made sure to not offend TehNut's sensibilities :NutMaid: - ------------------------------------------------------- -Version 2.2.10 ------------------------------------------------------- -- Fixed Turret Array crash on servers. -- Fixed the Blood Altar so it can actually fill Blood Orbs (derp). - ------------------------------------------------------- -Version 2.2.9 ------------------------------------------------------- -- Fixed stupid NPE in the Furnace Array -- Fixed various issues with the Alchemy Table: - - Now works for recipes that require an LP cost. - - Hoppers no longer lose items when items are placed into the "slave" Alchemy Table who has some slots restricted. -- Added an entry to the book that explains you can, in fact, use Sea Lanterns instead of glowstone blocks for your Tier 3 altar. -- Fixed the Demon Will crystals growing when they shouldn't. Also lowered the time between natural crystal growths in Will-enriched areas. - - Side note: who's bright idea was it to have to wait 15 minutes per crystal growth? -- Added the "Resonance of the Faceted Crystal", which can be used to create your first aspected Will crystal clusters. -- Made it so the Crystallizer no longer generates a random aspected Will crystal cluster. -- Fixed rare crash with the Blood Altar, which only has a chance of occuring on restart. - ------------------------------------------------------- -Version 2.2.8 ------------------------------------------------------- -- Fixed a client side null-pointer exception with the Blood Lamp - - It's a bright idea to fix this as soon as I can. -- Changed the recipe of the Teleport Array: - - Note from Scotty: Captain, I'll remind ya what happened last time you put an apple in her array! Use an Enderpearl and redstone dust next time! -- Added new arrays - - The Turret Array: - > Place an array on top of an inventory with arrows and then place a bow and an arrow in the array. The array will target enemies greater than 3 blocks away and less than 32, using any arrows in the inventory. - - Spike Array: - > Place a piece of cobblestone and iron ingot in the array. The array deals damage to any living entity that enters -- Increased the max number of items transferable by the Master Routing Node in its system to 64 per second. Will revisit this limit if I figure out a less silly upgrade system. -- Added additional effects to the Sentient Bow when aspected to different Will types. -- Added in book entries for the Teleport Array and the Turret Array. -- Fixed the Haste sigil and "Quick Feet" so that they work with MC's new movement method. -- Removed added health from "Quick Feet" - seriously, why was this a thing? -- Readded the ritual "Focus of the Ellipsoid": creates a hollow ellipsoid from blocks provided in the connecting chest. - - Note: The dictionary definition for "Ellipsoid" is a three-dimensional figure whose plane sections are ellipses or circles. For those who weren't born in a math class, it means it is a sphere that has different radii in each direction. -- Fixed an off by one in altar upgrade management causing the first of any upgrade to not be counted -- Fixed the LP cost of the Master Blood Orb - - This bug has gone unnoticed for 2 years now. -- Potion Flasks can be crafted now -- Fixed a server crash when handling dye recipes -- Moved several text outputs out of the chat and into the action bar -- Fixed a crash when trying to use unbound toggle-able sigils in the Sigil of Holding -- Fixed an issue where unbound sigils could be used inside the Sigil of Holding -- Added missing items for Demon Crystals and Demon Pylons - ------------------------------------------------------- -Version 2.2.7 ------------------------------------------------------- -- Added the Furnace Array: - - Name pending. - - Takes health from nearby players to power adjacent furnaces. - - Not covered by standard medical insurance. -- Added a new Teleport Array: - - Please keep all hands and feet inside the floating circle until you have come to a complete stop. - - Note to Scotty: Feed the non-floating circle a Feather followed by an Apple to initiate the Beaming sequence. -- Seer Sigil should now properly mimic all functions of the Divination Sigil. -- Fixed some console error spam when using Lava/Water/Void sigils. -- Registered Sulfur (dustSulfur) and Saltpeter (dustSaltpeter) to the ore dictionary. -- Rewrote how IBindable stores it's data: - - This will probably break existing worlds if you have Rituals running. Stop them before updating. - - This will also unbind any of your bound items. Bind them again after updating. - - *glances at the big red A next to all 1.12 files* -- Fixed Haste being *constricted* when above level 2. -- De-nerf Fast Miner array so it provides Haste 3 again. -- Prepped API for recipe tweaking mods. - ------------------------------------------------------- -Version 2.2.6 ------------------------------------------------------- - -- Fixed a weird thing where slates were weird -- Added HUD elements for Tranquility and Inversion -- Fixed Sigils stacking 64 times higher than they should have - -As a side note, I've been listening to http://loli.dance/ for the last like 2 hours now. - ------------------------------------------------------- -Version 2.2.5 ------------------------------------------------------- - -- We are now even more sure we're looking at a block before doing blocky things -- Fix Lava Crystal being consumed by furnaces -- Augmented Capacity and Self Sacrifice runes remember their names now -- Satiated Stomach will now let you gorge yourself on overly high saturation foods - - I'm looking at you, Pam. Stop being weird and giving your foods 28 saturation. -- Made Mod ID node filter dumber so it actually, like, works properly -- "Temporarily" disabled cross-dimensional teleports for entities. Temporarily. - - Did I mention this is temporary? As in totally not permanently? - - Who am I kidding? I'll probably forget about this. -- Bounce Arrays are no longer death traps when sneaking. - ------------------------------------------------------- -Version 2.2.4 ------------------------------------------------------- - -- Make sure we're looking at a block before doing blocky things -- Slightly altered the altar's renderer -- Added new spammy logging with config options - - Prints out information like mods registering things via the API and stuff - ------------------------------------------------------- -Version 2.2.3 ------------------------------------------------------- - -- Fixed mundane components being really really really thirsty - - (everything required water reagents. everything.) -- Buffed the Fast Miner array with a nerf - - Vanilla doesn't like Haste 3 I guess? -- Moved Divination Sigil altar output to a HUD element - - RIP Blood Altar chat spam 2014-2018 -- Mark of the Falling Tower is now re-opened and ready for sacrifices. -- Polished Demon Stones are no longer lonely uncraftable bois -- Somewhat more efficient (at least LoC wise) altar upgrade checking -- Blood Altar is now less stingy about outputs -- Coerced augmented Potion Flask recipe outputs out of hiding - ------------------------------------------------------- -Version 2.2.2 ------------------------------------------------------- - -- Fixed Alchemy Arrays so they might actually function now. Might. - - How did this even function properly before? I have no idea. -- Soul Snare should now stop giving the thrower ghosty debuffs. Should. -- Blood Magic is now in the mood to launch on servers. Probably. -- Soul Forge crafting works again! Potentially! -- Fixed the altar nuking any and all NBT attached to output items. -- Fixed the version not being replaced properly -- Rewrote Hwyla integration. - - Should now function a lot nicer. -- Implemented a new API for recipe registration - - Still need to move the alchemy table over, but otherwise this seems to function just fine. -- Implemented a new API for registering tranquility blocks. - - Will allow Chisel to stop crashing - ------------------------------------------------------- -Version 2.2.1 ------------------------------------------------------- - -- Fixed crashes when using systems that depended on internal entity names -- Fixed a crash when attempting to get the owner from unbound bindable items -- Fixed a server crash on startup -- Fixed GUIs not displaying the background and tooltips properly -- Helped the Sentient Sword get over it's identity crisis -- By the way I'm not actually upset or anything guys. - - Please stop overreacting Reddit. - ------------------------------------------------------- -Version 2.2.0 ------------------------------------------------------- - -- Basic port to 1.12 - - Does not include the vast majority of rewrites and cleanup I did on the other branch - - Completely untested. Done out of spite. Go away. - - There, you have it. Screw off now. - ------------------------------------------------------- -Version 2.1.11 ------------------------------------------------------- - -- Added support for some modded crops (Untested. Theoretically they work) - - Harvestcraft - - Actually Additions - - Extra Utilities -- Fixed permission level for sub-commands -- Large Bloodstone Bricks should receive 4 from a craft -- Fixed Diamond Meteor giving blocks of diamond -- Dynamically calculate Meteor Weight -- Fixed NPE in fluid filter -- Fixed Blood Tank capacity being reset when the chunk reloaded -- Updated russian translation -- Fixed Rune Type capability not registering on physical client -- Updated Sigil of Holding texture so set color is more visible -- Fixed blocks destroyed by bound tools not storing any NBT data -- Fixed Harvest ritual not working on Melons and Pumpkins -- [API] Methods for removing recipes - ------------------------------------------------------- -Version 2.1.10 ------------------------------------------------------- - -- Fixed malicious clients being able to load arbitrary chunks on the server -- Fixed Bound tools not setting their tool class and harvest level - ------------------------------------------------------- -Version 2.1.9 ------------------------------------------------------- - -- Fixed Alchemy Table overwriting output each time it crafted something - - https://github.com/WayofTime/BloodMagic/issues/1119 -- Blood Magic commands (/bloodmagic) can now be used in Command Blocks - - https://github.com/WayofTime/BloodMagic/issues/1117 -- Re-implemented the Soul Fray debuff on death - - No more exploiting sacrifice by killing yourself over and over (again) - - https://github.com/WayofTime/BloodMagic/issues/1118 -- Updated Traditional Chinese localization - - https://github.com/WayofTime/BloodMagic/pull/1116 - ------------------------------------------------------- -Version 2.1.8 ------------------------------------------------------- - -- Fixed more null stack issues - - Will it ever end? -- Fixed a crash when activating a ritual via Redstone -- Fixed a fluid handling issue with Blood Tanks - - https://github.com/WayofTime/BloodMagic/issues/1108 -- Fixed issue where Sigils inside a Sigil of Holding were using the wrong item - - https://github.com/WayofTime/BloodMagic/issues/1102 -- Fixed crash when activing Bound Tools - - https://github.com/WayofTime/BloodMagic/issues/1114 -- Updated the Chinese localization - - https://github.com/WayofTime/BloodMagic/pull/1052 -- Placer Ritual is now much more performant -- Many recipes have been moved over to support the Ore Dictionary - - https://github.com/WayofTime/BloodMagic/issues/1101 - ------------------------------------------------------- -Version 2.1.7 ------------------------------------------------------- - -- Fixed Grave Digger not applying damage bonus - - https://github.com/WayofTime/BloodMagic/issues/1098 -- Fixed crash when attempting to handle the dropping of Demonic Will - - https://github.com/WayofTime/BloodMagic/issues/1091 -- Fixed Crash of the Timberman dupe - - This also adds support for IItemHandler based inventories - - https://github.com/WayofTime/BloodMagic/issues/1090 -- Fixed a crash when a Meteor struck the ground - - https://github.com/WayofTime/BloodMagic/issues/1088 -- Fixed the Seer's Sigil not using Roman Numerals to display the altar tier - - https://github.com/WayofTime/BloodMagic/pull/1094 - ------------------------------------------------------- -Version 2.1.6 ------------------------------------------------------- -- Fixed invisible Sentient Specters destroying everything and everybody around their owners - - lol - - https://github.com/WayofTime/BloodMagic/issues/1065 -- Fixed occasional crash when Blood Altar checked it's recipe - - https://github.com/WayofTime/BloodMagic/issues/1086 -- Fixed Blood Light acting as a collidable block in obfuscated environments - - I think - - https://github.com/WayofTime/BloodMagic/issues/1083 -- Fixed crash when Alchemy Table fully depleted a Cutting Fluid item - - https://github.com/WayofTime/BloodMagic/issues/1082 -- Fixed crash when scrolling through Sigil of Holding - - https://github.com/WayofTime/BloodMagic/issues/1081 -- Fixed not being able to take Gems out of Demon Crucibles - - https://github.com/WayofTime/BloodMagic/issues/1079 -- Fixed some more null stack issues - - When is this going to be over... - - https://github.com/WayofTime/BloodMagic/issues/1068 -- Fixed JEI not displaying Armor Tomes -- Fixed Body Builder level 4 being 5x more expensive than level 5 - - https://github.com/WayofTime/BloodMagic/pull/1080 -- Updated Japanese localization - - https://github.com/WayofTime/BloodMagic/pull/1076 - ------------------------------------------------------- -Version 2.1.5 ------------------------------------------------------- -- Fixed Hellfire Forge slots acting up - - i is not j no matter how similar they look -- Fixed JEI compat for Alchemy Table recipes -- Fixed a lot more null stack checks -- Fixed (yet another) crash when creating an "invalid" stack of the Blood Tank -- Fixed Demon Will Crystal and Teleposer crashy interaction -- Fixed crash when working with toggleable sigils - ------------------------------------------------------- -Version 2.1.4 ------------------------------------------------------- -- Fixed a crash when checking if two items could be combined -- Fixed a crash when attempting to open the Sigil of Holding GUI -- Fixed a crash when somebody made an "invalid" stack of the Blood Tank -- Fixed a crash/hilarity where a Blood Altar would update itself as a Comparator - - Thanks to Arcaratus for causing this. I haven't laughed that hard in a while. - ------------------------------------------------------- -Version 2.1.3 ------------------------------------------------------- -- Added a new Master Ritual Stone that inverts it's redstone activity -- Fixed Living Armor attributes overriding eachother instead of adding up -- Fixed Ore doubling sometimes adding invalid recipes -- Downgrade tomes are now called Downgrade Tomes -- Added some caching to rituals to (hopefully) increase performance with less world data query-ing - ------------------------------------------------------- -Version 2.1.2 ------------------------------------------------------- -- Fixed server crash when creating the guide entries - ------------------------------------------------------- -Version 2.1.1-70 ------------------------------------------------------- -- Updated to Minecraft 1.11(.2) -- Fixed the Living Armour Sacrificial Upgrade -- Fixed Bound Tools not draining LP -- Implemented the Blood Tank - - Current recipes are temporaryâ„¢ -- Empty flasks can now be refilled to create a new flask -- Fixed Aura of Expulsion whitelist -- Added the Altar's Charge value to the Waila Tooltip when holding a Seer's Sigil -- Fixed meteor config error caused by EnderCore reloading configs early into startup -- Fixed meteor config not generating new entries -- Blacklisted Sentient Spectres from the Well of Suffering -- Fixed Sigils drawing from the user instead of the bound network -- Added Fluid routing to the routing nodes - this is done by using the Fluid Filter and placing a fluid container as the filter. -- Made it so the book does not give the filling recipe when the Blood Orb recipe is queried. -- Added a null check for the Will getter for the Aura incase the WillChunk somehow does not generate. -- [API] Added a new IMC API for modders to register their blocks as an altar component. - - Example: Chisel Glowstone can now be used for the Tier 3 caps (once Chisel implements it) - ------------------------------------------------------- -Version 2.1.0-69 ------------------------------------------------------- -- Fixed Phantom Bridge sigil glitch when travelling between dimensions and teleporting large distances. -- Added deprecated methods for easier updating - Oops! - ------------------------------------------------------- -Version 2.1.0-68 ------------------------------------------------------- -- Fixed Ritual of Regeneration's text -- Fixed silly dupe bug with the Zephyr ritual. - ------------------------------------------------------- -Version 2.1.0-67 ------------------------------------------------------- -- Added the Destructive Will effect to the Ritual of the Green Grove. This ritual now is done~ -- Finished the Augments for the Serenade of the Nether. -- Implemented a new model for the Blood Altar to be more in-line with the rest of the mod (Thanks, wiiv!) -- Made the Blood Altar respect the new capability system for fluid management. -- Finished the Augments for the Ritual of the Feathered Knife. -- Finished the Augments for the Ritual of the Crusher. -- Finished most of the Augments for the Ritual of the Shepherd. -- Changed the Ritual of the Feathered Knife so it respects the Tough Palms Living Armour Upgrade. -- Fixed the Ritual of the Feathered Knife so that its health threshold is percent-based. -- Made the aspected Sentient Tools drop their corresponding Will type on killing enemies. -- Made it so peaceful animals provide more LP by default (to encourage creating your own farm). -- Increased the effectiveness of animals for the Gathering of the Forsaken Souls ritual by a factor of 4. -- Added the framework for the Purification Altar. -- Fixed a crash with the Ritual Diviner when attempting to replace certain blocks. -- Snares can no longer hit the thrower of the snare within 20 ticks of throwing it. -- Updated the book so it contains most of the rituals. -- Added some placeholder recipes for the Living Armour Downgrades - they will eventually change. - ------------------------------------------------------- -Version 2.1.0-66 ------------------------------------------------------- -- Made it so that when you acquire a Living Armour Upgrade from a Tome, it raises the corresponding Stat Tracker up to that upgrade level. -- Added some more framework for the Living Armour Downgrades. -- Modified the Grim Reaper's Sprint so it is better at later levels. -- Added a Repairing Living Armour Upgrade (trained by damaging the chestplate of the Living Armour while you have a full set on - it repairs all of your armour pieces over time) -- Modified the Dwarven Might skill to better change the mining speed when mining. -- Added a Dig Slowdown armour downgrade called "Weakened Pick". -- Added the framework for a ritual that grants downgrades (instead of the potion method). -- Fixed the recipes for some of the Demon Will blocks -- Added the Sigil of Elasticity, the Sigil of the Claw, and the Sigil of Winter's Breath. -- Changed most of the BlockString blocks to a BlockEnum in order to solve a loading issue with schematics. -- Added the entries for the Skeleton Turret Array and the Updraft Array -- Added the Bounce Array -- Modified the Sigil of the Phantom Bridge so it better performs with speed modifications -- Added the ability to use Mimic Blocks containing a valid Altar Component to work with the altar (#945) - - Note: If using a Blood Rune, you do not get the ability of said rune. It just counts as a valid block. -- Fixed `/bloodmagic network get NAME` using the wrong localization (#955) -- Fixed Mimic Blocks causing an NPE with some Tile Entities (#951) -- Fixed a massive FPS drop when looking at a Master Ritual Stone while holding a Ritual Tinkerer (#950) -- Fixed an occasional crash when looking at a Mimic block with WAILA installed (#949) -- Fixed the displayed Lesser Tartaric Gem recipe in the Guide (#947) -- Fixed Dagger of Sacrifice one-shotting bosses. It now just doesn't work (#932) -- Fixed controls re-binding after each startup (#922) -- Added an alchemy array, the Array of the Fast Miner - ------------------------------------------------------- -Version 2.1.0-65 ------------------------------------------------------- -- Fixed NPE when attacking mobs when you don't have a set of Living Armour. Oops. - ------------------------------------------------------- -Version 2.1.0-64 ------------------------------------------------------- -- Fixed the symmetry issues of the Ritual of Containment -- Changed the recipe of the Acceleration rune so that it is a T4 rune. -- Added the Charging rune, which accumulates charge by using the LP from the Blood Altar (1 charge = 1 LP always). If enough charge is stored when crafting, the crafting occurs instantly. -- Added the entries for the Rune of Augmented Capacity, Charging Rune, and Rune of Acceleration -- Fixed the Sigil of Translocation so that it does not crash when picking up certain blocks. Also removed the damned lightning. -- Changed the Quick Feet upgrade and the speed boost sigil so that their speeds are applied when strafing and walking backwards as well. - ------------------------------------------------------- -Version 2.1.0-63 ------------------------------------------------------- -- Removed the darn testing code from the Divination Sigil. >.> - ------------------------------------------------------- -Version 2.1.0-62 ------------------------------------------------------- -- Fixed the fact rituals were not working (Might have been a compiler error). - ------------------------------------------------------- -Version 2.1.0-61 ------------------------------------------------------- -- Added fancy rendering for the Inversion Pillars. -- Made the Meteor registry more manageable by separating the meteors into independent .json files. -- Fixed the Sigil of Holding so that it does not crash servers when pressing the Holding key ('H' by default) - ------------------------------------------------------- -Version 2.1.0-60 ------------------------------------------------------- -- Fixed routing node serialization. -- Removed unwanted System.out lines when clicking on the slots in the routing node. - ------------------------------------------------------- -Version 2.1.0-59 ------------------------------------------------------- -- Added the Living Armour Upgrade, Nocturnal Prowess, which gives night vision in dark areas and increases damage while the area is dark. -- Added a LOT of dungeon blocks. I mean a lot. -- Finished adding the recipes for all of the blocks (except the Demon Alloy) -- Added a temporary texture (finally) for the Inspectoris Scandalum -- Fixed Specters spawning with the /give command -- Fixed the sacrifice range of the altar. -- Fixed the Regeneration ritual so that it works on non-players -- Added Mimic entry to The Architect. -- Configurified the Meteor Ritual - Modpacks and users can edit all of the major properties of the meteor ritual, including what items need to be dropped onto the ritual as well as what you get in the ritual, radius, etc. The config will refresh if there is a version change unless you set "resyncOnVersionChange" to false. -- Merged the three brick variants into one. -- Added the Inversion Pillar models and caps - ------------------------------------------------------- -Version 2.0.4-58 ------------------------------------------------------- -- Temporarily removed the dungeon stuff so that it doesn't crash. - ------------------------------------------------------- -Version 2.0.4-57 ------------------------------------------------------- -- Changed the Demon Will Aura Gauge so it refreshes based on the player's ticks existed -- Made Draft of Angelus craftable with gold dust -- Fixed Elytra upgrade -- Added the Mimics - the real ones -- Implemented a bit of framework for some T5 shenanigans. -- Fixed the Incense Altar so it properly detected the south sides of the altar. -- Updated the Filtered Item Routing Nodes' GUI so that it behaved less like ass. Also added the necessary nbt porting code. -- Further improved the routing GUI by allowing an amount to be typed into the amount bar. -- Updated the toggleable sigils so they drain the user's LP based on the user's total ticks existed instead of the world time. This is to solve the doDaylightCycle glitch in this scenario. - ------------------------------------------------------- -Version 2.0.4-56 ------------------------------------------------------- -- Fixed an incompatability between the 1.10.2 and the 1.9.4 versions - ------------------------------------------------------- -Version 2.0.4-55 ------------------------------------------------------- -- Made Guide-API a required mod. -- Fixed a funky issue where the Sound of the Cleansing Soul did not reset the upgrade points internally. -- Added Sentient Specters, which are essentially tamable companions. Drop a sentient tool if you have more than 1024 Will of a given type to summon one (at the cost of 100 Will). -- Added Mimic Blocks! - ------------------------------------------------------- -Version 2.0.3-54 ------------------------------------------------------- -- Eliminated some of the "wonkiness" from the Air Sigil -- Fixed the Hellfire Forge so that swapping Tartaric gems will not give free stuff. -- Added the Potion Flask and a few of the potion effects - max amount of effects that can be added to a single flask is currently 3. -- Fixed the Aura gauge not resetting in chunks that do not have any Aura -- Added tooltips for the progress to the next upgrade for Living Armour (hold shift + M) -- Finished off The Architect docs for now -- Finished off The Demon Kin docs for the time being - ------------------------------------------------------- -Version 2.0.3-53 ------------------------------------------------------- -- Fixed issue where the mod doesn't load on servers. Oops. - ------------------------------------------------------- -Version 2.0.3-52 ------------------------------------------------------- -- Updated the Sanguine Scientiem with Alchemy Array recipes -- Fixed the Blood Altar so that it can (again) work on a stack size larger than 1. - ------------------------------------------------------- -Version 2.0.3-51 ------------------------------------------------------- -- Added the Demon Will Aura Gauge to accurately determine the Will in the Aura. -- Added the ability for rituals to have a Demon Will set on them. Now to get rituals to use them. -- Fixed it so that the Crushing Ritual now ignores liquids -- Added the Mark of the Falling Tower ritual. -- Changed the tooltip of the ritual diviner so that it gives information about the selected ritual. -- Added more to the Sanguine Scientiem, including Hellfire Forge recipes and Altar recipes -- Updated a lot of the text in the Sanguine Scientiem - ------------------------------------------------------- -Version 2.0.2-50 ------------------------------------------------------- -- Fixed bad NPE when using the WoS. (Well, I guess all NPEs are technically bad, but I guess it depends on your perspective. That said, I don't think a changelog is the best place for a theoretical discussion about the rights and wrongs of errors, so I will stop now.) - ------------------------------------------------------- -Version 2.0.2-49 ------------------------------------------------------- -- All Alchemy Array recipes are WIP and are subject to change! ^.^ They are created using the Arcane Ash and are shown as first item + second item. -- Added the Movement Array (feather + redstone) -- Added the Mob Beacon Array (2x Zombie Flesh) -- Added the Updraft Array (feather + glowstone) -- Added the Skeleton Turret Array (Arrow + feather) -- Fixed the Lava Crystal recipe so that it can use all tiers of blood orb -- Nerfed the Bound Blade. This is temporary, since the sword eventually will be modified. -- Fixed Teleposers so they no longer crash 1.10 instances when teleposing tiles. - ------------------------------------------------------- -Version 2.0.2-48 ------------------------------------------------------- -- Fixed a stupid bug by a stupid Way - ------------------------------------------------------- -Version 2.0.2-47 ------------------------------------------------------- -- Fixed horrible memory leak in the Living Armour. -- Item Nodes can now be disabled by a (weak) redstone signal. - ------------------------------------------------------- -Version 2.0.2-46 ------------------------------------------------------- -- Fixed it so Ritual stones can be placed by the Ritual Diviner again. Also made it so that rituals are activateable and don't crash servers. - ------------------------------------------------------- -Version 2.0.2-45 ------------------------------------------------------- -- Changed the recipe of the Sanguine Scientiem -- Fixed the Routing system so that it properly eliminates the connection to the Master node when the Master node is broken. -- Fixed an issue where the Spectral Blocks (from the Sigil of Suppression) would return the liquid on the client side before the sigil was deactivated. -- Made it so that the bound tools are (supposedly more so) unbreakable. This will probably come bite me on the ehem later, but we'll see. -- Added Fire Resistance Living Armour Upgrade, "Gift of Ignis." -- Updated The Architect section of the documentation. -- Fixed it so the Ritual will call stopRitual when a ritual stone is broken. -- Added the recipe for the Inspectoris Scandalum (I had to check if I spelled that right) which acts as a helper for Altar Building -- Right-clicking a MRS with the Ritual Diviner will affix the ritual hologram to the MRS. - ------------------------------------------------------- -Version 2.0.2-44 ------------------------------------------------------- -- Added the Draft of Angelus, which increases the max number of upgrade points for Living Armour. It's strawberry flavoured! -- Fixed the Tome of Peritia again - <= and < are the same, right? -- Fixed an interaction between the Tome of Peritia and the Experienced upgrade - ------------------------------------------------------- -Version 2.0.1-43 ------------------------------------------------------- -- Added an initial method to divine where a blood rune is missing for the next tier of altar. -- Fixed an NPE with the Gathering of the Forsaken Souls -- Fixed Absorption Hearts remaining after the absorption buff ends for the Steadfast Sentient Sword -- Updated the Guide (Woooooooooooooo........) -- (Possibly?) fixed Tome of Peritia bug of the Negative Speed of Light -- Added recipes for all ores -> dust in the alchemy table. -- Added the recipes for the Sentient Tools - yes, they all drop Will. -- Fixed the bow so that it now gives you Will when you kill a mob - it does not drop the Will, it goes directly to you. - ------------------------------------------------------- -Version 2.0.1-42 ------------------------------------------------------- -- Fixed Demon Crucible's weird behaviour where right-clicking it with an invalid item would still put the item in the crucible - and give the player an item with a stacksize of 0. -- WAILA! -- Oh, and demon wings with the Elytra. - ------------------------------------------------------- -Version 2.0.1-40 ------------------------------------------------------- -- Bug fix version, and added several translations - some of these are still WIP. -- Fixed render bug with the Alchemy Table -- Demon WIll now drops from slimes at a reduced rate instead of not at all -- Fixed Jesus Water effect with Life Essence -- Added the Vengeful Will crystal cluster recipe. Oops! >.> -- Changed the "Default" Will into "Raw" Will. -- Fixed an item duplication bug with how item pick-up is handled with the Zephyr ritual and the magnetism sigil. -- Made the bound Axe function... correctly -- Fixed a command block only issue with BM commands - ------------------------------------------------------- -Version 2.0.0-39 ------------------------------------------------------- -- Updated to 1.9.4! -- Fixed the Trick Shot upgrade -- Fixed Gate of the Fold endless loop -- Added rune type colors to the Ritual Diviner tooltip -- Crusher ritual ignores unbreakable blocks - ------------------------------------------------------- -Version 2.0.0-38 ------------------------------------------------------- -- Fixed it so that the Sentient weaponry is actually repairable using any demon will crystals in an anvil -- Changed the stat tracker for Tough Palms so that it counts number of hearts sacrificed, not number of sacrifices -- Fixed the Living Armour so that it wouldn't get damaged by self-sacrificing when you had upgrades that mitigate unblockable sources. -- Fixed bound sword stuttering - ------------------------------------------------------- -Version 2.0.0-37 ------------------------------------------------------- -- Fixed Elytra upgrade not working on servers. Oops! - ------------------------------------------------------- -Version 2.0.0-36 ------------------------------------------------------- -- Added JEI compat for the Alchemy Table -- Changed the Item Routing system so that it used capabilities instead -- Updated the Alchemy Table recipe system so that it can provide better custom recipes. -- Added some more recipes (like rudimentary ore doubling) to the alchemy table. -- Added Explosive Powder, which is used to reduce cobblestone into gravel and gravel into sand (64 uses) - ------------------------------------------------------- -Version 2.0.0-35 ------------------------------------------------------- -- Changed Living Armour so that it is now damagable. The Living Armour Chestplate will be damaged, but will not break. If it gets to ~0 durability, it will damage your LP network heavily. -- Living Armour is now repairable in an anvil with Binding Reagent. -- Started adding in the Alchemy Table... not really started. -- Changed it so that the Mending enchantment consumes the EXP before the Tome of Peritia does -- Added fall distance mitigation to the jump upgrade -- Fixed Lava Crystals... again. -- Worked on the Alchemy Table -- Added the Elytra upgrade - craft the tome in an anvil by using a book and a full Elytra. - ------------------------------------------------------- -Version 2.0.0-34 ------------------------------------------------------- -- Added config to Blood Magic that will prevent the compression handler from reading the recipes added by the Compression mod (default is true). -- Added Japanese localization and fixed Czech (I can't spell) localization. - ------------------------------------------------------- -Version 2.0.0-33 ------------------------------------------------------- -- Fixed a few localization derps. -- Fixed a few minor bugs. - ------------------------------------------------------- -Version 2.0.0-32 ------------------------------------------------------- -- Changed Tome of Peritia's recipe -- Added step assist living armour upgrade tracker. -- Added new Living Armour upgrades: - - Added Charging Strike, which increases knockback and damage for attacks while sprinting - - Added True Strike, increasing the damage of critical hits -- Updated for Forge 12.16.0.1859 -- Did some work on the Sentient Bow to start adding abilities to it -- Fixed the Speed and Jump rituals so that they correctly update the player's motion. -- Implemented the "Ritual Tinkerer" and added its recipe. - ------------------------------------------------------- -Version 2.0.0-31 ------------------------------------------------------- -- Fixed NPE when using an empty bucket. -- Added Living Armour Upgrades: - - Strong Legs increases jump height. Pro tip: hold shift to bypass this jump boost. - - Soft Fall decreases all fall damage, up to 100% at level 5. - - Grave Digger, for fun times with alternative weapons -- Added increase in speed for Routing nodes inside of a chunk with Demon Aura -- Fixed OutOfBoundsException in the Sentient Sword when you didn't have enough Will. -- Fixed custom potion effects so they could be applied server-sided -- Added recipe for the Tome of Peritia - ------------------------------------------------------- -Version 2.0.0-30 ------------------------------------------------------- -- Wow, there are a lot of bug fixes lately. -- Fixed it so that the blood orb is no longer consumed in the crafting grid. - ------------------------------------------------------- -Version 2.0.0-29 ------------------------------------------------------- -- Fixed formatting not working properly on servers. - ------------------------------------------------------- -Version 2.0.0-28 ------------------------------------------------------- -- Fixed the soul snare. -- Removed health buff from Steadfast armour -- Changed corrosive sword's effect from poison to wither -- Fixed living armour's training bracelet so that it deactivates any training of upgrades not supported -- Added "Experienced" living armour upgrade, which provides more xp from picked up orbs. -- Updated to Forge 1826 - ------------------------------------------------------- -Version 2.0.0-27 ------------------------------------------------------- -- Added OreDict support for the altar (was done in 26) -- Made it so that the Tartaric gem would show visually what type of will was contained -- Allowed the Sentient Sword to use different wills, and change its colour based on the used one. Also made it so you do not toggle it by right clicking, but it simply - rechecks itself when you smack something and when you right-click. -- Fixed item binding. Yusssss. -- Added Sword, Armour, and Bow texture changes when you have different demonic will in your inventory. -- Finalized sentient sword effects -- Did work on the unique demon will effects for armour -- FINALLY changed it so farm animals do not drop demon will. - ------------------------------------------------------- -Version 2.0.0-23 ------------------------------------------------------- -- Fixed "see through world" syndrome for most blocks -- Fixed .obj models so that they will properly render while in-hand -- Fixed routing node attaching logic -- Changed the growth behavior of the crystals -- Fixed Potion getting for various methods -- Started work on crystal automation ritual -- Finished first iteration of the iterator of AreaDescriptor (hehe) -- Finished the crystal automation ritual, "Gathering of the Forsaken Souls." This ritual damages mobs in it's area (21^3 cube around the MRS) and once it kills a mob it - uses its life essence to feed the demonic will crystals inside of its area (two blocks above the ritual stone, 7x7 region and 5 high). This costs LP and - demonic will from the aura of the particular type, and costs less will the more... varied the mobs killed are. Growth amount is dictated by the max health - of the mobs killed. -- Updated to Forge 1811 - ------------------------------------------------------- -Version 2.0.0-22 ------------------------------------------------------- -- Fixed client disconnect when joining servers -- Fixed Bound Blade having same damage between activated and deactivated states -- Fixed Sentient Armour gem so it works, now -- Fixed Armour model textures -- Fixed crash on newer versions of Forge -- Updated zh_CN localization - ------------------------------------------------------- -Version 2.0.0-21 ------------------------------------------------------- -- Initial release to 1.9. Many glitches that have yet to be ironed out, some of them Forge issues. Probably best not to play with this one until Forge stabilizes. - ------------------------------------------------------- -Version 2.0.0-20 ------------------------------------------------------- -- Fixed Blood Altar crashing on odd occasions. -- Fixed GUI of hellfire forge. -- Fixed issue with Will Chunks not generating when requested in new chunks -- Fixed issue where Orb Tier was never set for a player internally -- Fixed Creative Dagger. It now works correctly. Shift + Right Click on an Altar to fill it to capacity. -- Fixed step height being set to incorrect value. Your Chisels and Bits stairs should work, now! -- Fixed Bound Tools not being enchantable. -- Fixed Bound Tools "Beast Mode" breaking blocks unreliably. -- Fixed Blood Light Sigil not using LP -- Changed Will system so that it automatically goes into your inventory and then drops any excess Will on the ground. -- Changed Blood Light to render more particles when the sigil is held to make them easier to find. -- Added debug commands. These work exactly the same as in the 1.7.10 version -- [API] Fixed AddToNetworkEvent not being cancellable even though it should be -- [API] Helper method in NetworkHelper to obtain the highest possible capacity for a given tier. - ------------------------------------------------------- -Version 2.0.0-19 ------------------------------------------------------- -- Fixed path blocks so they are actually craftable. -- Added gui stuff to enable priority in the item routing system: nodes with a lower value priority will be accessed first. (May be rotated in the future) -- Grayed out the currently active side's button in the item routers. -- Added Demon Pylon -- Changed behaviour of Demon Crucible -- Fully implemented the behaviour of the crystal growing process. - - A Demon Crucible will be able to syphon the demon will from the tartaric gems inside of its inventory - right click with a gem to place it into the inventory. - - The syphoned will from the gem will go into the chunk, staying in the air - it will not move to neighbouring chunks unless forced to do so through other means - - The Demon Pylon draws will in the air from surrounding chunks and puts it into its own chunk - this acts as sort of like a pressure system, where it will even out the will distribution, but only goes one way. - - The Demon Crystallizer takes 100 will from the air (need a demon crucible for it to work) and forms a demon crystal on top of it. There is a 10% chance that this crystal will be of a special type. - - The Demon Crystals can be mined in order to collect their crystals. These crystals can be used for crafting more powerful stuff. If you have over 1024 will on your person when you right click the crystal, you can harvest a single crystal instead of the entire thing. - - You can put the harvested crystals inside of a demon crucible. Each crystal is worth 10 will, so this acts as a way to semi-automate will creation. - - When a hellfire forge is inside of a chunk with demon will, it will fill its contained tartaric gem with will. - - Changed a few recipes (like the greater tartaric gem) to match this new system. - ------------------------------------------------------- -Version 2.0.0-18 ------------------------------------------------------- -- Fixed issue with lava crystal working even their is no LP available. -- Added upgrade trainer -- Fixed step height issue with C&B stuff. Apparently step height is now 0.6 by default instead of 0.5. -- Added Ritual: Song of the Cleansing Soul to remove Living Armour upgrades from the armour. -- Added Ritual: Ritual of Living Evolution, which is used to set the living armour's max upgrade points to 300. -- Added Ritual: The Timberman to cut down trees. Requires a chest on top of the MRS in order to collect the drops from harvested trees. -- Added Ritual: Hymn of Syphoning, which syphons up fluids around it in a 16 block radius and puts the fluid in the tank above it. The tank above it must have at least one bucket of the fluid you want to syphon inside of it. -- Added Ritual: The Assembly of the High Altar, which places runes and blocks from the inventory above it in the world in the form of a blood altar. Autobuilding altars~ -- Added Ritual: The Gate of the Fold. -- Added Ritual: The Filler. Places blocks from the inventory on top of it in the world. -- Added Ritual: Le Vulcanos Frigius - -- Added tooltip to living armour to show the current upgrade points of the armour. -- Added recipe for the training bracelet. Combine in an anvil with an upgrade tome to set it as the upgrade to train. -- Ammended range of Zephyr ritual -- Fixed Green Grove ritual -- Fixed Crusher ritual so it didn't break everything at once. -- Removed the FOV effect from the Quick Feet speed upgrade. -- Minor work on the Demon Crucible. -- Crucibles now fill the tartaric gems of close-by hellfire forges -- Fixed rituals not correctly re-activating when taking off a redstone signal after reloading the world. -- Added Teleposition Sigil, which teleports the user to the bound Teleposer. -- Added Transposition Sigil, which picks up the block clicked on including the NBT of the given tile. - ------------------------------------------------------- -Version 2.0.0-17 ------------------------------------------------------- -- Added Living Armour Upgrades - - Solar Powered - - Grim Reaper's Sprint - - [Thaumcraft] Runic Shielding -- Fixed Blood Altar's progress resetting when clicking with another item -- Fixed Divination and Seer sigils crashing when clicking on an altar while not bound -- Added crafting recipes for the following sigils: - - Compression - - Phantom Bridge - - Ender Severance - - Haste -- Dagger now bypasses checks of armour - ------------------------------------------------------- -Version 2.0.0-16 ------------------------------------------------------- -- Fixed a major bug with the Blood Orbs. - ------------------------------------------------------- -Version 2.0.0-15 ------------------------------------------------------- -- Added blood lamp sigil array texture and reagent. Made it so the blood lamp sigil will place the light when right clicking on a block. -- Added magnetism sigil array texture and reagent. -- Added the ability for the blood altar to have its buffer tanks accessed (Semi-tested) -- Improved readability for large numbers -- Fixed break particle for Alchemy Array -- Waila handling for Alchemy Array -- Fixed Ritual eating LP when reactivated via a Redstone signal -- Ritual Stones now always drop blank stones -- Bound Blade is now enchant-able -- Goggles of Revealing upgrade for Living Helmet. Combine a Living Helmet and Goggles of Revealing in an Anvil -- Fixed config for disabling rituals -- [API] Lots of changes to the binding system. It's now handled automatically for all items that implement IBindable. -- Added Incense Altar system. -- Added models for the routing nodes, incense altar, and the hellfire forge. - ------------------------------------------------------- -Version 2.0.0-14 ------------------------------------------------------- -- [API] Added support for some IMC methods: - - FMLInterModComs.sendMessage("BloodMagic", "teleposerBlacklist", ItemStack) - - FMLInterModComs.sendMessage("BloodMagic", "sacrificeValue", "ClassName;Value") - - FMLInterModComs.sendMessage("BloodMagic", "greenGroveBlacklist", "domain:name") -- Fixed the bound sword so that it now drops weak blood shards. -- Fixed the demon will so that you can actually pick it up! - ------------------------------------------------------- -Version 2.0.0-13 ------------------------------------------------------- -- Added recipes and temp textures for path blocks. More path blocks to come. -- Tweaked the Incense altar and added its recipe. -- Fixed Blood Light sigil not providing the right coloured particles -- Added the ability for the divination sigil to look up information about the incense altar. -- Fix another NPE when checking of a player has a full set of Living Armor - ------------------------------------------------------- -Version 2.0.0-12 ------------------------------------------------------- -- This build doesn't exist. Shhh - ------------------------------------------------------- -Version 2.0.0-11 ------------------------------------------------------- -- Fix NPE when checking if a player has a full Living Armor set - ------------------------------------------------------- -Version 2.0.0-10 ------------------------------------------------------- -- Added recipe for Sentient Armour - craft a Sentient Armour Gem and right click with it to toggle the armour. -- Added recipes for the Greater and Grand Tartaric gems. These are temporary recipes. -- Updated textures. -- Added ability to fill gems from other gems. Right click with a gem to fill other gems in your inventory. -- Un-nerfed the Ritual Stone recipe to provide 4 again -- Rituals can now be toggled with Redstone. Provide a redstone signal to the Master Ritual Stone to turn it off. -- Made the Sentient sword able to block. -- Fixed the Sentient Sword so that even when not activated it will still do damage - just at a reduced amount. -- Made it so that Demon Will will be voided if all of the player's tartaric gems are filled. - ------------------------------------------------------- -Version 2.0.0-9 ------------------------------------------------------- -- Fixed the rituals so that they no longer caused nausea no matter what. - ------------------------------------------------------- -Version 2.0.0-8 ------------------------------------------------------- -- Fixed crash when activating rituals while operating on servers -- Added the majority of stuff for the item routing system. - ------------------------------------------------------- -Version 2.0.0-7 ------------------------------------------------------- -- JEI now displays more information for Altar recipes. Hover over the Altar image to view it. -- Added particles to the Blood Altar on the server-side. -- Allow configuration of entity sacrificial values -- [API] Allow setting of entity sacrificial values via API. Takes precedence over config values. -- [API] Method to easily get instances of Items and Blocks -- [API] Allow mods to blacklist their blocks from the Green Grove ritual/sigil - ------------------------------------------------------- -Version 2.0.0-6 ------------------------------------------------------- -- Fixed the LivingArmourTracker for defense so that it no longer ate up armour (om nom nom nom) - ------------------------------------------------------- -Version 2.0.0-5 ------------------------------------------------------- -- Tweaked Sentient Sword's will drop rate -- No longer 1.8.8 compatible -- Cleaned some clutter from JEI -- Added a potential fix to some server mod issues. - - ------------------------------------------------------- -Version 2.0.0-4 ------------------------------------------------------- -- Added Physical resistance upgrade (Tough skin) -- Added health boost upgrade (Healthy) -- Added melee damage upgrade (Fierce strike) -- Added trick shot upgrade (Have fun finding it! :D) -- Added T5 orb recipe and Demonic Activation Crystal -- Added Rituals: - - Animal Growth ritual - - Harvest ritual - - Magnetism ritual - - Crushing ritual - - Full Stomach ritual - -- Added parts for the new Demon Will System - - Added the Demon Will item - - Added the Sentient Sword, which will be powered by consuming demon will - - Added a Lesser Tartaric Gem in order to hold onto more will - - SSSSSSSSoooooooouuuuuuulllllllllsssssss - - Added Hellfire Forge block - - Added rudimentary snare and recipe - has 25% chance for monster to drop its soul - - Added Sentient Bow - - Added Sentient Armour - -- Fixed binding of togglable sigils -- Added saving for ritual tags - ------------------------------------------------------- -Version 2.0.0-3 ------------------------------------------------------- -- Fixed client-side issue when shift-clicking lava crystals into a furnace while on a server. -- Added poison upgrade to Living Armour -- Fixed digging upgrade -- Added self sacrifice upgrade to Living Armour (Tough Palms) -- Added knockback resistance upgrade to Living Armour, trained via eating (Body Builder) - - ------------------------------------------------------- -Version 2.0.0-2 ------------------------------------------------------- -- Added Life Essence bucket recipe -- Added the rendering of LP inside of the altar -- Added Living Armour including some upgrades: - - Added speed upgrade - - Added digging upgrade -- Modified Divination Sigil recipe - no longer uses a block of glass because of issues on servers (tempramental) -- Modified Apprentice Blood Orb recipe to require a block of redstone instead. -- Added the Reagent Air recipe. - - ------------------------------------------------------- -Version 2.0.0 ------------------------------------------------------- - -Initial release of the open beta for the mod to Minecraft v1.8.9! This mod version has a lot of changes. Because it is a full-on rewrite, some of the mechanics of the mod have changed/are going to change. As such, the feel of the mod will be slightly different than previous iterations. -This mod has a large amount of compatibility with the recipe look-up mod, Just Enough Items (JEI). It is VERY much recommended that you download JEI, since it will make your life a lot easier with the new mechanics. -Because this is a beta of a rewrite, there will be a lot of missing content. I am trying my hardest to add new content as fast as I can, but my team and I are only human and can only code so fast. Please give a little patience while we make the mod the best it possibly can! -Also, please submit bug reports or feature requests to the github, https://github.com/WayofTime/BloodMagic. We'll get to the issue soon! - -New -- Added "Alchemy Array" crafting - this is achieved by making some "Arcane Ash" and clicking on the ground to create an array. You then click on the array with the first ingredient and then the second - breaking the array will give the items back. -- Added JEI compatibility -- Added WAILA compatibility (No more needing 3rd-party addons!) - -Changed -- Lots of internals have changed. Too many to list. -- A graphical overhaul of everything has been implemented. These textures were provided by CyanideX's Unity texture pack. BBoldt and Yulife (Inap) from the Unity team are our new permanent texture artists. - -Bug Fixes -- +Build: 1.16.3-34.1.0 - Thu Sep 24 07:05:13 GMT 2020 + lex: + Prep new RB. + +========= +Build: 1.16.3-34.0.21 - Thu Sep 24 06:46:57 GMT 2020 + ichttt: + Fix grass disappearing when alwaysSetupTerrainOffThread is true (#7291) + +========= +Build: 1.16.3-34.0.20 - Thu Sep 24 06:41:41 GMT 2020 + 35673674+alcatrazEscapee: + Accessors for inspecting and removal of biome generation settings. Fixed carvers still being immutable. (#7339) + +========= +Build: 1.16.3-34.0.19 - Thu Sep 24 06:36:25 GMT 2020 + lex: + Revive BiomeManager and BiomeLayer hooks. + +========= +Build: 1.16.3-34.0.18 - Thu Sep 24 03:12:19 GMT 2020 + richard: + Fix a few minor issues with custom tag types and fix OptionalNamedTags (#7316) + +========= +Build: 1.16.3-34.0.17 - Wed Sep 23 22:10:11 GMT 2020 + diesieben07: + Fix ToggleableKeyBinding differences to vanilla. (#7338) + +========= +Build: 1.16.3-34.0.16 - Wed Sep 23 21:34:47 GMT 2020 + Yunus1903: + Updated build badge versions to 1.16.3 in readme (#7325) + + diesieben07: + Fix forge light pipeline applying block offsets twice (#7323) + +========= +Build: 1.16.3-34.0.14 - Wed Sep 23 21:16:46 GMT 2020 + ichttt: + Add a better license error screen (#7350) + +========= +Build: 1.16.3-34.0.13 - Tue Sep 22 19:14:17 GMT 2020 + darklime: + Fixed container item being consumed in brewing stand. #7307 (#7314) + +========= +Build: 1.16.3-34.0.12 - Tue Sep 22 19:06:10 GMT 2020 + sciwhiz12: + Fix parse results of CommandEvent being disregarded (#7303) + +========= +Build: 1.16.3-34.0.11 - Tue Sep 22 18:58:28 GMT 2020 + 17338378+Nightenom: + [1.16] Fix possible crash when using rendering regionCache (#7207) + +========= +Build: 1.16.3-34.0.10 - Tue Sep 22 18:41:16 GMT 2020 + 35673674+alcatrazEscapee: + [1.16] Reimplement ICloudRenderHandler, ISkyRenderHandler and IWeatherRenderHandler (#6994) + +========= +Build: 1.16.3-34.0.9 - Fri Sep 18 00:58:08 GMT 2020 + 35673674+alcatrazEscapee: + Make Biome.Climate and BiomeAmbiance fields accessible (#7336) + +========= +Build: 1.16.3-34.0.8 - Thu Sep 17 20:42:53 GMT 2020 + cpw: + Use mixin 0.8.1. Should fix problems with mixin not working properly with latest modlauncher. + + Signed-off-by: cpw + +========= +Build: 1.16.3-34.0.7 - Tue Sep 15 20:07:25 GMT 2020 + sebastian: + Sets the empty/fill sounds for vanilla fluids. + Use Fluid's fillSound rather than emptySound when filling buckets. + +========= +Build: 1.16.3-34.0.6 - Tue Sep 15 19:47:08 GMT 2020 + cyborgmas18: + Add MatrixStack-aware alternatives to the methods in GuiUtils (#7127) + +========= +Build: 1.16.3-34.0.5 - Tue Sep 15 16:51:58 GMT 2020 + justin_wiblin: + Fix json biomes not setting registry name correctly for the BiomeLoadingEvent. (#7329) + +========= +Build: 1.16.3-34.0.4 - Tue Sep 15 14:18:16 GMT 2020 + David Quintana: + Fix inconsistencies in how the values from the model are passed into the baked model. + This puts them in line with vanilla, as intended. + +========= +Build: 1.16.3-34.0.3 - Tue Sep 15 13:23:05 GMT 2020 + Yunus1903: + Reimplemented drawHoveringText (#7268) + +========= +Build: 1.16.3-34.0.2 - Tue Sep 15 00:43:19 GMT 2020 + lex: + New BiomeLoadingEvent that allows modders to edit biomes as they are being deserialized. + +========= +Build: 1.16.3-34.0.1 - Fri Sep 11 15:55:28 GMT 2020 + lex: + Bump MCP version for lambda issue. + +========= +Build: 1.16.3-34.0.0 - Thu Sep 10 19:10:33 GMT 2020 + lex: + 1.16.3 Update + Also included a bunch of warning cleanups. + +========= +Build: 1.16.2-33.0.61 - Thu Sep 10 18:54:56 GMT 2020 + 42962686+RedstoneDubstep: + Fix tile entities being replaced when not needed. (#7318) + +========= +Build: 1.16.2-33.0.60 - Thu Sep 10 18:02:15 GMT 2020 + malte0811: + Fix exception when getting rendering box for tile entities with no collision boxes. (#7301) + +========= +Build: 1.16.2-33.0.59 - Wed Sep 09 23:05:21 GMT 2020 + cpw: + More crash reporting tweaks. Don't crash when trying to show warnings. Also, put the exception name in the error screen on the second line! + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.58 - Wed Sep 09 17:09:09 GMT 2020 + diesieben07: + Fix Minecart speed cap on rail being initialized to 0 (#7315) + +========= +Build: 1.16.2-33.0.57 - Wed Sep 09 02:10:45 GMT 2020 + richard: + Add support for custom tag types (#7289) + +========= +Build: 1.16.2-33.0.56 - Wed Sep 09 00:06:22 GMT 2020 + cpw: + More crash report tweaks. Put a button to open the generated crash report on the error screen, tweak formatting of crash report, and add the enhanced stack trace data (transformers et al) + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.55 - Tue Sep 08 21:00:19 GMT 2020 + championash5357: + New hook for better custom scaffolding movement (#7261) + +========= +Build: 1.16.2-33.0.54 - Tue Sep 08 20:47:48 GMT 2020 + mrtschipp: + Add partialTicks to RenderNameplateEvent (#7277) + + cyborgmas18: + Prevent duplicate wrapper tags from crashing (#7283) + + matthrewp: + Fix custom teleporters NPE (#7296) + + cyborgmas18: + Fixed crash with zip paths (#7300) + +========= +Build: 1.16.2-33.0.50 - Tue Sep 08 20:23:27 GMT 2020 + nrbeech: + Fixing logic in getCurrentRailPosition to correctly identify the rail… (#7276) + +========= +Build: 1.16.2-33.0.49 - Tue Sep 08 20:14:58 GMT 2020 + sciwhiz12: + Remove dead ForgeHooks.canToolHarvestBlock function. (#7262) + + sciwhiz12: + Bump resource pack version to 6 (#7299) + + Edwin.mindcraft: + [1.16.x] Fixes for Bamboo, Enchantments and Conduits, small adjustments to bring some patches closer to the vanilla code. (#7239) + +========= +Build: 1.16.2-33.0.46 - Tue Sep 08 19:50:14 GMT 2020 + championash5357: + Re-implement DrawHighlightEvent$HighlightEntity Firing (#7233) + +========= +Build: 1.16.2-33.0.45 - Tue Sep 08 19:25:58 GMT 2020 + ichttt: + Reimplement FarmlandWaterManager (#7213) + +========= +Build: 1.16.2-33.0.44 - Tue Sep 08 19:11:16 GMT 2020 + cyborgmas18: + Add dataprovider for Global Loot Modifiers (#6960) + +========= +Build: 1.16.2-33.0.43 - Tue Sep 08 19:01:09 GMT 2020 + ichttt: + Fix crash when dumping crash report for an exception that has a null cause (#7308) + +========= +Build: 1.16.2-33.0.42 - Mon Sep 07 01:29:40 GMT 2020 + cpw: + Tweak crash report dump to visit all the causes up to the top. + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.41 - Sun Sep 06 23:39:13 GMT 2020 + cpw: + Fix ExplodedDirectoryLocator visiting non-existent paths. Closes #7203 + + Also, bump modlauncher to 7.0.1 to fix resources. + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.40 - Sun Sep 06 22:08:22 GMT 2020 + cpw: + Use new enumeration mechanism in ModLauncher, to allow getResources to work. This enables serviceloader-in-mods, and other stuff that might need to visit multiple mod jars. Also, tweaked the visitor code slightly, may result in a trivial performance change. Closing #7302 as it's not really relevant any more. + + Signed-off-by: cpw + + cpw: + Park the polling thread for a bit, if we're not the one driving the task list forwards. This allows for the actual driver to work on low cpu count machines. + + Signed-off-by: cpw + + cpw: + Fix some potential issues in crash dumping during mod loading + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.37 - Thu Sep 03 16:37:38 GMT 2020 + cpw: + Fix compiler issue in eclipse properly + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.36 - Thu Sep 03 12:40:52 GMT 2020 + sciwhiz12: + Fix crash caused by previous commit (#7298) + +========= +Build: 1.16.2-33.0.35 - Thu Sep 03 04:15:27 GMT 2020 + lex: + Dirty casting hacks to fix eclipse compiler inference issue. I'm sorry cpw. + +========= +Build: 1.16.2-33.0.34 - Thu Sep 03 03:38:16 GMT 2020 + tterrag: + Fix broken ExistingFileHelper import + + Add licenses to some new files + + tterrag: + Add validation via resources for tag providers (#7271) + + BREAKING CHANGE: Moved ExistingFileHelper to common package + Remove various workarounds from forge tag providers + +========= +Build: 1.16.2-33.0.32 - Tue Sep 01 18:36:21 GMT 2020 + cpw: + Move the "modloading" thread activity onto _our_ worker pool. It turns out that the vanilla worker pool can deadlock during stitching if it's insufficiently large, if modloader "waitForTransition" is also a worker member of that pool. + + Closes #7293 (to reproduce issue easily, modify Util.func_240979_a_ and change the values in the MathHelper.clamp call). I've verified that 3 and below for "max" cause the problem. (I didn't test a whole range of values, just sufficient to reproduce problem and verify fix). Note that setting it to zero (and using the "direct executor" that's inaccessible in normal operation) works as well with this fix. + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.31 - Tue Sep 01 02:27:07 GMT 2020 + cpw: + Fix missed debugging code. Read the config from the config. + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.30 - Tue Sep 01 01:31:57 GMT 2020 + cpw: + Revert "Shut down all other mod handlers if the loading cycle errors. This prevents other mods from throwing errors and being blamed for initial cause. This is a temporary hack until cpw re-writes the mod event dispatcher." + + This reverts commit 7592bbe8 + + Signed-off-by: cpw + + cpw: + Revert "Properly shutdown FMLModContainer's event bus when an error in a lifecycle event is detected." + + This reverts commit 30bad1e2 + + Signed-off-by: cpw + + cpw: + Redo event dispatch, removes a bunch of nonsense, and tries to integrate with the vanilla CF system where possible + + Signed-off-by: cpw + + cpw: + Fix up all the things. Removed SidedProvider because it served no real purpose anymore. + + Signed-off-by: cpw + + cpw: + Fix up slight registry change and other 1.16.2 stuffs. + + Signed-off-by: cpw + +========= +Build: 1.16.2-33.0.23 - Sun Aug 30 23:05:24 GMT 2020 + ichttt: + Add particle culling (#6981) + +========= +Build: 1.16.2-33.0.22 - Wed Aug 26 16:50:02 GMT 2020 + lex: + Wrap vanilla's 'default' biome registry in ForgeRegistry. + This should allow registering mod dimensions like in 1.16.1, while the data driven system is fleshed out. + +========= +Build: 1.16.2-33.0.21 - Tue Aug 25 01:11:38 GMT 2020 + David Quintana: + Clarify in the LazyOptional which methods carry the lazyness over to the returned value and which don't. (#6750) + + For consistency, this meant making a few changes: + - Renamed the existing lazy mapping method to lazyMap, to indicate that it doesn't run the mapping immediately. + - Added a new implementation of map(), which returns Optional, and resolves the value in the process. + - Changed filter() to return Optional, since there's no way to filter lazily. + - Added a new method resolve(), which helps convert the custom LazyOptional class into a standard Optional, for use + with library methods that expect Optional. + + * Update License headers. + +========= +Build: 1.16.2-33.0.20 - Fri Aug 21 21:27:21 GMT 2020 + sciwhiz12: + Add user-friendly exceptions when config loading fails (#7214) + +========= +Build: 1.16.2-33.0.19 - Fri Aug 21 18:53:46 GMT 2020 + dev: + Replace EntityHeight event with EntitySize event (#6858) + +========= +Build: 1.16.2-33.0.18 - Fri Aug 21 18:38:31 GMT 2020 + davide2910: + [1.16] ForgeEventFactory#canCreateFluidSource reintroduced (#7181) + +========= +Build: - Fri Aug 21 18:31:19 GMT 2020 + cyborgmas18: + Cleanup and expand Forge tags (#7004) + +========= +Build: 1.16.2-33.0.16 - Fri Aug 21 18:25:49 GMT 2020 + sciwhiz12: + Fix modproperties property in mods.toml causing exception (#7192) + +========= +Build: 1.16.2-33.0.15 - Fri Aug 21 18:15:53 GMT 2020 + me: + Log info about server list warning (#7209) + + Make it easier to figure out what mods are missing or have to be marked as client/server side only. + +========= +Build: 1.16.2-33.0.14 - Fri Aug 21 18:06:47 GMT 2020 + goto.minecraft: + Fix ItemStack#isDamageable is not calling Item#isDamagable (#7221) + +========= +Build: 1.16.2-33.0.13 - Fri Aug 21 17:48:58 GMT 2020 + diesieben07: + Improve performance and cleanup code for DelegatingResourcePack (#7228) + +========= +Build: 1.16.2-33.0.12 - Fri Aug 21 17:29:33 GMT 2020 + cyborgmas18: + Fix small logging issues with loading pack.png for mods (#7265) + +========= +Build: 1.16.2-33.0.11 - Fri Aug 21 17:23:30 GMT 2020 + diesieben07: + Fix config iteration order (#7230) + +========= +Build: 1.16.2-33.0.10 - Fri Aug 21 09:47:23 GMT 2020 + lex: + Cleanup Forge's build script, fix some unneeded patches. + Add checkExcscheckAll tasks. + +========= +Build: 1.16.2-33.0.9 - Fri Aug 21 04:35:17 GMT 2020 + championash5357: + Readding DifficultyChangeEvent hooks (#7240) + +========= +Build: 1.16.2-33.0.8 - Fri Aug 21 04:29:10 GMT 2020 + malte0811: + Improve startup time by caching the manifest data for mod jars (#7256) + +========= +Build: 1.16.2-33.0.7 - Wed Aug 19 05:47:46 GMT 2020 + Yunus1903: + Removed HarvestDropsEvent (#7193) + +========= +Build: 1.16.2-33.0.6 - Wed Aug 19 05:22:45 GMT 2020 + cyborgmas18: + Remove forge optional tags in favor of Vanilla's new system. (#7246) + +========= +Build: 1.16.2-33.0.5 - Fri Aug 14 19:05:15 GMT 2020 + lex: + Fix creating nether portals. + + lex: + New method for creating modded tag references, fix connecting to vanilla servers. + +========= +Build: 1.16.2-33.0.3 - Fri Aug 14 02:17:01 GMT 2020 + 43609023+spnda: + Print mod file name on InvalidModFileException (#7241) + +========= +Build: 1.16.2-33.0.2 - Thu Aug 13 19:26:22 GMT 2020 + cyborgmas18: + Fix server connection, misapplied patch (#7245) + + Yunus1903: + Updated MDK and README for 1.16.2 (#7243) + +========= +Build: 1.16.2-33.0.0 - Thu Aug 13 07:37:04 GMT 2020 + lex: + Initial 1.16.2 Update + +========= +Build: 1.16.1-32.0.108 - Sun Aug 09 20:05:01 GMT 2020 + David Quintana: + Fix ModelRegistryEvent firing every time resources reload instead of just once. + +========= +Build: 1.16.1-32.0.107 - Sat Aug 08 01:00:42 GMT 2020 + David Quintana: + Move ModelRegistryEvent invocation to when the model loading is about to start. + Freeze the ModelLoaderRegistry right after this event happens, just before model loading actually begins. + This means ModelRegistryEvent is now the correct place to register loaders, as it was intended. + This is a slight breaking change, but any mod that used FMLClientSetupEvent before will need to be updated regardless due to the existing race condition. + +========= +Build: 1.16.1-32.0.106 - Tue Aug 04 00:19:22 GMT 2020 + diesieben07: + Fix wrong BlockState param passed into canSustainPlant from FarmlandBlock (#7212) + +========= +Build: 1.16.1-32.0.105 - Tue Aug 04 00:06:45 GMT 2020 + sciwhiz12: + Add harvest levels for hoes and new 1.16 blocks for pickaxes Fixes #7187 (#7189) + +========= +Build: 1.16.1-32.0.104 - Tue Aug 04 00:00:40 GMT 2020 + sciwhiz12: + Fix debug world not generating modded blocks (#6926) + + championash5357: + New IForgeBlock#getToolModifiedState hook allow better control over tools interacting with blocks. (#7176) + + email.squishling: + Added new hook to allow Biomes to control their Edge biomes (#7000) + +========= +Build: 1.16.1-32.0.101 - Mon Aug 03 22:55:18 GMT 2020 + diesieben07: + Re-introduce "outdated" notification on Mods button in main menu (#7123) + + brandon4261: + Add support for custom elytra (#7202) + +========= +Build: 1.16.1-32.0.99 - Mon Aug 03 18:53:31 GMT 2020 + sciwhiz12: + Fix RenderTickEvent using wrong partial ticks value when game is paused. Fixes #6991 (#7208) + +========= +Build: 1.16.1-32.0.98 - Thu Jul 30 03:18:00 GMT 2020 + tterrag: + Implement forge IBakedModel methods in vanilla wrapper models + +========= +Build: 1.16.1-32.0.97 - Tue Jul 28 23:44:41 GMT 2020 + lex: + Fix another case of swallowed errors not shutting down mods. + +========= +Build: 1.16.1-32.0.96 - Tue Jul 28 21:40:06 GMT 2020 + lex: + Shut down all other mod handlers if the loading cycle errors. + This prevents other mods from throwing errors and being blamed for initial cause. + This is a temporary hack until cpw re-writes the mod event dispatcher. + +========= +Build: - Tue Jul 28 19:01:27 GMT 2020 + lex: + Properly shutdown FMLModContainer's event bus when an error in a lifecycle event is detected. + + lex: + Enable EventBus type check during ForgeDev, and add IModBusEvent marker to ModelRegistryEvent. + +========= +Build: 1.16.1-32.0.93 - Tue Jul 28 07:16:31 GMT 2020 + lex: + Make license toml entry optional during 1.16.1 + There are to many existing mods to make this required. + Yes, we are technically before a RB and can do breaking changes. However this is too large. + +========= +Build: 1.16.1-32.0.92 - Tue Jul 28 01:14:20 GMT 2020 + cpw: + Missed one event. NewRegistry needs the marker. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.91 - Tue Jul 28 01:07:03 GMT 2020 + cpw: + Update MDK license to default to All rights reserved, and offer a link to chooseyourlicense.com as a place to research appropriate licenses. + + Note: the license field _is_ backwards compatible and will simply be ignored on older forge versions. + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.90 - Tue Jul 28 00:47:35 GMT 2020 + cpw: + Update modlauncher, eventbus, accesstransformers and more to use a newer mechanism for generating ASM. + + Introduced IModBusEvent as a marker interface for events on the ModBus. Expect exceptions if you use + the modbus for events not listened there. + + Signed-off-by: cpw + + cpw: + Update coremods and spi, include mandatory license field in metadata. Added at top level of mods.toml file. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.88 - Mon Jul 27 23:35:24 GMT 2020 + ray.neiheiser: + Fix rail 180 rotations (#7177) + + jmansfield: + Fire AnimalTameEvent for cats (#7172) Closes #7171 + +========= +Build: 1.16.1-32.0.86 - Mon Jul 27 22:56:16 GMT 2020 + lex: + Fix Biome generation error. + +========= +Build: 1.16.1-32.0.85 - Mon Jul 27 21:36:07 GMT 2020 + dev: + Fix SleepingTimeCheckEvent not being fired in initial sleep test. (#7005) + +========= +Build: 1.16.1-32.0.84 - Mon Jul 27 21:30:24 GMT 2020 + Yunus1903: + Fix ClimberPathNavigator spinning when width is small. Closes #6993 (#6997) + +========= +Build: 1.16.1-32.0.83 - Mon Jul 27 21:19:50 GMT 2020 + mrtschipp: + Re-added PlayerEvent.NameFormat (#6992) + +========= +Build: 1.16.1-32.0.82 - Mon Jul 27 21:14:02 GMT 2020 + email.squishling: + Fixed modded overworld biomes not spawning [1.16.x] (#6990) + +========= +Build: 1.16.1-32.0.81 - Mon Jul 27 21:08:23 GMT 2020 + christ.klinge: + Added EntityLeaveWorldEvent (#6984) + +========= +Build: 1.16.1-32.0.80 - Mon Jul 27 21:02:53 GMT 2020 + aqscode: + Re-implement moddable flammabilities (#6983) + +========= +Build: 1.16.1-32.0.79 - Mon Jul 27 20:46:11 GMT 2020 + diesieben07: + Re-add patch for PlayerSetSpawnEvent (#6977) + + Yunus1903: + Updated versions in README and removed flocker.tv mentions (#6978) + +========= +Build: 1.16.1-32.0.77 - Mon Jul 27 20:40:33 GMT 2020 + sciwhiz12: + Fix ChunkDataEvents using different data tags (#6961) Fixes #6957 + +========= +Build: - Mon Jul 27 20:27:00 GMT 2020 + joetarbit: + Post SoundLoadEvent on mod bus instead of forge bus (#6955) + +========= +Build: 1.16.1-32.0.75 - Wed Jul 22 01:26:19 GMT 2020 + cpw: + Remove startupquery. Currently wasn't functional, and 1.16 has out of band state loading in all cases, so the complex functionality there is no longer needed. Going to research using the Lifecycle indicator from DFU as a proxy/replacement. Probably with some codec FUN. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.74 - Wed Jul 22 00:34:43 GMT 2020 + lex: + Run Forge's data generators to sync 1.16 vanilla changes. + +========= +Build: 1.16.1-32.0.73 - Wed Jul 22 00:13:48 GMT 2020 + cpw: + Don't show the early launcher GUI when running data. It's not needed and prevents use on automated builds. + + Need to investigate why a bunch of tags seem to be being blown away by rerunning on forge. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.72 - Tue Jul 21 23:56:54 GMT 2020 + cpw: + Add mixin + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.71 - Mon Jul 20 22:56:31 GMT 2020 + cyborgmas18: + Load Modded Datapacks in DatapackScreen, before world creation (#6913) + +========= +Build: 1.16.1-32.0.70 - Sat Jul 18 22:35:53 GMT 2020 + tterrag: + Fix inconsistencies with model/blockstate datagen + +========= +Build: 1.16.1-32.0.69 - Fri Jul 17 17:35:47 GMT 2020 + dev: + Filter duplicate mod files from mod file scan data (#6855) + +========= +Build: 1.16.1-32.0.68 - Thu Jul 16 21:56:30 GMT 2020 + lex: + Fixed Forge commands. Closes #6973 Closes #6974 Closes #6976 + +========= +Build: 1.16.1-32.0.67 - Wed Jul 15 19:30:53 GMT 2020 + jaredlll08: + Added an event for registering commands. closes #6968 (#6969) + +========= +Build: 1.16.1-32.0.66 - Tue Jul 14 00:15:41 GMT 2020 + darklime: + Make all functions in Style common. (#6931) + +========= +Build: 1.16.1-32.0.65 - Mon Jul 13 22:44:53 GMT 2020 + 55965249+seymourimadeit: + Mark Raid.WaveMembers as an extensible enum. (#6878) + +========= +Build: 1.16.1-32.0.64 - Mon Jul 13 22:17:58 GMT 2020 + lex: + Fix checkPatches task. Closes #6956 + Fix patched in method using srg name. Closes #6965 + Fix capabilities not being collected for ClientWorld. Closes #6966 + Fix TagEmptyCondition using client side copy of tags instead of server. Closes #6949 + Fix ExtendedButton using narrator text. Closes #6958, Closes #6959 + Fix misaligned patch in RepairContainer. Closes #6950, Closes #6953 + Fix LivingJumpEvent not being fired for players jumping horses. Closes #6929 + Remove extra getToughness method in ArmorItem. Closes #6970 + Remove GetCollisionBoxesEvent. Closes #6921 + +========= +Build: 1.16.1-32.0.63 - Fri Jul 10 22:28:22 GMT 2020 + richard: + Fix race condition with DeferredRegister for custom registries (#6951) + +========= +Build: 1.16.1-32.0.62 - Fri Jul 10 17:49:51 GMT 2020 + sciwhiz12: + Remove hooks into beacon base/payments. Vanilla uses tags now for extensibility. (#6948) + +========= +Build: 1.16.1-32.0.61 - Wed Jul 08 21:33:38 GMT 2020 + jaredlll08: + Expose the DataPackRegistries instance to the AddReloadListenerEvent (#6933) + +========= +Build: 1.16.1-32.0.60 - Wed Jul 08 21:13:18 GMT 2020 + sciwhiz12: + Fix canRepair not being set true as default (#6936) + + Closes #6934 and #6935 + +========= +Build: 1.16.1-32.0.59 - Wed Jul 08 14:56:39 GMT 2020 + David Quintana: + Fix particles sometimes "losing" the lightmap and drawing fullbright. + + David Quintana: + Fix misaligned patch causing LivingEquipmentChangeEvent to never be posted. + +========= +Build: 1.16.1-32.0.57 - Mon Jul 06 21:32:33 GMT 2020 + JDLogic: + Add simple patch checker and cleanup patches (#6851) + + * Add simple patch checker and cleanup patches + + * Address comments + * move task implementation + * genPatches is now finalized by checkPatches + * the S2S artifacts are automatically removed + * added class and method access checking + +========= +Build: 1.16.1-32.0.56 - Mon Jul 06 21:27:02 GMT 2020 + richard: + Fix the modifier combined name for keybinds displaying two pluses outside of forgedev #6901 (#6902) + +========= +Build: 1.16.1-32.0.55 - Mon Jul 06 21:12:45 GMT 2020 + richard: + Fix harvest level and tool type not actually getting set #6906 (#6922) + +========= +Build: 1.16.1-32.0.54 - Mon Jul 06 20:46:01 GMT 2020 + richard: + Reimplement ITeleporter Patches (#6886) + +========= +Build: 1.16.1-32.0.53 - Mon Jul 06 20:39:37 GMT 2020 + 40738104+Mysterious-Dev: + Add function to add items with the same behavior as the pumpkin for enderman (#6890) + +========= +Build: 1.16.1-32.0.52 - Mon Jul 06 20:33:17 GMT 2020 + richard: + Custom Item integration with Piglins (#6914) + +========= +Build: 1.16.1-32.0.51 - Mon Jul 06 20:20:02 GMT 2020 + ichttt: + Some dead code cleanup, and re-implement some bed hooks. (#6903) + +========= +Build: 1.16.1-32.0.50 - Mon Jul 06 20:06:39 GMT 2020 + diesieben07: + Fix missing null checks in ForgeIngameGui (#6907) + +========= +Build: 1.16.1-32.0.49 - Mon Jul 06 19:50:02 GMT 2020 + sciwhiz12: + Fix swap offhand keybind not working in GUIs (#6920) + +========= +Build: 1.16.1-32.0.48 - Mon Jul 06 19:42:07 GMT 2020 + thpetuaudletang: + New AddReloadListenerEvent that gathers server side data reload handlers. (#6849) + +========= +Build: 1.16.1-32.0.47 - Fri Jul 03 12:40:42 GMT 2020 + David Quintana: + Attempt to use a more compatible method to initialize stencil support. + In case the separate attachments don't work for everyone, there's a new setting to choose the combined attachment. + +========= +Build: 1.16.1-32.0.46 - Fri Jul 03 04:00:22 GMT 2020 + David Quintana: + Update copyright year to 2020. + + David Quintana: + Fix multi-layer item rendering. + +========= +Build: 1.16.1-32.0.44 - Thu Jul 02 17:17:45 GMT 2020 + David Quintana: + Model system improvements: + - Port some things I did in 1.14 which I couldn't do in 1.15 due to breaking changes. + - Fix multi-layer block models not working (1.16 RenderType doesn't override toString the same way anymore) + - Implement multi-layer item rendering. + - Improve CompositeModel submodel data passing. + +========= +Build: 1.16.1-32.0.43 - Thu Jul 02 12:54:03 GMT 2020 + MartijnvandenBrand: + Include model data in getQuads call (#6884) + + The model data wasn't included when getting quads from specific sides, but was when getting quads for side = null. + + thpetuaudletang: + Pass matrixstack in tooltip render events (#6885) + +========= +Build: 1.16.1-32.0.41 - Thu Jul 02 05:54:25 GMT 2020 + tterrag: + Fix improper handling of baked lighting in forge light pipeline + + Closes #6812 + +========= +Build: 1.16.1-32.0.40 - Thu Jul 02 01:59:30 GMT 2020 + richard: + Fix FMLServerAboutToStartEvent being fired too late on the integrated server https://github.com/MinecraftForge/MinecraftForge/issues/6859 + +========= +Build: 1.16.1-32.0.39 - Wed Jul 01 18:14:25 GMT 2020 + ichttt: + Fix miss-aligned patch ItemEntity (#6895) + +========= +Build: 1.16.1-32.0.38 - Tue Jun 30 20:19:32 GMT 2020 + info: + Add hoe tool type (#6872) + +========= +Build: 1.16.1-32.0.36 - Tue Jun 30 20:09:21 GMT 2020 + curle: + Allow any armor to have custom knockback resistance (#6877) + +========= +Build: 1.16.1-32.0.35 - Tue Jun 30 19:57:32 GMT 2020 + diesieben07: + Add senderUUID to ClientChatReceivedEvent (#6881) + +========= +Build: 1.16.1-32.0.34 - Tue Jun 30 02:33:58 GMT 2020 + lex: + Re-write checkATs function and automate making Items/Blocks public. + +========= +Build: 1.16.1-32.0.33 - Tue Jun 30 02:10:14 GMT 2020 + cpw: + Reorganize modloading on the dediserver. This removes the DedicatedServer parameter from the FMLDedicatedServerSetupEvent. + Code for customizing the server instance should be moved to the ServerAboutToStartEvent or similar, where the server instance + is available. + + This reorganization means that mods will load fully before the server is even constructed, or the server properties loaded. We also move the EULA right to the front so we don't have to wait for bootstrap. + + This should fix the problems with mods which customize world data and other things. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.32 - Mon Jun 29 23:43:01 GMT 2020 + thpetuaudletang: + Fix datagen resolving tags and exploding. (#6865) + +========= +Build: 1.16.1-32.0.31 - Mon Jun 29 23:37:30 GMT 2020 + mattmess1221: + Fix Language.javaLocale parsing (#6862) + +========= +Build: 1.16.1-32.0.30 - Mon Jun 29 22:58:30 GMT 2020 + diesieben07: + Fix IItemHandler wrappers for chests not updating both chests (#6875) + +========= +Build: 1.16.1-32.0.29 - Mon Jun 29 21:08:55 GMT 2020 + lex: + Fix missed patch in PlayerList and EntitySelectioonContext. Closes #6846 Closes #6850 + +========= +Build: 1.16.1-32.0.27 - Mon Jun 29 20:09:12 GMT 2020 + richard: + Fix access levels being hardcoded to private via patch overriding AT entry (#6848) + +========= +Build: 1.16.1-32.0.26 - Mon Jun 29 19:42:50 GMT 2020 + lex: + Fix tag related issues when connecting to a vanilla server. + +========= +Build: 1.16.1-32.0.25 - Sun Jun 28 22:08:15 GMT 2020 + lex: + Fix Forge's internal handler being registered in wrong place. + Fix double call to loader end. + +========= +Build: 1.16.1-32.0.24 - Sat Jun 27 22:50:54 GMT 2020 + David Quintana: + Add a model loader that lets mods specify different models for different perspectives. + Allow custom models to reference vanilla item models as child models. + +========= +Build: 1.16.1-32.0.23 - Fri Jun 26 23:55:23 GMT 2020 + thpetuaudletang: + fix misapplied patch + + also sneak in an import patch removal + +========= +Build: 1.16.1-32.0.21 - Fri Jun 26 22:40:19 GMT 2020 + lex: + Fix blocks being harvested with incorrect tools. + +========= +Build: 1.16.1-32.0.20 - Fri Jun 26 19:53:02 GMT 2020 + lex: + Make installer use MCPConfig version to identify MC assets. + +========= +Build: 1.16.1-32.0.19 - Fri Jun 26 18:27:49 GMT 2020 + cpw: + Tweak the server startup a bit, make sure methods that can't work because they run before a server exists explode saying so. + Also fix other launch profiles. + + Signed-off-by: cpw + +========= +Build: 1.16.1-32.0.18 - Fri Jun 26 16:56:37 GMT 2020 + lex: + Fix dedicated server loading by constructing mods before data packs are created. + +========= +Build: 1.16.1-32.0.17 - Fri Jun 26 15:20:37 GMT 2020 + David Quintana: + Fix create method. + Fix test mods not loading correctly. + +========= +Build: 1.16.1-32.0.16 - Fri Jun 26 14:43:19 GMT 2020 + David Quintana: + Reintroduce missed patch in EntityClassification. + +========= +Build: 1.16.1-32.0.15 - Fri Jun 26 13:55:42 GMT 2020 + thpetuaudletang: + Include a getter for the matrix stack in OverlayEvent (#6834) + +========= +Build: 1.16.1-32.0.14 - Fri Jun 26 13:23:07 GMT 2020 + thpetuaudletang: + Fix block render types not being properly applied to item entities (#6832) + +========= +Build: 1.16.1-32.0.13 - Fri Jun 26 13:05:18 GMT 2020 + mods.itsmeow: + [1.16.x] Allow GlobalEntityTypeAttributes' EntityType -> AttributeModifierMap to be added to (#6822) + + * Make GlobalEntityTypeAttributes map able to be added to + + * Split get patch into two lines + + * Favor Forge's map over vanilla + +========= +Build: 1.16.1-32.0.12 - Fri Jun 26 12:59:19 GMT 2020 + thpetuaudletang: + Fixed creative screen arrows (#6827) + + Yunus1903: + Added call to method for tooltip with FontRenderer (#6831) + +========= +Build: 1.16.1-32.0.10 - Fri Jun 26 12:36:59 GMT 2020 + curle: + Retarget Block.Properties patch to the new AbstractBlock, reintroduce harvestLevel and harvestTool fields (#6819) + + * Retarget Block.Properties patch to the new AbstractBlock, reintroduces the harvestLevel and harvestTool fields. + + * Slight adjustment to fix the lootTableSupplier. + +========= +Build: 1.16.1-32.0.9 - Fri Jun 26 12:31:37 GMT 2020 + Yunus1903: + Fixed sneaking while swimming (#6817) + +========= +Build: - Fri Jun 26 12:25:07 GMT 2020 + thpetuaudletang: + Fixed tooltip rendering issues (#6815) + +========= +Build: 1.16.1-32.0.7 - Fri Jun 26 02:30:54 GMT 2020 + thpetuaudletang: + Fixed villager trades having non-applicable enchants + + Also added an AT at lex's request + +========= +Build: 1.16.1-32.0.6 - Fri Jun 26 01:52:19 GMT 2020 + thpetuaudletang: + Fix locate command (#6811) + + thpetuaudletang: + Fix block drops (#6810) + + contact: + Add missing patch to ScreenShotHelper (#6809) + + Adds the missed patch back + + Yunus1903: + Updated MDK mods.toml versions (#6808) + + thpetuaudletang: + Fix locate command (#6811) + + thpetuaudletang: + Fix block drops (#6810) + + contact: + Add missing patch to ScreenShotHelper (#6809) + + Adds the missed patch back + + Yunus1903: + Updated MDK mods.toml versions (#6808) + + thpetuaudletang: + Fix locate command (#6811) + + thpetuaudletang: + Fix block drops (#6810) + + contact: + Add missing patch to ScreenShotHelper (#6809) + + Adds the missed patch back + + Yunus1903: + Updated MDK mods.toml versions (#6808) + +========= +Build: 1.16.1-32.0.2 - Fri Jun 26 01:41:51 GMT 2020 + lex: + Rework BlockSnapshot and fix client notifications. Closes #6807 + +========= +Build: 1.16.1-32.0.1 - Thu Jun 25 23:24:48 GMT 2020 + lex: + Bump MCPConfig version. diff --git a/gradle.properties b/gradle.properties index 2e6ce016..6d57271b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,9 @@ -mod_name=BloodMagic -package_group=com.wayoftime.bloodmagic -mod_version=2.5.0 -mc_version=1.14.4 -forge_version=28.1.1 -curse_id=224791 +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false -mapping_channel=snapshot -mapping_version=20190912-1.14.3 +minecraft_version=1.16.3 -jei_version=6.0.0.11 -waila_version=1.10.6-B67_1.14.4 -guideapi_version=1.12-2.1.8-63 \ No newline at end of file +#Mod dependencies +jei_version=7.6.0.49 \ No newline at end of file diff --git a/gradle/process_mod_info.gradle b/gradle/process_mod_info.gradle deleted file mode 100644 index bd9371de..00000000 --- a/gradle/process_mod_info.gradle +++ /dev/null @@ -1,28 +0,0 @@ -buildscript { - repositories { - jcenter() - } - - dependencies { - classpath 'com.moandjiezana.toml:toml4j:0.7.2' - classpath "blue.endless:jankson:1.1.0" - } -} - -processResources { - filesMatching('**/mods.json') { - filter(Json5ToTomlFilter) - path = path.replaceFirst(/\.json$/, '.toml') - } -} - -import blue.endless.jankson.Jankson -import com.moandjiezana.toml.TomlWriter -import groovy.json.JsonSlurper - -//shitshow ahead: groovy is too magic to call methods before call to super -class Json5ToTomlFilter extends FilterReader { - Json5ToTomlFilter(Reader input) { - super(new StringReader(new TomlWriter().write(new JsonSlurper().parseText(Jankson.builder().build().load(input.text).toJson())))) - } -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 3d0dee6e8edfecc92e04653ec780de06f7b34f8b..7a3265ee94c0ab25cf079ac8ccdf87f41d455d42 100644 GIT binary patch delta 37025 zcmZ6RV{j!vv-h*%#qK{KNb(sQVoHmA`bzH0S5N{I~W+4C|DvAG17l`Jc&ngiTqmpStq!6ZntjV!2Y-K zKMyeQ|1AFozrn~LkPc0osms~Q+Q7BLLgt8=f9EX381D6gY)Tntqu9jmd`7-mOYcp?&Q4SJ zeOm+035)S-H=#MZWaYT0ul8l~lmGqvc(w*J>Q`nH^U)tMos`%4=^{Ep!ZfZkM2VZ8 zxHpl6K%8c2(68CsjXneiEHC-dPPN+^N{hRxlj>Z+FSwl`wiVe9x+8rxSBeQ~n!c&Z!B}n}XJFXTECD|$-_C(1RTAvAfInz_oa5)N1 zE>l<2Sd%es+g@UBYgP{2jCO&J0xm6UL3b~>)X9mB-gS%PGD$HVNU6y_53*aG%);DZ zzAX+ao@-q+eC*Ad)hzxgvz}&!VPzO?MTNzYJH>Zfp%pCf(29yh(#6D_B^g~>t*R?h zKG9R6hY_&E;Q+Fv_H5OV%e0F}WxcS&nN%_`mi^P%?v_~OB?Inz?$1wgm35z<(PMf9 ziSP$jhoQc?Cf5Z3q~Kl2Xunis27FFg%_vN|PTcG3f^6-}RFeu+Y45TUVv;V*uC<;P~LvmYV_~*4_6Sj`YG|foE6QT;mPJ;e! z^po$KoS<~S;YM-+Jfio{T=r@ z7!Ld5(Rt;0CY+Ya{n9TwA~Q^{<8Ovlp`pqc{?RiP@kV$_ow{b--{FKtE3n-dg%@Ev zLDPfpV*Tkaa{c1|ib0$0Wj*a>`{->n^l72a82&NWCzuz$Mzr`KEerls43>P33123& z3@?fDXOm`NWKTaC6DZP}-R*QkPJ&&)O{tj8=G@YWlubwrFM}LM%7T z4A5-N5FI2vLWG%FfNyyTt)PEtMU1IjOz>;AjKK%qU40@t8PXy54qaGecd%dtM0F|U zPPg{6U^(W>F@o98cI&!=;->XtlrAjME&s;&a7=OT_W}~OZccrb15JkmM_945Lk>CcWlS7B!2I{?9wUOS(3BZjnMF7Vf^?4U0bTGFcoh) zlfKCnExi!e|b<8ESc`x8qR+cfDFImJojrsZ>y){dS_v@SJc3X2od{_sn28RuO zE|AN*6b1l(9qWo^DF3yvKA&CUJ`5-ruA|5WHK?|UJbb>j8?55|A}WH~#)L1hvOmuK z?#fcO9+=)hNSOfrC(kKHwtWc#j$h#|qr?gXpvA)!Y9mUA_R!N%XI_x4M z_+VriWS69sJ(%cS9oc;`TlA27K6)RWcpc6-tAgrbQt|nXn53aai11qffRLh8 zVh~+eGif+Ad*t7Yti1Td?~Fiu$GR#xS2WZK>?eDKRb0j=`y*fNqu40UH+zB%=IF={ zNnZ~6miyoH@B;%+tYpT&qev9({c%1bV_Nvg!3_*Z@x`H6UENZPpeF*QA9C^e`$O=( zYtbos_Xb!mX4DUb6jLVR$5Ar|T3tKJEy&Fo9YAT5kt|DQ-IxZ%Wwp#muiP$~HS$Ji zPzE7!)fS0LAJG4eqyL1_&s)@KWF#;!DgrPt(*MK_A&|-3!PMP7R~Oy{W7$(sd2JIn zPKsDdrorUK>=)J>9{vwT1SvFd$Rrd!iY60>gcfpJQ%>@kX>d1v?s)M%4#kZYS0N=c zY9+mAz;mzPOwV=i z<8j~XDR2gSg_a3NW~VdQv|D3v%i7{zceR@#Tl?UQ`Q#-h*m#K9_Qetc+6l)8v(Ict z`xdbJkyY~Qx%v?vyndS%zP)&(51nj`9zbjFZ`o7j9<}^P{W$3UpJk=R_W){QbG&ii( z(a)vmusl?o)vgEzepIl(VgwwQE5B?J@mX|dW_+;v&|SYxR!_V31%E6yA4N_;95O?G zBE}`=r6PfbI(svuzSNHwHZ5iIYHcYN0XlBK6pBNbBac8UBWpm^=D?M1Wa4IbIS{z@ zWM1LU$dz1N#pH1cJNs>l+qu>Ujoe0ZTC0Z@x-UUh^IP(=Z?bO7^RXLnwF{W~otB(` z=a}}pinT6Z5FcxC=6AcFmdhsgVCJJ;mWxeGbnlz(k)=Mp#y+t(l&nq7s>xYp1(Kqi zc%v_No6?-FkY{$tuJhX}mM!XT(9(070%Uoom7zaYDHMBbIa4c(x~i%m za!(HwMw%y73nq;=>7pJajADOH)pi6BtX~rm<4;~^d2}IDs)N>4o6%q^;aFR8QdDGD zY=ut`p6iUKq0`M0(f>skA5nn@Q^!+%7}JyhlO7oOVFF;)z$fUAUuOZ&IU zSvI8yb5}@e$RE^tmSs!mzLn#D=}*0 z*g^T`cj1n}rP4#Llv%)&NA!HByL}0_qohH>A2)Gl027Z8AYNg9)a|Nne=F#)G%2a7 zBed#!Hu!EH+Q82{a{hBUAdkisz8d_2?x0WZcnQNc5p&jV+W3}Epp_+;v?WVG9>0-? zAQ5G^13#2PaBD55H_O3B=p}{4bnO)49j^1#yqYW1L76*j^N3=)(vz?HP&2AK`&J5L zaTE)aNxS@&`5qZj>QuJkjQ7+8P=JJUc?e0pWtTU& zPLpj0l-dS!80n?xkx``XVOzA0(H4_i)-Jwby9e7nJOp#wLhBXPl@SQ1I#({Xq?9s( z^rMbLJcUUXwac>tsiH+lDbyhArN6E(@ZVTO^!mrG{*J_eQaH_v9eAmHIakW zJX*J3!Iq&Eh(~qXRKYdO>nfCxqxR$|8UJQb#d~_>F&;yw$de_LX{K}o*?*fH!3WEt zJ;_{5-@v8$TMS&4*RS$?-k{2!?UbSuNw4>id2(H$-y^8gc4^WbLbzOyxL(3J_|?s} znbk;UjJL~TrWvYT_J{V3BA+ko=}g_;y9M7_dmu+HFf-q~Qk-nO1Bxp4WG>1SYBeIW z(@k_M71<3}s@o||IsOPe_aWChx&?tJwWE{i;65Xh`0!p`+=-`+qqyU=&R~sWMW4&D zQUT=Z*XifSx7I1xqy5=dTw)JrY$4Mmr(|YS*}&J{(rw!s3QEpShqiR+zpa(0tfLw3 z2R~;7QdQ}RB}M&we}O-{)6op-4APHg8<%q?cYKGrw53np>uGE}Akvd6e`1lpC*N1L zGX<24#o@!JPpidYX7T6C_}Xf&=2GNl)~RT@I)>= z2F1Un_)r3x>d^W#53)sQ3OPBCcZXIZ$-OkO>FHn{y5qI-WiaVX3G;HU8fB41fr^-A zw8n?1ZkkmKC8NEUejz$P#Usd^nJusKTe~w_+Sx6c>HT~$Tm5HLvY)Q^Sj8^kxaDJk zQ7p-2->s$cS}SYD`Fu6bx>8Cc=MLz6}`_Lgl%nQG=kTH5e;S$n!EdN(~S@}}* zac`^jvlY|sE^N)43Ttoszji_?6$ZXBp=E~7({~f`D*bAh@juH4uqap%zTuMs9e(lV zSPMfHz_}CfQ<`I&zDk$~GZ@33oger4)8E+td?I6NG~BTv5QTiHwYA44%#A@|u5ct$ z4b^lgo~8ZrTd|)&-SfK*IP-4Dqm-%0!_X}CRnuujyR|VILN`e4+i-N!m(bLI*VJh9 zG?FY}L~D;W(I3?eZ7*OP+eC;1UTVp$k9>lPiQ3E%s}&YE-y zo8=w_N@Ff$Yr%64WGyX*P7LvzwGMp*5wt6!Z75aDaw{PZNT&t~1x-$$HbL_YRyEUV1epz2%BT5WjYo}jpzPyWbKo0txjdUOoRv508M?nbhf%)M8e>Bg720HT3fs~u z4IZN-Enj~gSXSRO|`ikWTk9Kfiu^X4t zXX=i{4Mdq@Cd1oG8fIJuHgXbefg&%N+ZH*O4M0zet&3I8j`Ej!8+_XLTh_B%PqG>j z`pqk@a*AtycD(4F!3`fR-1zDGXF_2h6h3laPj^ME%NgK#Zgj-cc`T%}NCIT@$ys+W zXqurje{?A?eEdAiAc3R%BV=IB-Y1vJkI-0iJLeRbVFP}3R1pEhc%J`wkBs>oS`K)) z{>E2|?Kd|Hd}odP7K=v8N-zQ$&+-C|Ya<<1V=ghvLdX_E?Mk4We1^^woL^=in75cu z{%9Y$56=_Fyo=Bq+x!AYRDk8`pX5==* z_0ye;88b{dooY<^jgSU>)B%CC%88G#kjMl>uwpv%r$AGJYG>#{+IhR+R@$&q{}IyH z=2)NMM^_B63%l`HZf=Kk*rkrb0<h*kB%}Gn7m!n4bwsWiqC?1*;D&m*o zKeI|Ql(u{hudEx#_I&!Jg;$b2Z@yH>kwewCxuq#@8Q`J5(@+kjQUkue7?6;>Lt&bD zFoX;~aS4E9W-cY<{u=QKP(1P4+@>@mt9c^jB>gT}hGpozy{wCP(V?F8~)wuJKAY3(h*Q)D9JO@-b zm8B3BImf=lpt>GMc8o^0jYe_U7QLUoK9;=jBpLw~&uU*(pTKi;6Nm@zJ=S=$IJuvB z2tW5GcP>2BUM2g` zPFDWTlYTkDz=B5Vn1x*41Y=U6X$I3eNke$$Ir8gbx@+sCFR&l)r)b9440O%vg^ADX zYqvo6vo|(eG3}K4>H}s~Kx^-BLCU1*@au9h@!e**4ww?RU6|D;$N}UrWfq4qWg3Ci z3i@Z1hF~3mU&<_4<>}_PDxrdmXwk!uPdeSKi~UmPv4(?-scb7k;;nh5V#J57pR8N{ zGpHcqW5O3$&lGarusdnkU5w_0mTK7qpqe5fLOOm76!=!daRRqb`tYKDcwSl*8AsF;zKW696a zz7w{PN6dyT2tD9=?F9ZGJ{=gzf@%Z}26hOaO!}Q4sPB$`j2kGVJHK|$$%Vv&I?6dK z!L}0eAVSwgA=R%z;@;%CA1byqAJOB}T3x3VB(E$hzgFVtE4LQzwvc^9wvcH>g^Ds0 zYS7Bw<5b>Pklt~sXzi=|=HJznh}@1o^TOX7aU8IH?57RG_U!TZ)S=IxcVcREN1eUMfz%t0;?ndJ+fJp=-M;4tgTOPjnAbx&^+0^F^J(G_9l*7eR5or_c z5^dxWd+;KXhRQQurGCT`;2*a|Q@0_n%biFOGD8}RGRQqZy~6NS(dD@M<9O@?buF$m z9nfgZt&Cw?>;1@7AfwrqQvcy&^`gc(l`ymCNdHgOL-S}|dXDc@FWsnvbbOjzlNLU( z&A?vk4Kk}`03vwK10&+nGIhhHr5Xm5%m{F*yn3HUYywQUri|_?$S;;#*Zo#2h#foE zTsJm}r2am3D|ZjhPbQk~CGVbgE?17lXM%B0r`m)`h~A7A7Cl)tH+l8yqgrI=F>vWHwkE(pS7M5))@m)+#${yK~q~3m)`%6nsE6l8~fk=9iP#4<21gH03}y+GOTD?|7fPz*hr~Lx;Nz z{t6^uVTptQm$J8k?hSK>7wCNpBdlFl(tU&O{c(-=LS#g$9G)}Z9jyJQAEnoM2d3S2 zhm-RIgBQn?#GGHU!PG>Ol))LmsbBcOm&WjXoEO?H4wa$y@O<1C-ayh>Uffpbg)WCGoxm|` z2Q&#=rL-ygG(wiG+4nnn)?#jZXru2`)^;zc!EHC7aAW)zL?@e<+F)-NwLwORzClE- zGt&n~Q{=!hr+)61tZ337Wn@OVuP549IqL}gqEd?d`8O59CG`NK8dNsrg7{W!7Ekx3ZTN3Yu6kGNDn_zwvh;?BJ2b0kV z8$V$UA&jbF-Y55sA4nI&R2PE_0<7em{zS%+fe@ii676d7W(GhYs&Ns<=FqrI0X)hK z1DQ}yU+@rF(t>w^>*|(>bp3Q;@H9V*65<^fw(>CkNoSb2-PQvV-=B>D_|KS=OsBIa zr!urszjP1cE@n5_M0vIpMhIdOuLZuECwq==Hdh~1{c;$;_p6;-1F}?` zohSpgR0k4FIH4Dy9~}UDT@4nAW6tZI3Doz#gKlZo@aGZfO@j$aU(TfqO|4_arDI1R!HAWcwk`=usPr_4D~ITB<@^gMKvUcDyoa)Vkgf@`EX&HUBhgN0}HRGF;OOtS?ak>9HcVuW*69 zTlRWpx0)0P|8Xo`F8f$M$Y1cu^wwsge3&pnpd5aDEIuhku`pC# zt*oN{m*H6FMdK^BF4%8{`i5z5_!&S@Zi2ljb@cZ0yRjAl^X&(jGtY67@G z7=QF-+`qy<1MXfOemJm@A&7!8JA@^Mu7oZ&BH~!!JD8ivh#|c;NK)h`D#coPQV_~! zgFL7<*=4C^^;hGPe@?fYDm`z}Z~7(t?c$$k@(2QcLJ4oaZ?!GI8|8h>3?_VAA>pcA z3GdQ$7?MA@Q|stf=(okBL^B9Ur}qg164yWMYq~w#Vb=Ex25y{>+GBPrNu~}}4V)kD z;%juHI;-7SVR9n9Fw%kcYm<)G5AM7=y2XbB+W&p?!EK$6c2S&c(xvSS!fjQXVQ!V1 z;ZD=|s0`zc9SRAQ?0g3Li%1d*RglHNzH-v0Baa=L3YUHONQ4n5jDMQLO;`B<35d0B zQT;WBM{is)^M9ek303Z>(}8wmG4n^PKVE7|UUP`^wQrzaUnK!ADFPo!77r=J#%Zy= zd!yQz{)%gEZ3ewpql9(Qz2NWsZMc}=1W|`uaAi0;Jrxh zq4QN_jU{v0vIJaeKi+oRNmDtBef?#WhYz-(-f9|k^h^wg6yn0A)!$@*8{hL~PWShv z=(-2DuDrbjeHmnn{b9f080v&|9GVynmE)3(TSps%&fK<2%OU9qV>58Kh+^;sY6+Ax z1zOCc^u!=jQf&2dS@+W7&nsK{6aKvVO6@ngL}bdGjG@|I5aCC}ju%mH&Rp6C5Vo4-~woXN9~yA9|96vWtt=R%5!0P#TeCwGYKQmGI_bEzy8+*k50(I`fx?)Wst$yno()%M>C*YAwyg zk6h#;)SN}Sau}%wZK>c)gw=7qvSBS^7ryQ*$X4nw5hjIWZY^&Er`Sb#C;mwUlqeZL zEv9i!<+LY%Cd#cF*p*pgr0luE^jE@EC9%z0QDJhfEex?fg#IeZaoQZajXeyKtsu8@0tsPlO1FR-f$Rdo+wF$1K|ngj}Tb1M>8<+0;7y+Us}VrciM({sZ`t;(AiI# z75_@Z+Px44*6$*}6o&}gzOa7{lw{FXs!+HO?tV&ql!4;aFI zRqh(UwEa>;e)gQ`B}i!A5kTUfLLY0dOlW}Np{C{#z;2TVGJjcv*2`$0PL_21_#7!# zRMpY0`wULN7Xc*3Q+a8i_QYG<29I?e(jkE|y+GetgNP=}GDbPjJ?8F$L=?@R(1A!e zVNG<)_FTsUy>R|ksRDs~iHahFd0Pi;_tV?xidl)$3bi3{MFxy-k{b3!QVeQCW{Qi^ zlpbpUyQD8*-dOsV!hAGk>_(vmc|~MtR=dpEIlmY?XQKiG_R3Nrb#fUd9_vXwBswWZ z-1+GPk03suS(#W}C+QYJAvrBOYV=(ae@%Iu%I2Df;Y1C`CBOe-q+XT|sg_(6sbWpi zUWjQ|QntDh?abYrohz&Ox_!7q%Fh_ItSdAP(qsZ)VG3S-T3r;USuNF46kqVf@4-vX z!jeq~u~S!aJbpBGDY3=_-j_C-A|rIf_V~-y;vN<^LaT6(W z7Z?o@VCy=)rNiT_`OtSAdx+B%prN@UAa{8rV2T!Cx`=f|g!1E+u&nV~eFT3DYv=HK z43mbXo6y@Z_G#wdv~!=6VJTm=09isk>o)?Idm^U8!kS>azPe+3n8Hp+t^s`2qwC-p zgP@Qy;)ii$Wz^}OeZY|?^NJhO6TuXm;p|C&(@oyym`2pZZFv^2&n|8Q&yS0ZKk7C7 z)JK*bJ>3k5)!ONUg=uUf`<(=GYPLiUmHFy8JtLsbj>P$oDqNe0ZXN=B+uY&mAVOfl zg2xtPb$K=8)Jmz@Ql$$i(r_J*aQHsV>$qDuv(RjG`*cpyc9MH;V|t=G1vkVomBq1J zT#MoijUMM2m`D&6!!wxHCJkXiwVDjX6|%HI1{qA(O0_$FqNjx zv}~#S-{oaLI~-OEzObUrwbL?3jNBieT!>(7IY}Dk^zUAB1uOtM<5*YED&N9x9LvK>vy$32(?Byy4uK5(nZw4+8vB z-ys0+a97Ajm-Mov2N2=skD;NYF!lu{uHbv3_=hOVYWVHo+%A6zAWwKEx7j3E#Td|H z7BIAxR`!!Kux+!3K8Tolw`fxklnYw^U_V$EULe285rqML0t*~WR#3v~osLd1AcQ zz4zmRk={c{Tjc&+@pJi>86vU9Y$V9H-+04cQ|`f>Byx28Ov!>N0sol6Zp@zZfod8WGFU9FTcBs`q zx#@<7AY&1%wga7(E}vG=fNssPv3mg}%Jg0mtOJe3a`I>$*JymbNBZWcNA9AZHYb-= zBW=u-u0htYW!JU1qy?OQcs7;GumuV1OX(!fSXpTPZJ6m?m@*rz+k zTaUvx``GaGEtPJD%)-#9r$rKlDtpc!A?n*i&v0Lrx!yVEPAckK3P%h|ze!>4-lRViPr54vJR zOb4h|h00WgaZZH`Dqmg&pmG088*8vPtEV@+V`*z#%Ir{V#}A{Qn^lA}gZHq;vM2Bv z(;*p$55M3qZAx9s?VpMGqfX~WM0BzIu0-RKK^qrSMbgH;Kr{$;-kpO=NmyJ4OVY`M z0l2Op3U7Gtj*YhV4f=8xnKH~2mf(OeTu*hPbh-2xlR4QM?7ztW8!07+L+)Vwx75w8 z#(7!%2V%I8lYc_uCHF`n1GV4%Ftl+4m7mxqtb$PVT=Z?`q*fRZ;R{t@gW+Hu#nVOb z#URZ+oA@1|so2ji7}BdA!`nc1)mo)?JsL6Il}VHsj_0*&Z!v#^`rfo(Dz3Skvo{^m zz8?Xea(K7>)1Upf`L}ri@7wjg&?fj_AO!uJb_C*-U2!%XHifaDKxML+5NP%&NF_TO zszeDO zW4hgX2A{VqpAhH}Dpf7Pc+E#$Yc|X-p^tl*#|{U|6gMyNJ`<@&B6UDn1z1kIP0o!^rkoOTmX#oF^3qPQ4mMjDqDxt(!>PT)Z3* zgPFDWv;Q^vI5R$<(CiCRrmMl+X?P;rRPI4)gTffziVIovq^fqsQ-`NEb-G9Dk2S?b-ChC%n7E9y!aR&(b0bm zhL&rLpWdjqgEyTYUuZ_e4+X(+OPMKA6?(O3vvkD zRAZp7*0Zl{2pls*vlz6<6M*yH;6ds?5?r_eLPXPF*sV*gaRo^l8&NP4ngHe=5^%uj zDSnPTRe;)WwTurw&O^Dp0!C}y zBHbxnud?a7yoR|GaK1Ru%@6LaG7Wv`-(9ZK-tDs;Iov$0@vY-}i)CkUpBcCY9tNI( z8|%Jo!|(%g&B0#T1&+oed}| z-1YdgUf)}!ox%0k-JOo)>tR-Czj^)L)-JZve%^M&E5!}(@mv(3Cv(^d;G9^W)*9;S zJZOOAaju^dVEd6-ZpCuHgJ6|c)7>fkfLIe<&DspWqI17y;A0B_Hb+{h z&FM<8SFSLaWor0i-A-!S)T=Z@AiKma5XJsAiub+gMtx^N==gCfQ-syyEfALBqs?qA zz2|cT$5*A}ML4#vJ%?NOK$qrSzoRldUfunvf>&wwN3v$yK=N6#rcfk`#lO)Psm&0H zvCB9Jt0&aP0(p6kcSET2icE)Q}7sXe@yCI0uefTPXB0pTWn;VTCFL?LB6vq7%C$bH)BSKWo^@>tL z9X=&`rqFtC9%xh#h}XQmqN^V8`M5nS!{WBhim(|{^>%KLZF#HZC7D$K60&=@Cjtl} zprc_%f4mF z-+Q6fWD=Pkw7Fy`#Iudi`CgY_nsXY3 zUytDI(om|(jdVRF7LJOALmMYHaHmxkUEiTS#Q!On?Aql)J?TRp{qYL9Mckb|1d{=G z1JoRz;dpsx{@?FmE_{aw1v(hm6D=4R$$!-J$&iX@$+3h;KwVgW%)?e;>gS{Bsi_7i zvGy8rv@s$t4jQ~9l15SzQ&y5a3h$)Y4a(_Ud9-saVlBPPBF{EV?}}1Q4KxlqkmvH6 zUM*;8$=W{PvO1vN`P8r8nf4lJ<>cg)B>L+h-Px-5u;#CO?|lH^(OFqgUIPBL80FDb z1Wz)nfCDfO485B@kS`uTZbwPI^9iGViQEokk|52aF;6a`{eEkaN2X{RS?;D9>9lV< zABverR75Kvel(-uqxI7|!UxG7E+4JvRDgS^{7&GMHtmQb>^Q;(DFN9PHa)x|ZQ`KW zAPdfx?!F_s8q)~nAPkN<2{%TZBR^f{?>q@}^06B#@Yw^GpIk!H0Q~^-PJlgOW-pag zD0>EWw^nOclT;7M2&X!^%qR=GutAR|2mgR`exc$900(6Htte_lPdG)&7qKkcEHrd{ z4;`j2))GDn11J{YmQ}~yo9dR_g~xD8mDLw-iEj(5$Yj>=@r%?8b!IolI3T=pZRALW zJ14aR9&&}Pi?_tBhY-Lvp&lS5wy`I4tzgtL!QLqWq$D#k25wP2e3jU%bC;W zAj~N_{TxY)q7Cz=-9RsL%FNy|(w(J_Hp1GQxj(!EbaWe%3UwIl(q~4>I>wG7Rx?#m zCrc&K8f-UodZ{mr5I)8+;&XG~LZi+#JBJBLA&KF4rn zuAWgo^Go|rR)Sd}OxmnaMN!jAgJxNCDGhwp{EUKVoK=1dJzeV!RoOYBHUH$Dg10te z2`p1jSt~mEMA%H5otv8QsOFBUg#yd={cjh%IvkrPjtON+M@;6exSV$D>v0xtwM5H6 z!quuC8V&;YZ@;0YIrhtXl1__~l;_SDIC*Xx;(Xa{*>iU*`>~#3BfK(lY319dB>W{S z&pp^x8M#okTdWhSXYiZhaxixdob_-E!#%YKkMyUUUc(uK(TnxdC^5gl zH$wWKG%${)(0rW6Wavtb=JwCod^1;ujL8L7cYn@Aky2Q7EF??$jk8_$p0)l0k_G8F zd*R9IYk5U3z_SbB?QhcJdmsvitA^u(J66Uc1^Z5eG$TPEAs^#5&oTiPPfC+4E~zTb zX}Z~rRoj);+uv4$Z2WIcj;*ALVBuJ?^UgKC<^}30m+QXdt4^7lbrT<`3n6^yo0vEW zTHKlOdFs+)z4dRP^eD_egoWMI$VdCrG2we-a5j4K_yMejyARu zyXDPmOu39SAa~Laz%}Oa8kx5{D1pXJq=1sPa0`N*MoIM4{Y*LzO`**WP{nEt_o1`0 zKx>^rogiklXj5Urm-Cl2?O}UtigaiPZ%?; z-(d1hJ^46|v!yTBgKqrPkYq~C77MXikEW*Edz4fw@7=Jh0+*~s=6f#SF0?5ok5n%v zLHWGB!!mLStxyxd)&fFeHlmA}5e^=v&enGK#YT45r83aUY3XV%wv1f7OJ35#YU4TG zknGON)23X|@Xa#Z+`K7+uij?LrFl+c`<*A5>mC+dZcRjwLH zku12C>{Ke<^r#)^((Fy^tGM&*mfmF^8%@{j&2v_HrT2#b9h=j0Iv1k6SB)F**NcZa zAfiq&+S}2qmeBYYk8|I0qx@M#Z!*J_IDrat)_TS2)jV7WzIdfx@9-z;b=yOSU8}uj ze=w$AAN9~}4?fGe=Z`lijdMl*R+^|YTk*#Tqc$%x-jIIaM)Nb`)mK^_N3(tQ4R;6N&aBsZq z1>30^82KCp?0>5MaNL?``OFY20Z{jo6%Gq!L(&OPZmZfdZx-Ku`>Gq?{-N1ELEAj( zMg7e_3Ta9{9ElJqI!BFwIlc|NIM3b8H-D-0nyrOvFw!1Gbe@K&f6jVYSGCu!{!^cI z>T2GRBb;lyc_XjhQy-S0<()&PQ`x6Ordol#mQD}}*vd(($H@-6uTw-$fSyR13575fw;|A9jNK=D~Nx#IxY)<*H5&p<{LGzrv9N+n~Ow08{4Oe zto038oJ|g4S5)dpOLpNSo4#;iSt%ZMj2gi>`u;VK+FXemB_c~vy;pIm@rBw~c$1*{ z1>0A7r~Jwo``B(-Fz$RmqY)UfEs1!h`(E+D|J5Gy<46SwuM zc`2Kev-lHGitvexDPClW%;U9_9?=5nx2U>`%xB0Nj|#gS_el7+=VeVgY zbbceZWKw*C3rPJ9K+jwOpjW!(a3@YgY}L;#&ymj)l%df2)G=I_!`ja&I57EzjO<&g z#R*?rmxp8-02JzA3xEbZEHdhP69d66PLhB_FwCcg#p8;TIaRkbu~9aax}cg=jvrMd zui(!*9t~7&v-!>GR$Afi z@3u#5z{0;*#lX7n$8T_j2Q>lG!c`~btDLiLO6Opn zpb?R&`{&WDSC%q%zY70}husfeG7l!)mSDaUvonh1&J(px$XRx=5_q&=xfniI+(_jr$N{O?17%@lD14{sml_6{$ z%njBrcgleDUKnmm{1;ST4#bRdRx%ZPrXPmx+4T7(3pheqTr&6i@NyqBDz?@2MTack zHV>s)^nx{-xCIS(eOI0-G!IqqM0y#(bZwG*1HTCgYQW$lK=kky+crZWcx@pK zkn!qtgcB8yieAG$RK;VK9HaO)d7hOAw`~}fmKVlW zFJ}A5)%-!4cQbkQfW2bBDj4=zL4fqL`D=dOfq26NBKY}MY*;d&~ z^+JXjmKrj}v^dzG7P!^~1&~A=fSP)@shaSjH@e?khR^=iHSch=F3q0a9};uphSG^m zR`g7s@cZ8N02SK-TNQQ9&*an3wDG<16etjci#%s05rBA9FE-gmI^c(LtWDlqFRgGb zIV2ECvx3ZrJh+vx_vxzhhGJ%p;vxV}(u=(FiPV6$?FEq|7&(G{N~!Z{=OE0yK)=%- zVKrABWQMZA;2UQYk#288{TaCxlukUdLA;-`(xw-Ed^iaP^T5cU)h&fFTf1{%hP zJI}8pwYVR!(f7DI4X6JK^zDxy^td%Ic~;j~2Z;I!OS%yi82tUV9jtJI$s-UCCOk8z zQQ(NDLXM~4Nm~M_=E&Rf9H5hSnpp5B3QY-_Iy_Vo(AYJtd92OR3|8DpVS_QkY{vR# z3~`W-c%U@?NVsyDtkb_3HYnD93;c_Q@W7_i6Jp|nN#%z~d*Mm(p>2bTfnAsuWXNjO zBi$FevX4rXG#jAfjyL(2Ui#n=*PXH4nEz<}|8e!sL7p^0*XY=`?b)%tW9`_sZO?DV zwr$(CZQIt4edoLJ-5byQMs!DXMPx_+(V1CQndh8}tN41TUV)HB0poyI47qg6qOWf! zi0d90tADC z8pCcXy_;vkekiMR)!&>>^*g6HLu9qs-;N5JH{#=_9+A0hcm&5H7SXpOu+6y?G>^J5 zy%ER+ZX1~MBXX<$o@h7~HlB?6eP%TK#z%gNnET+hXz&fCnUh=nic00<@BJnhEy~eL za9_LSE79X;(_)nINv8_=y9HAJ3xL%eRK<+Z74}8k6|@PK4$_NzcQg$Pya@op1W-&g z8-B#>9+|FP%u(u7XCI2Y%xUX}mFK&pebeLUDV!~$@x4cXLD!y&@|K9DIDPv+?c_b_ z$uE9j!gTZqoqkXM1`%N)!4U5Ij1C==zauqE$vC*&;s+`Y{aPEV#73rs0G!R_UWc## z<;t&BRE@5pxpSDCtEBYneuigT-%-z93a#picQ zR$POnuwr~uI^%b6+8aiE!+^F$Sk0di?V^!vS8UlM8aKkUYWhuo&whK(-4Sw1a({~h zq%%DDDoG_Np;!u-pYR_FjSrI<`rwL)sM_8=kz8G$ABphs+iK+C`eiTArt$39bFQa5 z>NlY)?GfHPBm1@+V+`QN4HW1?oX+lLA*KcUodC86Wu+)D-@yN~;8x_p*sl72^ee!D zfCzuURe(QsW@i5%jyWjd-ELkUZKNk9$M6QI3NgTXpry&^rIm1q!}JXy&*RHhhWW>b58^K`g()kMUqR9*fj-7v8VOh zD5X#c_$8tf$|JOyWKSd*H>)2SQv%_J4OoR9SZ5hv-aLV;JD0pl)wS{J#je*G*sm!W z;CI_D^GT3p?`SSgA1OD2;^B;JD;W;VTWrGDnZtL{cRVU6h!)#aXm74|Dj7mzv&qVn zzsfEnR31{M(>ZI4HaMe;lgIftCbHB8M~k4G^H&2jc-YYUUD?IcoA)SrSgR>00)Uy_ zLM2PKOkosksE#MhlDKvjsCa;?<}&!eo!CcfQ?icmXo|yU6Kp(_&5a|#Jh-a(WsM;6 z2L~IkI8I1Yh$YIam0?d12T?(yAXHq47h@m#2s(>-VEFsP?#)cQ0HkG_Hq5d*ypG}J znO{bmzYx|-N&&nFbwG7{9!6Ue44@XWDDjnPw7xB&UObem-I#;Ezc;j?7e+lT-sKzw zX4AFR2oWU80&)>L0V=Duom>*UZ1p zuw+PH8F`DWRUu;iZn#v9S00j_xQ}3SpWs#IRxoIj`5OAa4NmsSvdw(<$N(PT7ZsrC z*WE2 z0jYulC4Bvn0#rCOHLq(mdW2eCtnX_{3!;D#HwIx4dQ<(0CzfqrgHMo&_?GIEzs(cq zB~;;M37#)S@?K4IdZ%|?0Cf&ka82r0K_SY?JWS%v_;fxfP`uc%jm9YFFz%d& z=a8ssbk?A}`firf%G~}lVk^BwV#i6l9>k|x4~qm?0OoF_@d3!MciZ|zUQ;5L!ybgn z<^N&=yUri(Bzm1bu`1IDz9e(hR{yT2{vQcQoIV@OnIeq+-KcPX0&{N&0Ktg*du&L?(s$nCsvQh_liZv zQxCvnXR9dy60c-5)M=!c2K7f}H3~8FYfW4Y<@d&2MT0YFY=`Xew3w_X04KL~RQv=3 zl(%D8{6UzaZ;jzIqaSNnvIkDg-nv6J=z5|15lm#aifDQ$M+_6U=u8hPaore0D<)rJ zXgiVnT1?)!JIE&t;&)qA-ISDis&_u<0`m6O?Tys{OiG!Nrm3cItK?tcn#=WYUiqaw z(R);!E*`$tj-Hk-76z8SkK@+1KSX&4ejXU!vaq4IGE#7@8O$j1k=mL>cF_S2qh#io4AB4zl9=@5GhM~mY&>mM zq;x94QJJgrdShhT_;I=c!?~5H@CWRR$rif_zIE^>d_w7aiL@*6LC5%J{iEYrEsIlo z2h(sVdzr<;T-~AX%KnvkpZ)WFUAnc&1vS95ab-$qXj#l3qmYp7kOE-?eOz(Hc-RPN)q4pI2$9)MtM^zU&I%)H2qsS{ulupc3-f^>(c*|4nE+3{_rXlU8h?op=Q8>JC@NL4loC}>!2`( z>nvv*e;N80B{61+40&$TY>}i6YAHzMMCqHZ*kWCDA|v)pO^gkU^&MOCZZ9qkci~(} zHCLXS9&y#glkSg?(_;B*xp7lbpUK-=5Vr=HW#HJt3Qv4x8N~c!f`BC)P@hok?5S$` zSKHEO1`l!dp?`+TUw;5q$_t8DML}@s&B?L0YHhTf6IA`nWU!4w< zwgQ3QoRq^$RtwacW$nlK#5yK=Sx4Xz9-Mb&qEGKB!;e>FpOZ&3P5&koaz`S}FMO4H zVI1a+@Vo2nJy=BBO2v{W(i7Gi7)S005hxN0^nm)zE=uTj)t4mmBPXI@#9sYi;490t zE16emTtONy3burrDGUZIu!+zIyXIAo>doOGT#+;@3PY-CqK6!ab2^7`Dmyd=Pe<&% zw~suX4L_fG&dVRj8)J^BDQ@juOTg>!JlcCA?WG!11#n7<$q~!U3a|FpVy>eTI`cJd zq>}JeqWk9Pn$oYkpHno^$0jS)z5wYEv7r|JgH}W;&Khu!R}2KCduM_$k81~UA{K_$ zc7>y|WoBB4><17&_1&v-v^HyK|z+rT>dB-2*=4wYK>O0ls~6o0*9h zmeU>r>FB)5$0B0K*TLC^LXy9Y^TrKX?ru-n5-}+C0mriR9c=arr}S0rvl-=pCk|QDfqYFH0jbL@>I@}kNRQ)wL;mG;x^YO37|SnhL)}vC z{9%m_8uPd<$k~-(dsDT)1+TlW%PPmLw9uGIdeD&l9SCT?&Vwa<n-Bv##_fehvicn8i0?X#Ky*wPIUm7M;0cm9yD%`O37_mA!Zxk zSvzq0sni&<>XO_sXzaO3?tYVJql!^1+!><>)DWe&M>JH+2 zasAV}m51?AP0Si~w+FsGZO0P@z9H;W^{kfXg4+)Vn^?D7)8OeN|Z!#g06{ zt_`>o%(0Joe<7v<7rjIs)sPIK@-IpEO5_Rm5@cHSr2XX0!(vP;{>|YI#ZJnhca%3l z((7Ge@N|C{zvfjHYbBlA(t`hZs>#8S6fDiSv^pRL85qX;84NG8(4CbAQZ4 zrA=J?-k=9qGp#_XdwawGdX2B=HhD|~7$41Dt#n#anjRDB12i1yn)26zGcluVDJ_h_ zf=_<&AWN;Ti%B8cY-n;_bOw(ZovtVU?SaE(TF@xjCHccxH%$sKHt?jZF2NsQK6BavEVyAy zG@!20Z8?u~X{zrm9v~>V42$|j$A6MW+ge4FCkQ0*k89Y<2z#u9M2Qa4Hzfa2B^XGd z=XyLtd1k^jIHNl7;`k&yDL4YA{2^`Hv#u^b5@{ zQRbyeDQ^wM1k;RpPFrG@ye=XFR2zb7?!1@JprYsOv!Lf3_=Pjv7Wvlzl)aOgO=0a=9iwC5gE2Q`3?Lj5+@?6bD&)Hq0GY zCS%j~V`$!JxYZq@NpFh~b3fj6dL2iAE~L_$%XBMo;4gsH>2 zB)GRRJwlC(6SL4pFs^6?TuM3vl!kER)kc1z0z~Xb$S;Fe@S0t<$YV)u!$y8*6!b%S zg9jwHv~^);)HQKWo6hi*TW0Dd`v6+;GxDa!XorV=GwnVrmR~`HJ5DQ%(u@kfWc%Eb z)|W>Fy7r_nBL-}GZ@?_mcXrBGjoHn-J1W(A)`c`A z7b(mw(3Bj|SC?H@q=%G$Kb4D#cf^~CtRa`RnC+4J?kGkp6UqvRPv7u~B$>CCh6*oS zd3r6wX59EHH|=VC;lQKA&FSjd($}z^cW6z$9bZ>Oak#(-jIzLG`VxQ9-m#&@uE_5f zPXeNXf#F5BIUjTMlB&7&_Qft{*I^lfze0c%L+`@ShF-4n7@+jfy2-q`9zgXob1oUP zT&ZS8V=e@G9~3Xa9J&%Y1(_q23^Knk#u*au#p12Op~D>$sr3`{nIh#?BOnw^BY6kV zwb4_s4n63~0OH3NYqg0;nGp$Q`wrTu`vCIu=sR1VH?TCPMD5fpqNyqSe)~moidzZT zopF174m2VMY-2@eX2ApWpQl1GoGwJDZ^n;(EveW-IOYPdwkin8aU!R}v>Q-GB%%bV z*h;wiT(GtRh_P{^7|HuWLSfbce14CE7;`Ufe!~7wuU-EN0Ur5LbWKD}sAXaRsD*i<{%k_4;(mE(z>Q+n zGKB$w3dJ+IwZ^02Ds8^W)8Se!3~NYRd4*M?SD^2*S_pX-p6RSN5_idYjx_4ewL3hyRTF-}nb9)?Jh2dW5*Z;Lr}{_^bKJ^6bp1Mj zIW|djV2iYqH0RpPARsuu!oj}A$HOATKF5`VhcEUF4i+aDd6O+KS(?sF&pH32Rh*r} zO=KY1633uvxy@aCER`O(O!K!|_>2Hih>gX?{G~Lctvx)A-_zWC;6}OP?wx$U>(>E2VCcpz1#-yaFZuC7)ZuI$?#SA}#(yR<`m<&vABX%lrCfMTfVu)l+B{OM(#N#SnOF;=r3tO-M?OTWW(7#2D ze9-dHrhb69MYTQMpS4@2{4+e=gW-;`a@Rz=;7i-Vy)?1q0eh;75n6Jj*c_Y}z%4l} z!eRHzHrf=P{=k^)tD{nXFB_&W8R7{!7`ytX+Mx1aCV0tydfYBJq zUuLydn*Ho@W|}UqTX~0*oIRy=t|8~0zFEzCy0*3ZE~1je$JQgtL~tPrf&tE@niSkj zB{^HbS)lpl)4RcS)%j>gJ>{ztxyV4b%ug_3v~+_Z&9=nLl&PZp^CMMcL1DpiFX!H!Hs@>P8Tj20>t>82vhMG{!pYOv7MXH(qF(1EgMpWDyAemB_ z)s|GX0I0_9;h?qlNq;!uTfT^!`)PU%4_@kH)%oP!w$GoDr4EFEi_;4L)91LwZ&-rf z0FkcnQf_O~x7ZL}QRkEpU18^zknWJv0Rm6HIX(hUQj*PF3;aC-I@9xYRtDlNpHs>) z;QV$4Ioezk;Q3RKbFqUsQ4=r>Bs{u;?#S89zqo~S7@L7;QQCXs;I8t{Zt;t@?c;odZ86ne47xEsseQhg1Hjzh zK*V^1;F~d+r|U{2j==e9hF~KiWGD8S)4wY@edE;~3>W7J`PNwfRhgV=<4;|o<%$rB z(s=|Z`OohGnA4Bv1bMWm>5k{PQc5>fMMQcse7gxC0Em^8_|`*GxD#{ugI%0{9I@9N zDCoJb#QQNF?F)v8B(-s)%^uc0z+41ts>9I-u&Z1&$sOaXIvEt7h0Z`Sh4t|i7kEYJ zD$Iav&hqSBC+mOf;Fs9sYBv{hWG8hgU(Y&$yuD5U$SqlX6KB$N$=Wn;3)iJ)MfktH zI8^OXg%m=_*2Qg6-Ug`o{gq9&#ntF>#nn>JWrqIpw&_WE0MD7M^ff^iT*BsiGl0z$ z-=zcNB`1~OK%rCj0vF-oeN#vYZ%DxP9`zp{rm?s=!S2bzs?Xl9-{Sc})o;5+>FxqT zb(01FE^;E$>w391XbivT1R?1_GA9yn60(ev2Ie#yd3g|9AkMop*inbw+yvh}cOe-0 zq@_3c+d`GqC9Gg-ZURzt{6f;e#!)e;H)4(Kh<5ZaHH@lrFw?OVGf}d{QkLE29>CbKEXkct@Lg(gakPxkk4NRM`u8NBU{=ejZ z5+Kyc|D#Xez^3j8@*h&#p2slbpP$mj2~5IumIy!%_orkb%WR;Z>KImto`)X07+5$6 zTht^um#Byfk0}FgVRcD{-9KwgG5v?}1A0ei!cA`@ML}CyE$0*e3&ABvQUaA?K9O7_ z)9ESO=k;mZ>?Td%`|Ao3=%#>p4}~A&E-WxY;{GT)P-QczHrOlkBQfV%dh};&kweN8 z=>o8ZGeXt!elScF)kCPUHc=pwM-M{Qj{E-onPk277*UctXx=fKKBEJ zE~~JLN-xt)hNWJm&EU7mX5KQO5e8SV4uB+O52*7LIS?HoT3S~*#ynwdkJ!RIDRp)9 zsCJ7e?qvKac3#_6DJW+^iSiboA2-%luiCl*+^@W!&e%O=YoFgC4lQjl5Ek>ZB0V+W zioVb5b-R+dF?Bh9P&c+1OI|oN3V_NUS>3~CfDWo8v0eQwjHAced44&Nx4ZBO*wXzpS!+~Gf#F}X3p|P@%~e#T%R%K8UVbExhFlN zUw~n-U3wQX43HKsu_>jHexr)W2{0DE)m_b5d9|+RkjWr;+O!_T|3iv&Zgy8~aG!{B zcEW;aT23u&TP~Vq;t$ZJpHd#*30|+=dcG9)bULS>`>eKVX)pcRBGmz!~@12yibBjx?cK!`TW)f`9|$?Us-s=P=H=9<3Lt_0l(zJ z_fE}s=`{&vgx_wd2BJTJA%gN|ZGE@4$~oW}>kN2Jp2LxRx9Guv{Xp2M2K4y}w9w8{ z9O8j3A0R+1ABcn_K)C68!VBfPg#VRYxMA);j3Z68(6l14mos=XBLi?qp;8I0MU;|rUL0u_V_usf8J{-W>wB#wPTj~fX-G>CLPnZ@U1I(>QhOsLllV!k{0 zH#*)gl3UR|Ke~h)L8Y~_puC{CU^>=TQZ3jfSftHyI`-0CxUY6DsoI?<>mdjL7=A|( zh0(F=&2qYyc8LiXyX}I*dgA6qYQ}})h|TLn>6%TsZat8pZ<`UGF=Mn@LH8Zm6C|SA zb6L3`SzbL67FP!q*9^?EcPlOLKJX>_n8z8X2;dL3T^u%O^XjW4gfeYDX(unl(xHmi{=pkC9Nj5o zt_!2XXB|)ZerE<4<-i)QY8Hj=>3=q2u^%jP-e1;Tyb3Lut?JfMSW?#mU|9#gxINQ@ zWeL$u=FE}ls-=i%rEUmpn`-%R6n*3Z%d{$>j1+9&1i%L^IJu>I-}}Ii1IaE~uhL?>`W|fNz>gB%XEtFrdWjF2 ze37_yT(^hqcfmx3KEl*hZ}ZYE8G2NH!PXdThPPg<+CmpqD>J}#Xuyw^ZRh!#!B53e zwtY-B``%B7ASBI4kf%CYvQaDzw{Qosa!cNBwE);xT|19+Ff?!8V{O#j)sPiNbOB4F zcBXnph@SM!b(3BU50rsuysI;zKI^3GPZ16N(3yq%WUJW25{y`>daDW4^fR#ngm+=< zMbJ6Yt!yT%aqMVxz8>i8VYXUTnt@DvLgklQh%oz&{SLEr5I6tK0kcB)YUq{6?AEe2jB@{ zEVc(@2MU_whrn8nU@cDm?s=ro!wjyQercBB3c5yN{Zf7sYD(#T?me@7Hr`gxHScIA zw*-%Pz`!kp$H{lgh4PERbI{ml<+f;x%>?j;+(tnGlRjJ?2)PC+BhW!i+)6Sh<^ z{z%FsKhw_Q5#9&cr*w@zbbHVdTF<&cu?fYLaOm#gB+eG(?}}y*1*2plnau*r!*?Nn zz!N=M1m(3hs}C0!ahND^kCd#>%8QUeCO37Z>Y!9`wJId;k(im*G1SlgGLx6JYx`r! z4VS#v<9%qHB}-h6c%hSXhh(2+fiiQO`M}E%&G6eMr=eB+gmvjx6p6-BD7|7Onq>H5 zD4vgFxVzt`-Tw-gP`CU4F$(}^to=6%us&@L0Y6co@-q|sf8jz2IMdAiSD@b%s-9Og zs`wjF zwbSX*px5K`0hb%-0t-E#>Byg%<>!|a}SU9kuhr_q$h24XkpV`VRo77(>jR>DUu^QP| zUX8ZLb%oTpencxrI}lxyO7}tBwe$)~N5b>)mEe4O3#oGiRLx%Z)m4TZ>B{9<`uB$3 z`pl@&T+rWhOu)7Mq-wG!e;!_M-Zy&SbrmnZ)i6XSp_V z{6rBHVaZCvsX^4>5+5#A5uyrPqOIRS=gLnAeV_bLIt~aF8hnL`=0{Q*Ql zMuE$~SBKPv5^}CUtx*oAd-+e!0Xw8(zWOEZeyMjD#dio|)?RmNR$HUled&zT$R}5q zZK^X!9P2syorWo)n9zK)-88&10GL|^xO*n!SI%R=3)nwz6mtF`mFzI6Dwl9qXbT$@ zCFC*uP2wojHWg$0lv9(q0lxXjMFiv-*D$+T*~r6Lp*z?~(KmX=)vt-O5bhzx_3Sf> zHL|geDkF{-`Ym8>rlcG=g6<1qDD+J6d<7C1m7SA0Ia+6Qj;$2J!e7!C|Mj(051vR zm{B~C(BE5T5#>ZMMyTKrcL~{ezp+25X+R34`HM7<3KjYKK5AuEs-lvi3YAqihBg&G zTm05HSC89T8(wx^8=h8LXFX48X_J2tD4q@uF8RD_x|Y{3?rxggwm)9lP(@fH$Awgj+1am?aC|n1$7v1u}x01D2y_u-89m z;gZ}s0|`Fbzevr-%)%r8Jl?UIk1hCkHxIKo17H{<4pE|{UCIrg9MT$({y~q1!@MfP z1kmj9DDgLl$Tiuz666dx9V+GCX=hE=2_$xgWE$u@OLgko5Aij>?B z!AQHb%bQ}{x8bauJJ&I44?B5lQ>t>wnI^xRmq>8w@nfEP6W7FUi{j{IieI=F#ayu2 z0%EUeklWTrtVC|4y*H_PRxG{CWYwS!T(pV09{0olK7iop9UoAvtw3aHdK5gczq&W5 zpEzc<+@f=5bS{ld-jA_(pem84zh)7WDnu%ItN8Zm`7n^_guSi*Rf*+gk6c(E2c1X?uWa0y^V z4dHe)3)LX7Y=S^cR4z*_j^nKS$l?E8*D+ljkB#6Roxtk#jdHeP%Br(`Tt~0K0W`BN zE;H=Zx4T}gAEmG|zN*=>xTUM;-07FnST<>NRH$Y+n4{~CveFpRc2x3=87bqqbge5N_HukxdQ_;?{z)W$!Ue0??Y(vlJ@Ul)L|;Q6b{4*9XMWur>1I3^JAWBj_-L4$)lkWSSmFSg{2aH+~yg>IM zSOaBExN&HW{T(DYPAOEV`b$wiuouRX*bfb0n!=vPS%5G>Y;~`)hh>Ji*7chWCp%F4 zb(7ouH_#Mys()QVsCfbnfveAAw6-x+`CV|C;Sao-EvmyxS{D;!3%8A~8Z4@ZF4w~{ z3kM$sOL;p_Lfp|Id`Mw@B0z)7dfmXo>ECY%5I>YSvFG9tBez+}O?eBkbk6I+3rq*Cp4YP@2?yNI%@Rn+&81{EK00J*_323?Swic; zmAsr3gJWkB&6XGJi~!_KrG&af+Io{-bS7GrQTGzcGta=m z5#z>2(phd~2?LvpCDW(MH0P#H4d@Xv89YuD3lH&mg1Knmzo)O$Kxt1V#+`y29OdWY zjq84^ACmh{DwhAk;vWzk3bI2!y%G|#i*y#vP#A!Yj=>(xR|H^TIb&|w%nG(I?jL0pr^N@6la` z1wIIY{uoQ|!QC3D7Hdd^arOYhgBl7@64V}Y-|nov-6n+z|9~`8_=dl@t+HV*Jrp@3 z@V@>%*_&n{ivt@~$;$TAxD@x7(wTj7|CF$`%A&-kY`K_OeR2Gdsn}0b9%ut%!hv)4 z%;5Qlmsg~p1Dyx3iIRd7Lex^R`c!s#+5q~LuMkUN!v zBLU>v2-EoS=A$P8;KKEsThjgZ`&+MBeilz9J>u|?;d1w4Om6P>+^1uPt*@D%_I+qC ztSLo%yFSMS;;(0C_=*glooCTQRndZo&`%DX_PLca+@&fS0-m#UfPnU6vpkG(z8Y-Q z%Xk>`gWdL8XZth(643VE-{>E^tks1N&VZtVZ`PoSQ`Y6z;h40m0jj{@ZYcyG%rTok1!Tm*SgL0uHyCw5FI>^oMO!ce*pr?tu1Lh6~Z;sA%#b{(wYr)rBM{t``}7@ ztxlaFYPeWTXbzEnNyuZ`@k93Hh#!F|_Oi)o*Kod)URh9BmH9UNY|_;A{J84rN5MF) zR0Q~chr|vXMyHc?@>b$)c}0{C)%-I z*dInE9Pq^%12t+Uvlr1SZ&hA3RwK@pu?$|}K;+iod#}G-k(H@DPd=%3b;UWeX^5)k zUCy0b5L&h9(v{C&1$>%evE2%E+h%5KV}_a*OgiUX?VLjnny8GADX7$W!y$i#3UU`j zRItYs+uVS;hJZ(UbbL!nqwYVxDy+?jn&@P6>Zn4eGyVs-jLhp2 z$WXKjNYqO91o1i9Ul&E%wF?=Z)Hhgdvux?(TV1UCSa(1NLJ}03!GIf(+KK{b=WGX&xZ`xc?}g^>?X)mrchPKD<3aM-9lA#efhAp zrOI^N(sS*6(2BK>UY*qKW8!6(jOc#tc#9#_H8~)+%0m(AAb@yW) z?2X;BX}WRr1Qh|1`#Rc>c%P}#ITnp`=w#3Eqs`#YHt)m532}33=P^k&4kkcgF=9~) z(%HDlJx;VYFQ6em8j|0eY+!LOue$j3X z6E0kF#ebo^^GVd&8V{(QS-osaCY(8Vf^><;S~C|5vJ7Mg(X(ekSSX!dJdmB?2~P_I zp|{OiR-``)+S=x;N!2VY`5-f%DVf9+_;TW^*ay4*enERO`Effjkzm&(wGkIv13_8u zw&P0SNrBSSfonr%X&k~CIxwhjp7a_L#($D$fOq7z1=q>=<90RXc6a9Oi!^PhTv7i+ zYa22o960|vkFJnIY&N9%r?b4<<8nGQLlFLh9(vRVWhKzZV%?g|v_ zWY2&Nnu4iSkO+Y*X1U@>>Ltyue`1qCUMT^@e6c-> zuMrtn6G`IQ47FJiY<5H2y{(H{4#FdWr*BU82Pq%8mt3Mm>`o3M{hI<4`cfPw1t8S1 zCb7E&1&eBdE0%sOlrELLg;*s^^za1^{Nxlk_YRe^LmbF2H0%9`Qlq2=C~RlX+cV>2 z*6mgMjbLT&xh-mYPv?PtM@ryO?R4aW`!i6^Um9f_A>WXbT3>VpD3#pUiTIt#6Sk90 zq9?0c*p8HUr^EuNgOcf;C-CWc5fHvK`$*NlCCz3moCsMD5AKU2r)c2-H@gba`pw@J zQOCAhI!soYVBxoocp3urs_mQRD}-aI^ZiTqGy;0dpk)n&x6!ilvC?XGwt${e6>2H186tYSH?6K zV^Xm4DWopCQxFty0!@D$KLT@IY8IY=)PF!_H$n6kDbA}t_)(BJkriUh)&LWHBjkDz z{=Uzl0{@0h+ORX{^2zP216v1^xBaC3#C^6nfqaG=pGHoC@@kLT(1l zWS!;KoB{%tgWnK=>c!7m0MM~EAtuHvl;anml*z5-TcX!th;!Ay#EB~?6(U~V z%bLn+>EeL0hYuFFr3IBa;}19D?>8DwViYBQEzAk;4M3+$uuu7N0KE_UYHpGhnK8I5 zL!!MD9y}L@E7No&>0bXv0p5m%!(&)t1=$gpGk;?t`V>x=1NhnS1M(+M?Wjn;WW5;O z=pr3qS@@rUg+z5=Fk2kX0y6gAFTmT zZ7%H?S1wpNfvy7UGx=Qv_oC(kAx{vE9PLi0Kp6tUC;aA8CO(BrX@p3nfYuEX6EOs{!3y$=1D-#3D z$u`$B&xyBL+q}Tn`-lMO3*)w2E^06wiyu-X#-T#81GQf%prdxMfMh^6cWA4OqAqYk zQoFC-otN}L13O1L7hMcwp$V%g+|e!CSOb zFZuxe&R4~}lS0;)Ev#m*Ufov*$Xj^$!l5(nH)40%V1~Q&skbz5Hywf9*h_TamFe2D zOo5}Z$8xhXpkOqsEaE(#TfOOVez#GRAa0hq0uz3zS~EQ`Axckt%S4hbJb=D;G|>Vb zG9p=%$|B&N+~?L|soXpW+Q~tI4MwRwFU#>)bR;sDN^@hl>FTv=(cDX=snSv3a28Mi zLTnLTy0m5=q?Co4wKRT9_>$O9ysM)GuWnL4wUO`1<{ zUhHjJBJ@uxxQzSEt!a703EKtqos5v@c&3`PnX)vdm0iQoQ6@#8P=X9Ju}@9l6ZZ|C zQM1KehNA0>GiXxm7R^@Vz{B+AnmdIAk0HZp63`Zf_xZSK)YB7DFqt#!e64o1f&=Go zz{B-5AgnPG%*06AOmuj^S%dcF$y!eyB~e;sVR<;JzpxB8KOlk7nOXHN)bkDcx|PzO%iBhQK(Olw;;KEo#LTEyFmK-8RL8f3c&sQ z`TFP^5LnSF++3?Ja>ov>LwVM!sj(ZBuMhMN z$l$lXrR}ssq~Z(&MY-1a=C;*1uP0LP6Tel!RzvR$a5M2%>wCWS0T<{+Bsac3=3r@N zQ$_oL5=g#7Wgir~Hu+HQo4Iv@hU{|S%seYQWQoFz>sWEu3hRRCRXSm)k42x{P4q|q z@K>9mPzrDpD49xjTVC+RJ+>nCOVE}Srz#56 zj@e>Dva03MwzH+|h8eH^pSrFE9LjAC|7v7}hQm-88ux1q)wYLRa|uJ@$dT&QNpuoL z=z>v5wo977y>pq#*^{U(qEnL?*HOxLD^E}CQc*H>>`7Zu6leXjY5q0NS@ZnQv*uav zyT0#Rm)|n$Ti^0^sc#l4%(&lObFa4S1wEL|&n#E_qEpfJYCX-E$|lF3jlK}T7Stu) ztO?RADid}1eD^LkBzC$pf14bql0sv!G^hZ zeKQAntN2Had(--5`$B`VXllJY{}k(c(_P%3ek}?J(M`%ti<+n~bd1sD{gN$AB($w2 zMv;n275OH@evQK>CY?bq`(GaQvlu$^v-J+MfP+4|r17o)G-ht}%vYz7TR#7x~G|tekft2yD3=2Pvmr`(^^MmOp+38Us1kPK6kl-I&~%5Fkc;~WzAS;Z?CS= zvKmg|rz`F-+H}$35L;%zYiL&v^;G$TY|nApYuw9;V4C|BXk#h+;t?is^R2P}N z;gv7E&ZxMz%6BY(F6u7zAKv86)=px%CY=mU_hZ)SPZ}TY&WOwLY0TjKJ5GgaM4_3r z)hf@WR_$MrLwva5x0g&iQPJC}r^Kv7ulLH&4cUVOgHMD;x2F6&?}p80>Yv<@IpF5{ zM?tRWm|RxUbYpRU{Q8n-zw_(3@fG9!9h|1onBm#|j)OCt4xyX&_Xa}upUCGUDk*z< z1qR9N_yo3^Uu;CtIwJ>lLPU++nZO^eKlISH(Qgeb>Fg^F$zL_fyx-^RdRo~2p0H2h zv5Liw?oWi0OKmP=DoH27bz=u^&lcZflgDhP?^rnW2?jeA#zVV=m$YX%5u6F z_i}mkmYPh1u}jw)J}^THx>arzuaHmUhTEnLPJR}B7z(^PHC;!xFPYr;Rnc%q!j3Ow zZhA&uq#M2dyN#ov_~&{IGEHujn|g`Iw48gMJ@LuMP{ z>*z6IG;M=``q^UeXr9%r<_Y$U)hE&K!zRi7re%cVO~Jlyjla6(UDR_kl#6@Ml-fY$ zaKAu%P!p*g(1t3#>b?waPl_}r*b3s%BY#1c@{BCZO*(qK8EZ^=BW7k@=Jz`pHy3;c ziSv7006L#g<*hol=028Y-JLxX=3NYL%j@eN*b=~MLXPNNF@69<^F>s^v)M;xi5en_ zb&sa<)a@54VYmmmSZ?z30O5dPl-=3a-cA4&1RhL3NkSj+C`?>^SP9q>7AN4Xh)YEv z9}^p~sBR3hz)-;95u|aR@u&Ob|0jY?JOr~(lHRZw8s<_qygL?p{vA;15jgv4DS?8V zwhSu6AhYUqjd6xVp4_wdA}D+W9?XYRl7g3^Ew{|@*p3)_90}Oq460u%0fHP|4q$aq z=UNILpZ{K^n}kJY01l#52wyA@@D!UrFR+yE1^DJmJnxMLMsxk&_h3p_Be`c1L2U80 zAOkD0hCu1W)fUpEZ})-$6XDi7tt%$IsfC&kx-JY7Vx=d>Z*kCABxH0fB<>dgegYmn zh(xgzlL~9q@a-tMs6iSpw?>TTdyp0hkq&Mxk)yRvOv<4sp-pwNctKEn9ti>DlD#mF z9X?)5DXk0(d|KO$H$7q5JC;@Y+GAnjySL5T+fgP7e>4oFkO( zN~6DFaB#9v6K%Q;HGt$47lN2TB9?^BbL7xo+6wewJ;amtgqBcA;pk^RG>fpZg%<%y z0tC6}a5TR`T>&>c(VB*pU?g(F(XIwNym1mYX$1N9UK3Yl5(%)YP{lS=JYJ};^oJ)1 zdgB8m(;%T;QE1I2ZM1FI;&EzB@KRg_ND+VpLZsu;KcZ3U9c#P*iKir(?>Hoa2x7zn zNG&RmWy+11WrgveP#^VgRD=q1?_z}+2`Eiqf)-sTFB&^LNsbRMVrqf^8R5yTbqtW` zP;Fs%u-Zt;Vo}9+R^#=SIA9`(2c&o42{AsW73w`FjmWunAT$%ai8ny__i1AMKob>T z{}xwy%4MMF6!4&Pfbgn0V*KDXEws528cmRU9>gJ^0UW1AtpT~|K?EWTr8Ya_6=Fw) z^^}87EnA96O;hzBLFK0C!4`Eq-t)oUF%~d@4V<6gmR3D4#@7o}@Oa2s3esh=P>d%x zX+gbXDemiDHYn6b9jjFqS@&x9BjX{UK{RM~?60#V8JCDjSDN+l8hrD3F_RvO;aq^% zL+4td_lo4V2WhQ!aWf``Pn6%&B!Lhv62D3J#a_RTK?7M4u-#Spm45|>^J YQ11q9HCZqq5yS?3c7g?yQycc}zf%9XmjD0& delta 33455 zcmZ6yV~{R96E--uZJTFo+r}B&w(qfR+qP|6XKdS^eRgZBzI``UNu?{PPJVQCU+KQm zTm?E23yPp90}2KM1Ox>IBxy<|mViKr@P8zbVs`2T9(5j^bL0Z1AOxs* zI=h(KDmvLam^!&wnmYeC^Y9dMb+ItDbFnlwbg_40Ft#ytb}mt|wMP*`^24AC8(TQ2 zFsMn{SoKmpj`^?jiM#N(PkZ+Z06z^b?w9gI9t{G2QcD zP0zB-O*b`p3;6kcBjiVqQ7lrW1L_t3)Ta*0p_8nT3#UhgnBgltkAIKbK9whzVo zoPg(Un1=I=fQE|F+dzkwbYh0D^%RK^@7{^zk+|{MIQ{y|DBO+>1YdX{4}JU)DIZuU zgz6HfP?9{vLayXqgbRAg)e27-^uT}+Tl2?}2xXr>E4FU89?|Q!`%ZL;0$lZjzxxqA zt)2Y_V1}Hu%lT;55KXN?9tZsmhp1Nt?&7xKgPqJN)!?>FfhOE%SCnhd28LtZv0$80 zu&2N4DYFhr%Epqof~2(~L*OtfM)Cf_Md6opmele;Y)VRkzS1S{E#iLx&$i?IV^VB& zAVhQt3xgnFy8795z;^0W1IPncoyz+Y^N@Y;T67ih!&&+&6xo4>(wFfk6c%GP(~k6s zz$uuK{gATp;FBWLRJ*oUOHW9N4pOsQ!M$VC@~wIbPqjEr zEWr#3xker4PeK(*T|N4<-Y=$AqXc53L!2du@XpjBtrTNpRRXjIYrE*^qP>P*b)+B zLEMJ{_k$zYjJa5h1jD;+S*gAF2=4^Hr?;gZZEAT*whe<@O1x+Bx#lwro67EQP zc&~?|Nc=95QvfN)3+Q}}D@!3R^3+};`J&yp0H9egCDL#JYAKZ!9d4J7t=g?P=k9-kL=znv=~= z4cR3ou59df)bHI^BO8n+PewwxDm<*Zwo@j{!UZx+$=O!Ow=#c$wI!PV_f5 z7S>*L#sHj*Leq*+d>N`v2HsZI>8OvlJx?~{rSv>vZMUo$tT^N(J2P>z<&H!Mc=J&7 zA;ssw!vMqRaM_B-eI^!I!|?fJkeTIQL?US5{W-SAQRV1rt_z6EME1FV*MEmm`(?&Y zw&;Yi92k>pbklz$zHHzLbnp$WxwoCtKZI6AW&oQwxWT>)RmX563|h;#R&rx$X3uxN zD>Zy-QY%eDS8Pml7Ho`S;4;)rYCA}8vc+szm_=V5 zD|@bm{l?4pdz%ojrFzXPsF8fr*t!gBzD?yCUbts* zh-tm;$m%JG@XNWE454@mOvW z!bX=I4z@?O{>-LZ);MLvY<3+m3IOA6wPan#WOp7bz1q!oI|*=jjioyRWs+K)%z8`* z`N5c@>|j#FIi{;3v~7=zw}Ld_2^P@X{u}D#xqgm6@B(oG)T+UOI;DzS@Eu(dThyvK zsRw%0dVcULGyK#9P>{V6kc=(8qm26*s{G$@Gc4uU7BDp#qZ{oUS2@B|dH{mb3vP*z zn>j<8Iz;ad#S)tb9Cn>v9?~n;nS8f=Frwy!+>i-s8<-GJio%&DgVwDrXM9(b19Zc} ztqUwNiZP1)ZD*v~HxdFJJqiyNJuZd%2MU&Vu2RRSjLwkV9A84eLHyI7wx%?$jJ|NM z+OG6hD(CfnSq|k!Xvp;YAOLU48%GV{=ezv{GF$?8;8?r_%kFScd$79f0TN%!f(D3w z5&mvI=ughZkrw9zGks2=D?m_A&;ecypx!-l{Z5u}@GDEhA8pu1rE0pPd9Gt!(du_d<*wnXaN8gAKn z;io97c9;KZ(^}!*M&2TuqgVS1=vAZ06C7j}(`EBEe;dxXq|{Q*)<#(%+8^r=`z<7K~e9-nm432L5E;gN7@~#}L^jvyjGXW}7yA z#Y|u>Fzgcv8bXkQGZ`-E$($b0 zrpJx&Xyz2IjDA2lVN$_N?TE^yxN1gLB_gm+0-9>U5^7-u7kS4kk&Yl@k^GB2k?`4C zu!)|6<_FY>!-s=xpoHuqgvba?VA-CriL^kRw4oA@g$Q7T)JKT^5*#605zGNmQxLfa z6EPz;(t~x-LL_*`mzDp^0alh4Tum4Mh5cV6RPx2QJpK>tV*dw0{v;WyvH>ogQPt3X zZL>^<+@^{YrKLllKrBDP{n2e;Xy&C$5Xltj0z2jGlR`{5Y}lL8(evKKzX#!Bhcx)P zf`+jAXUE-tsh-_A3TC1<%)D-TPF?5TbDZa{c7MO#G5x>a{thujmwSkapo+6*50^)B zu)UE#CPSbbKm1{EN2Q@q%Lb_5r-rIWgE@-VLQBm`JIM#dRuIivd*CiDUJ1kQ42)pt z40a`UQ!?^UmfTwZ`9mtDJVY0)nrkftV~JiGIRyhEQfk^MfzB$?S%&r&yV)c>5X!WK zf*Nua?J$eOg6*_1dR3f|!HlPpJ0+W!#r_E6HD*JJF2glyBR+hBPYOswm8WY+cNcqU zHh$d8BmpeeQ@I_$u$KjE)2h|8FuVP0Hyf7aVK*`p?e21+Yd51{w>z@HWUUFlgd(jX zQZ3=JI)<^65@ibsXkna^pbW!IBstA&75n>$-azGiUyMB@Jz`;|MIE_Zy-%?;_}A@b z`zkzHbMHG>a@2scLKvW~Y1fiAkugPbuDoN?n{OZ!5~QTT8EP%F`P^~rV!CXiYF?dR zQr$2fY>I4!Jnw|=Z(D;@2Sm*>fz4pwf@A8`Nfs&dSQ*H0l8fP*|FKcvRe!-Haqgfy zDEl{5+u_XE|@yX)6K4HmG?PF&vzYNW#7R;~Ipu78zN8ab@1uZAdI<< zacbk8wCj*_^l>->q^Fb)KDbU2@C@yGx_;=s5ujLLqsB;RjD&yQ5udQ~O>%6kz2E>9 zKQHjFPw1R0UOxbnrgzy<#i@62jiz_up1ybKp3hIwQD!XeO-jh+8Zjea`K1q}2So+} zvuW!bj{#FNd!sfURDz<;U^BA(flUS;z-)Y4!h#(uw%se~+vKv=Fey1^{WQhs%J!Xa zou+A%A=yL1RtQg0zLzb>^V01jtM`RJ=Mm&nF2$4ecnA1PUJ@F|(a)8NR2$r^976}A zU4`Xjmuikg=$qm-Vq;Zx%G}$WkcR~8vftEQf)jgO;9k%CacDUt6m64h#(606pNer>Y zqMFwqQRv}EQ+Vk~gf&hq>h2o^F!xRVHUSmQD3nurx+iL{k9_%7w;jZPmXsBLJHZ!B znVPS_Sdg-Dxyg>!kifu>zOed=l$F

lyqKu>&A!4IY%gMN5w@NrML(S-(rw{MUEu^S)6-D^0Gu1%g%m0(jlo_ zI|tlT2(;QcZf%bWZH>sZE6hN0UIlPNz8fyfPx0?yNMK$YZEcHF(!V|~T~hE7=2kI2*06=a1I{m9K5b7bxQ;4QeZU~y>hyY^%CNo z-3K?}e)5tFG}M~q#TpnT(8JVb*H4e z&``##`3}gUlA@dIWh2xia_CLHnxUgPLV$5?x?#abKjE=$+$`5&zQzf`vq`DluBdH3 z2Q*&w^1Nr=dmpz+zdr?DcR?I*eiI$gO87XV)Sz+fBw4*v!xFISr4O8LHlqIeUrw9I9U0eeXB^ z!*}iusNXNgeWmDjW3EW9Ja$WT&_4a0N9}zZY zwSHFm6RMG>t~<&zwBjN3yd0Scemb;OM?jPla<1$6yV(P76>y7 zFKMb>8F3||@pWb0l&0Rgv|Ocwt(cIzOcxPt$g|lsS5G8F^Ku4)zze1$%4KL2%vxk^ zJIzC^aMD9h>LkBHv;a4Nnl|d691rj39g$q%6ioakAF&2?aLHlAUXNLAUOXhKyRV%{ ztH07xIrGw$rm$y^(R8jOOl;nyIlJ#1|H9HZY%nY~TO5HwN<1yX)~-GxJ5N;58n%#B zwN+}cI99GYYc5i!TqND0QNodkC7RzyUM((P6D})ra`R@c6WLe*-1e!L+&irlr`D>T zaWRfGiQ4`@+y5+d{E^m@5isD!bd)@khIhz{kok#?(b7zGhK))5$Vj6Ir`|YoQyao5 zO?|*rT+-aVQtwf_X^gRHU8=N|qItAB$}^e$CfNms<{}cBqxJ8s(E5_^X>-4E>R>n@ zcf@A-{YVemn9c40WGOerDg06;mp1w7dc6g;>m+`Zhp%s-+uvWqT*!drd&;lBqZE2c z_n2R5f@$8x!uyMdTGVBmRuM{lvk*ldLC6~5cyNk={<)(!)kT|HV%zuT_M;AyBkgwU z_i8A1I!kMKJU3G2!MsnLBbq_12$=GJll9YC=|;`lZbcT+0zZC6~L zK|(P828n5b_Dg2l$jmS-<>fdN$@9_F=@`{Nyc=NzT()y;O70Rdpl(TEbMAClyVr>l zfMU;<>u8Fx5r2*X8DNsFV$;tJ#p_wUjA{Tiyp@5Pn{SKd3KGlY{A;{zczL~B2id0iDyBlwe;HfJY!F#or zGM5QJ2a!OopF8)fOqP(_mQ+ErVGVVhB*GS4mN-;_LxL%+jfDALX94fsN<_apFGSlB z+0)?5>JnyAZUlhO!5rLdh0L@umTSGSDR-o53<-*wxN&eV4y~Q>;^qsVPtR9{Xdslr zBTi+(8su)6s?fa`TvO?anQE5M8h9L6qTc|VEz9u=HMwzDEzw@{DkTwrN)-~x`n`}S zG(r7cyqu*xg!o1+JZ&H&wy8T%gbyn-k{Glx1>Aiv`HLAh9^7 zQ__L5>i4VIv6H$!k-n8j^~UtU_!KK7vBB2RqIs{Ko}y;poz0Q+6bDTa9vxkKGCJ9A~F*!t|bvkVo!8zF~FF=JG26l3r5CT&e;* zl3Ri;eGK}b*U^yjLXuMPi8jCUwC)hJ_Tp?rx`h{VAMn2+^lkev;tl}_D2E6Li0Hrk zIYyE!8v;NR+6V2_6`(o!JMe3IQm!fAtD((-s8g1!$fWfIrMb ze#j+bp6Z0Oq(*|`%(xTO>woA8aKw5IF zfmveKskgIBdW!|>>R|36@q5Iu(xUfLOY(KA@4E_J9JT=K5$?eQBR~#Zo+$5(w+YhL zB02;;Wd(1VS>mAE!7Ng7$Sf(3)@)J8bpZzPg>cFU^Y`WdwTtc7z}UksD*eOVzjiW! zd^*Vy+8OCOc6N`qKW2E}A}!j6xiy7(e!jgWAmnvvv^Th#9|*|37Xc+5qLk=D#5btK zNK8ijUIj?C`IovBeArG{;bE4IS1~Ip+;hxqcAGPFx3*U&|1P@N(ErV zoa39*+nR~DaYKA8UOM@RHz~MMCVBaglxoZ3M&V=4>;{QgKmD7~q_NCic*SMv@pe*H zpa^RYW~WEvj#N79I{}V=yk$cP?TM>syT2ak>9vsy%joVgQ#IG(vLJifSM?EYL$K6D z`^-qvx~ezBe#psv+9-=ATiPhh9sx8qV2Q%XYjv7k`id`_b+(kJOKcI`q%)VQq?+NH z87U-PG7nuLjg0IhyaVpwPlfvzkT5@EtE;DGS5}fvDH)6R8VVZ-<^d9nr9$k@ zD>GNGeT*RGP+PBU=*XJz9;Rfqvg}j&`M4~xS!yG9$_<5D)NY`w$G9OHFwNC5g$?Z} zK*R15d%R&gu7~~!POD)j56KkUYRyjY99!J3&{Yxqmy}lZvX@mb2!KqNhJ%wHi#`uF zE2H!6U`kD7B+=1TZu>NUo&Y4%e?(uXZ%I;&oB$0dTZM&?V_Y;o@>Nt&Z!Z=>y3${S znk~j=Qoof@#69~hMOy!N!Mjl;(|i_|fadtqYNe@UqFX6!rZkkf{^Kc*@yJ|qL}Uo@ zM$Ugpu3^qbM8K))R->y$@7jS3W{ByI^MCjKo-*&-Qw4ui90!|2`vFiL5Tk5~6479b zq|Gm^?D!#pW=@((NhL~rr82?VVss%f(#*%j^y5*C?EXO$DvGm z!(5<~_EeEqKIU&v!L~D|-}~!05+{nmlwpO1cjz zBrfpK4;#Fb-w~=hbAS_!V;u^4>ojKt5!d5lE*6gX@x$HRC2D&=1;+}VZgQCH94e#@ zp-jLaF!2k)<$#Xt749sI~ugHR@M%VFqoJYdM!Y%+6MH^1WC_qtK8 zBriWt^&Ix8Te?qluJTFgBV8IINBw-rMTk7<7N`ri^Y3_pUCKeS;yHgL^;VG+<16(R zuR0831+VNJ(fe_{+n<#BnD$&bW!cxA z^Ld0*jmo=|P{7fN!}4;{ez0YjBV#=qDe@|c^Sar2QY$snCc#Z!&OjIe{HB=)%mi)q zoK=#W4MR71mwhe17{eIAJ)uQVlIr+)Nl50v9eGvR}jKplAUZg z>D9ay9gr%SLjSMz=emka#knpcQVc(zysn7mrmcucR|bU2Op{?OFdU7s#fDf{{}a%aq1V?felbXKOo z@*hvhwB(CvB44=G!WqgBwvgj?`|(E{CqS|TCh*w`n#B+Z5(K{VVzkh!){f4p&rKMZ zp%w4?VeU8=1AU5u9M&>4hF4ot;Uuw@V6HDSHc;xu>H<@CBB-z?eIiZnIF}E_Ya3OH zCAHC2W6a;ytWrY_*$l}+yw@mv(Fu>C-G1#vOn860qxMZsCt5W{Te|Pkgx&x743Pim zvFR;>r1JuntU29VKY0hNLJ95&38V=N;O4qnq01V#xu1B~yn?2)kY{r$LBFR>?Gwup#mC2DBSro# zb_Lq5ZVL_9_dkCz9_W?Din)$pJ+(2*opLMn$}Z*@6U-s#ytu3dq1vMv+pkP110u1jFEl_IFC797oj`R4>v6bmG*#MSe3zj z@r*tV-!MLqKfq?!01IZFk^(T#c7cm|!;(6iIcm*3H5Ne2qCJV#UN_UI>F-RCSOT%X z9><*shxUOo)F-VLT;lJos(H=Beqa-_%Ck^3suDM#H z809TfxDT@`+G&hOS!FMjmWR&E4U#$aE2)z;kInF(twmX70Q|@1N9Jq&V%-F>4g7@b zHU`Btkn8gY#zj56_8J-F%j+l?@SXgPcxBHn*bqeno7@{tr}qnYkx5=xME%kghBZC7 zsV&1_hfUmOuDI8qlI{j|Ps$Hk#qQAD(y8Ucr#U5kZh3h{`VH!IKb#Zha+rj_LFrqe zX!9Y%^FhV=fB_xz`cLBYFD9&SbEGPTrJ#Ivi8&%8{;+%J@T^m07RIH|bG554jKWhM zhbT_B&`F10{DC_%*&igf`LeUJ{(F#`qCALOp!RLV%Dm91uKr(^rzVGcmi14xZ@iOS zcX0)tH$U3Tm$tK}*v+al>!(Moh*13ySrvr;V2Iop;8@8gMe<9Pz#{=7x9D|x$s1Ce z2J+Oh{K)dbGw+!z3U0Dt=~-h8)nRU@x3D+}MIrFIj>fj-{6tZnp@?45Tm_f<0A;8IdPJmwD+F&;Wt zaim2#Kpc;i2qhC4yyk5O28=SN`FN;XxKFkZq+tpfH&4XI!@&&IH@B9PDV5@)AYh)yibr40Cq*mxCDdwLMbw7omS_koW4Vw1Z<85 z)9nV1gAa)|On~7M&kuE`BM1PN?}%?%^)rD3i4OFiq3I_B8($v6t^pdc^&i4_SaIY$ zXRS6F6vp^~G{_4xh<5Zi+yMoWaPGdHCm0uJTGz4>Vc{U zz+R~r=!$;43WiFYqxbJ-(IfL|jt(z%@P-WdnnRn~B-v>zC*|i`wKf3IR`i;hwFX za}XJE9el%6W|)cTpy%%vGnOfB#qlWvYEn)xlGOmU`5*X!)(`G^C zCCmOtxAV89Qf~QaY}A{*2ViRMK{7~TebRkt{97rpdVMNtQF(4fOL^#Hw~?US`XcnS z!jy~$yVyAb`E_NwnihG9v|`XbJ-%Qp@1wsE--b-Y9h}$JP!azGoL+vJ;^`yEtHGq+ zy(LGlh9Q5x1^)NJyxlJwG5lZsEd~1jDFVv@;{&ue)sgrH8^J44`fZrN96->rM&wnb zar0TBL+Y^-4N|#_qv{#OMN`Y^P|s2sEI)BSHqv_88AI!Q!651)KAnLx?9lPk6b!1;RizisV};Mc-(cy?oEep6 z8(kh651WsuX(yIUMIRpKG8R-}j$?Tt=;lyrTAq6akhy zJ^0-8R)vO^fZ-oH6*CE8oex=Sv5h@|1=l~I1)sZPyLTFj!x)Ma4<$hLlo{lJ=^b%b zy?O+y;u>0IzN$6=F*Bde&V|7##b2(tVu#)6qB~QD!tjN_ysd^{E25IOOa|E6@{I9; zK|(eLA%oA|^M$3D5pQcTgdDAq@-{T&@|tRYz& z(P}Hrz!#X@pi}v&k0hW`;H*phho~Bbt$ORw0EtGb>k!EinAll+ttDGx?oOT2)LwMZ z+d@}Od%V{)om+AL#UoM&wFbyv>b(1b6keGri!=z(Y9QaLbu_EGkbP5&Ih+*Zw%W*a zG~h4b@u^~s_THTuL=)Y&O7QQEWLFLt|ZbVjbnq#6{|h>0bM)$T}AwP6x^ea83kN6M=jFLU*U6y z-UVW~o)s;eLh;Ni6dm9g0M#wY#-S279)$f;@I;)<6eJig*JKYSApyeD@1jrkXNE8Z z0+J=ZnQ$nEQOALq;?_V4^(PJ&gE{t|^(ih#gUi6>?s+pQeSq@>Q2>K1vY)9lmIyr{hnD6^T z0rNDPvdBmZTkwLE>S@X=hqa#n?Oew+$>GdlK9kh8(4@DO!kh=kKew}pfNvL+*_>bO zd1cu4o|k*~bvHjR)>*s@+wFSY;Q;J z99<)Ki=4Pm&UPJLDuUgnzVk76a|FIleEDJXBMm^B{=~zD4YgASB1X-|LEZK!xg3OR zveE0aJhO|Q8i%WRwOw)+>Vr&vGS zQfGntZ+3r?-?o}j#g@I1wQ;9}bz1&!6s9*TtwdO8q+72=nkZMT-Q?-BjySG6)M?qw zmb|g>K&IbP=2>=qv#k2gEE#{aOVshzV@>H(bK@ea=Tp&Oc&UUto6T|Ow;j=O|*4hYc#qd z*WCVnn(Pz%KTe@NN(1Bpt?Hz{c!;euid5AT?ps|PHK%+o!Y{=GXEpp>5@|>De1N*Y zUU5nWFtM0o;}}zl4$_x68bb1IJZ;fWQuQ!q3({$ay8IETa8$wf^rO3rEzzWlTSlfC zvFMisInqm+HRi3Ba60(FS&KH>ZPM~wk~X=UrGcHYe>HtqmzjrpMQypLS;5=F6O2pF zH&mriJwKeLmE663v3AXtDP1<>AOQn=@?sb?7S_Jp)VQno;}P3xH5&NZuR@6*#fTA?zkS{1Yk6rfT2*J;ri={RlF*2(3`#4N2Uf3c`RkSkE?}cc#WMhSgzZ9)82OmL>Z@WaMDsSMiEuN zkOWXd1k5UOOeU+=W2;o7jQ~-RHS47Z|FBdHi^>Q48PEj=6e{QrX&V`8@~hsk2{i7V zw#pAq3u^<7G@B^ZzJ#g#sKYK=#QDY2UDKX5obE0oLDLR7obI%_ETGQPgUdJR%vccM z7XKc2gCI3cQ$sc&4D7qp$T}XplDr|l6-5e6tmQRC^^mG8NH!hJ1OPfj?{G>ZyW<&Z zmS1b}Ym96d?C-BBskJv3 zkqL8_VZD6f5@trno&oJ83K?A$^#++8v2PCQ=Ie(ef##V{?0U@j=Er3Ec~FP9fja`K zTO@Cc&zOaE`!bxr6$kon?pVJ{_xcspzU%0tNi;uWf>e=}%T$kOHaM(@@@x5AFD74B zzIj!x@oP&)cA*epX0v#1bhRqqQt=xSRIeY4^#v}3@b7MOynvr7v)cWJ>pANb$6l2Y zaPy9y!c<*l<#vslz$j3!ir-m>D1r72cJOEWN`2MxUUtkjb$+zq%7P20lmpW;Yk1Wa zMJSS53}RD1x|%Lr@@qHJTV`?CpAheZ1azOM;Rwde1*xem6|cw@C0QE23K=nmWbfFx zitOu`&qdtIF95S0O+wk$v{X_6a7Bw8$uN}Vtc-%tL$RGyovEV3F#Bm?_r4|gYkHfy z@qClY0GD6Ic2Z`_VjcBGN3))x`pBi9quK*EBiea`4|y9zZ(lYXG$)bZc{R16w&PbC z>`*#I!!@s24xYe2$PFe#n9kEcJ?`cz10G-<{I}XFCjg=OUD+YXPk-%@6P!VO6>+Uq z{E^pso8IViO7HWzPTbq-j82))rCRue>C|odR@>|}?OKK>s`B z)rnzN5`eqGKe~%iqlNh(%|Gmn37v=+a2Wh_UZ?>V7ff-+xFO9;GYEMb#iyA*9ahA1 zL>e`Xsdz109Xw1yUXgmD3uSl%2cnaO$#$s_u3Fwzbc%a!zh?Zf-_$dH^h2J!&^Q8M8YVA{Kg>PP_t}&)sso z`UIImQ$w%w2TeyQLkrIxuw~-_U8F%PxdX@(ATaALz)(w;2v>3241g zAAnP9W_$AsYBgJ&QAZNdYoQ?y^vxfg0?TGXJK8b26N}4&7rpZK==1f{s7RRD!XI>7O&N`PDAR!J68Tq0^DvY_pq=}5|0WKEK*FQDfb=+zY6;9z9oCoEq zy2!cGeT6r6W|f+A%NvSG3LVz2l3%G&+3>wRj%k&&pTG2VU{|= z$hg!8ivcg|EY{m(l&TdCigX#7qouYwY^@4Kmwqm52AjlmSPom~|0r@>B2=2|ATT0J zTsX6y!62$bfiFx~5dNHDYuPnSMi#Hne0U?P=zq!0_W?WU4K3m12IuU-UP1E0SpgjQ zVC3tlijY&<+QUZujEMKOxuSNMK)OBiV_x(|`=$_yxv88JxwJ)!E*3-wDMni=(1Ovy zP*v5&=qk;9jH4Y;Pt7V(K@Sm@X=Pfv7AFKOv13@>5lf~sTG9YMKAyHmyt62i;o2I$ zEASP2u@e~9C{SRz|w*V!(q(efyyc=Y?G^%5Fq~t(tC1n z+hM2wZfl(9kfOCnd){B;PjOr7LrkGGjKVY8wW+_1PpvH( zQIBtqZ9b4pD%J2Rb6+~K$Yi%%>LRl><**Z;E0(+c?7e;Jy>0%zl5V7c9gqs^6h7>RpV~IK42VGmg=s zbt{XtY}Jic9X(X3bwkvtIb^})HGOfT_jvS(cIhIxt0wNrqr30J!`!Ifi8J0LT-qx) z;Ml7>)J0Nkl^LP$6z!H zPI3k8lpO%R-~1!t%+#j$gJ=i_y8{uaJv2v3JVZw832C5cKkFP zgh_&NUiVVaPt=SA8h4fzQ}j-6(U=?)x8^->*^&Pd(O`PdM$(S<8LQr4dTGMyD&Dwz z3l6g0QU$+n5^i=BclU#ed`ZJz;jS-vcv*e&0Tuwoe#}mJfl^3gFC!XGEApa<3Wk6S z0+xivr(m|yvBglq{38$h-GG}PMSXjM|F|Bk$SrO#$t}&X&>mjXP>2k$VyL4A-29eg zh-XPmA`dJ>UN*7{;>WyQXAPxA)B*6sEL`Z>(iaKo$h^7B=4R0*4sCq+?q;7)7J(0* z2VVe~Y8x(9nw}Y51$pGURa0%j84|=Zselp$v1K?t{21&lUG5~-4ok6^WF2J1#8S&= zaVc%4B1#nqKs9|b3tkk2_q2zOf@pE$5IcMT&5+pvR=`n!?Fgi}LMa_7f3~?A(0me) zINV5fL!nCutW1_d@gClUwX#?}YeJF!MkHV~5cX180rHY4WZQVOq^i;EoX0SDDOIW> zYkP~SH(h$8=~i@oeBy7F1j)!GG;0eT`{O~zQ~E`{qo^evi9NmB;zKoS2(Oiv^f*|< zDrXe*5DWp{IU!$0{S&HZfYf0O6T$JV51olrNlc^7Xtc>>Y5CMWm2{dhLICO+8acqS zc-n>8#-&Ws_{=c?-SgiEDvRaR-xDQUX8ag2@#uQwoQ4MzcAtV|%$DrUU-FBpqE;k% ztU9`hA_S>gL%2g67rdqT&=O*hNMue8AL}>vUJ-#DB3JJK)BA%!~?Z~?&5o%2_qVLj5O_tWwdzpwZZ<9%?b{{9-yfk$lU z#3fIa$`{Lt+^WPloj&^BY0E*(YvhH29pZ*F*oSMd4S72et%+!hu6>)1%?WDeG9 z&H0V$WO!3MIr(J8N==2yyq(wSoAW%iY3xgr4N#UAFT zcAxOAEEFKc_@f>9Lbx^VB^*v3NwpL#kxW}Cj2d}I zQ>ctuSzg#Po2bM3EbI|ojH=FRcf>*6F^{HH6H%h9I)`jk9${K2ZeSjlE19lNWHgWB zI4Velx1>^mjlZL<3%#7%2-wrH#q!Q9*q@K;$rp8L2hMj(0L;p z(~?`3a{I~8amz}Q-$Boms79haUlC$4NCIml3(%2P33ee7W^lC&QA2$$6hifDkls@^ zGJzE#GSmnav>Jtyh!c&GB+BFj^$R0Ww>|)gZc6Q32JxyLlYQJWf(0DgBp$C3r|1@i zi_5V_05vJ-l!v!uYKGyWFVLwRrqiu7qFHn<$G*FTT=eV%wmh~ zR%~e1F`uxS+jXvjPI2Jji0D?i>~CGy2EQctAu6i(jT| zHWDNAU+UMrvzn?2HK{Xwxs#BO1Ka`2q8*4yrR=cMUoIut-V-!uc>*bcZc%pX1y zD^5lBxY^XS{8~?_qReoORiJ%z{s#tct(dmPN^dzm?BY2fS=#RS{{B9B4boy`SR=9O zCE+w_)8NHYEDQnxSbU9BJr zb9@{3j$6KjC<4&!K*-H$n%1QFG=VPZwq{4uy6tyarh>fiR%b2F+tTSa#o*P+~5E&*GY(TSilQop6 z_=z|9;t05dn=SG&!a&a<=%WNR-MXa)VC_UO>mQ#5kCnxmDW(Ll^T$~!(_hoQrpa`g z`YC8bu;rjTYwlFMq1UQU4@o3$z+EtF?w`(1%Gd37c_KV#5r_`qedVP5OtyMfXQq!` zK<|P(YqCU*da}yB^)x|E9}Id{lMi;nWn#K)h5&G4FZYC4TK>kBtcQCw8^CKhLT@;N zvln3ELoF14Hl#3CMLD8vzL9mnaqKy5$%x2w;W@gD8S>`nBi`&=+a$JD4(C8UuAz|Z zjxHrpk^a>D@fZ|&qW;M!q>aZ9Q%l1-wplCWm!OD-f`F!M0{^Ko ztS*)^H%T{S`%ki>FiR_^uPpMQq>V_g(#F~!>6};8J+*cRgENTz$NJUw!FD#^7-PVw zoe$jM*^`ssv&q4I$w2ugK+9&rz#0P6)B)fKk#^NXxKiM$!@a;CH6@=kcHDc7?XnX9 z(Q$V9z#EN^YHC~L+-`)yqhKD=;e?@))9AS}&%W81$eIZGXT0TG2VWRJ6q||^E=B3e z#O%0QLqY<73_7z_fsvXW-pShFu|htB64Y<*yyrzPJfiECbs=kB3{-~nbzT4b5Ew#^ zL*m`_sU!Ratfbb2TZ5(GGGkf}ZqIC^B?kk6xxSS}wF|2l6mG5uPO-umm#bN2DXYA# znr7RB!tTTiRU>a?K4t%}7%cDR3$kq9-QS+D>-iG=O`jBOxSd#TN=+{8NdwIdAB0a# z-doW!)R!u(D_G=t3rg53gj{PCf!qHd_wmNtqZ0=L2xtK=iI9OBpnk4_s)6>)$4tx= z9Z98CO;ytzN;TY46G#Q3WhDv@-qPwSnQQ2h9`S!Q_7*^KJk9?w?(VLE;7%ZDaEIXT zPH+o;xclMm1b2eFyGw9)3j`1OU-Ek-Jl}e&-lMLLt?f@w&+JU^?6v{nL)SjHE`4iX z@@{YyqeuUdk(IUc)#u9iSNIE}&Bgee55fh5@x9vT?H6}GpWQFUNdfv#$Xx_FSwTFf zJ7$7h{Hr%GXg%PhC@>$xMFjYWd`V&5904g3G51$AcQG})a9jjj-m9XJhr(m1!@&GH zG>J}99&J*@O>QJL)P(N9ei-q|U%!TpZ_!70P#JmFqHAzcE_AvR_>=3PwU*)}kOkvkysi=IAwO zrCyuMH1mtzlns8!2p@OUUi<+^Q=t~gmr6J-x136F2)q@ji1989tuEtFtGMQ)S4k-a zgPKE`O>iyCr2@vkkuf(=X$>BthXROCB*UH{7~|N(U|^#E=;OAh@~G&7Sd4`*59B4X z{1k0k_uy+rn%wwFU?qVq$+|9Bws*z|VjGRssa#YPMLNLo!`Mi1mnaSHSbrmfgn?m4 zNN-q1GAFc5+ILzm_J~`cV(MlFwYOW=(Ec+U2Rq67+GkmD_hQX8kJY)11UbML##!W| zQ_O}ji;>2{qd;w1CE0?d#x=E(Xz4|FPQneCcllV2>59G5$7Wv1&W{x-sLWs7(3wk| zUlvL=f;_O1R|9Lb`gz)9;gq>PIuN8os@h_NrW%26-M?!icBf}2&)ZIJ__?(OCKLH4`; zxA$`)lPX@(%qm`CRVrRlc3$^t{q9}|z0lYj*C>Ky!f(su2xbh?N^!#rOi?jcWA4L* z>o@oc-(r;K%Pw-`(E1E83q+PSh04(Rm?luWx(v&5$|NeMF#8?jV~PXXsFP)}Lc6xL zFGRfZ8|R3Y#a*bYYYvCcU7plN`AP?sozdVL9KOB(4h1rsN6VPU4AieuTurwr6UGKn z9q%XEVGq1JI-P?pE-S7YQiEi?;Z35)&>&%O9p42I-`UPL|Dm&(95XuMTpJ zS`vEJs;GGPr2IdQ$tLGFM_Vpzpp4TBR37w4{d!{Dw{>&UN|Gtl6 zZt6fLl;k+^_EouaoMma;~W_$W)g~o!s?~NEG!}NL0Cx ztZu@pBX|i@*lx`6fJUf0MQ!O%9}e%7%ghEMuD}Sov*DZvE9Cc5b zCKPP7qWtQnPuZJ*uuM?>GFQO*gy2mcHwPS8MOUek&G&*rlp@nOq}z|mH=5Jc^g$8W zOPB0pN{uMQH|dk(9(`Q+C_70VctvlL-dfX&TNI-N$_l77?k)tHwr zkPnqtvTU>4+OW9=rN=w;4T6+w($|k+VyhUGcA`bkZ69(u{PWr8in(MAAcDW?;y=ls zPTY7_bLF21b3uc{#i|ms0e<~YZjjR=HLf~vFfcVpFfi^v-t*PNRDeV!Z5cu#td|M1 zwRz|Hrgn=HMk(*ml~J{$bS1RHk8pG}0`~^I=}5yvEritRw{{Iv9}fcra|ES5%#aFe zgb#ZsGFCpP_P(?{xFZ`NPMWg>nVY(4yqgYxujXC;^abO&@fi1@R3hb*Uic)1n)|a} zp`-a6&&RY)Y~A?{Hxa-WE~m9HUafj%e86fzVEJi4N(BedmBRu96<7^2VK;7Yb*UVk=?vWMh0LPaxMO=6gTzvZ<`Pa zS7aZ2wS4hqVJ}(F^5vIa05PWnT2f*QVKMPC%XDys!J4Kn7=%{O=5EiE31|eUL_q^+ zA4~8e8hg|G7_yx*bi4dU@A41((Xf8{Vzv|IVYL(V{2XwBy-w;K^D-$?h{SLUg~F~> zNsX$}*hGEDrWLIi71=WF5&4#~BE@dolkPEkW>IiAi_w+Q(4Lot;tj((qU(kKwPzPf z(&%nSEN!4@ONu_mT!djl(R?%?7^Q`S_lT^s#QXBxdO%UDr6*zAk;ch^J9|N+%ZX)g zN7ier+q@QTtR;k;&2Goo>wrf$4`Jp9MGEvEl@MHImy%9Wlep|~M)JgpN^@Mi&gV*o zm#>fJmZic`8t5(9WeWXo624Yg*3n?~6)~kGk4^hqGDa2gzqMl|&aXCHX|vY>nJ==( z0NU;sP5vTbPd4YtHm@=NarEYe4`jaqbc&?XS~g}Y;{%*T7$j&}E2=#V@{-SetH zkGLj@Clj%&qvaUS8qL~J*?bwDmqOZA<4xxi(3!q3w=2MhLOl=6jm;q#0%km{CVM2SuNi^au;AS z3O$SIl&(p4D1F0KhMfsDZzY;cxF3`VO#IeT^QDyMxYR>x`CJ@Z-1@7cThB1ltmZc+ zUQO~`vmiUQuFxA}vM>io3H!M&Oh;~Te;nQ0wi!t&wV*NWeg))bBtdoiXK?I>U%yCs z@NLBUnUUIpzN$XYbX8q`f&{(ELCydSNMU!fU!qjjad2%B-8Ex1i)%?r82{iXHSygT z-9n{%vDnmo9`4f2poIF)AM6dG^1R%oZ$H+h?;z4I2YIn&2cy@;sMZ%6z5+w1q3ST$ zwc)VXMWBXUE~DW^BF?0$$y!=Q_sxcI)JQk)+j;0-U7k~;nDt}Z4UxSBYEwHP4Dy`y zS7)c;2<6ABICex_4LiDZu1j!%f-Oi3GB>&Uk`|AP0B$1XDa{yd-URL1<;_%k2KcIx zTUBV-bdI_rm-S?~kNV#P_dmy!*+O=H|KW2SEAQNN(vQLlh@*C z6&~t})t=g+jKsyQ&B1HIOJm{5Bd7H)dU;-F!9@j|xxshq-zs?0Lzf|lJH3N34hEi- zqbh8J1K+XQqRp1RQLndBBZkT=!x!afJ>BJZEMT*s+XHBMNkDg)(r8!f0%{s4yhC>F zrd`9Sd-T$bT&VUTVqNBbA2Yl@ zY#!S3CfdO(o*wAwru*Tbi!Q;hdj$>&X-ynay*s@lpqSfLWIgPbWl2x;l7;!>(_tm< zAnn;2%i!#N6Ts&9rkD0b765~EIq0K{{5ia}u#z69CE$`@bTP*)LDk|jTFGF7Pe%9SFd7ek(#8@@=u90Ox()pol|-e+XNQ1ccpAjjgx&uIY8?dc|i$ zb=L0#+J|1Kt;YP=r&nUzp#nsUTCU=BOP)VF?+VVh5N`WL?sED?uy0T{M1I*r$LL7t z&sdbI74q16xdAUQdN={)m;7q?iP|OPrnw@@HvP2(YmN~^E@@wO@jvZ#C_I^$2j~g(Y9gK~b5Cl<>J40J zP6*$)L@r3cU$DUIUTz`Ba->Q`JCE+8<=CQGEPf&ElgRn?KaNJ5#&7EtL1rEWAhjtS zyYj@i0`0hzs-%?M=-4R3@Yv*z((U-9GMqdkD7D^47LHmr)><|Wb$eH26h#&`7LF}C zprR=u;U2_aX$09oc?l`*UA;y?Z1KT?FTErHeuZ}1UNW?G_e8qGuB8OOLhV92nX<}x z{0WpeaK!5Q!K&GU_OqwOC~b{r_XtYtbVrJJ>!C4dCGR5363MXe+;DPo*cI%FoZb&i z>9rSj%MsKcPs6k3DiXs}Mt$$eac-aEMuK^Y)^)Ujr_@wv-E%4O7*V{b-xem%1r$r{yGL0yKMh; zSVtat4}l3Xu7R>Q{w8lLmt%_qWi<)_BBv<;3~h41=NmNmYvq14p(T@)4lM|SuR+H| z3R^EaD?-wA9X?OGuj(33hxNRI2%{dT0|kALyH*H)vf_4LPrvJMzgV$bzZsll-T=e8 z8tX#aN5-?7uE{Z;_6??LNa0CRO|w=U43Aa~_G3I6GDs&+$`&-38nIn7!Yh#+^qA)Z zRBEjgDmKuvX*qoA5kSjQd7}9O9WrAsd65Y<<8lkBz!O#L=|#bZ-b5l|wCKQ4WsSJ; z74EC1LwoS@rRZAYSQ?{T4+&y%Wm-ELY!sJf@<`$Y1>MLe{m zlc$IN_?E!cUtsvbx2C=5Lds#aKbT9$KYZIKrTW?uv{a-t(6Mr3wSZV+%egjhD@80# z=4S$-P*Z6fu;s2FZMvo18g2K!18KKpo}Xma8?AIFABsBGOj7q?yxO7HvPG$!5rEU{ z#@v8Ma@z@?hPUEK&~11hY(Zf5nAy$7FB~Agjl-{rtOGC8YWOYH#8L}QzX|G>EXp8U z1ti^&vSeJg1*ARU&POM)@1h}s%-s9m1ZYOz6yL9y#-tUfC}qT>uHzvBB8Aos>Pyp=&9u2P`#r>NoWZwgl)(>u-vL z<9VAzNZvY@4Q(<_k5Ytq?pl@*Q)ESjb{5D+T07=m5WMWx5e)z#|V^FLaPa_{P z9-ok|#=^;|xFuK17Z3cA#J&dOj4)7Q5dEE%59O*Z1<{7Y*n}O6R2V#emmi-jVvcOh z09+yV;V+Z$pINJa~4> zm(Zd}gm$LBWJu^4MmV@EspMD2_~Q&mS~ISF*;}Yv5&B({M)#*N6j>|poT{a_L_8Cztq~Wu{e-0_rLlAA0xt$n zh@r>sY=f7yWdmS)a z@Ys5d`I6eOEzzgw{biH@rACG|+SIg@<3NqlC3)Qn-fy`jWt_7g;a8^0MM(C6`%NwE z?!f#ZviWCX=*QUBAhJt_0m|>D+x6bfT`cGqQ~t~|x`Y6jJAyAnmT%LntkiTXJfaQf zBmAPsl$+n}tar!hU5959_#kYp^thBx4KPB(tDxLF*J#pXxzAHyK$sj>61d1*r}5<{ z{vvKT!Y_KPLL$7<{PxDG*@`POt;6`TamY0=`(O@%?NI#^MjN9MU+rQELnvt_ou1HU z^H~{VosI^uMeMRSF3f7(AIxA`sn@8p=7>DWJlGCPsZ`(XS0_!p^D3T{MS_~14BI97`rs*B3~w<03pjs)x6Vb zWc4wLsQ!j&go8?DAhWSwhg~}dpZARm7WrjT{u&tIOhwDGGB!gXU9liAMjS{%eI_$C=Fm`S)6wwi|=~`}j@b zH8|dXRXim}@JBk(!)y~87#KAe5M_=6DBl1F_}7!{N~j@{_&}|gQ8~9kAVWU4oE9v) z7AP?s>*kw+fhC(6@TmTex#aoitd_t^spJBgcw70qL?+wxo078@pBArA*)PF9C&@42 zEf?+V7#IXrkABSu>+e^dvYaME0nZ0902q6u&iUBB+VB`FIKyU0%>>nQi%^erKsbW7 z$m&YD>$W?0=9eDqn6z+CY-WqYf!bguoufV;B5Y>YZR2}4BIXh|&HUxJ9H-rHRlTG| z5Jnxmw92!?cIu40#Vp$B7z7u?CVSCWnBidcRj#y%sy^X$CG%XFdWju+sq(FVyejgy z^_*`wmHyH9Sbn0Bh@nuF6vauY4{)k*^!cX2NOPFdAdTHy@xI8vuEK7x&1U&a!uPCz zo`kc6?^J^{N#oB(%Oir8+^ThMGkTh=bp5ntMp-~~#GRYfhT{~~x@`}M`Gw88BALV| zZ3PGjX^DO8MONwzC7Yo0LyOPAO0|Ma_C_-f(7*x6(ZCr(pFE8 zJcghgtJ5Jh6^8R~KVHtqkpQsRLVyml)_u{!`#>A`ynqN&6a2ErELDXs2qf+s6Vw_?iy4ch8TazOSfjOdp%Aas*cx;Y%ZN9uD|oV>5%i9U7f*uwd%aXrD_&#Xtho*8sn^6ZR#5~Foj<3!d=PXBOqeOJLqRDp9AEcKDXQ?$llE* zk;i}eDt(Rje$}-J*;iM*hK4_jYlPE@uyQ$ln)AXN_Qy$}AYqQ@o!&3O&Ex21qpH*& zZUHs{R9(DI^JZshbrxBTeKzuq&7|m3CvJFlaZ_^f)KSM6f;c?UWQ(`{BDxYJs5DD; z4@Nx>kuKd8(Xdw}*!qCkD;F=3el8a;M0J<8C_8$|4MtO(Pv(J#_b44@+n&$1)`hzL zcP`Ihf-3e?q@MXl-BwI%kKO3zi~|QaNy}9{6Gqa5F_*?Z@{Orb8NZtAqq8@QiJ(My zCN|-TNxMQ^o{@2LizX4?;fXz=$uV2Udl(gXneKS_#irVLzYbZgd} zr`u!;`q33rps_n=9FPfle4-F}d;$>9L>p@g$THCP6zV65C)7rN>C{kaor}+!Gfex8 zfDe(gi;xt4Uf+}yv(**^E;cq-4S>PZ%17N8AlA(x0 z0wVnlTpQ%MzB#dk^+oiDIi@;|5E3UikOIu8A0W9S1DjUJ=+1@lwzAY)Y6J)PFC2`2 zp>b5A?zAUtz|#D@$@#v!cPdA-yaG4AA$re4ft8PCyqK#5h*UmpLOB~^bf!z0So5#k zq?=G$D%`9(Olyv^Jw7FgB5L=`(w3ybiz>?N(9@Dsa+tJWc=8lgs!`d+@#sxiX}X?_ z;_dWQr+7bc0LSwnOYYzPteGWBdTSUvdACC%yRE0e?Tb4VgX@6COdciigiP=S`#P2%LeV(MU%;O>;u;|miv`K*emocdTq0*JZqwS_ z&@tA@?ufz~K248~^bCv0HdBaV99F-zv!;#{lukM%Wnpy?z@OSr}Ew}DJR zP!(sBG)Bc?rNF*xXcLS^33)A%~8I8kG#2%9iRMzJ6qt%V-U+-Y{F$2(-0iPs9&DZ+2I(Of#(37K2Tp{S>@J+s9 z9)2^M)ms$E=hNbr+Sd=K=z}x)AiGE9^g*Tma$()OvgC7qhX^XjBF0g@neR4MmB*BU z*8dUC>B5$FlftulN##R(T+YO2X#9M***lFZ#HEd%(a6J?j0{fvVD6SwyJRTc?UpwO zVxsL@H&dar%;rH9RIIqdbL)(>=#9yiXZ=2_60?l0isFPQVD-Y+(wI5t;yJcQdY3J4 zY|8((0Q}jOK6j3Q|0^H;?_)M=^+svXHWUh!5?ma}n)n77??(p^!s2K5V%Ri_YrNO& z4^LulEqpX0i;^}Heq$v(dj}4aVYY1Jnmo|C4cP2YPP;eox|P7cU?7x5guxU^@jRGl zKA7PDe0xx3w*k&^$p;Ckz$SS_<;UNifUM%&WR+vPS>op%Y$EfXj@u|Sk^U{xRU>Z# z5~1$i(C1kxeUCvvo}KcW4HwuR0raeyCmK9d0lMrhA?^Fxo%@+9)tm`a=F0?j+g2d^ zR#?{$Q0U!`WR(r#MsmVs%ZZ2ar_-=p#tOd*h93Dq_BmBSxXENaOJq}EH(nrb%Ya_9 zC*4GlDWbXcc-;7&WTD9WbIlx`;@l@q2!?3XlDb@iC_D|o0m9SMO9>Iw_+F^lK{g5# zriA%pfnk@?2g$FE58}#`c{j`-f}Itjh|y&mFe*BAT?lAa9x3%dH9t}2johr3aK+js zkk}fQtaiw=#dULH!dj$oL(!(TN}C#CYQto)wmomK>KkQq^;I{NQU3 zizHqIwg~hBZo^>Byf@?fik!Q*T;U_$<9s%xQJ(1{hpKJ!l zl8x8mRTT^{uo94uEH!AdQU1$Fk*Nvqr83|At7FX3+?ENA0vtw@BEp2q7lX_? zI5a#S45k|{GX16&@{!PP#%XxfC1vM6a;1k_MhNyuqbvq4C?9OO1Ec_AZ`b~3;Dqd>6*pLj806HS+~OIp_s2T9ee2@15E|FeLq0A`R;yuA9=E|@}G zoY6xDHKj5nAF|T-8?Z^h)V*^iU5e>JDnat0N8TOZUWt>os<$crq!~G)iaP+3Et5 zExnTDap8Kk1Sq>k`{`WRoLqffN0{h$ouVfWzPrz8ms~wO)MqgR;4bN+P6}7Zv@20A z3F16$e3=tAq6n&HkJt>o&~YX0+MDupJoX6e;4b^~)PeF9UST)yVBCNj=5-Uv-*GaT zjoG`j#W3#kH4ktaAy(;tHUwYU(SbE=1P$9R=(Ru_+`~G7mi43du*!dNTd#YiF4|?60NQIM8A8? zlFw*Ry=oQJUje!i8e2lnowMzzEp%kcK4?NpB2mt2$rhIb^y+N)j)NJI8-CC?mY3*$ zwe1f=md#aN8Otq+I4|Wi!%z~#WsM47?qRx+zrsrt(zSE-r(VLdjYu1= zj$@`sdZkWG9?khZ9}AhAGEVn3ENgj%UglX zoJQT-Fa28<+|3EY%1SL+!`ir?YD6_d=cndt=EJKng{>Rt7Oce=(yywYU18dXZ&~_M z9^qS-v*ONVW*pyB4EsPg2gr8FYxZz-n(P?RC+*u70`9+>Si_+_j6(|6)F2Y(?1rz6 ztI?4eHb7J1tI(5&S#YBG&OotUh>93S6L#iQVWM+q@tEFUgdP}OWkp2qd}_A<9CvmE3FF2lSHX5&|0 zSq_8yT89v3*H???A3mp28Awqo2J!Iw}Z-vJ}Sr-^=-vL+dw=ipXZkCqx zNoeshGb?{eY6z#fWXpA|sWOY}=4!WPqLmRxJdlxTSVJE-LbTj$&*5vVD>yxAG`xc& zbv&SAy#-ko>Tb@2;w*fXe=|HVk;&v)yH!iO|LqQ}O})p3Lx;I*a&uy7tG zV%|$91ofJ8e`$hafN9s2JdCQTbYr*T?!E%l1Za$5z`(3Yea3h8J!d&YbS@LpFW^m~ zE^wqIkhvJCl4@1BjjA;3{9q0lRHpf%2(Zv;>Y)3Hij1Qy)ZYdFBzYq z1MK!zd`+oFF$z)o<26lTHYW73@_3O1x;{fx&9}*pG7w_{_IQmG)6EmfDcNH=R4pn) z2aO#9E--Qjk>!`{3&b2#a~FjKOfJ^|&r|^y=pw75U-7+2H|#DUy^6b0XVzc@`}7y? z4FgEgZJSYu5-eay_p1tw$O&7hoI4WtHeDP>{R2|>k?LFto20^ANE0X3kzWV|lV)bS zuMb_zsECuVLx%b8Ud%3co<)=B8m^j_8H?7Z|3Q1gp0(gL1J|hn+ZbMvkr>Rcm+KkL(-Uw$EFNBzw?qiO{xxk*G-0 zr09<@+OHyfjyDmJ%fycwi0?N8$jCS_7*~WfOwUQy$pIzPu1u~f?Q7fJ%=X4KVb)~7 zT0A2MbPh9rdJZ?~^C^nz-PIt95O0Y{H=ZuQj~1SqaAiku+1}dU-gk8?$0twv;5DLG zy3FRZ@D`^0%qvQt^PUsk#Avw4)bpK-o+2UmMmynb`v_zDs5G)q=7z5#AS9A%6>)+f z-eM>@AV>t1@Qt#^etYd_n4jf&ai=gcY`DUAK2|$7d!EAvqo#+9C$nyqE6a1K-tMQ< zyXf!0+13KRefQZ+NiE`lb+l8U+w=#qY$x#*^#>w1VW|TyOb8{VJ!>MJr$iK{JqZ&- zEW9syBpCzA30dWQNSOuP0PNI(=8a?4I&ZxGiK)f@+>2JHIoqIs!VlwEu9bUTQw%@Y zDo=s}B*44Q%<{UwWvaxy`-0rA_`_IMszlpQcgoP!E|JiKFSUggC$TA^GI@xwFPe!x zeu!MM84-#eR`V?TYglk^Q?qUcp{%ow9Cxm^O6^R;Dhc^?W^NA^6M*iSoy&UhYf9XN znUTp4YIaXN^_PrdWJV&J8rRXa4a7vX@EG-$vLbp0CC%ab)p5>j*9)%$dubgqF5}J; zrbb_M_4T*3qXl0S24?QAG1R9e8a1U7xFEMrTrII`pcAxjes~aLf?hfW5*I11B zL5H&y4j{x$&Qen?9RX}>4se$64RWoxP*H55l(qR5=9|eGo^Z^B1Nc5ku8tG&TxY_K z3nk6ve%XIsDu0LZ0Cg|aa`=(vCpQZZ{ot8IQrt3}1>ub~{WQojr+34%muln}As1{( z^~<$PJJo!*%cPxl;Y#X54>R}=qdW_UC7<@6(c2P>D5OtRCYu0kGIpq7-ydU(@nN>9 z{Aku43zF&(N>L7V)beA71C`e>)tAb{X~c7thj7U!rIE5rxrvH<=0DHKqCPpeh>#kn zgv?Z<-&={LS1=GRkDi=~Md)xZ7T-sWY*GVoA&TlX!t7VAq(Ei|@D`R_PD-75F}@J@6P$-s;byf4_@gkntFF z@tqo{+{5WK)O;evZ>PQ#&shJIZkxw1_qS9N@<<`+em1-jJE_|IC2~XK9$0b!_CP~w z-S$&uYEB_PeI$!YffSqV#|&*dM^Q(1c-jbEQ}V#Ogu7{O9fvk@JJKj~o*_Fa=Dr)3 zw2wPwNDm&M6u1G;ZbRzaH6hf*1^zy1t8ZkAIf(W>S#(xKiir#0bC4cB@HK=K&EJc> zkffpb^OL3I!kGnmLCbg?-dJ_YX+njk3YP`dqxrZqD}R!yKGb2LQ;m>UuGh;JL1-k; z7L?=KgG(gNqxhH{@QAi|rwmP``aqH7`(=RHD&*N4z(J1+&aUS6kV%~Ae3RANDz2Q6 zCemD0n_b#v;kuPUl1AU>Sv(IV>_@_LO@*EIZOjI;<}WSB~{#c}yLxR-RY@-!D3 z8$*EvfUO|$1!5zLgJg?8>YXy9uJpkyj+R7nTo_=*lHNs`T~~_HnNoA8T1`}wkYDEP z1|#T*w?4`Tq4bVcm{buqGlwQ72QMaHK1-ChDP>znS}IFHcU6+to$_qkW^O#w`Ta#9 z{XNXL-k2#pAEeHh83CQ6sx5U(!A_CIs}N^?z^`cAZNVwVXZ4mu!J?IGP}!X#c!5|2~p8KQ0vfInZ>@0wP z#&HkOScSy7YpGreF#!ylb?Zr1!b2h0-puqoeh(hmnb%Wjs2Wn=^+u!B+)dZssgm4N zlOvhaO^_hGeM0LLtUAo^mqku|mon8P4SH65Lxdxtb~9hCBiz&iNT(7u&WlYUUd+J-J^{eX zM$>)$UD};pMNA3wpDdtdrxgymoDUY<=o2}ud<~=d*Wf^I&0R@ch(2+X$~ALQf^auko>-A;+q)K^m!PEvnSf|^>< zaVx1vV2)@TKC!RI&1yn7Y}z|=hSQ7g!ia^Z@Dq{TQj+Atg>Qo~G^DV}mjuk}N-7W6 zK9S8k1g>|Ib@>FdJc4a~*AAT0N8=!!)h?f1@$Iv70&nj%pZR>x@W`|{eb*GVzNdRb zvLP(EseUN&%=0s410or#jrc?VWs)zpF0?^XEV9vs#F5SALiN+xjg1HF)&sa4>=J+2 z@&-kHXPH{LU%3R@xlbuMVIIJ1Y31W)@s&v;js$p=jqlUNv?rc6Vzia4KTjggp?9{A zZ!GHf(HoIR^mwwq$(a~(zmWa!Yq7U#--YXN58u*_zpk?YW-~CVL1Uo+{$;Fok7%J_gJBRvX zb6=-(sSFt|Qt+e3?uA^IbAmC|y|ED^k)-g9?yJl{QU{9xz)pFAPQRkwziIKz`c?}!`C6+BcX4qio2QGJIX`HPF8Ur1smRBH@=78{KO}I z){Z3}L@Cw5$l1yN`2|j_kByigi+^{j&(ZSM6MSj$ZZ@8pmfy3au0z;Qf!ar*Qnt8O zeR!`zlDz8)8*)&FGpg$@h9md|O7d4I&Q!KxdgoOC4Hp(VpqM|U6+j@~oSI5voPl?m zd*CovkmHRc9Z7kdGA;rGSAUS(sV>wC>)N3s)QSt+1Bbn+mk~TWJLSWNd^SjI(TV?( zm@z~TN2dI;@}9VCD%`xUXMND|`1Cl^Xv;xOTjsBr zm(ALgkQ(;WAA>iAUjSO;XmZ>^t~VcvG|u^D^(NU>)Ka*`hs|le*O!vRga=yf4td?Y z6u3UZX)@xy4{x#8#q6FCX(d!|w5?Ch*NwhKsP~*YhmM)dX;*r1fIYiDcIN!{iA4ba z%%?tE%#(3HV#){Q%*6s!Ds39sLJ;+laC#l8zv*|1O>Q`@9?Vwu%8Ll^Ove@PmaY;4^_L)(Z-fEL-Zne=a9=g%lDt1ad{AB_oIQ z?3}@{SV@>Ay{j*LDwdhOS*Yl*fQ!mKPyG`_8yy+-?4QIhC@$H4WG2;xnxFzAx69@i zc7Uf0@B5u9eE_UIw4fw+$O=UgRYpJYdbwm%gaTDL#dvY{)iggmez}y!-~ie?z|{j< z$A=`YJJ`!YDAY!nYW_e6ul~2ZZSG{-P+I9(dw}!8fix1j%e{EezjJnT}m%f zRFwnOlrYU#QoNzyYPCLueWNlC1?bg~;#cEY{qij>mpw9sGSz$ULs&9)JJ#g4qM~F; zm!3ioi3aS7avc03k8(|DcBQM1k9Aj%=&*|tt`Q%4ZDV#u*sHL68d(awwR_GPfCbJD;w$VqwRkpOII_tILF zs?thL-^W6a8QZXAd^HcAq^a(M-dVSsMwgNl4bx8CtOK0dXKNRnine4 zoO_*RlA1abJ%ns1u&$6zxyllq`(10Fb_lPRi&utdyDM*zhnAb;Hq;SaDYkJGM~;)- zoeFvL&-S(fx;=X8%;SFEAW>r=lKwP3rw5*5`Hhi-ur5y##bVd<{wV#Ej45{-56y)c<` z7)rmupK$J{r}TH{@hhg&#=0eBIa@fNl1?qu5}QA}4Kqve(QU|eBn0>zPRJKz_go|F z49=^sE0-H*T6xkFdpg+oNq?oc|AnKZda7(&MR}VX?YtZe ze|%frwn@8(C8wd3Cb7K|nRuRaGf8Qf>SbZR<&3Wv_0VuWQ|eB6spB}W2zUN*fJvkp z7u)jX&78$kRJG^l?0$gRROyw7+^rkUk@Mu+_ju=2xMqjH`rlv1zzx{(H(X3H$n&qs z-S1}y{1k>nr7row+e22=by1P;d))*E2f>UiFF1Q_?ykUdVOVKeFa1sLm|5Jrv%795 z)2=Ih4gCvdE%N<>5%T?_5eGIQ-qOqBCoqTxAe3`>#{oJ;3{f}0c~%S4j~!t;CT<;0 zHHYQQtj#SJ=kDdL`<-%jgkvW%(mOI@!%)MYGw3G4+10`U>`2U8&9t&`ep@i&INm}V zlXwx+&Npzzde(ydZ^qk%^dbG=$qz9}xGvQ`9bMqonD2I<$l?aTGs1^+c;Gh-SMNS3TV<%fM86e%!KqqJ3JD%M;-q>A3hWsGXY?Z#!{dC|b zgCpgbIRGJLyGa?+nVwJkJuwIUz#x&qF@461;}&BF87lk7m<>>~BR3J9c*AD~8 zKS5Bp?kWWNmv0kE{(`Xt$dOSDSl&ym{{P26vYzeT-~N#_Ba_l{Otg)AbadnN!((y{ ze|#muA+R9-&q?HW6=$GA9}X`X*qIQhAuu^H6(L3`d2!~CGOwwAS9cZ!5vYK^SidR% z^(pWJ=JXK*{^Ixh1ZepFd_YS6UmrBEpF(M%|9_W#{$Jj|N&byM{1-i_+9C+i@h`-` za)A7Q0ztMAFw9rTqu)_EX#WcUPWIzL)%y{F1HnhI;|H+c{w4RTiqik#1qN2{2L|zf zt9g`Vq80^j0Gj zf7Aad#Pz!l7pRg5^(*?H*dThwziD4p9C<~nP5g(qEGP0mI`H4DtN+`9For)MIdB4C zXFv4c4ZTWV_^P24);}1^QG&ne|2OH(zajO0otfH zHht5WA`smn=u7j8zE%sE>q?2s`hSsI|Jzp}`qb~`mZklh2>5Y|?B65zo9Ta?qCrCN zzhauB2V{+*1@fl7)+)b2z^t*~93u@u9EpGnV?=**6vVaoH3(WFAt3$qnj?kr9|>3j ziC$gv-yHwr)C#%>alH~l^wS?P5)HTtj+uu!_4*%TcTOYzr~>N7}kmhbt)AU z*YtoylTQgkurtCdK_q0*}vsB#52H`J4W=tKokE^?sk-|K)fH z^G}Io=YC7P=L0!LQT)424EA(m&Y#_ZbHajQ5os3z?wVEd2M_ z{k%@>kU#Zm5~) z|CH}#{P$3*)q*Ja|IyZec0izZNME&e+5oKSCCB+F0}Wauppv+tzh01=t9|3|qyGo) Cs97KY diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9d7c377b..1d5b29fb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Sep 26 11:20:52 CDT 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip diff --git a/gradlew b/gradlew index 91a7e269..cccdd3d5 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,47 +6,6 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -61,9 +20,49 @@ while [ -h "$PRG" ] ; do fi done SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -90,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -114,6 +113,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` @@ -154,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282a..f9553162 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/runClient.launch b/runClient.launch new file mode 100644 index 00000000..664cf9fe --- /dev/null +++ b/runClient.launch @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/runData.launch b/runData.launch new file mode 100644 index 00000000..296ac5fd --- /dev/null +++ b/runData.launch @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/runServer.launch b/runServer.launch new file mode 100644 index 00000000..581f8b9c --- /dev/null +++ b/runServer.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index af2ab34f..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'BloodMagic' \ No newline at end of file diff --git a/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java deleted file mode 100644 index 3cbeb4b9..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/BloodMagicPlugin.java +++ /dev/null @@ -1,29 +0,0 @@ -package WayofTime.bloodmagic.api; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation lets Blood Magic detect mod plugins. - * All {@link IBloodMagicPlugin} must have this annotation and a constructor with no arguments. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface BloodMagicPlugin { - - /** - * This annotation will inject the active {@link IBloodMagicAPI} into a {@code static} field of the same - * type. Fields with invalid types will be ignored and an error will be logged. - * - * These fields are populated during {@link net.minecraftforge.fml.common.event.FMLPreInitializationEvent}. - * - * {@code public static @BloodMagicPlugin.Inject IBloodMagicAPI API_INSTANCE = null;} - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface Inject { - - } -} diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java deleted file mode 100644 index ba7258e4..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicAPI.java +++ /dev/null @@ -1,77 +0,0 @@ -package WayofTime.bloodmagic.api; - -import net.minecraft.block.state.IBlockState; - -import javax.annotation.Nonnull; - -/** - * The main interface between a plugin and Blood Magic's internals. - * - * This API is intended for compatibility between other mods and Blood Magic. More advanced integration is out of the scope of this API and are considered "addons". - * - * To get an instance of this without actually creating an {@link IBloodMagicPlugin}, use {@link BloodMagicPlugin.Inject}. - */ -public interface IBloodMagicAPI { - - /** - * Retrieves the instance of the blacklist. - * - * @return the active {@link IBloodMagicBlacklist} instance - */ - @Nonnull - IBloodMagicBlacklist getBlacklist(); - - /** - * Retrieves the instance of the recipe registrar. - * - * @return the active {@link IBloodMagicRecipeRegistrar} instance - */ - @Nonnull - IBloodMagicRecipeRegistrar getRecipeRegistrar(); - - /** - * Retrieves the instance of the value manager. - * - * @return the active {@link IBloodMagicValueManager} instance - */ - @Nonnull - IBloodMagicValueManager getValueManager(); - - /** - * Registers an {@link IBlockState} as a given component for the Blood Altar. - *

- * Valid component types: - *

    - *
  • GLOWSTONE
  • - *
  • BLOODSTONE
  • - *
  • BEACON
  • - *
  • BLOODRUNE
  • - *
  • CRYSTAL
  • - *
  • NOTAIR
  • - *
- * - * @param state The state to register - * @param componentType The type of Blood Altar component to register as. - */ - void registerAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType); - - /** - * Removes an {@link IBlockState} from the component mappings - *

- * Valid component types: - *

    - *
  • GLOWSTONE
  • - *
  • BLOODSTONE
  • - *
  • BEACON
  • - *
  • BLOODRUNE
  • - *
  • CRYSTAL
  • - *
  • NOTAIR
  • - *
- * - * @param state The state to unregister - * @param componentType The type of Blood Altar component to unregister from. - */ - void unregisterAltarComponent(@Nonnull IBlockState state, @Nonnull String componentType); - - -} diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java deleted file mode 100644 index e99c1609..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicBlacklist.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.api; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; - -/** - * Allows blacklisting of various objects from different Blood Magic systems. - */ -public interface IBloodMagicBlacklist { - - /** - * Blacklists a given {@link IBlockState} from being teleposed. - * - * @param state The {@link IBlockState} to blacklist. - */ - void addTeleposer(@Nonnull IBlockState state); - - /** - * Blacklists a {@link net.minecraft.entity.Entity} from being teleposed based on the given registry name. - * - * @param entityId The registry name to blacklist. - */ - void addTeleposer(@Nonnull ResourceLocation entityId); - - /** - * Blacklists a given {@link IBlockState} from being transposed. - * - * @param state The {@link IBlockState} to blacklist. - */ - void addTransposition(@Nonnull IBlockState state); - - /** - * Blacklists a given {@link IBlockState} from being accelerated by the growth enhancement ritual and sigil. - * - * @param state The {@link IBlockState} to blacklist. - */ - void addGreenGrove(@Nonnull IBlockState state); - - /** - * Blacklists a {@link net.minecraft.entity.Entity} from being sacrificed via the Well of Suffering ritual. - * - * @param entityId The registry name to blacklist. - */ - void addWellOfSuffering(@Nonnull ResourceLocation entityId); -} diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java deleted file mode 100644 index c18d3c1d..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicPlugin.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.api; - -/** - * The main class to implement to create a Blood Magic plugin. Everything communicated between a mod and Blood Magic is through this class. - * IBloodMagicPlugins must have the {@link BloodMagicPlugin} annotation to get loaded by Blood Magic. - */ -public interface IBloodMagicPlugin { - - /** - * Register mod content with the API. Called during {@link net.minecraftforge.fml.common.event.FMLInitializationEvent}. - * - * @param api The active instance of the {@link IBloodMagicAPI} - */ - default void register(IBloodMagicAPI api) { - // No-op - } - - /** - * Register recipes with the API. Called during {@link net.minecraftforge.event.RegistryEvent.Register}. - * - * @param recipeRegistrar The active instance of the {@link IBloodMagicRecipeRegistrar} - */ - default void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { - // No-op - } -} diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java deleted file mode 100644 index 93e13c45..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicRecipeRegistrar.java +++ /dev/null @@ -1,96 +0,0 @@ -package WayofTime.bloodmagic.api; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * Allows recipe addition and removal. - */ -public interface IBloodMagicRecipeRegistrar -{ - - /** - * Adds a new recipe to the Blood Altar. - * - * @param input An input {@link Ingredient}. - * @param output An output {@link ItemStack}. - * @param minimumTier The minimum Blood Altar tier required for this recipe. - * @param syphon The amount of Life Essence to syphon from the Blood Altar over the course of the craft. - * @param consumeRate How quickly the Life Essence is syphoned. - * @param drainRate How quickly progress is lost if the Blood Altar runs out of Life Essence during the craft. - */ - void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate); - - /** - * Removes a Blood Altar recipe based on an input {@link ItemStack}. - * - * @param input The input item to remove the recipe of. - * @return Whether or not a recipe was removed. - */ - boolean removeBloodAltar(@Nonnull ItemStack input); - - /** - * Adds a new recipe to the Alchemy Table. - * - * @param output An output {@link ItemStack}. - * @param syphon The amount of Life Essence to syphon from the Blood Orb's bound network over the course of the craft. - * @param ticks The amount of ticks it takes to complete the craft. - * @param minimumTier The minimum Blood Orb tier required for this recipe. - * @param input An array of {@link Ingredient}s to accept as inputs. - */ - void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Ingredient... input); - - /** - * Removes an Alchemy Table recipe based on an input {@link ItemStack} array. - * - * @param input The input items to remove the recipe of. - * @return Whether or not a recipe was removed. - */ - boolean removeAlchemyTable(@Nonnull ItemStack... input); - - /** - * Adds a new recipe to the Soul/Tartaric Forge. - * - * @param output An output {@link ItemStack}. - * @param minimumSouls The minimum number of souls that must be contained in the Soul Gem. - * @param soulDrain The number of souls to drain from the Soul Gem. - * @param input An array of {@link Ingredient}s to accept as inputs. - */ - void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input); - - /** - * Removes a Soul/Tartaric Forge recipe based on an input {@link ItemStack} array. - * - * @param input The input items to remove the recipe of. - * @return Whether or not a recipe was removed. - */ - boolean removeTartaricForge(@Nonnull ItemStack... input); - - /** - * Adds a new recipe to the Alchemy Array. - * - * @param input An input {@link Ingredient}. First item put into the Alchemy Array. - * @param catalyst A catalyst {@link Ingredient}. Second item put into the Alchemy Array. - * @param output An output {@link ItemStack}. - * @param circleTexture The texture to render for the Alchemy Array circle. - */ - void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture); - - /** - * Removes an Alchemy Array recipe based on an input {@link ItemStack} and it's catalyst {@link ItemStack}. - * - * @param input The input item to remove the recipe of. - * @param catalyst The catalyst item to remove the recipe of. - * @return Whether or not a recipe was removed. - */ - boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst); - - void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input); - - boolean removeSacrificeCraft(@Nonnull ItemStack... input); -} diff --git a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java b/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java deleted file mode 100644 index f51db50c..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/IBloodMagicValueManager.java +++ /dev/null @@ -1,42 +0,0 @@ -package WayofTime.bloodmagic.api; - -import net.minecraft.block.state.IBlockState; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -/** - * Allows value modification for various features of Blood Magic such as Sacrificial values. - */ -public interface IBloodMagicValueManager { - - /** - * Sets the amount of LP received per health point from sacrificing the given entity. By default, this is 25. Setting - * the value to 0 effectively disables sacrificing. - * - * @param entityId The registry name of the entity. - * @param value The amount of LP per health point to receive upon sacrifice. - */ - void setSacrificialValue(@Nonnull ResourceLocation entityId, @Nonnegative int value); - - /** - * Sets the Tranquility value of a given {@link IBlockState}. - *

- * Valid tranquility types: - *

    - *
  • PLANT
  • - *
  • CROP
  • - *
  • TREE
  • - *
  • EARTHEN
  • - *
  • WATER
  • - *
  • FIRE
  • - *
  • LAVA
  • - *
- * - * @param state The {@link IBlockState} to set the value of. - * @param tranquilityType The type of Tranquility this block should provide. - * @param value The amount of tranquility this block should provide. - */ - void setTranquility(@Nonnull IBlockState state, @Nonnull String tranquilityType, double value); -} diff --git a/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java b/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java deleted file mode 100644 index 0b92284c..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/event/BloodMagicCraftedEvent.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.api.event; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.Event; - -public class BloodMagicCraftedEvent extends Event { - - private final boolean modifiable; - private final ItemStack[] inputs; - private ItemStack output; - - public BloodMagicCraftedEvent(ItemStack output, ItemStack[] inputs, boolean modifiable) { - this.modifiable = modifiable; - this.inputs = inputs; - this.output = output; - } - - public boolean isModifiable() { - return modifiable; - } - - public ItemStack[] getInputs() { - return inputs; - } - - public ItemStack getOutput() { - return output; - } - - public void setOutput(ItemStack output) { - if (isModifiable()) - this.output = output; - } - - /** - * Fired whenever a craft is completed in a Blood Altar. - * - * It is not cancelable, however you can modify the output stack. - */ - public static class Altar extends BloodMagicCraftedEvent { - - public Altar(ItemStack output, ItemStack input) { - super(output, new ItemStack[] { input }, true); - } - } - - /** - * Fired whenever a craft is completed in a Soul Forge. - * - * It is not cancelable, however you can modify the output stack. - */ - public static class SoulForge extends BloodMagicCraftedEvent { - - public SoulForge(ItemStack output, ItemStack[] inputs) { - super(output, inputs, true); - } - } - - /** - * Fired whenever a craft is completed in an Alchemy Table. - * - * It is not cancelable, however you can modify the output stack. - */ - public static class AlchemyTable extends BloodMagicCraftedEvent { - - public AlchemyTable(ItemStack output, ItemStack[] inputs) { - super(output, inputs, true); - } - } - -} diff --git a/src/api/java/WayofTime/bloodmagic/api/package-info.java b/src/api/java/WayofTime/bloodmagic/api/package-info.java deleted file mode 100644 index 9d563054..00000000 --- a/src/api/java/WayofTime/bloodmagic/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@API(owner = "bloodmagic", provides = "bloodmagic-api", apiVersion = "2.0.0") -package WayofTime.bloodmagic.api; - -import net.minecraftforge.fml.common.API; \ No newline at end of file diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache new file mode 100644 index 00000000..3d4fa05e --- /dev/null +++ b/src/generated/resources/.cache/cache @@ -0,0 +1,170 @@ +cb435652c27b4978d8db83af2fd531ccaa82ada7 assets/bloodmagic/blockstates/accelerationrune.json +4a60c54def00d68368ed0a0d4783979aa63d5f60 assets/bloodmagic/blockstates/altarcapacityrune.json +950fff9f06033741091aa8a66a62857da673efb9 assets/bloodmagic/blockstates/bettercapacityrune.json +8a5edb859a6f4d0adfbe2f608bab6b8c8addf01a assets/bloodmagic/blockstates/blankrune.json +904d9baa649250571bce5f965cf48fbec69c2c1a assets/bloodmagic/blockstates/bloodlight.json +631b579c38652efbcd9e5771d09ad6e476f3ba00 assets/bloodmagic/blockstates/chargingrune.json +6bd58d1d02a40416cec29409dee7ef80038b26d5 assets/bloodmagic/blockstates/dislocationrune.json +372ecd737f7082a4c2c70e46745f893b1179f885 assets/bloodmagic/blockstates/orbcapacityrune.json +285618c1a8ec36e36d479f577190579ae7616529 assets/bloodmagic/blockstates/sacrificerune.json +b03040d7a168653bf8df3600033b8fde2383db30 assets/bloodmagic/blockstates/selfsacrificerune.json +487ffdc02ab7b65aafcb932e3b5cf6ea0500b21d assets/bloodmagic/blockstates/speedrune.json +f7a92ca94cbd68344d89b92dc6c26c15cd1b85b5 assets/bloodmagic/lang/en_us.json +34445195b9f2459475cde53454bc8e37d32865d7 assets/bloodmagic/models/block/accelerationrune.json +3c98a88c2283ad54f0efb9d7194361bbc3e93c17 assets/bloodmagic/models/block/altarcapacityrune.json +7cd62092c6fb3109e016d42090cf89bfa3ab7fca assets/bloodmagic/models/block/bettercapacityrune.json +1fe0f89895addb7abcacf6ce7e39b6ddc87b0d85 assets/bloodmagic/models/block/blankrune.json +3c83e090a1cff00e2bb2c7eb475785954b6eb980 assets/bloodmagic/models/block/bloodlight.json +320827ad2feaa51a90ebb7064a70bdc6d3765203 assets/bloodmagic/models/block/chargingrune.json +6adbeedc17f649ef47419845a6da0d50cfc76742 assets/bloodmagic/models/block/dislocationrune.json +c3a813b735cd229f8597e41d04465926b2e65fe1 assets/bloodmagic/models/block/orbcapacityrune.json +a8a1d06fcc2f8395530c72d2846133fff37d5537 assets/bloodmagic/models/block/sacrificerune.json +791c9f2e27215ff0a45eed7efe385276bfc09aed assets/bloodmagic/models/block/selfsacrificerune.json +65fe5e01ed2660e45a5c329ff2389a87e4d791ec assets/bloodmagic/models/block/speedrune.json +9462d62d9bc9408359d30728de8651dc104aacf1 assets/bloodmagic/models/item/accelerationrune.json +17cbe9142ef3950ea1b6be11694b849f55e93f13 assets/bloodmagic/models/item/airsigil.json +f150f178edf7d6d250bcfd84af1c28a21cff09c6 assets/bloodmagic/models/item/altarcapacityrune.json +866b8cdd3da56e2e82dbd5f16ab5117b5a503749 assets/bloodmagic/models/item/apprenticebloodorb.json +719e38516b76596e177809508b4e2b28f05acfb0 assets/bloodmagic/models/item/arcaneashes.json +b95ae11c1910a67770fcdc0c7704282ce7b3f564 assets/bloodmagic/models/item/basemonstersoul.json +cbf1f930da06b0d1194760411a39f55b8ced1189 assets/bloodmagic/models/item/basemonstersoul_corrosive.json +09839c1f062c6a9ef143d81b6ad89065a9f4e39f assets/bloodmagic/models/item/basemonstersoul_destructive.json +23e9b2f79cea038b8d4c840854946ebedd444532 assets/bloodmagic/models/item/basemonstersoul_steadfast.json +f5bcdfe42e526de447df29ed801798bb33a90dfa assets/bloodmagic/models/item/basemonstersoul_vengeful.json +d3c33ff908880e7abc8a2cd977304419ec48a23d assets/bloodmagic/models/item/bettercapacityrune.json +7a1c55d55fe59d8a70bc2a867d127cb303c1ba23 assets/bloodmagic/models/item/blankrune.json +3f207755d189c316cf06734a268669afc6b77766 assets/bloodmagic/models/item/blankslate.json +ef26c203159e9f55672ed5ea75107d4a9d081cfe assets/bloodmagic/models/item/bloodlightsigil.json +7315e49149eca494e6b132d383082cb76fc9c0e4 assets/bloodmagic/models/item/chargingrune.json +f404148f9df3a61da3c18175885ffa56b2a85a6a assets/bloodmagic/models/item/daggerofsacrifice.json +9671199681493a396e07d7bcab20137c22d981d5 assets/bloodmagic/models/item/demonslate.json +7af07ab578bbd20e2f834b26d9cafb5fe23bc7d4 assets/bloodmagic/models/item/dislocationrune.json +f4531e22aa1db1cff324db5ccb344d3b9fa85c8d assets/bloodmagic/models/item/divinationsigil.json +4c39378f6c14dc243a7d52564e5a21df94683415 assets/bloodmagic/models/item/etherealslate.json +44663089f348642bcca1c5020b5081c3ab172f92 assets/bloodmagic/models/item/growthsigil.json +f68825f667ca73b4373fd5068a47f0d1ca9b2aad assets/bloodmagic/models/item/icesigil.json +109b5485c25d978af55b46682d5bfa7008909458 assets/bloodmagic/models/item/infusedslate.json +588c5208e3f4ef941cd8375aeceeed44484d85d3 assets/bloodmagic/models/item/lavasigil.json +15d8178b626da912334774142d40d1012fb21fa0 assets/bloodmagic/models/item/magicianbloodorb.json +0a3566d3c86403f24c22977dd32ffaec727a9ad3 assets/bloodmagic/models/item/masterbloodorb.json +7596826c5b40c2809eb0a42eb5f5f2089290e3e5 assets/bloodmagic/models/item/miningsigil.json +ff9b802098659824626dc90dbb5a0d8960234228 assets/bloodmagic/models/item/orbcapacityrune.json +b4e1259784354b048cd7ec5ef888a182e3909dc6 assets/bloodmagic/models/item/reagentair.json +919b17ed4620c7b76c86494683951ab6e7fc7864 assets/bloodmagic/models/item/reagentbloodlight.json +c0a7633527bdd25fc85e78fc4838733063726d88 assets/bloodmagic/models/item/reagentfastminer.json +4ff6b8f6943d96a0f292ff4e0b0973edff550229 assets/bloodmagic/models/item/reagentgrowth.json +c82717c2706ec2ef1518f95c6aefdff9bdae09b8 assets/bloodmagic/models/item/reagentlava.json +baafdb5915c5fbc99b84a54670ed64a6f26cb0fe assets/bloodmagic/models/item/reagentmagnetism.json +95b2925e96a7df71d72568e0ed7b03290293cbe7 assets/bloodmagic/models/item/reagentvoid.json +fd1447d943ddc4540a51a72dcbb245d77d45da71 assets/bloodmagic/models/item/reagentwater.json +50bf796adbed412488df48ed9250fc9b0ecd851f assets/bloodmagic/models/item/reinforcedslate.json +db73abb3bcb1731b6fc389e3577910b6aab87b10 assets/bloodmagic/models/item/sacrificerune.json +9403d6195d4d38d5876c2a42f4edfb9bdcd05210 assets/bloodmagic/models/item/sacrificialdagger.json +cc71421e98ee7ee047a4cfbb6cb69529c2b02d4e assets/bloodmagic/models/item/selfsacrificerune.json +ea5747638d0b5dcc03f008b202cc60a11e0827bb assets/bloodmagic/models/item/sigilofmagnetism.json +9ec68a2dcf04b987c3c5d5c6c52195e3deccacbb assets/bloodmagic/models/item/soulgemcommon.json +ad010d9680cd748bd04c8fc36262c236f7d90105 assets/bloodmagic/models/item/soulgemlesser.json +b49e7f34913e32ccb68eeb6f6c196ff6b209f482 assets/bloodmagic/models/item/soulgempetty.json +f8db155d49b0f2c37504bac46a8974d4bf90db3e assets/bloodmagic/models/item/soulsnare.json +fe2b201007c974229509f6900c6eb8b03d158b0a assets/bloodmagic/models/item/soulsword.json +52d21027ac6fed000e77b5e8ad9102319b25cb33 assets/bloodmagic/models/item/speedrune.json +e8fe01c5cddc268538681889f3161472a8f1c8ad assets/bloodmagic/models/item/variants/growthsigil_activated.json +20c802279de4df496057795c2e891fa54a21376f assets/bloodmagic/models/item/variants/growthsigil_deactivated.json +2778ea3a62ce6dd718a557beee7b5329bb185ff9 assets/bloodmagic/models/item/variants/icesigil_activated.json +11f5516cea8ac65bbb0f5958d6492170482ae8d8 assets/bloodmagic/models/item/variants/icesigil_deactivated.json +be3772fd711ccf4a2adfad122a8b39e8a36e874a assets/bloodmagic/models/item/variants/miningsigil_activated.json +7dec45f3167426d975564692a80196cdb3f4bdb4 assets/bloodmagic/models/item/variants/miningsigil_deactivated.json +79c61e61656a934397c92626809c1869b0617fc3 assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json +129ace1f4a25f22bd09215603248a25adcf234e0 assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json +cddaa2be8db3aff90933fb772b92cab735ebf11e assets/bloodmagic/models/item/variants/soulgemcommon.json +874aa708d02de2315e29033b2f67fd313edc8aff assets/bloodmagic/models/item/variants/soulgemcommon_corrosive.json +3ca3c4251a8907c1c47caf49e53a711265e0e92c assets/bloodmagic/models/item/variants/soulgemcommon_destructive.json +3ad2785d3e893943ea769c7e39d69cedd71e556a assets/bloodmagic/models/item/variants/soulgemcommon_steadfast.json +016ccdfb8a6e0101975e64f9f548e6a93d32f53c assets/bloodmagic/models/item/variants/soulgemcommon_vengeful.json +2b2322dfd3f7e28ea5d0ad2d9df2223d7ee47f00 assets/bloodmagic/models/item/variants/soulgemlesser.json +8eaab2fddfe201dc83d2d2ffd65e1537a3e5a388 assets/bloodmagic/models/item/variants/soulgemlesser_corrosive.json +24608fc7a19e41d71ec84a80c18ceccbc869cd79 assets/bloodmagic/models/item/variants/soulgemlesser_destructive.json +1ef6dd3ceed7f6ffd3e91283146fbe3f6db46d10 assets/bloodmagic/models/item/variants/soulgemlesser_steadfast.json +7801bda9366c21aad10137d30151ac4154acbea1 assets/bloodmagic/models/item/variants/soulgemlesser_vengeful.json +0b37376d07ecf8ff91df345435abd5d94d28714e assets/bloodmagic/models/item/variants/soulgempetty.json +fb9e51a933316daa4a99b6e6c9a2606dc354f0dc assets/bloodmagic/models/item/variants/soulgempetty_corrosive.json +0a15d2c90a8d139c1689579460379e5feefaddec assets/bloodmagic/models/item/variants/soulgempetty_destructive.json +a94516c3019969baa379f4a32d68736010cb473a assets/bloodmagic/models/item/variants/soulgempetty_steadfast.json +eabd2e88451ef42250e86c6675868b322aa0db92 assets/bloodmagic/models/item/variants/soulgempetty_vengeful.json +0cd32e8e693d85b8a81e96ea305ffafb4a72e861 assets/bloodmagic/models/item/variants/soulsword_activated.json +60831276c8b0a5ecfa8e1a7beee6c5a4838cae69 assets/bloodmagic/models/item/variants/soulsword_corrosive_activated.json +792bb3a3e613808890cf0c31585318dc8e16891d assets/bloodmagic/models/item/variants/soulsword_corrosive_deactivated.json +ba7a7366b1471dd58b27b523bde130e39220fe01 assets/bloodmagic/models/item/variants/soulsword_deactivated.json +ef838be270d9d87651aec70c6b59197b01e48a6c assets/bloodmagic/models/item/variants/soulsword_destructive_activated.json +ec6f6bf7f520182b2044f3cc5a10f1d4c7a8d7ab assets/bloodmagic/models/item/variants/soulsword_destructive_deactivated.json +149f3e3049bd4f4ed559e56db79027bda9e8478e assets/bloodmagic/models/item/variants/soulsword_steadfast_activated.json +7d22fdba9bb8593c247a0b33df11f3b26a16c254 assets/bloodmagic/models/item/variants/soulsword_steadfast_deactivated.json +2029220112f89a3f4d432ab4749dff6143846659 assets/bloodmagic/models/item/variants/soulsword_vengeful_activated.json +0f5a3e1e5993a03ccda156eed855b71fbd0be0a2 assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json +836b5a7f19915af809795a72983a23f0d5f9c5b2 assets/bloodmagic/models/item/voidsigil.json +7426fed5f833ce3d08602f727f1467dd3e107991 assets/bloodmagic/models/item/watersigil.json +f72efc172699d43405019add97f455bd6b7f452b assets/bloodmagic/models/item/weakbloodorb.json +828c0f89e747d48d37c6a86030a8ec59ca5c29cb data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json +f8b66411c96c6a7a409fb10f6888d078f1f8fa14 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json +ab5612f33028487c08e51de4b91bb786df1b1b95 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json +e59e508cdbd51f62f83559edeb5f2a89226d7694 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_charging.json +e897d6f91e2a0bd12b0da0a50e5c897294989e7c data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_orb.json +4a53004c651901cd1245de452810161736d9b067 data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_sacrifice.json +263f7c251d2f163db5bd229f2ab8a222f23ae03a data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json +7ca400d1141ff4be1b529cd060950b42cf3b9bfb data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json +832301a424345b7ca70b43cb214faa104179f0fb data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json +2d29dd0c24c4c11d7438cdeeb26b9357d4359e2c data/bloodmagic/advancements/recipes/bloodmagictab/soul_forge.json +7a7f9f995d2414289d07c0a145647c8e735a6b78 data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json +639ebb2ccabb2eaece59be96c2e6f28c31f4d2f4 data/bloodmagic/loot_tables/blocks/accelerationrune.json +443550be9eaf1021b11fd2bbe6afcfe2cee6f7ad data/bloodmagic/loot_tables/blocks/alchemyarray.json +17d8dcc62320d5d2eeb781e925963d9b9d5eec54 data/bloodmagic/loot_tables/blocks/altar.json +05bb6268d7e884c962061a632e162d5baf73271e data/bloodmagic/loot_tables/blocks/altarcapacityrune.json +87d44fa5143733864c12608443d11744b91e0496 data/bloodmagic/loot_tables/blocks/bettercapacityrune.json +867d0fa555de94140215d9edb7cd7ae533bbc619 data/bloodmagic/loot_tables/blocks/blankrune.json +f1a8e3131d85077665563372cad868534a72fb31 data/bloodmagic/loot_tables/blocks/bloodlight.json +779b809a2a51e6dab46f9e6799249f2f14653ebb data/bloodmagic/loot_tables/blocks/chargingrune.json +a9fcfc656fab957328c10ee1d9d33807e697b7f7 data/bloodmagic/loot_tables/blocks/dislocationrune.json +95442c1bb740fab2eb8ee051f7184813f6023afa data/bloodmagic/loot_tables/blocks/orbcapacityrune.json +e0239eff7762a414a4e4faa0158d844dffb8c1f6 data/bloodmagic/loot_tables/blocks/sacrificerune.json +9b697e37046b6238b3a19eae9113b88010ccff32 data/bloodmagic/loot_tables/blocks/selfsacrificerune.json +f748a5ba8838b50de0502f132fe2a65f4726dae6 data/bloodmagic/loot_tables/blocks/soulforge.json +015e07226fd90935f7ec663f4bcf3873a57a82d1 data/bloodmagic/loot_tables/blocks/speedrune.json +f41b0e9dfab608c42a85c3c5c5bbc050b03f02a1 data/bloodmagic/recipes/altar/apprenticebloodorb.json +2a67e37497a571b5ee944375d315fddccea87697 data/bloodmagic/recipes/altar/daggerofsacrifice.json +c5a4a256a7437f2e13c574a6f0c4d75fc2e718cb data/bloodmagic/recipes/altar/demonicslate.json +9aeb0d2d33d839eedb2d9bbdaf76fc73e0b39941 data/bloodmagic/recipes/altar/imbuedslate.json +2643d1516f6dae79128fdc8c48c4cfe23453f171 data/bloodmagic/recipes/altar/magicianbloodorb.json +f38355165034ce314a9f0344ebc3a6cad22c76c8 data/bloodmagic/recipes/altar/reinforcedslate.json +584d01dff4d64bb88bd3783751a29723700f1728 data/bloodmagic/recipes/altar/slate.json +7551501cf361667ec7454c307b9d2368536fbed6 data/bloodmagic/recipes/altar/weakbloodorb.json +e1285ec51100f2336c1ea1a1a3057e74a0dd84d1 data/bloodmagic/recipes/array/airsigil.json +d1ac23080f72f21adb5908befefe965ffb4efd4f data/bloodmagic/recipes/array/bloodlightsigil.json +1890706e5b93cd6df764b0419483c348e0d7f277 data/bloodmagic/recipes/array/divinationsigil.json +4bd220ced486f1d8fc4468ebd61dac755670d716 data/bloodmagic/recipes/array/fastminersigil.json +f191a3c9982b827b0b2ba93164a81fc4f8cb0959 data/bloodmagic/recipes/array/growthsigil.json +78c880321f0bfad14239d4b9d2edae170a7fa86e data/bloodmagic/recipes/array/lavasigil.json +8b1007de1b7fca5d27b54d7c9839cde9e47ab1c0 data/bloodmagic/recipes/array/magnetismsigil.json +cabe693e7c714203ad708a1068f302b3ee3120b0 data/bloodmagic/recipes/array/voidsigil.json +5e68d933fff631142a8dd819aee235d343d43cff data/bloodmagic/recipes/array/watersigil.json +de8dbcf4d69bd3b47693c4631578a9b5c0e3f50c data/bloodmagic/recipes/blood_altar.json +68edddac5949c404e00b2ebe897c9fd3045cb907 data/bloodmagic/recipes/blood_rune_blank.json +5c4e4af372250a3f967666f0f97198547cfbd5e1 data/bloodmagic/recipes/blood_rune_capacity.json +f905c1a8ca4d3a9f841ca6c44caa91de327fc29d data/bloodmagic/recipes/blood_rune_charging.json +89563d5c176d465632a45005cbe5e570791fd8dd data/bloodmagic/recipes/blood_rune_orb.json +b63d77c3762f86d4a91f62e192c3e9b26e3b52ca data/bloodmagic/recipes/blood_rune_sacrifice.json +7c4e247c1df6ef594bbb2fc2196afb102f45982b data/bloodmagic/recipes/blood_rune_self_sacrifice.json +e2bcf2a6f951fbcef45554ec90ba28d14e261d18 data/bloodmagic/recipes/blood_rune_speed.json +aefbf1fd258f1cda8d04db7e0794b9612993e6bf data/bloodmagic/recipes/sacrificial_dagger.json +d699e777c72a5f61c4e6cdfea8705628e1c2b855 data/bloodmagic/recipes/soul_forge.json +2455bf8c205c7244fef2b7d7afeef060e30520b7 data/bloodmagic/recipes/soul_snare.json +f4763a58a8f471ec1aaa997cbd36eac8c7d51a12 data/bloodmagic/recipes/soulforge/arcaneashes.json +8b64af8453c60b6b1ae55bd0dd1a68fe95e8ba19 data/bloodmagic/recipes/soulforge/commontartaricgem.json +d46b61779b3c8382862d4e66c3909a1241ecca18 data/bloodmagic/recipes/soulforge/lessertartaricgem.json +d6e06747c75fc06e708a15358911f1c63eee86b1 data/bloodmagic/recipes/soulforge/pettytartaricgem.json +6b59a7e95e596997b7bbb894b6fbaf5015b213b5 data/bloodmagic/recipes/soulforge/reagent_fastminer.json +ae3a6a760e9f793d5a62e2f0f6c45219b0017816 data/bloodmagic/recipes/soulforge/reagent_growth.json +1c391181ea77f5ed01f7226e0782b3b45162ab3c data/bloodmagic/recipes/soulforge/reagent_lava.json +e517023dc3e32929344ff5415397fc833bfbc29a data/bloodmagic/recipes/soulforge/reagent_magnetism.json +c0e75e0e12290d191245c5b0b5b13bc739d2ff44 data/bloodmagic/recipes/soulforge/reagent_void.json +a222d09abf1ea61feb684f2ac23d011c2034f526 data/bloodmagic/recipes/soulforge/reagent_water.json +7e281841a2953c1284d332c2bbf75097f8128241 data/bloodmagic/recipes/soulforge/sentientsword.json diff --git a/src/generated/resources/assets/bloodmagic/blockstates/accelerationrune.json b/src/generated/resources/assets/bloodmagic/blockstates/accelerationrune.json new file mode 100644 index 00000000..dc97d5de --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/accelerationrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/accelerationrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/altarcapacityrune.json b/src/generated/resources/assets/bloodmagic/blockstates/altarcapacityrune.json new file mode 100644 index 00000000..f5a088ea --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/altarcapacityrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/altarcapacityrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/bettercapacityrune.json b/src/generated/resources/assets/bloodmagic/blockstates/bettercapacityrune.json new file mode 100644 index 00000000..ead6c945 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/bettercapacityrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/bettercapacityrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/blankrune.json b/src/generated/resources/assets/bloodmagic/blockstates/blankrune.json new file mode 100644 index 00000000..d211f0a6 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/blankrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/blankrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/bloodlight.json b/src/generated/resources/assets/bloodmagic/blockstates/bloodlight.json new file mode 100644 index 00000000..dfa612f0 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/bloodlight.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/bloodlight" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/chargingrune.json b/src/generated/resources/assets/bloodmagic/blockstates/chargingrune.json new file mode 100644 index 00000000..5c238290 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/chargingrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/chargingrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/dislocationrune.json b/src/generated/resources/assets/bloodmagic/blockstates/dislocationrune.json new file mode 100644 index 00000000..e788f3d5 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/dislocationrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/dislocationrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/orbcapacityrune.json b/src/generated/resources/assets/bloodmagic/blockstates/orbcapacityrune.json new file mode 100644 index 00000000..afa6fb84 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/orbcapacityrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/orbcapacityrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/sacrificerune.json b/src/generated/resources/assets/bloodmagic/blockstates/sacrificerune.json new file mode 100644 index 00000000..1564fd64 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/sacrificerune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/sacrificerune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/selfsacrificerune.json b/src/generated/resources/assets/bloodmagic/blockstates/selfsacrificerune.json new file mode 100644 index 00000000..05620681 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/selfsacrificerune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/selfsacrificerune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/blockstates/speedrune.json b/src/generated/resources/assets/bloodmagic/blockstates/speedrune.json new file mode 100644 index 00000000..9ebf2703 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/blockstates/speedrune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/speedrune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/lang/en_us.json b/src/generated/resources/assets/bloodmagic/lang/en_us.json new file mode 100644 index 00000000..bc3f1ecf --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/lang/en_us.json @@ -0,0 +1,115 @@ +{ + "block.bloodmagic.accelerationrune": "Acceleration Rune", + "block.bloodmagic.altar": "Blood Altar", + "block.bloodmagic.altarcapacityrune": "Rune of Capacity", + "block.bloodmagic.bettercapacityrune": "Rune of Augmented Capacity", + "block.bloodmagic.blankrune": "Blank Rune", + "block.bloodmagic.chargingrune": "Charging Rune", + "block.bloodmagic.dislocationrune": "DisplacementRune", + "block.bloodmagic.orbcapacityrune": "Rune of the Orb", + "block.bloodmagic.sacrificerune": "Rune of Sacrifice", + "block.bloodmagic.selfsacrificerune": "Rune of Self Sacrifice", + "block.bloodmagic.soulforge": "Hellfire Forge", + "block.bloodmagic.speedrune": "Speed Rune", + "item.bloodmagic.airsigil": "Air Sigil", + "item.bloodmagic.apprenticebloodorb": "Apprentice Blood Orb", + "item.bloodmagic.arcaneashes": "Arcane Ashes", + "item.bloodmagic.basemonstersoul": "Demon Will", + "item.bloodmagic.basemonstersoul_corrosive": "Demon Will", + "item.bloodmagic.basemonstersoul_destructive": "Demon Will", + "item.bloodmagic.basemonstersoul_steadfast": "Demon Will", + "item.bloodmagic.basemonstersoul_vengeful": "Demon Will", + "item.bloodmagic.blankslate": "Blank Slate", + "item.bloodmagic.bloodlightsigil": "Sigil of the Blood Lamp", + "item.bloodmagic.daggerofsacrifice": "Dagger of Sacrifice", + "item.bloodmagic.demonslate": "Demonic Slate", + "item.bloodmagic.divinationsigil": "Divination Sigil", + "item.bloodmagic.etherealslate": "Ethereal Slate", + "item.bloodmagic.growthsigil": "Sigil of the Green Grove", + "item.bloodmagic.icesigil": "Sigil of the Frozen Lake", + "item.bloodmagic.infusedslate": "Imbued Slate", + "item.bloodmagic.lavasigil": "Lava Sigil", + "item.bloodmagic.life_essence_bucket": "Bucket of Life", + "item.bloodmagic.magicianbloodorb": "Magician Blood Orb", + "item.bloodmagic.masterbloodorb": "Master Blood Orb", + "item.bloodmagic.miningsigil": "Sigil of the Fast Miner", + "item.bloodmagic.reagentair": "Air Reagent", + "item.bloodmagic.reagentbloodlight": "Blood Lamp Reagent", + "item.bloodmagic.reagentfastminer": "Mining Reagent", + "item.bloodmagic.reagentgrowth": "Growth Reagent", + "item.bloodmagic.reagentlava": "Lava Reagent", + "item.bloodmagic.reagentmagnetism": "Magnetism Reagent", + "item.bloodmagic.reagentvoid": "Void Reagent", + "item.bloodmagic.reagentwater": "Water Reagent", + "item.bloodmagic.reinforcedslate": "Reinforced Slate", + "item.bloodmagic.sacrificialdagger": "Sacrificial Knife", + "item.bloodmagic.sigilofmagnetism": "Sigil of Magnetism", + "item.bloodmagic.soulgemcommon": "Common Tartaric Gem", + "item.bloodmagic.soulgemlesser": "Lesser Tartaric Gem", + "item.bloodmagic.soulgempetty": "Petty Tartaric Gem", + "item.bloodmagic.soulsnare": "Soul Snare", + "item.bloodmagic.soulsword": "Sentient Sword", + "item.bloodmagic.voidsigil": "Void Sigil", + "item.bloodmagic.watersigil": "Water Sigil", + "item.bloodmagic.weakbloodorb": "Weak Blood Orb", + "itemGroup.bloodmagic.creativeTab": "Blood Magic", + "itemGroup.bloodmagictab": "Blood Magic", + "jei.bloodmagic.recipe.alchemyarraycrafting": "Alchemy Array", + "jei.bloodmagic.recipe.altar": "Blood Altar", + "jei.bloodmagic.recipe.consumptionrate": "Consumption: %s LP/t", + "jei.bloodmagic.recipe.drainrate": "Drain: %s LP/t", + "jei.bloodmagic.recipe.minimumsouls": "Minimum: %s Will", + "jei.bloodmagic.recipe.requiredlp": "LP: %d", + "jei.bloodmagic.recipe.requiredtier": "Tier: %d", + "jei.bloodmagic.recipe.soulforge": "Hellfire Forge", + "jei.bloodmagic.recipe.soulsdrained": "Drained: %s Will", + "tile.bloodmagic.soulforge.name": "Hellfire Forge", + "tooltip.bloodmagic.arcaneAshes": "Ashes used to draw an alchemy circle", + "tooltip.bloodmagic.config.disabled": "Currently disabled in the Config", + "tooltip.bloodmagic.currentBaseType.corrosive": "Corrosive", + "tooltip.bloodmagic.currentBaseType.default": "Raw", + "tooltip.bloodmagic.currentBaseType.destructive": "Destructive", + "tooltip.bloodmagic.currentBaseType.steadfast": "Steadfast", + "tooltip.bloodmagic.currentBaseType.vengeful": "Vengeful", + "tooltip.bloodmagic.currentOwner": "Current owner: %s", + "tooltip.bloodmagic.currentTier": "Current tier: %d", + "tooltip.bloodmagic.currentType.corrosive": "Contains: Corrosive Will", + "tooltip.bloodmagic.currentType.default": "Contains: Raw Will", + "tooltip.bloodmagic.currentType.destructive": "Contains: Destructive Will", + "tooltip.bloodmagic.currentType.steadfast": "Contains: Steadfast Will", + "tooltip.bloodmagic.currentType.vengeful": "Contains: Vengeful Will", + "tooltip.bloodmagic.decoration.notSafe": "Dangerous for decoration", + "tooltip.bloodmagic.decoration.safe": "Safe for decoration", + "tooltip.bloodmagic.extraInfo": "&9-Hold shift for more info-", + "tooltip.bloodmagic.orb.desc": "Stores raw Life Essence", + "tooltip.bloodmagic.orb.owner": "Added by: %s", + "tooltip.bloodmagic.sacrificialdagger.desc": "Just a prick of the finger will suffice...", + "tooltip.bloodmagic.sentientAxe.desc": "Uses demon will to unleash its full potential.", + "tooltip.bloodmagic.sentientPickaxe.desc": "Uses demon will to unleash its full potential.", + "tooltip.bloodmagic.sentientShovel.desc": "Uses demon will to unleash its full potential.", + "tooltip.bloodmagic.sentientSword.desc": "Uses demon will to unleash its full potential.", + "tooltip.bloodmagic.sigil.air.desc": "I feel lighter already...", + "tooltip.bloodmagic.sigil.bloodlight.desc": "I see a light!", + "tooltip.bloodmagic.sigil.divination.currentAltarCapacity": "Current Capacity: %d LP", + "tooltip.bloodmagic.sigil.divination.currentAltarTier": "Current Tier: %d", + "tooltip.bloodmagic.sigil.divination.currentBonus": "Current Bonus: +%d%%", + "tooltip.bloodmagic.sigil.divination.currentEssence": "Current Essence: %d LP", + "tooltip.bloodmagic.sigil.divination.currentTranquility": "Current Tranquility: %d", + "tooltip.bloodmagic.sigil.divination.desc": "Peer into the soul", + "tooltip.bloodmagic.sigil.divination.otherNetwork": "Peering into the soul of %s", + "tooltip.bloodmagic.sigil.fastminer.desc": "Keep mining, and mining...", + "tooltip.bloodmagic.sigil.greengrove.desc": "Environmentally friendly", + "tooltip.bloodmagic.sigil.lava.desc": "HOT! DO NOT EAT", + "tooltip.bloodmagic.sigil.magnetism.desc": "I have a very magnetic personality", + "tooltip.bloodmagic.sigil.void.desc": "Better than a Swiffer\u00AE!", + "tooltip.bloodmagic.sigil.water.desc": "Infinite water, anyone?", + "tooltip.bloodmagic.slate.desc": "Infused stone inside of a Blood Altar", + "tooltip.bloodmagic.soulGem.common": "A gem used to contain more will", + "tooltip.bloodmagic.soulGem.grand": "A gem used to contain a large amount of will", + "tooltip.bloodmagic.soulGem.greater": "A gem used to contain a greater amount of will", + "tooltip.bloodmagic.soulGem.lesser": "A gem used to contain some will", + "tooltip.bloodmagic.soulGem.petty": "A gem used to contain a little will", + "tooltip.bloodmagic.soulSnare.desc": "Throw at a monster and then kill them to obtain their demonic will", + "tooltip.bloodmagic.tier": "Tier %d", + "tooltip.bloodmagic.will": "Will Quality: %s" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/accelerationrune.json b/src/generated/resources/assets/bloodmagic/models/block/accelerationrune.json new file mode 100644 index 00000000..fd09a780 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/accelerationrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/accelerationrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/altarcapacityrune.json b/src/generated/resources/assets/bloodmagic/models/block/altarcapacityrune.json new file mode 100644 index 00000000..c8a6d830 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/altarcapacityrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/altarcapacityrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/bettercapacityrune.json b/src/generated/resources/assets/bloodmagic/models/block/bettercapacityrune.json new file mode 100644 index 00000000..3ffccb3a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/bettercapacityrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/bettercapacityrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/blankrune.json b/src/generated/resources/assets/bloodmagic/models/block/blankrune.json new file mode 100644 index 00000000..ab6f65ac --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/blankrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/blankrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/bloodlight.json b/src/generated/resources/assets/bloodmagic/models/block/bloodlight.json new file mode 100644 index 00000000..1a06cf8d --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/bloodlight.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/bloodlight" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/chargingrune.json b/src/generated/resources/assets/bloodmagic/models/block/chargingrune.json new file mode 100644 index 00000000..8a0996cf --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/chargingrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/chargingrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/dislocationrune.json b/src/generated/resources/assets/bloodmagic/models/block/dislocationrune.json new file mode 100644 index 00000000..a4b7b5f3 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/dislocationrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/dislocationrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/orbcapacityrune.json b/src/generated/resources/assets/bloodmagic/models/block/orbcapacityrune.json new file mode 100644 index 00000000..db85074a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/orbcapacityrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/orbcapacityrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/sacrificerune.json b/src/generated/resources/assets/bloodmagic/models/block/sacrificerune.json new file mode 100644 index 00000000..9f99851f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/sacrificerune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/sacrificerune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/selfsacrificerune.json b/src/generated/resources/assets/bloodmagic/models/block/selfsacrificerune.json new file mode 100644 index 00000000..bad7ca8e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/selfsacrificerune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/selfsacrificerune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/block/speedrune.json b/src/generated/resources/assets/bloodmagic/models/block/speedrune.json new file mode 100644 index 00000000..d33d1f07 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/block/speedrune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "bloodmagic:block/speedrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/accelerationrune.json b/src/generated/resources/assets/bloodmagic/models/item/accelerationrune.json new file mode 100644 index 00000000..4551c1a8 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/accelerationrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/accelerationrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/airsigil.json b/src/generated/resources/assets/bloodmagic/models/item/airsigil.json new file mode 100644 index 00000000..3ab0c0a0 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/airsigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/airsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/altarcapacityrune.json b/src/generated/resources/assets/bloodmagic/models/item/altarcapacityrune.json new file mode 100644 index 00000000..819ef814 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/altarcapacityrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/altarcapacityrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/apprenticebloodorb.json b/src/generated/resources/assets/bloodmagic/models/item/apprenticebloodorb.json new file mode 100644 index 00000000..8f560341 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/apprenticebloodorb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/apprenticebloodorb" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/arcaneashes.json b/src/generated/resources/assets/bloodmagic/models/item/arcaneashes.json new file mode 100644 index 00000000..0d5a4393 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/arcaneashes.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/arcaneashes" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul.json b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul.json new file mode 100644 index 00000000..fdab63dc --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/basemonstersoul" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_corrosive.json b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_corrosive.json new file mode 100644 index 00000000..36fac70b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_corrosive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/basemonstersoul_corrosive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_destructive.json b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_destructive.json new file mode 100644 index 00000000..023694b7 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_destructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/basemonstersoul_destructive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_steadfast.json b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_steadfast.json new file mode 100644 index 00000000..388830d5 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_steadfast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/basemonstersoul_steadfast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_vengeful.json b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_vengeful.json new file mode 100644 index 00000000..e0384b54 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/basemonstersoul_vengeful.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/basemonstersoul_vengeful" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/bettercapacityrune.json b/src/generated/resources/assets/bloodmagic/models/item/bettercapacityrune.json new file mode 100644 index 00000000..f8b79342 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/bettercapacityrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/bettercapacityrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/blankrune.json b/src/generated/resources/assets/bloodmagic/models/item/blankrune.json new file mode 100644 index 00000000..7bf5795e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/blankrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/blankrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/blankslate.json b/src/generated/resources/assets/bloodmagic/models/item/blankslate.json new file mode 100644 index 00000000..858ddfd3 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/blankslate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/blankslate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/bloodlightsigil.json b/src/generated/resources/assets/bloodmagic/models/item/bloodlightsigil.json new file mode 100644 index 00000000..e235a36b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/bloodlightsigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/bloodlightsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/chargingrune.json b/src/generated/resources/assets/bloodmagic/models/item/chargingrune.json new file mode 100644 index 00000000..ccd29652 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/chargingrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/chargingrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/daggerofsacrifice.json b/src/generated/resources/assets/bloodmagic/models/item/daggerofsacrifice.json new file mode 100644 index 00000000..e9b34ea0 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/daggerofsacrifice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/daggerofsacrifice" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/demonslate.json b/src/generated/resources/assets/bloodmagic/models/item/demonslate.json new file mode 100644 index 00000000..4225c748 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/demonslate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/demonslate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/dislocationrune.json b/src/generated/resources/assets/bloodmagic/models/item/dislocationrune.json new file mode 100644 index 00000000..1ddb2946 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/dislocationrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/dislocationrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/divinationsigil.json b/src/generated/resources/assets/bloodmagic/models/item/divinationsigil.json new file mode 100644 index 00000000..63a6f8ad --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/divinationsigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/divinationsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/etherealslate.json b/src/generated/resources/assets/bloodmagic/models/item/etherealslate.json new file mode 100644 index 00000000..1ef42d33 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/etherealslate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/etherealslate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/growthsigil.json b/src/generated/resources/assets/bloodmagic/models/item/growthsigil.json new file mode 100644 index 00000000..545030bf --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/growthsigil.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/growthsigil_deactivated" + }, + { + "predicate": { + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/growthsigil_activated" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/icesigil.json b/src/generated/resources/assets/bloodmagic/models/item/icesigil.json new file mode 100644 index 00000000..67d4348e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/icesigil.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/icesigil_deactivated" + }, + { + "predicate": { + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/icesigil_activated" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/infusedslate.json b/src/generated/resources/assets/bloodmagic/models/item/infusedslate.json new file mode 100644 index 00000000..740b02e3 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/infusedslate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/infusedslate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/lavasigil.json b/src/generated/resources/assets/bloodmagic/models/item/lavasigil.json new file mode 100644 index 00000000..0bb30f15 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/lavasigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/lavasigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/magicianbloodorb.json b/src/generated/resources/assets/bloodmagic/models/item/magicianbloodorb.json new file mode 100644 index 00000000..b20996e9 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/magicianbloodorb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/magicianbloodorb" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/masterbloodorb.json b/src/generated/resources/assets/bloodmagic/models/item/masterbloodorb.json new file mode 100644 index 00000000..8f610344 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/masterbloodorb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/masterbloodorb" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/miningsigil.json b/src/generated/resources/assets/bloodmagic/models/item/miningsigil.json new file mode 100644 index 00000000..f2f8923a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/miningsigil.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/miningsigil_deactivated" + }, + { + "predicate": { + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/miningsigil_activated" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/orbcapacityrune.json b/src/generated/resources/assets/bloodmagic/models/item/orbcapacityrune.json new file mode 100644 index 00000000..c851584c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/orbcapacityrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/orbcapacityrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentair.json b/src/generated/resources/assets/bloodmagic/models/item/reagentair.json new file mode 100644 index 00000000..d9fcf24e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentair.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentair" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentbloodlight.json b/src/generated/resources/assets/bloodmagic/models/item/reagentbloodlight.json new file mode 100644 index 00000000..bf54ca70 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentbloodlight.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentbloodlight" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentfastminer.json b/src/generated/resources/assets/bloodmagic/models/item/reagentfastminer.json new file mode 100644 index 00000000..679e78e3 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentfastminer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentfastminer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentgrowth.json b/src/generated/resources/assets/bloodmagic/models/item/reagentgrowth.json new file mode 100644 index 00000000..9a54fd87 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentgrowth.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentgrowth" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentlava.json b/src/generated/resources/assets/bloodmagic/models/item/reagentlava.json new file mode 100644 index 00000000..542efbd6 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentlava.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentlava" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentmagnetism.json b/src/generated/resources/assets/bloodmagic/models/item/reagentmagnetism.json new file mode 100644 index 00000000..45334c4a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentmagnetism.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentmagnetism" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentvoid.json b/src/generated/resources/assets/bloodmagic/models/item/reagentvoid.json new file mode 100644 index 00000000..313e8d91 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentvoid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentvoid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reagentwater.json b/src/generated/resources/assets/bloodmagic/models/item/reagentwater.json new file mode 100644 index 00000000..cd6aa9a9 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reagentwater.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reagentwater" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/reinforcedslate.json b/src/generated/resources/assets/bloodmagic/models/item/reinforcedslate.json new file mode 100644 index 00000000..73ca020e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/reinforcedslate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/reinforcedslate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/sacrificerune.json b/src/generated/resources/assets/bloodmagic/models/item/sacrificerune.json new file mode 100644 index 00000000..dcbe6138 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/sacrificerune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/sacrificerune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/sacrificialdagger.json b/src/generated/resources/assets/bloodmagic/models/item/sacrificialdagger.json new file mode 100644 index 00000000..20e1c9f1 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/sacrificialdagger.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/sacrificialdagger" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/selfsacrificerune.json b/src/generated/resources/assets/bloodmagic/models/item/selfsacrificerune.json new file mode 100644 index 00000000..ab853e7b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/selfsacrificerune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/selfsacrificerune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/sigilofmagnetism.json b/src/generated/resources/assets/bloodmagic/models/item/sigilofmagnetism.json new file mode 100644 index 00000000..8a5253db --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/sigilofmagnetism.json @@ -0,0 +1,16 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/sigilofmagnetism_deactivated" + }, + { + "predicate": { + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/sigilofmagnetism_activated" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/soulgemcommon.json b/src/generated/resources/assets/bloodmagic/models/item/soulgemcommon.json new file mode 100644 index 00000000..7629117a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/soulgemcommon.json @@ -0,0 +1,34 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:type": 0.0 + }, + "model": "bloodmagic:item/variants/soulgemcommon" + }, + { + "predicate": { + "bloodmagic:type": 1.0 + }, + "model": "bloodmagic:item/variants/soulgemcommon_corrosive" + }, + { + "predicate": { + "bloodmagic:type": 2.0 + }, + "model": "bloodmagic:item/variants/soulgemcommon_destructive" + }, + { + "predicate": { + "bloodmagic:type": 3.0 + }, + "model": "bloodmagic:item/variants/soulgemcommon_vengeful" + }, + { + "predicate": { + "bloodmagic:type": 4.0 + }, + "model": "bloodmagic:item/variants/soulgemcommon_steadfast" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/soulgemlesser.json b/src/generated/resources/assets/bloodmagic/models/item/soulgemlesser.json new file mode 100644 index 00000000..3489ce2f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/soulgemlesser.json @@ -0,0 +1,34 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:type": 0.0 + }, + "model": "bloodmagic:item/variants/soulgemlesser" + }, + { + "predicate": { + "bloodmagic:type": 1.0 + }, + "model": "bloodmagic:item/variants/soulgemlesser_corrosive" + }, + { + "predicate": { + "bloodmagic:type": 2.0 + }, + "model": "bloodmagic:item/variants/soulgemlesser_destructive" + }, + { + "predicate": { + "bloodmagic:type": 3.0 + }, + "model": "bloodmagic:item/variants/soulgemlesser_vengeful" + }, + { + "predicate": { + "bloodmagic:type": 4.0 + }, + "model": "bloodmagic:item/variants/soulgemlesser_steadfast" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/soulgempetty.json b/src/generated/resources/assets/bloodmagic/models/item/soulgempetty.json new file mode 100644 index 00000000..b8c2358c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/soulgempetty.json @@ -0,0 +1,34 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:type": 0.0 + }, + "model": "bloodmagic:item/variants/soulgempetty" + }, + { + "predicate": { + "bloodmagic:type": 1.0 + }, + "model": "bloodmagic:item/variants/soulgempetty_corrosive" + }, + { + "predicate": { + "bloodmagic:type": 2.0 + }, + "model": "bloodmagic:item/variants/soulgempetty_destructive" + }, + { + "predicate": { + "bloodmagic:type": 3.0 + }, + "model": "bloodmagic:item/variants/soulgempetty_vengeful" + }, + { + "predicate": { + "bloodmagic:type": 4.0 + }, + "model": "bloodmagic:item/variants/soulgempetty_steadfast" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/soulsnare.json b/src/generated/resources/assets/bloodmagic/models/item/soulsnare.json new file mode 100644 index 00000000..45b82d85 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/soulsnare.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsnare" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/soulsword.json b/src/generated/resources/assets/bloodmagic/models/item/soulsword.json new file mode 100644 index 00000000..47e58c18 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/soulsword.json @@ -0,0 +1,74 @@ +{ + "overrides": [ + { + "predicate": { + "bloodmagic:type": 0.0, + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/soulsword_deactivated" + }, + { + "predicate": { + "bloodmagic:type": 1.0, + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/soulsword_corrosive_deactivated" + }, + { + "predicate": { + "bloodmagic:type": 2.0, + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/soulsword_destructive_deactivated" + }, + { + "predicate": { + "bloodmagic:type": 3.0, + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/soulsword_vengeful_deactivated" + }, + { + "predicate": { + "bloodmagic:type": 4.0, + "bloodmagic:active": 0.0 + }, + "model": "bloodmagic:item/variants/soulsword_steadfast_deactivated" + }, + { + "predicate": { + "bloodmagic:type": 0.0, + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/soulsword_activated" + }, + { + "predicate": { + "bloodmagic:type": 1.0, + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/soulsword_corrosive_activated" + }, + { + "predicate": { + "bloodmagic:type": 2.0, + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/soulsword_destructive_activated" + }, + { + "predicate": { + "bloodmagic:type": 3.0, + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/soulsword_vengeful_activated" + }, + { + "predicate": { + "bloodmagic:type": 4.0, + "bloodmagic:active": 1.0 + }, + "model": "bloodmagic:item/variants/soulsword_steadfast_activated" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/speedrune.json b/src/generated/resources/assets/bloodmagic/models/item/speedrune.json new file mode 100644 index 00000000..d2bec661 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/speedrune.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/speedrune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_activated.json new file mode 100644 index 00000000..0f5b60bd --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/growthsigil_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_deactivated.json new file mode 100644 index 00000000..5d14ea40 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/growthsigil_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/growthsigil_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_activated.json new file mode 100644 index 00000000..9f6e940a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/icesigil_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_deactivated.json new file mode 100644 index 00000000..5a461a5d --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/icesigil_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/icesigil_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_activated.json new file mode 100644 index 00000000..12877c52 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/miningsigil_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_deactivated.json new file mode 100644 index 00000000..858e701f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/miningsigil_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/miningsigil_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json new file mode 100644 index 00000000..b49d9096 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/sigilofmagnetism_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json new file mode 100644 index 00000000..f0b2fa42 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/sigilofmagnetism_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/sigilofmagnetism_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon.json new file mode 100644 index 00000000..460ba68b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemcommon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_corrosive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_corrosive.json new file mode 100644 index 00000000..0fa3a377 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_corrosive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemcommon_corrosive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_destructive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_destructive.json new file mode 100644 index 00000000..2e30b739 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_destructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemcommon_destructive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_steadfast.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_steadfast.json new file mode 100644 index 00000000..56b5b375 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_steadfast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemcommon_steadfast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_vengeful.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_vengeful.json new file mode 100644 index 00000000..fc3b3fd5 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemcommon_vengeful.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemcommon_vengeful" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser.json new file mode 100644 index 00000000..7a253c28 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemlesser" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_corrosive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_corrosive.json new file mode 100644 index 00000000..a191b1f6 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_corrosive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemlesser_corrosive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_destructive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_destructive.json new file mode 100644 index 00000000..241d5b93 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_destructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemlesser_destructive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_steadfast.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_steadfast.json new file mode 100644 index 00000000..9ea458c2 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_steadfast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemlesser_steadfast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_vengeful.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_vengeful.json new file mode 100644 index 00000000..dbc3cc32 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgemlesser_vengeful.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgemlesser_vengeful" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty.json new file mode 100644 index 00000000..3085ac3b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgempetty" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_corrosive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_corrosive.json new file mode 100644 index 00000000..b5c185ea --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_corrosive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgempetty_corrosive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_destructive.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_destructive.json new file mode 100644 index 00000000..955e2c62 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_destructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgempetty_destructive" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_steadfast.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_steadfast.json new file mode 100644 index 00000000..5031e33f --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_steadfast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgempetty_steadfast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_vengeful.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_vengeful.json new file mode 100644 index 00000000..e7ae0df4 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulgempetty_vengeful.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulgempetty_vengeful" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_activated.json new file mode 100644 index 00000000..9ade5a1a --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_activated.json new file mode 100644 index 00000000..55c0bb87 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_corrosive_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_deactivated.json new file mode 100644 index 00000000..610f36ce --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_corrosive_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_corrosive_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_deactivated.json new file mode 100644 index 00000000..c87c8ee7 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_activated.json new file mode 100644 index 00000000..e34becaa --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_destructive_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_deactivated.json new file mode 100644 index 00000000..78ddb49b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_destructive_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_destructive_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_activated.json new file mode 100644 index 00000000..40313e52 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_steadfast_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_deactivated.json new file mode 100644 index 00000000..13aa70f1 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_steadfast_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_steadfast_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_activated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_activated.json new file mode 100644 index 00000000..1547ea7e --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_activated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_vengeful_activated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json new file mode 100644 index 00000000..64c72e95 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/variants/soulsword_vengeful_deactivated.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/soulsword_vengeful_deactivated" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/voidsigil.json b/src/generated/resources/assets/bloodmagic/models/item/voidsigil.json new file mode 100644 index 00000000..cb05222b --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/voidsigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/voidsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/watersigil.json b/src/generated/resources/assets/bloodmagic/models/item/watersigil.json new file mode 100644 index 00000000..8835296c --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/watersigil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/watersigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/bloodmagic/models/item/weakbloodorb.json b/src/generated/resources/assets/bloodmagic/models/item/weakbloodorb.json new file mode 100644 index 00000000..3fd10ae6 --- /dev/null +++ b/src/generated/resources/assets/bloodmagic/models/item/weakbloodorb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "bloodmagic:item/weakbloodorb" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json new file mode 100644 index 00000000..616d7793 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_altar.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_altar" + ] + }, + "criteria": { + "has_will": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:basemonstersoul" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_altar" + } + } + }, + "requirements": [ + [ + "has_will", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json new file mode 100644 index 00000000..3de3b9d5 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_blank.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_blank" + ] + }, + "criteria": { + "has_weak_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:weakbloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_blank" + } + } + }, + "requirements": [ + [ + "has_weak_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json new file mode 100644 index 00000000..85b29fb4 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_capacity.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_capacity" + ] + }, + "criteria": { + "has_imbued_slate": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:infusedslate" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_capacity" + } + } + }, + "requirements": [ + [ + "has_imbued_slate", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_charging.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_charging.json new file mode 100644 index 00000000..c2add425 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_charging.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_charging" + ] + }, + "criteria": { + "has_master_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:masterbloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_charging" + } + } + }, + "requirements": [ + [ + "has_master_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_orb.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_orb.json new file mode 100644 index 00000000..46aaf95c --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_orb.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_orb" + ] + }, + "criteria": { + "has_master_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:masterbloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_orb" + } + } + }, + "requirements": [ + [ + "has_master_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_sacrifice.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_sacrifice.json new file mode 100644 index 00000000..2b7ee148 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_sacrifice.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_sacrifice" + ] + }, + "criteria": { + "has_apprentice_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:apprenticebloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_sacrifice" + } + } + }, + "requirements": [ + [ + "has_apprentice_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json new file mode 100644 index 00000000..076daaee --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_self_sacrifice.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_self_sacrifice" + ] + }, + "criteria": { + "has_apprentice_orb": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:apprenticebloodorb" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_self_sacrifice" + } + } + }, + "requirements": [ + [ + "has_apprentice_orb", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json new file mode 100644 index 00000000..7a866e04 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/blood_rune_speed.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:blood_rune_speed" + ] + }, + "criteria": { + "has_blank_rune": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "bloodmagic:blankrune" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:blood_rune_speed" + } + } + }, + "requirements": [ + [ + "has_blank_rune", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json new file mode 100644 index 00000000..744c16e1 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/sacrificial_dagger.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:sacrificial_dagger" + ] + }, + "criteria": { + "has_glass": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:glass" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:sacrificial_dagger" + } + } + }, + "requirements": [ + [ + "has_glass", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_forge.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_forge.json new file mode 100644 index 00000000..b8553a53 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_forge.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:soul_forge" + ] + }, + "criteria": { + "has_gold": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:gold_ingot" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:soul_forge" + } + } + }, + "requirements": [ + [ + "has_gold", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json new file mode 100644 index 00000000..0c03b3ab --- /dev/null +++ b/src/generated/resources/data/bloodmagic/advancements/recipes/bloodmagictab/soul_snare.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "bloodmagic:soul_snare" + ] + }, + "criteria": { + "has_redstone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "minecraft:redstone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "bloodmagic:soul_snare" + } + } + }, + "requirements": [ + [ + "has_redstone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/accelerationrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/accelerationrune.json new file mode 100644 index 00000000..bff0c94d --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/accelerationrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:accelerationrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemyarray.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemyarray.json new file mode 100644 index 00000000..f27b7f82 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/alchemyarray.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "bloodmagic:alchemyarray", + "rolls": 1.0, + "entries": [] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/altar.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/altar.json new file mode 100644 index 00000000..49c1cf36 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/altar.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:altar" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/altarcapacityrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/altarcapacityrune.json new file mode 100644 index 00000000..a71126ce --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/altarcapacityrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:altarcapacityrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/bettercapacityrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/bettercapacityrune.json new file mode 100644 index 00000000..eb0cce26 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/bettercapacityrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:bettercapacityrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/blankrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/blankrune.json new file mode 100644 index 00000000..80a59b7a --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/blankrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:blankrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/bloodlight.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/bloodlight.json new file mode 100644 index 00000000..20e1ab88 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/bloodlight.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "bloodmagic:bloodlight", + "rolls": 1.0, + "entries": [] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/chargingrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/chargingrune.json new file mode 100644 index 00000000..66c32d3f --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/chargingrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:chargingrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/dislocationrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/dislocationrune.json new file mode 100644 index 00000000..d158c403 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/dislocationrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:dislocationrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/orbcapacityrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/orbcapacityrune.json new file mode 100644 index 00000000..239dcb53 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/orbcapacityrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:orbcapacityrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/sacrificerune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/sacrificerune.json new file mode 100644 index 00000000..30afc854 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/sacrificerune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:sacrificerune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/selfsacrificerune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/selfsacrificerune.json new file mode 100644 index 00000000..edbac39e --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/selfsacrificerune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:selfsacrificerune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/soulforge.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/soulforge.json new file mode 100644 index 00000000..32b39be4 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/soulforge.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:soulforge" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/loot_tables/blocks/speedrune.json b/src/generated/resources/data/bloodmagic/loot_tables/blocks/speedrune.json new file mode 100644 index 00000000..37341278 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/loot_tables/blocks/speedrune.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "bloodmagic:speedrune" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/apprenticebloodorb.json b/src/generated/resources/data/bloodmagic/recipes/altar/apprenticebloodorb.json new file mode 100644 index 00000000..3637afb8 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/apprenticebloodorb.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:storage_blocks/redstone" + }, + "output": { + "item": "bloodmagic:apprenticebloodorb" + }, + "upgradeLevel": 1, + "altarSyphon": 5000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/daggerofsacrifice.json b/src/generated/resources/data/bloodmagic/recipes/altar/daggerofsacrifice.json new file mode 100644 index 00000000..f1d7fc16 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/daggerofsacrifice.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "minecraft:iron_sword" + }, + "output": { + "item": "bloodmagic:daggerofsacrifice" + }, + "upgradeLevel": 1, + "altarSyphon": 3000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/demonicslate.json b/src/generated/resources/data/bloodmagic/recipes/altar/demonicslate.json new file mode 100644 index 00000000..60a29822 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/demonicslate.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "bloodmagic:infusedslate" + }, + "output": { + "item": "bloodmagic:demonslate" + }, + "upgradeLevel": 3, + "altarSyphon": 15000, + "consumptionRate": 20, + "drainRate": 20 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/imbuedslate.json b/src/generated/resources/data/bloodmagic/recipes/altar/imbuedslate.json new file mode 100644 index 00000000..b1a577b1 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/imbuedslate.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "bloodmagic:reinforcedslate" + }, + "output": { + "item": "bloodmagic:infusedslate" + }, + "upgradeLevel": 2, + "altarSyphon": 5000, + "consumptionRate": 15, + "drainRate": 10 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/magicianbloodorb.json b/src/generated/resources/data/bloodmagic/recipes/altar/magicianbloodorb.json new file mode 100644 index 00000000..941c312f --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/magicianbloodorb.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:storage_blocks/gold" + }, + "output": { + "item": "bloodmagic:magicianbloodorb" + }, + "upgradeLevel": 2, + "altarSyphon": 25000, + "consumptionRate": 20, + "drainRate": 20 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json b/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json new file mode 100644 index 00000000..9e16f279 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/reinforcedslate.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "item": "bloodmagic:blankslate" + }, + "output": { + "item": "bloodmagic:reinforcedslate" + }, + "upgradeLevel": 2, + "altarSyphon": 2000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/slate.json b/src/generated/resources/data/bloodmagic/recipes/altar/slate.json new file mode 100644 index 00000000..3be29e67 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/slate.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:stone" + }, + "output": { + "item": "bloodmagic:blankslate" + }, + "upgradeLevel": 0, + "altarSyphon": 1000, + "consumptionRate": 5, + "drainRate": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/altar/weakbloodorb.json b/src/generated/resources/data/bloodmagic/recipes/altar/weakbloodorb.json new file mode 100644 index 00000000..e489f7e0 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/altar/weakbloodorb.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:altar", + "input": { + "tag": "forge:gems/diamond" + }, + "output": { + "item": "bloodmagic:weakbloodorb" + }, + "upgradeLevel": 0, + "altarSyphon": 2000, + "consumptionRate": 2, + "drainRate": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/airsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/airsigil.json new file mode 100644 index 00000000..7cd5e7ff --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/airsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/airsigil.png", + "baseinput": { + "item": "bloodmagic:reagentair" + }, + "addedinput": { + "item": "bloodmagic:reinforcedslate" + }, + "output": { + "item": "bloodmagic:airsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/bloodlightsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/bloodlightsigil.json new file mode 100644 index 00000000..2e6e3e48 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/bloodlightsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/lightsigil.png", + "baseinput": { + "item": "bloodmagic:reagentbloodlight" + }, + "addedinput": { + "item": "bloodmagic:infusedslate" + }, + "output": { + "item": "bloodmagic:bloodlightsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/divinationsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/divinationsigil.json new file mode 100644 index 00000000..b7b8d0bf --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/divinationsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/divinationsigil.png", + "baseinput": { + "item": "minecraft:redstone" + }, + "addedinput": { + "item": "bloodmagic:blankslate" + }, + "output": { + "item": "bloodmagic:divinationsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/fastminersigil.json b/src/generated/resources/data/bloodmagic/recipes/array/fastminersigil.json new file mode 100644 index 00000000..b3644330 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/fastminersigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/fastminersigil.png", + "baseinput": { + "item": "bloodmagic:reagentfastminer" + }, + "addedinput": { + "item": "bloodmagic:reinforcedslate" + }, + "output": { + "item": "bloodmagic:miningsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/growthsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/growthsigil.json new file mode 100644 index 00000000..22e90ecc --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/growthsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/growthsigil.png", + "baseinput": { + "item": "bloodmagic:reagentgrowth" + }, + "addedinput": { + "item": "bloodmagic:reinforcedslate" + }, + "output": { + "item": "bloodmagic:growthsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/lavasigil.json b/src/generated/resources/data/bloodmagic/recipes/array/lavasigil.json new file mode 100644 index 00000000..f71cd318 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/lavasigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/lavasigil.png", + "baseinput": { + "item": "bloodmagic:reagentlava" + }, + "addedinput": { + "item": "bloodmagic:blankslate" + }, + "output": { + "item": "bloodmagic:lavasigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/magnetismsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/magnetismsigil.json new file mode 100644 index 00000000..324ec177 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/magnetismsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/magnetismsigil.png", + "baseinput": { + "item": "bloodmagic:reagentmagnetism" + }, + "addedinput": { + "item": "bloodmagic:infusedslate" + }, + "output": { + "item": "bloodmagic:sigilofmagnetism" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/voidsigil.json b/src/generated/resources/data/bloodmagic/recipes/array/voidsigil.json new file mode 100644 index 00000000..4d10c446 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/voidsigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/voidsigil.png", + "baseinput": { + "item": "bloodmagic:reagentvoid" + }, + "addedinput": { + "item": "bloodmagic:reinforcedslate" + }, + "output": { + "item": "bloodmagic:voidsigil" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/array/watersigil.json b/src/generated/resources/data/bloodmagic/recipes/array/watersigil.json new file mode 100644 index 00000000..0862f909 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/array/watersigil.json @@ -0,0 +1,13 @@ +{ + "type": "bloodmagic:array", + "texture": "bloodmagic:textures/models/alchemyarrays/watersigil.png", + "baseinput": { + "item": "bloodmagic:reagentwater" + }, + "addedinput": { + "item": "bloodmagic:blankslate" + }, + "output": { + "item": "bloodmagic:watersigil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/altar.json b/src/generated/resources/data/bloodmagic/recipes/blood_altar.json similarity index 61% rename from src/main/resources/assets/bloodmagic/recipes/altar.json rename to src/generated/resources/data/bloodmagic/recipes/blood_altar.json index f346a26f..0985743c 100644 --- a/src/main/resources/assets/bloodmagic/recipes/altar.json +++ b/src/generated/resources/data/bloodmagic/recipes/blood_altar.json @@ -1,26 +1,25 @@ { - "result": { - "item": "bloodmagic:altar" - }, + "type": "minecraft:crafting_shaped", "pattern": [ "a a", "aba", "cdc" ], - "type": "forge:ore_shaped", "key": { "a": { - "item": "#STONE" + "tag": "forge:stone" }, "b": { "item": "minecraft:furnace" }, "c": { - "item": "#INGOTGOLD" + "tag": "forge:ingots/gold" }, "d": { - "item": "bloodmagic:monster_soul", - "data": 0 + "item": "bloodmagic:basemonstersoul" } + }, + "result": { + "item": "bloodmagic:altar" } } \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_blank.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_blank.json new file mode 100644 index 00000000..698aa70e --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_blank.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aaa", + "sos", + "aaa" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "s": { + "item": "bloodmagic:blankslate" + }, + "o": { + "type": "bloodmagic:bloodorb", + "orb_tier": 1 + } + }, + "result": { + "item": "bloodmagic:blankrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_capacity.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_capacity.json new file mode 100644 index 00000000..daf3fef6 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_capacity.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "bcb", + "ada" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "b": { + "item": "minecraft:bucket" + }, + "c": { + "item": "bloodmagic:blankrune" + }, + "d": { + "item": "bloodmagic:infusedslate" + } + }, + "result": { + "item": "bloodmagic:altarcapacityrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_charging.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_charging.json new file mode 100644 index 00000000..acd341f6 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_charging.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "RsR", + "GrG", + "ReR" + ], + "key": { + "R": { + "tag": "forge:dusts/redstone" + }, + "r": { + "item": "bloodmagic:blankrune" + }, + "s": { + "item": "bloodmagic:demonslate" + }, + "e": { + "type": "bloodmagic:bloodorb", + "orb_tier": 4 + }, + "G": { + "tag": "forge:dusts/glowstone" + } + }, + "result": { + "item": "bloodmagic:chargingrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_orb.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_orb.json new file mode 100644 index 00000000..1ca7d126 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_orb.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "cdc", + "aba" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "b": { + "type": "bloodmagic:bloodorb", + "orb_tier": 1 + }, + "c": { + "item": "bloodmagic:blankrune" + }, + "d": { + "type": "bloodmagic:bloodorb", + "orb_tier": 4 + } + }, + "result": { + "item": "bloodmagic:orbcapacityrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_sacrifice.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_sacrifice.json new file mode 100644 index 00000000..3d43229b --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_sacrifice.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "cdc", + "aea" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "b": { + "item": "bloodmagic:reinforcedslate" + }, + "c": { + "tag": "forge:ingots/gold" + }, + "d": { + "item": "bloodmagic:blankrune" + }, + "e": { + "type": "bloodmagic:bloodorb", + "orb_tier": 2 + } + }, + "result": { + "item": "bloodmagic:sacrificerune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_self_sacrifice.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_self_sacrifice.json new file mode 100644 index 00000000..054a70d8 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_self_sacrifice.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "cdc", + "aea" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "b": { + "item": "bloodmagic:reinforcedslate" + }, + "c": { + "item": "minecraft:glowstone_dust" + }, + "d": { + "item": "bloodmagic:blankrune" + }, + "e": { + "type": "bloodmagic:bloodorb", + "orb_tier": 2 + } + }, + "result": { + "item": "bloodmagic:selfsacrificerune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/blood_rune_speed.json b/src/generated/resources/data/bloodmagic/recipes/blood_rune_speed.json new file mode 100644 index 00000000..7ef75bfc --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/blood_rune_speed.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "aba", + "cdc", + "aba" + ], + "key": { + "a": { + "tag": "forge:stone" + }, + "b": { + "item": "bloodmagic:blankslate" + }, + "c": { + "item": "minecraft:sugar" + }, + "d": { + "item": "bloodmagic:blankrune" + } + }, + "result": { + "item": "bloodmagic:speedrune" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/sacrificial_dagger.json b/src/generated/resources/data/bloodmagic/recipes/sacrificial_dagger.json new file mode 100644 index 00000000..23a4dcab --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/sacrificial_dagger.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ggg", + " Gg", + "i g" + ], + "key": { + "g": { + "tag": "forge:glass" + }, + "G": { + "tag": "forge:ingots/gold" + }, + "i": { + "tag": "forge:ingots/iron" + } + }, + "result": { + "item": "bloodmagic:sacrificialdagger" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soul_forge.json b/src/generated/resources/data/bloodmagic/recipes/soul_forge.json new file mode 100644 index 00000000..0916ce88 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soul_forge.json @@ -0,0 +1,25 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "i i", + "sgs", + "sos" + ], + "key": { + "s": { + "tag": "forge:stone" + }, + "g": { + "tag": "forge:ingots/gold" + }, + "i": { + "tag": "forge:ingots/iron" + }, + "o": { + "tag": "forge:storage_blocks/iron" + } + }, + "result": { + "item": "bloodmagic:soulforge" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soul_snare.json b/src/generated/resources/data/bloodmagic/recipes/soul_snare.json new file mode 100644 index 00000000..a6cb99f2 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soul_snare.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "sis", + "iri", + "sis" + ], + "key": { + "r": { + "tag": "forge:dusts/redstone" + }, + "s": { + "tag": "forge:string" + }, + "i": { + "tag": "forge:ingots/iron" + } + }, + "result": { + "item": "bloodmagic:soulsnare", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/arcaneashes.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/arcaneashes.json new file mode 100644 index 00000000..70e27273 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/arcaneashes.json @@ -0,0 +1,21 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "tag": "forge:dusts/redstone" + }, + "input1": { + "tag": "forge:dyes/white" + }, + "input2": { + "tag": "forge:gunpowder" + }, + "input3": { + "tag": "minecraft:coals" + }, + "output": { + "item": "bloodmagic:arcaneashes", + "nbt": "{Damage:0}" + }, + "minimumDrain": 0.0, + "drain": 0.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/commontartaricgem.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/commontartaricgem.json new file mode 100644 index 00000000..c87b1cc0 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/commontartaricgem.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "bloodmagic:soulgemlesser" + }, + "input1": { + "tag": "forge:gems/diamond" + }, + "input2": { + "tag": "forge:storage_blocks/gold" + }, + "input3": { + "item": "bloodmagic:infusedslate" + }, + "output": { + "item": "bloodmagic:soulgemcommon" + }, + "minimumDrain": 240.0, + "drain": 50.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/lessertartaricgem.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/lessertartaricgem.json new file mode 100644 index 00000000..cf5f5b19 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/lessertartaricgem.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "bloodmagic:soulgempetty" + }, + "input1": { + "tag": "forge:gems/diamond" + }, + "input2": { + "tag": "forge:storage_blocks/redstone" + }, + "input3": { + "tag": "forge:storage_blocks/lapis" + }, + "output": { + "item": "bloodmagic:soulgemlesser" + }, + "minimumDrain": 60.0, + "drain": 20.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/pettytartaricgem.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/pettytartaricgem.json new file mode 100644 index 00000000..10c7417a --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/pettytartaricgem.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "tag": "forge:dusts/redstone" + }, + "input1": { + "tag": "forge:ingots/gold" + }, + "input2": { + "tag": "forge:glass" + }, + "input3": { + "tag": "forge:gems/lapis" + }, + "output": { + "item": "bloodmagic:soulgempetty" + }, + "minimumDrain": 1.0, + "drain": 1.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_fastminer.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_fastminer.json new file mode 100644 index 00000000..57d85e28 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_fastminer.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "minecraft:iron_pickaxe" + }, + "input1": { + "item": "minecraft:iron_axe" + }, + "input2": { + "item": "minecraft:iron_shovel" + }, + "input3": { + "tag": "forge:gunpowder" + }, + "output": { + "item": "bloodmagic:reagentfastminer" + }, + "minimumDrain": 128.0, + "drain": 20.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_growth.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_growth.json new file mode 100644 index 00000000..60fc06d0 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_growth.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "tag": "minecraft:saplings" + }, + "input1": { + "tag": "minecraft:saplings" + }, + "input2": { + "item": "minecraft:sugar_cane" + }, + "input3": { + "item": "minecraft:sugar" + }, + "output": { + "item": "bloodmagic:reagentgrowth" + }, + "minimumDrain": 128.0, + "drain": 20.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_lava.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_lava.json new file mode 100644 index 00000000..cb11cff3 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_lava.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "minecraft:lava_bucket" + }, + "input1": { + "tag": "forge:dusts/redstone" + }, + "input2": { + "tag": "forge:cobblestone" + }, + "input3": { + "tag": "forge:storage_blocks/coal" + }, + "output": { + "item": "bloodmagic:reagentlava" + }, + "minimumDrain": 32.0, + "drain": 10.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_magnetism.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_magnetism.json new file mode 100644 index 00000000..6857c571 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_magnetism.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "tag": "forge:string" + }, + "input1": { + "tag": "forge:ingots/gold" + }, + "input2": { + "tag": "forge:ingots/gold" + }, + "input3": { + "tag": "forge:storage_blocks/iron" + }, + "output": { + "item": "bloodmagic:reagentmagnetism" + }, + "minimumDrain": 600.0, + "drain": 10.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_void.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_void.json new file mode 100644 index 00000000..b3df934b --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_void.json @@ -0,0 +1,20 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "minecraft:bucket" + }, + "input1": { + "tag": "forge:string" + }, + "input2": { + "tag": "forge:string" + }, + "input3": { + "tag": "forge:gunpowder" + }, + "output": { + "item": "bloodmagic:reagentvoid" + }, + "minimumDrain": 64.0, + "drain": 10.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_water.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_water.json new file mode 100644 index 00000000..425d066c --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/reagent_water.json @@ -0,0 +1,17 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "minecraft:sugar" + }, + "input1": { + "item": "minecraft:water_bucket" + }, + "input2": { + "item": "minecraft:water_bucket" + }, + "output": { + "item": "bloodmagic:reagentwater" + }, + "minimumDrain": 10.0, + "drain": 3.0 +} \ No newline at end of file diff --git a/src/generated/resources/data/bloodmagic/recipes/soulforge/sentientsword.json b/src/generated/resources/data/bloodmagic/recipes/soulforge/sentientsword.json new file mode 100644 index 00000000..ca642e55 --- /dev/null +++ b/src/generated/resources/data/bloodmagic/recipes/soulforge/sentientsword.json @@ -0,0 +1,15 @@ +{ + "type": "bloodmagic:soulforge", + "input0": { + "item": "bloodmagic:soulgempetty" + }, + "input1": { + "item": "minecraft:iron_sword" + }, + "output": { + "item": "bloodmagic:soulsword", + "nbt": "{Damage:0}" + }, + "minimumDrain": 0.0, + "drain": 0.0 +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 19437999..3ad54158 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -1,124 +1,233 @@ -package WayofTime.bloodmagic; +package wayoftime.bloodmagic; -import WayofTime.bloodmagic.api.BloodMagicPlugin; -import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.ritual.RitualManager; -import WayofTime.bloodmagic.client.gui.GuiHandler; -import WayofTime.bloodmagic.command.CommandBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.meteor.MeteorConfigHandler; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.proxy.CommonProxy; -import WayofTime.bloodmagic.registry.*; -import WayofTime.bloodmagic.structures.ModDungeons; -import WayofTime.bloodmagic.util.PluginUtil; -import WayofTime.bloodmagic.util.handler.IMCHandler; -import com.google.common.collect.Lists; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.gson.Gson; + +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; -import net.minecraft.launchwrapper.Launch; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fml.common.Loader; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.potion.Effect; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.*; -import net.minecraftforge.fml.common.network.NetworkRegistry; -import org.apache.commons.lang3.tuple.Pair; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; +import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.BloodMagicCorePlugin; +import wayoftime.bloodmagic.client.ClientEvents; +import wayoftime.bloodmagic.client.render.entity.BloodLightRenderer; +import wayoftime.bloodmagic.client.render.entity.SoulSnareRenderer; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.data.GeneratorBaseRecipes; +import wayoftime.bloodmagic.common.data.GeneratorBlockStates; +import wayoftime.bloodmagic.common.data.GeneratorItemModels; +import wayoftime.bloodmagic.common.data.GeneratorLanguage; +import wayoftime.bloodmagic.common.data.GeneratorLootTable; +import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeProvider; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes; +import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; +import wayoftime.bloodmagic.core.recipe.IngredientBloodOrb; +import wayoftime.bloodmagic.core.registry.OrbRegistry; +import wayoftime.bloodmagic.network.BloodMagicPacketHandler; +import wayoftime.bloodmagic.potion.BloodMagicPotions; +import wayoftime.bloodmagic.tile.TileAlchemyArray; +import wayoftime.bloodmagic.tile.TileAltar; +import wayoftime.bloodmagic.tile.TileSoulForge; +import wayoftime.bloodmagic.util.handler.event.GenericHandler; +import wayoftime.bloodmagic.util.handler.event.WillHandler; -import java.io.File; -import java.util.List; +@Mod("bloodmagic") +//@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +public class BloodMagic +{ + public static final String MODID = "bloodmagic"; + // Directly reference a log4j logger. + private static final Logger LOGGER = LogManager.getLogger(); -@Mod(modid = BloodMagic.MODID, name = BloodMagic.NAME, version = BloodMagic.VERSION, dependencies = BloodMagic.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.GuiBloodMagicConfig$Factory") -public class BloodMagic { - public static final String MODID = "bloodmagic"; - public static final String NAME = "Blood Magic: Alchemical Wizardry"; - public static final String VERSION = "@VERSION@"; - public static final String DEPEND = "required-after:guideapi;"; - public static final boolean IS_DEV = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); - public static final List> PLUGINS = Lists.newArrayList(); - public static final RitualManager RITUAL_MANAGER = new RitualManager(new Configuration(new File(Loader.instance().getConfigDir(), MODID + "/" + "rituals.cfg"))); - public static final ItemGroup TAB_BM = new ItemGroup(MODID + ".creativeTab") { - @Override - public ItemStack createIcon() { - return OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK); - } - }; - public static ItemGroup TAB_TOMES = new ItemGroup(MODID + ".creativeTabTome") { - @Override - public ItemStack createIcon() { - return new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); - } + private static Gson GSON = null; - @Override - public boolean hasSearchBar() { - return true; - } - }.setNoTitle().setBackgroundImageName("item_search.png"); + public static final BloodMagicPacketHandler packetHandler = new BloodMagicPacketHandler(); - @SidedProxy(serverSide = "WayofTime.bloodmagic.proxy.CommonProxy", clientSide = "WayofTime.bloodmagic.proxy.ClientProxy") - public static CommonProxy proxy; - @Mod.Instance(BloodMagic.MODID) - public static BloodMagic instance; + public BloodMagic() + { + IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); - static { - FluidRegistry.enableUniversalBucket(); - } + modBus.addListener(this::setup); + modBus.addListener(this::onLoadComplete); - private File configDir; + BloodMagicBlocks.BLOCKS.register(modBus); + BloodMagicItems.ITEMS.register(modBus); +// RegistrarBloodMagic.BLOOD_ORBS.createAndRegister(modBus, "bloodorbs"); + BloodMagicItems.BLOOD_ORBS.createAndRegister(modBus, "bloodorbs"); + BloodMagicItems.BASICITEMS.register(modBus); + BloodMagicBlocks.BASICBLOCKS.register(modBus); + BloodMagicBlocks.FLUIDS.register(modBus); + BloodMagicBlocks.CONTAINERS.register(modBus); + BloodMagicEntityTypes.ENTITY_TYPES.register(modBus); - @Mod.EventHandler - public void preInit(FMLPreInitializationEvent event) { - configDir = new File(event.getModConfigurationDirectory(), "bloodmagic"); + BloodMagicRecipeSerializers.RECIPE_SERIALIZERS.register(modBus); - PLUGINS.addAll(PluginUtil.gatherPlugins(event.getAsmData())); - PluginUtil.injectAPIInstances(PluginUtil.gatherInjections(event.getAsmData())); + // Register the setup method for modloading + modBus.addListener(this::setup); + // Register the enqueueIMC method for modloading + modBus.addListener(this::enqueueIMC); + // Register the processIMC method for modloading + modBus.addListener(this::processIMC); + // Register the doClientStuff method for modloading + modBus.addListener(this::doClientStuff); + modBus.addListener(this::gatherData); - ModTranquilityHandlers.init(); - ModDungeons.init(); - RITUAL_MANAGER.discover(event.getAsmData()); + modBus.addGenericListener(Fluid.class, this::registerFluids); + modBus.addGenericListener(TileEntityType.class, this::registerTileEntityTypes); + modBus.addGenericListener(IRecipeSerializer.class, this::registerRecipes); + modBus.addGenericListener(Effect.class, BloodMagicPotions::registerPotions); - proxy.preInit(); - } + MinecraftForge.EVENT_BUS.register(new GenericHandler()); - @Mod.EventHandler - public void init(FMLInitializationEvent event) { - BloodMagicPacketHandler.init(); + MinecraftForge.EVENT_BUS.register(new WillHandler()); +// MinecraftForge.EVENT_BUS.register(new BloodMagicBlocks()); +// MinecraftForge.EVENT_BUS.addListener(this::commonSetup); - PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.PLUGIN_REGISTER); + // Register ourselves for server and other game events we are interested in + MinecraftForge.EVENT_BUS.register(this); + } - ModRecipes.init(); - ModRituals.initHarvestHandlers(); - ModRituals.initCuttingFluids(); - MeteorConfigHandler.init(new File(configDir, "meteors")); - ModArmourTrackers.init(); - NetworkRegistry.INSTANCE.registerGuiHandler(BloodMagic.instance, new GuiHandler()); - ModCorruptionBlocks.init(); + private void registerRecipes(RegistryEvent.Register> event) + { + System.out.println("Registering IngredientBloodOrb Serializer."); + CraftingHelper.register(IngredientBloodOrb.NAME, IngredientBloodOrb.Serializer.INSTANCE); - proxy.init(); - } +// event.getRegistry().registerAll( +// new SewingRecipe.Serializer().setRegistryName("sewing") +// ); + } - @Mod.EventHandler - public void postInit(FMLPostInitializationEvent event) { - ModRecipes.addCompressionHandlers(); + public static ResourceLocation rl(String name) + { + return new ResourceLocation(BloodMagic.MODID, name); + } - proxy.postInit(); - } + public void registerFluids(RegistryEvent.Register event) + { - @Mod.EventHandler - public void modMapping(FMLModIdMappingEvent event) { + } - } + public void onLoadComplete(FMLLoadCompleteEvent event) + { + OrbRegistry.tierMap.put(BloodMagicItems.ORB_WEAK.get().getTier(), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get())); + BloodMagicCorePlugin.INSTANCE.register(BloodMagicAPI.INSTANCE); - @Mod.EventHandler - public void serverStarting(FMLServerStartingEvent event) { - event.registerServerCommand(new CommandBloodMagic()); - } + } - @Mod.EventHandler - public void onIMCRecieved(FMLInterModComms.IMCEvent event) { - IMCHandler.handleIMC(event); - } + public void registerTileEntityTypes(RegistryEvent.Register> event) + { + LOGGER.info("Attempting to register Tile Entities"); + event.getRegistry().register(TileEntityType.Builder.create(TileAltar::new, BloodMagicBlocks.BLOOD_ALTAR.get()).build(null).setRegistryName("altar")); + event.getRegistry().register(TileEntityType.Builder.create(TileAlchemyArray::new, BloodMagicBlocks.ALCHEMY_ARRAY.get()).build(null).setRegistryName("alchemyarray")); + event.getRegistry().register(TileEntityType.Builder.create(TileSoulForge::new, BloodMagicBlocks.SOUL_FORGE.get()).build(null).setRegistryName("soulforge")); + } + + @SubscribeEvent + public void gatherData(GatherDataEvent event) + { +// GSON = new GsonBuilder().registerTypeAdapter(Variant.class, new Variant.Deserializer()).registerTypeAdapter(ItemCameraTransforms.class, new ItemCameraTransforms.Deserializer()).registerTypeAdapter(ItemTransformVec3f.class, new ItemTransformVec3f.Deserializer()).create(); + + DataGenerator gen = event.getGenerator(); + +// if(event.includeClient()) + { + ItemModelProvider itemModels = new GeneratorItemModels(gen, event.getExistingFileHelper()); + gen.addProvider(itemModels); + gen.addProvider(new GeneratorBlockStates(gen, itemModels.existingFileHelper)); + gen.addProvider(new GeneratorLanguage(gen)); + gen.addProvider(new BloodMagicRecipeProvider(gen)); + gen.addProvider(new GeneratorBaseRecipes(gen)); + gen.addProvider(new GeneratorLootTable(gen)); + } + } + + private void setup(final FMLCommonSetupEvent event) + { + // some preinit code +// LOGGER.info("HELLO FROM PREINIT"); +// LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); + packetHandler.initialize(); + } + + private void doClientStuff(final FMLClientSetupEvent event) + { + // do something that can only be done on the client +// LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings); + ClientEvents.registerContainerScreens(); + + RenderingRegistry.registerEntityRenderingHandler(BloodMagicEntityTypes.SNARE.getEntityType(), SoulSnareRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(BloodMagicEntityTypes.BLOOD_LIGHT.getEntityType(), BloodLightRenderer::new); + ClientEvents.registerItemModelProperties(event); + } + + private void enqueueIMC(final InterModEnqueueEvent event) + { + // some example code to dispatch IMC to another mod +// InterModComms.sendTo("examplemod", "helloworld", () -> { +// LOGGER.info("Hello world from the MDK"); +// return "Hello world"; +// }); + } + + private void processIMC(final InterModProcessEvent event) + { + // some example code to receive and process InterModComms from other mods +// LOGGER.info("Got IMC {}", event.getIMCStream().map(m -> m.getMessageSupplier().get()).collect(Collectors.toList())); + } + + // You can use SubscribeEvent and let the Event Bus discover methods to call + @SubscribeEvent + public void onServerStarting(FMLServerStartingEvent event) + { + // do something when the server starts +// LOGGER.info("HELLO from server starting"); + } + + // You can use EventBusSubscriber to automatically subscribe events on the + // contained class (this is subscribing to the MOD + // Event bus for receiving Registry Events) + @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) + public static class RegistryEvents + { + @SubscribeEvent + public static void onBlocksRegistry(final RegistryEvent.Register blockRegistryEvent) + { + // register a new block here +// LOGGER.info("HELLO from Register Block"); + } + } + + // Custom ItemGroup TAB + public static final ItemGroup TAB = new ItemGroup("bloodmagictab") + { + @Override + public ItemStack createIcon() + { + return new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()); + } + }; } diff --git a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java index c00b81d5..ef072b52 100644 --- a/src/main/java/WayofTime/bloodmagic/ConfigHandler.java +++ b/src/main/java/WayofTime/bloodmagic/ConfigHandler.java @@ -1,90 +1,135 @@ -package WayofTime.bloodmagic; +package wayoftime.bloodmagic; -import WayofTime.bloodmagic.meteor.MeteorConfigHandler; -import net.minecraftforge.common.config.Config; -import net.minecraftforge.common.config.ConfigManager; -import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -@Config(modid = BloodMagic.MODID, name = BloodMagic.MODID + "/" + BloodMagic.MODID, category = "") @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class ConfigHandler { +public class ConfigHandler +{ + // Most of this stuff is commented out because a proper replacement for the + // ConfigHandler is not yet implemented. - @Config.Comment({"General settings"}) - public static ConfigGeneral general = new ConfigGeneral(); - @Config.Comment({"Blacklist options for various features"}) - public static ConfigBlacklist blacklist = new ConfigBlacklist(); - @Config.Comment({"Value modifiers for various features"}) - public static ConfigValues values = new ConfigValues(); - @Config.Comment({"Settings that only pertain to the client"}) - public static ConfigClient client = new ConfigClient(); - @Config.Comment({"Compatibility settings"}) - public static ConfigCompat compat = new ConfigCompat(); +// @Config.Comment( +// { "General settings" }) +// public static ConfigGeneral general = new ConfigGeneral(); +// @Config.Comment( +// { "Blacklist options for various features" }) +// public static ConfigBlacklist blacklist = new ConfigBlacklist(); +// @Config.Comment( +// { "Value modifiers for various features" }) +// public static ConfigValues values = new ConfigValues(); +// @Config.Comment( +// { "Settings that only pertain to the client" }) +// public static ConfigClient client = new ConfigClient(); +// @Config.Comment( +// { "Compatibility settings" }) +// public static ConfigCompat compat = new ConfigCompat(); +// +// @SubscribeEvent +// public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) +// { +// if (event.getModID().equals(BloodMagic.MODID)) +// { +// ConfigManager.sync(event.getModID(), Config.Type.INSTANCE); // Sync config values +// BloodMagic.RITUAL_MANAGER.syncConfig(); +// MeteorConfigHandler.handleMeteors(false); // Reload meteors +// } +// } +// +// public static class ConfigGeneral +// { +// @Config.Comment( +// { "Enables extra information to be printed to the log.", "Warning: May drastically increase log size." }) +// public boolean enableDebugLogging = false; +// @Config.Comment( +// { "Enables extra information to be printed to the log." }) +// public boolean enableAPILogging = false; +// @Config.Comment( +// { "Enables extra information to be printed to the log.", "Warning: May drastically increase log size." }) +// public boolean enableVerboseAPILogging = false; +// @Config.Comment( +// { "Enables tier 6 related registrations. This is for pack makers." }) +// @Config.RequiresMcRestart +// public boolean enableTierSixEvenThoughThereIsNoContent = false; +// } +// +// public static class ConfigBlacklist +// { +// @Config.Comment( +// { "Stops listed blocks and entities from being teleposed.", +// "Use the registry name of the block or entity. Vanilla objects do not require the modid.", +// "If a block is specified, you can list the variants to only blacklist a given state." }) +// public String[] teleposer = +// { "bedrock", "mob_spawner" }; +// @Config.Comment( +// { "Stops listed blocks from being transposed.", +// "Use the registry name of the block. Vanilla blocks do not require the modid." }) +// public String[] transposer = +// { "bedrock", "mob_spawner" }; +// @Config.Comment( +// { "Stops the listed entities from being used in the Well of Suffering.", +// "Use the registry name of the entity. Vanilla entities do not require the modid." }) +// public String[] wellOfSuffering = +// {}; +// } +// +// public static class ConfigValues +// { +// @Config.Comment( +// { "Declares the amount of LP gained per HP sacrificed for the given entity.", +// "Setting the value to 0 will blacklist it.", +// "Use the registry name of the entity followed by a ';' and then the value you want.", +// "Vanilla entities do not require the modid." }) +// public String[] sacrificialValues = +// { "villager;100", "slime;15", "enderman;10", "cow;100", "chicken;100", "horse;100", "sheep;100", "wolf;100", +// "ocelot;100", "pig;100", "rabbit;100" }; +// @Config.Comment( +// { "Amount of LP the Coat of Arms should provide for each damage dealt." }) +// @Config.RangeInt(min = 0, max = 100) +// public int coatOfArmsConversion = 20; +// @Config.Comment( +// { "Amount of LP the Sacrificial Dagger should provide for each damage dealt." }) +// @Config.RangeInt(min = 0, max = 10000) +// public int sacrificialDaggerConversion = 100; +// @Config.Comment( +// { "Will rewrite any default meteor types with new versions.", +// "Disable this if you want any of your changes to stay, or do not want default meteor types regenerated." }) +// public boolean shouldResyncMeteors = true; +// @Config.Comment( +// { "Should mobs that die through the Well of Suffering Ritual drop items?" }) +// public boolean wellOfSufferingDrops = true; +// } +// +// public static class ConfigClient +// { +// @Config.Comment( +// { "Always render the beams between routing nodes.", +// "If disabled, the beams will only render while the Node Router is held." }) +// public boolean alwaysRenderRoutingLines = false; +// @Config.Comment( +// { "Completely hide spectral blocks from view.", "If disabled, a transparent block will be displayed." }) +// public boolean invisibleSpectralBlocks = true; +// @Config.Comment( +// { "When cycling through slots, the Sigil of Holding will skip over empty slots and move to the next occupied one.", +// "If disabled, it will behave identically to the default hotbar." }) +// public boolean sigilHoldingSkipsEmptySlots = false; +// } +// +// public static class ConfigCompat +// { +// @Config.Comment( +// { "The display mode to use when looking at a Blood Altar.", "ALWAYS - Always display information.", +// "SIGIL_HELD - Only display information when a Divination or Seers sigil is held in either hand.", +// "SIGIL_CONTAINED - Only display information when a Divination or Seers sigil is somewhere in the inventory." }) +// public AltarDisplayMode wailaAltarDisplayMode = AltarDisplayMode.SIGIL_HELD; +// +// public enum AltarDisplayMode +// { +// ALWAYS, SIGIL_HELD, SIGIL_CONTAINED,; +// } +// } - @SubscribeEvent - public static void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { - if (event.getModID().equals(BloodMagic.MODID)) { - ConfigManager.sync(event.getModID(), Config.Type.INSTANCE); // Sync config values - BloodMagic.RITUAL_MANAGER.syncConfig(); - MeteorConfigHandler.handleMeteors(false); // Reload meteors - } - } - - public static class ConfigGeneral { - @Config.Comment({"Enables extra information to be printed to the log.", "Warning: May drastically increase log size."}) - public boolean enableDebugLogging = false; - @Config.Comment({"Enables extra information to be printed to the log."}) - public boolean enableAPILogging = false; - @Config.Comment({"Enables extra information to be printed to the log.", "Warning: May drastically increase log size."}) - public boolean enableVerboseAPILogging = false; - @Config.Comment({"Enables tier 6 related registrations. This is for pack makers."}) - @Config.RequiresMcRestart - public boolean enableTierSixEvenThoughThereIsNoContent = false; - } - - public static class ConfigBlacklist { - @Config.Comment({"Stops listed blocks and entities from being teleposed.", "Use the registry name of the block or entity. Vanilla objects do not require the modid.", "If a block is specified, you can list the variants to only blacklist a given state."}) - public String[] teleposer = {"bedrock", "mob_spawner"}; - @Config.Comment({"Stops listed blocks from being transposed.", "Use the registry name of the block. Vanilla blocks do not require the modid."}) - public String[] transposer = {"bedrock", "mob_spawner"}; - @Config.Comment({"Stops the listed entities from being used in the Well of Suffering.", "Use the registry name of the entity. Vanilla entities do not require the modid."}) - public String[] wellOfSuffering = {}; - } - - public static class ConfigValues { - @Config.Comment({"Declares the amount of LP gained per HP sacrificed for the given entity.", "Setting the value to 0 will blacklist it.", "Use the registry name of the entity followed by a ';' and then the value you want.", "Vanilla entities do not require the modid."}) - public String[] sacrificialValues = {"villager;100", "slime;15", "enderman;10", "cow;100", "chicken;100", "horse;100", "sheep;100", "wolf;100", "ocelot;100", "pig;100", "rabbit;100"}; - @Config.Comment({"Amount of LP the Coat of Arms should provide for each damage dealt."}) - @Config.RangeInt(min = 0, max = 100) - public int coatOfArmsConversion = 20; - @Config.Comment({"Amount of LP the Sacrificial Dagger should provide for each damage dealt."}) - @Config.RangeInt(min = 0, max = 10000) - public int sacrificialDaggerConversion = 100; - @Config.Comment({"Will rewrite any default meteor types with new versions.", "Disable this if you want any of your changes to stay, or do not want default meteor types regenerated."}) - public boolean shouldResyncMeteors = true; - @Config.Comment({"Should mobs that die through the Well of Suffering Ritual drop items?"}) - public boolean wellOfSufferingDrops = true; - } - - public static class ConfigClient { - @Config.Comment({"Always render the beams between routing nodes.", "If disabled, the beams will only render while the Node Router is held."}) - public boolean alwaysRenderRoutingLines = false; - @Config.Comment({"Completely hide spectral blocks from view.", "If disabled, a transparent block will be displayed."}) - public boolean invisibleSpectralBlocks = true; - @Config.Comment({"When cycling through slots, the Sigil of Holding will skip over empty slots and move to the next occupied one.", "If disabled, it will behave identically to the default hotbar."}) - public boolean sigilHoldingSkipsEmptySlots = false; - } - - public static class ConfigCompat { - @Config.Comment({"The display mode to use when looking at a Blood Altar.", "ALWAYS - Always display information.", "SIGIL_HELD - Only display information when a Divination or Seers sigil is held in either hand.", "SIGIL_CONTAINED - Only display information when a Divination or Seers sigil is somewhere in the inventory."}) - public AltarDisplayMode wailaAltarDisplayMode = AltarDisplayMode.SIGIL_HELD; - - public enum AltarDisplayMode { - ALWAYS, - SIGIL_HELD, - SIGIL_CONTAINED, - ; - } - } -} + public static class values + { + public static int sacrificialDaggerConversion = 100; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java deleted file mode 100644 index 3db3f305..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffect.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.iface.IAlchemyArray; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public abstract class AlchemyArrayEffect { - public final String key; - - public AlchemyArrayEffect(String key) { - this.key = key; - } - - public abstract boolean update(TileEntity tile, int ticksActive); - - public abstract void writeToNBT(CompoundNBT tag); - - public abstract void readFromNBT(CompoundNBT tag); - - public abstract AlchemyArrayEffect getNewCopy(); - - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - - } - - public String getKey() { - return key; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java deleted file mode 100644 index 1f234cd9..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectArrowTurret.java +++ /dev/null @@ -1,209 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import java.util.List; - -import javax.vecmath.Vector2d; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.MobEntity; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.projectile.ArrowEntity; -import net.minecraft.item.ArrowItem; -import net.minecraft.item.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; -import WayofTime.bloodmagic.util.Utils; - -public class AlchemyArrayEffectArrowTurret extends AlchemyArrayEffect { - public MobEntity target; - public int arrowTimer; - public static final int ARROW_WINDUP = 50; - private int lastChestSlot = -1; - - private double pitch = 0; - private double lastPitch = 0; - private double yaw = 0; - private double lastYaw = 0; - - public AlchemyArrayEffectArrowTurret(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - BlockPos pos = tile.getPos(); - World world = tile.getWorld(); - - BlockPos chestPos = pos.down(); - TileEntity chestTile = world.getTileEntity(chestPos); - if (chestTile == null) { - return false; - } - IItemHandler itemHandler = Utils.getInventory(chestTile, Direction.UP); - if (itemHandler == null) { - return false; - } - - ItemStack arrowStack = new ItemStack(Items.AIR); - if (lastChestSlot >= 0 && lastChestSlot < itemHandler.getSlots()) { - ItemStack testStack = itemHandler.extractItem(lastChestSlot, 1, true); - if (testStack.isEmpty() || !(testStack.getItem() instanceof ArrowItem)) { - lastChestSlot = -1; - } else { - arrowStack = testStack; - } - } - - if (lastChestSlot < 0) { - for (int i = 0; i < itemHandler.getSlots(); i++) { - ItemStack testStack = itemHandler.extractItem(i, 1, true); - if (!testStack.isEmpty() && testStack.getItem() instanceof ArrowItem) { - arrowStack = testStack; - lastChestSlot = i; - break; - } - } - - } - - if (lastChestSlot < 0) { - return false; //No arrows in the chest. Welp! - } - - if (canFireOnMob(world, pos, target)) { - Vector2d pitchYaw = getPitchYaw(pos, target); - lastPitch = pitch; - lastYaw = yaw; - pitch = pitchYaw.x; - yaw = pitchYaw.y; - arrowTimer++; - - if (arrowTimer >= ARROW_WINDUP) { -// ItemStack arrowStack = new ItemStack(Items.ARROW); - fireOnTarget(world, pos, arrowStack, target); - if (!world.isRemote) { - itemHandler.extractItem(lastChestSlot, 1, false); - } - arrowTimer = 0; - } - return false; - } else { - target = null; - arrowTimer = -1; - } - - List mobsInRange = world.getEntitiesWithinAABB(MonsterEntity.class, getBounds(pos)); - - for (MonsterEntity entity : mobsInRange) { - if (canFireOnMob(world, pos, entity))// && isMobInFilter(ent)) - { - target = entity; - arrowTimer = 0; - return false; - } - } - arrowTimer = -1; - target = null; - - return false; - } - - public double getPitch() { - return pitch; - } - - public double getLastPitch() { - return lastPitch; - } - - public double getYaw() { - return yaw; - } - - public double getLastYaw() { - return lastYaw; - } - - public void fireOnTarget(World world, BlockPos pos, ItemStack arrowStack, MobEntity targetMob) { - float vel = 3f; - double damage = 2; - if (!world.isRemote) { - if (arrowStack.getItem() instanceof ArrowItem) { -// ItemArrow arrow = (ItemArrow) arrowStack.getItem(); -// EntityArrow entityarrow = arrow.createArrow(world, arrowStack, targetMob); - ArrowEntity entityarrow = new ArrowEntity(world); - entityarrow.setPotionEffect(arrowStack); - entityarrow.posX = pos.getX() + 0.5; - entityarrow.posY = pos.getY() + 0.5; - entityarrow.posZ = pos.getZ() + 0.5; - - double d0 = targetMob.posX - (pos.getX() + 0.5); - double d1 = targetMob.posY + targetMob.height - (pos.getY() + 0.5); - double d2 = targetMob.posZ - (pos.getZ() + 0.5); - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entityarrow.setDamage(damage); - entityarrow.shoot(d0, d1 + d3 * 0.05, d2, vel, 0); - world.spawnEntity(entityarrow); - } - } - } - - public static Vector2d getPitchYaw(BlockPos pos, Entity entityIn) { - if (entityIn == null) { - return new Vector2d(0, 0); - } - - double distanceX = entityIn.posX - (pos.getX() + 0.5); - double distanceY = entityIn.posY + (double) entityIn.getEyeHeight() - (pos.getY() + 0.5); - double distanceZ = entityIn.posZ - (pos.getZ() + 0.5); - double radialDistance = Math.sqrt(distanceX * distanceX + distanceZ * distanceZ); - double yaw = Math.atan2(-distanceX, distanceZ) * 180 / Math.PI; - double pitch = -Math.atan2(distanceY, radialDistance) * 180 / Math.PI; - - return new Vector2d(pitch, yaw); - } - - public boolean canEntityBeSeen(World world, BlockPos pos, Entity entityIn) { - return world.rayTraceBlocks(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), new Vec3d(entityIn.posX, entityIn.posY + (double) entityIn.getEyeHeight(), entityIn.posZ), false, true, false) == null; - } - - public boolean canFireOnMob(World world, BlockPos pos, Entity entityIn) { - return entityIn != null && !entityIn.isDead && entityIn.getDistanceSqToCenter(pos) <= getRange() * getRange() && entityIn.getDistanceSqToCenter(pos) >= getMinRange() * getMinRange() && canEntityBeSeen(world, pos, entityIn); - } - - public AxisAlignedBB getBounds(BlockPos pos) { - return new AxisAlignedBB(pos).grow(getRange(), getRange(), getRange()); - } - - public float getRange() { - return 32; - } - - public float getMinRange() { - return 3; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectArrowTurret(key); - } - -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java deleted file mode 100644 index 3be0cbb8..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectAttractor.java +++ /dev/null @@ -1,393 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.fakePlayer.FakePlayerBM; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import com.mojang.authlib.GameProfile; -import net.minecraft.entity.Entity; -import net.minecraft.entity.MobEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.GoalSelector; -import net.minecraft.entity.ai.goal.GoalSelector.EntityAITaskEntry; -import net.minecraft.entity.monster.*; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.pathfinding.Path; -import net.minecraft.pathfinding.PathFinder; -import net.minecraft.pathfinding.WalkNodeProcessor; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; - -import java.util.*; - -/** - * Credits for the initial code go to Crazy Pants of EIO. - */ -public class AlchemyArrayEffectAttractor extends AlchemyArrayEffect { - private FakePlayer target; - private Set tracking = new HashSet<>(); - - private int counter = 0; - private int maxMobsAttracted = 10000; - - private int cooldown = 50; - - public AlchemyArrayEffectAttractor(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - if (tile.getWorld().isRemote) { - return false; - } - - BlockPos pos = tile.getPos(); - counter++; - if (counter < 10) { - for (MobEntity ent : tracking) { - onEntityTick(pos, ent); - } - - return false; - } - - counter = 0; - - World world = tile.getWorld(); - - Set trackingThisTick = new HashSet<>(); - List entsInBounds = world.getEntitiesWithinAABB(MobEntity.class, getBounds(pos)); - - for (MobEntity ent : entsInBounds) { - if (!ent.isDead)// && isMobInFilter(ent)) - { - double x = (pos.getX() + 0.5D - ent.posX); - double y = (pos.getY() + 1D - ent.posY); - double z = (pos.getZ() + 0.5D - ent.posZ); - double distance = Math.sqrt(x * x + y * y + z * z); - - if (distance < 2 && tracking.contains(ent)) { - setEntityCooldown(pos, ent, cooldown); - removeAssignedAITask(pos, ent); - continue; - } - - if (!canEntityBeTracked(pos, ent)) { -// System.out.println("Cooldown: " + getEntityCooldown(pos, ent)); - decrementEntityCooldown(pos, ent); - continue; - } - - if (tracking.contains(ent)) { - trackingThisTick.add(ent); - onEntityTick(pos, ent); - } else if (tracking.size() < maxMobsAttracted && trackMob(pos, ent)) { - trackingThisTick.add(ent); - onTracked(ent); - } - } - } - - for (MobEntity e : tracking) { - if (!trackingThisTick.contains(e)) { - onUntracked(e); - } - } - tracking.clear(); - tracking = trackingThisTick; - - return false; - } - - public boolean canEntityBeTracked(BlockPos pos, MobEntity entity) { - return getEntityCooldown(pos, entity) <= 0; - } - - private String getPosKey(BlockPos pos) { - return "BMAttractor:" + pos; - } - - public int getEntityCooldown(BlockPos pos, MobEntity entity) { - return entity.getEntityData().getInteger(getPosKey(pos)); - } - - public void setEntityCooldown(BlockPos pos, MobEntity entity, int cooldown) { - entity.getEntityData().setInteger(getPosKey(pos), cooldown); - } - - public void decrementEntityCooldown(BlockPos pos, MobEntity entity) { - int cooldown = getEntityCooldown(pos, entity); - if (cooldown > 0) { - setEntityCooldown(pos, entity, cooldown - 1); - } - } - - public AxisAlignedBB getBounds(BlockPos pos) { - return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); - } - - public float getRange() { - return 10; - } - - private void onUntracked(MobEntity e) { - if (e instanceof EndermanEntity) { - e.getEntityData().setBoolean("BM:tracked", false); - } - } - - private void onTracked(MobEntity e) { - if (e instanceof EndermanEntity) { - e.getEntityData().setBoolean("BM:tracked", true); - } - } - - private void onEntityTick(BlockPos pos, MobEntity ent) { - if (ent instanceof SlimeEntity) { - ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); - } else if (ent instanceof SilverfishEntity) { - if (counter < 10) { - return; - } - SilverfishEntity sf = (SilverfishEntity) ent; - Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); - sf.getNavigator().setPath(pathentity, sf.getAIMoveSpeed()); - } else if (ent instanceof BlazeEntity) { - double x = (pos.getX() + 0.5D - ent.posX); - double y = (pos.getY() + 1D - ent.posY); - double z = (pos.getZ() + 0.5D - ent.posZ); - double distance = Math.sqrt(x * x + y * y + z * z); - if (distance > 1.25) { - double speed = 0.01; - ent.motionX += x / distance * speed; - if (y > 0) { - ent.motionY += (0.3 - ent.motionY) * 0.3; - } - ent.motionZ += z / distance * speed; - } - } else if (ent instanceof ZombiePigmanEntity || ent instanceof SpiderEntity) { - forceMove(pos, ent); -// ent.setAttackTarget(target); - } else if (ent instanceof EndermanEntity) { - ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); - } - } - - private void forceMove(BlockPos pos, MobEntity ent) { - double x = (pos.getX() + 0.5D - ent.posX); - double y = (pos.getY() + 1D - ent.posY); - double z = (pos.getZ() + 0.5D - ent.posZ); - double distance = Math.sqrt(x * x + y * y + z * z); - if (distance > 2) { - MonsterEntity mod = (MonsterEntity) ent; - mod.faceEntity(getTarget(ent.getEntityWorld(), pos), 180, 0); - mod.getMoveHelper().strafe(0, 0.3f); - if (mod.posY < pos.getY()) { - mod.setJumping(true); - } else { - mod.setJumping(false); - } - } - } - - public Path getPathEntityToEntity(Entity entity, Entity targetEntity, float range) { - int targX = MathHelper.floor(targetEntity.posX); - int targY = MathHelper.floor(targetEntity.posY + 1.0D); - int targZ = MathHelper.floor(targetEntity.posZ); - - PathFinder pf = new PathFinder(new WalkNodeProcessor()); - return pf.findPath(targetEntity.getEntityWorld(), (MobEntity) entity, new BlockPos(targX, targY, targZ), range); - } - - private boolean trackMob(BlockPos pos, MobEntity ent) { - //TODO: Figure out if this crud is needed - if (useSetTarget(ent)) { - ent.setAttackTarget(getTarget(ent.getEntityWorld(), pos)); - return true; - } else if (useSpecialCase(ent)) { - return applySpecialCase(pos, ent); - } else { - return attractUsingAITask(pos, ent); - } - } - - private boolean useSetTarget(MobEntity ent) { - return ent instanceof ZombiePigmanEntity || ent instanceof SpiderEntity || ent instanceof SilverfishEntity; - } - - public void removeAssignedAITask(BlockPos pos, MobEntity ent) { - Set entries = ent.tasks.taskEntries; - Goal remove = null; - for (EntityAITaskEntry entry : entries) { - if (entry.action instanceof AttractTask) { - AttractTask at = (AttractTask) entry.action; - if (at.coord.equals(pos)) { - remove = entry.action; - } else { - continue; - } - } - } - if (remove != null) { - ent.tasks.removeTask(remove); - } - } - - private boolean attractUsingAITask(BlockPos pos, MobEntity ent) { - tracking.add(ent); - Set entries = ent.tasks.taskEntries; - // boolean hasTask = false; - Goal remove = null; - // boolean isTracked; - for (EntityAITaskEntry entry : entries) { - if (entry.action instanceof AttractTask) { - AttractTask at = (AttractTask) entry.action; - if (at.coord.equals(pos) || !at.shouldExecute()) { - remove = entry.action; - } else { - return false; - } - } - } - if (remove != null) { - ent.tasks.removeTask(remove); - } - - cancelCurrentTasks(ent); - ent.tasks.addTask(0, new AttractTask(ent, getTarget(ent.getEntityWorld(), pos), pos)); - - return true; - } - - private void cancelCurrentTasks(MobEntity ent) { - Iterator iterator = ent.tasks.taskEntries.iterator(); - - List currentTasks = new ArrayList<>(); - while (iterator.hasNext()) { - EntityAITaskEntry entityaitaskentry = iterator.next(); - if (entityaitaskentry != null) { - if (entityaitaskentry.action instanceof AttractTask) { - continue; - } - - currentTasks.add(entityaitaskentry); - } - } - // Only available way to stop current execution is to remove all current - // tasks, then re-add them - for (EntityAITaskEntry task : currentTasks) { - ent.tasks.removeTask(task.action); - ent.tasks.addTask(task.priority, task.action); - } - } - - private boolean applySpecialCase(BlockPos pos, MobEntity ent) { - if (ent instanceof SlimeEntity) { - ent.faceEntity(getTarget(ent.getEntityWorld(), pos), 10.0F, 20.0F); -// ent.setAttackTarget(getTarget(ent.worldObj, pos)); - return true; - } else if (ent instanceof SilverfishEntity) { - SilverfishEntity es = (SilverfishEntity) ent; - Path pathentity = getPathEntityToEntity(ent, getTarget(ent.getEntityWorld(), pos), getRange()); - es.getNavigator().setPath(pathentity, es.getAIMoveSpeed()); - return true; - } else if (ent instanceof BlazeEntity) { - return true; - } - return false; - } - - private boolean useSpecialCase(MobEntity ent) { - return ent instanceof SlimeEntity || ent instanceof SilverfishEntity || ent instanceof BlazeEntity; - } - - public FakePlayer getTarget(World world, BlockPos pos) { - if (target == null) { -// System.out.println("...Hi? " + pos); - target = new Target(world, pos); - } - - return target; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectAttractor(key); - } - - private static class AttractTask extends Goal { - private MobEntity mob; - private BlockPos coord; - private FakePlayer target; - private int updatesSincePathing; - - private boolean started = false; - - private AttractTask(MobEntity mob, FakePlayer target, BlockPos coord) { - this.mob = mob; - this.coord = coord; - this.target = target; - } - - @Override - public boolean shouldExecute() { - boolean res = false; - //TODO: - TileEntity te = mob.getEntityWorld().getTileEntity(coord); - if (te instanceof TileAlchemyArray) { - res = true; - } - - return res; - } - - @Override - public void resetTask() { - started = false; - updatesSincePathing = 0; - } - - @Override - public boolean isInterruptible() { - return true; - } - - @Override - public void updateTask() { - if (!started || updatesSincePathing > 20) { - started = true; - int speed = 1; - // mob.getNavigator().setAvoidsWater(false); - boolean res = mob.getNavigator().tryMoveToEntityLiving(target, speed); - if (!res) { - mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); - } - updatesSincePathing = 0; - } else { - updatesSincePathing++; - } - } - - } - - private class Target extends FakePlayerBM { - public Target(World world, BlockPos pos) { - super(world, pos, new GameProfile(null, BloodMagic.MODID + "ArrayAttractor" + ":" + pos)); - posY += 1; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java deleted file mode 100644 index 6659fbf1..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBinding.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class AlchemyArrayEffectBinding extends AlchemyArrayEffectCrafting { - public AlchemyArrayEffectBinding(String key, ItemStack outputStack) { - super(key, outputStack, 200); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - if (ticksActive >= 50 && ticksActive <= 250) { - // TODO: Find a way to spawn lightning from only the server side - - // does not render when just spawned on server, not client. - this.spawnLightningOnCircle(tile.getWorld(), tile.getPos(), ticksActive); - } - - if (tile.getWorld().isRemote) { - return false; - } - - if (ticksActive >= 300) { - BlockPos pos = tile.getPos(); - - ItemStack output = outputStack.copy(); - ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); - - tile.getWorld().spawnEntity(outputEntity); - - return true; - } - - return false; - } - - public void spawnLightningOnCircle(World world, BlockPos pos, int ticksActive) { - if (ticksActive % 50 == 0) { - int circle = ticksActive / 50 - 1; - float distance = BindingAlchemyCircleRenderer.getDistanceOfCircle(circle, ticksActive); - float angle = BindingAlchemyCircleRenderer.getAngleOfCircle(circle, ticksActive); - - double dispX = distance * Math.sin(angle); - double dispZ = -distance * Math.cos(angle); - - LightningBoltEntity lightning = new LightningBoltEntity(world, pos.getX() + dispX, pos.getY(), pos.getZ() + dispZ, true); - world.spawnEntity(lightning); - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - //EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - //EMPTY - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectBinding(key, outputStack); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java deleted file mode 100644 index 69f5be05..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectBounce.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.iface.IAlchemyArray; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class AlchemyArrayEffectBounce extends AlchemyArrayEffect { - public AlchemyArrayEffectBounce(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - return false; - } - - @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - if (entity.isSneaking()) { - entity.fallDistance = 0; - } else if (entity.motionY < 0.0D) { - entity.motionY = -entity.motionY; - - if (!(entity instanceof LivingEntity)) { - entity.motionY *= 0.8D; - } - - entity.fallDistance = 0; - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectBounce(key); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java deleted file mode 100644 index df9ee547..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCrafting.java +++ /dev/null @@ -1,63 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; - -public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect { - public final ItemStack outputStack; - public int tickLimit; - - public AlchemyArrayEffectCrafting(ItemStack outputStack) { - this(outputStack, 200); - } - - public AlchemyArrayEffectCrafting(ItemStack outputStack, int tickLimit) { - this(outputStack.toString() + tickLimit, outputStack, tickLimit); - } - - public AlchemyArrayEffectCrafting(String key, ItemStack outputStack, int tickLimit) { - super(key); - this.outputStack = outputStack; - this.tickLimit = tickLimit; - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - // TODO: Add recipe rechecking to verify nothing screwy is going on. - if (tile.getWorld().isRemote) { - return false; - } - - if (ticksActive >= tickLimit) { - BlockPos pos = tile.getPos(); - - ItemStack output = outputStack.copy(); - - ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); - - tile.getWorld().spawnEntity(outputEntity); - - return true; - } - - return false; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectCrafting(key, outputStack, tickLimit); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java deleted file mode 100644 index 34f2eae3..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectCraftingNew.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; - -public class AlchemyArrayEffectCraftingNew extends AlchemyArrayEffect { - - private final RecipeAlchemyArray recipe; - - public AlchemyArrayEffectCraftingNew(RecipeAlchemyArray recipe) { - this(recipe.getOutput().toString() + 200, recipe); - } - - public AlchemyArrayEffectCraftingNew(String key, RecipeAlchemyArray recipeAlchemyArray) { - super(key); - - this.recipe = recipeAlchemyArray; - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - if (tile.getWorld().isRemote) - return false; - - if (ticksActive >= 200) { - BlockPos pos = tile.getPos(); - - ItemStack output = recipe.getOutput().copy(); - - ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, output); - - tile.getWorld().spawnEntity(outputEntity); - - return true; - } - - return false; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectCraftingNew(key, recipe); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java deleted file mode 100644 index 73d8c090..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectFurnaceFuel.java +++ /dev/null @@ -1,119 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import java.util.List; - -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.FurnaceBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.FurnaceTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class AlchemyArrayEffectFurnaceFuel extends AlchemyArrayEffect { - static double radius = 10; - static int burnTicksAdded = 401; //Set to +1 more than it needs to be due to a hacky method - basically done so that the array doesn't double dip your health if you only add one item. - - public AlchemyArrayEffectFurnaceFuel(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - BlockPos pos = tile.getPos(); - World world = tile.getWorld(); - PlayerEntity sacrifice = null; - - for (Direction face : Direction.VALUES) { - BlockPos furnacePos = pos.offset(face); - Block block = world.getBlockState(furnacePos).getBlock(); - if (block != Blocks.FURNACE) //This will only work vanilla furnaces. No others! - { - continue; - } - - TileEntity bottomTile = world.getTileEntity(furnacePos); - if (bottomTile instanceof FurnaceTileEntity) { - FurnaceTileEntity furnaceTile = (FurnaceTileEntity) bottomTile; - if (canFurnaceSmelt(furnaceTile) && !furnaceTile.isBurning()) { - if (sacrifice == null || sacrifice.isDead) { - AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); - List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, bb); - for (PlayerEntity player : playerList) { - if (!player.isDead) { - sacrifice = player; - } - } - } - - if (sacrifice == null || sacrifice.isDead) { - return false; - } - - if (addFuelTime(furnaceTile, world, furnacePos, burnTicksAdded)) { - if (!sacrifice.capabilities.isCreativeMode) { - sacrifice.hurtResistantTime = 0; - sacrifice.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); //No. - } - } - } - } - } - - return false; - } - - public static boolean addFuelTime(FurnaceTileEntity furnaceTile, World world, BlockPos furnacePos, int cookTime) { - furnaceTile.setField(0, cookTime); - FurnaceBlock.setState(true, world, furnacePos); - return true; - } - - public static boolean canFurnaceSmelt(FurnaceTileEntity furnaceTile) { - ItemStack burnStack = furnaceTile.getStackInSlot(0); - if (burnStack.isEmpty()) { - return false; - } else { - ItemStack resultStack = FurnaceRecipes.instance().getSmeltingResult(burnStack); - - if (resultStack.isEmpty()) { - return false; - } else { - ItemStack finishStack = furnaceTile.getStackInSlot(2); - - if (finishStack.isEmpty()) { - return true; - } else if (!finishStack.isItemEqual(resultStack)) { - return false; - } else if (finishStack.getCount() + resultStack.getCount() <= furnaceTile.getInventoryStackLimit() && finishStack.getCount() + resultStack.getCount() <= finishStack.getMaxStackSize()) // Forge fix: make furnace respect stack sizes in furnace recipes - { - return true; - } else { - return finishStack.getCount() + resultStack.getCount() <= resultStack.getMaxStackSize(); // Forge fix: make furnace respect stack sizes in furnace recipes - } - } - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectFurnaceFuel(key); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java deleted file mode 100644 index 73030287..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectLaputa.java +++ /dev/null @@ -1,134 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import java.util.Random; - -import net.minecraft.block.BlockState; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; - -public class AlchemyArrayEffectLaputa extends AlchemyArrayEffect { - public static final int TELEPOSE_DELAY = 4; - - private BlockPos currentPos = BlockPos.ORIGIN; - - private int radius = -1; - private int teleportHeightOffset = 5; - - public AlchemyArrayEffectLaputa(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - if (ticksActive >= 100) { - World world = tile.getWorld(); - - if (radius == -1) { - ((TileAlchemyArray) tile).setItemDrop(false); - radius = getRandomRadius(world.rand); - teleportHeightOffset = getRandomHeightOffset(world.rand); - currentPos = new BlockPos(-radius, -radius, -radius); - } - - BlockPos pos = tile.getPos(); - if (world.isRemote) { - return false; - } - - int j = -radius; - int i = -radius; - int k = -radius; - - if (currentPos != null) { - j = currentPos.getY(); - i = currentPos.getX(); - k = currentPos.getZ(); - } - int checks = 0; - int maxChecks = 100; - - while (j <= radius) { - while (i <= radius) { - while (k <= radius) { - if (i == 0 && j == 0 && k == 0) { - k++; - continue; - } - - checks++; - if (checks >= maxChecks) { - this.currentPos = new BlockPos(i, j, k); - return false; - } - - if (checkIfSphere(radius, i, j, k)) { - BlockPos newPos = pos.add(i, j, k); - BlockPos offsetPos = newPos.up(teleportHeightOffset); - BlockState state = world.getBlockState(newPos); - - TeleposeEvent event = new TeleposeEvent(world, newPos, world, offsetPos); - if (state.getBlockHardness(world, newPos) > 0 && !MinecraftForge.EVENT_BUS.post(event) && Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos)) { - k++; - this.currentPos = new BlockPos(i, j, k); - - return false; - } - } - k++; - } - i++; - k = -radius; - } - j++; - i = -radius; - this.currentPos = new BlockPos(i, j, k); - return false; - } - - return true; - } - - return false; - } - - public boolean checkIfSphere(float radius, float xOff, float yOff, float zOff) { - float possOffset = 0.5f; - return xOff * xOff + yOff * yOff + zOff * zOff <= ((radius + possOffset) * (radius + possOffset)); - } - - public int getRandomRadius(Random rand) { - return rand.nextInt(5) + 4; - } - - public int getRandomHeightOffset(Random rand) { - return radius * 2 + 1 + rand.nextInt(5); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt("radius", radius); - tag.putInt("teleportHeightOffset", teleportHeightOffset); - tag.putInt(Constants.NBT.X_COORD, currentPos.getX()); - tag.putInt(Constants.NBT.Y_COORD, currentPos.getY()); - tag.putInt(Constants.NBT.Z_COORD, currentPos.getZ()); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - radius = tag.getInt("radius"); - teleportHeightOffset = tag.getInt("teleportHeightOffset"); - currentPos = new BlockPos(tag.getInt(Constants.NBT.X_COORD), tag.getInt(Constants.NBT.Y_COORD), tag.getInt(Constants.NBT.Z_COORD)); - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectLaputa(key); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java deleted file mode 100644 index 8277ff93..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMobSacrifice.java +++ /dev/null @@ -1,202 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityRegistry; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeSacrificeCraft; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; - -public class AlchemyArrayEffectMobSacrifice extends AlchemyArrayEffect { - public static final AreaDescriptor itemDescriptor = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); - public static final AreaDescriptor mobDescriptor = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); - public int craftTime = 0; - public static final int REQUIRED_CRAFT_TIME = 200; - - public AlchemyArrayEffectMobSacrifice(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - World world = tile.getWorld(); - if (world.isRemote && ticksActive < 200 && ticksActive > 40) { - BlockPos pos = tile.getPos(); - Random rand = world.rand; - - for (int i = 0; i < 2; i++) { - double d0 = (double) pos.getX() + 0.5D + (rand.nextDouble() - 0.5D) * 2.5D; - double d1 = (double) pos.getY() + 0.2D + (rand.nextDouble() - 0.5D) * 0.2D; - double d2 = (double) pos.getZ() + 0.5D + (rand.nextDouble() - 0.5D) * 2.5D; - world.spawnParticle(EnumParticleTypes.SPELL_MOB, d0, d1, d2, 1D, 0.0D, 0.0D); - } - } - - //We need to do the check on both sides to correctly do particles. - - if (ticksActive >= 200) { - BlockPos pos = tile.getPos(); - - List itemList = world.getEntitiesWithinAABB(ItemEntity.class, itemDescriptor.getAABB(pos)); - - List inputList = new ArrayList(); - - for (ItemEntity entityItem : itemList) { - if (entityItem.isDead || entityItem.getItem().isEmpty()) { - continue; - } - - inputList.add(entityItem.getItem().copy()); - } - - if (inputList.isEmpty()) { - return false; - } - - if (inputList.size() == 1) //TODO: Test if it is a something that can be filled with Soul Breath - { - - } - - RecipeSacrificeCraft recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getSacrificeCraft(inputList); - if (recipe != null) { - double healthRequired = recipe.getHealthRequired(); - double healthAvailable = 0; - - List livingEntities = world.getEntitiesWithinAABB(LivingEntity.class, mobDescriptor.getAABB(pos)); - for (LivingEntity living : livingEntities) { - double health = getEffectiveHealth(living); - if (health > 0) { - healthAvailable += health; - } - } - - if (healthAvailable < healthRequired) { - craftTime = 0; - return false; - } - - craftTime++; - - if (craftTime >= REQUIRED_CRAFT_TIME) { - if (!world.isRemote) { - for (LivingEntity living : livingEntities) { - double health = getEffectiveHealth(living); - if (healthAvailable > 0 && health > 0) { - healthAvailable -= health; - living.getEntityWorld().playSound(null, living.posX, living.posY, living.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (living.getEntityWorld().rand.nextFloat() - living.getEntityWorld().rand.nextFloat()) * 0.8F); - living.setHealth(-1); - living.onDeath(DamageSourceBloodMagic.INSTANCE); - } - - if (healthAvailable <= 0) { - break; - } - } - - for (ItemEntity itemEntity : itemList) { - itemEntity.getItem().setCount(itemEntity.getItem().getCount() - 1); - if (itemEntity.getItem().isEmpty()) //TODO: Check container - { - itemEntity.setDead(); - } - } - - world.spawnEntity(new ItemEntity(world, pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5, recipe.getOutput())); - craftTime = 0; - } - } else { - if (world.isRemote) { - Vec3d spawnPosition = new Vec3d(pos.getX() + 0.5, pos.getY() + 2.5, pos.getZ() + 0.5); - for (ItemEntity itemEntity : itemList) { - ItemStack stack = itemEntity.getItem(); - double velocityFactor = 0.1; - - Vec3d itemPosition = new Vec3d(itemEntity.posX, itemEntity.posY + 0.5, itemEntity.posZ); - Vec3d velVec1 = new Vec3d((world.rand.nextDouble() - 0.5) * velocityFactor, (world.rand.nextDouble() - 0.5) * velocityFactor, (world.rand.nextDouble() - 0.5) * velocityFactor); -// Vec3d velVec2 = new Vec3d((world.rand.nextDouble() - 0.5) * velocityFactor, (world.rand.nextDouble()) * velocityFactor, (world.rand.nextDouble() - 0.5) * velocityFactor); - -// vec3d1 = vec3d1.addVector(this.posX, this.posY + (double)this.getEyeHeight(), this.posZ); -// if (this.world instanceof WorldServer) //Forge: Fix MC-2518 spawnParticle is nooped on server, need to use server specific variant -// ((WorldServer)this.world).spawnParticle(EnumParticleTypes.ITEM_CRACK, vec3d1.x, vec3d1.y, vec3d1.z, 0, vec3d.x, vec3d.y + 0.05D, vec3d.z, 0.0D, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); -// else //Fix the fact that spawning ItemCrack uses TWO arguments. - world.spawnParticle(EnumParticleTypes.ITEM_CRACK, itemPosition.x + (spawnPosition.x - itemPosition.x) * craftTime / REQUIRED_CRAFT_TIME, itemPosition.y + (spawnPosition.y - itemPosition.y) * craftTime / REQUIRED_CRAFT_TIME, itemPosition.z + (spawnPosition.z - itemPosition.z) * craftTime / REQUIRED_CRAFT_TIME, velVec1.x, velVec1.y, velVec1.z, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); -// world.spawnParticle(EnumParticleTypes.ITEM_CRACK, spawnPosition.x, spawnPosition.y, spawnPosition.z, velVec2.x, velVec2.y, velVec2.z, Item.getIdFromItem(stack.getItem()), stack.getMetadata()); - } - - for (LivingEntity living : livingEntities) { - double health = getEffectiveHealth(living); - if (health <= 0) { - continue; - } - double d0 = (double) living.posX + (world.rand.nextDouble() - 0.5D) * 0.5D; - double d1 = (double) living.posY + 0.5D + (world.rand.nextDouble() - 0.5D) * 1D; - double d2 = (double) living.posZ + (world.rand.nextDouble() - 0.5D) * 0.5D; - world.spawnParticle(EnumParticleTypes.SPELL_MOB, d0, d1, d2, 1D, 0.0D, 0.0D); - } - } - } - } - } - - return false; - } - - //Future-proofing in case I want to make different mobs give different effective health - public double getEffectiveHealth(LivingEntity living) { - if (living == null) - return 0; - - if (!living.isNonBoss()) - return 0; - - if (living instanceof PlayerEntity) - return 0; - - if (living.isChild() && !(living instanceof IMob)) - return 0; - - if (living.isDead || living.getHealth() < 0.5F) - return 0; - - EntityEntry entityEntry = EntityRegistry.getEntry(living.getClass()); - if (entityEntry == null) - return 0; - - return living.getHealth(); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectMobSacrifice(key); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java deleted file mode 100644 index c626a085..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectMovement.java +++ /dev/null @@ -1,82 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.iface.IAlchemyArray; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class AlchemyArrayEffectMovement extends AlchemyArrayEffect { - public AlchemyArrayEffectMovement(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - return false; - } - - @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - double motionY = 0.5; - double motionYGlowstoneMod = 0.05; - double speed = 1.5; - double speedRedstoneMod = 0.15; - - Direction direction = array.getRotation(); - TileAlchemyArray tileArray = (TileAlchemyArray) array; - - motionY += motionYGlowstoneMod * (tileArray.getStackInSlot(0).getCount() - 1); - speed += speedRedstoneMod * (tileArray.getStackInSlot(1).getCount() - 1); - - entity.motionY = motionY; - entity.fallDistance = 0; - - switch (direction) { - case NORTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = -speed; - break; - - case SOUTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = speed; - break; - - case WEST: - entity.motionX = -speed; - entity.motionY = motionY; - entity.motionZ = 0; - break; - - case EAST: - entity.motionX = speed; - entity.motionY = motionY; - entity.motionZ = 0; - break; - default: - break; - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectMovement(key); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java deleted file mode 100644 index 2188ff18..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSigil.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.iface.ISigil; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; - -public class AlchemyArrayEffectSigil extends AlchemyArrayEffect { - private final ISigil sigil; - - public AlchemyArrayEffectSigil(String key, ISigil sigil) { - super(key); - this.sigil = sigil; - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - //TODO: Need particles. - if (sigil.hasArrayEffect()) { - sigil.performArrayEffect(tile.getWorld(), tile.getPos()); - } - - return false; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectSigil(key, sigil); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java deleted file mode 100644 index 170877e6..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSkeletonTurret.java +++ /dev/null @@ -1,186 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import com.google.common.base.Predicate; -import net.minecraft.entity.MobEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.goal.GoalSelector; -import net.minecraft.entity.ai.goal.GoalSelector.EntityAITaskEntry; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.NearestAttackableTargetGoal; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.monster.SkeletonEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * Credits for the initial code go to Crazy Pants of EIO. - */ -public class AlchemyArrayEffectSkeletonTurret extends AlchemyArrayEffect { - public static Predicate checkSkeleton = input -> !(input instanceof SkeletonEntity); - private SkeletonEntity turret; - - public AlchemyArrayEffectSkeletonTurret(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { -// if (tile.getWorld().isRemote) -// { -// return false; -// } - - BlockPos pos = tile.getPos(); - - if (turret != null && !turret.isDead) { - double x = (pos.getX() + 0.5D - turret.posX); - double y = (pos.getY() + 1D - turret.posY); - double z = (pos.getZ() + 0.5D - turret.posZ); - double distance = Math.sqrt(x * x + y * y + z * z); - - if (distance < 2) { -// turret.addPotionEffect(new PotionEffect(MobEffects.SLOWNESS, 100, 100)); - return false; - } - } - - World world = tile.getWorld(); - - List skeletonsInRange = world.getEntitiesWithinAABB(SkeletonEntity.class, getBounds(pos)); - - for (SkeletonEntity entity : skeletonsInRange) { - if (!entity.isDead)// && isMobInFilter(ent)) - { - modifyAITargetTasks(entity); - turret = entity; - break; - } - } - - return false; - } - - public AxisAlignedBB getBounds(BlockPos pos) { - return new AxisAlignedBB(pos).expand(getRange(), getRange(), getRange()); - } - - public float getRange() { - return 0; - } - -// private void onUntracked(EntityLiving e) -// { -// e.getEntityData().setBoolean("BM:tracked", false); -// } -// -// private void onTracked(EntityLiving e) -// { -// e.getEntityData().setBoolean("BM:tracked", true); -// } - - private boolean modifyAITargetTasks(SkeletonEntity entity) { - cancelCurrentTargetTasks(entity); - -// entity.setCombatTask(); - entity.targetTasks.addTask(1, new NearestAttackableTargetGoal(entity, MonsterEntity.class, 10, true, false, checkSkeleton)); - entity.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0); - entity.getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(1); - return true; - } - - private void cancelCurrentTargetTasks(MobEntity entity) { - Iterator iterator = entity.targetTasks.taskEntries.iterator(); - - List currentTasks = new ArrayList<>(); - while (iterator.hasNext()) { - EntityAITaskEntry entityaitaskentry = iterator.next(); - if (entityaitaskentry != null)// && entityaitaskentry.action instanceof EntityAITarget) - { - currentTasks.add(entityaitaskentry); - } - } - - for (EntityAITaskEntry task : currentTasks) { - entity.targetTasks.removeTask(task.action); - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectSkeletonTurret(key); - } - - private static class AttractTask extends Goal { - private MobEntity mob; - private BlockPos coord; - private FakePlayer target; - private int updatesSincePathing; - - private boolean started = false; - - private AttractTask(MobEntity mob, FakePlayer target, BlockPos coord) { - this.mob = mob; - this.coord = coord; - this.target = target; - } - - @Override - public boolean shouldExecute() { - boolean res = false; - //TODO: - TileEntity te = mob.getEntityWorld().getTileEntity(coord); - if (te instanceof TileAlchemyArray) { - res = true; - } - - return res; - } - - @Override - public void resetTask() { - started = false; - updatesSincePathing = 0; - } - - @Override - public boolean isInterruptible() { - return true; - } - - @Override - public void updateTask() { - if (!started || updatesSincePathing > 20) { - started = true; - int speed = 1; - // mob.getNavigator().setAvoidsWater(false); - boolean res = mob.getNavigator().tryMoveToEntityLiving(target, speed); - if (!res) { - mob.getNavigator().tryMoveToXYZ(target.posX, target.posY + 1, target.posZ, speed); - } - updatesSincePathing = 0; - } else { - updatesSincePathing++; - } - } - - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java deleted file mode 100644 index 47d36731..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectSpike.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.iface.IAlchemyArray; - -public class AlchemyArrayEffectSpike extends AlchemyArrayEffect { - public AlchemyArrayEffectSpike(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - return false; - } - - @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - if (entity instanceof LivingEntity) { - entity.attackEntityFrom(DamageSource.CACTUS, 2); - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectSpike(key); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java deleted file mode 100644 index 04fee39c..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectTeleport.java +++ /dev/null @@ -1,87 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundEvents; -import net.minecraft.network.play.server.SUpdateHealthPacket; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; -import net.minecraft.world.World; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.iface.IAlchemyArray; - -public class AlchemyArrayEffectTeleport extends AlchemyArrayEffect { - public static final int MAX_SEARCH = 20; - public static final int TELEPORT_DELAY = 40; - - public AlchemyArrayEffectTeleport(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - return false; - } - - @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - Direction direction = array.getRotation(); - - teleportEntityInDirection(world, pos, entity, direction); - } - - public void teleportEntityInDirection(World world, BlockPos currentPos, Entity entity, Direction direction) { - if (entity != null && entity.timeUntilPortal <= 0) { - for (int i = 1; i <= MAX_SEARCH; i++) { - BlockPos offsetPos = currentPos.offset(direction, i); - Block testBlock = world.getBlockState(offsetPos).getBlock(); - if (testBlock == RegistrarBloodMagicBlocks.ALCHEMY_ARRAY) { - int x = offsetPos.getX(); - int y = offsetPos.getY(); - int z = offsetPos.getZ(); - - entity.getEntityWorld().playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - entity.timeUntilPortal = TELEPORT_DELAY; - if (!world.isRemote) { - if (entity instanceof PlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entity; - - player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); - player.getEntityWorld().updateEntityWithOptionalForce(player, false); - player.connection.sendPacket(new SUpdateHealthPacket(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); - - } else { - ServerWorld worldServer = (ServerWorld) entity.getEntityWorld(); - - entity.setPosition(x + 0.5, y + 0.5, z + 0.5); - worldServer.resetUpdateEntityTick(); - } - } - return; - } - } - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectTeleport(key); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java deleted file mode 100644 index dfd9f1be..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyArrayEffectUpdraft.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.iface.IAlchemyArray; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class AlchemyArrayEffectUpdraft extends AlchemyArrayEffect { - public AlchemyArrayEffectUpdraft(String key) { - super(key); - } - - @Override - public boolean update(TileEntity tile, int ticksActive) { - return false; - } - - @Override - public void onEntityCollidedWithBlock(IAlchemyArray array, World world, BlockPos pos, BlockState state, Entity entity) { - double motionY = 1; - double motionYGlowstoneMod = 0.1; - double motionYFeatherMod = 0.05; - - entity.fallDistance = 0; - TileAlchemyArray tileArray = (TileAlchemyArray) array; - motionY += motionYGlowstoneMod * (tileArray.getStackInSlot(0).getCount() - 1); // Glowstone Dust - motionY += motionYFeatherMod * (tileArray.getStackInSlot(1).getCount() - 1); // Feathers - - entity.motionY = motionY; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public AlchemyArrayEffect getNewCopy() { - return new AlchemyArrayEffectUpdraft(key); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java deleted file mode 100644 index 1c80f949..00000000 --- a/src/main/java/WayofTime/bloodmagic/alchemyArray/AlchemyCircleRenderer.java +++ /dev/null @@ -1,151 +0,0 @@ -package WayofTime.bloodmagic.alchemyArray; - -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class AlchemyCircleRenderer { - public final ResourceLocation arrayResource; - public float offsetFromFace = -0.9f; - - public AlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - } - - public AlchemyCircleRenderer(ResourceLocation arrayResource) { - this.arrayResource = arrayResource; - } - - public float getRotation(float craftTime) { - float offset = 2; - if (craftTime >= offset) { - float modifier = (float) Math.pow(craftTime - offset, 1.5); - return modifier * 1f; - } - return 0; - } - - public float getSecondaryRotation(float craftTime) { - float offset = 50; - if (craftTime >= offset) { - float modifier = (float) Math.pow(craftTime - offset, 1.7); - return modifier * 0.5f; - } - return 0; - } - - public float getSizeModifier(float craftTime) { - if (craftTime >= 150 && craftTime <= 250) { - return (200 - craftTime) / 50f; - } - return 1.0f; - } - - public float getVerticalOffset(float craftTime) { - if (craftTime >= 5) { - if (craftTime <= 40) { - return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); - } else { - return -0.4f; - } - } - return 0; - } - - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / - // this.rotationspeed) * this.rotationspeed) + this.rotationspeed * f; - float rot = getRotation(craftTime); - float secondaryRot = getSecondaryRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - GlStateManager.rotate(secondaryRot, 1, 0, 0); - GlStateManager.rotate(secondaryRot * 0.45812f, 0, 0, 1); - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java index abc937c7..bb9b4562 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarComponent.java @@ -1,55 +1,62 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; import net.minecraft.util.math.BlockPos; /** * Used for building the altar structure. */ -public class AltarComponent { - private final BlockPos offset; - private final ComponentType component; - private boolean upgradeSlot; +public class AltarComponent +{ + private final BlockPos offset; + private final ComponentType component; + private boolean upgradeSlot; - /** - * Sets a component location for the altar. - * - * @param offset - Where the block should be in relation to the Altar - * @param component - The type of Component the location should contain - */ - public AltarComponent(BlockPos offset, ComponentType component) { - this.offset = offset; - this.component = component; - } + /** + * Sets a component location for the altar. + * + * @param offset - Where the block should be in relation to the Altar + * @param component - The type of Component the location should contain + */ + public AltarComponent(BlockPos offset, ComponentType component) + { + this.offset = offset; + this.component = component; + } - /** - * Use for setting a location at which there must be a block, but the type - * of block does not matter. - * - * @param offset - Where the block should be in relation to the Altar - */ - public AltarComponent(BlockPos offset) { - this(offset, ComponentType.NOTAIR); - } + /** + * Use for setting a location at which there must be a block, but the type of + * block does not matter. + * + * @param offset - Where the block should be in relation to the Altar + */ + public AltarComponent(BlockPos offset) + { + this(offset, ComponentType.NOTAIR); + } - /** - * Sets the location to an upgrade slot. - * - * @return the current instance for further use. - */ - public AltarComponent setUpgradeSlot() { - this.upgradeSlot = true; - return this; - } + /** + * Sets the location to an upgrade slot. + * + * @return the current instance for further use. + */ + public AltarComponent setUpgradeSlot() + { + this.upgradeSlot = true; + return this; + } - public BlockPos getOffset() { - return offset; - } + public BlockPos getOffset() + { + return offset; + } - public boolean isUpgradeSlot() { - return upgradeSlot; - } + public boolean isUpgradeSlot() + { + return upgradeSlot; + } - public ComponentType getComponent() { - return component; - } + public ComponentType getComponent() + { + return component; + } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java index a347fa15..7ab6c3ff 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarTier.java @@ -1,149 +1,172 @@ -package WayofTime.bloodmagic.altar; - -import WayofTime.bloodmagic.ConfigHandler; -import com.google.common.collect.Lists; -import net.minecraft.util.math.BlockPos; +package wayoftime.bloodmagic.altar; import java.util.List; import java.util.function.Consumer; -public enum AltarTier { - ONE() { - @Override - public void buildComponents(Consumer components) { - // Nada - } - }, TWO() { - @Override - public void buildComponents(Consumer components) { - components.accept(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE)); - components.accept(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE)); - components.accept(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE)); - components.accept(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE)); - } - }, - THREE() { - @Override - public void buildComponents(Consumer components) { - // Doesn't pull from tier 2 because upgrades slots are different - components.accept(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-3, -1, -3))); - components.accept(new AltarComponent(new BlockPos(-3, 0, -3))); - components.accept(new AltarComponent(new BlockPos(3, -1, -3))); - components.accept(new AltarComponent(new BlockPos(3, 0, -3))); - components.accept(new AltarComponent(new BlockPos(-3, -1, 3))); - components.accept(new AltarComponent(new BlockPos(-3, 0, 3))); - components.accept(new AltarComponent(new BlockPos(3, -1, 3))); - components.accept(new AltarComponent(new BlockPos(3, 0, 3))); - components.accept(new AltarComponent(new BlockPos(-3, 1, -3), ComponentType.GLOWSTONE)); - components.accept(new AltarComponent(new BlockPos(3, 1, -3), ComponentType.GLOWSTONE)); - components.accept(new AltarComponent(new BlockPos(-3, 1, 3), ComponentType.GLOWSTONE)); - components.accept(new AltarComponent(new BlockPos(3, 1, 3), ComponentType.GLOWSTONE)); +import com.google.common.collect.Lists; - for (int i = -2; i <= 2; i++) { - components.accept(new AltarComponent(new BlockPos(3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -2, 3), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -2, -3), ComponentType.BLOODRUNE).setUpgradeSlot()); - } - } - }, - FOUR() { - @Override - public void buildComponents(Consumer components) { - THREE.getAltarComponents().forEach(components); +import net.minecraft.util.math.BlockPos; - for (int i = -3; i <= 3; i++) { - components.accept(new AltarComponent(new BlockPos(5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -3, 5), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -3, -5), ComponentType.BLOODRUNE).setUpgradeSlot()); - } +public enum AltarTier +{ + ONE() + { + @Override + public void buildComponents(Consumer components) + { + // Nada + } + }, + TWO() + { + @Override + public void buildComponents(Consumer components) + { + components.accept(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE)); + components.accept(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE)); + components.accept(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE)); + components.accept(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE)); + } + }, + THREE() + { + @Override + public void buildComponents(Consumer components) + { + // Doesn't pull from tier 2 because upgrades slots are different + components.accept(new AltarComponent(new BlockPos(-1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(0, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, -1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, 0), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(0, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(1, -1, 1), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-3, -1, -3))); + components.accept(new AltarComponent(new BlockPos(-3, 0, -3))); + components.accept(new AltarComponent(new BlockPos(3, -1, -3))); + components.accept(new AltarComponent(new BlockPos(3, 0, -3))); + components.accept(new AltarComponent(new BlockPos(-3, -1, 3))); + components.accept(new AltarComponent(new BlockPos(-3, 0, 3))); + components.accept(new AltarComponent(new BlockPos(3, -1, 3))); + components.accept(new AltarComponent(new BlockPos(3, 0, 3))); + components.accept(new AltarComponent(new BlockPos(-3, 1, -3), ComponentType.GLOWSTONE)); + components.accept(new AltarComponent(new BlockPos(3, 1, -3), ComponentType.GLOWSTONE)); + components.accept(new AltarComponent(new BlockPos(-3, 1, 3), ComponentType.GLOWSTONE)); + components.accept(new AltarComponent(new BlockPos(3, 1, 3), ComponentType.GLOWSTONE)); - for (int i = -2; i <= 1; i++) { - components.accept(new AltarComponent(new BlockPos(5, i, 5))); - components.accept(new AltarComponent(new BlockPos(5, i, -5))); - components.accept(new AltarComponent(new BlockPos(-5, i, -5))); - components.accept(new AltarComponent(new BlockPos(-5, i, 5))); - } + for (int i = -2; i <= 2; i++) + { + components.accept(new AltarComponent(new BlockPos(3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-3, -2, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -2, 3), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -2, -3), ComponentType.BLOODRUNE).setUpgradeSlot()); + } + } + }, + FOUR() + { + @Override + public void buildComponents(Consumer components) + { + THREE.getAltarComponents().forEach(components); - components.accept(new AltarComponent(new BlockPos(5, 2, 5), ComponentType.BLOODSTONE)); - components.accept(new AltarComponent(new BlockPos(5, 2, -5), ComponentType.BLOODSTONE)); - components.accept(new AltarComponent(new BlockPos(-5, 2, -5), ComponentType.BLOODSTONE)); - components.accept(new AltarComponent(new BlockPos(-5, 2, 5), ComponentType.BLOODSTONE)); - } - }, - FIVE() { - @Override - public void buildComponents(Consumer components) { - FOUR.getAltarComponents().forEach(components); - components.accept(new AltarComponent(new BlockPos(-8, -3, 8), ComponentType.BEACON)); - components.accept(new AltarComponent(new BlockPos(-8, -3, -8), ComponentType.BEACON)); - components.accept(new AltarComponent(new BlockPos(8, -3, -8), ComponentType.BEACON)); - components.accept(new AltarComponent(new BlockPos(8, -3, 8), ComponentType.BEACON)); + for (int i = -3; i <= 3; i++) + { + components.accept(new AltarComponent(new BlockPos(5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-5, -3, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -3, 5), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -3, -5), ComponentType.BLOODRUNE).setUpgradeSlot()); + } - for (int i = -6; i <= 6; i++) { - components.accept(new AltarComponent(new BlockPos(8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -4, 8), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -4, -8), ComponentType.BLOODRUNE).setUpgradeSlot()); - } - } - }, - SIX() { - @Override - public void buildComponents(Consumer components) { - FIVE.getAltarComponents().forEach(components); + for (int i = -2; i <= 1; i++) + { + components.accept(new AltarComponent(new BlockPos(5, i, 5))); + components.accept(new AltarComponent(new BlockPos(5, i, -5))); + components.accept(new AltarComponent(new BlockPos(-5, i, -5))); + components.accept(new AltarComponent(new BlockPos(-5, i, 5))); + } - for (int i = -4; i <= 2; i++) { - components.accept(new AltarComponent(new BlockPos(11, i, 11))); - components.accept(new AltarComponent(new BlockPos(-11, i, -11))); - components.accept(new AltarComponent(new BlockPos(11, i, -11))); - components.accept(new AltarComponent(new BlockPos(-11, i, 11))); - } + components.accept(new AltarComponent(new BlockPos(5, 2, 5), ComponentType.BLOODSTONE)); + components.accept(new AltarComponent(new BlockPos(5, 2, -5), ComponentType.BLOODSTONE)); + components.accept(new AltarComponent(new BlockPos(-5, 2, -5), ComponentType.BLOODSTONE)); + components.accept(new AltarComponent(new BlockPos(-5, 2, 5), ComponentType.BLOODSTONE)); + } + }, + FIVE() + { + @Override + public void buildComponents(Consumer components) + { + FOUR.getAltarComponents().forEach(components); + components.accept(new AltarComponent(new BlockPos(-8, -3, 8), ComponentType.BEACON)); + components.accept(new AltarComponent(new BlockPos(-8, -3, -8), ComponentType.BEACON)); + components.accept(new AltarComponent(new BlockPos(8, -3, -8), ComponentType.BEACON)); + components.accept(new AltarComponent(new BlockPos(8, -3, 8), ComponentType.BEACON)); - components.accept(new AltarComponent(new BlockPos(11, 3, 11), ComponentType.CRYSTAL)); - components.accept(new AltarComponent(new BlockPos(-11, 3, -11), ComponentType.CRYSTAL)); - components.accept(new AltarComponent(new BlockPos(11, 3, -11), ComponentType.CRYSTAL)); - components.accept(new AltarComponent(new BlockPos(-11, 3, 11), ComponentType.CRYSTAL)); + for (int i = -6; i <= 6; i++) + { + components.accept(new AltarComponent(new BlockPos(8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-8, -4, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -4, 8), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -4, -8), ComponentType.BLOODRUNE).setUpgradeSlot()); + } + } + }, + SIX() + { + @Override + public void buildComponents(Consumer components) + { + FIVE.getAltarComponents().forEach(components); - for (int i = -9; i <= 9; i++) { - components.accept(new AltarComponent(new BlockPos(11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(-11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -5, 11), ComponentType.BLOODRUNE).setUpgradeSlot()); - components.accept(new AltarComponent(new BlockPos(i, -5, -11), ComponentType.BLOODRUNE).setUpgradeSlot()); - } - } - }; + for (int i = -4; i <= 2; i++) + { + components.accept(new AltarComponent(new BlockPos(11, i, 11))); + components.accept(new AltarComponent(new BlockPos(-11, i, -11))); + components.accept(new AltarComponent(new BlockPos(11, i, -11))); + components.accept(new AltarComponent(new BlockPos(-11, i, 11))); + } - public static final int MAXTIERS = ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent ? values().length : values().length - 1; + components.accept(new AltarComponent(new BlockPos(11, 3, 11), ComponentType.CRYSTAL)); + components.accept(new AltarComponent(new BlockPos(-11, 3, -11), ComponentType.CRYSTAL)); + components.accept(new AltarComponent(new BlockPos(11, 3, -11), ComponentType.CRYSTAL)); + components.accept(new AltarComponent(new BlockPos(-11, 3, 11), ComponentType.CRYSTAL)); - private List altarComponents; + for (int i = -9; i <= 9; i++) + { + components.accept(new AltarComponent(new BlockPos(11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(-11, -5, i), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -5, 11), ComponentType.BLOODRUNE).setUpgradeSlot()); + components.accept(new AltarComponent(new BlockPos(i, -5, -11), ComponentType.BLOODRUNE).setUpgradeSlot()); + } + } + }; - AltarTier() { - this.altarComponents = Lists.newArrayList(); + public static final int MAXTIERS = values().length; - buildComponents(altarComponents::add); - } + private List altarComponents; - public abstract void buildComponents(Consumer components); + AltarTier() + { + this.altarComponents = Lists.newArrayList(); - public int toInt() { - return ordinal() + 1; - } + buildComponents(altarComponents::add); + } - public List getAltarComponents() { - return altarComponents; - } -} + public abstract void buildComponents(Consumer components); + + public int toInt() + { + return ordinal() + 1; + } + + public List getAltarComponents() + { + return altarComponents; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java index fce1de92..f7d9cc43 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUpgrade.java @@ -1,24 +1,29 @@ -package WayofTime.bloodmagic.altar; - -import WayofTime.bloodmagic.block.enums.BloodRuneType; -import com.google.common.collect.Maps; +package wayoftime.bloodmagic.altar; import java.util.EnumMap; -public class AltarUpgrade { +import com.google.common.collect.Maps; - private final EnumMap upgradeLevels; +import wayoftime.bloodmagic.block.enums.BloodRuneType; - public AltarUpgrade() { - this.upgradeLevels = Maps.newEnumMap(BloodRuneType.class); - } +public class AltarUpgrade +{ - public AltarUpgrade upgrade(BloodRuneType rune) { - upgradeLevels.compute(rune, (r, l) -> l == null ? 1 : l + 1); - return this; - } + private final EnumMap upgradeLevels; - public int getLevel(BloodRuneType rune) { - return upgradeLevels.getOrDefault(rune, 0); - } + public AltarUpgrade() + { + this.upgradeLevels = Maps.newEnumMap(BloodRuneType.class); + } + + public AltarUpgrade upgrade(BloodRuneType rune) + { + upgradeLevels.compute(rune, (r, l) -> l == null ? 1 : l + 1); + return this; + } + + public int getLevel(BloodRuneType rune) + { + return upgradeLevels.getOrDefault(rune, 0); + } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java index abbf30c4..9bdfd94c 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java +++ b/src/main/java/WayofTime/bloodmagic/altar/AltarUtil.java @@ -1,86 +1,99 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.apache.commons.lang3.tuple.Pair; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.tile.TileAltar; import net.minecraft.block.BlockState; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.common.block.BlockBloodRune; +import wayoftime.bloodmagic.tile.TileAltar; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; +public class AltarUtil +{ -public class AltarUtil { + @Nonnull + public static AltarTier getTier(World world, BlockPos pos) + { + TileEntity tile = world.getTileEntity(pos); + if (!(tile instanceof TileAltar)) + return AltarTier.ONE; - @Nonnull - public static AltarTier getTier(World world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (!(tile instanceof TileAltar)) - return AltarTier.ONE; + AltarTier lastCheck = AltarTier.ONE; + for (AltarTier tier : AltarTier.values()) + { + for (AltarComponent component : tier.getAltarComponents()) + { + BlockPos componentPos = pos.add(component.getOffset()); + BlockState worldState = world.getBlockState(componentPos); - AltarTier lastCheck = AltarTier.ONE; - for (AltarTier tier : AltarTier.values()) { - for (AltarComponent component : tier.getAltarComponents()) { - BlockPos componentPos = pos.add(component.getOffset()); - BlockState worldState = world.getBlockState(componentPos); + if (worldState.getBlock() instanceof IAltarComponent) + if (((IAltarComponent) worldState.getBlock()).getType(world, worldState, componentPos) == component.getComponent()) + continue; - if (worldState.getBlock() instanceof IAltarComponent) - if (((IAltarComponent) worldState.getBlock()).getType(world, worldState, componentPos) == component.getComponent()) - continue; + if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR + && !worldState.getMaterial().isLiquid()) + continue; - if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR && !worldState.getMaterial().isLiquid()) - continue; + List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); + if (!validStates.contains(worldState)) + return lastCheck; + } - List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); - if (!validStates.contains(worldState)) - return lastCheck; - } + lastCheck = tier; + } - lastCheck = tier; - } + return lastCheck; + } - return lastCheck; - } + @Nonnull + public static AltarUpgrade getUpgrades(World world, BlockPos pos, AltarTier currentTier) + { + AltarUpgrade upgrades = new AltarUpgrade(); - @Nonnull - public static AltarUpgrade getUpgrades(World world, BlockPos pos, AltarTier currentTier) { - AltarUpgrade upgrades = new AltarUpgrade(); + for (AltarComponent component : currentTier.getAltarComponents()) + { + if (!component.isUpgradeSlot() || component.getComponent() != ComponentType.BLOODRUNE) + continue; - for (AltarComponent component : currentTier.getAltarComponents()) { - if (!component.isUpgradeSlot() || component.getComponent() != ComponentType.BLOODRUNE) - continue; + BlockPos componentPos = pos.add(component.getOffset()); + BlockState state = world.getBlockState(componentPos); + if (state.getBlock() instanceof BlockBloodRune) + upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos)); + } - BlockPos componentPos = pos.add(component.getOffset()); - BlockState state = world.getBlockState(componentPos); - if (state.getBlock() instanceof BlockBloodRune) - upgrades.upgrade(((BlockBloodRune) state.getBlock()).getBloodRune(world, componentPos, state)); - } + return upgrades; + } - return upgrades; - } + @Nullable + public static Pair getFirstMissingComponent(World world, BlockPos pos, int altarTier) + { + if (altarTier >= AltarTier.MAXTIERS) + return null; - @Nullable - public static Pair getFirstMissingComponent(World world, BlockPos pos, int altarTier) { - if (altarTier >= AltarTier.MAXTIERS) - return null; + for (AltarTier tier : AltarTier.values()) + { + for (AltarComponent component : tier.getAltarComponents()) + { + BlockPos componentPos = pos.add(component.getOffset()); + BlockState worldState = world.getBlockState(componentPos); + if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR + && !worldState.getMaterial().isLiquid()) + continue; - for (AltarTier tier : AltarTier.values()) { - for (AltarComponent component : tier.getAltarComponents()) { - BlockPos componentPos = pos.add(component.getOffset()); - BlockState worldState = world.getBlockState(componentPos); - if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR && !worldState.getMaterial().isLiquid()) - continue; + List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); + if (!validStates.contains(worldState)) + return Pair.of(componentPos, component.getComponent()); + } + } - List validStates = BloodMagicAPI.INSTANCE.getComponentStates(component.getComponent()); - if (!validStates.contains(worldState)) - return Pair.of(componentPos, component.getComponent()); - } - } - - return null; - } + return null; + } } diff --git a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java index 036aea15..34b6a77d 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/BloodAltar.java @@ -1,642 +1,818 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; -import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.block.enums.BloodRuneType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NetworkHelper; import com.google.common.base.Enums; + import net.minecraft.block.BlockState; -import net.minecraft.block.RedstoneLampBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.particles.RedstoneParticleData; import net.minecraft.util.Direction; -import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidTankProperties; +import net.minecraftforge.fluids.capability.templates.FluidTank; import net.minecraftforge.items.ItemHandlerHelper; - -public class BloodAltar implements IFluidHandler { - - public boolean isActive; - protected FluidStack fluidOutput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); - protected FluidStack fluidInput = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); - private TileAltar tileAltar; - private int internalCounter = 0; - private AltarTier altarTier = AltarTier.ONE; - private AltarUpgrade upgrade; - private int capacity = Fluid.BUCKET_VOLUME * 10; - private FluidStack fluid = new FluidStack(BlockLifeEssence.getLifeEssence(), 0); - 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 = 1; - private float orbCapacityMultiplier; - private float dislocationMultiplier; - private int accelerationUpgrades; - private boolean isUpgraded; - private boolean isResultBlock; - private int bufferCapacity = Fluid.BUCKET_VOLUME; - private int progress; - private int lockdownDuration; - private int demonBloodDuration; - private int totalCharge = 0; //TODO save - private int chargingRate = 0; - private int chargingFrequency = 0; - private int maxCharge = 0; - private int cooldownAfterCrafting = 60; - private RecipeBloodAltar recipe; - private AltarTier currentTierDisplayed = AltarTier.ONE; - - public BloodAltar(TileAltar tileAltar) { - this.tileAltar = tileAltar; - } - - public void readFromNBT(CompoundNBT tagCompound) { - if (!tagCompound.hasKey(Constants.NBT.EMPTY)) { - FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); - - if (fluid != null) - setMainFluid(fluid); - - FluidStack fluidOut = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInt(Constants.NBT.OUTPUT_AMOUNT)); - setOutputFluid(fluidOut); - - FluidStack fluidIn = new FluidStack(BlockLifeEssence.getLifeEssence(), tagCompound.getInt(Constants.NBT.INPUT_AMOUNT)); - setInputFluid(fluidIn); - } - - internalCounter = tagCompound.getInt("internalCounter"); - altarTier = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_TIER)).or(AltarTier.ONE); - isActive = tagCompound.getBoolean(Constants.NBT.ALTAR_ACTIVE); - liquidRequired = tagCompound.getInt(Constants.NBT.ALTAR_LIQUID_REQ); - canBeFilled = tagCompound.getBoolean(Constants.NBT.ALTAR_FILLABLE); - isUpgraded = tagCompound.getBoolean(Constants.NBT.ALTAR_UPGRADED); - consumptionRate = tagCompound.getInt(Constants.NBT.ALTAR_CONSUMPTION_RATE); - drainRate = tagCompound.getInt(Constants.NBT.ALTAR_DRAIN_RATE); - consumptionMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_CONSUMPTION_MULTIPLIER); - efficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_EFFICIENCY_MULTIPLIER); - selfSacrificeEfficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_SELF_SACRIFICE_MULTIPLIER); - sacrificeEfficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_SACRIFICE_MULTIPLIER); - capacityMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_CAPACITY_MULTIPLIER); - orbCapacityMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_ORB_CAPACITY_MULTIPLIER); - dislocationMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_DISLOCATION_MULTIPLIER); - capacity = tagCompound.getInt(Constants.NBT.ALTAR_CAPACITY); - bufferCapacity = tagCompound.getInt(Constants.NBT.ALTAR_BUFFER_CAPACITY); - progress = tagCompound.getInt(Constants.NBT.ALTAR_PROGRESS); - isResultBlock = tagCompound.getBoolean(Constants.NBT.ALTAR_IS_RESULT_BLOCK); - lockdownDuration = tagCompound.getInt(Constants.NBT.ALTAR_LOCKDOWN_DURATION); - accelerationUpgrades = tagCompound.getInt(Constants.NBT.ALTAR_ACCELERATION_UPGRADES); - demonBloodDuration = tagCompound.getInt(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION); - cooldownAfterCrafting = tagCompound.getInt(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING); - chargingRate = tagCompound.getInt(Constants.NBT.ALTAR_CHARGE_RATE); - chargingFrequency = tagCompound.getInt(Constants.NBT.ALTAR_CHARGE_FREQUENCY); - totalCharge = tagCompound.getInt(Constants.NBT.ALTAR_TOTAL_CHARGE); - maxCharge = tagCompound.getInt(Constants.NBT.ALTAR_MAX_CHARGE); - currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); - } - - public void writeToNBT(CompoundNBT tagCompound) { - - if (fluid != null) - fluid.writeToNBT(tagCompound); - else - tagCompound.putString(Constants.NBT.EMPTY, ""); - - if (fluidOutput != null) - tagCompound.putInt(Constants.NBT.OUTPUT_AMOUNT, fluidOutput.amount); - - if (fluidInput != null) - tagCompound.putInt(Constants.NBT.INPUT_AMOUNT, fluidInput.amount); - - tagCompound.putInt("internalCounter", internalCounter); - tagCompound.putString(Constants.NBT.ALTAR_TIER, altarTier.name()); - tagCompound.putBoolean(Constants.NBT.ALTAR_ACTIVE, isActive); - tagCompound.putInt(Constants.NBT.ALTAR_LIQUID_REQ, liquidRequired); - tagCompound.putBoolean(Constants.NBT.ALTAR_FILLABLE, canBeFilled); - tagCompound.putBoolean(Constants.NBT.ALTAR_UPGRADED, isUpgraded); - tagCompound.putInt(Constants.NBT.ALTAR_CONSUMPTION_RATE, consumptionRate); - tagCompound.putInt(Constants.NBT.ALTAR_DRAIN_RATE, drainRate); - tagCompound.putFloat(Constants.NBT.ALTAR_CONSUMPTION_MULTIPLIER, consumptionMultiplier); - tagCompound.putFloat(Constants.NBT.ALTAR_EFFICIENCY_MULTIPLIER, efficiencyMultiplier); - tagCompound.putFloat(Constants.NBT.ALTAR_SACRIFICE_MULTIPLIER, sacrificeEfficiencyMultiplier); - tagCompound.putFloat(Constants.NBT.ALTAR_SELF_SACRIFICE_MULTIPLIER, selfSacrificeEfficiencyMultiplier); - tagCompound.putBoolean(Constants.NBT.ALTAR_IS_RESULT_BLOCK, isResultBlock); - tagCompound.putFloat(Constants.NBT.ALTAR_CAPACITY_MULTIPLIER, capacityMultiplier); - tagCompound.putFloat(Constants.NBT.ALTAR_ORB_CAPACITY_MULTIPLIER, orbCapacityMultiplier); - tagCompound.putFloat(Constants.NBT.ALTAR_DISLOCATION_MULTIPLIER, dislocationMultiplier); - tagCompound.putInt(Constants.NBT.ALTAR_CAPACITY, capacity); - tagCompound.putInt(Constants.NBT.ALTAR_PROGRESS, progress); - tagCompound.putInt(Constants.NBT.ALTAR_BUFFER_CAPACITY, bufferCapacity); - tagCompound.putInt(Constants.NBT.ALTAR_LOCKDOWN_DURATION, lockdownDuration); - tagCompound.putInt(Constants.NBT.ALTAR_ACCELERATION_UPGRADES, accelerationUpgrades); - tagCompound.putInt(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION, demonBloodDuration); - tagCompound.putInt(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING, cooldownAfterCrafting); - tagCompound.putInt(Constants.NBT.ALTAR_CHARGE_RATE, chargingRate); - tagCompound.putInt(Constants.NBT.ALTAR_CHARGE_FREQUENCY, chargingFrequency); - tagCompound.putInt(Constants.NBT.ALTAR_TOTAL_CHARGE, totalCharge); - tagCompound.putInt(Constants.NBT.ALTAR_MAX_CHARGE, maxCharge); - tagCompound.putString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); - } - - public void startCycle() { - if (tileAltar.getWorld() != null) - tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); - - checkTier(); - - if ((fluid == null || fluid.amount <= 0) && totalCharge <= 0) - return; - - if (!isActive) - progress = 0; - - ItemStack input = tileAltar.getStackInSlot(0); - - if (!input.isEmpty()) { - // Do recipes - RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(input); - if (recipe != null) { - if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) { - this.isActive = true; - this.recipe = recipe; - this.liquidRequired = recipe.getSyphon(); - this.consumptionRate = recipe.getConsumeRate(); - this.drainRate = recipe.getDrainRate(); - this.canBeFilled = false; - return; - } - } else if (input.getItem() instanceof IBloodOrb) { - BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); - this.isActive = canBeFilled = orb != null && altarTier.toInt() >= orb.getTier(); - return; - } - } - - isActive = false; - } - - public void update() { - World world = tileAltar.getWorld(); - BlockPos pos = tileAltar.getPos(); - - if (world.isRemote) - return; - - // Used instead of the world time for checks that do not happen every tick - internalCounter++; - - if (lockdownDuration > 0) - lockdownDuration--; - - if (internalCounter % 20 == 0) { - for (Direction facing : Direction.VALUES) { - BlockPos newPos = pos.offset(facing); - BlockState block = world.getBlockState(newPos); - block.getBlock().onNeighborChange(world, newPos, pos); - } - } - if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) { - int syphonMax = (int) (20 * this.dislocationMultiplier); - int fluidInputted; - int fluidOutputted; - 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; - tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); - } - - if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) { - int chargeInputted = Math.min(chargingRate, this.fluid.amount); - chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); - totalCharge += chargeInputted; - this.fluid.amount -= chargeInputted; - tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); - } - - if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) { - /* Redstone Lamp below altar: Switch Off */ - BlockState state = world.getBlockState(pos); - if (state.getValue(BlockAltar.POWERED)) { - world.setBlockState(pos, state.cycleProperty(BlockAltar.POWERED), 3); - world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); - } - startCycle(); - } - - updateAltar(); - } - - private void updateAltar() { - if (!isActive) { - if (cooldownAfterCrafting > 0) - cooldownAfterCrafting--; - return; - } - - if (!canBeFilled && recipe == null) { - startCycle(); - return; - } - - ItemStack input = tileAltar.getStackInSlot(0); - - if (input.isEmpty()) - return; - - World world = tileAltar.getWorld(); - BlockPos pos = tileAltar.getPos(); - - if (world.isRemote) - return; - - if (!canBeFilled) { - boolean hasOperated = false; - int stackSize = input.getCount(); - - if (totalCharge > 0) { - int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); - - totalCharge -= chargeDrained; - progress += chargeDrained; - - hasOperated = true; - } - if (fluid != null && fluid.amount >= 1) { - int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? consumptionRate * (1 + consumptionMultiplier) : consumptionRate), fluid.amount); - - if (liquidDrained > (liquidRequired * stackSize - progress)) - liquidDrained = liquidRequired * stackSize - progress; - - fluid.amount = fluid.amount - liquidDrained; - progress += liquidDrained; - - hasOperated = true; - - if (internalCounter % 4 == 0 && world instanceof ServerWorld) { - ServerWorld server = (ServerWorld) world; - server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.2, 0, 0.2, 0); - } - - } else if (!hasOperated && progress > 0) { - progress = Math.max(0, progress - (int) (efficiencyMultiplier * drainRate)); - - if (internalCounter % 2 == 0 && world instanceof ServerWorld) { - ServerWorld server = (ServerWorld) world; - server.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0.1, 0, 0.1, 0); - } - } - - if (hasOperated) { - if (progress >= liquidRequired * stackSize) { - ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); - - BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); - MinecraftForge.EVENT_BUS.post(event); - tileAltar.setInventorySlotContents(0, event.getOutput()); - progress = 0; - - if (world instanceof ServerWorld) { - ServerWorld server = (ServerWorld) world; - server.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); - } - - /* Redstone Lamp below altar: Switch On */ - /* Switches on when crafting finishes */ - if (world.getBlockState(pos.down()).getBlock() instanceof RedstoneLampBlock) { - world.setBlockState(pos, world.getBlockState(pos).cycleProperty(BlockAltar.POWERED), 3); - world.notifyNeighborsOfStateChange(pos, RegistrarBloodMagicBlocks.ALTAR, false); - } - - this.cooldownAfterCrafting = 30; - this.isActive = false; - } - } - } else { - ItemStack contained = tileAltar.getStackInSlot(0); - - if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) || !(contained.getItem() instanceof IBindable)) - return; - - BloodOrb orb = ((IBloodOrb) contained.getItem()).getOrb(contained); - Binding binding = ((IBindable) contained.getItem()).getBinding(contained); - - if (binding == null || orb == null) - return; - - if (fluid != null && fluid.amount >= 1) { - int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 ? orb.getFillRate() * (1 + consumptionMultiplier) : orb.getFillRate()), fluid.amount); - int drain = NetworkHelper.getSoulNetwork(binding).add(SoulTicket.block(world, pos, liquidDrained), (int) (orb.getCapacity() * this.orbCapacityMultiplier)); - fluid.amount = fluid.amount - drain; - - if (drain > 0 && internalCounter % 4 == 0 && world instanceof ServerWorld) { - ServerWorld server = (ServerWorld) world; - server.spawnParticle(EnumParticleTypes.SPELL_WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + 0.5, 1, 0, 0, 0, 0.001); - } - } - } - - tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); - } - - public void checkTier() { - AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); - this.altarTier = tier; - - upgrade = AltarUtil.getUpgrades(tileAltar.getWorld(), tileAltar.getPos(), tier); - - if (tier.equals(currentTierDisplayed)) - currentTierDisplayed = AltarTier.ONE; - - if (tier.equals(AltarTier.ONE)) { - upgrade = null; - isUpgraded = false; - this.consumptionMultiplier = 0; - this.efficiencyMultiplier = 1; - this.sacrificeEfficiencyMultiplier = 0; - this.selfSacrificeEfficiencyMultiplier = 0; - this.capacityMultiplier = 1; - this.orbCapacityMultiplier = 1; - this.dislocationMultiplier = 1; - this.accelerationUpgrades = 0; - this.chargingFrequency = 20; - this.chargingRate = 0; - this.maxCharge = 0; - this.totalCharge = 0; - return; - } else if (!tier.equals(AltarTier.ONE)) { - this.isUpgraded = true; - this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); - this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); - this.efficiencyMultiplier = (float) Math.pow(0.85, upgrade.getLevel(BloodRuneType.EFFICIENCY)); - this.sacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getLevel(BloodRuneType.SACRIFICE)); - this.selfSacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getLevel(BloodRuneType.SELF_SACRIFICE)); - this.capacityMultiplier = (float) ((1 * Math.pow(1.10, upgrade.getLevel(BloodRuneType.AUGMENTED_CAPACITY))) + 0.20 * upgrade.getLevel(BloodRuneType.CAPACITY)); - this.dislocationMultiplier = (float) (Math.pow(1.2, upgrade.getLevel(BloodRuneType.DISPLACEMENT))); - this.orbCapacityMultiplier = (float) (1 + 0.02 * upgrade.getLevel(BloodRuneType.ORB)); - this.chargingFrequency = Math.max(20 - accelerationUpgrades, 1); - this.chargingRate = (int) (10 * upgrade.getLevel(BloodRuneType.CHARGING) * (1 + consumptionMultiplier / 2)); - this.maxCharge = (int) (Fluid.BUCKET_VOLUME * Math.max(0.5 * capacityMultiplier, 1) * upgrade.getLevel(BloodRuneType.CHARGING)); - } - - this.capacity = (int) (Fluid.BUCKET_VOLUME * 10 * capacityMultiplier); - this.bufferCapacity = (int) (Fluid.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; - if (this.totalCharge > this.maxCharge) - this.totalCharge = this.maxCharge; - - tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); - } - - public int fillMainTank(int amount) { - int filledAmount = Math.min(capacity - fluid.amount, amount); - fluid.amount += filledAmount; - - return filledAmount; - } - - public void sacrificialDaggerCall(int amount, boolean isSacrifice) { - if (this.lockdownDuration > 0) { - int amt = (int) Math.min(bufferCapacity - fluidInput.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); - fluidInput.amount += amt; - } else { - fluid.amount += Math.min(capacity - fluid.amount, (isSacrifice ? 1 + sacrificeEfficiencyMultiplier : 1 + selfSacrificeEfficiencyMultiplier) * amount); - } - } - - public void setMainFluid(FluidStack fluid) { - this.fluid = fluid; - } - - public void setOutputFluid(FluidStack fluid) { - this.fluidOutput = fluid; - } - - public void setInputFluid(FluidStack fluid) { - this.fluidInput = fluid; - } - - public AltarUpgrade getUpgrade() { - return upgrade; - } - - public void setUpgrade(AltarUpgrade upgrade) { - this.upgrade = upgrade; - } - - public int getCapacity() { - return capacity; - } - - public FluidStack getFluid() { - return fluid; - } - - public int getFluidAmount() { - return fluid.amount; - } - - public int getCurrentBlood() { - return getFluidAmount(); - } - - public AltarTier getTier() { - return altarTier; - } - - public void setTier(AltarTier tier) { - this.altarTier = tier; - } - - public int getProgress() { - return progress; - } - - public float getSacrificeMultiplier() { - return sacrificeEfficiencyMultiplier; - } - - public float getSelfSacrificeMultiplier() { - return selfSacrificeEfficiencyMultiplier; - } - - public float getOrbMultiplier() { - return orbCapacityMultiplier; - } - - public float getDislocationMultiplier() { - return dislocationMultiplier; - } - - public float getConsumptionMultiplier() { - return consumptionMultiplier; - } - - public float getConsumptionRate() { - return consumptionRate; - } - - public int getLiquidRequired() { - return liquidRequired; - } - - public int getBufferCapacity() { - return bufferCapacity; - } - - public boolean setCurrentTierDisplayed(AltarTier altarTier) { - if (currentTierDisplayed == altarTier) - return false; - else - currentTierDisplayed = altarTier; - return true; - } - - public void addToDemonBloodDuration(int dur) { - this.demonBloodDuration += dur; - } - - public boolean hasDemonBlood() { - return this.demonBloodDuration > 0; - } - - public void decrementDemonBlood() { - this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); - } - - public void setActive() { - if (tileAltar.getStackInSlot(0).isEmpty()) { - isActive = false; - } - } - - public boolean isActive() { - return isActive; - } - - public void requestPauseAfterCrafting(int amount) { - if (this.isActive) { - this.cooldownAfterCrafting = amount; - } - } - - public int getChargingRate() { - return chargingRate; - } - - public int getTotalCharge() { - return totalCharge; - } - - public int getChargingFrequency() { - return chargingFrequency == 0 ? 1 : chargingFrequency; - } - - @Override - public int fill(FluidStack resource, boolean doFill) { - if (resource == null || resource.getFluid() != BlockLifeEssence.getLifeEssence()) { - 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)); - - 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; - } - - return filled; - } - - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - if (resource == null || !resource.isFluidEqual(fluidOutput)) { - return null; - } - return drain(resource.amount, doDrain); - } - - @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; - } - return stack; - } - - @Override - public IFluidTankProperties[] getTankProperties() { - return new IFluidTankProperties[]{new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity))}; - } - - public AltarTier getCurrentTierDisplayed() { - return currentTierDisplayed; - } -} +import wayoftime.bloodmagic.api.event.BloodMagicCraftedEvent; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.block.enums.BloodRuneType; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.iface.IBindable; +import wayoftime.bloodmagic.orb.BloodOrb; +import wayoftime.bloodmagic.orb.IBloodOrb; +import wayoftime.bloodmagic.tile.TileAltar; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NetworkHelper; + +public class BloodAltar// implements IFluidHandler +{ + + public boolean isActive; + + protected FluidStack fluidOutput = new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), 0); // TODO: Fix + protected FluidStack fluidInput = new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), 0); + + protected FluidTank tank = new FluidTank(FluidAttributes.BUCKET_VOLUME); + + private final LazyOptional holder = LazyOptional.of(() -> tank); + + private TileAltar tileAltar; + private int internalCounter = 0; + private AltarTier altarTier = AltarTier.ONE; + private AltarUpgrade upgrade; + private int capacity = FluidAttributes.BUCKET_VOLUME * 10; + private FluidStack fluid = new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), 0); + 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 = 1; + private float orbCapacityMultiplier; + private float dislocationMultiplier; + private int accelerationUpgrades; + private boolean isUpgraded; + private boolean isResultBlock; + private int bufferCapacity = FluidAttributes.BUCKET_VOLUME; + private int progress; + private int lockdownDuration; + private int demonBloodDuration; + private int totalCharge = 0; // TODO save + private int chargingRate = 0; + private int chargingFrequency = 0; + private int maxCharge = 0; + private int cooldownAfterCrafting = 60; + private RecipeBloodAltar recipe; + private AltarTier currentTierDisplayed = AltarTier.ONE; + + public BloodAltar(TileAltar tileAltar) + { + this.tileAltar = tileAltar; + } + + public void readFromNBT(CompoundNBT tagCompound) + { + if (!tagCompound.contains(Constants.NBT.EMPTY)) + { + FluidStack fluid = FluidStack.loadFluidStackFromNBT(tagCompound); + + if (fluid != null) + { + setMainFluid(new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), fluid.getAmount())); +// setMainFluid(fluid); + } else + { +// setMainFluid(new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), fluid.getAmount())); + } + + FluidStack fluidOut = new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), tagCompound.getInt(Constants.NBT.OUTPUT_AMOUNT)); + setOutputFluid(fluidOut); + + FluidStack fluidIn = new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), tagCompound.getInt(Constants.NBT.INPUT_AMOUNT)); + setInputFluid(fluidIn); + } + + internalCounter = tagCompound.getInt("internalCounter"); + altarTier = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_TIER)).or(AltarTier.ONE); + isActive = tagCompound.getBoolean(Constants.NBT.ALTAR_ACTIVE); + liquidRequired = tagCompound.getInt(Constants.NBT.ALTAR_LIQUID_REQ); + canBeFilled = tagCompound.getBoolean(Constants.NBT.ALTAR_FILLABLE); + isUpgraded = tagCompound.getBoolean(Constants.NBT.ALTAR_UPGRADED); + consumptionRate = tagCompound.getInt(Constants.NBT.ALTAR_CONSUMPTION_RATE); + drainRate = tagCompound.getInt(Constants.NBT.ALTAR_DRAIN_RATE); + consumptionMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_CONSUMPTION_MULTIPLIER); + efficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_EFFICIENCY_MULTIPLIER); + selfSacrificeEfficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_SELF_SACRIFICE_MULTIPLIER); + sacrificeEfficiencyMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_SACRIFICE_MULTIPLIER); + capacityMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_CAPACITY_MULTIPLIER); + orbCapacityMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_ORB_CAPACITY_MULTIPLIER); + dislocationMultiplier = tagCompound.getFloat(Constants.NBT.ALTAR_DISLOCATION_MULTIPLIER); + capacity = tagCompound.getInt(Constants.NBT.ALTAR_CAPACITY); + bufferCapacity = tagCompound.getInt(Constants.NBT.ALTAR_BUFFER_CAPACITY); + progress = tagCompound.getInt(Constants.NBT.ALTAR_PROGRESS); + isResultBlock = tagCompound.getBoolean(Constants.NBT.ALTAR_IS_RESULT_BLOCK); + lockdownDuration = tagCompound.getInt(Constants.NBT.ALTAR_LOCKDOWN_DURATION); + accelerationUpgrades = tagCompound.getInt(Constants.NBT.ALTAR_ACCELERATION_UPGRADES); + demonBloodDuration = tagCompound.getInt(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION); + cooldownAfterCrafting = tagCompound.getInt(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING); + chargingRate = tagCompound.getInt(Constants.NBT.ALTAR_CHARGE_RATE); + chargingFrequency = tagCompound.getInt(Constants.NBT.ALTAR_CHARGE_FREQUENCY); + totalCharge = tagCompound.getInt(Constants.NBT.ALTAR_TOTAL_CHARGE); + maxCharge = tagCompound.getInt(Constants.NBT.ALTAR_MAX_CHARGE); + currentTierDisplayed = Enums.getIfPresent(AltarTier.class, tagCompound.getString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED)).or(AltarTier.ONE); + } + + public void writeToNBT(CompoundNBT tagCompound) + { + + if (fluid != null) + fluid.writeToNBT(tagCompound); + else + tagCompound.putString(Constants.NBT.EMPTY, ""); + + if (fluidOutput != null) + tagCompound.putInt(Constants.NBT.OUTPUT_AMOUNT, fluidOutput.getAmount()); + + if (fluidInput != null) + tagCompound.putInt(Constants.NBT.INPUT_AMOUNT, fluidInput.getAmount()); + + tagCompound.putInt("internalCounter", internalCounter); + tagCompound.putString(Constants.NBT.ALTAR_TIER, altarTier.name()); + tagCompound.putBoolean(Constants.NBT.ALTAR_ACTIVE, isActive); + tagCompound.putInt(Constants.NBT.ALTAR_LIQUID_REQ, liquidRequired); + tagCompound.putBoolean(Constants.NBT.ALTAR_FILLABLE, canBeFilled); + tagCompound.putBoolean(Constants.NBT.ALTAR_UPGRADED, isUpgraded); + tagCompound.putInt(Constants.NBT.ALTAR_CONSUMPTION_RATE, consumptionRate); + tagCompound.putInt(Constants.NBT.ALTAR_DRAIN_RATE, drainRate); + tagCompound.putFloat(Constants.NBT.ALTAR_CONSUMPTION_MULTIPLIER, consumptionMultiplier); + tagCompound.putFloat(Constants.NBT.ALTAR_EFFICIENCY_MULTIPLIER, efficiencyMultiplier); + tagCompound.putFloat(Constants.NBT.ALTAR_SACRIFICE_MULTIPLIER, sacrificeEfficiencyMultiplier); + tagCompound.putFloat(Constants.NBT.ALTAR_SELF_SACRIFICE_MULTIPLIER, selfSacrificeEfficiencyMultiplier); + tagCompound.putBoolean(Constants.NBT.ALTAR_IS_RESULT_BLOCK, isResultBlock); + tagCompound.putFloat(Constants.NBT.ALTAR_CAPACITY_MULTIPLIER, capacityMultiplier); + tagCompound.putFloat(Constants.NBT.ALTAR_ORB_CAPACITY_MULTIPLIER, orbCapacityMultiplier); + tagCompound.putFloat(Constants.NBT.ALTAR_DISLOCATION_MULTIPLIER, dislocationMultiplier); + tagCompound.putInt(Constants.NBT.ALTAR_CAPACITY, capacity); + tagCompound.putInt(Constants.NBT.ALTAR_PROGRESS, progress); + tagCompound.putInt(Constants.NBT.ALTAR_BUFFER_CAPACITY, bufferCapacity); + tagCompound.putInt(Constants.NBT.ALTAR_LOCKDOWN_DURATION, lockdownDuration); + tagCompound.putInt(Constants.NBT.ALTAR_ACCELERATION_UPGRADES, accelerationUpgrades); + tagCompound.putInt(Constants.NBT.ALTAR_DEMON_BLOOD_DURATION, demonBloodDuration); + tagCompound.putInt(Constants.NBT.ALTAR_COOLDOWN_AFTER_CRAFTING, cooldownAfterCrafting); + tagCompound.putInt(Constants.NBT.ALTAR_CHARGE_RATE, chargingRate); + tagCompound.putInt(Constants.NBT.ALTAR_CHARGE_FREQUENCY, chargingFrequency); + tagCompound.putInt(Constants.NBT.ALTAR_TOTAL_CHARGE, totalCharge); + tagCompound.putInt(Constants.NBT.ALTAR_MAX_CHARGE, maxCharge); + tagCompound.putString(Constants.NBT.ALTAR_CURRENT_TIER_DISPLAYED, currentTierDisplayed.name()); + } + + public void startCycle() + { +// System.out.println("Starting Cycle"); + if (tileAltar.getWorld() != null) + tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); + + checkTier(); + + // Temporary thing to test the recipes. +// fluid.setAmount(10000); +// this.setMainFluid(new FluidStack(BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(), 10000)); + + if ((fluid == null || fluid.getAmount() <= 0) && totalCharge <= 0) + return; + + if (!isActive) + progress = 0; + + ItemStack input = tileAltar.getStackInSlot(0); + + if (!input.isEmpty()) + { + // Do recipes + RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(tileAltar.getWorld(), input); + if (recipe != null) + { + if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal()) + { + this.isActive = true; + this.recipe = recipe; + this.liquidRequired = recipe.getSyphon(); + this.consumptionRate = recipe.getConsumeRate(); + this.drainRate = recipe.getDrainRate(); + this.canBeFilled = false; + return; + } + } else if (input.getItem() instanceof IBloodOrb) + { + this.isActive = true; + this.canBeFilled = true; + return; + } + } + + isActive = false; + } + + public void update() + { +// World world = tileAltar.getWorld(); +// +// RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(world, new ItemStack(Items.DIAMOND)); +// +// if (recipe != null) +// { +// System.out.println("Found a recipe!"); +// } +// +// List altarRecipes = world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ALTAR); +// +// System.out.println("There are currently " + altarRecipes.size() + " Altar Recipes loaded."); +// + World world = tileAltar.getWorld(); + BlockPos pos = tileAltar.getPos(); + + if (world.isRemote) + return; + + // Used instead of the world time for checks that do not happen every tick + internalCounter++; + + if (lockdownDuration > 0) + lockdownDuration--; + + if (internalCounter % 20 == 0) + { + for (Direction facing : Direction.values()) + { + BlockPos newPos = pos.offset(facing); + BlockState block = world.getBlockState(newPos); + block.getBlock().onNeighborChange(block, world, newPos, pos); + } + } + if (internalCounter % (Math.max(20 - this.accelerationUpgrades, 1)) == 0) + { + int syphonMax = (int) (20 * this.dislocationMultiplier); + int fluidInputted; + int fluidOutputted; + fluidInputted = Math.min(syphonMax, -this.fluid.getAmount() + capacity); + fluidInputted = Math.min(this.fluidInput.getAmount(), fluidInputted); + this.fluid.setAmount(this.fluid.getAmount() + fluidInputted); + this.fluidInput.setAmount(this.fluidInput.getAmount() - fluidInputted); + fluidOutputted = Math.min(syphonMax, this.bufferCapacity - this.fluidOutput.getAmount()); + fluidOutputted = Math.min(this.fluid.getAmount(), fluidOutputted); + this.fluidOutput.setAmount(this.fluidOutput.getAmount() + fluidOutputted); + this.fluid.setAmount(this.fluid.getAmount() - fluidOutputted); + tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); + } + + if (internalCounter % this.getChargingFrequency() == 0 && !this.isActive) + { +// int chargeInputted = Math.min(chargingRate, this.fluid.getAmount()); +// chargeInputted = Math.min(chargeInputted, maxCharge - totalCharge); +// totalCharge += chargeInputted; +// this.fluid.setAmount(this.fluid.getAmount() - chargeInputted); +// tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); + } + + if (internalCounter % 100 == 0 && (this.isActive || this.cooldownAfterCrafting <= 0)) + startCycle(); + + updateAltar(); + } + + private void updateAltar() + { +// System.out.println("Updating altar."); + if (!isActive) + { + if (cooldownAfterCrafting > 0) + cooldownAfterCrafting--; + return; + } + + if (!canBeFilled && recipe == null) + { + startCycle(); + return; + } + + ItemStack input = tileAltar.getStackInSlot(0); + + if (input.isEmpty()) + return; + + World world = tileAltar.getWorld(); + BlockPos pos = tileAltar.getPos(); + + if (world.isRemote) + return; + + if (!canBeFilled) + { + boolean hasOperated = false; + int stackSize = input.getCount(); + + if (totalCharge > 0) + { + int chargeDrained = Math.min(liquidRequired * stackSize - progress, totalCharge); + + totalCharge -= chargeDrained; + progress += chargeDrained; + hasOperated = true; + } + if (fluid != null && fluid.getAmount() >= 1) + { + System.out.println("Draining in order to craft! Progress: " + progress + "/" + liquidRequired); +// int liquidDrained = Math.min((int) (altarTier.ordinal() >= 1 +// ? consumptionRate * (1 + consumptionMultiplier) +// : consumptionRate), fluid.getAmount()); + int liquidDrained = Math.min((int) (consumptionRate * (1 + consumptionMultiplier)), fluid.getAmount()); + + if (liquidDrained > (liquidRequired * stackSize - progress)) + liquidDrained = liquidRequired * stackSize - progress; + + fluid.setAmount(fluid.getAmount() - liquidDrained); + progress += liquidDrained; + + hasOperated = true; + + if (internalCounter % 4 == 0 && world instanceof ServerWorld) + { + ServerWorld server = (ServerWorld) world; +// server.spawnParticle(ParticleTypes.SPLASH, (double) pos.getX() +// + worldIn.rand.nextDouble(), (double) (pos.getY() + 1), (double) pos.getZ() +// + worldIn.rand.nextDouble(), 1, 0.0D, 0.0D, 0.0D, 1.0D); + server.spawnParticle(RedstoneParticleData.REDSTONE_DUST, pos.getX() + 0.5, pos.getY() + + 1.0, pos.getZ() + 0.5, 1, 0.2, 0.0, 0.2, 0.0); + } + + } else if (!hasOperated && progress > 0) + { + progress -= (int) (efficiencyMultiplier * drainRate); + + if (internalCounter % 2 == 0 && world instanceof ServerWorld) + { + ServerWorld server = (ServerWorld) world; + server.spawnParticle(ParticleTypes.LARGE_SMOKE, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + + 0.5, 1, 0.1, 0, 0.1, 0); + } + } + + if (hasOperated) + { + if (progress >= liquidRequired * stackSize) + { + ItemStack result = ItemHandlerHelper.copyStackWithSize(recipe.getOutput(), stackSize); + + BloodMagicCraftedEvent.Altar event = new BloodMagicCraftedEvent.Altar(result, input.copy()); + MinecraftForge.EVENT_BUS.post(event); + tileAltar.setInventorySlotContents(0, event.getOutput()); + progress = 0; + + if (world instanceof ServerWorld) + { + ServerWorld server = (ServerWorld) world; + server.spawnParticle(RedstoneParticleData.REDSTONE_DUST, pos.getX() + 0.5, pos.getY() + + 1, pos.getZ() + 0.5, 40, 0.3, 0, 0.3, 0); + } + + this.cooldownAfterCrafting = 30; + this.isActive = false; + } + } + } else + { + ItemStack contained = tileAltar.getStackInSlot(0); + + if (contained.isEmpty() || !(contained.getItem() instanceof IBloodOrb) + || !(contained.getItem() instanceof IBindable)) + return; + + BloodOrb orb = ((IBloodOrb) contained.getItem()).getOrb(contained); + Binding binding = ((IBindable) contained.getItem()).getBinding(contained); + + if (binding == null || orb == null) + return; + + if (fluid != null && fluid.getAmount() >= 1) + { +// int liquidDrained = Math.min((int) (altarTier.ordinal() >= 2 +// ? orb.getFillRate() * (1 + consumptionMultiplier) +// : orb.getFillRate()), fluid.getAmount()); + int liquidDrained = Math.min((int) (orb.getFillRate() + * (1 + consumptionMultiplier)), fluid.getAmount()); + int drain = NetworkHelper.getSoulNetwork(binding).add(liquidDrained, (int) (orb.getCapacity() + * this.orbCapacityMultiplier)); + fluid.setAmount(fluid.getAmount() - drain); + + if (drain > 0 && internalCounter % 4 == 0 && world instanceof ServerWorld) + { + ServerWorld server = (ServerWorld) world; + server.spawnParticle(ParticleTypes.WITCH, pos.getX() + 0.5, pos.getY() + 1, pos.getZ() + + 0.5, 1, 0, 0, 0, 0.001); + } + } + } + + tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); + } + + public void checkTier() + { + AltarTier tier = AltarUtil.getTier(tileAltar.getWorld(), tileAltar.getPos()); + this.altarTier = tier; + + upgrade = AltarUtil.getUpgrades(tileAltar.getWorld(), tileAltar.getPos(), tier); + + if (tier.equals(currentTierDisplayed)) + currentTierDisplayed = AltarTier.ONE; + + if (tier.equals(AltarTier.ONE)) + { + upgrade = null; + isUpgraded = false; + this.consumptionMultiplier = 0; + this.efficiencyMultiplier = 1; + this.sacrificeEfficiencyMultiplier = 0; + this.selfSacrificeEfficiencyMultiplier = 0; + this.capacityMultiplier = 1; + this.orbCapacityMultiplier = 1; + this.dislocationMultiplier = 1; + this.accelerationUpgrades = 0; + this.chargingFrequency = 20; + this.chargingRate = 0; + this.maxCharge = 0; + this.totalCharge = 0; + return; + } else if (!tier.equals(AltarTier.ONE)) + { + this.isUpgraded = true; + this.accelerationUpgrades = upgrade.getLevel(BloodRuneType.ACCELERATION); + this.consumptionMultiplier = (float) (0.20 * upgrade.getLevel(BloodRuneType.SPEED)); + this.efficiencyMultiplier = (float) Math.pow(0.85, upgrade.getLevel(BloodRuneType.EFFICIENCY)); + this.sacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getLevel(BloodRuneType.SACRIFICE)); + this.selfSacrificeEfficiencyMultiplier = (float) (0.10 * upgrade.getLevel(BloodRuneType.SELF_SACRIFICE)); + this.capacityMultiplier = (float) ((1 * Math.pow(1.10, upgrade.getLevel(BloodRuneType.AUGMENTED_CAPACITY))) + + 0.20 * upgrade.getLevel(BloodRuneType.CAPACITY)); + this.dislocationMultiplier = (float) (Math.pow(1.2, upgrade.getLevel(BloodRuneType.DISPLACEMENT))); + this.orbCapacityMultiplier = (float) (1 + 0.02 * upgrade.getLevel(BloodRuneType.ORB)); + this.chargingFrequency = Math.max(20 - accelerationUpgrades, 1); + this.chargingRate = (int) (10 * upgrade.getLevel(BloodRuneType.CHARGING) * (1 + consumptionMultiplier / 2)); + this.maxCharge = (int) (FluidAttributes.BUCKET_VOLUME * Math.max(0.5 * capacityMultiplier, 1) + * upgrade.getLevel(BloodRuneType.CHARGING)); + } + + this.capacity = (int) (FluidAttributes.BUCKET_VOLUME * 10 * capacityMultiplier); + this.bufferCapacity = (int) (FluidAttributes.BUCKET_VOLUME * 1 * capacityMultiplier); + + if (this.fluid.getAmount() > this.capacity) + this.fluid.setAmount(this.capacity); + if (this.fluidOutput.getAmount() > this.bufferCapacity) + this.fluidOutput.setAmount(this.bufferCapacity); + if (this.fluidInput.getAmount() > this.bufferCapacity) + this.fluidInput.setAmount(this.bufferCapacity); + if (this.totalCharge > this.maxCharge) + this.totalCharge = this.maxCharge; + + tileAltar.getWorld().notifyBlockUpdate(tileAltar.getPos(), tileAltar.getWorld().getBlockState(tileAltar.getPos()), tileAltar.getWorld().getBlockState(tileAltar.getPos()), 3); + } + + public int fillMainTank(int amount) + { + int filledAmount = Math.min(capacity - fluid.getAmount(), amount); + fluid.setAmount(fluid.getAmount() + filledAmount); + + return filledAmount; + } + + public void sacrificialDaggerCall(int amount, boolean isSacrifice) + { + if (this.lockdownDuration > 0) + { + int amt = (int) Math.min(bufferCapacity + - fluidInput.getAmount(), (isSacrifice ? 1 + sacrificeEfficiencyMultiplier + : 1 + selfSacrificeEfficiencyMultiplier) * amount); + fluidInput.setAmount(fluidInput.getAmount() + amt); + } else + { + fluid.setAmount((int) (fluid.getAmount() + + Math.min(capacity - fluid.getAmount(), (isSacrifice ? 1 + sacrificeEfficiencyMultiplier + : 1 + selfSacrificeEfficiencyMultiplier) * amount))); + } + } + + public void setMainFluid(FluidStack fluid) + { + this.fluid = fluid; + } + + public void setOutputFluid(FluidStack fluid) + { + this.fluidOutput = fluid; + } + + public void setInputFluid(FluidStack fluid) + { + this.fluidInput = fluid; + } + + public AltarUpgrade getUpgrade() + { + return upgrade; + } + + public void setUpgrade(AltarUpgrade upgrade) + { + this.upgrade = upgrade; + } + + public int getCapacity() + { + return capacity; + } + + public FluidStack getFluid() + { + return fluid; + } + + public int getFluidAmount() + { + return fluid.getAmount(); + } + + public int getCurrentBlood() + { + return getFluidAmount(); + } + + public AltarTier getTier() + { + return altarTier; + } + + public void setTier(AltarTier tier) + { + this.altarTier = tier; + } + + public int getProgress() + { + return progress; + } + + public float getSacrificeMultiplier() + { + return sacrificeEfficiencyMultiplier; + } + + public float getSelfSacrificeMultiplier() + { + return selfSacrificeEfficiencyMultiplier; + } + + public float getOrbMultiplier() + { + return orbCapacityMultiplier; + } + + public float getDislocationMultiplier() + { + return dislocationMultiplier; + } + + public float getConsumptionMultiplier() + { + return consumptionMultiplier; + } + + public float getConsumptionRate() + { + return consumptionRate; + } + + public int getLiquidRequired() + { + return liquidRequired; + } + + public int getBufferCapacity() + { + return bufferCapacity; + } + + public boolean setCurrentTierDisplayed(AltarTier altarTier) + { + if (currentTierDisplayed == altarTier) + return false; + else + currentTierDisplayed = altarTier; + return true; + } + + public void addToDemonBloodDuration(int dur) + { + this.demonBloodDuration += dur; + } + + public boolean hasDemonBlood() + { + return this.demonBloodDuration > 0; + } + + public void decrementDemonBlood() + { + this.demonBloodDuration = Math.max(0, this.demonBloodDuration - 1); + } + + public void setActive() + { +// if (tileAltar.getStackInSlot(0).isEmpty()) +// { +// isActive = false; +// } + } + + public boolean isActive() + { + return isActive; + } + + public void requestPauseAfterCrafting(int amount) + { + if (this.isActive) + { + this.cooldownAfterCrafting = amount; + } + } + + public int getChargingRate() + { + return chargingRate; + } + + public int getTotalCharge() + { + return totalCharge; + } + + public int getChargingFrequency() + { + return chargingFrequency == 0 ? 1 : chargingFrequency; + } + + public int fill(FluidStack resource, boolean doFill) + { + if (resource == null || resource.getFluid() != BloodMagicBlocks.LIFE_ESSENCE_FLUID.get()) + { + return 0; + } + + if (!doFill) + { + if (fluidInput == null) + { + return Math.min(bufferCapacity, resource.getAmount()); + } + + if (!fluidInput.isFluidEqual(resource)) + { + return 0; + } + + return Math.min(bufferCapacity - fluidInput.getAmount(), resource.getAmount()); + } + + if (fluidInput == null) + { + fluidInput = new FluidStack(resource, Math.min(bufferCapacity, resource.getAmount())); + + return fluidInput.getAmount(); + } + + if (!fluidInput.isFluidEqual(resource)) + { + return 0; + } + int filled = bufferCapacity - fluidInput.getAmount(); + + if (resource.getAmount() < filled) + { + fluidInput.setAmount(fluidInput.getAmount() + resource.getAmount()); + filled = resource.getAmount(); + } else + { + fluidInput.setAmount(bufferCapacity); + } + + return filled; + } + + public FluidStack drain(FluidStack resource, boolean doDrain) + { + if (resource == null || !resource.isFluidEqual(fluidOutput)) + { + return null; + } + return drain(resource.getAmount(), doDrain); + } + + public FluidStack drain(int maxDrain, boolean doDrain) + { + if (fluidOutput == null) + { + return null; + } + + int drained = maxDrain; + if (fluidOutput.getAmount() < drained) + { + drained = fluidOutput.getAmount(); + } + + FluidStack stack = new FluidStack(fluidOutput, drained); + if (doDrain) + { + fluidOutput.setAmount(fluidOutput.getAmount() - drained); + } + return stack; + } + +// @Override +// public IFluidTankProperties[] getTankProperties() +// { +// return new IFluidTankProperties[] +// { new FluidTankPropertiesWrapper(new FluidTank(fluid, capacity)) }; +// } + + public AltarTier getCurrentTierDisplayed() + { + return currentTierDisplayed; + } + + static class VariableSizeFluidHandler implements IFluidHandler + { + BloodAltar altar; + + VariableSizeFluidHandler(BloodAltar altar) + { + this.altar = altar; + } + + @Override + public int getTanks() + { + // TODO Auto-generated method stub + return 1; + } + + @Override + public FluidStack getFluidInTank(int tank) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getTankCapacity(int tank) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public boolean isFluidValid(int tank, FluidStack stack) + { + return false; + } + + @Override + public int fill(FluidStack resource, FluidAction action) + { + return altar.fill(resource, action == FluidAction.EXECUTE); + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) + { + return altar.drain(resource, action == FluidAction.EXECUTE); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) + { + // TODO Auto-generated method stub + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java b/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java index 1eec1f0d..6c9c6a5e 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java +++ b/src/main/java/WayofTime/bloodmagic/altar/ComponentType.java @@ -1,27 +1,25 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; import java.util.Locale; /** * List of different components used to construct different tiers of altars. */ -public enum ComponentType { - GLOWSTONE, - BLOODSTONE, - BEACON, - BLOODRUNE, - CRYSTAL, - NOTAIR; +public enum ComponentType +{ + GLOWSTONE, BLOODSTONE, BEACON, BLOODRUNE, CRYSTAL, NOTAIR; - public static final ComponentType[] VALUES = values(); - private static final String BASE = "chat.bloodmagic.altar.comp."; - private String key; + public static final ComponentType[] VALUES = values(); + private static final String BASE = "chat.bloodmagic.altar.comp."; + private String key; - ComponentType() { - this.key = BASE + name().toLowerCase(Locale.ENGLISH); - } + ComponentType() + { + this.key = BASE + name().toLowerCase(Locale.ENGLISH); + } - public String getKey() { - return key; - } -} + public String getKey() + { + return key; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java index b1b4635a..3ecc87d6 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IAltarComponent.java @@ -1,12 +1,13 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; + +import javax.annotation.Nullable; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import javax.annotation.Nullable; - -public interface IAltarComponent { - @Nullable - ComponentType getType(World world, BlockState state, BlockPos pos); -} +public interface IAltarComponent +{ + @Nullable + ComponentType getType(World world, BlockState state, BlockPos pos); +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java b/src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java deleted file mode 100644 index 5ce9f00c..00000000 --- a/src/main/java/WayofTime/bloodmagic/altar/IAltarManipulator.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.altar; - -/** - * Any item that implements this interface will not be pulled into the Altar on - * right click. - */ -public interface IAltarManipulator { -} diff --git a/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java index 0270ac3e..626a1a9b 100644 --- a/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/altar/IBloodAltar.java @@ -1,54 +1,55 @@ -package WayofTime.bloodmagic.altar; +package wayoftime.bloodmagic.altar; -public interface IBloodAltar { - int getCapacity(); +public interface IBloodAltar +{ + int getCapacity(); - int getCurrentBlood(); + int getCurrentBlood(); - AltarTier getTier(); + AltarTier getTier(); - int getProgress(); + int getProgress(); - float getSacrificeMultiplier(); + float getSacrificeMultiplier(); - float getSelfSacrificeMultiplier(); + float getSelfSacrificeMultiplier(); - float getOrbMultiplier(); + float getOrbMultiplier(); - float getDislocationMultiplier(); + float getDislocationMultiplier(); - float getConsumptionMultiplier(); + float getConsumptionMultiplier(); - float getConsumptionRate(); + float getConsumptionRate(); - int getChargingRate(); + int getChargingRate(); - int getChargingFrequency(); + int getChargingFrequency(); - int getTotalCharge(); + int getTotalCharge(); - int getLiquidRequired(); + int getLiquidRequired(); - int getBufferCapacity(); + int getBufferCapacity(); - void sacrificialDaggerCall(int amount, boolean isSacrifice); + void sacrificialDaggerCall(int amount, boolean isSacrifice); - void startCycle(); + void startCycle(); - void checkTier(); + void checkTier(); - boolean isActive(); + boolean isActive(); - void setActive(); + void setActive(); - int fillMainTank(int amount); + int fillMainTank(int amount); - /** - * Will set the altar to initiate a cooldown cycle after it crafts before - * starting to craft again, giving the user time to interact with the altar. - * This can only be set while the altar is not active. - * - * @param cooldown - How long the cooldown should last - */ - void requestPauseAfterCrafting(int cooldown); + /** + * Will set the altar to initiate a cooldown cycle after it crafts before + * starting to craft again, giving the user time to interact with the altar. + * This can only be set while the altar is not active. + * + * @param cooldown - How long the cooldown should last + */ + void requestPauseAfterCrafting(int cooldown); } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java index 8401afe0..b6119974 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicAPI.java @@ -1,83 +1,101 @@ -package WayofTime.bloodmagic.api.impl; +package wayoftime.bloodmagic.api.impl; -import WayofTime.bloodmagic.api.IBloodMagicAPI; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.block.BlockState; - -import javax.annotation.Nonnull; import java.util.List; -public class BloodMagicAPI implements IBloodMagicAPI { +import javax.annotation.Nonnull; - public static final BloodMagicAPI INSTANCE = new BloodMagicAPI(); +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; - private final BloodMagicBlacklist blacklist; - private final BloodMagicRecipeRegistrar recipeRegistrar; - private final BloodMagicValueManager valueManager; - private final Multimap altarComponents; +import net.minecraft.block.BlockState; +import wayoftime.bloodmagic.altar.ComponentType; +import wayoftime.bloodmagic.api.IBloodMagicAPI; +import wayoftime.bloodmagic.util.BMLog; - public BloodMagicAPI() { - this.blacklist = new BloodMagicBlacklist(); - this.recipeRegistrar = new BloodMagicRecipeRegistrar(); - this.valueManager = new BloodMagicValueManager(); - this.altarComponents = ArrayListMultimap.create(); - } +public class BloodMagicAPI implements IBloodMagicAPI +{ - @Nonnull - @Override - public BloodMagicBlacklist getBlacklist() { - return blacklist; - } + public static final BloodMagicAPI INSTANCE = new BloodMagicAPI(); - @Nonnull - @Override - public BloodMagicRecipeRegistrar getRecipeRegistrar() { - return recipeRegistrar; - } +// private final BloodMagicBlacklist blacklist; + private final BloodMagicRecipeRegistrar recipeRegistrar; +// private final BloodMagicValueManager valueManager; + private final Multimap altarComponents; - @Nonnull - @Override - public BloodMagicValueManager getValueManager() { - return valueManager; - } + public BloodMagicAPI() + { +// this.blacklist = new BloodMagicBlacklist(); + this.recipeRegistrar = new BloodMagicRecipeRegistrar(); +// this.valueManager = new BloodMagicValueManager(); + this.altarComponents = ArrayListMultimap.create(); + } - @Override - public void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) { - ComponentType component = null; - for (ComponentType type : ComponentType.VALUES) { - if (type.name().equalsIgnoreCase(componentType)) { - component = type; - break; - } - } +// @Nonnull +// @Override +// public BloodMagicBlacklist getBlacklist() +// { +// return blacklist; +// } +// + @Nonnull + @Override + public BloodMagicRecipeRegistrar getRecipeRegistrar() + { + return recipeRegistrar; + } +// +// @Nonnull +// @Override +// public BloodMagicValueManager getValueManager() +// { +// return valueManager; +// } - if (component != null) { - BMLog.API_VERBOSE.info("Registered {} as a {} altar component.", state, componentType); - altarComponents.put(component, state); - } else BMLog.API.warn("Invalid Altar component type: {}.", componentType); - } + @Override + public void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) + { + ComponentType component = null; + for (ComponentType type : ComponentType.VALUES) + { + if (type.name().equalsIgnoreCase(componentType)) + { + component = type; + break; + } + } - @Override - public void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) { - ComponentType component = null; - for (ComponentType type : ComponentType.VALUES) { - if (type.name().equalsIgnoreCase(componentType)) { - component = type; - break; - } - } + if (component != null) + { + BMLog.API_VERBOSE.info("Registered {} as a {} altar component.", state, componentType); + altarComponents.put(component, state); + } else + BMLog.API.warn("Invalid Altar component type: {}.", componentType); + } - if (component != null) { - BMLog.API_VERBOSE.info("Unregistered {} from being a {} altar component.", state, componentType); - altarComponents.remove(component, state); - } else BMLog.API.warn("Invalid Altar component type: {}.", componentType); - } + @Override + public void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) + { + ComponentType component = null; + for (ComponentType type : ComponentType.VALUES) + { + if (type.name().equalsIgnoreCase(componentType)) + { + component = type; + break; + } + } - @Nonnull - public List getComponentStates(ComponentType component) { - return (List) altarComponents.get(component); - } -} + if (component != null) + { + BMLog.API_VERBOSE.info("Unregistered {} from being a {} altar component.", state, componentType); + altarComponents.remove(component, state); + } else + BMLog.API.warn("Invalid Altar component type: {}.", componentType); + } + + @Nonnull + public List getComponentStates(ComponentType component) + { + return (List) altarComponents.get(component); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java deleted file mode 100644 index 74a668fc..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicBlacklist.java +++ /dev/null @@ -1,106 +0,0 @@ -package WayofTime.bloodmagic.api.impl; - -import WayofTime.bloodmagic.api.IBloodMagicBlacklist; -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import java.util.Set; - -public class BloodMagicBlacklist implements IBloodMagicBlacklist { - - private final Set teleposer; - private final Set teleposerEntities; - private final Set transposition; - private final Set greenGrove; - private final Set sacrifice; - - public BloodMagicBlacklist() { - this.teleposer = Sets.newHashSet(); - this.teleposerEntities = Sets.newHashSet(); - this.transposition = Sets.newHashSet(); - this.greenGrove = Sets.newHashSet(); - this.sacrifice = Sets.newHashSet(); - } - - @Override - public void addTeleposer(@Nonnull BlockState state) { - if (!teleposer.contains(state)) { - BMLog.API_VERBOSE.info("Blacklist: Added {} to the Teleposer blacklist.", state); - teleposer.add(state); - } - } - - public void addTeleposer(@Nonnull Block block) { - for (BlockState state : block.getBlockState().getValidStates()) - addTeleposer(state); - } - - @Override - public void addTeleposer(@Nonnull ResourceLocation entityId) { - if (!teleposerEntities.contains(entityId)) { - BMLog.API_VERBOSE.info("Blacklist: Added {} to the Teleposer blacklist.", entityId); - teleposerEntities.add(entityId); - } - } - - @Override - public void addTransposition(@Nonnull BlockState state) { - if (!transposition.contains(state)) { - BMLog.API_VERBOSE.info("Blacklist: Added {} to the Transposition blacklist.", state); - transposition.add(state); - } - } - - public void addTransposition(@Nonnull Block block) { - for (BlockState state : block.getBlockState().getValidStates()) - addTransposition(state); - } - - @Override - public void addGreenGrove(@Nonnull BlockState state) { - if (!greenGrove.contains(state)) { - BMLog.API_VERBOSE.info("Blacklist: Added {} to the Green Grove blacklist.", state); - greenGrove.add(state); - } - } - - public void addGreenGrove(@Nonnull Block block) { - for (BlockState state : block.getBlockState().getValidStates()) - addGreenGrove(state); - } - - @Override - public void addWellOfSuffering(@Nonnull ResourceLocation entityId) { - if (!sacrifice.contains(entityId)) { - BMLog.API_VERBOSE.info("Blacklist: Added {} to the Well of Suffering blacklist.", entityId); - sacrifice.add(entityId); - } - } - - // Internal use getters - - public Set getTeleposer() { - return ImmutableSet.copyOf(teleposer); - } - - public Set getTeleposerEntities() { - return ImmutableSet.copyOf(teleposerEntities); - } - - public Set getTransposition() { - return ImmutableSet.copyOf(transposition); - } - - public Set getGreenGrove() { - return ImmutableSet.copyOf(greenGrove); - } - - public Set getSacrifice() { - return ImmutableSet.copyOf(sacrifice); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java index 5f4bb3d3..e14ed76a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicCorePlugin.java @@ -1,144 +1,29 @@ -package WayofTime.bloodmagic.api.impl; +package wayoftime.bloodmagic.api.impl; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.api.BloodMagicPlugin; -import WayofTime.bloodmagic.api.IBloodMagicAPI; -import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; -import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.block.BlockDecorative; -import WayofTime.bloodmagic.block.enums.BloodRuneType; -import WayofTime.bloodmagic.block.enums.EnumDecorative; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicRecipes; -import WayofTime.bloodmagic.incense.EnumTranquilityType; -import WayofTime.bloodmagic.incense.TranquilityStack; -import WayofTime.bloodmagic.util.StateUtil; -import net.minecraft.block.Block; import net.minecraft.block.Blocks; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import wayoftime.bloodmagic.altar.ComponentType; +import wayoftime.bloodmagic.api.IBloodMagicAPI; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; -@BloodMagicPlugin -public class BloodMagicCorePlugin implements IBloodMagicPlugin { +public class BloodMagicCorePlugin +{ + public static final BloodMagicCorePlugin INSTANCE = new BloodMagicCorePlugin(); - @Override - public void register(IBloodMagicAPI apiInterface) { - BloodMagicAPI api = (BloodMagicAPI) apiInterface; - // Add forced blacklistings - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE); - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE); - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE); - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE); - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.DEMON_CRYSTAL); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.DEMON_CRYSTAL); - api.getBlacklist().addTeleposer(RegistrarBloodMagicBlocks.INVERSION_PILLAR); - api.getBlacklist().addTransposition(RegistrarBloodMagicBlocks.INVERSION_PILLAR); - api.getBlacklist().addWellOfSuffering(new ResourceLocation("armor_stand")); - api.getBlacklist().addWellOfSuffering(new ResourceLocation(BloodMagic.MODID, "sentient_specter")); + public void register(IBloodMagicAPI apiInterface) + { + apiInterface.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), ComponentType.GLOWSTONE.name()); + apiInterface.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), ComponentType.GLOWSTONE.name()); + apiInterface.registerAltarComponent(Blocks.BEACON.getDefaultState(), ComponentType.BEACON.name()); - api.getValueManager().setSacrificialValue(new ResourceLocation("armor_stand"), 0); - api.getValueManager().setSacrificialValue(new ResourceLocation(BloodMagic.MODID, "sentient_specter"), 0); - - api.getValueManager().setTranquility(Blocks.LAVA, new TranquilityStack(EnumTranquilityType.LAVA, 1.2D)); - api.getValueManager().setTranquility(Blocks.FLOWING_LAVA, new TranquilityStack(EnumTranquilityType.LAVA, 1.2D)); - api.getValueManager().setTranquility(Blocks.WATER, new TranquilityStack(EnumTranquilityType.WATER, 1.0D)); - api.getValueManager().setTranquility(Blocks.FLOWING_WATER, new TranquilityStack(EnumTranquilityType.WATER, 1.0D)); - api.getValueManager().setTranquility(RegistrarBloodMagicBlocks.LIFE_ESSENCE, new TranquilityStack(EnumTranquilityType.WATER, 1.5D)); - api.getValueManager().setTranquility(Blocks.NETHERRACK, new TranquilityStack(EnumTranquilityType.FIRE, 0.5D)); - api.getValueManager().setTranquility(Blocks.DIRT, new TranquilityStack(EnumTranquilityType.EARTHEN, 0.25D)); - api.getValueManager().setTranquility(Blocks.FARMLAND, new TranquilityStack(EnumTranquilityType.EARTHEN, 1.0D)); - api.getValueManager().setTranquility(Blocks.POTATOES, new TranquilityStack(EnumTranquilityType.CROP, 1.0D)); - api.getValueManager().setTranquility(Blocks.CARROTS, new TranquilityStack(EnumTranquilityType.CROP, 1.0D)); - api.getValueManager().setTranquility(Blocks.WHEAT, new TranquilityStack(EnumTranquilityType.CROP, 1.0D)); - api.getValueManager().setTranquility(Blocks.NETHER_WART, new TranquilityStack(EnumTranquilityType.CROP, 1.0D)); - api.getValueManager().setTranquility(Blocks.BEETROOTS, new TranquilityStack(EnumTranquilityType.CROP, 1.0D)); - - handleConfigValues(api); - - // Add standard blocks for altar components - api.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), ComponentType.GLOWSTONE.name()); - api.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), ComponentType.GLOWSTONE.name()); - api.registerAltarComponent(Blocks.BEACON.getDefaultState(), ComponentType.BEACON.name()); - - BlockDecorative decorative = (BlockDecorative) RegistrarBloodMagicBlocks.DECORATIVE_BRICK; - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.BLOODSTONE_BRICK), ComponentType.BLOODSTONE.name()); - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.BLOODSTONE_TILE), ComponentType.BLOODSTONE.name()); - if (ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_BRICK), ComponentType.CRYSTAL.name()); - api.registerAltarComponent(decorative.getDefaultState().withProperty(decorative.getProperty(), EnumDecorative.CRYSTAL_TILE), ComponentType.CRYSTAL.name()); - } - - BlockBloodRune bloodRune = (BlockBloodRune) RegistrarBloodMagicBlocks.BLOOD_RUNE; - for (BloodRuneType runeType : BloodRuneType.values()) - api.registerAltarComponent(bloodRune.getDefaultState().withProperty(bloodRune.getProperty(), runeType), ComponentType.BLOODRUNE.name()); - } - - @Override - public void registerRecipes(IBloodMagicRecipeRegistrar recipeRegistrar) { - RegistrarBloodMagicRecipes.registerAltarRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); - RegistrarBloodMagicRecipes.registerAlchemyTableRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); - RegistrarBloodMagicRecipes.registerTartaricForgeRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); - RegistrarBloodMagicRecipes.registerAlchemyArrayRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); - RegistrarBloodMagicRecipes.registerSacrificeCraftRecipes((BloodMagicRecipeRegistrar) recipeRegistrar); - } - - private static void handleConfigValues(BloodMagicAPI api) { - for (String value : ConfigHandler.values.sacrificialValues) { - String[] split = value.split(";"); - if (split.length != 2) // Not valid format - continue; - - api.getValueManager().setSacrificialValue(new ResourceLocation(split[0]), Integer.parseInt(split[1])); - } - - for (String value : ConfigHandler.blacklist.teleposer) { - EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); - if (entityEntry == null) { // It's not an entity (or at least not a valid one), so let's try a block. - String[] blockData = value.split("\\["); - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0])); - if (block == Blocks.AIR || block == null) // Not a valid block either - continue; - - if (blockData.length > 1) { // We have properties listed, so let's build a state. - api.getBlacklist().addTeleposer(StateUtil.parseState(value)); - continue; - } - - api.getBlacklist().addTeleposer(block); - continue; - } - - api.getBlacklist().addTeleposer(entityEntry.getRegistryName()); - } - - for (String value : ConfigHandler.blacklist.transposer) { - String[] blockData = value.split("\\["); - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockData[0])); - if (block == Blocks.AIR || block == null) // Not a valid block - continue; - - if (blockData.length > 1) { // We have properties listed, so let's build a state. - api.getBlacklist().addTeleposer(StateUtil.parseState(value)); - continue; - } - - api.getBlacklist().addTeleposer(block); - } - - for (String value : ConfigHandler.blacklist.wellOfSuffering) { - EntityEntry entityEntry = ForgeRegistries.ENTITIES.getValue(new ResourceLocation(value)); - if (entityEntry == null) // Not a valid entity - continue; - - api.getBlacklist().addWellOfSuffering(entityEntry.getRegistryName()); - } - } -} \ No newline at end of file + apiInterface.registerAltarComponent(BloodMagicBlocks.BLANK_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.SPEED_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.SACRIFICE_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.SELF_SACRIFICE_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.DISPLACEMENT_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.CAPACITY_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.AUGMENTED_CAPACITY_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.ORB_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.ACCELERATION_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + apiInterface.registerAltarComponent(BloodMagicBlocks.CHARGING_RUNE.get().getDefaultState(), ComponentType.BLOODRUNE.name()); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java index 215f3981..bb0652a8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicRecipeRegistrar.java @@ -1,357 +1,448 @@ -package WayofTime.bloodmagic.api.impl; +package wayoftime.bloodmagic.api.impl; import java.util.ArrayList; import java.util.List; import java.util.Set; -import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.crafting.CraftingHelper; -import WayofTime.bloodmagic.api.IBloodMagicRecipeRegistrar; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; -import WayofTime.bloodmagic.api.impl.recipe.RecipeSacrificeCraft; -import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.core.recipe.IngredientBloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; +import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar { - - private final Set altarRecipes; - private final Set alchemyRecipes; - private final Set tartaricForgeRecipes; - private final Set alchemyArrayRecipes; - private final Set sacrificeCraftRecipes; - - public BloodMagicRecipeRegistrar() { - this.altarRecipes = Sets.newHashSet(); - this.alchemyRecipes = Sets.newHashSet(); - this.tartaricForgeRecipes = Sets.newHashSet(); - this.alchemyArrayRecipes = Sets.newHashSet(); - this.sacrificeCraftRecipes = Sets.newHashSet(); - } - - @Override - public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); - Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); - Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative."); - Preconditions.checkArgument(drainRate >= 0, "drainRate cannot be negative."); - - altarRecipes.add(new RecipeBloodAltar(input, output, minimumTier, syphon, consumeRate, drainRate)); - } - - @Override - public boolean removeBloodAltar(@Nonnull ItemStack input) { - Preconditions.checkNotNull(input, "input cannot be null."); - - return altarRecipes.remove(getBloodAltar(input)); - } - - @Override - public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Ingredient... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); - Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); - Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); - alchemyRecipes.add(new RecipeAlchemyTable(inputs, output, syphon, ticks, minimumTier)); - } - - public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, @Nonnegative int minimumTier, @Nonnull Object... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); - Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); - Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - List ingredients = Lists.newArrayList(); - for (Object object : input) { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { - ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); - continue; - } - - ingredients.add(CraftingHelper.getIngredient(object)); - } - - addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0])); - } - - public void addAlchemyTable(RecipeAlchemyTable recipe) { - alchemyRecipes.add(recipe); - } - - @Override - public boolean removeAlchemyTable(@Nonnull ItemStack... input) { - Preconditions.checkNotNull(input, "inputs cannot be null."); - - for (ItemStack stack : input) - Preconditions.checkNotNull(stack, "input cannot be null."); - - return alchemyRecipes.remove(getAlchemyTable(Lists.newArrayList(input))); - } - - @Override - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Ingredient... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); - Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); - tartaricForgeRecipes.add(new RecipeTartaricForge(inputs, output, minimumSouls, soulDrain)); - } - - @Override - public boolean removeTartaricForge(@Nonnull ItemStack... input) { - Preconditions.checkNotNull(input, "inputs cannot be null."); - - for (ItemStack stack : input) - Preconditions.checkNotNull(stack, "input cannot be null."); - - return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input))); - } - - public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, @Nonnull Object... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); - Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - List ingredients = Lists.newArrayList(); - for (Object object : input) { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { - ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); - continue; - } - - ingredients.add(CraftingHelper.getIngredient(object)); - } - - addTartaricForge(output, minimumSouls, soulDrain, ingredients.toArray(new Ingredient[0])); - } - - @Override - public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - - alchemyArrayRecipes.add(new RecipeAlchemyArray(input, catalyst, output, circleTexture)); - } - - @Override - public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); - - return alchemyArrayRecipes.remove(getAlchemyArray(input, catalyst)); - } - - public void addAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - - addAlchemyArray(Ingredient.fromStacks(input), Ingredient.fromStacks(catalyst), output, circleTexture); - } - - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Object... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - List ingredients = Lists.newArrayList(); - for (Object object : input) { - if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) { - ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); - continue; - } - - ingredients.add(CraftingHelper.getIngredient(object)); - } - - addSacrificeCraft(output, healthRequired, ingredients.toArray(new Ingredient[0])); - } - - @Override - public boolean removeSacrificeCraft(@Nonnull ItemStack... input) { - Preconditions.checkNotNull(input, "inputs cannot be null."); - - for (ItemStack stack : input) - Preconditions.checkNotNull(stack, "input cannot be null."); - - return sacrificeCraftRecipes.remove(getSacrificeCraft(Lists.newArrayList(input))); - } - - @Override - public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input) { - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); - Preconditions.checkNotNull(input, "input cannot be null."); - - NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); - sacrificeCraftRecipes.add(new RecipeSacrificeCraft(inputs, output, healthRequired)); - } - - @Nullable - public RecipeBloodAltar getBloodAltar(@Nonnull ItemStack input) { - Preconditions.checkNotNull(input, "input cannot be null."); - if (input.isEmpty()) - return null; - - for (RecipeBloodAltar recipe : altarRecipes) - if (recipe.getInput().test(input)) - return recipe; - - return null; - } - - @Nullable - public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) { - Preconditions.checkNotNull(input, "input cannot be null."); - if (input.isEmpty()) - return null; - - mainLoop: - for (RecipeAlchemyTable recipe : alchemyRecipes) { - if (recipe.getInput().size() != input.size()) - continue; - - List recipeInput = new ArrayList<>(recipe.getInput()); - - for (int i = 0; i < input.size(); i++) { - boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) { - Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) { - matched = true; - recipeInput.remove(j); - break; - } - } - - if (!matched) - continue mainLoop; - } - - return recipe; - } - - return null; - } - - @Nullable - public RecipeTartaricForge getTartaricForge(@Nonnull List input) { - Preconditions.checkNotNull(input, "input cannot be null."); - if (input.isEmpty()) - return null; - - mainLoop: - for (RecipeTartaricForge recipe : tartaricForgeRecipes) { - if (recipe.getInput().size() != input.size()) - continue; - - List recipeInput = new ArrayList<>(recipe.getInput()); - - for (int i = 0; i < input.size(); i++) { - boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) { - Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) { - matched = true; - recipeInput.remove(j); - break; - } - } - - if (!matched) - continue mainLoop; - } - - return recipe; - } - - return null; - } - - @Nullable - public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) { - Preconditions.checkNotNull(input, "input cannot be null."); - if (input.isEmpty()) - return null; - - mainLoop: - for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes) { - if (recipe.getInput().size() != input.size()) - continue; - - List recipeInput = new ArrayList<>(recipe.getInput()); - - for (int i = 0; i < input.size(); i++) { - boolean matched = false; - for (int j = 0; j < recipeInput.size(); j++) { - Ingredient ingredient = recipeInput.get(j); - if (ingredient.apply(input.get(i))) { - matched = true; - recipeInput.remove(j); - break; - } - } - - if (!matched) - continue mainLoop; - } - - return recipe; - } - - return null; - } - - @Nullable - public RecipeAlchemyArray getAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) { - Preconditions.checkNotNull(input, "input cannot be null."); - if (input.isEmpty()) - return null; - - for (RecipeAlchemyArray recipe : alchemyArrayRecipes) - if (recipe.getInput().test(input) && recipe.getCatalyst().test(catalyst)) - return recipe; - - return null; - } - - public Set getAltarRecipes() { - return ImmutableSet.copyOf(altarRecipes); - } - - public Set getAlchemyRecipes() { - return ImmutableSet.copyOf(alchemyRecipes); - } - - public Set getTartaricForgeRecipes() { - return ImmutableSet.copyOf(tartaricForgeRecipes); - } - - public Set getAlchemyArrayRecipes() { - return ImmutableSet.copyOf(alchemyArrayRecipes); - } +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.world.World; +import wayoftime.bloodmagic.api.IBloodMagicRecipeRegistrar; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; + +public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar +{ + +// private final Set altarRecipes; +// private final Set alchemyRecipes; +// private final Set tartaricForgeRecipes; +// private final Set alchemyArrayRecipes; +// private final Set sacrificeCraftRecipes; + + public BloodMagicRecipeRegistrar() + { +// this.altarRecipes = Sets.newHashSet(); +// this.alchemyRecipes = Sets.newHashSet(); +// this.tartaricForgeRecipes = Sets.newHashSet(); +// this.alchemyArrayRecipes = Sets.newHashSet(); +// this.sacrificeCraftRecipes = Sets.newHashSet(); + } + +// @Override +// public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, +// @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); +// Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); +// Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative."); +// Preconditions.checkArgument(drainRate >= 0, "drainRate cannot be negative."); +// +// // TODO: Got to adda ResourceLocation argument. +// altarRecipes.add(new IRecipeBloodAltar(null, input, output, minimumTier, syphon, consumeRate, drainRate)); +// } +// +// @Override +// public boolean removeBloodAltar(@Nonnull ItemStack input) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// return altarRecipes.remove(getBloodAltar(input)); +// } + +// @Override +// public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, +// @Nonnegative int minimumTier, @Nonnull Ingredient... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); +// Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); +// Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); +// alchemyRecipes.add(new RecipeAlchemyTable(inputs, output, syphon, ticks, minimumTier)); +// } +// +// public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, +// @Nonnegative int minimumTier, @Nonnull Object... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); +// Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); +// Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// List ingredients = Lists.newArrayList(); +// for (Object object : input) +// { +// if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) +// { +// ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); +// continue; +// } +// +// ingredients.add(CraftingHelper.getIngredient(object)); +// } +// +// addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0])); +// } +// +// public void addAlchemyTable(RecipeAlchemyTable recipe) +// { +// alchemyRecipes.add(recipe); +// } +// +// @Override +// public boolean removeAlchemyTable(@Nonnull ItemStack... input) +// { +// Preconditions.checkNotNull(input, "inputs cannot be null."); +// +// for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null."); +// +// return alchemyRecipes.remove(getAlchemyTable(Lists.newArrayList(input))); +// } +// +// @Override +// public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, +// @Nonnegative double soulDrain, @Nonnull Ingredient... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); +// Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); +// tartaricForgeRecipes.add(new RecipeTartaricForge(inputs, output, minimumSouls, soulDrain)); +// } +// +// @Override +// public boolean removeTartaricForge(@Nonnull ItemStack... input) +// { +// Preconditions.checkNotNull(input, "inputs cannot be null."); +// +// for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null."); +// +// return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input))); +// } +// +// public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, +// @Nonnegative double soulDrain, @Nonnull Object... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); +// Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// List ingredients = Lists.newArrayList(); +// for (Object object : input) +// { +// if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) +// { +// ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); +// continue; +// } +// +// ingredients.add(CraftingHelper.getIngredient(object)); +// } +// +// addTartaricForge(output, minimumSouls, soulDrain, ingredients.toArray(new Ingredient[0])); +// } +// +// @Override +// public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, +// @Nullable ResourceLocation circleTexture) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); +// Preconditions.checkNotNull(output, "output cannot be null."); +// +// alchemyArrayRecipes.add(new RecipeAlchemyArray(input, catalyst, output, circleTexture)); +// } +// +// @Override +// public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); +// +// return alchemyArrayRecipes.remove(getAlchemyArray(input, catalyst)); +// } +// +// public void addAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output, +// @Nullable ResourceLocation circleTexture) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); +// Preconditions.checkNotNull(output, "output cannot be null."); +// +// addAlchemyArray(Ingredient.fromStacks(input), Ingredient.fromStacks(catalyst), output, circleTexture); +// } +// +// public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, +// @Nonnull Object... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// List ingredients = Lists.newArrayList(); +// for (Object object : input) +// { +// if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb) +// { +// ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object))); +// continue; +// } +// +// ingredients.add(CraftingHelper.getIngredient(object)); +// } +// +// addSacrificeCraft(output, healthRequired, ingredients.toArray(new Ingredient[0])); +// } +// +// @Override +// public boolean removeSacrificeCraft(@Nonnull ItemStack... input) +// { +// Preconditions.checkNotNull(input, "inputs cannot be null."); +// +// for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null."); +// +// return sacrificeCraftRecipes.remove(getSacrificeCraft(Lists.newArrayList(input))); +// } +// +// @Override +// public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, +// @Nonnull Ingredient... input) +// { +// Preconditions.checkNotNull(output, "output cannot be null."); +// Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); +// Preconditions.checkNotNull(input, "input cannot be null."); +// +// NonNullList inputs = NonNullList.from(Ingredient.EMPTY, input); +// sacrificeCraftRecipes.add(new RecipeSacrificeCraft(inputs, output, healthRequired)); +// } + + @Nullable + public RecipeBloodAltar getBloodAltar(World world, @Nonnull ItemStack input) + { + Preconditions.checkNotNull(input, "input cannot be null."); + if (input.isEmpty()) + return null; + + List altarRecipes = world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ALTAR); + + for (RecipeBloodAltar recipe : altarRecipes) if (recipe.getInput().test(input)) + return recipe; + + return null; + } + +// @Nullable +// public RecipeAlchemyTable getAlchemyTable(@Nonnull List input) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// if (input.isEmpty()) +// return null; +// +// mainLoop: for (RecipeAlchemyTable recipe : alchemyRecipes) +// { +// if (recipe.getInput().size() != input.size()) +// continue; +// +// List recipeInput = new ArrayList<>(recipe.getInput()); +// +// for (int i = 0; i < input.size(); i++) +// { +// boolean matched = false; +// for (int j = 0; j < recipeInput.size(); j++) +// { +// Ingredient ingredient = recipeInput.get(j); +// if (ingredient.apply(input.get(i))) +// { +// matched = true; +// recipeInput.remove(j); +// break; +// } +// } +// +// if (!matched) +// continue mainLoop; +// } +// +// return recipe; +// } +// +// return null; +// } +// + @Nullable + public RecipeTartaricForge getTartaricForge(World world, @Nonnull List input) + { + Preconditions.checkNotNull(input, "input cannot be null."); + if (input.isEmpty()) + return null; + + List tartaricForgeRecipes = world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.TARTARICFORGE); + mainLoop: for (RecipeTartaricForge recipe : tartaricForgeRecipes) + { + if (recipe.getInput().size() != input.size()) + continue; + + List recipeInput = new ArrayList<>(recipe.getInput()); + + for (int i = 0; i < input.size(); i++) + { + boolean matched = false; + for (int j = 0; j < recipeInput.size(); j++) + { + Ingredient ingredient = recipeInput.get(j); + if (ingredient.test(input.get(i))) + { + matched = true; + recipeInput.remove(j); + break; + } + } + + if (!matched) + continue mainLoop; + } + + return recipe; + } + + return null; + } + +// +// @Nullable +// public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List input) +// { +// Preconditions.checkNotNull(input, "input cannot be null."); +// if (input.isEmpty()) +// return null; +// +// mainLoop: for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes) +// { +// if (recipe.getInput().size() != input.size()) +// continue; +// +// List recipeInput = new ArrayList<>(recipe.getInput()); +// +// for (int i = 0; i < input.size(); i++) +// { +// boolean matched = false; +// for (int j = 0; j < recipeInput.size(); j++) +// { +// Ingredient ingredient = recipeInput.get(j); +// if (ingredient.apply(input.get(i))) +// { +// matched = true; +// recipeInput.remove(j); +// break; +// } +// } +// +// if (!matched) +// continue mainLoop; +// } +// +// return recipe; +// } +// +// return null; +// } +// + /** + * + * @param world + * @param input + * @param catalyst + * @return If false and the recipe is nonnull, it is a partial match. If true, + * the returned recipe is a full match. + */ + @Nullable + public Pair getAlchemyArray(World world, @Nonnull ItemStack input, @Nonnull ItemStack catalyst) + { + Preconditions.checkNotNull(input, "input cannot be null."); + if (input.isEmpty()) + return null; + + List altarRecipes = world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY); + + RecipeAlchemyArray partialMatch = null; + for (RecipeAlchemyArray recipe : altarRecipes) + { + if (recipe.getBaseInput().test(input)) + { + if (recipe.getAddedInput().test(catalyst)) + { + return Pair.of(true, recipe); + } else if (partialMatch == null) + { + partialMatch = recipe; + } + } + } + + return Pair.of(false, partialMatch); + } + + public Set getAltarRecipes(World world) + { + return ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ALTAR)); + } + + public Set getTartaricForgeRecipes(World world) + { + return ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.TARTARICFORGE)); + } + + public Set getAlchemyArrayRecipes(World world) + { + return ImmutableSet.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY)); + } + + public Set getCraftingAlchemyArrayRecipes(World world) + { + Set recipes = Set.copyOf(world.getRecipeManager().getRecipesForType(BloodMagicRecipeType.ARRAY)); + Set copyRecipes = Set.of(); + for (RecipeAlchemyArray recipe : recipes) + { + if (!recipe.getOutput().isEmpty()) + { + copyRecipes.add(recipe); + } + } + + return copyRecipes; + } + +// public Set getAlchemyRecipes() +// { +// return ImmutableSet.copyOf(alchemyRecipes); +// } +// +// public Set getTartaricForgeRecipes() +// { +// return ImmutableSet.copyOf(tartaricForgeRecipes); +// } +// +// public Set getAlchemyArrayRecipes() +// { +// return ImmutableSet.copyOf(alchemyArrayRecipes); +// } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java b/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java deleted file mode 100644 index 830db0c3..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/impl/BloodMagicValueManager.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.api.impl; - -import WayofTime.bloodmagic.api.IBloodMagicValueManager; -import WayofTime.bloodmagic.incense.EnumTranquilityType; -import WayofTime.bloodmagic.incense.TranquilityStack; -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import java.util.Map; - -public class BloodMagicValueManager implements IBloodMagicValueManager { - - private final Map sacrificial; - private final Map tranquility; - - public BloodMagicValueManager() { - this.sacrificial = Maps.newHashMap(); - this.tranquility = Maps.newHashMap(); - } - - @Override - public void setSacrificialValue(@Nonnull ResourceLocation entityId, int value) { - BMLog.API_VERBOSE.info("Value Manager: Set sacrificial value of {} to {}.", entityId, value); - sacrificial.put(entityId, value); - } - - @Override - public void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value) { - EnumTranquilityType tranquility = null; - for (EnumTranquilityType type : EnumTranquilityType.values()) { - if (type.name().equalsIgnoreCase(tranquilityType)) { - tranquility = type; - break; - } - } - - if (tranquility != null) { - BMLog.API_VERBOSE.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityType, value); - this.tranquility.put(state, new TranquilityStack(tranquility, value)); - } else BMLog.API.warn("Invalid tranquility type: {}.", tranquilityType); - } - - public void setTranquility(Block block, TranquilityStack tranquilityStack) { - for (BlockState state : block.getBlockState().getValidStates()) { - BMLog.API_VERBOSE.info("Value Manager: Set tranquility value of {} to {} @ {}", state, tranquilityStack.type, tranquilityStack.value); - tranquility.put(state, tranquilityStack); - } - } - - public Map getSacrificial() { - return ImmutableMap.copyOf(sacrificial); - } - - public Map getTranquility() { - return ImmutableMap.copyOf(tranquility); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java index 02b4f153..c0f6d1ee 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyArray.java @@ -1,53 +1,87 @@ -package WayofTime.bloodmagic.api.impl.recipe; - -import WayofTime.bloodmagic.BloodMagic; -import com.google.common.base.Preconditions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.ResourceLocation; +package wayoftime.bloodmagic.api.impl.recipe; import javax.annotation.Nonnull; -import javax.annotation.Nullable; -public class RecipeAlchemyArray { +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; - @Nonnull - private final Ingredient input; - @Nonnull - private final Ingredient catalyst; - @Nonnull - private final ItemStack output; - @Nonnull - private final ResourceLocation circleTexture; +public abstract class RecipeAlchemyArray extends BloodMagicRecipe +{ + private final ResourceLocation id; + private final ResourceLocation texture; + @Nonnull + private final Ingredient baseInput; + @Nonnull + private final Ingredient addedInput; + @Nonnull + private final ItemStack output; - public RecipeAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, @Nullable ResourceLocation circleTexture) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(catalyst, "catalyst cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); + protected RecipeAlchemyArray(ResourceLocation id, ResourceLocation texture, @Nonnull Ingredient baseIngredient, @Nonnull Ingredient addedIngredient, @Nonnull ItemStack result) + { + super(id); + this.id = id; + this.texture = texture; + this.baseInput = baseIngredient; + this.addedInput = addedIngredient; + this.output = result; + } - this.input = input; - this.catalyst = catalyst; - this.output = output; - this.circleTexture = circleTexture == null ? new ResourceLocation(BloodMagic.MODID, "textures/models/AlchemyArrays/WIPArray.png") : circleTexture; - } + @Nonnull + public final ResourceLocation getId() + { + return id; + } - @Nonnull - public Ingredient getInput() { - return input; - } + @Nonnull + public final ResourceLocation getTexture() + { + return texture; + } - @Nonnull - public Ingredient getCatalyst() { - return catalyst; - } + @Nonnull + public final Ingredient getBaseInput() + { + return baseInput; + } - @Nonnull - public ItemStack getOutput() { - return output; - } + @Nonnull + public final Ingredient getAddedInput() + { + return addedInput; + } - @Nonnull - public ResourceLocation getCircleTexture() { - return circleTexture; - } + @Override + public final NonNullList getIngredients() + { + NonNullList list = NonNullList.create(); + list.add(getBaseInput()); + list.add(getAddedInput()); + return list; + } + + @Nonnull + public final ItemStack getOutput() + { + return output; + } + + @Override + public void write(PacketBuffer buffer) + { + if (texture != null) + { + buffer.writeBoolean(true); + buffer.writeResourceLocation(texture); + } else + { + buffer.writeBoolean(false); + } + + baseInput.write(buffer); + addedInput.write(buffer); + buffer.writeItemStack(output); + } } diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java deleted file mode 100644 index 7fe572b0..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeAlchemyTable.java +++ /dev/null @@ -1,59 +0,0 @@ -package WayofTime.bloodmagic.api.impl.recipe; - -import com.google.common.base.Preconditions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.NonNullList; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -public class RecipeAlchemyTable { - - @Nonnull - private final NonNullList input; - @Nonnull - private final ItemStack output; - @Nonnegative - private final int syphon; - @Nonnegative - private final int ticks; - @Nonnegative - private final int minimumTier; - - public RecipeAlchemyTable(@Nonnull NonNullList input, @Nonnull ItemStack output, int syphon, int ticks, int minimumTier) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); - Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative."); - Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); - - this.input = input; - this.output = output; - this.syphon = syphon; - this.ticks = ticks; - this.minimumTier = minimumTier; - } - - @Nonnull - public final NonNullList getInput() { - return input; - } - - @Nonnull - public final ItemStack getOutput() { - return output; - } - - public final int getSyphon() { - return syphon; - } - - public final int getTicks() { - return ticks; - } - - public final int getMinimumTier() { - return minimumTier; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java index 5682645e..8b8ab1c8 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeBloodAltar.java @@ -1,72 +1,104 @@ -package WayofTime.bloodmagic.api.impl.recipe; - -import WayofTime.bloodmagic.altar.AltarTier; -import com.google.common.base.Preconditions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; +package wayoftime.bloodmagic.api.impl.recipe; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; -public class RecipeBloodAltar { +import com.google.common.base.Preconditions; - @Nonnull - private final Ingredient input; - @Nonnull - private final ItemStack output; - @Nonnull - private final AltarTier minimumTier; - @Nonnegative - private final int syphon; - @Nonnegative - private final int consumeRate; - @Nonnegative - private final int drainRate; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.altar.AltarTier; - public RecipeBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); - Preconditions.checkArgument(minimumTier <= AltarTier.MAXTIERS, "minimumTier cannot be higher than max tier"); - Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); - Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative."); - Preconditions.checkArgument(drainRate >= 0, "drain cannot be negative."); +public abstract class RecipeBloodAltar extends BloodMagicRecipe +{ - this.input = input; - this.output = output; - this.minimumTier = AltarTier.values()[minimumTier]; - this.syphon = syphon; - this.consumeRate = consumeRate; - this.drainRate = drainRate; - } + @Nonnull + private final Ingredient input; + @Nonnull + private final ItemStack output; + @Nonnull + private final AltarTier minimumTier; + @Nonnegative + private final int syphon; + @Nonnegative + private final int consumeRate; + @Nonnegative + private final int drainRate; - @Nonnull - public final Ingredient getInput() { - return input; - } + public RecipeBloodAltar(ResourceLocation id, @Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate) + { + super(id); + Preconditions.checkNotNull(input, "input cannot be null."); + Preconditions.checkNotNull(output, "output cannot be null."); + Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative."); + Preconditions.checkArgument(minimumTier <= AltarTier.MAXTIERS, "minimumTier cannot be higher than max tier"); + Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative."); + Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative."); + Preconditions.checkArgument(drainRate >= 0, "drain cannot be negative."); - @Nonnull - public final ItemStack getOutput() { - return output; - } + this.input = input; + this.output = output; + this.minimumTier = AltarTier.values()[minimumTier]; + this.syphon = syphon; + this.consumeRate = consumeRate; + this.drainRate = drainRate; + } - @Nonnull - public AltarTier getMinimumTier() { - return minimumTier; - } + @Nonnull + public final Ingredient getInput() + { + return input; + } - @Nonnegative - public final int getSyphon() { - return syphon; - } + @Override + public final NonNullList getIngredients() + { + NonNullList list = NonNullList.create(); + list.add(getInput()); + return list; + } - @Nonnegative - public final int getConsumeRate() { - return consumeRate; - } + @Nonnull + public final ItemStack getOutput() + { + return output; + } - @Nonnegative - public final int getDrainRate() { - return drainRate; - } -} + @Nonnull + public AltarTier getMinimumTier() + { + return minimumTier; + } + + @Nonnegative + public final int getSyphon() + { + return syphon; + } + + @Nonnegative + public final int getConsumeRate() + { + return consumeRate; + } + + @Nonnegative + public final int getDrainRate() + { + return drainRate; + } + + @Override + public void write(PacketBuffer buffer) + { + input.write(buffer); + buffer.writeItemStack(output); + buffer.writeInt(minimumTier.ordinal()); + buffer.writeInt(syphon); + buffer.writeInt(consumeRate); + buffer.writeInt(drainRate); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java deleted file mode 100644 index f2e000f6..00000000 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeSacrificeCraft.java +++ /dev/null @@ -1,43 +0,0 @@ -package WayofTime.bloodmagic.api.impl.recipe; - -import com.google.common.base.Preconditions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.NonNullList; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -public class RecipeSacrificeCraft { - @Nonnull - private final NonNullList input; - @Nonnull - private final ItemStack output; - @Nonnegative - private final double healthRequired; - - public RecipeSacrificeCraft(@Nonnull NonNullList input, @Nonnull ItemStack output, @Nonnegative double healthRequired) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative."); - - this.input = input; - this.output = output; - this.healthRequired = healthRequired; - } - - @Nonnull - public final NonNullList getInput() { - return input; - } - - @Nonnull - public final ItemStack getOutput() { - return output; - } - - @Nonnegative - public final double getHealthRequired() { - return healthRequired; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java index 96021cad..f0b65de7 100644 --- a/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java +++ b/src/main/java/WayofTime/bloodmagic/api/impl/recipe/RecipeTartaricForge.java @@ -1,53 +1,77 @@ -package WayofTime.bloodmagic.api.impl.recipe; +package wayoftime.bloodmagic.api.impl.recipe; -import com.google.common.base.Preconditions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.NonNullList; +import java.util.List; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; -public class RecipeTartaricForge { +import com.google.common.base.Preconditions; - @Nonnull - private final NonNullList input; - @Nonnull - private final ItemStack output; - @Nonnegative - private final double minimumSouls; - @Nonnegative - private final double soulDrain; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; - public RecipeTartaricForge(@Nonnull NonNullList input, @Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain) { - Preconditions.checkNotNull(input, "input cannot be null."); - Preconditions.checkNotNull(output, "output cannot be null."); - Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); - Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); +public abstract class RecipeTartaricForge extends BloodMagicRecipe +{ + @Nonnull + private final List input; + @Nonnull + private final ItemStack output; + @Nonnegative + private final double minimumSouls; + @Nonnegative + private final double soulDrain; - this.input = input; - this.output = output; - this.minimumSouls = minimumSouls; - this.soulDrain = soulDrain; - } + public RecipeTartaricForge(ResourceLocation id, @Nonnull List input, @Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain) + { + super(id); + Preconditions.checkNotNull(input, "input cannot be null."); + Preconditions.checkNotNull(output, "output cannot be null."); + Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative."); + Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative."); - @Nonnull - public final NonNullList getInput() { - return input; - } + this.input = input; + this.output = output; + this.minimumSouls = minimumSouls; + this.soulDrain = soulDrain; + } - @Nonnull - public final ItemStack getOutput() { - return output; - } + @Nonnull + public final List getInput() + { + return input; + } - @Nonnegative - public final double getMinimumSouls() { - return minimumSouls; - } + @Nonnull + public final ItemStack getOutput() + { + return output; + } - @Nonnegative - public final double getSoulDrain() { - return soulDrain; - } -} + @Nonnegative + public final double getMinimumSouls() + { + return minimumSouls; + } + + @Nonnegative + public final double getSoulDrain() + { + return soulDrain; + } + + @Override + public void write(PacketBuffer buffer) + { + buffer.writeInt(input.size()); + for (int i = 0; i < input.size(); i++) + { + input.get(i).write(buffer); + } + buffer.writeItemStack(output); + buffer.writeDouble(minimumSouls); + buffer.writeDouble(soulDrain); + + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java deleted file mode 100644 index 95ed17c9..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyArray.java +++ /dev/null @@ -1,166 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMovement; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectUpdraft; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.Random; - -public class BlockAlchemyArray extends Block { - protected static final AxisAlignedBB ARRAY_AABB = new AxisAlignedBB(0, 0, 0, 1, 0.1, 1); - - public BlockAlchemyArray() { - super(Material.CLOTH); - - setTranslationKey(BloodMagic.MODID + ".alchemyArray"); - setHardness(0.1f); - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean p_185477_7_) { - // No-op - } - - @Override - public void onEntityCollision(World world, BlockPos pos, BlockState state, Entity entity) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyArray) { - ((TileAlchemyArray) tile).onEntityCollidedWithBlock(state, entity); - } - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return ARRAY_AABB; - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.CUTOUT; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.INVISIBLE; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - TileAlchemyArray array = (TileAlchemyArray) world.getTileEntity(pos); - - if (array == null) - return false; - if (player.isSneaking() && array.rotateCooldown == 0) { - array.setRotation(array.getRotation().rotateY()); - array.rotateCooldown = 5; - world.notifyBlockUpdate(pos, state, state, 3); - return false; - } - - ItemStack playerItem = player.getHeldItem(hand); - - if (!playerItem.isEmpty()) { - if (array.getStackInSlot(0).isEmpty()) { - Utils.insertItemToTile(array, player, 0); - } else if (!array.getStackInSlot(0).isEmpty()) { - Utils.insertItemToTile(array, player, 1); - array.attemptCraft(); - } else { - return true; - } - if (array.arrayEffect instanceof AlchemyArrayEffectMovement && (playerItem.getItem() == Items.REDSTONE || playerItem.getItem() == Items.FEATHER) - || array.arrayEffect instanceof AlchemyArrayEffectUpdraft && (playerItem.getItem() == Items.FEATHER || playerItem.getItem() == Items.GLOWSTONE_DUST)) { - for (int i = 0; i < array.getSizeInventory(); i++) { - ItemStack stack = array.getStackInSlot(i); - if (ItemStack.areItemsEqual(stack, playerItem)) { - if (stack.getCount() < 127) { - stack.setCount(stack.getCount() + 1); - playerItem.shrink(1); - } - break; - } - } - world.notifyBlockUpdate(pos, state, state, 3); - return true; - } - } - - world.notifyBlockUpdate(pos, state, state, 3); - return true; - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { - return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES); - } - - @Override - public int quantityDropped(Random random) { - return 0; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileAlchemyArray alchemyArray = (TileAlchemyArray) world.getTileEntity(blockPos); - if (alchemyArray != null) - alchemyArray.dropItems(); - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileAlchemyArray(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java deleted file mode 100644 index 2520e983..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAlchemyTable.java +++ /dev/null @@ -1,164 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.block.ItemBlockAlchemyTable; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockAlchemyTable extends Block implements IBMBlock { - public static final PropertyBool INVISIBLE = PropertyBool.create("invisible"); - public static final PropertyEnum DIRECTION = PropertyEnum.create("direction", Direction.class); - private static final AxisAlignedBB BODY = new AxisAlignedBB(0, 0, 0, 16 / 16F, 13 / 16F, 16 / 16F); - - public BlockAlchemyTable() { - super(Material.ROCK); -// this.setDefaultState(this.blockState.getBaseState().withProperty(DIRECTION, EnumFacing.DOWN).withProperty(INVISIBLE, false)); - - setTranslationKey(BloodMagic.MODID + ".alchemyTable"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 0); - -// setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); - } - - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return BODY; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { - return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; - } - - @Override - public BlockState getStateFromMeta(int meta) { - return this.getDefaultState(); - } - - /** - * Convert the BlockState into the correct metadata value - */ - @Override - public int getMetaFromState(BlockState state) { - return 0; - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) { - return state.withProperty(INVISIBLE, ((TileAlchemyTable) tile).isInvisible()).withProperty(DIRECTION, ((TileAlchemyTable) tile).getDirection()); - } - - return state.withProperty(INVISIBLE, false); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, DIRECTION, INVISIBLE); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - BlockPos position = pos; - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) { - if (((TileAlchemyTable) tile).isSlave()) { - position = ((TileAlchemyTable) tile).getConnectedPos(); - tile = world.getTileEntity(position); - if (!(tile instanceof TileAlchemyTable)) { - return false; - } - } - } - - player.openGui(BloodMagic.instance, Constants.Gui.ALCHEMY_TABLE_GUI, world, position.getX(), position.getY(), position.getZ()); - - return true; - } - - @Override - public void breakBlock(World world, BlockPos pos, BlockState blockState) { - TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); - if (tile != null && !tile.isSlave()) { - tile.dropItems(); - } - - super.breakBlock(world, pos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileAlchemyTable(); - } - - @Override - public void neighborChanged(BlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { - TileAlchemyTable tile = (TileAlchemyTable) world.getTileEntity(pos); - if (tile != null) { - BlockPos connectedPos = tile.getConnectedPos(); - TileEntity connectedTile = world.getTileEntity(connectedPos); - if (!(connectedTile instanceof TileAlchemyTable && ((TileAlchemyTable) connectedTile).getConnectedPos().equals(pos))) { - this.breakBlock(world, pos, state); - world.setBlockToAir(pos); - } - } - } - - @Override - public BlockItem getItem() { - return new ItemBlockAlchemyTable(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java deleted file mode 100644 index 60482da1..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ /dev/null @@ -1,224 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.AltarUtil; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.iface.IAltarReader; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.iface.IDocumentedBlock; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - -public class BlockAltar extends Block implements IVariantProvider, IDocumentedBlock, IBMBlock { - public static final PropertyBool POWERED = PropertyBool.create("powered"); - private static final AxisAlignedBB BODY = new AxisAlignedBB(0, 0, 0, 16 / 16F, 12 / 16F, 16 / 16F); - - public BlockAltar() { - super(Material.ROCK); - this.setDefaultState(this.blockState.getBaseState().withProperty(POWERED, false)); - - - setTranslationKey(BloodMagic.MODID + ".altar"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 1); - } - - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return BODY; - } - - @Override - public boolean hasComparatorInputOverride(BlockState state) { - return true; - } - - @Override - public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { - if (world.isRemote) - return 0; - - TileEntity tile = world.getTileEntity(pos); - - if (tile instanceof TileAltar) { - TileAltar altar = (TileAltar) tile; - ItemStack orbStack = altar.getStackInSlot(0); - - if (world.getBlockState(pos.down()).getBlock() instanceof BlockDecorative) { - if (orbStack.getItem() instanceof IBloodOrb && orbStack.getItem() instanceof IBindable) { - BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); - Binding binding = ((IBindable) orbStack.getItem()).getBinding(orbStack); - if (orb != null && binding != null) { - SoulNetwork soulNetwork = NetworkHelper.getSoulNetwork(binding); - - int maxEssence = orb.getCapacity(); - int currentEssence = soulNetwork.getCurrentEssence(); - int level = currentEssence * 15 / maxEssence; - return Math.min(15, level) % 16; - } - } - } else { - int maxEssence = altar.getCapacity(); - int currentEssence = altar.getCurrentBlood(); - int level = currentEssence * 15 / maxEssence; - return Math.min(15, level) % 16; - } - } - - return 0; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return true; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - TileAltar altar = (TileAltar) world.getTileEntity(pos); - - if (altar == null || player.isSneaking()) - return false; - - ItemStack playerItem = player.getHeldItem(hand); - - if (playerItem.getItem() instanceof IAltarReader || playerItem.getItem() instanceof IAltarManipulator) { - playerItem.getItem().onItemRightClick(world, player, hand); - return true; - } - - if (Utils.insertItemToTile(altar, player)) - altar.startCycle(); - else - altar.setActive(); - - world.notifyBlockUpdate(pos, state, state, 3); - return true; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileAltar) - ((TileAltar) tile).dropItems(); - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileAltar(); - } - - // IDocumentedBlock - - @Override - public List getDocumentation(PlayerEntity player, World world, BlockPos pos, BlockState state) { - List docs = new ArrayList<>(); - IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); - Pair missingBlock = AltarUtil.getFirstMissingComponent(world, pos, altar.getTier().toInt()); - if (missingBlock != null) - docs.add(new TranslationTextComponent("chat.bloodmagic.altar.nextTier", new TranslationTextComponent(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); - - return docs; - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } - - /* Redstone code, taken from BlockLever */ - - public int getWeakPower(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { - return blockState.getValue(POWERED) ? 15 : 0; - } - - public int getStrongPower(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { - if (!blockState.getValue(POWERED)) { - return 0; - } else { - return 15; - } - } - - public boolean canProvidePower(BlockState state) { - return true; - } - - public BlockState getStateFromMeta(int meta) { - return this.getDefaultState().withProperty(POWERED, meta > 0); - } - - public int getMetaFromState(BlockState state) { - return state.getValue(POWERED) ? 1 : 0; - } - - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, POWERED); - } - - public BlockState getStateForPlacement(World worldIn, BlockPos pos, Direction facing, float hitX, float hitY, float hitZ, int meta, LivingEntity placer) { - - return this.getDefaultState().withProperty(POWERED, false); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java deleted file mode 100644 index ebc22ba0..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodLight.java +++ /dev/null @@ -1,112 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.particle.ParticleManager; -import net.minecraft.item.ItemStack; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.Hand; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.Random; - -public class BlockBloodLight extends Block { - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.4, 0.4, 0.4, 0.6, 0.6, 0.6); - - public BlockBloodLight() { - super(Material.CLOTH); - - setTranslationKey(BloodMagic.MODID + ".bloodLight"); - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return AABB; - } - - @Nullable - @Override - public AxisAlignedBB getCollisionBoundingBox(BlockState blockState, IBlockAccess worldIn, BlockPos pos) { - return NULL_AABB; - } - - @Override - public boolean isReplaceable(IBlockAccess world, BlockPos pos) { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.CUTOUT; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public int getLightValue(BlockState state) { - return 15; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean addDestroyEffects(World world, BlockPos pos, ParticleManager particleManager) { - if (world.getBlockState(pos).getBlock() == this) { - Random random = new Random(); - particleManager.spawnEffectParticle(EnumParticleTypes.REDSTONE.getParticleID(), pos.getX() + 0.5D + random.nextGaussian() / 8, pos.getY() + 0.5D, pos.getZ() + 0.5D + random.nextGaussian() / 8, 0, 0, 0); - } - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) { - ClientPlayerEntity player = Minecraft.getInstance().player; - - if (rand.nextInt(3) != 0) { - world.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D + rand.nextGaussian() / 8, pos.getY() + 0.5D, pos.getZ() + 0.5D + rand.nextGaussian() / 8, 0, 0, 0, 0); - ItemStack heldItem = player.getHeldItem(Hand.MAIN_HAND); - - if (heldItem.isEmpty() || heldItem.getItem() != RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) - return; - - for (int i = 0; i < 8; i++) - world.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D + rand.nextGaussian() / 8, pos.getY() + 0.5D, pos.getZ() + 0.5D + rand.nextGaussian() / 8, 0, 0, 0, 0); - } - } - - @Override - public int quantityDropped(Random par1Random) { - return 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java deleted file mode 100644 index 2f1d3a77..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodRune.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.BloodRuneType; -import WayofTime.bloodmagic.iface.IBloodRune; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.List; - -public class BlockBloodRune extends BlockEnum implements IBloodRune { - - public BlockBloodRune() { - super(Material.ROCK, BloodRuneType.class); - - setTranslationKey(BloodMagic.MODID + ".rune."); - setCreativeTab(BloodMagic.TAB_BM); - setSoundType(SoundType.STONE); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - @Nullable - @Override - public BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, BlockState state) { - return state.getValue(getProperty()); - } - - @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, world, tooltip, tooltipFlag); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java deleted file mode 100644 index b289bfd8..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ /dev/null @@ -1,195 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockInteger; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.block.ItemBlockBloodTank; -import WayofTime.bloodmagic.tile.TileBloodTank; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class BlockBloodTank extends BlockInteger implements IVariantProvider, IBMBlock { - public static final AxisAlignedBB BOX = new AxisAlignedBB(0.25, 0, 0.25, 0.75, 0.8, 0.75); - - public BlockBloodTank() { - super(Material.IRON, TileBloodTank.CAPACITIES.length - 1, "tier"); - - setTranslationKey(BloodMagic.MODID + ".bloodTank"); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.GLASS); - setHarvestLevel("pickaxe", 1); - setCreativeTab(BloodMagic.TAB_BM); - setLightOpacity(0); - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return BOX; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.CUTOUT_MIPPED; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public void harvestBlock(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity tile, ItemStack stack) { - super.harvestBlock(world, player, pos, state, tile, stack); - world.setBlockToAir(pos); - } - - @Override - public boolean removedByPlayer(BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest) { - return willHarvest || super.removedByPlayer(state, world, pos, player, willHarvest); - } - - @Override - public boolean onBlockActivated(World world, BlockPos blockPos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - boolean success = FluidUtil.interactWithFluidHandler(player, hand, world, blockPos, side); - if (success) { - world.checkLight(blockPos); - world.updateComparatorOutputLevel(blockPos, this); - world.markAndNotifyBlock(blockPos, world.getChunk(blockPos), state, state, 3); - return true; - } - - return true; - } - - @Override - public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) { - if (!player.capabilities.isCreativeMode) - this.dropBlockAsItem(worldIn, pos, state, 0); - super.onBlockHarvested(worldIn, pos, state, player); - } - - @Override - public void getDrops(NonNullList drops, IBlockAccess world, BlockPos pos, BlockState blockState, int fortune) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) { - TileBloodTank bloodTank = (TileBloodTank) tile; - ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata()); - CompoundNBT fluidTag = new CompoundNBT(); - - if (bloodTank.getTank().getFluid() != null) { - bloodTank.getTank().getFluid().writeToNBT(fluidTag); - CompoundNBT dropTag = new CompoundNBT(); - dropTag.put("Fluid", fluidTag); - drop.setTagCompound(dropTag); - } - - drops.add(drop); - } - } - - @Override - public void onBlockPlacedBy(World world, BlockPos pos, BlockState blockState, LivingEntity placer, ItemStack stack) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) { - TileBloodTank bloodTank = (TileBloodTank) tile; - CompoundNBT tag = stack.getTagCompound(); - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("Fluid")) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompound("Fluid")); - bloodTank.getTank().setFluid(fluidStack); - } - } - - world.checkLight(pos); - world.updateComparatorOutputLevel(pos, this); - world.markAndNotifyBlock(pos, world.getChunk(pos), blockState, blockState, 3); - } - - @Override - public int getLightValue(BlockState state, IBlockAccess world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) { - FluidStack fluidStack = ((TileBloodTank) tile).getTank().getFluid(); - return fluidStack == null || fluidStack.amount <= 0 ? 0 : fluidStack.getFluid().getLuminosity(fluidStack); - } - - return super.getLightValue(state, world, pos); - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { - return new ItemStack(this, 1, getMetaFromState(state)); - } - - @Override - public boolean hasComparatorInputOverride(BlockState state) { - return true; - } - - @Override - public int getComparatorInputOverride(BlockState state, World world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileBloodTank) - return ((TileBloodTank) tile).getComparatorOutput(); - return 0; - } - - @Override - public TileEntity createTileEntity(World worldIn, BlockState blockState) { - return new TileBloodTank(getMetaFromState(blockState)); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public BlockItem getItem() { - return new ItemBlockBloodTank(this); - } - - // IVariantProvider - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - variants.put(i, "inventory"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java b/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java deleted file mode 100644 index 13c04c99..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDecorative.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumDecorative; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -public class BlockDecorative extends BlockEnum { - public BlockDecorative() { - super(Material.ROCK, EnumDecorative.class); - - setTranslationKey(BloodMagic.MODID + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void getSubBlocks(ItemGroup tab, NonNullList subBlocks) { - for (EnumDecorative type : EnumDecorative.values()) { - if (!ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent && (type == EnumDecorative.CRYSTAL_TILE || type == EnumDecorative.CRYSTAL_BRICK)) - continue; - subBlocks.add(new ItemStack(this, 1, type.ordinal())); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java deleted file mode 100644 index 0fbe5fd7..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonBase.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.client.IVariantProvider; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.IStringSerializable; - -public class BlockDemonBase & IStringSerializable> extends BlockEnum implements IVariantProvider { - public BlockDemonBase(String baseName, Class enumClass) { - super(Material.ROCK, enumClass); - - setTranslationKey(BloodMagic.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java deleted file mode 100644 index 52df7b4d..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java +++ /dev/null @@ -1,172 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.soul.IDemonWillGem; -import WayofTime.bloodmagic.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.tile.TileDemonCrucible; -import WayofTime.bloodmagic.util.Utils; -import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBlock { - protected static final AxisAlignedBB BODY = new AxisAlignedBB(2 / 16F, 7 / 16F, 2 / 16F, 14 / 16F, 15 / 16F, 14 / 16F); - private static final AxisAlignedBB[] ARMS = { - new AxisAlignedBB(5 / 16F, 13 / 16F, 0 / 16F, 11 / 16F, 25 / 16F, 2 / 16F), // N - new AxisAlignedBB(14 / 16F, 13 / 16F, 5 / 16F, 16 / 16F, 25 / 16F, 11 / 16F), // E - new AxisAlignedBB(5 / 16F, 13 / 16F, 14 / 16F, 11 / 16F, 25 / 16F, 16 / 16F), // S - new AxisAlignedBB(0 / 16F, 13 / 16F, 5 / 16F, 2 / 16F, 25 / 16F, 11 / 16F) // W - }; - private static final AxisAlignedBB[] FEET = { - new AxisAlignedBB(10 / 16F, 0F, 2 / 16F, 14 / 16F, 7 / 16F, 6 / 16F), // NE - new AxisAlignedBB(10 / 16F, 0F, 10 / 16F, 14 / 16F, 7 / 16F, 14 / 16F), // SE - new AxisAlignedBB(2 / 16F, 0F, 10 / 16F, 6 / 16F, 7 / 16F, 14 / 16F), // SW - new AxisAlignedBB(2 / 16F, 0F, 2 / 16F, 6 / 16F, 7 / 16F, 6 / 16F) // NW - }; - - - public BlockDemonCrucible() { - super(Material.ROCK); - - setTranslationKey(BloodMagic.MODID + ".demonCrucible"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 0); - -// setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); - } - - private static List getCollisionBoxList(BlockState state) { - ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); - collBox.add(BODY); - collBox.addAll(Arrays.asList(FEET)); - return collBox; - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return BODY; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack heldItem = player.getHeldItem(hand); - TileDemonCrucible crucible = (TileDemonCrucible) world.getTileEntity(pos); - - if (crucible == null || player.isSneaking()) - return false; - - if (!heldItem.isEmpty()) { - if (!(heldItem.getItem() instanceof IDiscreteDemonWill) && !(heldItem.getItem() instanceof IDemonWillGem)) { - return true; - } - } - - Utils.insertItemToTile(crucible, player); - - world.notifyBlockUpdate(pos, state, state, 3); - return true; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileDemonCrucible tile = (TileDemonCrucible) world.getTileEntity(blockPos); - if (tile != null) - tile.dropItems(); - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileDemonCrucible(); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } - - @Override - public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { - List list = Lists.newArrayList(); - - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) { - list.add(this.rayTrace(pos, start, end, axisalignedbb)); - } - - RayTraceResult rayTrace = null; - double d1 = 0.0D; - - for (RayTraceResult raytraceresult : list) { - if (raytraceresult != null) { - double d0 = raytraceresult.hitVec.squareDistanceTo(end); - - if (d0 > d1) { - rayTrace = raytraceresult; - d1 = d0; - } - } - } - - return rayTrace; - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { - state = this.getActualState(state, worldIn, pos); - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) { - addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java deleted file mode 100644 index a98e8d43..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystal.java +++ /dev/null @@ -1,368 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.ItemDemonCrystal; -import WayofTime.bloodmagic.item.block.ItemBlockDemonCrystal; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import com.google.common.collect.Lists; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.properties.PropertyInteger; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemGroup; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Arrays; -import java.util.EnumMap; -import java.util.List; - -public class BlockDemonCrystal extends Block implements IBMBlock, IVariantProvider { - - public static final PropertyInteger AGE = PropertyInteger.create("age", 0, 6); - public static final PropertyEnum TYPE = PropertyEnum.create("type", EnumDemonWillType.class); - public static final PropertyEnum ATTACHED = PropertyEnum.create("attached", Direction.class); - private static final EnumMap bounds = new EnumMap<>(Direction.class); - - // Bounding / Collision boxes - private static final AxisAlignedBB[] UP = { - new AxisAlignedBB(6 / 16F, 0, 5 / 16F, 10 / 16F, 13 / 16F, 9 / 16F), - new AxisAlignedBB(7 / 16F, 0, 0, 13 / 16F, 6 / 16F, 5 / 16F), - new AxisAlignedBB(9 / 16F, 0, 9 / 16F, 13 / 16F, 5 / 16F, 14 / 16F), - new AxisAlignedBB(2 / 16F, 0, 1 / 16F, 7 / 16F, 6 / 16F, 7 / 16F), - new AxisAlignedBB(5 / 16F, 0, 9 / 16F, 9 / 16F, 7 / 16F, 15 / 16F), - new AxisAlignedBB(0, 0, 7 / 16F, 6 / 16F, 6 / 16F, 10 / 16F), - new AxisAlignedBB(10 / 16F, 0, 6 / 16F, 15 / 16F, 6 / 16F, 9 / 16F) - }; - private static final AxisAlignedBB[] DOWN = { - new AxisAlignedBB(6 / 16F, 3 / 16F, 7 / 16F, 10 / 16F, 16 / 16F, 11 / 16F), - new AxisAlignedBB(7 / 16F, 10 / 16F, 11 / 16F, 13 / 16F, 16 / 16F, 16 / 16F), - new AxisAlignedBB(9 / 16F, 11 / 16F, 2 / 16F, 13 / 16F, 16 / 16F, 7 / 16F), - new AxisAlignedBB(2 / 16F, 9 / 16F, 11 / 16F, 7 / 16F, 16 / 16F, 15 / 16F), - new AxisAlignedBB(5 / 16F, 9 / 16F, 1 / 16F, 9 / 16F, 16 / 16F, 7 / 16F), - new AxisAlignedBB(0, 10 / 16F, 6 / 16F, 6 / 16F, 16 / 16F, 9 / 16F), - new AxisAlignedBB(10 / 16F, 11 / 16F, 7 / 16F, 15 / 16F, 16 / 16F, 10 / 16F) - }; - private static final AxisAlignedBB[] NORTH = { - new AxisAlignedBB(6 / 16F, 5 / 16F, 3 / 16F, 10 / 16F, 9 / 16F, 16 / 16F), - new AxisAlignedBB(9 / 16F, 0, 6 / 16F, 13 / 16F, 5 / 16F, 16 / 16F), - new AxisAlignedBB(8 / 16F, 9 / 16F, 11 / 16F, 13 / 16F, 14 / 16F, 16 / 16F), - new AxisAlignedBB(2 / 16F, 1 / 16F, 9 / 16F, 7 / 16F, 7 / 16F, 16 / 16F), - new AxisAlignedBB(5 / 16F, 9 / 16F, 9 / 16F, 9 / 16F, 15 / 16F, 16 / 16F), - new AxisAlignedBB(0, 7 / 16F, 10 / 16F, 6 / 16F, 10 / 16F, 16 / 16F), - new AxisAlignedBB(10 / 16F, 7 / 16F, 10 / 16F, 15 / 16F, 9 / 16F, 15 / 16F), - }; - private static final AxisAlignedBB[] SOUTH = { - new AxisAlignedBB(6 / 16F, 7 / 16F, 0 / 16F, 10 / 16F, 11 / 16F, 13 / 16F), - new AxisAlignedBB(7 / 16F, 11 / 16F, 0, 13 / 16F, 16 / 16F, 6 / 16F), - new AxisAlignedBB(8 / 16F, 2 / 16F, 9 / 16F, 13 / 16F, 7 / 16F, 14 / 16F), - new AxisAlignedBB(2 / 16F, 9 / 16F, 1 / 16F, 7 / 16F, 14 / 16F, 7 / 16F), - new AxisAlignedBB(5 / 16F, 1 / 16F, 9 / 16F, 9 / 16F, 7 / 16F, 9 / 16F), - new AxisAlignedBB(0, 6 / 16F, 1 / 16F, 6 / 16F, 9 / 16F, 7 / 16F), - new AxisAlignedBB(10 / 16F, 8 / 16F, 1 / 16F, 15 / 16F, 10 / 16F, 6 / 16F) - }; - private static final AxisAlignedBB[] EAST = { - new AxisAlignedBB(0, 6 / 16F, 5 / 16F, 13 / 16F, 10 / 16F, 9 / 16F), - new AxisAlignedBB(0, 3 / 16F, 0, 6 / 16F, 9 / 16F, 5 / 16F), - new AxisAlignedBB(0 / 16F, 3 / 16F, 9 / 16F, 5 / 16F, 8 / 16F, 14 / 16F), - new AxisAlignedBB(1 / 16F, 9 / 16F, 1 / 16F, 7 / 16F, 13 / 16F, 7 / 16F), - new AxisAlignedBB(1 / 16F, 0, 9 / 16F, 7 / 16F, 11 / 16F, 15 / 16F), - new AxisAlignedBB(0, 10 / 16F, 7 / 16F, 6 / 16F, 16 / 16F, 10 / 16F), - new AxisAlignedBB(0, 1 / 16F, 6 / 16F, 5 / 16F, 6 / 16F, 9 / 16F) - }; - private static final AxisAlignedBB[] WEST = { - new AxisAlignedBB(3 / 16F, 6 / 16F, 5 / 16F, 16 / 16F, 10 / 16F, 9 / 16F), - new AxisAlignedBB(9 / 16F, 7 / 16F, 0, 16 / 16F, 12 / 16F, 5 / 16F), - new AxisAlignedBB(11 / 16F, 4 / 16F, 9 / 16F, 16 / 16F, 13 / 16F, 14 / 16F), - new AxisAlignedBB(9 / 16F, 3 / 16F, 1 / 16F, 16 / 16F, 8 / 16F, 7 / 16F), - new AxisAlignedBB(9 / 16F, 6 / 16F, 9 / 16F, 16 / 16F, 8 / 16F, 15 / 16F), - new AxisAlignedBB(10 / 16F, 1 / 16F, 7 / 16F, 16 / 16F, 6 / 16F, 10 / 16F), - new AxisAlignedBB(10 / 16F, 6 / 16F, 6 / 16F, 15 / 16F, 15 / 16F, 9 / 16F) - }; - - public BlockDemonCrystal() { - super(Material.ROCK); - this.setDefaultState(this.blockState.getBaseState().withProperty(TYPE, EnumDemonWillType.DEFAULT).withProperty(ATTACHED, Direction.UP)); - - setTranslationKey(BloodMagic.MODID + ".demonCrystal."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - public static ItemStack getItemStackDropped(EnumDemonWillType type, int crystalNumber) { - ItemStack stack = ItemStack.EMPTY; - switch (type) { - case CORROSIVE: - stack = EnumDemonWillType.CORROSIVE.getStack(); - break; - case DEFAULT: - stack = EnumDemonWillType.DEFAULT.getStack(); - break; - case DESTRUCTIVE: - stack = EnumDemonWillType.DESTRUCTIVE.getStack(); - break; - case STEADFAST: - stack = EnumDemonWillType.STEADFAST.getStack(); - break; - case VENGEFUL: - stack = EnumDemonWillType.VENGEFUL.getStack(); - break; - } - - stack.setCount(crystalNumber); - return stack; - } - - // collects a sublist from 0 to age for the collision boxes - private static List getCollisionBoxList(BlockState state) { - int age = state.getValue(BlockDemonCrystal.AGE) + 1; - switch (state.getValue(BlockDemonCrystal.ATTACHED)) { - case DOWN: - return Arrays.asList(DOWN).subList(0, age); - case NORTH: - return Arrays.asList(NORTH).subList(0, age); - case SOUTH: - return Arrays.asList(SOUTH).subList(0, age); - case WEST: - return Arrays.asList(WEST).subList(0, age); - case EAST: - return Arrays.asList(EAST).subList(0, age); - case UP: - default: - return Arrays.asList(UP).subList(0, age); - } - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - TileEntity tile = source.getTileEntity(pos); - if (tile != null) - state = getActualState(state, tile.getWorld(), pos); - switch (state.getValue(ATTACHED)) { - case DOWN: - return DOWN[0]; - case NORTH: - return NORTH[0]; - case SOUTH: - return SOUTH[0]; - case EAST: - return EAST[0]; - case WEST: - return WEST[0]; - case UP: - default: - return UP[0]; - } - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - if (!world.isRemote) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - TileDemonCrystal crystal = (TileDemonCrystal) tile; - boolean isCreative = player.capabilities.isCreativeMode; - boolean holdsCrystal = player.getHeldItem(hand).getItem() instanceof ItemDemonCrystal; - - if (PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.DEFAULT, player) > 1024 && !(holdsCrystal && isCreative)) { - crystal.dropSingleCrystal(); - - } - if (!crystal.getWorld().isRemote && isCreative && holdsCrystal) { - if (crystal.crystalCount < 7) { - crystal.internalCounter = 0; - if (crystal.progressToNextCrystal > 0) - crystal.progressToNextCrystal--; - crystal.crystalCount++; - crystal.markDirty(); - crystal.notifyUpdate(); - } - } - } - } - return true; - } - - @Override - public void getDrops(NonNullList drops, IBlockAccess world, BlockPos pos, BlockState state, int fortune) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - EnumDemonWillType type = state.getValue(TYPE); - int number = ((TileDemonCrystal) tile).getCrystalCount(); - - drops.add(getItemStackDropped(type, number)); - } - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - TileDemonCrystal crystal = (TileDemonCrystal) tile; - state = state.withProperty(AGE, crystal.getCrystalCountForRender()); - state = state.withProperty(ATTACHED, crystal.getPlacement()); - } - return state; - } - - @Override - public void neighborChanged(BlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - TileDemonCrystal crystal = (TileDemonCrystal) tile; - Direction placement = crystal.getPlacement(); - BlockPos offsetPos = pos.offset(placement.getOpposite()); - BlockState offsetState = world.getBlockState(offsetPos); - - if (!offsetState.isSideSolid(world, offsetPos, placement)) - world.destroyBlock(pos, true); - } - } - - @Override - public boolean canPlaceBlockOnSide(World world, BlockPos pos, Direction side) { - BlockPos offsetPos = pos.offset(side.getOpposite()); - BlockState offsetState = world.getBlockState(offsetPos); - - return offsetState.isSideSolid(world, offsetPos, side) && this.canPlaceBlockAt(world, pos); - } - - @Override - public void getSubBlocks(ItemGroup creativeTabs, NonNullList list) { - for (EnumDemonWillType willType : EnumDemonWillType.values()) - list.add(new ItemStack(this, 1, willType.ordinal())); - } - - @Override - public void harvestBlock(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable TileEntity tile, ItemStack stack) { - super.harvestBlock(world, player, pos, state, tile, stack); - world.setBlockToAir(pos); - } - - @Override - public boolean removedByPlayer(BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest) { - return willHarvest || super.removedByPlayer(state, world, pos, player, false); - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public BlockState getStateFromMeta(int meta) { - return this.getDefaultState().withProperty(TYPE, EnumDemonWillType.values()[meta]); - } - - @Override - public int getMetaFromState(BlockState state) { - - return state.getValue(TYPE).ordinal(); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, TYPE, AGE, ATTACHED); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileDemonCrystal(); - } - - @Override - public BlockItem getItem() { - return new ItemBlockDemonCrystal(this); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - for (EnumDemonWillType willType : EnumDemonWillType.values()) - variants.put(willType.ordinal(), "age=3,attached=up,type=" + willType.getName()); - } - - @Override - public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { - List list = Lists.newArrayList(); - - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) { - list.add(this.rayTrace(pos, start, end, axisalignedbb)); - } - - RayTraceResult rayTrace = null; - double d1 = 0.0D; - - for (RayTraceResult raytraceresult : list) { - if (raytraceresult != null) { - double d0 = raytraceresult.hitVec.squareDistanceTo(end); - - if (d0 > d1) { - rayTrace = raytraceresult; - d1 = d0; - } - } - } - - return rayTrace; - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { - state = this.getActualState(state, worldIn, pos); - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) { - addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb); - } - } - -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java deleted file mode 100644 index 099f13f6..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java +++ /dev/null @@ -1,77 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileDemonCrystallizer; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.BlockState; -import net.minecraft.block.ContainerBlock; -import net.minecraft.block.material.Material; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; - -public class BlockDemonCrystallizer extends ContainerBlock implements IVariantProvider, IBMBlock { - public BlockDemonCrystallizer() { - super(Material.ROCK); - - setTranslationKey(BloodMagic.MODID + ".demonCrystallizer"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 0); - -// setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); - } - - @Override - public boolean isSideSolid(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { - return side == Direction.UP; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileDemonCrystallizer(); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "normal"); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java deleted file mode 100644 index 45c5f9cc..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonLight.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; - -public class BlockDemonLight extends BlockEnum { - public BlockDemonLight() { - super(Material.ROCK, EnumSubWillType.class); - - setTranslationKey(BloodMagic.MODID + ".demonlight."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - setLightLevel(1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java deleted file mode 100644 index 9ee5eca8..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumPillar; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.Direction; -import net.minecraft.util.IStringSerializable; - -import javax.annotation.Nonnull; - -public class BlockDemonPillarBase & IStringSerializable> extends BlockEnumPillar { - public BlockDemonPillarBase(String baseName, Material materialIn, Class enumClass) { - super(materialIn, enumClass); - - setTranslationKey(BloodMagic.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - Direction.Axis[] axis = new Direction.Axis[]{Direction.Axis.Y, Direction.Axis.X, Direction.Axis.Z}; - - for (int i = 0; i < 3; i++) - for (int j = 0; j < this.getTypes().length; j++) - variants.put(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j]); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java deleted file mode 100644 index ddf7253b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumPillarCap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.Direction; -import net.minecraft.util.IStringSerializable; - -import javax.annotation.Nonnull; - -public class BlockDemonPillarCapBase & IStringSerializable> extends BlockEnumPillarCap { - public BlockDemonPillarCapBase(String baseName, Material materialIn, Class enumClass) { - super(materialIn, enumClass); - - setTranslationKey(BloodMagic.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - for (int i = 0; i < Direction.values().length; i++) - for (int j = 0; j < this.getTypes().length; j++) - variants.put(i * 2 + j, "facing=" + Direction.values()[i] + ",type=" + this.getTypes()[j]); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java deleted file mode 100644 index e1cca4d9..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java +++ /dev/null @@ -1,129 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileDemonPylon; -import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.ContainerBlock; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class BlockDemonPylon extends ContainerBlock implements IBMBlock, IVariantProvider { - protected static final AxisAlignedBB BODY = new AxisAlignedBB(2 / 16F, 7 / 16F, 2 / 16F, 14 / 16F, 20 / 16F, 14 / 16F); - private static final AxisAlignedBB[] FEET = { - new AxisAlignedBB(10 / 16F, 0F, 2 / 16F, 14 / 16F, 7 / 16F, 6 / 16F), // NE - new AxisAlignedBB(10 / 16F, 0F, 10 / 16F, 14 / 16F, 7 / 16F, 14 / 16F), // SE - new AxisAlignedBB(2 / 16F, 0F, 10 / 16F, 6 / 16F, 7 / 16F, 14 / 16F), // SW - new AxisAlignedBB(2 / 16F, 0F, 2 / 16F, 6 / 16F, 7 / 16F, 6 / 16F) // NW - }; - private static final AxisAlignedBB[] ARMS = {}; - - public BlockDemonPylon() { - super(Material.ROCK); - - setTranslationKey(BloodMagic.MODID + ".demonPylon"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 0); - -// setBlockBounds(0.3F, 0F, 0.3F, 0.72F, 1F, 0.72F); - } - - private static List getCollisionBoxList(BlockState state) { - ArrayList collBox = new ArrayList<>(Arrays.asList(ARMS)); - collBox.add(BODY); - collBox.addAll(Arrays.asList(FEET)); - return collBox; - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return BODY; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public TileEntity createNewTileEntity(World world, int meta) { - return new TileDemonPylon(); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } - - @Override - public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { - List list = Lists.newArrayList(); - - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) { - list.add(this.rayTrace(pos, start, end, axisalignedbb)); - } - - RayTraceResult rayTrace = null; - double d1 = 0.0D; - - for (RayTraceResult raytraceresult : list) { - if (raytraceresult != null) { - double d0 = raytraceresult.hitVec.squareDistanceTo(end); - - if (d0 > d1) { - rayTrace = raytraceresult; - d1 = d0; - } - } - } - - return rayTrace; - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { - state = this.getActualState(state, worldIn, pos); - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) { - addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java deleted file mode 100644 index 1402fe47..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumStairs; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.IStringSerializable; - -public class BlockDemonStairsBase & IStringSerializable> extends BlockEnumStairs { - public BlockDemonStairsBase(String baseName, Material materialIn, Class enumClass) { - super(materialIn, enumClass); - - setTranslationKey(BloodMagic.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (int i = 0; i < this.getTypes().length; i++) - variants.put(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i]); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java deleted file mode 100644 index 158ebdb9..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnumWall; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.IStringSerializable; - -public class BlockDemonWallBase & IStringSerializable> extends BlockEnumWall { - public BlockDemonWallBase(String baseName, Material materialIn, Class enumClass) { - super(materialIn, enumClass); - - setTranslationKey(BloodMagic.MODID + "." + baseName + "."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (int i = 0; i < this.getTypes().length; i++) - variants.put(i, "east=true,north=false,south=false,type=" + this.getTypes()[i] + ",up=true,west=true"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java deleted file mode 100644 index 7c4471d1..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockDimensionalPortal.java +++ /dev/null @@ -1,183 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockInteger; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.portal.LocationsHandler; -import WayofTime.bloodmagic.teleport.PortalLocation; -import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.teleport.Teleports; -import WayofTime.bloodmagic.tile.TileDimensionalPortal; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Random; - -public class BlockDimensionalPortal extends BlockInteger { - protected static final AxisAlignedBB AABB_0 = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.0D, 0.625D); - protected static final AxisAlignedBB AABB_1 = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_DEFAULT = new AxisAlignedBB(0.375D, 0.0D, 0.375D, 0.625D, 1.0D, 0.625D); - - public BlockDimensionalPortal() { - super(Material.PORTAL, 2); - setTranslationKey(BloodMagic.MODID + ".dimensionalPortal"); - setBlockUnbreakable(); - setResistance(2000); - setLightOpacity(0); - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public AxisAlignedBB getCollisionBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { - return null; - } - - public boolean isOpaqueCube() { - return false; - } - - public boolean isFullCube() { - return false; - } - - @Override - public int getLightValue(BlockState state, IBlockAccess world, BlockPos pos) { - return 12; - } - - @Override - public void onEntityCollision(World world, BlockPos pos, BlockState blockState, Entity entity) { - if (!world.isRemote && world.getTileEntity(pos) instanceof TileDimensionalPortal) { - TileDimensionalPortal tile = (TileDimensionalPortal) world.getTileEntity(pos); - - if (LocationsHandler.getLocationsHandler() != null) { - ArrayList linkedLocations = LocationsHandler.getLocationsHandler().getLinkedLocations(tile.portalID); - - if (linkedLocations != null && !linkedLocations.isEmpty() && linkedLocations.size() > 1) { - if (world.getTileEntity(tile.getMasterStonePos()) != null && world.getTileEntity(tile.getMasterStonePos()) instanceof IMasterRitualStone) { - IMasterRitualStone masterRitualStone = (IMasterRitualStone) world.getTileEntity(tile.getMasterStonePos()); - if (linkedLocations.get(0).equals(new PortalLocation(masterRitualStone.getBlockPos().up(), world.provider.getDimension()))) { - PortalLocation portal = linkedLocations.get(1); - if (portal.getDimension() == world.provider.getDimension()) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), false)); - } else { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), world, portal.getDimension(), false)); - } - } else if (linkedLocations.get(1).equals(new PortalLocation(masterRitualStone.getBlockPos().up(), world.provider.getDimension()))) { - PortalLocation portal = linkedLocations.get(0); - if (portal.getDimension() == world.provider.getDimension()) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), false)); - } else { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(portal.getX(), portal.getY(), portal.getZ(), entity, masterRitualStone.getOwner(), world, portal.getDimension(), false)); - } - } - } - } - } - } - } - - @Override - public int quantityDropped(Random par1Random) { - return 0; - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { - int meta = state.getBlock().getMetaFromState(state); - if (meta == 0) { - return AABB_0; - } else if (meta == 1) { - return AABB_1; - } else { - return AABB_DEFAULT; - } - } - -// -// @Override -// public void setBlockBoundsForItemRender() -// { -// setBlockBounds(0f, 0f, 0.375f, 1f, 1f, 0.625f); -// } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.TRANSLUCENT; - } - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(BlockState state, World world, BlockPos pos, Random rand) { - this.spawnParticles(world, pos.getX(), pos.getY(), pos.getZ()); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileDimensionalPortal(); - } - - private void spawnParticles(World world, int x, int y, int z) { - Random random = world.rand; - double d0 = 0.0625D; - for (int i = 0; i < 6; ++i) { - double particleX = (double) ((float) x + random.nextFloat()); - double particleY = (double) ((float) y + random.nextFloat()); - double particleZ = (double) ((float) z + random.nextFloat()); - if (i == 0 && !world.getBlockState(new BlockPos(x, y + 1, z)).isOpaqueCube()) { - particleY = (double) (y + 1) + d0; - } - if (i == 1 && !world.getBlockState(new BlockPos(x, y - 1, z)).isOpaqueCube()) { - particleY = (double) y - d0; - } - if (i == 2 && !world.getBlockState(new BlockPos(x, y, z + 1)).isOpaqueCube()) { - particleZ = (double) (z + 1) + d0; - } - if (i == 3 && !world.getBlockState(new BlockPos(x, y, z - 1)).isOpaqueCube()) { - particleZ = (double) z - d0; - } - if (i == 4 && !world.getBlockState(new BlockPos(x + 1, y, z)).isOpaqueCube()) { - particleX = (double) (x + 1) + d0; - } - if (i == 5 && !world.getBlockState(new BlockPos(x - 1, y, z)).isOpaqueCube()) { - particleX = (double) x - d0; - } - if (particleX < (double) x || particleX > (double) (x + 1) || particleY < 0.0D || particleY > (double) (y + 1) || particleZ < (double) z || particleZ > (double) (z + 1)) { - world.spawnParticle(EnumParticleTypes.REDSTONE, particleX, particleY, particleZ, 0.0D, 0.0D, 0.0D); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java deleted file mode 100644 index e4c22de3..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java +++ /dev/null @@ -1,86 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlock { - protected static final AxisAlignedBB AABB = new AxisAlignedBB(5 / 16F, 0F, 5 / 16F, 12 / 16F, 1F, 11 / 16F); - - public BlockIncenseAltar() { - super(Material.ROCK); - - setTranslationKey(BloodMagic.MODID + ".incenseAltar"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 0); - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return AABB; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileIncenseAltar TileIncenseAltar = (TileIncenseAltar) world.getTileEntity(blockPos); - if (TileIncenseAltar != null) - TileIncenseAltar.dropItems(); - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileIncenseAltar(); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java deleted file mode 100644 index 7e52286f..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockInputRoutingNode extends BlockRoutingNode { - public BlockInputRoutingNode() { - super(); - - setTranslationKey(BloodMagic.MODID + ".inputRouting"); - } - - @Override - //TODO: Combine BlockInputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, BlockState state) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileInputRoutingNode) { - ((TileInputRoutingNode) tile).removeAllConnections(); - ((TileInputRoutingNode) tile).dropItems(); - } - super.breakBlock(world, pos, state); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - if (world.getTileEntity(pos) instanceof TileInputRoutingNode) { - player.openGui(BloodMagic.instance, Constants.Gui.ROUTING_NODE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); - } - - return true; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileInputRoutingNode(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java deleted file mode 100644 index ec8f6737..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java +++ /dev/null @@ -1,90 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumSubWillType; -import WayofTime.bloodmagic.tile.TileInversionPillar; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -public class BlockInversionPillar extends BlockEnum { - public BlockInversionPillar() { - super(Material.ROCK, EnumSubWillType.class); - - setTranslationKey(BloodMagic.MODID + ".inversionpillar."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileInversionPillar) { - TileInversionPillar tilePillar = (TileInversionPillar) world.getTileEntity(blockPos); - tilePillar.removePillarFromMap(); - } - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { - return super.getActualState(state, world, pos).withProperty(Properties.StaticProperty, true); - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (int i = 0; i < this.getTypes().length; i++) - variants.put(i, "static=false,type=" + this.getTypes()[i]); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileInversionPillar(state.getValue(getProperty()).getType()); - } - - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), Properties.StaticProperty).add(Properties.AnimationProperty).build(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java deleted file mode 100644 index d373d242..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java +++ /dev/null @@ -1,57 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumInversionCap; -import WayofTime.bloodmagic.client.IVariantProvider; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; - -public class BlockInversionPillarEnd extends BlockEnum implements IVariantProvider { - public BlockInversionPillarEnd() { - super(Material.ROCK, EnumInversionCap.class); - - setTranslationKey(BloodMagic.MODID + ".inversionpillarend."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 2); - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (int i = 0; i < this.getTypes().length; i++) - variants.put(i, "type=" + this.getTypes()[i]); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java deleted file mode 100644 index 585a11b4..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockItemRoutingNode.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockItemRoutingNode extends BlockRoutingNode { - public BlockItemRoutingNode() { - super(); - - setTranslationKey(BloodMagic.MODID + ".itemRouting"); - } - - @Override - public void breakBlock(World world, BlockPos pos, BlockState state) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileRoutingNode) { - ((TileRoutingNode) tile).removeAllConnections(); - } - super.breakBlock(world, pos, state); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileItemRoutingNode(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java b/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java deleted file mode 100644 index e94badd6..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockLifeEssence.java +++ /dev/null @@ -1,66 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.material.Material; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fluids.BlockFluidClassic; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import java.awt.Color; - -public class BlockLifeEssence extends BlockFluidClassic { - private static final Fluid LIFE_ESSENCE = new FluidLifeEssence(); - - public BlockLifeEssence() { - super(LIFE_ESSENCE, Material.WATER); - - setTranslationKey(BloodMagic.MODID + ".fluid.lifeEssence"); - getLifeEssence().setBlock(this); - } - - @Override - public boolean canDisplace(IBlockAccess world, BlockPos blockPos) { - return !world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isLiquid() && super.canDisplace(world, blockPos); - } - - @Override - public boolean displaceIfPossible(World world, BlockPos blockPos) { - return !world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isLiquid() && super.displaceIfPossible(world, blockPos); - } - - @Override - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.SOLID; - } - - public static Fluid getLifeEssence() { - return LIFE_ESSENCE; - } - - public static class FluidLifeEssence extends Fluid { - - public FluidLifeEssence() { - super("lifeEssence", new ResourceLocation(Constants.Mod.DOMAIN + "blocks/lifeEssenceStill"), new ResourceLocation(Constants.Mod.DOMAIN + "blocks/lifeEssenceFlowing")); - - setDensity(2000); - setViscosity(2000); - } - - @Override - public int getColor() { - return Color.RED.getRGB(); - } - - @Override - public String getLocalizedName(FluidStack fluidStack) { - return TextHelper.localize("tile.bloodmagic.fluid.lifeEssence.name"); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java deleted file mode 100644 index c985563d..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ /dev/null @@ -1,43 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockMasterRoutingNode extends BlockRoutingNode { - public BlockMasterRoutingNode() { - super(); - - setTranslationKey(BloodMagic.MODID + ".masterRouting"); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileMasterRoutingNode(); - } - - // @Override -// public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) -// { -// if (world.getTileEntity(pos) instanceof TileMasterRoutingNode) -// { -// player.openGui(BloodMagic.instance, Constants.Gui.MASTER_ROUTING_NODE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); -// } -// -// return true; -// } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java b/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java deleted file mode 100644 index a3e10e77..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMimic.java +++ /dev/null @@ -1,227 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.altar.IAltarComponent; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumMimic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.item.block.ItemBlockMimic; -import net.minecraft.block.*; -import net.minecraft.block.material.Material; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; - -public class BlockMimic extends BlockEnum implements IAltarComponent { - public static final int sentientMimicMeta = 4; - - public BlockMimic() { - super(Material.ROCK, EnumMimic.class); - - setTranslationKey(BloodMagic.MODID + ".mimic."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - setHarvestLevel("pickaxe", 0); - setLightOpacity(15); - } - - @Nullable - @Override - public AxisAlignedBB getCollisionBoundingBox(BlockState state, IBlockAccess world, BlockPos pos) { - switch (this.getMetaFromState(state)) { - case 1: - case 2: - case 3: - case 4: - TileMimic tileMimic = (TileMimic) world.getTileEntity(pos); - if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) { - Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem()); - if (mimicBlock == Blocks.AIR) { - return FULL_BLOCK_AABB; - } - BlockState mimicState = tileMimic.getReplacedState(); - if (mimicBlock != this) { - return mimicState.getCollisionBoundingBox(world, pos); - } - } else { - return FULL_BLOCK_AABB; - } - case 0: - default: - return NULL_AABB; - } - - } - - @Override - @SideOnly(Side.CLIENT) - public AxisAlignedBB getSelectedBoundingBox(BlockState state, World world, BlockPos pos) { - TileMimic tileMimic = (TileMimic) world.getTileEntity(pos); - if (tileMimic != null && !tileMimic.getStackInSlot(0).isEmpty()) { - Block mimicBlock = Block.getBlockFromItem(tileMimic.getStackInSlot(0).getItem()); - if (mimicBlock == Blocks.AIR) { - return FULL_BLOCK_AABB; - } - BlockState mimicState = tileMimic.getReplacedState(); - if (mimicBlock != this) { - return mimicState.getSelectedBoundingBox(world, pos); - } - } - - return FULL_BLOCK_AABB; - } - - @Override - public int getLightOpacity(BlockState state) { - switch (this.getMetaFromState(state)) { - case 2: - case 4: - return 0; - default: - return this.lightOpacity; - } - } - - @Override - public int getLightValue(BlockState state) { - switch (this.getMetaFromState(state)) { - case 3: - return 15; - default: - return this.lightValue; - } - } - - @Override - public int getMetaFromState(BlockState state) { - if (state.getBlock() == this) { - return super.getMetaFromState(state); - } - - return state.getBlock().getMetaFromState(state); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - TileMimic mimic = (TileMimic) world.getTileEntity(pos); - - return mimic != null && mimic.onBlockActivated(world, pos, state, player, hand, player.getHeldItem(hand), side); - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) { - TileMimic mimic = (TileMimic) tile; - ItemStack stack = mimic.getStackInSlot(0); - if (stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - BlockState mimicState = mimic.getReplacedState(); - if (block != this) { - if (block.getRenderType(mimicState) == BlockRenderType.ENTITYBLOCK_ANIMATED) { - return RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState(); //Small and invisible-ish, basically this is returned in order to not render over the animated block (TESR) - } - - return block.getActualState(mimicState, world, pos); - } - } - } - return state; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { - return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.CUTOUT; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileMimic) { - TileMimic TileMimic = (TileMimic) world.getTileEntity(blockPos); - if (TileMimic != null) - TileMimic.dropItems(); - } - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileMimic(); - } - - // IAltarComponent - - @Nullable - @Override - public ComponentType getType(World world, BlockState state, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) { - TileMimic mimic = (TileMimic) tile; - ItemStack stack = mimic.getStackInSlot(0); - if (stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - if (block instanceof IAltarComponent) { - return ((IAltarComponent) block).getType(world, mimic.getReplacedState(), pos); - } else { - for (ComponentType altarComponent : ComponentType.values()) - if (block == Utils.getBlockForComponent(altarComponent)) - return altarComponent; - } - } - } - return null; - } - - @Override - public BlockItem getItem() { - return new ItemBlockMimic(this); - } - -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java deleted file mode 100644 index cc4eda8b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockOutputRoutingNode extends BlockRoutingNode { - public BlockOutputRoutingNode() { - super(); - - setTranslationKey(BloodMagic.MODID + ".outputRouting"); - } - - @Override - //TODO: Combine BlockOutputRoutingNode and BlockInputRoutingNode so they have the same superclass - public void breakBlock(World world, BlockPos pos, BlockState state) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileOutputRoutingNode) { - ((TileOutputRoutingNode) tile).removeAllConnections(); - ((TileOutputRoutingNode) tile).dropItems(); - } - super.breakBlock(world, pos, state); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - if (world.getTileEntity(pos) instanceof TileOutputRoutingNode) { - player.openGui(BloodMagic.instance, Constants.Gui.ROUTING_NODE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); - } - - return true; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileOutputRoutingNode(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java b/src/main/java/WayofTime/bloodmagic/block/BlockPath.java deleted file mode 100644 index 97ba5250..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPath.java +++ /dev/null @@ -1,84 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumPath; -import WayofTime.bloodmagic.incense.IIncensePath; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.List; - -public class BlockPath extends BlockEnum implements IIncensePath { - - public BlockPath() { - super(Material.ROCK, EnumPath.class); - - setTranslationKey(BloodMagic.MODID + ".path."); - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.STONE); - - setHarvestLevel("axe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WOOD)); - setHarvestLevel("axe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WOODTILE)); - setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.STONE)); - setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.STONETILE)); - setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WORNSTONE)); - setHarvestLevel("pickaxe", 0, getDefaultState().withProperty(getProperty(), EnumPath.WORNSTONETILE)); - setHarvestLevel("pickaxe", 3, getDefaultState().withProperty(getProperty(), EnumPath.OBSIDIAN)); - setHarvestLevel("pickaxe", 3, getDefaultState().withProperty(getProperty(), EnumPath.OBSIDIANTILE)); - } - - @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, world, tooltip, tooltipFlag); - } - - @Override - public Material getMaterial(BlockState state) { - EnumPath path = state.getValue(getProperty()); - if (path.equals(EnumPath.WOOD) || path.equals(EnumPath.WOODTILE)) - return Material.WOOD; - else - return Material.ROCK; - } - - @Override - public SoundType getSoundType(BlockState state, World world, BlockPos pos, @Nullable Entity entity) { - EnumPath path = state.getValue(getProperty()); - if (path.equals(EnumPath.WOOD) || path.equals(EnumPath.WOODTILE)) - return SoundType.WOOD; - else - return super.getSoundType(); - } - - @Override - public int getLevelOfPath(World world, BlockPos pos, BlockState state) { - switch (this.getMetaFromState(state)) { - case 0: - case 1: - return 2; - case 2: - case 3: - return 4; - case 4: - case 5: - return 6; - case 6: - case 7: - return 8; - default: - return 0; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java deleted file mode 100644 index 81281cbc..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java +++ /dev/null @@ -1,82 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TilePhantomBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.Random; - -public class BlockPhantom extends Block implements IVariantProvider { - public BlockPhantom() { - super(Material.CLOTH); - - setTranslationKey(BloodMagic.MODID + ".phantom"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.TRANSLUCENT; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { - return world.getBlockState(pos.offset(side)) != state || state.getBlock() != this && super.shouldSideBeRendered(state, world, pos, side); - } - - @Override - public int quantityDropped(Random par1Random) { - return 0; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TilePhantomBlock(20); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java deleted file mode 100644 index 7c896b63..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualController.java +++ /dev/null @@ -1,136 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.event.RitualEvent; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.util.helper.RitualHelper; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.block.enums.EnumRitualController; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileImperfectRitualStone; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import amerifrance.guideapi.api.IGuideLinked; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.Explosion; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; - -import javax.annotation.Nullable; - -public class BlockRitualController extends BlockEnum implements IGuideLinked { - - public BlockRitualController() { - super(Material.ROCK, EnumRitualController.class); - - setTranslationKey(BloodMagic.MODID + ".stone.ritual."); - setCreativeTab(BloodMagic.TAB_BM); - setSoundType(SoundType.STONE); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack heldItem = player.getHeldItem(hand); - TileEntity tile = world.getTileEntity(pos); - - if (state.getValue(getProperty()) != EnumRitualController.IMPERFECT && tile instanceof TileMasterRitualStone) { - if (heldItem.getItem() == RegistrarBloodMagicItems.ACTIVATION_CRYSTAL) { - if (((IBindable) heldItem.getItem()).getBinding(heldItem) == null) - return false; - - String key = RitualHelper.getValidRitual(world, pos); - if (!key.isEmpty()) { - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); - if (ritual != null) { - Direction direction = RitualHelper.getDirectionOfRitual(world, pos, ritual); - // TODO: Give a message stating that this ritual is not a valid ritual. - if (direction != null && RitualHelper.checkValidRitual(world, pos, ritual, direction)) { - if (((TileMasterRitualStone) tile).activateRitual(heldItem, player, BloodMagic.RITUAL_MANAGER.getRitual(key))) { - ((TileMasterRitualStone) tile).setDirection(direction); - if (state.getValue(getProperty()) == EnumRitualController.INVERTED) - ((TileMasterRitualStone) tile).setInverted(true); - } - } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); - } - } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); - } - } else { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); - } - } - } else if (state.getValue(getProperty()) == EnumRitualController.IMPERFECT && tile instanceof TileImperfectRitualStone) { - BlockState ritualBlock = world.getBlockState(pos.up()); - ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(ritualBlock); - if (ritual == null) - return false; - - RitualEvent.ImperfectRitualActivatedEvent event = new RitualEvent.ImperfectRitualActivatedEvent((IImperfectRitualStone) tile, player, ritual); - return !MinecraftForge.EVENT_BUS.post(event) && ((TileImperfectRitualStone) tile).performRitual(world, pos, ritual, player); - } - - return false; - } - - @Override - public void onBlockHarvested(World world, BlockPos pos, BlockState state, PlayerEntity player) { - TileEntity tile = world.getTileEntity(pos); - - if (getMetaFromState(state) == 0 && tile instanceof TileMasterRitualStone) - ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.BREAK_MRS); - } - - @Override - public void onExplosionDestroy(World world, BlockPos pos, Explosion explosion) { - TileEntity tile = world.getTileEntity(pos); - - if (tile instanceof TileMasterRitualStone) - ((TileMasterRitualStone) tile).stopRitual(Ritual.BreakType.EXPLOSION); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return state.getValue(getProperty()) != EnumRitualController.IMPERFECT ? new TileMasterRitualStone() : new TileImperfectRitualStone(); - } - - // IGuideLinked - - @Override - @Nullable - public ResourceLocation getLinkedEntry(World world, BlockPos pos, PlayerEntity player, ItemStack stack) { - BlockState state = world.getBlockState(pos); - if (state.getValue(getProperty()).equals(EnumRitualController.MASTER)) { - TileMasterRitualStone mrs = (TileMasterRitualStone) world.getTileEntity(pos); - if (mrs == null || mrs.getCurrentRitual() == null) - return null; - else - return new ResourceLocation("bloodmagic", "ritual_" + mrs.getCurrentRitual().getName()); - } else if (state.getValue(getProperty()).equals(EnumRitualController.IMPERFECT)) { - ImperfectRitual imperfectRitual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); - if (imperfectRitual != null) - return new ResourceLocation("bloodmagic", "ritual_" + imperfectRitual.getName()); - } - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java b/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java deleted file mode 100644 index 33ddfd90..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRitualStone.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IRitualStone; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -public class BlockRitualStone extends BlockEnum implements IRitualStone { - public BlockRitualStone() { - super(Material.ROCK, EnumRuneType.class); - - setTranslationKey(BloodMagic.MODID + ".ritualStone."); - setCreativeTab(BloodMagic.TAB_BM); - setSoundType(SoundType.STONE); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - } - - @SideOnly(Side.CLIENT) - @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.decoration.safe")); - super.addInformation(stack, world, tooltip, tooltipFlag); - } - - @Override - public int damageDropped(BlockState state) { - return 0; - } - - @Override - public boolean canSilkHarvest(World world, BlockPos pos, BlockState state, PlayerEntity player) { - return false; - } - - @Override - public boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType) { - return runeType == this.getTypes()[getMetaFromState(world.getBlockState(pos))]; - } - - @Override - public void setRuneType(World world, BlockPos pos, EnumRuneType runeType) { - int meta = runeType.ordinal(); - BlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); - world.setBlockState(pos, newState); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java deleted file mode 100644 index be4adeb1..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java +++ /dev/null @@ -1,137 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; - -public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvider { - public static final PropertyBool UP = PropertyBool.create("up"); - public static final PropertyBool DOWN = PropertyBool.create("down"); - public static final PropertyBool NORTH = PropertyBool.create("north"); - public static final PropertyBool EAST = PropertyBool.create("east"); - public static final PropertyBool SOUTH = PropertyBool.create("south"); - public static final PropertyBool WEST = PropertyBool.create("west"); - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.378F, 0.378F, 0.378F, 0.625F, 0.625F, 0.625F); - - public BlockRoutingNode() { - super(Material.ROCK); - - setCreativeTab(BloodMagic.TAB_BM); - setHardness(2.0F); - setResistance(5.0F); - setHarvestLevel("pickaxe", 2); - - this.setDefaultState(this.blockState.getBaseState().withProperty(DOWN, false).withProperty(UP, false).withProperty(NORTH, false).withProperty(EAST, false).withProperty(SOUTH, false).withProperty(WEST, false)); - } - - @Override - public boolean canConnectRedstone(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { - return true; - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return AABB; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean canRenderInLayer(BlockState state, BlockRenderLayer layer) { - return layer == BlockRenderLayer.CUTOUT_MIPPED || layer == BlockRenderLayer.TRANSLUCENT; - } - - @Override - public BlockState getStateFromMeta(int meta) { - return this.getDefaultState(); - } - - /** - * Convert the BlockState into the correct metadata value - */ - @Override - public int getMetaFromState(BlockState state) { - return 0; - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess worldIn, BlockPos pos) { - return state.withProperty(UP, this.shouldConnect(state, worldIn, pos.up(), Direction.DOWN)).withProperty(DOWN, this.shouldConnect(state, worldIn, pos.down(), Direction.UP)).withProperty(NORTH, this.shouldConnect(state, worldIn, pos.north(), Direction.SOUTH)).withProperty(EAST, this.shouldConnect(state, worldIn, pos.east(), Direction.WEST)).withProperty(SOUTH, this.shouldConnect(state, worldIn, pos.south(), Direction.NORTH)).withProperty(WEST, this.shouldConnect(state, worldIn, pos.west(), Direction.EAST)); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, UP, DOWN, NORTH, EAST, WEST, SOUTH); - } - - public boolean shouldConnect(BlockState state, IBlockAccess world, BlockPos pos, Direction attachedSide) { - BlockState blockState = world.getBlockState(pos); - Block block = blockState.getBlock(); - return block.getMaterial(blockState).isOpaque() && blockState.isFullCube(); - } - - @Override - public void breakBlock(World world, BlockPos pos, BlockState blockState) { - if (!world.isRemote) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileRoutingNode) { - ((TileRoutingNode) tile).removeAllConnections(); - } else if (tile instanceof TileMasterRoutingNode) { - ((TileMasterRoutingNode) tile).removeAllConnections(); - } - } - - super.breakBlock(world, pos, blockState); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "inventory"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java deleted file mode 100644 index bdfbc5f6..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java +++ /dev/null @@ -1,100 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock { - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0.06F, 0.0F, 0.06F, 0.94F, 0.75F, 0.94F); - - public BlockSoulForge() { - super(Material.IRON); - - setTranslationKey(BloodMagic.MODID + ".soulForge"); - setHardness(2.0F); - setResistance(5.0F); - setSoundType(SoundType.METAL); - setHarvestLevel("pickaxe", 1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return AABB; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - if (world.getTileEntity(pos) instanceof TileSoulForge) - player.openGui(BloodMagic.instance, Constants.Gui.SOUL_FORGE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); - - return true; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileSoulForge tileSoulForge = (TileSoulForge) world.getTileEntity(blockPos); - if (tileSoulForge != null) - tileSoulForge.dropItems(); - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileSoulForge(); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java deleted file mode 100644 index 7602a807..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java +++ /dev/null @@ -1,105 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.material.Material; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockRenderLayer; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.Random; - -public class BlockSpectral extends Block { - protected static final AxisAlignedBB AABB = new AxisAlignedBB(0, 0, 0, 0, 0, 0); - - public BlockSpectral() { - super(Material.CLOTH); - - setTranslationKey(BloodMagic.MODID + ".spectral"); - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - return AABB; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockAccess world, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public boolean causesSuffocation(BlockState state) { - return false; - } - - @SideOnly(Side.CLIENT) - @Override - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.TRANSLUCENT; - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return ConfigHandler.client.invisibleSpectralBlocks ? BlockRenderType.INVISIBLE : BlockRenderType.MODEL; - } - - @Override - @SideOnly(Side.CLIENT) - public boolean shouldSideBeRendered(BlockState state, IBlockAccess world, BlockPos pos, Direction side) { - return world.getBlockState(pos.offset(side)) != state || state.getBlock() != this && super.shouldSideBeRendered(state, world, pos, side); - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB mask, List list, Entity collidingEntity, boolean bool) { - } - - @Override - public int quantityDropped(Random par1Random) { - return 0; - } - - @Override - public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos) { - return true; - } - - @Override - public boolean isAir(BlockState state, IBlockAccess world, BlockPos blockPos) { - return true; - } - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Nullable - @Override - public TileEntity createTileEntity(World world, BlockState state) { - return new TileSpectralBlock(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java deleted file mode 100644 index 5dac961b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.command.sub.SubCommandTeleposer; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.block.ContainerBlock; -import net.minecraft.block.material.Material; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.block.BlockRenderType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class BlockTeleposer extends ContainerBlock implements IVariantProvider, IBMBlock { - public BlockTeleposer() { - super(Material.ROCK); - - setCreativeTab(BloodMagic.TAB_BM); - setTranslationKey(BloodMagic.MODID + ".teleposer"); - setHardness(2.0F); - setResistance(5.0F); - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack playerItem = player.getHeldItem(hand); - - if (playerItem.getItem() instanceof ItemTelepositionFocus) - ((ItemTelepositionFocus) playerItem.getItem()).setBlockPos(playerItem, world, pos); - else if (world.getTileEntity(pos) instanceof TileTeleposer) - player.openGui(BloodMagic.instance, Constants.Gui.TELEPOSER_GUI, world, pos.getX(), pos.getY(), pos.getZ()); - - return true; - } - - @Override - public void breakBlock(World world, BlockPos blockPos, BlockState blockState) { - TileTeleposer tileTeleposer = (TileTeleposer) world.getTileEntity(blockPos); - if (tileTeleposer != null) { - tileTeleposer.dropItems(); - SubCommandTeleposer.teleposerSet.remove(tileTeleposer); - } - - super.breakBlock(world, blockPos, blockState); - } - - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return new TileTeleposer(); - } - - @Override - public BlockItem getItem() { - return new BlockItem(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java deleted file mode 100644 index 7c4b1e51..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.block; - -import net.minecraft.item.BlockItem; - -public interface IBMBlock { - - BlockItem getItem(); -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java deleted file mode 100644 index 79a1fb0b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java +++ /dev/null @@ -1,98 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import WayofTime.bloodmagic.block.IBMBlock; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.NonNullList; - -import javax.annotation.Nonnull; - -public class BlockEnum & IStringSerializable> extends Block implements IBMBlock, IVariantProvider { - private final E[] types; - private final PropertyEnum property; - private final BlockStateContainer realStateContainer; - - public BlockEnum(Material material, Class enumClass, String propName) { - super(material); - - this.types = enumClass.getEnumConstants(); - this.property = PropertyEnum.create(propName, enumClass); - this.realStateContainer = createStateContainer(); - setDefaultState(getBlockState().getBaseState()); - } - - public BlockEnum(Material material, Class enumClass) { - this(material, enumClass, "type"); - } - - @Override - protected final BlockStateContainer createBlockState() { - return new BlockStateContainer.Builder(this).build(); // Blank to avoid crashes - } - - @Override - public final BlockStateContainer getBlockState() { - return realStateContainer; - } - - @Override - public BlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(property, types[meta]); - } - - @Override - public int getMetaFromState(BlockState state) { - return state.getValue(property).ordinal(); - } - - @Override - public int damageDropped(BlockState state) { - return getMetaFromState(state); - } - - @Override - public void getSubBlocks(ItemGroup tab, NonNullList subBlocks) { - for (E type : types) - subBlocks.add(new ItemStack(this, 1, type.ordinal())); - } - - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(property).build(); - } - - @Override - public BlockItem getItem() { - return new ItemBlockEnum<>(this); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - if (getItem() == null) - return; - - for (int i = 0; i < types.length; i++) - variants.put(i, getProperty().getName() + "=" + types[i].name()); - } - - public E[] getTypes() { - return types; - } - - public PropertyEnum getProperty() { - return property; - } - - public BlockStateContainer getRealStateContainer() { - return realStateContainer; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java deleted file mode 100644 index b85224e7..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillar.java +++ /dev/null @@ -1,124 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.BlockState; -import net.minecraft.block.RotatedPillarBlock; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import org.apache.commons.lang3.ArrayUtils; - -public class BlockEnumPillar & IStringSerializable> extends BlockEnum { - public BlockEnumPillar(Material material, Class enumClass, String propName) { - super(material, enumClass, propName); - } - - public BlockEnumPillar(Material material, Class enumClass) { - this(material, enumClass, "type"); - } - - @Override - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), RotatedPillarBlock.AXIS).build(); - } - - @Override - public BlockState getStateFromMeta(int meta) { - BlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 5]); - - switch (meta / 5) { - case 0: - state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Y); - break; - case 1: - state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.X); - break; - case 2: - state = state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Z); - break; - default: - state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Y); - break; - } - - return state; - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @SuppressWarnings("incomplete-switch") - @Override - public int getMetaFromState(BlockState state) { - int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); - - switch (state.getValue(RotatedPillarBlock.AXIS)) { - case X: - i = i + 5; - break; - case Z: - i = i + 10; - break; - } - - return i; - } - - @Override - public boolean rotateBlock(World world, BlockPos pos, Direction axis) { - BlockState state = world.getBlockState(pos); - for (IProperty prop : state.getProperties().keySet()) { - if (prop == RotatedPillarBlock.AXIS) { - world.setBlockState(pos, state.cycleProperty(prop)); - return true; - } - } - return false; - } - - @Override - public BlockState withRotation(BlockState state, Rotation rot) { - switch (rot) { - case COUNTERCLOCKWISE_90: - case CLOCKWISE_90: - switch (state.getValue(RotatedPillarBlock.AXIS)) { - case X: - return state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.Z); - case Z: - return state.withProperty(RotatedPillarBlock.AXIS, Direction.Axis.X); - default: - return state; - } - - default: - return state; - } - } - - @Override - protected ItemStack getSilkTouchDrop(BlockState state) { - return new ItemStack(this, 1, damageDropped(state)); - } - - - @Override - public BlockState getStateForPlacement(World world, BlockPos pos, Direction facing, float hitX, float hitY, float hitZ, int meta, LivingEntity placer, Hand hand) { - return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(RotatedPillarBlock.AXIS, facing.getAxis()); - } - - @Override - public int damageDropped(BlockState state) { - return super.getMetaFromState(state); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java deleted file mode 100644 index 3d4a02b3..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumPillarCap.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyDirection; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import org.apache.commons.lang3.ArrayUtils; - -public class BlockEnumPillarCap & IStringSerializable> extends BlockEnum { - public static final PropertyDirection FACING = PropertyDirection.create("facing"); - - public BlockEnumPillarCap(Material material, Class enumClass, String propName) { - super(material, enumClass, propName); - } - - public BlockEnumPillarCap(Material material, Class enumClass) { - this(material, enumClass, "type"); - } - - @Override - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), FACING).build(); - } - - @Override - public BlockState getStateFromMeta(int meta) { - BlockState state = getBlockState().getBaseState().withProperty(this.getProperty(), getTypes()[meta % 2]); - return state.withProperty(FACING, Direction.byIndex(meta / 2)); - } - - @Override - public int getMetaFromState(BlockState state) { - int i = ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); - return i + 2 * state.getValue(FACING).getIndex(); - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @Override - public BlockState withRotation(BlockState state, Rotation rot) { - return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); - } - - @Override - public BlockState withMirror(BlockState state, Mirror mirrorIn) { - return state.withRotation(mirrorIn.toRotation(state.getValue(FACING))); - } - - @Override - protected ItemStack getSilkTouchDrop(BlockState state) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @Override - public BlockState getStateForPlacement(World world, BlockPos pos, Direction facing, float hitX, float hitY, float hitZ, int meta, LivingEntity placer, Hand hand) { - return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, facing); - } - - @Override - public int damageDropped(BlockState state) { - return super.getMetaFromState(state); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java deleted file mode 100644 index b21d89ab..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumStairs.java +++ /dev/null @@ -1,343 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalBlock; -import net.minecraft.block.StairsBlock; -import net.minecraft.block.StairsBlock.EnumHalf; -import net.minecraft.block.StairsBlock.EnumShape; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyDirection; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeModContainer; -import org.apache.commons.lang3.ArrayUtils; - -import javax.annotation.Nullable; -import java.util.List; - -public class BlockEnumStairs & IStringSerializable> extends BlockEnum { - public static final PropertyDirection FACING = HorizontalBlock.FACING; - - protected static final AxisAlignedBB AABB_SLAB_TOP = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 1.0D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_TOP_WEST = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 0.5D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_TOP_EAST = new AxisAlignedBB(0.5D, 0.5D, 0.0D, 1.0D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_TOP_NORTH = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 1.0D, 1.0D, 0.5D); - protected static final AxisAlignedBB AABB_QTR_TOP_SOUTH = new AxisAlignedBB(0.0D, 0.5D, 0.5D, 1.0D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_OCT_TOP_NW = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 0.5D, 1.0D, 0.5D); - protected static final AxisAlignedBB AABB_OCT_TOP_NE = new AxisAlignedBB(0.5D, 0.5D, 0.0D, 1.0D, 1.0D, 0.5D); - protected static final AxisAlignedBB AABB_OCT_TOP_SW = new AxisAlignedBB(0.0D, 0.5D, 0.5D, 0.5D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_OCT_TOP_SE = new AxisAlignedBB(0.5D, 0.5D, 0.5D, 1.0D, 1.0D, 1.0D); - protected static final AxisAlignedBB AABB_SLAB_BOTTOM = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_BOT_WEST = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.5D, 0.5D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_BOT_EAST = new AxisAlignedBB(0.5D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D); - protected static final AxisAlignedBB AABB_QTR_BOT_NORTH = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 0.5D); - protected static final AxisAlignedBB AABB_QTR_BOT_SOUTH = new AxisAlignedBB(0.0D, 0.0D, 0.5D, 1.0D, 0.5D, 1.0D); - protected static final AxisAlignedBB AABB_OCT_BOT_NW = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.5D, 0.5D, 0.5D); - protected static final AxisAlignedBB AABB_OCT_BOT_NE = new AxisAlignedBB(0.5D, 0.0D, 0.0D, 1.0D, 0.5D, 0.5D); - protected static final AxisAlignedBB AABB_OCT_BOT_SW = new AxisAlignedBB(0.0D, 0.0D, 0.5D, 0.5D, 0.5D, 1.0D); - protected static final AxisAlignedBB AABB_OCT_BOT_SE = new AxisAlignedBB(0.5D, 0.0D, 0.5D, 1.0D, 0.5D, 1.0D); - - public BlockEnumStairs(Material material, Class enumClass, String propName) { - super(material, enumClass, propName); - } - - public BlockEnumStairs(Material material, Class enumClass) { - this(material, enumClass, "type"); - } - - @Override - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), FACING, StairsBlock.HALF, StairsBlock.SHAPE).build(); - } - - @Override - public void addCollisionBoxToList(BlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean bool) { - state = this.getActualState(state, worldIn, pos); - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(state)) { - addCollisionBoxToList(pos, entityBox, collidingBoxes, axisalignedbb); - } - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - @Override - public boolean isFullCube(BlockState state) { - return false; - } - - @Override - public BlockState getStateForPlacement(World world, BlockPos pos, Direction facing, float hitX, float hitY, float hitZ, int meta, LivingEntity placer, Hand hand) { - BlockState state = super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand); - state = state.withProperty(FACING, placer.getHorizontalFacing()).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.STRAIGHT); - return facing != Direction.DOWN && (facing == Direction.UP || (double) hitY <= 0.5D) ? state.withProperty(StairsBlock.HALF, StairsBlock.EnumHalf.BOTTOM) : state.withProperty(StairsBlock.HALF, StairsBlock.EnumHalf.TOP); - } - - @Override - public RayTraceResult collisionRayTrace(BlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) { - List list = Lists.newArrayList(); - - for (AxisAlignedBB axisalignedbb : getCollisionBoxList(this.getActualState(blockState, worldIn, pos))) { - list.add(this.rayTrace(pos, start, end, axisalignedbb)); - } - - RayTraceResult rayTrace = null; - double d1 = 0.0D; - - for (RayTraceResult raytraceresult : list) { - if (raytraceresult != null) { - double d0 = raytraceresult.hitVec.squareDistanceTo(end); - - if (d0 > d1) { - rayTrace = raytraceresult; - d1 = d0; - } - } - } - - return rayTrace; - } - - // Meta looks like: {1|11|1} = {HALF|FACING|TYPE} - @Override - public BlockState getStateFromMeta(int meta) { - BlockState state = getBlockState().getBaseState().withProperty(StairsBlock.HALF, (meta & 8) > 0 ? StairsBlock.EnumHalf.TOP : StairsBlock.EnumHalf.BOTTOM); - state = state.withProperty(FACING, Direction.byIndex(5 - (meta & 6) / 2)).withProperty(this.getProperty(), getTypes()[meta % 2]); - return state; - } - - // Meta looks like: {1|11|1} = {HALF|FACING|TYPE} - @Override - public int getMetaFromState(BlockState state) { - int i = 0; - - if (state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP) { - i |= 4; - } - - i = i | 5 - state.getValue(FACING).getIndex(); - return i * 2 + ArrayUtils.indexOf(getTypes(), state.getValue(getProperty())); - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess worldIn, BlockPos pos) { - return state.withProperty(StairsBlock.SHAPE, getStairsShape(state, worldIn, pos)); - } - - @Override - public BlockState withRotation(BlockState state, Rotation rot) { - return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); - } - - @SuppressWarnings("incomplete-switch") - @Override - public BlockState withMirror(BlockState state, Mirror mirrorIn) { - Direction facing = state.getValue(FACING); - StairsBlock.EnumShape stairShape = state.getValue(StairsBlock.SHAPE); - - switch (mirrorIn) { - case LEFT_RIGHT: - - if (facing.getAxis() == Direction.Axis.Z) { - switch (stairShape) { - case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_RIGHT); - case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_LEFT); - case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_LEFT); - case INNER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_RIGHT); - default: - return state.withRotation(Rotation.CLOCKWISE_180); - } - } - - break; - case FRONT_BACK: - - if (facing.getAxis() == Direction.Axis.X) { - switch (stairShape) { - case OUTER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_RIGHT); - case OUTER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.OUTER_LEFT); - case INNER_RIGHT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_RIGHT); - case INNER_LEFT: - return state.withRotation(Rotation.CLOCKWISE_180).withProperty(StairsBlock.SHAPE, StairsBlock.EnumShape.INNER_LEFT); - case STRAIGHT: - return state.withRotation(Rotation.CLOCKWISE_180); - } - } - } - - return super.withMirror(state, mirrorIn); - } - - @Override - protected ItemStack getSilkTouchDrop(BlockState state) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @Override - public int damageDropped(BlockState state) { - return super.getMetaFromState(state); - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, World world, BlockPos pos, PlayerEntity player) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @Override - public boolean doesSideBlockRendering(BlockState state, IBlockAccess world, BlockPos pos, Direction face) { - if (ForgeModContainer.disableStairSlabCulling) - return super.doesSideBlockRendering(state, world, pos, face); - - if (state.isOpaqueCube()) - return true; - - state = this.getActualState(state, world, pos); - - EnumHalf half = state.getValue(StairsBlock.HALF); - Direction side = state.getValue(FACING); - EnumShape shape = state.getValue(StairsBlock.SHAPE); - if (face == Direction.UP) - return half == EnumHalf.TOP; - if (face == Direction.DOWN) - return half == EnumHalf.BOTTOM; - if (shape == EnumShape.OUTER_LEFT || shape == EnumShape.OUTER_RIGHT) - return false; - if (face == side) - return true; - if (shape == EnumShape.INNER_LEFT && face.rotateY() == side) - return true; - if (shape == EnumShape.INNER_RIGHT && face.rotateYCCW() == side) - return true; - return false; - } - - private static List getCollisionBoxList(BlockState state) { - List list = Lists.newArrayList(); - boolean flag = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; - list.add(flag ? AABB_SLAB_TOP : AABB_SLAB_BOTTOM); - StairsBlock.EnumShape stairShape = state.getValue(StairsBlock.SHAPE); - - if (stairShape == StairsBlock.EnumShape.STRAIGHT || stairShape == StairsBlock.EnumShape.INNER_LEFT || stairShape == StairsBlock.EnumShape.INNER_RIGHT) { - list.add(getCollQuarterBlock(state)); - } - - if (stairShape != StairsBlock.EnumShape.STRAIGHT) { - list.add(getCollEighthBlock(state)); - } - - return list; - } - - private static AxisAlignedBB getCollQuarterBlock(BlockState state) { - boolean flag = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; - - switch (state.getValue(FACING)) { - case NORTH: - default: - return flag ? AABB_QTR_BOT_NORTH : AABB_QTR_TOP_NORTH; - case SOUTH: - return flag ? AABB_QTR_BOT_SOUTH : AABB_QTR_TOP_SOUTH; - case WEST: - return flag ? AABB_QTR_BOT_WEST : AABB_QTR_TOP_WEST; - case EAST: - return flag ? AABB_QTR_BOT_EAST : AABB_QTR_TOP_EAST; - } - } - - private static AxisAlignedBB getCollEighthBlock(BlockState state) { - Direction facing = state.getValue(FACING); - Direction newFacing; - - switch (state.getValue(StairsBlock.SHAPE)) { - case OUTER_LEFT: - default: - newFacing = facing; - break; - case OUTER_RIGHT: - newFacing = facing.rotateY(); - break; - case INNER_RIGHT: - newFacing = facing.getOpposite(); - break; - case INNER_LEFT: - newFacing = facing.rotateYCCW(); - } - - boolean isTop = state.getValue(StairsBlock.HALF) == StairsBlock.EnumHalf.TOP; - - switch (newFacing) { - case NORTH: - default: - return isTop ? AABB_OCT_BOT_NW : AABB_OCT_TOP_NW; - case SOUTH: - return isTop ? AABB_OCT_BOT_SE : AABB_OCT_TOP_SE; - case WEST: - return isTop ? AABB_OCT_BOT_SW : AABB_OCT_TOP_SW; - case EAST: - return isTop ? AABB_OCT_BOT_NE : AABB_OCT_TOP_NE; - } - } - - private static StairsBlock.EnumShape getStairsShape(BlockState state, IBlockAccess world, BlockPos pos) { - Direction facing = state.getValue(FACING); - BlockState offsetState = world.getBlockState(pos.offset(facing)); - - if (isBlockStairs(offsetState) && state.getValue(StairsBlock.HALF) == offsetState.getValue(StairsBlock.HALF)) { - Direction offsetFacing = offsetState.getValue(FACING); - - if (offsetFacing.getAxis() != state.getValue(FACING).getAxis() && isDifferentStairs(state, world, pos, offsetFacing.getOpposite())) { - if (offsetFacing == facing.rotateYCCW()) { - return StairsBlock.EnumShape.OUTER_LEFT; - } - - return StairsBlock.EnumShape.OUTER_RIGHT; - } - } - - BlockState oppositeOffsetState = world.getBlockState(pos.offset(facing.getOpposite())); - - if (isBlockStairs(oppositeOffsetState) && state.getValue(StairsBlock.HALF) == oppositeOffsetState.getValue(StairsBlock.HALF)) { - Direction oppositeOffsetFacing = oppositeOffsetState.getValue(FACING); - - if (oppositeOffsetFacing.getAxis() != (state.getValue(FACING)).getAxis() && isDifferentStairs(state, world, pos, oppositeOffsetFacing)) { - if (oppositeOffsetFacing == facing.rotateYCCW()) { - return StairsBlock.EnumShape.INNER_LEFT; - } - - return StairsBlock.EnumShape.INNER_RIGHT; - } - } - - return StairsBlock.EnumShape.STRAIGHT; - } - - private static boolean isDifferentStairs(BlockState state, IBlockAccess world, BlockPos pos, Direction facing) { - BlockState offsetState = world.getBlockState(pos.offset(facing)); - return !isBlockStairs(offsetState) || offsetState.getValue(FACING) != state.getValue(FACING) || offsetState.getValue(StairsBlock.HALF) != state.getValue(StairsBlock.HALF); - } - - public static boolean isBlockStairs(BlockState state) { - return state.getBlock() instanceof StairsBlock || state.getBlock() instanceof BlockEnumStairs; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java deleted file mode 100644 index 60b2523c..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnumWall.java +++ /dev/null @@ -1,122 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.FenceGateBlock; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyBool; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class BlockEnumWall & IStringSerializable> extends BlockEnum { - public static final PropertyBool UP = PropertyBool.create("up"); - public static final PropertyBool NORTH = PropertyBool.create("north"); - public static final PropertyBool EAST = PropertyBool.create("east"); - public static final PropertyBool SOUTH = PropertyBool.create("south"); - public static final PropertyBool WEST = PropertyBool.create("west"); - protected static final AxisAlignedBB[] AABB_BY_INDEX = new AxisAlignedBB[]{new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 0.75D, 1.0D, 1.0D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.3125D, 0.0D, 0.0D, 0.6875D, 0.875D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.75D, 1.0D, 1.0D), - new AxisAlignedBB(0.25D, 0.0D, 0.25D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.25D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.3125D, 1.0D, 0.875D, 0.6875D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D)}; - protected static final AxisAlignedBB[] CLIP_AABB_BY_INDEX = new AxisAlignedBB[]{AABB_BY_INDEX[0].setMaxY(1.5D), AABB_BY_INDEX[1].setMaxY(1.5D), AABB_BY_INDEX[2].setMaxY(1.5D), AABB_BY_INDEX[3].setMaxY(1.5D), AABB_BY_INDEX[4].setMaxY(1.5D), AABB_BY_INDEX[5].setMaxY(1.5D), AABB_BY_INDEX[6].setMaxY(1.5D), AABB_BY_INDEX[7].setMaxY(1.5D), AABB_BY_INDEX[8].setMaxY(1.5D), AABB_BY_INDEX[9].setMaxY(1.5D), AABB_BY_INDEX[10].setMaxY(1.5D), AABB_BY_INDEX[11].setMaxY(1.5D), AABB_BY_INDEX[12].setMaxY(1.5D), AABB_BY_INDEX[13].setMaxY(1.5D), AABB_BY_INDEX[14].setMaxY(1.5D), - AABB_BY_INDEX[15].setMaxY(1.5D)}; - - // Most of this is copied from BlockWall - if there is an issue when porting, look there first. - public BlockEnumWall(Material material, Class enumClass, String propName) { - super(material, enumClass, propName); - } - - public BlockEnumWall(Material material, Class enumClass) { - this(material, enumClass, "type"); - } - - @Override - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(getProperty(), UP, NORTH, EAST, SOUTH, WEST).build(); - } - - @Override - public AxisAlignedBB getBoundingBox(BlockState state, IBlockAccess source, BlockPos pos) { - state = state.getActualState(source, pos); - return AABB_BY_INDEX[getAABBIndex(state)]; - } - - @Override - public AxisAlignedBB getCollisionBoundingBox(BlockState blockState, IBlockAccess worldIn, BlockPos pos) { - blockState = blockState.getActualState(worldIn, pos); - return CLIP_AABB_BY_INDEX[getAABBIndex(blockState)]; - } - - public boolean isFullCube(BlockState state) { - return false; - } - - public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { - return false; - } - - @Override - public boolean isOpaqueCube(BlockState state) { - return false; - } - - private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos) { - BlockState worldState = worldIn.getBlockState(pos); - Block block = worldState.getBlock(); - return block != Blocks.BARRIER && (!(block != this && !(block instanceof FenceGateBlock)) || ((worldState.getMaterial().isOpaque() && worldState.isFullCube()) && worldState.getMaterial() != Material.GOURD)); - } - - @SideOnly(Side.CLIENT) - @Override - public boolean shouldSideBeRendered(BlockState blockState, IBlockAccess blockAccess, BlockPos pos, Direction side) { - return side != Direction.DOWN || super.shouldSideBeRendered(blockState, blockAccess, pos, side); - } - - @Override - public BlockState getActualState(BlockState state, IBlockAccess worldIn, BlockPos pos) { - boolean canNorth = this.canConnectTo(worldIn, pos.north()); - boolean canEast = this.canConnectTo(worldIn, pos.east()); - boolean canSouth = this.canConnectTo(worldIn, pos.south()); - boolean canWest = this.canConnectTo(worldIn, pos.west()); - boolean flag4 = canNorth && !canEast && canSouth && !canWest || !canNorth && canEast && !canSouth && canWest; - return state.withProperty(UP, !flag4 || !worldIn.isAirBlock(pos.up())).withProperty(NORTH, canNorth).withProperty(EAST, canEast).withProperty(SOUTH, canSouth).withProperty(WEST, canWest); - } - - @Override - protected ItemStack getSilkTouchDrop(BlockState state) { - return new ItemStack(this, 1, damageDropped(state)); - } - - @Override - public int damageDropped(BlockState state) { - return super.getMetaFromState(state); - } - - private static int getAABBIndex(BlockState state) { - int i = 0; - - if (state.getValue(NORTH)) { - i |= 1 << Direction.NORTH.getHorizontalIndex(); - } - - if (state.getValue(EAST)) { - i |= 1 << Direction.EAST.getHorizontalIndex(); - } - - if (state.getValue(SOUTH)) { - i |= 1 << Direction.SOUTH.getHorizontalIndex(); - } - - if (state.getValue(WEST)) { - i |= 1 << Direction.WEST.getHorizontalIndex(); - } - - return i; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java deleted file mode 100644 index 0427e11a..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/base/BlockInteger.java +++ /dev/null @@ -1,81 +0,0 @@ -package WayofTime.bloodmagic.block.base; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.block.properties.PropertyInteger; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -/** - * Creates a block that has multiple meta-based states. - *

- * These states will be numbered 0 through {@code maxMeta}. - */ -public class BlockInteger extends Block { - private final int maxMeta; - private final PropertyInteger property; - private final BlockStateContainer realStateContainer; - - public BlockInteger(Material material, int maxMeta, String propName) { - super(material); - - this.maxMeta = maxMeta; - this.property = PropertyInteger.create(propName, 0, maxMeta); - this.realStateContainer = createStateContainer(); - setDefaultState(getBlockState().getBaseState()); - } - - public BlockInteger(Material material, int maxMeta) { - this(material, maxMeta, "meta"); - } - - @Override - protected final BlockStateContainer createBlockState() { - return new BlockStateContainer.Builder(this).build(); // Blank to avoid crashes - } - - @Override - public final BlockStateContainer getBlockState() { - return realStateContainer; - } - - @Override - public BlockState getStateFromMeta(int meta) { - return getDefaultState().withProperty(property, meta); - } - - @Override - public int getMetaFromState(BlockState state) { - return state.getValue(property); - } - - @Override - public int damageDropped(BlockState state) { - return getMetaFromState(state); - } - - @Override - public void getSubBlocks(ItemGroup tab, NonNullList subBlocks) { - for (int i = 0; i < maxMeta; i++) - subBlocks.add(new ItemStack(this, 1, i)); - } - - protected BlockStateContainer createStateContainer() { - return new BlockStateContainer.Builder(this).add(property).build(); - } - - public int getMaxMeta() { - return maxMeta; - } - - public PropertyInteger getProperty() { - return property; - } - - public BlockStateContainer getRealStateContainer() { - return realStateContainer; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java b/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java index 702fe5d9..2c7f6d8d 100644 --- a/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java +++ b/src/main/java/WayofTime/bloodmagic/block/enums/BloodRuneType.java @@ -1,29 +1,28 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; +package wayoftime.bloodmagic.block.enums; import java.util.Locale; -public enum BloodRuneType implements IStringSerializable { - BLANK, - SPEED, - EFFICIENCY, - SACRIFICE, - SELF_SACRIFICE, - DISPLACEMENT, - CAPACITY, - AUGMENTED_CAPACITY, - ORB, - ACCELERATION, - CHARGING; +import net.minecraft.util.IStringSerializable; - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } +public enum BloodRuneType implements IStringSerializable +{ + BLANK, SPEED, EFFICIENCY, SACRIFICE, SELF_SACRIFICE, DISPLACEMENT, CAPACITY, AUGMENTED_CAPACITY, ORB, ACCELERATION, + CHARGING; - @Override - public String getName() { - return this.toString(); - } -} + @Override + public String toString() + { + return name().toLowerCase(Locale.ENGLISH); + } + + /** + * getName() + * + * @return + */ + @Override + public String getString() + { + return this.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java deleted file mode 100644 index 7bceae13..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDecorative.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumDecorative implements IStringSerializable { - BLOODSTONE_TILE, - BLOODSTONE_BRICK, - CRYSTAL_TILE, - CRYSTAL_BRICK; - - @Override - public String toString() { - return name().toLowerCase(Locale.ROOT); - } - - @Override - public String getName() { - return toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java deleted file mode 100644 index 84b42602..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock1.java +++ /dev/null @@ -1,23 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumDemonBlock1 implements IStringSerializable { - BRICK1_RAW, - BRICK1_CORROSIVE, - BRICK1_DESTRUCTIVE, - BRICK1_VENGEFUL, - BRICK1_STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java deleted file mode 100644 index b9a35aab..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock2.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumDemonBlock2 implements IStringSerializable { - SMALLBRICK_RAW, - SMALLBRICK_CORROSIVE, - SMALLBRICK_DESTRUCTIVE, - SMALLBRICK_VENGEFUL, - SMALLBRICK_STEADFAST, - TILE_RAW, - TILE_CORROSIVE, - TILE_DESTRUCTIVE, - TILE_VENGEFUL, - TILE_STEADFAST, - TILESPECIAL_RAW, - TILESPECIAL_CORROSIVE, - TILESPECIAL_DESTRUCTIVE, - TILESPECIAL_VENGEFUL, - TILESPECIAL_STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java deleted file mode 100644 index c7a54ac6..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumDemonBlock3.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumDemonBlock3 implements IStringSerializable { - STONE_RAW, - STONE_CORROSIVE, - STONE_DESTRUCTIVE, - STONE_VENGEFUL, - STONE_STEADFAST, - POLISHED_RAW, - POLISHED_CORROSIVE, - POLISHED_DESTRUCTIVE, - POLISHED_VENGEFUL, - POLISHED_STEADFAST, - METAL_RAW, - METAL_CORROSIVE, - METAL_DESTRUCTIVE, - METAL_VENGEFUL, - METAL_STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java deleted file mode 100644 index b760a46b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumInversionCap.java +++ /dev/null @@ -1,28 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumInversionCap implements IStringSerializable { - RAW_BOTTOM, - RAW_TOP, - CORROSIVE_BOTTOM, - CORROSIVE_TOP, - DESTRUCTIVE_BOTTOM, - DESTRUCTIVE_TOP, - VENGEFUL_BOTTOM, - VENGEFUL_TOP, - STEADFAST_BOTTOM, - STEADFAST_TOP; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java deleted file mode 100644 index 18e2053e..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumMimic.java +++ /dev/null @@ -1,23 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumMimic implements IStringSerializable { - NOHITBOX, - SOLIDOPAQUE, - SOLIDCLEAR, - SOLIDLIGHT, - SENTIENT; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java deleted file mode 100644 index 79c768bb..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumPath.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumPath implements IStringSerializable { - WOOD, - WOODTILE, - STONE, - STONETILE, - WORNSTONE, - WORNSTONETILE, - OBSIDIAN, - OBSIDIANTILE; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java deleted file mode 100644 index bfc67190..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumRitualController.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumRitualController implements IStringSerializable { - MASTER, - IMPERFECT, - INVERTED, - ; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java deleted file mode 100644 index 01c05b88..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumSubWillType implements IStringSerializable { - RAW, - CORROSIVE, - DESTRUCTIVE, - VENGEFUL, - STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } - - public EnumDemonWillType getType() { - String name = name(); - - if (this == RAW) - name = EnumDemonWillType.DEFAULT.name(); - - return EnumDemonWillType.valueOf(name); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java deleted file mode 100644 index 4f51f8e8..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType1.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumSubWillType1 implements IStringSerializable { - RAW, - CORROSIVE; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java deleted file mode 100644 index 5f1a6aca..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType2.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumSubWillType2 implements IStringSerializable { - DESTRUCTIVE, - VENGEFUL; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java deleted file mode 100644 index 963704e8..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumSubWillType3.java +++ /dev/null @@ -1,19 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumSubWillType3 implements IStringSerializable { - STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java b/src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java deleted file mode 100644 index 172c6d2b..00000000 --- a/src/main/java/WayofTime/bloodmagic/block/enums/EnumWillWall.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.block.enums; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumWillWall implements IStringSerializable { - BRICK_RAW, - BRICK_CORROSIVE, - BRICK_DESTRUCTIVE, - BRICK_VENGEFUL, - BRICK_STEADFAST, - SMALLBRICK_RAW, - SMALLBRICK_CORROSIVE, - SMALLBRICK_DESTRUCTIVE, - SMALLBRICK_VENGEFUL, - SMALLBRICK_STEADFAST, - LARGE_RAW, - LARGE_CORROSIVE, - LARGE_DESTRUCTIVE, - LARGE_VENGEFUL, - LARGE_STEADFAST; - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java deleted file mode 100644 index fb8ec3c2..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.client; - -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.function.Consumer; - -/** - * Provides a custom {@link ItemMeshDefinition} for automatic registration of - * renders. - */ -public interface IMeshProvider { - /** - * Gets the custom ItemMeshDefinition to use for the item. - * - * @return - the custom ItemMeshDefinition to use for the item. - */ - @SideOnly(Side.CLIENT) - ItemMeshDefinition getMeshDefinition(); - - /** - * Gathers all possible variants for this item - */ - void gatherVariants(Consumer variants); - - /** - * If a custom ResourceLocation is required, return it here. - *

- * Can be null if unneeded. - * - * @return - The custom ResourceLocation - */ - @Nullable - default ResourceLocation getCustomLocation() { - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java deleted file mode 100644 index cffbd900..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client; - -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; - -import javax.annotation.Nonnull; - -public interface IVariantProvider { - - default void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, this instanceof Block ? "normal" : "inventory"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/Sprite.java b/src/main/java/WayofTime/bloodmagic/client/Sprite.java deleted file mode 100644 index f6e54ea6..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/Sprite.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.client; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.ResourceLocation; - -public class Sprite { - - private final ResourceLocation textureLocation; - private final int textureX; - private final int textureY; - private final int textureWidth; - private final int textureHeight; - - public Sprite(ResourceLocation textureLocation, int textureX, int textureY, int textureWidth, int textureHeight) { - this.textureLocation = textureLocation; - this.textureX = textureX; - this.textureY = textureY; - this.textureWidth = textureWidth; - this.textureHeight = textureHeight; - } - - public ResourceLocation getTextureLocation() { - return textureLocation; - } - - public int getTextureX() { - return textureX; - } - - public int getTextureY() { - return textureY; - } - - public int getTextureWidth() { - return textureWidth; - } - - public int getTextureHeight() { - return textureHeight; - } - - public void draw(int x, int y) { - Minecraft.getInstance().renderEngine.bindTexture(textureLocation); - float f = 0.00390625F; - float f1 = 0.00390625F; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(7, DefaultVertexFormats.POSITION_TEX); - buffer.pos((double) x, (double) (y + getTextureHeight()), 1.0F).tex((double) ((float) (getTextureX()) * f), (double) ((float) (getTextureY() + getTextureHeight()) * f1)).endVertex(); - buffer.pos((double) (x + getTextureWidth()), (double) (y + getTextureHeight()), 1.0F).tex((double) ((float) (getTextureX() + getTextureWidth()) * f), (double) ((float) (getTextureY() + getTextureHeight()) * f1)).endVertex(); - buffer.pos((double) (x + getTextureWidth()), (double) (y), 1.0F).tex((double) ((float) (getTextureX() + getTextureWidth()) * f), (double) ((float) (getTextureY()) * f1)).endVertex(); - buffer.pos((double) x, (double) (y), 1.0F).tex((double) ((float) (getTextureX()) * f), (double) ((float) (getTextureY()) * f1)).endVertex(); - tessellator.draw(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java deleted file mode 100644 index 3a203214..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiAlchemyTable.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.container.ContainerAlchemyTable; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GuiAlchemyTable extends ContainerScreen { - public IInventory tileTable; - - public GuiAlchemyTable(PlayerInventory playerInventory, IInventory tileTable) { - super(new ContainerAlchemyTable(playerInventory, tileTable)); - this.tileTable = tileTable; - this.xSize = 176; - this.ySize = 205; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.alchemyTable.name"), 8, 5, 4210752); - this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(BloodMagic.MODID + ":textures/gui/alchemyTable.png"); - this.mc.getTextureManager().bindTexture(soulForgeGuiTextures); - int i = (this.width - this.xSize) / 2; - int j = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize); - - int l = this.getCookProgressScaled(90); - this.drawTexturedModalRect(i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); - - for (int slotId = 0; slotId < 6; slotId++) { - if (!((TileAlchemyTable) tileTable).isInputSlotAccessible(slotId)) { - Slot slot = this.inventorySlots.getSlot(slotId); - - this.drawTexturedModalRect(i + slot.xPos, j + slot.yPos, 195, 1, 16, 16); - } - } - } - - public int getCookProgressScaled(int scale) { - double progress = ((TileAlchemyTable) tileTable).getProgressForGui(); - return (int) (progress * scale); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java deleted file mode 100644 index a14c5710..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiBloodMagicConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.client.hud.ConfigEntryEditHUD; -import com.google.common.collect.Lists; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.fml.client.IModGuiFactory; -import net.minecraftforge.fml.client.config.DummyConfigElement; -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.IConfigElement; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -public class GuiBloodMagicConfig extends GuiConfig { - - public GuiBloodMagicConfig(Screen parentScreen) { - super(parentScreen, getElements(), BloodMagic.MODID, false, false, BloodMagic.NAME); - } - - public static List getElements() { - List elements = Lists.newArrayList(); - - elements.addAll(ConfigElement.from(ConfigHandler.class).getChildElements()); - elements.add(new ConfigElement(BloodMagic.RITUAL_MANAGER.getConfig().getCategory("rituals"))); - if (Minecraft.getInstance().world != null) - elements.add(new DummyElementEditHUD(BloodMagic.NAME, "config." + BloodMagic.MODID + ".edit_hud")); - - return elements; - } - - public static class DummyElementEditHUD extends DummyConfigElement.DummyCategoryElement { - - public DummyElementEditHUD(String name, String langKey) { - super(name, langKey, Collections.emptyList(), ConfigEntryEditHUD.class); - } - } - - public static class Factory implements IModGuiFactory { - @Override - public void initialize(Minecraft minecraftInstance) { - - } - - @Override - public boolean hasConfigGui() { - return true; - } - - @Override - public Screen createConfigGui(Screen parentScreen) { - return new GuiBloodMagicConfig(parentScreen); - } - - @Override - public Set runtimeGuiCategories() { - return null; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java deleted file mode 100644 index a942839d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.item.inventory.ContainerHolding; -import WayofTime.bloodmagic.item.inventory.InventoryHolding; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.tile.container.*; -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.network.IGuiHandler; - -public class GuiHandler implements IGuiHandler { - @Override - public Object getServerGuiElement(int id, PlayerEntity player, World world, int x, int y, int z) { - BlockPos pos = new BlockPos(x, y, z); - - switch (id) { - case Constants.Gui.TELEPOSER_GUI: - return new ContainerTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos)); - case Constants.Gui.SOUL_FORGE_GUI: - return new ContainerSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos)); - case Constants.Gui.ROUTING_NODE_GUI: - return new ContainerItemRoutingNode(player.inventory, (TileFilteredRoutingNode) world.getTileEntity(pos)); - case Constants.Gui.MASTER_ROUTING_NODE_GUI: - return new ContainerMasterRoutingNode(player.inventory, (TileMasterRoutingNode) world.getTileEntity(pos)); - case Constants.Gui.ALCHEMY_TABLE_GUI: - return new ContainerAlchemyTable(player.inventory, (TileAlchemyTable) world.getTileEntity(pos)); - case Constants.Gui.SIGIL_HOLDING_GUI: - return new ContainerHolding(player, new InventoryHolding(player.getHeldItemMainhand())); - } - - return null; - } - - @Override - public Object getClientGuiElement(int id, PlayerEntity player, World world, int x, int y, int z) { - if (world instanceof ClientWorld) { - BlockPos pos = new BlockPos(x, y, z); - - switch (id) { - case Constants.Gui.TELEPOSER_GUI: - return new GuiTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos)); - case Constants.Gui.SOUL_FORGE_GUI: - return new GuiSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos)); - case Constants.Gui.ROUTING_NODE_GUI: - return new GuiItemRoutingNode(player.inventory, (TileFilteredRoutingNode) world.getTileEntity(pos)); - case Constants.Gui.MASTER_ROUTING_NODE_GUI: - return new GuiMasterRoutingNode(player.inventory, (TileMasterRoutingNode) world.getTileEntity(pos)); - case Constants.Gui.ALCHEMY_TABLE_GUI: - return new GuiAlchemyTable(player.inventory, (TileAlchemyTable) world.getTileEntity(pos)); - case Constants.Gui.SIGIL_HOLDING_GUI: - return new GuiHolding(player, new InventoryHolding(player.getHeldItemMainhand())); - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java deleted file mode 100644 index d20cb33e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHolding.java +++ /dev/null @@ -1,57 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.inventory.ContainerHolding; -import WayofTime.bloodmagic.item.inventory.InventoryHolding; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GuiHolding extends ContainerScreen { - private ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "gui/SigilHolding.png"); - private PlayerEntity player; - - public GuiHolding(PlayerEntity player, InventoryHolding inventoryHolding) { - super(new ContainerHolding(player, inventoryHolding)); - xSize = 176; - ySize = 121; - this.player = player; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - //the parameters for drawString are: string, x, y, color - fontRenderer.drawString(TextHelper.localize("item.bloodmagic.sigil.holding.name"), 53, 4, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouse) { - //draw your Gui here, only thing you need to change is the path - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(texture); - int x = (width - xSize) / 2; - int y = (height - ySize) / 2; - this.drawTexturedModalRect(x, y, 0, 0, xSize, ySize); - ItemStack held = player.getHeldItem(Hand.MAIN_HAND); - if (!held.isEmpty() && held.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.drawTexturedModalRect(4 + x + 36 * ItemSigilHolding.getCurrentItemOrdinal(player.getHeldItemMainhand()), y + 13, 0, 123, 24, 24); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java deleted file mode 100644 index edf65f6a..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java +++ /dev/null @@ -1,200 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.ItemRouterAmountPacketProcessor; -import WayofTime.bloodmagic.network.ItemRouterButtonPacketProcessor; -import WayofTime.bloodmagic.tile.container.ContainerItemRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.util.GhostItemHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.io.IOException; - -@SideOnly(Side.CLIENT) -public class GuiItemRoutingNode extends ContainerScreen { - private TextFieldWidget textBox; - - private TileFilteredRoutingNode inventory; - private ContainerItemRoutingNode container; - - private int left, top; - - public GuiItemRoutingNode(PlayerInventory playerInventory, IInventory tileRoutingNode) { - super(new ContainerItemRoutingNode(playerInventory, tileRoutingNode)); - this.xSize = 201; - this.ySize = 169; - inventory = (TileFilteredRoutingNode) tileRoutingNode; - container = (ContainerItemRoutingNode) this.inventorySlots; - } - - private int getCurrentActiveSlotPriority() { - Direction direction = Direction.byIndex(inventory.currentActiveSlot); - if (direction != null) { - return inventory.getPriority(direction); - } - - return 0; - } - - @Override - public void initGui() { - super.initGui(); - left = (this.width - this.xSize) / 2; - top = (this.height - this.ySize) / 2; - - this.buttonList.clear(); - this.buttonList.add(new Button(0, left + 176, top + 14, 18, 18, "D")); - this.buttonList.add(new Button(1, left + 176, top + 32, 18, 18, "U")); - this.buttonList.add(new Button(2, left + 176, top + 50, 18, 18, "N")); - this.buttonList.add(new Button(3, left + 176, top + 68, 18, 18, "S")); - this.buttonList.add(new Button(4, left + 176, top + 86, 18, 18, "W")); - this.buttonList.add(new Button(5, left + 176, top + 104, 18, 18, "E")); - this.buttonList.add(new Button(6, left + 160, top + 50, 10, 18, ">")); - this.buttonList.add(new Button(7, left + 132, top + 50, 10, 18, "<")); - disableDirectionalButton(inventory.currentActiveSlot); - - this.textBox = new TextFieldWidget(0, this.fontRenderer, left + 94, top + 37, 70, 12); - this.textBox.setEnableBackgroundDrawing(false); - this.textBox.setText(""); - } - - @Override - protected void keyTyped(char typedChar, int keyCode) throws IOException { - if (this.textBox.textboxKeyTyped(typedChar, keyCode)) { - if (container.lastGhostSlotClicked != -1) { -// this.renameItem(); - String str = this.textBox.getText(); - int amount = 0; - - if (!str.isEmpty()) { - try { - Integer testVal = Integer.decode(str); - if (testVal != null) { - amount = testVal; - } - } catch (NumberFormatException d) { - } - } - -// inventory.setGhostItemAmount(container.lastGhostSlotClicked, amount); - setValueOfGhostItemInSlot(container.lastGhostSlotClicked, amount); - } - } else { - super.keyTyped(typedChar, keyCode); - } - } - - private void setValueOfGhostItemInSlot(int ghostItemSlot, int amount) { - BloodMagicPacketHandler.INSTANCE.sendToServer(new ItemRouterAmountPacketProcessor(ghostItemSlot, amount, inventory.getPos(), inventory.getWorld())); - } - - /** - * Called when the mouse is clicked. Args : mouseX, mouseY, clickedButton - */ - @Override - protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { - super.mouseClicked(mouseX, mouseY, mouseButton); - this.textBox.mouseClicked(mouseX, mouseY, mouseButton); - if (container.lastGhostSlotClicked != -1) { - Slot slot = container.getSlot(container.lastGhostSlotClicked + 1); - ItemStack stack = slot.getStack(); - if (!stack.isEmpty()) { - int amount = GhostItemHelper.getItemGhostAmount(stack); - this.textBox.setText("" + amount); - } else { - this.textBox.setText(""); - } - } - } - - /** - * Draws the screen and all the components in it. - */ - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - - Minecraft.getInstance().fontRenderer.drawString(inventory.getName(), xSize, ySize / 4, 4210752); - } - - /** - * Called by the controls from the buttonList when activated. (Mouse pressed - * for buttons) - */ - @Override - protected void actionPerformed(Button button) throws IOException { - if (button.enabled) { - BloodMagicPacketHandler.INSTANCE.sendToServer(new ItemRouterButtonPacketProcessor(button.id, inventory.getPos(), inventory.getWorld())); - if (button.id < 6) { - inventory.currentActiveSlot = button.id; - enableAllDirectionalButtons(); - button.enabled = false; - } - } - } - - private void enableAllDirectionalButtons() { - for (Button button : this.buttonList) { - button.enabled = true; - } - } - - private void disableDirectionalButton(int id) { - this.buttonList.get(id).enabled = false; - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRenderer.drawString("" + getCurrentActiveSlotPriority(), 143 + 5, 51 + 4, 0xFFFFFF); - String s = ""; - if (container.lastGhostSlotClicked != -1) { - ItemStack clickedStack = inventorySlots.getSlot(1 + container.lastGhostSlotClicked).getStack(); - if (!clickedStack.isEmpty()) { - s = clickedStack.getDisplayName(); - } - } - - this.fontRenderer.drawStringWithShadow(s.substring(0, Math.min(16, s.length())), 81, 19, 0xFFFFFF); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(BloodMagic.MODID + ":textures/gui/routingNode.png"); - this.mc.getTextureManager().bindTexture(soulForgeGuiTextures); - this.drawTexturedModalRect(left, top, 0, 0, this.xSize, this.ySize); - GlStateManager.disableLighting(); - GlStateManager.disableBlend(); - this.textBox.drawTextBox(); - } - -// @Override -// public void sendSlotContents(Container containerToSend, int slotInd, ItemStack stack) -// { -// if (slotInd == 0) -// { -// this.nameField.setText(stack == null ? "" : stack.getOwnerName()); -// this.nameField.setEnabled(stack != null); -// -// if (stack != null) -// { -// this.renameItem(); -// } -// } -// } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java deleted file mode 100644 index f8693ba3..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiMasterRoutingNode.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.container.ContainerMasterRoutingNode; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GuiMasterRoutingNode extends ContainerScreen { - - public GuiMasterRoutingNode(PlayerInventory playerInventory, IInventory tileRoutingNode) { - super(new ContainerMasterRoutingNode(playerInventory, tileRoutingNode)); - this.xSize = 216; - this.ySize = 216; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { -// this.fontRendererObj.drawString(TextHelper.localize("tile.bloodmagic.soulForge.name"), 8, 5, 4210752); -// this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(BloodMagic.MODID + ":textures/gui/masterRoutingNode.png"); - this.mc.getTextureManager().bindTexture(soulForgeGuiTextures); - int i = (this.width - this.xSize) / 2; - int j = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java deleted file mode 100644 index 3e890f88..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java +++ /dev/null @@ -1,56 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.TileSoulForge; -import WayofTime.bloodmagic.tile.container.ContainerSoulForge; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GuiSoulForge extends ContainerScreen { - public IInventory tileSoulForge; - - public GuiSoulForge(PlayerInventory playerInventory, IInventory tileSoulForge) { - super(new ContainerSoulForge(playerInventory, tileSoulForge)); - this.tileSoulForge = tileSoulForge; - this.xSize = 176; - this.ySize = 205; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.soulForge.name"), 8, 5, 4210752); - this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation soulForgeGuiTextures = new ResourceLocation(BloodMagic.MODID + ":textures/gui/soulForge.png"); - this.mc.getTextureManager().bindTexture(soulForgeGuiTextures); - int i = (this.width - this.xSize) / 2; - int j = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize); - - int l = this.getCookProgressScaled(90); - this.drawTexturedModalRect(i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); - } - - public int getCookProgressScaled(int scale) { - double progress = ((TileSoulForge) tileSoulForge).getProgressForGui(); - return (int) (progress * scale); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java deleted file mode 100644 index be9cde2e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiTeleposer.java +++ /dev/null @@ -1,42 +0,0 @@ -package WayofTime.bloodmagic.client.gui; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.tile.container.ContainerTeleposer; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.IInventory; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class GuiTeleposer extends ContainerScreen { - public GuiTeleposer(PlayerInventory playerInventory, IInventory tileTeleposer) { - super(new ContainerTeleposer(playerInventory, tileTeleposer)); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - this.drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); - } - - @Override - protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { - this.fontRenderer.drawString(TextHelper.localize("tile.bloodmagic.teleposer.name"), 64, 23, 4210752); - this.fontRenderer.drawString(TextHelper.localize("container.inventory"), 8, 47, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - ResourceLocation teleposerGuiTextures = new ResourceLocation(BloodMagic.MODID + ":textures/gui/teleposer.png"); - this.mc.getTextureManager().bindTexture(teleposerGuiTextures); - int i = (this.width - this.xSize) / 2; - int j = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(i, j + 18, 0, 0, this.xSize, this.ySize); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java deleted file mode 100644 index 950af569..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java +++ /dev/null @@ -1,182 +0,0 @@ -package WayofTime.bloodmagic.client.helper; - -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraftforge.fml.common.FMLLog; -import org.apache.logging.log4j.Level; -import org.lwjgl.opengl.ARBFragmentShader; -import org.lwjgl.opengl.ARBShaderObjects; -import org.lwjgl.opengl.ARBVertexShader; -import org.lwjgl.opengl.GL11; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; - -/** - * This class was created by . It's distributed as - * part of the Botania Mod. Get the Source Code in github: - * https://github.com/Vazkii/Botania - *

- * Botania is Open Source and distributed under the - * Botania License: http://botaniamod.net/license.php - *

- * File Created @ [Apr 9, 2014, 11:20:26 PM (GMT)] - */ -public final class ShaderHelper { - private static final int VERT_ST = ARBVertexShader.GL_VERTEX_SHADER_ARB; - private static final int FRAG_ST = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB; - - private static final int VERT = 1; - private static final int FRAG = 2; - - private static final String VERT_EXTENSION = ".vsh"; - private static final String FRAG_EXTENSION = ".frag"; - - public static int psiBar; - - public static void init() { - if (!useShaders()) - return; - - psiBar = createProgram("/assets/bloodmagic/shaders/beam", FRAG); - } - - public static void useShader(int shader, int ticks) { - if (!useShaders()) - return; - - ARBShaderObjects.glUseProgramObjectARB(shader); - - if (shader != 0) { - int time = ARBShaderObjects.glGetUniformLocationARB(shader, "time"); - ARBShaderObjects.glUniform1iARB(time, ticks); - } - } - - public static void releaseShader() { - useShader(0, 0); - } - - public static boolean useShaders() { - return OpenGlHelper.shadersSupported; - } - - private static int createProgram(String s, int sides) { - boolean vert = (sides & VERT) != 0; - boolean frag = (sides & FRAG) != 0; - - return createProgram(vert ? (s + VERT_EXTENSION) : null, frag ? (s + FRAG_EXTENSION) : null); - } - - // Most of the code taken from the LWJGL wiki - // http://lwjgl.org/wiki/index.php?title=GLSL_Shaders_with_LWJGL - - private static int createProgram(String vert, String frag) { - int vertId = 0, fragId = 0, program = 0; - if (vert != null) - vertId = createShader(vert, VERT_ST); - if (frag != null) - fragId = createShader(frag, FRAG_ST); - - program = ARBShaderObjects.glCreateProgramObjectARB(); - if (program == 0) - return 0; - - if (vert != null) - ARBShaderObjects.glAttachObjectARB(program, vertId); - if (frag != null) - ARBShaderObjects.glAttachObjectARB(program, fragId); - - ARBShaderObjects.glLinkProgramARB(program); - if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_LINK_STATUS_ARB) == GL11.GL_FALSE) { - FMLLog.log(Level.ERROR, getLogInfo(program)); - return 0; - } - - ARBShaderObjects.glValidateProgramARB(program); - if (ARBShaderObjects.glGetObjectParameteriARB(program, ARBShaderObjects.GL_OBJECT_VALIDATE_STATUS_ARB) == GL11.GL_FALSE) { - FMLLog.log(Level.ERROR, getLogInfo(program)); - return 0; - } - - return program; - } - - private static int createShader(String filename, int shaderType) { - int shader = 0; - try { - shader = ARBShaderObjects.glCreateShaderObjectARB(shaderType); - - if (shader == 0) - return 0; - - ARBShaderObjects.glShaderSourceARB(shader, readFileAsString(filename)); - ARBShaderObjects.glCompileShaderARB(shader); - - if (ARBShaderObjects.glGetObjectParameteriARB(shader, ARBShaderObjects.GL_OBJECT_COMPILE_STATUS_ARB) == GL11.GL_FALSE) - throw new RuntimeException("Error creating shader: " + getLogInfo(shader)); - - return shader; - } catch (Exception e) { - ARBShaderObjects.glDeleteObjectARB(shader); - e.printStackTrace(); - return -1; - } - } - - private static String getLogInfo(int obj) { - return ARBShaderObjects.glGetInfoLogARB(obj, ARBShaderObjects.glGetObjectParameteriARB(obj, ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); - } - - private static String readFileAsString(String filename) throws Exception { - StringBuilder source = new StringBuilder(); - InputStream in = ShaderHelper.class.getResourceAsStream(filename); - Exception exception = null; - BufferedReader reader; - - if (in == null) - return ""; - - try { - reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); - - Exception innerExc = null; - try { - String line; - while ((line = reader.readLine()) != null) - source.append(line).append('\n'); - } catch (Exception exc) { - exception = exc; - } finally { - try { - reader.close(); - } catch (Exception exc) { - if (innerExc == null) - innerExc = exc; - else - exc.printStackTrace(); - } - } - - if (innerExc != null) - throw innerExc; - } catch (Exception exc) { - exception = exc; - } finally { - try { - in.close(); - } catch (Exception exc) { - if (exception == null) - exception = exc; - else - exc.printStackTrace(); - } - - if (exception != null) - throw exception; - } - - return source.toString(); - } - -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java deleted file mode 100644 index d713e3b6..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ConfigEntryEditHUD.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.GuiConfigEntries; -import net.minecraftforge.fml.client.config.IConfigElement; - -public class ConfigEntryEditHUD extends GuiConfigEntries.CategoryEntry { - - public ConfigEntryEditHUD(GuiConfig owningScreen, GuiConfigEntries owningEntryList, IConfigElement element) { - super(owningScreen, owningEntryList, element); - - this.childScreen = new GuiEditHUD(owningScreen); - } - - @Override - public boolean isDefault() { - return true; - } - - @Override - public void setToDefault() { - ElementRegistry.resetPos(); - } - - @Override - public boolean isChanged() { - return ((GuiEditHUD) childScreen).changes; - } - - @Override - public void undoChanges() { - - } - - @Override - public boolean saveConfigElement() { - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java b/src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java deleted file mode 100644 index 9544dcdc..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ElementInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import javax.vecmath.Vector2f; - -public class ElementInfo { - - public static final ElementInfo DUMMY = new ElementInfo(new Vector2f(0F, 0F), ElementRegistry.getRandomColor()); - - private final Vector2f defaultPosition; - private final int boxColor; - private Vector2f currentPosition; - - public ElementInfo(Vector2f defaultPosition, int boxColor) { - this.defaultPosition = defaultPosition; - this.boxColor = boxColor; - this.currentPosition = defaultPosition; - } - - public Vector2f getDefaultPosition() { - return defaultPosition; - } - - public int getBoxColor() { - return boxColor; - } - - public ElementInfo setPosition(Vector2f position) { - this.currentPosition = position; - return this; - } - - public Vector2f getPosition() { - return currentPosition; - } - - public void resetPosition() { - this.currentPosition = defaultPosition; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java b/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java deleted file mode 100644 index 642ea5e4..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/ElementRegistry.java +++ /dev/null @@ -1,149 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.hud.element.HUDElement; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; -import com.google.common.reflect.TypeToken; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.vecmath.Vector2f; -import java.awt.Color; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.function.BiFunction; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID, value = Side.CLIENT) -public class ElementRegistry { - - private static final File CONFIG = new File(Loader.instance().getConfigDir(), BloodMagic.MODID + "/hud_elements.json"); - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private static final Map HUD_ELEMENTS = Maps.newLinkedHashMap(); - private static final Map REVERSE = Maps.newHashMap(); - private static final Map ELEMENT_INFO = Maps.newHashMap(); - - public static void registerHandler(ResourceLocation key, HUDElement element, Vector2f defaultPosition) { - HUD_ELEMENTS.put(key, element); - REVERSE.put(element, key); - - - ELEMENT_INFO.put(key, new ElementInfo(defaultPosition, getRandomColor())); - } - - public static void resetPos() { - ELEMENT_INFO.values().forEach(ElementInfo::resetPosition); - } - - public static List getElements() { - return ImmutableList.copyOf(HUD_ELEMENTS.values()); - } - - public static ResourceLocation getKey(HUDElement element) { - return REVERSE.get(element); - } - - public static int getColor(ResourceLocation element) { - return ELEMENT_INFO.getOrDefault(element, ElementInfo.DUMMY).getBoxColor(); - } - - public static Vector2f getPosition(ResourceLocation element) { - return ELEMENT_INFO.get(element).getPosition(); - } - - public static void setPosition(ResourceLocation element, Vector2f point) { - ELEMENT_INFO.compute(element, (resourceLocation, elementInfo) -> { - if (elementInfo == null) - return new ElementInfo(point, getRandomColor()); - - elementInfo.setPosition(point); - return elementInfo; - }); - } - - public static void save(Map newLocations) { - newLocations.forEach((k, v) -> { - ElementInfo info = ELEMENT_INFO.get(k); - if (info != null) - info.setPosition(v); - }); - - Map toWrite = Maps.newHashMap(); - for (Map.Entry entry : ELEMENT_INFO.entrySet()) - toWrite.put(entry.getKey().toString(), entry.getValue().getPosition()); - - String json = GSON.toJson(toWrite); - try (FileWriter writer = new FileWriter(CONFIG)) { - writer.write(json); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void readConfig() { - if (!CONFIG.exists()) - return; - - try (FileReader reader = new FileReader(CONFIG)) { - Map toLoad = GSON.fromJson(reader, new TypeToken>() { - }.getType()); - for (Map.Entry entry : toLoad.entrySet()) { - ElementInfo info = ELEMENT_INFO.get(new ResourceLocation(entry.getKey())); - if (info != null) - info.setPosition(entry.getValue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public static void onRenderOverlay(RenderGameOverlayEvent.Pre event) { - if (event.getType() == RenderGameOverlayEvent.ElementType.HOTBAR) { - ScaledResolution resolution = new ScaledResolution(Minecraft.getInstance()); - - for (HUDElement element : HUD_ELEMENTS.values()) { - if (!element.shouldRender(Minecraft.getInstance())) - continue; - - Vector2f position = ELEMENT_INFO.get(getKey(element)).getPosition(); - int xPos = (int) (resolution.getScaledWidth_double() * position.x); - if (xPos - element.getWidth() < 0) - xPos *= 2; - if (xPos + element.getWidth() > resolution.getScaledWidth()) - xPos -= element.getWidth(); - - int yPos = (int) (resolution.getScaledHeight_double() * position.y); - if (yPos - element.getHeight() < 0) - yPos *= 2; - if (yPos + element.getHeight() > resolution.getScaledHeight()) - yPos -= element.getHeight(); - - element.draw(event.getResolution(), event.getPartialTicks(), xPos, yPos); - } - } - } - - public static int getRandomColor() { - Random rand = new Random(); - float r = rand.nextFloat() / 2F + 0.5F; - float g = rand.nextFloat() / 2F + 0.5F; - float b = rand.nextFloat() / 2F + 0.5F; - float a = 0.5F; - return new Color(r, g, b, a).getRGB(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java deleted file mode 100644 index cc11d92c..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java +++ /dev/null @@ -1,136 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.Sprite; -import WayofTime.bloodmagic.client.hud.element.ElementDemonAura; -import WayofTime.bloodmagic.client.hud.element.ElementDivinedInformation; -import WayofTime.bloodmagic.client.hud.element.ElementHolding; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.tile.TileIncenseAltar; -import WayofTime.bloodmagic.tile.TileInversionPillar; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.resources.I18n; -import net.minecraft.util.ResourceLocation; -import org.apache.commons.lang3.tuple.Pair; - -import javax.vecmath.Vector2f; -import java.awt.Point; -import java.util.function.Consumer; -import java.util.function.Function; - -public class Elements { - - public static void registerElements() { - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "blood_altar"), - new ElementDivinedInformation(2, true, TileAltar.class) { - @Override - public void gatherInformation(Consumer>> information) { - // Current tier - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> altar == null ? "IV" : NumeralHelper.toRoman(altar.getTier().toInt()) - )); - // Stored/Capacity - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar == null ? 0 : altar.getCurrentBlood(), altar == null ? 10000 : altar.getCapacity()) - )); - } - }, - new Vector2f(0.01F, 0.01F) - ); - - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "blood_altar_adv"), - new ElementDivinedInformation(5, false, TileAltar.class) { - @Override - public void gatherInformation(Consumer>> information) { - // Current tier - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> altar == null ? "IV" : NumeralHelper.toRoman(altar.getTier().toInt()) - )); - // Stored/Capacity - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar == null ? 0 : altar.getCurrentBlood(), altar == null ? 10000 : altar.getCapacity()) - )); - // Crafting progress/Crafting requirement - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), - altar -> { - if (altar == null || !altar.isActive()) - return I18n.format("hud.bloodmagic.inactive"); - int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); - return String.format("%d/%d", progress, totalLiquidRequired); - } - )); - // Consumption rate - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), - altar -> altar == null ? "0" : String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) - )); - // Total charge - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), - altar -> altar == null ? "0" : String.valueOf(altar.getTotalCharge()) - )); - } - }, - new Vector2f(0.01F, 0.01F) - ); - - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "incense_altar"), - new ElementDivinedInformation(2, true, TileIncenseAltar.class) { - @Override - public void gatherInformation(Consumer>> information) { - // Current tranquility - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 80, 46, 16, 16), - incense -> incense == null ? "0" : String.valueOf((int) ((100D * (int) (100 * incense.tranquility)) / 100D)) - )); - // Sacrifice bonus - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 96, 46, 16, 16), - incense -> incense == null ? "0" : String.valueOf((int) (100 * incense.incenseAddition)) - )); - } - }, - new Vector2f(0.01F, 0.01F) - ); - - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "inversion_pillar"), - new ElementDivinedInformation(1, true, TileInversionPillar.class) { - @Override - public void gatherInformation(Consumer>> information) { - // Current inversion - information.accept(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 112, 46, 16, 16), - pillar -> pillar == null ? "0" : String.valueOf(((int) (10 * pillar.getCurrentInversion())) / 10D) - )); - } - }, - new Vector2f(0.01F, 0.01F) - ); - - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "demon_will_aura"), - new ElementDemonAura(), - new Vector2f(0.01F, 0.01F) - ); - - ElementRegistry.registerHandler( - new ResourceLocation(BloodMagic.MODID, "holding"), - new ElementHolding(), - new Vector2f(0.72F, 1.0F) - ); - - ElementRegistry.readConfig(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java b/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java deleted file mode 100644 index af605d69..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/GuiEditHUD.java +++ /dev/null @@ -1,185 +0,0 @@ -package WayofTime.bloodmagic.client.hud; - -import WayofTime.bloodmagic.client.hud.element.HUDElement; -import com.google.common.collect.Maps; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.button.Button; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.resources.I18n; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.client.config.GuiButtonExt; -import org.lwjgl.input.Keyboard; - -import javax.annotation.Nullable; -import javax.vecmath.Vector2f; -import java.awt.Point; -import java.util.Map; - -public class GuiEditHUD extends Screen { - - private static final int LINE_COLOR = 0x2D2D2D; - - private final Screen parent; - private final Map currentOverrides = Maps.newHashMap(); - private HUDElement dragged; - public boolean changes; - - public GuiEditHUD(Screen parent) { - this.parent = parent; - } - - @Override - public void initGui() { - super.initGui(); - - addButton(new GuiButtonExt(0, width / 2 - 155, height - 30, 70, 20, I18n.format("gui.bloodmagic.toggle")) {{ - enabled = false; - }}); - addButton(new GuiButtonExt(1, width / 2 - 75, height - 30, 70, 20, I18n.format("gui.bloodmagic.default"))); - addButton(new GuiButtonExt(2, width / 2 + 5, height - 30, 70, 20, I18n.format("gui.bloodmagic.save"))); - addButton(new GuiButtonExt(3, width / 2 + 90, height - 30, 70, 20, I18n.format("gui.bloodmagic.cancel"))); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); - - ScaledResolution resolution = new ScaledResolution(Minecraft.getInstance()); - for (HUDElement element : ElementRegistry.getElements()) { - if (dragged == element) - continue; - - ResourceLocation key = ElementRegistry.getKey(element); - Vector2f position = currentOverrides.getOrDefault(key, ElementRegistry.getPosition(key)); - int xPos = (int) (resolution.getScaledWidth_double() * position.x); - int yPos = (int) (resolution.getScaledHeight_double() * position.y); - - drawWithBox(resolution, element, partialTicks, xPos, yPos); - } - - if (dragged != null) { - Point bounded = getBoundedDrag(resolution, mouseX, mouseY); - drawWithBox(resolution, dragged, partialTicks, bounded.x, bounded.y); - } - } - - @Override - public boolean doesGuiPauseGame() { - return true; - } - - @Override - protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { - if (dragged != null) - return; - - HUDElement element = getHoveredElement(mouseX, mouseY); - if (element == null) - return; - - if (clickedMouseButton == 0) - dragged = element; - } - - @Override - protected void mouseReleased(int mouseX, int mouseY, int state) { - if (dragged != null) { - ScaledResolution resolution = new ScaledResolution(Minecraft.getInstance()); - Point bounded = getBoundedDrag(resolution, mouseX, mouseY); - float xPos = (float) ((bounded.x) / resolution.getScaledWidth_double()); - float yPos = (float) ((bounded.y) / resolution.getScaledHeight_double()); - - currentOverrides.put(ElementRegistry.getKey(dragged), new Vector2f(xPos, yPos)); - changes = true; - dragged = null; - return; - } - - super.mouseReleased(mouseX, mouseY, state); - } - - @Override - protected void actionPerformed(Button button) { - switch (button.id) { - case 0: { - Minecraft.getInstance().displayGuiScreen(parent); - break; - } - case 1: { - currentOverrides.clear(); - ElementRegistry.resetPos(); - changes = false; - break; - } - case 2: { - ElementRegistry.save(currentOverrides); - Minecraft.getInstance().displayGuiScreen(parent); - break; - } - case 3: { - currentOverrides.clear(); - Minecraft.getInstance().displayGuiScreen(parent); - break; - } - } - } - - @Nullable - public HUDElement getHoveredElement(int mouseX, int mouseY) { - for (HUDElement element : ElementRegistry.getElements()) { - ResourceLocation key = ElementRegistry.getKey(element); - Vector2f position = currentOverrides.getOrDefault(key, ElementRegistry.getPosition(key)); - ScaledResolution resolution = new ScaledResolution(mc); - int xPos = (int) (resolution.getScaledWidth_double() * position.x); - int yPos = (int) (resolution.getScaledHeight_double() * position.y); - - if (mouseX < xPos || mouseX > xPos + element.getWidth()) - continue; - - if (mouseY < yPos || mouseY > yPos + element.getHeight()) - continue; - - return element; - } - - return null; - } - - protected Point getBoundedDrag(ScaledResolution resolution, int mouseX, int mouseY) { - int drawX = mouseX - dragged.getWidth() / 2; - if (drawX + dragged.getWidth() >= resolution.getScaledWidth()) - drawX = resolution.getScaledWidth() - dragged.getWidth(); - if (drawX < 0) - drawX = 0; - - int drawY = mouseY - dragged.getHeight() / 2; - if (drawY + dragged.getHeight() >= resolution.getScaledHeight()) - drawY = resolution.getScaledHeight() - dragged.getHeight(); - if (drawY < 0) - drawY = 0; - - return new Point(drawX, drawY); - } - - protected void drawWithBox(ScaledResolution resolution, HUDElement element, float partialTicks, int drawX, int drawY) { - int color = ElementRegistry.getColor(ElementRegistry.getKey(element)); - GlStateManager.pushMatrix(); - GlStateManager.enableAlpha(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - drawVerticalLine(drawX, drawY, drawY + element.getHeight() - 1, color); - drawVerticalLine(drawX + element.getWidth() - 1, drawY, drawY + element.getHeight() - 1, color); - drawHorizontalLine(drawX, drawX + element.getWidth() - 1, drawY, color); - drawHorizontalLine(drawX, drawX + element.getWidth() - 1, drawY + element.getHeight() - 1, color); - GlStateManager.disableBlend(); - GlStateManager.disableAlpha(); - GlStateManager.popMatrix(); - GlStateManager.color(1.0F, 1.0F, 1.0F); - GlStateManager.enableTexture2D(); - element.draw(resolution, partialTicks, drawX, drawY); - GlStateManager.disableTexture2D(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java deleted file mode 100644 index 4a75a97e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDemonAura.java +++ /dev/null @@ -1,78 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.proxy.ClientProxy; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.Utils; -import com.google.common.collect.Lists; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ResourceLocation; - -import java.util.List; - -public class ElementDemonAura extends HUDElement { - - private static final ResourceLocation BAR_LOCATION = new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png"); - - private final List orderedTypes = Lists.newArrayList( - EnumDemonWillType.DEFAULT, - EnumDemonWillType.CORROSIVE, - EnumDemonWillType.STEADFAST, - EnumDemonWillType.DESTRUCTIVE, - EnumDemonWillType.VENGEFUL - ); - - public ElementDemonAura() { - super(80, 46); - } - - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - Minecraft minecraft = Minecraft.getInstance(); - PlayerEntity player = minecraft.player; - - minecraft.getTextureManager().bindTexture(BAR_LOCATION); - GlStateManager.color(1.0F, 1.0F, 1.0F); - this.drawTexturedModalRect(drawX, drawY, 0, 210, 80, 46); - - double maxAmount = Utils.getDemonWillResolution(player); - - int i = 0; - for (EnumDemonWillType type : orderedTypes) { - i++; - GlStateManager.color(1.0F, 1.0F, 1.0F); - minecraft.getTextureManager().bindTexture(BAR_LOCATION); - int textureXOffset = (i > 3) ? (i - 3) : (3 - i); - int maxBarSize = 30 - 2 * textureXOffset; - - double amount = ClientProxy.currentAura == null ? 0 : ClientProxy.currentAura.getWill(type); - double ratio = Math.max(Math.min(amount / maxAmount, 1), 0); - - double width = maxBarSize * ratio * 2; - double height = 2; - double x = drawX + 2 * textureXOffset + 10; - double y = drawY + 4 * i + 10; - - double textureX = 2 * textureXOffset + 2 * 42; - double textureY = 4 * i + 220; - - this.drawTexturedModalRect(x, y, textureX, textureY, width, height); - - if (player.isSneaking()) { - GlStateManager.pushMatrix(); - GlStateManager.translate(x - 2 * textureXOffset + 70, (y - 1), 0); - GlStateManager.scale(0.5, 0.5, 1); - minecraft.fontRenderer.drawStringWithShadow(String.valueOf((int) amount), 0, 2, 0xffffff); - GlStateManager.popMatrix(); - } - } - } - - @Override - public boolean shouldRender(Minecraft minecraft) { - return Utils.canPlayerSeeDemonWill(Minecraft.getInstance().player); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java deleted file mode 100644 index d461e8f9..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementDivinedInformation.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Hand; - -import java.util.List; - -public abstract class ElementDivinedInformation extends ElementTileInformation { - - private final boolean simple; - - public ElementDivinedInformation(int lines, boolean simple, Class tileClass) { - super(100, lines, tileClass); - this.simple = simple; - } - - @Override - public boolean shouldRender(Minecraft minecraft) { - PlayerEntity player = Minecraft.getInstance().player; - ItemStack sigilStack = player.getHeldItem(Hand.MAIN_HAND); - boolean flag = false; - if (simple) { - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - else flag = isFlagSigilHolding(sigilStack, true); - - if (!flag) { - sigilStack = player.getHeldItem(Hand.OFF_HAND); - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION || sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - else flag = isFlagSigilHolding(sigilStack, true); - } - - } else { - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - else flag = isFlagSigilHolding(sigilStack, false); - - if (!flag) { - sigilStack = player.getHeldItem(Hand.OFF_HAND); - if (sigilStack.getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - flag = true; - else flag = isFlagSigilHolding(sigilStack, false); - } - } - return super.shouldRender(minecraft) && flag; - } - - private boolean isFlagSigilHolding(ItemStack sigilStack, boolean simple) { - if (sigilStack.getItem() instanceof ItemSigilHolding) { - List internalInv = ItemSigilHolding.getInternalInventory(sigilStack); - int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilStack); - if (internalInv != null && !internalInv.get(currentSlot).isEmpty()) { - return (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_SEER && !simple) || (internalInv.get(currentSlot).getItem() == RegistrarBloodMagicItems.SIGIL_DIVINATION && simple); - } - } - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java deleted file mode 100644 index bd8fefe2..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementHolding.java +++ /dev/null @@ -1,85 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.Sprite; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import java.util.List; - -public class ElementHolding extends HUDElement { - - private static final Sprite HOLDING_BAR = new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 0, 102, 22); - private static final Sprite SELECTED_OVERLAY = new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 22, 24, 24); - - public ElementHolding() { - super(HOLDING_BAR.getTextureWidth(), HOLDING_BAR.getTextureHeight()); - } - - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - GlStateManager.color(1.0F, 1.0F, 1.0F); - HOLDING_BAR.draw(drawX, drawY); - - Minecraft minecraft = Minecraft.getInstance(); - ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); - // Check mainhand for Sigil of Holding - if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) - sigilHolding = minecraft.player.getHeldItemOffhand(); - // Check offhand for Sigil of Holding - if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) - return; - - int currentSlot = ItemSigilHolding.getCurrentItemOrdinal(sigilHolding); - SELECTED_OVERLAY.draw(drawX - 1 + (currentSlot * 20), drawY - 1); - - RenderHelper.enableGUIStandardItemLighting(); - List inventory = ItemSigilHolding.getInternalInventory(sigilHolding); - int xOffset = 0; - for (ItemStack stack : inventory) { - renderHotbarItem(drawX + 3 + xOffset, drawY + 3, partialTicks, minecraft.player, stack); - xOffset += 20; - } - } - - @Override - public boolean shouldRender(Minecraft minecraft) { - ItemStack sigilHolding = minecraft.player.getHeldItemMainhand(); - // Check mainhand for Sigil of Holding - if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) - sigilHolding = minecraft.player.getHeldItemOffhand(); - // Check offhand for Sigil of Holding - if (!(sigilHolding.getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING)) - return false; - - return true; - } - - protected void renderHotbarItem(int x, int y, float partialTicks, PlayerEntity player, ItemStack stack) { - if (!stack.isEmpty()) { - float animation = (float) stack.getAnimationsToGo() - partialTicks; - - if (animation > 0.0F) { - GlStateManager.pushMatrix(); - float f1 = 1.0F + animation / 5.0F; - GlStateManager.translate((float) (x + 8), (float) (y + 12), 0.0F); - GlStateManager.scale(1.0F / f1, (f1 + 1.0F) / 2.0F, 1.0F); - GlStateManager.translate((float) (-(x + 8)), (float) (-(y + 12)), 0.0F); - } - - Minecraft.getInstance().getRenderItem().renderItemAndEffectIntoGUI(player, stack, x, y); - - if (animation > 0.0F) - GlStateManager.popMatrix(); - - Minecraft.getInstance().getRenderItem().renderItemOverlays(Minecraft.getInstance().fontRenderer, stack, x, y); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java deleted file mode 100644 index d7dee606..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementItemStack.java +++ /dev/null @@ -1,23 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.item.ItemStack; - -public class ElementItemStack extends HUDElement { - private ItemStack stack; - - public ElementItemStack(ItemStack stack) { - super(16, 16); - - this.stack = stack; - } - - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - RenderHelper.enableGUIStandardItemLighting(); - Minecraft.getInstance().getRenderItem().renderItemIntoGUI(stack, drawX, drawY); - RenderHelper.disableStandardItemLighting(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java deleted file mode 100644 index e574ffef..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementSprite.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.client.Sprite; -import net.minecraft.client.gui.ScaledResolution; - -public class ElementSprite extends HUDElement { - - private final Sprite sprite; - - public ElementSprite(Sprite sprite) { - super(sprite.getTextureWidth(), sprite.getTextureHeight()); - - this.sprite = sprite; - } - - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - sprite.draw(drawX, drawY); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java deleted file mode 100644 index 88016c2d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementString.java +++ /dev/null @@ -1,36 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.util.text.ITextComponent; - -public class ElementString extends HUDElement { - - private ITextComponent[] display; - - public ElementString(ITextComponent... display) { - super(getMaxStringWidth(display), (Minecraft.getInstance().fontRenderer.FONT_HEIGHT + 2) * display.length - 2); - - this.display = display; - } - - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - for (ITextComponent drawText : display) { - fontRenderer.drawStringWithShadow(drawText.getFormattedText(), drawX, drawY, 14737632); - drawY += fontRenderer.FONT_HEIGHT + 2; - } - } - - private static int getMaxStringWidth(ITextComponent... display) { - FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; - int maxWidth = 0; - for (ITextComponent drawText : display) - if (fontRenderer.getStringWidth(drawText.getFormattedText()) > maxWidth) - maxWidth = fontRenderer.getStringWidth(drawText.getFormattedText()); - - return maxWidth; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java deleted file mode 100644 index 9b6f88fe..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/ElementTileInformation.java +++ /dev/null @@ -1,57 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.client.Sprite; -import com.google.common.collect.Lists; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.RayTraceResult; -import org.apache.commons.lang3.tuple.Pair; - -import java.awt.Color; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -public abstract class ElementTileInformation extends HUDElement { - - protected final Class tileClass; - private final List>> information; - - public ElementTileInformation(int width, int lines, Class tileClass) { - super(width, 18 * lines - 2); - - this.tileClass = tileClass; - this.information = Lists.newArrayList(); - gatherInformation(information::add); - } - - public abstract void gatherInformation(Consumer>> information); - - @SuppressWarnings("unchecked") - @Override - public void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY) { - T tile = (T) Minecraft.getInstance().world.getTileEntity(Minecraft.getInstance().objectMouseOver.getBlockPos()); - - int yOffset = 0; - for (Pair> sprite : information) { - sprite.getLeft().draw(drawX, drawY + yOffset); - int textY = drawY + yOffset + (sprite.getLeft().getTextureHeight() / 4); - Minecraft.getInstance().fontRenderer.drawStringWithShadow((tile != null && tile.getClass() == tileClass) ? sprite.getRight().apply(tile) : "?", drawX + sprite.getLeft().getTextureWidth() + 2, textY, Color.WHITE.getRGB()); - yOffset += sprite.getLeft().getTextureHeight() + 2; - } - } - - @Override - public boolean shouldRender(Minecraft minecraft) { - RayTraceResult trace = Minecraft.getInstance().objectMouseOver; - if (trace == null || trace.typeOfHit != RayTraceResult.Type.BLOCK) - return false; - - TileEntity tile = Minecraft.getInstance().world.getTileEntity(trace.getBlockPos()); - if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) - return false; - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java b/src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java deleted file mode 100644 index 10eed1cd..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/hud/element/HUDElement.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.client.hud.element; - -import WayofTime.bloodmagic.client.hud.ElementRegistry; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.vecmath.Vector2f; -import java.awt.Point; - -@SideOnly(Side.CLIENT) -public abstract class HUDElement { - - private int width; - private int height; - - public HUDElement(int width, int height) { - this.width = width; - this.height = height; - } - - public boolean shouldRender(Minecraft minecraft) { - return true; - } - - public abstract void draw(ScaledResolution resolution, float partialTicks, int drawX, int drawY); - - public final int getWidth() { - return width; - } - - public final int getHeight() { - return height; - } - - protected void drawTexturedModalRect(double x, double y, double textureX, double textureY, double width, double height) { - float f = 0.00390625F; - float f1 = 0.00390625F; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - buffer.begin(7, DefaultVertexFormats.POSITION_TEX); - buffer.pos(x + 0, y + height, 0).tex((double) ((float) (textureX + 0) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - buffer.pos(x + width, y + height, 0).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY + height) * f1)).endVertex(); - buffer.pos(x + width, y + 0, 0).tex((double) ((float) (textureX + width) * f), (double) ((float) (textureY + 0) * f1)).endVertex(); - buffer.pos(x + 0, y + 0, 0).tex((double) ((float) (textureX + 0) * f), (double) ((float) (textureY + 0) * f1)).endVertex(); - tessellator.draw(); - } - - @Override - public String toString() { - Vector2f point = ElementRegistry.getPosition(ElementRegistry.getKey(this)); - return ElementRegistry.getKey(this) + "@" + point.x + "," + point.y; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java b/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java deleted file mode 100644 index a7fe5286..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/key/IKeybindable.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.client.key; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; - -public interface IKeybindable { - void onKeyPressed(ItemStack stack, PlayerEntity player, KeyBindings key, boolean showInChat); -} diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java deleted file mode 100644 index b1b18335..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindingBloodMagic.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.client.key; - -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.client.settings.KeyBinding; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class KeyBindingBloodMagic extends KeyBinding { - public KeyBindingBloodMagic(KeyBindings key) { - super(key.getDescription(), key.getKeyConflictContext(), key.getKeyModifier(), key.getKeyCode(), BloodMagic.NAME); - - ClientRegistry.registerKeyBinding(this); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java b/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java deleted file mode 100644 index 583f54da..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/key/KeyBindings.java +++ /dev/null @@ -1,97 +0,0 @@ -package WayofTime.bloodmagic.client.key; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.KeyProcessor; -import WayofTime.bloodmagic.util.handler.event.ClientHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.settings.KeyBinding; -import net.minecraft.item.ItemStack; -import net.minecraftforge.client.settings.IKeyConflictContext; -import net.minecraftforge.client.settings.KeyConflictContext; -import net.minecraftforge.client.settings.KeyModifier; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.input.Keyboard; - -import java.util.Locale; - -public enum KeyBindings { - // @formatter:off - OPEN_HOLDING(KeyConflictContext.IN_GAME, KeyModifier.NONE, Keyboard.KEY_H) { - @SideOnly(Side.CLIENT) - @Override - public void handleKeybind() { - ItemStack itemStack = ClientHandler.minecraft.player.getHeldItemMainhand(); - if (itemStack.getItem() instanceof IKeybindable) - BloodMagicPacketHandler.INSTANCE.sendToServer(new KeyProcessor(this, false)); - } - }, - CYCLE_HOLDING_POS(KeyConflictContext.IN_GAME, KeyModifier.SHIFT, Keyboard.KEY_EQUALS) { - @SideOnly(Side.CLIENT) - @Override - public void handleKeybind() { - ClientPlayerEntity player = Minecraft.getInstance().player; - if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) - ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, -1); - } - }, - CYCLE_HOLDING_NEG(KeyConflictContext.IN_GAME, KeyModifier.SHIFT, Keyboard.KEY_MINUS) { - @SideOnly(Side.CLIENT) - @Override - public void handleKeybind() { - ClientPlayerEntity player = Minecraft.getInstance().player; - if (player.getHeldItemMainhand().getItem() instanceof ItemSigilHolding) - ClientHandler.cycleSigil(player.getHeldItemMainhand(), player, 1); - } - }, - ; - // @formatter:on - - private final IKeyConflictContext keyConflictContext; - private final KeyModifier keyModifier; - private final int keyCode; - - @SideOnly(Side.CLIENT) - private KeyBinding key; - - KeyBindings(IKeyConflictContext keyConflictContext, KeyModifier keyModifier, int keyCode) { - this.keyConflictContext = keyConflictContext; - this.keyModifier = keyModifier; - this.keyCode = keyCode; - } - - @SideOnly(Side.CLIENT) - public abstract void handleKeybind(); - - public IKeyConflictContext getKeyConflictContext() { - return keyConflictContext; - } - - public KeyModifier getKeyModifier() { - return keyModifier; - } - - public int getKeyCode() { - return keyCode; - } - - @SideOnly(Side.CLIENT) - public KeyBinding getKey() { - if (key == null) - key = new KeyBindingBloodMagic(this); - - return key; - } - - @SideOnly(Side.CLIENT) - public void setKey(KeyBinding key) { - this.key = key; - } - - public String getDescription() { - return BloodMagic.MODID + ".keybind." + name().toLowerCase(Locale.ENGLISH); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java deleted file mode 100644 index bf43d69a..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionActivatable.java +++ /dev/null @@ -1,25 +0,0 @@ -package WayofTime.bloodmagic.client.mesh; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.iface.IActivatable; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class CustomMeshDefinitionActivatable implements ItemMeshDefinition { - private final String name; - - public CustomMeshDefinitionActivatable(String name) { - this.name = name; - } - - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - if (!stack.isEmpty() && stack.getItem() instanceof IActivatable) - if (((IActivatable) stack.getItem()).getActivated(stack)) - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "active=true"); - - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "active=false"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java deleted file mode 100644 index 0b3a91b9..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionMultiWill.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.client.mesh; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class CustomMeshDefinitionMultiWill implements ItemMeshDefinition { - private final String name; - - public CustomMeshDefinitionMultiWill(String name) { - this.name = name; - } - - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - if (!stack.isEmpty() && stack.getItem() instanceof IMultiWillTool) { - EnumDemonWillType type = ((IMultiWillTool) stack.getItem()).getCurrentType(stack); - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=" + type.getName().toLowerCase()); - } - - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=default"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java b/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java deleted file mode 100644 index ec857e14..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/mesh/CustomMeshDefinitionWillGem.java +++ /dev/null @@ -1,28 +0,0 @@ -package WayofTime.bloodmagic.client.mesh; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class CustomMeshDefinitionWillGem implements ItemMeshDefinition { - private final String name; - - public CustomMeshDefinitionWillGem(String name) { - this.name = name; - } - - @Override - public ModelResourceLocation getModelLocation(ItemStack stack) { - if (!stack.isEmpty() && stack.getItem() == RegistrarBloodMagicItems.SOUL_GEM) { - EnumDemonWillType type = ((ItemSoulGem) stack.getItem()).getCurrentType(stack); - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=" + ItemSoulGem.names[stack.getItemDamage()] + "_" + type.getName().toLowerCase()); - } - - return new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), "type=petty_default"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java deleted file mode 100644 index ca303032..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java +++ /dev/null @@ -1,53 +0,0 @@ -package WayofTime.bloodmagic.client.render; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import net.minecraft.client.entity.player.AbstractClientPlayerEntity; -import net.minecraft.client.model.ModelElytra; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.PlayerRenderer; -import net.minecraft.client.renderer.entity.layers.ArmorLayer; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class LayerBloodElytra implements LayerRenderer { - - private static final ResourceLocation TEXTURE_BLOOD_ELYTRA = new ResourceLocation("bloodmagic", "textures/entities/bloodElytra.png"); - private final PlayerRenderer renderPlayer; - private final ModelElytra modelElytra = new ModelElytra(); - - public LayerBloodElytra(PlayerRenderer renderPlayer) { - this.renderPlayer = renderPlayer; - } - - @Override - public void doRenderLayer(AbstractClientPlayerEntity clientPlayer, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - if (LivingArmour.hasFullSet(clientPlayer)) { - ItemStack chestStack = clientPlayer.getItemStackFromSlot(EquipmentSlotType.CHEST); - if (ItemLivingArmour.hasUpgrade(BloodMagic.MODID + ".upgrade.elytra", chestStack)) { - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.enableBlend(); - - renderPlayer.bindTexture(TEXTURE_BLOOD_ELYTRA); - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.0F, 0.0F, 0.125F); - modelElytra.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, clientPlayer); - modelElytra.render(clientPlayer, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); - - if (chestStack.isItemEnchanted()) - ArmorLayer.renderEnchantedGlint(this.renderPlayer, clientPlayer, this.modelElytra, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); - - GlStateManager.popMatrix(); - } - } - } - - @Override - public boolean shouldCombineTextures() { - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java deleted file mode 100644 index 3131c610..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/AttractorAlchemyCircleRenderer.java +++ /dev/null @@ -1,142 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class AttractorAlchemyCircleRenderer extends AlchemyCircleRenderer { - public AttractorAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ZombieBeacon.png")); - } - - public AttractorAlchemyCircleRenderer(ResourceLocation resourceLocation) { - super(resourceLocation); - } - - @Override - public float getSizeModifier(float craftTime) { - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 2; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 5f; - return modifier * 1f; - } - return 0; - } - - @Override - public float getSecondaryRotation(float craftTime) { - float offset = 50; - float secondaryOffset = 150; - if (craftTime >= offset) { - if (craftTime < secondaryOffset) { - float modifier = 90 * (craftTime - offset) / (secondaryOffset - offset); - return modifier; - } else { - return 90; - } - } - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - - float rot = getRotation(craftTime); - float secondaryRot = getSecondaryRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - GlStateManager.rotate(secondaryRot, 1, 0, 0); - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java deleted file mode 100644 index 8f487060..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/BindingAlchemyCircleRenderer.java +++ /dev/null @@ -1,236 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class BindingAlchemyCircleRenderer extends AlchemyCircleRenderer { - public static final int numberOfSweeps = 5; - public static final int startTime = 50; - public static final int sweepTime = 40; - public static final int inwardRotationTime = 50; - public static final float arcLength = (float) Math.sqrt(2 * (2 * 2) - 2 * 2 * 2 * Math.cos(2 * Math.PI * 2 / 5)); - public static final float theta2 = (float) (18f * Math.PI / 180f); - public static final int endTime = 300; - public final ResourceLocation[] arraysResources; - public float offsetFromFace = -0.9f; - - public BindingAlchemyCircleRenderer() { - super(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingArray.png")); - arraysResources = new ResourceLocation[5]; - arraysResources[0] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); - arraysResources[1] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); - arraysResources[2] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); - arraysResources[3] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); - arraysResources[4] = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BindingLightningArray.png"); - } - - public float getRotation(int circle, float craftTime) { - float offset = 2; - if (circle == -1) { - return craftTime * 360 * 2 / 5 / sweepTime; - } - if (craftTime >= offset) { - float modifier = (float) Math.pow(craftTime - offset, 1.5); - return modifier * 0.5f; - } - return 0; - } - - public float getSecondaryRotation(int circle, float craftTime) { - float offset = 50; - if (craftTime >= offset) { - float modifier = (float) Math.pow(craftTime - offset, 1.7); - return modifier * 0.5f; - } - return 0; - } - - public float getVerticalOffset(int circle, float craftTime) { - if (circle >= 0 && circle <= 4) { - if (craftTime >= 5) { - if (craftTime <= 40) { - return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); - } else { - return -0.4f; - } - } - - return 0; - } - - if (craftTime >= 5) { - if (craftTime <= 40) { - return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); - } else { - return -0.4f; - } - } - return 0; - } - - public float getInwardRotation(int circle, float craftTime) { - float offset = startTime + numberOfSweeps * sweepTime; - if (craftTime >= offset) { - if (craftTime <= offset + inwardRotationTime) { - return 90f / inwardRotationTime * (craftTime - offset); - } else { - return 90; - } - } - - return 0; - } - - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - - float rot = getRotation(-1, craftTime); - - float size = 3.0F; - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - // GlStateManager.color(0.5f, 1f, 1f, 1f); - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - GlStateManager.popMatrix(); - - for (int i = 0; i < 5; i++) { - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(arraysResources[i]); - float newSize = 1; - float distance = BindingAlchemyCircleRenderer.getDistanceOfCircle(i, craftTime); - float angle = BindingAlchemyCircleRenderer.getAngleOfCircle(i, craftTime); - float rotation = this.getRotation(i, craftTime); - - GlStateManager.translate(distance * Math.sin(angle), -distance * Math.cos(angle), this.getVerticalOffset(i, craftTime)); - GlStateManager.rotate(i * 360 / 5, 0, 0, 1); - GlStateManager.rotate(getInwardRotation(i, craftTime), 1, 0, 0); - GlStateManager.rotate(rotation, 0, 0, 1); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - wr.pos(newSize / 2f, newSize / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(newSize / 2f, -newSize / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-newSize / 2f, -newSize / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-newSize / 2f, newSize / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - } - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - } - - public static float getAngleOfCircle(int circle, float craftTime) { - if (circle >= 0 && circle <= 4) { - float originalAngle = (float) (circle * 2 * Math.PI / 5d); - - double sweep = (craftTime - startTime) / sweepTime; - if (sweep >= 0 && sweep < numberOfSweeps) { - float offset = ((int) sweep) * sweepTime + startTime; - originalAngle += 2 * Math.PI * 2 / 5 * (int) sweep + getAngle(craftTime - offset, (int) sweep); - } else if (sweep >= numberOfSweeps) { - originalAngle += 2 * Math.PI * 2 / 5 * numberOfSweeps + (craftTime - 5 * sweepTime - startTime) * 2 * Math.PI * 2 / 5 / sweepTime; - } - - return originalAngle; - } - - return 0; - } - - public static float getAngle(float craftTime, int sweep) { - float rDP = craftTime / sweepTime * arcLength; - float rEnd = (float) Math.sqrt(rDP * rDP + 2 * 2 - 2 * rDP * 2 * Math.cos(theta2)); - return (float) (Math.acos((2 * 2 + rEnd * rEnd - rDP * rDP) / (2 * rEnd * 2))); - } - - /** - * Returns the center-to-center distance of this circle. - */ - public static float getDistanceOfCircle(int circle, float craftTime) { // TODO Change this so it doesn't use angle, since it is a constant speed. - double sweep = (craftTime - startTime) / sweepTime; - if (sweep >= 0 && sweep < numberOfSweeps) { - float offset = ((int) sweep) * sweepTime + startTime; - float angle = getAngle(craftTime - offset, (int) sweep); - float thetaPrime = (float) (Math.PI - theta2 - angle); - // if(thetaPrime > 0 && thetaPrime < Math.PI) { - return (float) (2 * Math.sin(theta2) / Math.sin(thetaPrime)); - // } - } else if (sweep >= numberOfSweeps && craftTime < endTime) { - return 2 - 2 * (craftTime - startTime - numberOfSweeps * sweepTime) / (endTime - startTime - numberOfSweeps * sweepTime); - } else if (craftTime >= endTime) { - return 0; - } - - return 2; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java deleted file mode 100644 index 44661394..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/DualAlchemyCircleRenderer.java +++ /dev/null @@ -1,145 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class DualAlchemyCircleRenderer extends AlchemyCircleRenderer { - public final ResourceLocation secondaryArrayResource; - public float offsetFromFace = -0.9f; - - public DualAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png")); - } - - public DualAlchemyCircleRenderer(ResourceLocation arrayResource, ResourceLocation secondaryArrayResource) { - super(arrayResource); - this.secondaryArrayResource = secondaryArrayResource; - } - - @Override - public float getSizeModifier(float craftTime) { - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 2; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 2f; - return modifier * 1f; - } - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / - // this.rotationspeed) * this.rotationspeed) + this.rotationspeed * f; - float rot = getRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // Bind the second texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(secondaryArrayResource); - GlStateManager.pushMatrix(); - GlStateManager.rotate(-rot, 0, 0, 1); - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java deleted file mode 100644 index 687ecdc8..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowAlchemyCircleRenderer.java +++ /dev/null @@ -1,18 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import net.minecraft.util.ResourceLocation; - -public class LowAlchemyCircleRenderer extends SingleAlchemyCircleRenderer { - public LowAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); - } - - public LowAlchemyCircleRenderer(ResourceLocation arrayResource) { - super(arrayResource); - } - - @Override - public float getVerticalOffset(float craftTime) { - return 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java deleted file mode 100644 index 8b57713b..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/LowStaticAlchemyCircleRenderer.java +++ /dev/null @@ -1,24 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import net.minecraft.util.ResourceLocation; - -public class LowStaticAlchemyCircleRenderer extends LowAlchemyCircleRenderer { - public LowStaticAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); - } - - public LowStaticAlchemyCircleRenderer(ResourceLocation arrayResource) { - super(arrayResource); - } - - @Override - public float getRotation(float craftTime) { - float offset = 2; - float duration = 180; - if (craftTime >= offset && craftTime < offset + duration) { - float modifier = (craftTime - offset) * 2f; - return modifier * 1f; - } - return 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java deleted file mode 100644 index 62c3a02e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/MobSacrificeAlchemyCircleRenderer.java +++ /dev/null @@ -1,243 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; - -public class MobSacrificeAlchemyCircleRenderer extends AlchemyCircleRenderer { - private ResourceLocation bottomArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"); - - private ResourceLocation mobSacrificeSwirlResource = new ResourceLocation("bloodmagic", "textures/models/mobsacrificeswirl.png"); - - public MobSacrificeAlchemyCircleRenderer(ResourceLocation location) { - super(location); - } - - public MobSacrificeAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/mobsacrifice.png")); - } - - @Override - public float getSizeModifier(float craftTime) { - if (craftTime < 40) { - return 0; - } else if (craftTime > 40 && craftTime < 100) { - return (craftTime - 40) / 60f; - } - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 50; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 5f; - return modifier * 1f; - } - return 0; - } - - @Override - public float getSecondaryRotation(float craftTime) { - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - - float rot = getRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); -// GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - GlStateManager.pushMatrix(); - - double topHeightOffset = 0; - double middleHeightOffset = 0; - double bottomHeightOffset = 0; - - BlockPos pos = tileArray.getPos(); - World world = tileArray.getWorld(); - -// GlStateManager.rotate((float) (yaw + 360 * getStartupPitchYawRatio(craftTime)), 0, 0, 1); -// GlStateManager.rotate((float) ((pitch + 90) * getStartupPitchYawRatio(craftTime)), 1, 0, 0); - - for (int i = 1; i <= 3; i++) { - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(bottomArrayResource); - translateAndRotateFloatingArray(tessellator, wr, size, rot, craftTime, i); - GlStateManager.popMatrix(); - } - - //Render the main array. - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); -// GlStateManager.rotate(rot, 0, 0, 1); - renderStandardCircle(tessellator, wr, 3); - GlStateManager.popMatrix(); - - //Render the swirlz - float swirlSize = 3; - if (craftTime <= 40) { - swirlSize = 0; - } else if (craftTime <= 100) { - swirlSize = 3 * (craftTime - 40) / 60; - } - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(mobSacrificeSwirlResource); - GlStateManager.translate(0, 0, 0.1); - GlStateManager.rotate(rot / 3, 0, 0, 1); - renderStandardCircle(tessellator, wr, swirlSize); - GlStateManager.popMatrix(); - -// GlStateManager.popMatrix(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } - - public float getStartupPitchYawRatio(float craftTime) { - if (craftTime <= 80) { - return 0; - } else if (craftTime > 80 && craftTime < 140) { - return (craftTime - 80) / 60f; - } - - return 1; - } - - private void translateAndRotateFloatingArray(Tessellator tessellator, BufferBuilder builder, double size, float rotation, float craftTime, int circle) { - double verticalOffset = 2; - - float primaryRotation = 0; - float secondaryRotation = 0; - if (craftTime >= 40) { - primaryRotation = (craftTime - 40) * 4f; - secondaryRotation = (craftTime - 40) * 2f; - } - - float translationOffset = 1; - if (craftTime < 80) { - translationOffset = 0; - } else if (craftTime < 140) { - translationOffset = (craftTime - 80) / 60; - } - - switch (circle) { - case 1: - GlStateManager.translate(0, 0, -verticalOffset); - GlStateManager.rotate(rotation / 200, 1, 0, 0); - GlStateManager.rotate(rotation / 10, 0, 0, 1); - GlStateManager.translate(1.7 * translationOffset, 0, 0); - break; - case 2: - GlStateManager.translate(0, 0, -verticalOffset); -// GlStateManager.rotate(254, 0, 0, 1); - GlStateManager.rotate((float) (rotation / 150 + 120), 1, 0, 0); - GlStateManager.rotate(120, 0, 1, 0); - GlStateManager.rotate(-rotation / 10, 0, 0, 1); - GlStateManager.translate(1.2 * translationOffset, 0, 0); - break; - case 3: - GlStateManager.translate(0, 0, -verticalOffset); -// GlStateManager.rotate(130, 0, 0, 1); - GlStateManager.rotate((float) (rotation / 100 + 284), 1, 0, 0); - GlStateManager.rotate(240, 0, 1, 0); - GlStateManager.rotate(-rotation / 7 + 180, 0, 0, 1); - GlStateManager.translate(2 * translationOffset, 0, 0); - break; - default: - //What are you doing, Way??? - } - - GlStateManager.rotate(primaryRotation, 0, 1, 0); - GlStateManager.rotate(secondaryRotation, 1, 0, 0); - GlStateManager.rotate(secondaryRotation * 0.41831f, 0, 0, 1); - - renderStandardCircle(tessellator, builder, size); - } - - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - GlStateManager.color(1f, 1f, 1f, 1f); - builder.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - builder.pos(size / 2f, size / 2f, 0).tex(var33, var37).endVertex(); - builder.pos(size / 2f, -size / 2f, 0).tex(var33, var35).endVertex(); - builder.pos(-size / 2f, -size / 2f, 0).tex(var31, var35).endVertex(); - builder.pos(-size / 2f, size / 2f, 0).tex(var31, var37).endVertex(); - tessellator.draw(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java deleted file mode 100644 index 1e292998..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/SingleAlchemyCircleRenderer.java +++ /dev/null @@ -1,127 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class SingleAlchemyCircleRenderer extends AlchemyCircleRenderer { - public float offsetFromFace = -0.9f; - - public SingleAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png")); - } - - public SingleAlchemyCircleRenderer(ResourceLocation arrayResource) { - super(arrayResource); - } - - @Override - public float getSizeModifier(float craftTime) { - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 2; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 2f; - return modifier * 1f; - } - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - // float rot = (float)(this.worldObj.provider.getWorldTime() % (360 / - // this.rotationspeed) * this.rotationspeed) + this.rotationspeed * f; - float rot = getRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java deleted file mode 100644 index 80d58a79..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/StaticAlchemyCircleRenderer.java +++ /dev/null @@ -1,131 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; - -public class StaticAlchemyCircleRenderer extends AlchemyCircleRenderer { - public StaticAlchemyCircleRenderer(ResourceLocation location) { - super(location); - } - - public StaticAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png")); - } - - @Override - public float getSizeModifier(float craftTime) { - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 50; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 5f; - return modifier * 1f; - } - return 0; - } - - @Override - public float getSecondaryRotation(float craftTime) { - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - - float rot = getRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); - GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 1, 0); - - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java b/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java deleted file mode 100644 index 77a72a3f..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/alchemyArray/TurretAlchemyCircleRenderer.java +++ /dev/null @@ -1,247 +0,0 @@ -package WayofTime.bloodmagic.client.render.alchemyArray; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.tile.TileAlchemyArray; - -public class TurretAlchemyCircleRenderer extends AlchemyCircleRenderer { - private ResourceLocation bottomArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"); - private ResourceLocation middleArrayResource = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png"); - - public TurretAlchemyCircleRenderer(ResourceLocation location) { - super(location); - } - - public TurretAlchemyCircleRenderer() { - this(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png")); - } - - @Override - public float getSizeModifier(float craftTime) { - return 1; - } - - @Override - public float getRotation(float craftTime) { - float offset = 50; - if (craftTime >= offset) { - float modifier = (craftTime - offset) * 5f; - return modifier * 1f; - } - return 0; - } - - @Override - public float getSecondaryRotation(float craftTime) { - return 0; - } - - @Override - public void renderAt(TileEntity tile, double x, double y, double z, float craftTime) { - if (!(tile instanceof TileAlchemyArray)) { - return; - } - - float f = 0; //Not working - - TileAlchemyArray tileArray = (TileAlchemyArray) tile; - AlchemyArrayEffect effect = tileArray.arrayEffect; - double pitch = 0; - double yaw = 0; - int arrowTimer = -1; - if (effect instanceof AlchemyArrayEffectArrowTurret) { - AlchemyArrayEffectArrowTurret turretEffect = (AlchemyArrayEffectArrowTurret) effect; - pitch = (turretEffect.getPitch() - turretEffect.getLastPitch()) * f + turretEffect.getLastPitch(); - yaw = (turretEffect.getYaw() - turretEffect.getLastYaw()) * f + turretEffect.getLastYaw(); - arrowTimer = turretEffect.arrowTimer; - } - - double arrowAnimation = arrowTimer + f; - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - - float rot = getRotation(craftTime); - - float size = 1.0F * getSizeModifier(craftTime); - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - - GlStateManager.translate(x, y, z); - - // Specify which face this "circle" is located on - Direction sideHit = Direction.UP; - Direction rotation = tileArray.getRotation(); - - GlStateManager.translate(sideHit.getXOffset() * offsetFromFace, sideHit.getYOffset() * offsetFromFace, sideHit.getZOffset() * offsetFromFace); - - switch (sideHit) { - case DOWN: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(-90.0f, 1, 0, 0); - break; - case EAST: - GlStateManager.rotate(-90.0f, 0, 1, 0); - GlStateManager.translate(0, 0, -1); - break; - case NORTH: - break; - case SOUTH: - GlStateManager.rotate(180.0f, 0, 1, 0); - GlStateManager.translate(-1, 0, -1); - break; - case UP: - GlStateManager.translate(0, 1, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - break; - case WEST: - GlStateManager.translate(0, 0, 1); - GlStateManager.rotate(90.0f, 0, 1, 0); - break; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(0.5f, 0.5f, getVerticalOffset(craftTime)); -// GlStateManager.rotate(rotation.getHorizontalAngle() + 180, 0, 0, 1); - - GlStateManager.pushMatrix(); - - double topHeightOffset = getTopHeightOffset(craftTime, arrowAnimation); - double middleHeightOffset = getMiddleHeightOffset(craftTime, arrowAnimation); - double bottomHeightOffset = getBottomHeightOffset(craftTime, arrowAnimation); - - BlockPos pos = tileArray.getPos(); - World world = tileArray.getWorld(); - - GlStateManager.rotate((float) (yaw + 360 * getStartupPitchYawRatio(craftTime)), 0, 0, 1); - GlStateManager.rotate((float) ((pitch + 90) * getStartupPitchYawRatio(craftTime)), 1, 0, 0); - - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(bottomArrayResource); - GlStateManager.rotate(-rot, 0, 0, 1); - GlStateManager.translate(0, 0, -bottomHeightOffset); - renderStandardCircle(tessellator, wr, size / 2); - GlStateManager.popMatrix(); - - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(middleArrayResource); - GlStateManager.rotate(0, 0, 0, 1); - GlStateManager.translate(0, 0, -middleHeightOffset); - renderStandardCircle(tessellator, wr, size); - GlStateManager.popMatrix(); - - GlStateManager.pushMatrix(); - Minecraft.getInstance().renderEngine.bindTexture(arrayResource); - GlStateManager.rotate(rot, 0, 0, 1); - GlStateManager.translate(0, 0, -topHeightOffset); - renderStandardCircle(tessellator, wr, size); - GlStateManager.popMatrix(); - - GlStateManager.popMatrix(); - - // GlStateManager.depthMask(true); - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - // GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } - - public float getStartupPitchYawRatio(float craftTime) { - if (craftTime <= 80) { - return 0; - } else if (craftTime > 80 && craftTime < 140) { - return (craftTime - 80) / 60f; - } - - return 1; - } - - public double getBottomHeightOffset(double craftTime, double arrowAnimation) { - if (craftTime <= 40) { - return 0; - } else if (craftTime > 40 && craftTime < 100) { - return -0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) { - return -0.4 * (140 - craftTime) / 40d; - } - - if (arrowAnimation > 0 && arrowAnimation < 45) { - return -0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) { - return -0.4 * (50 - arrowAnimation) / 5; - } - - return 0; - } - - public double getMiddleHeightOffset(double craftTime, double arrowAnimation) { - if (craftTime <= 40) { - return 0; - } else if (craftTime > 40 && craftTime < 100) { - return 0.1 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) { - return 0.1 * (140 - craftTime) / 40d; - } - - if (arrowAnimation > 0 && arrowAnimation < 45) { - return 0.1 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) { - return 0.1 * (50 - arrowAnimation) / 5; - } - - return 0; - } - - public double getTopHeightOffset(double craftTime, double arrowAnimation) { - if (craftTime <= 40) { - return 0; - } else if (craftTime > 40 && craftTime < 100) { - return 0.4 * (craftTime - 40) / 60d; - } else if (craftTime >= 100 && craftTime < 140) { - return 0.4 * (140 - craftTime) / 40d; - } - - if (arrowAnimation > 0 && arrowAnimation < 45) { - return 0.4 * (arrowAnimation) / 45; - } else if (arrowAnimation >= 45 && arrowAnimation < 50) { - return 0.4 * (50 - arrowAnimation) / 5; - } - - return 0; - } - - private void renderStandardCircle(Tessellator tessellator, BufferBuilder builder, double size) { - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - GlStateManager.color(1f, 1f, 1f, 1f); - builder.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - builder.pos(size / 2f, size / 2f, 0).tex(var33, var37).endVertex(); - builder.pos(size / 2f, -size / 2f, 0).tex(var33, var35).endVertex(); - builder.pos(-size / 2f, -size / 2f, 0).tex(var31, var35).endVertex(); - builder.pos(-size / 2f, size / 2f, 0).tex(var31, var37).endVertex(); - tessellator.draw(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java index fecc0a15..83a9e972 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAlchemyArray.java @@ -1,26 +1,43 @@ -package WayofTime.bloodmagic.client.render.block; +package wayoftime.bloodmagic.client.render.block; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.tile.TileAlchemyArray; +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; +import wayoftime.bloodmagic.client.render.alchemyarray.AlchemyArrayRenderer; +import wayoftime.bloodmagic.core.registry.AlchemyArrayRendererRegistry; +import wayoftime.bloodmagic.tile.TileAlchemyArray; -public class RenderAlchemyArray extends TileEntityRenderer { - @Override - public void render(TileAlchemyArray alchemyArray, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - ItemStack inputStack = alchemyArray.getStackInSlot(0); - ItemStack catalystStack = alchemyArray.getStackInSlot(1); - int craftTime = alchemyArray.activeCounter; - AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); - if (renderer == AlchemyArrayRecipeRegistry.DEFAULT_RENDERER) { - RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(inputStack, catalystStack); - if (recipe != null) - renderer = new AlchemyCircleRenderer(recipe.getCircleTexture()); - } +public class RenderAlchemyArray extends TileEntityRenderer +{ + public static final AlchemyArrayRenderer arrayRenderer = new AlchemyArrayRenderer(); - renderer.renderAt(alchemyArray, x, y, z, (craftTime > 0 ? craftTime + partialTicks : 0)); - } + public RenderAlchemyArray(TileEntityRendererDispatcher rendererDispatcherIn) + { + super(rendererDispatcherIn); + } + + @Override + public void render(TileAlchemyArray tileArray, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn) + { + ItemStack inputStack = tileArray.getStackInSlot(0); + ItemStack catalystStack = tileArray.getStackInSlot(1); +// arrayRenderer.renderAt(tileArray, 0, 0, 0, tileArray.activeCounter +// + partialTicks, matrixStack, buffer, combinedLightIn, combinedOverlayIn); + + AlchemyArrayRenderer renderer = AlchemyArrayRendererRegistry.getRenderer(tileArray.getWorld(), inputStack, catalystStack); + if (renderer == null) + { + renderer = AlchemyArrayRendererRegistry.DEFAULT_RENDERER; + } + + renderer.renderAt(tileArray, 0, 0, 0, tileArray.activeCounter + + partialTicks, matrixStack, buffer, combinedLightIn, combinedOverlayIn); +// arrayRenderer.renderAt(tileArray, 0, 0, 0, 0, matrixStack, buffer, combinedLightIn, combinedOverlayIn); + +// if (tileAltar.getCurrentTierDisplayed() != AltarTier.ONE) +// renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); + } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java index 6a094932..e30c3cb1 100644 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java +++ b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderAltar.java @@ -1,164 +1,281 @@ -package WayofTime.bloodmagic.client.render.block; +package wayoftime.bloodmagic.client.render.block; -import WayofTime.bloodmagic.altar.AltarComponent; -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.handler.event.ClientHandler; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.block.RedstoneBlock; import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.*; +import net.minecraft.client.renderer.Atlases; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.entity.LivingEntity; +import net.minecraft.fluid.Fluid; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fluids.Fluid; +import net.minecraft.util.math.vector.Vector3f; import net.minecraftforge.fluids.FluidStack; -import org.lwjgl.opengl.GL11; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D; +import wayoftime.bloodmagic.client.render.RenderResizableCuboid; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.tile.TileAltar; -public class RenderAltar extends TileEntityRenderer { - private static final float MIN_HEIGHT = 0.499f; - private static final float MAX_HEIGHT = 0.745f; +public class RenderAltar extends TileEntityRenderer +{ + public RenderAltar(TileEntityRendererDispatcher rendererDispatcherIn) + { + super(rendererDispatcherIn); + } - @Override - public void render(TileAltar tileAltar, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - ItemStack inputStack = tileAltar.getStackInSlot(0); + private static final float MIN_HEIGHT = 0.499f; + private static final float MAX_HEIGHT = 0.745f; - float level = ((float) tileAltar.getCurrentBlood()) / (float) tileAltar.getCapacity(); + @Override + public void render(TileAltar tileAltar, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn) + { + RedstoneBlock d; + ItemStack inputStack = tileAltar.getStackInSlot(0); - GlStateManager.pushMatrix(); - GlStateManager.translate(x, y, z); - if (level > 0) - this.renderFluid(level); - this.renderItem(inputStack); - GlStateManager.popMatrix(); + float level = ((float) tileAltar.getCurrentBlood()) / (float) tileAltar.getCapacity(); - if (tileAltar.getCurrentTierDisplayed() != AltarTier.ONE) - renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); - } + this.renderItem(inputStack, tileAltar, matrixStack, buffer, combinedLightIn, combinedOverlayIn); - private void renderFluid(float fluidLevel) { - GlStateManager.pushMatrix(); + renderFluid(level, matrixStack, buffer, combinedLightIn, combinedOverlayIn); - Fluid fluid = BlockLifeEssence.getLifeEssence(); - FluidStack fluidStack = new FluidStack(fluid, 1000); +// if (tileAltar.getCurrentTierDisplayed() != AltarTier.ONE) +// renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks); + } - GlStateManager.translate(0.5, MIN_HEIGHT + (fluidLevel) * (MAX_HEIGHT - MIN_HEIGHT), 0.5); + private void renderFluid(float fluidLevel, MatrixStack matrixStack, IRenderTypeBuffer renderer, int combinedLightIn, int combinedOverlayIn) + { + Fluid fluid = BloodMagicBlocks.LIFE_ESSENCE_FLUID.get(); + FluidStack fluidStack = new FluidStack(fluid, 1000); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); + FluidRenderData data = new FluidRenderData(fluidStack); + matrixStack.push(); - float size = 0.8f; + Model3D model = getFluidModel(fluidLevel, data); + IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType()); - TextureAtlasSprite fluidStillSprite = Minecraft.getInstance().getTextureMapBlocks().getTextureExtry(fluid.getStill().toString()); +// matrixStack.translate(data.loca, y, z); +// int glow = data.calculateGlowLight(0); + RenderResizableCuboid.INSTANCE.renderCube(model, matrixStack, buffer, data.getColorARGB(1), combinedLightIn, combinedOverlayIn); - int fluidColor = fluid.getColor(fluidStack); + matrixStack.pop(); + } - Minecraft.getInstance().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - setGLColorFromInt(fluidColor); + public float getRotation(float craftTime) + { + float offset = 2; + if (craftTime >= offset) + { + float modifier = (float) Math.pow(craftTime - offset, 1.5); + return modifier * 1f; + } + return 0; + } - double uMin = (double) fluidStillSprite.getMinU(); - double uMax = (double) fluidStillSprite.getMaxU(); - double vMin = (double) fluidStillSprite.getMinV(); - double vMax = (double) fluidStillSprite.getMaxV(); + public float getSecondaryRotation(float craftTime) + { + float offset = 50; + if (craftTime >= offset) + { + float modifier = (float) Math.pow(craftTime - offset, 1.7); + return modifier * 0.5f; + } + return 0; + } - wr.begin(7, DefaultVertexFormats.POSITION_TEX); -// wr.setBrightness(200); - wr.pos(size / 2f, 0, size / 2f).tex(uMax, vMax).endVertex(); - wr.pos(size / 2f, 0, -size / 2f).tex(uMax, vMin).endVertex(); - wr.pos(-size / 2f, 0, -size / 2f).tex(uMin, vMin).endVertex(); - wr.pos(-size / 2f, 0, size / 2f).tex(uMin, vMax).endVertex(); - tessellator.draw(); + public float getSizeModifier(float craftTime) + { + if (craftTime >= 150 && craftTime <= 250) + { + return (200 - craftTime) / 50f; + } + return 1.0f; + } - GlStateManager.popMatrix(); - } + public float getVerticalOffset(float craftTime) + { + if (craftTime >= 5) + { + if (craftTime <= 40) + { + return (float) ((-0.4) * Math.pow((craftTime - 5) / 35f, 3)); + } else + { + return -0.4f; + } + } + return 0; + } - private void renderItem(ItemStack stack) { - ItemRenderer itemRenderer = Minecraft.getInstance().getRenderItem(); - if (!stack.isEmpty()) { - GlStateManager.translate(0.5, 1, 0.5); - GlStateManager.pushMatrix(); - GlStateManager.disableLighting(); + private void renderItem(ItemStack stack, TileAltar tileAltar, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn) + { + matrixStack.push(); + Minecraft mc = Minecraft.getInstance(); + ItemRenderer itemRenderer = mc.getItemRenderer(); + if (!stack.isEmpty()) + { + matrixStack.translate(0.5, 1, 0.5); + matrixStack.push(); - float rotation = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + float rotation = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); - GlStateManager.rotate(rotation, 0.0F, 1.0F, 0); - GlStateManager.scale(0.75F, 0.75F, 0.75F); - GlStateManager.pushAttrib(); - RenderHelper.enableStandardItemLighting(); - itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.GROUND); - RenderHelper.disableStandardItemLighting(); - GlStateManager.popAttrib(); + matrixStack.rotate(Vector3f.YP.rotationDegrees(rotation)); + matrixStack.scale(0.5F, 0.5F, 0.5F); + RenderHelper.enableStandardItemLighting(); + IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stack, tileAltar.getWorld(), (LivingEntity) null); + itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, true, matrixStack, buffer, combinedLightIn, combinedOverlayIn, ibakedmodel); // renderItem + RenderHelper.disableStandardItemLighting(); - GlStateManager.enableLighting(); - GlStateManager.popMatrix(); - } - } + matrixStack.pop(); + } - private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) { - ClientPlayerEntity player = Minecraft.getInstance().player; - World world = player.world; + matrixStack.pop(); + } - if (tier == AltarTier.ONE) - return; + private Model3D getFluidModel(float fluidLevel, FluidRenderData data) + { + Model3D model = new BloodMagicRenderer.Model3D(); + model.setTexture(data.getTexture()); + model.minX = 0.1; + model.minY = MIN_HEIGHT; + model.minZ = 0.1; + model.maxX = 0.9; + model.maxY = (MAX_HEIGHT - MIN_HEIGHT) * fluidLevel + MIN_HEIGHT; + model.maxZ = 0.9; - GlStateManager.pushMatrix(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GlStateManager.color(1F, 1F, 1F, 0.6125F); + return model; + } - BlockPos vec3, vX; - vec3 = altar.getPos(); - double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; - double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; - double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; + public class FluidRenderData + { + public BlockPos location; - for (AltarComponent altarComponent : tier.getAltarComponents()) { - vX = vec3.add(altarComponent.getOffset()); - double minX = vX.getX() - posX; - double minY = vX.getY() - posY; - double minZ = vX.getZ() - posZ; + public int height; + public int length; + public int width; - if (!world.getBlockState(vX).isOpaqueCube()) { - TextureAtlasSprite texture = null; + public final FluidStack fluidType; - switch (altarComponent.getComponent()) { - case BLOODRUNE: - texture = ClientHandler.blankBloodRune; - break; - case NOTAIR: - texture = ClientHandler.stoneBrick; - break; - case GLOWSTONE: - texture = ClientHandler.glowstone; - break; - case BLOODSTONE: - texture = ClientHandler.bloodStoneBrick; - break; - case BEACON: - texture = ClientHandler.beacon; - break; - case CRYSTAL: - texture = ClientHandler.crystalCluster; - break; - } + public FluidRenderData(FluidStack fluidType) + { + this.fluidType = fluidType; + } - RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); - } - } + public TextureAtlasSprite getTexture() + { + return Minecraft.getInstance().getAtlasSpriteGetter(AtlasTexture.LOCATION_BLOCKS_TEXTURE).apply(fluidType.getFluid().getAttributes().getStillTexture()); + } - GlStateManager.popMatrix(); - } + public boolean isGaseous() + { + return fluidType.getFluid().getAttributes().isGaseous(fluidType); + } - private static void setGLColorFromInt(int color) { - float red = (color >> 16 & 0xFF) / 255.0F; - float green = (color >> 8 & 0xFF) / 255.0F; - float blue = (color & 0xFF) / 255.0F; + public int getColorARGB(float scale) + { + return fluidType.getFluid().getAttributes().getColor(fluidType); + } - GlStateManager.color(red, green, blue, 1.0F); - } + public int calculateGlowLight(int light) + { + return light; + } + + @Override + public int hashCode() + { + int code = super.hashCode(); + code = 31 * code + fluidType.getFluid().getRegistryName().hashCode(); + if (fluidType.hasTag()) + { + code = 31 * code + fluidType.getTag().hashCode(); + } + return code; + } + + @Override + public boolean equals(Object data) + { + return super.equals(data) && data instanceof FluidRenderData + && fluidType.isFluidEqual(((FluidRenderData) data).fluidType); + } + } +// +// private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks) +// { +// EntityPlayerSP player = Minecraft.getMinecraft().player; +// World world = player.world; +// +// if (tier == AltarTier.ONE) +// return; +// +// GlStateManager.pushMatrix(); +// GlStateManager.enableBlend(); +// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); +// GlStateManager.color(1F, 1F, 1F, 0.6125F); +// +// BlockPos vec3, vX; +// vec3 = altar.getPos(); +// double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; +// double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; +// double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; +// +// for (AltarComponent altarComponent : tier.getAltarComponents()) +// { +// vX = vec3.add(altarComponent.getOffset()); +// double minX = vX.getX() - posX; +// double minY = vX.getY() - posY; +// double minZ = vX.getZ() - posZ; +// +// if (!world.getBlockState(vX).isOpaqueCube()) +// { +// TextureAtlasSprite texture = null; +// +// switch (altarComponent.getComponent()) +// { +// case BLOODRUNE: +// texture = ClientHandler.blankBloodRune; +// break; +// case NOTAIR: +// texture = ClientHandler.stoneBrick; +// break; +// case GLOWSTONE: +// texture = ClientHandler.glowstone; +// break; +// case BLOODSTONE: +// texture = ClientHandler.bloodStoneBrick; +// break; +// case BEACON: +// texture = ClientHandler.beacon; +// break; +// case CRYSTAL: +// texture = ClientHandler.crystalCluster; +// break; +// } +// +// RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); +// } +// } +// +// GlStateManager.popMatrix(); +// } + +// private static void setGLColorFromInt(int color) +// { +// float red = (color >> 16 & 0xFF) / 255.0F; +// float green = (color >> 8 & 0xFF) / 255.0F; +// float blue = (color & 0xFF) / 255.0F; +// +// GlStateManager.color(red, green, blue, 1.0F); +// } } diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java deleted file mode 100644 index 1c384246..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderBloodTank.java +++ /dev/null @@ -1,109 +0,0 @@ -package WayofTime.bloodmagic.client.render.block; - -import WayofTime.bloodmagic.tile.TileBloodTank; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.opengl.GL11; - -@SideOnly(Side.CLIENT) -public class RenderBloodTank extends TileEntityRenderer { - private static final Minecraft mc = Minecraft.getInstance(); - - @Override - public void render(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - if (bloodTank == null) - return; - - Fluid renderFluid = bloodTank.getClientRenderFluid(); - if (bloodTank.getRenderHeight() == 0 || renderFluid == null) - return; - - GlStateManager.pushMatrix(); - - bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - - renderFluid(bloodTank.getRenderHeight(), renderFluid, x, y, z); - - GlStateManager.popMatrix(); - } - - public void renderFluid(float maxHeight, Fluid renderFluid, double x, double y, double z) { - maxHeight = maxHeight * 0.575F; - - GlStateManager.translate(x, y, z); - RenderHelper.disableStandardItemLighting(); - - GlStateManager.disableRescaleNormal(); - GlStateManager.disableBlend(); - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder buffer = tessellator.getBuffer(); - - TextureAtlasSprite fluid = Minecraft.getInstance().getTextureMapBlocks().getAtlasSprite(renderFluid.getStill().toString()); - fluid = fluid == null ? mc.getTextureMapBlocks().getMissingSprite() : fluid; - - buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); - - final int rgbaColor = renderFluid.getColor(); - final int rColor = rgbaColor >> 16 & 0xFF; - final int gColor = rgbaColor >> 8 & 0xFF; - final int bColor = rgbaColor & 0xFF; - final int aColor = rgbaColor >> 24 & 0xFF; - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GlStateManager.color(rColor, gColor, bColor, aColor); - - float u1 = fluid.getMinU(); - float v1 = fluid.getMinV(); - float u2 = fluid.getMaxU(); - float v2 = fluid.getMaxV(); - - if (maxHeight > 0) { - float texWidth = u2 - u1; - - // TOP - buffer.pos(0.25, maxHeight + 0.05, 0.25).tex(u1 + 0.75 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, maxHeight + 0.05, 0.75).tex(u1 + 0.75 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, maxHeight + 0.05, 0.75).tex(u1 + 0.25 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, maxHeight + 0.05, 0.25).tex(u1 + 0.25 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - - // NORTH - buffer.pos(0.75, maxHeight + 0.05, 0.25).tex(u1 + 0.75 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, 0, 0.25).tex(u1 + 0.75 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, 0, 0.25).tex(u1 + 0.25 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, maxHeight + 0.05, 0.25).tex(u1 + 0.25 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - - // EAST - buffer.pos(0.25, 0, 0.75).tex(u1 + 0.75 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, maxHeight + 0.05, 0.75).tex(u1 + 0.75 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, maxHeight + 0.05, 0.25).tex(u1 + 0.25 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, 0, 0.25).tex(u1 + 0.25 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - - // SOUTH - buffer.pos(0.75, 0, 0.75).tex(u1 + 0.75 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, maxHeight + 0.05, 0.75).tex(u1 + 0.75 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, maxHeight + 0.05, 0.75).tex(u1 + 0.25 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.25, 0, 0.75).tex(u1 + 0.25 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - - // WEST - buffer.pos(0.75, maxHeight + 0.05, 0.75).tex(u1 + 0.75 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, 0, 0.75).tex(u1 + 0.75 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, 0, 0.25).tex(u1 + 0.25 * texWidth, v1).color(rColor, gColor, bColor, aColor).endVertex(); - buffer.pos(0.75, maxHeight + 0.05, 0.25).tex(u1 + 0.25 * texWidth, v1 + (maxHeight + 0.05) * texWidth).color(rColor, gColor, bColor, aColor).endVertex(); - } - - tessellator.draw(); - - RenderHelper.enableStandardItemLighting(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java deleted file mode 100644 index c69a2053..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderDemonCrucible.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.client.render.block; - -import WayofTime.bloodmagic.tile.TileDemonCrucible; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; - -public class RenderDemonCrucible extends TileEntityRenderer { - public static Minecraft mc = Minecraft.getInstance(); - public static ResourceLocation resource = new ResourceLocation("bloodmagic", "textures/blocks/lifeEssenceStill.png"); - public static float minHeight = 0.6497f; - public static float maxHeight = 0.79f; - - @Override - public void render(TileDemonCrucible tile, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - ItemStack inputStack = tile.getStackInSlot(0); - - GlStateManager.pushMatrix(); - GlStateManager.translate(x, y, z); - this.renderItem(tile.getWorld(), inputStack, partialTicks); - GlStateManager.popMatrix(); - } - - private void renderItem(World world, ItemStack stack, float partialTicks) { - ItemRenderer itemRenderer = mc.getRenderItem(); - if (!stack.isEmpty()) { - GlStateManager.translate(0.5, 1.5, 0.5); - ItemEntity entityitem = new ItemEntity(world, 0.0D, 0.0D, 0.0D, stack); - entityitem.getItem().setCount(1); - entityitem.hoverStart = 0.0F; - GlStateManager.pushMatrix(); - GlStateManager.disableLighting(); - - float rotation = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); - - GlStateManager.rotate(rotation, 0.0F, 1.0F, 0); - GlStateManager.scale(0.5F, 0.5F, 0.5F); - GlStateManager.pushAttrib(); - RenderHelper.enableStandardItemLighting(); - itemRenderer.renderItem(entityitem.getItem(), ItemCameraTransforms.TransformType.FIXED); - RenderHelper.disableStandardItemLighting(); - GlStateManager.popAttrib(); - - GlStateManager.enableLighting(); - GlStateManager.popMatrix(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java deleted file mode 100644 index 331fc733..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderFakeBlocks.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.client.render.block; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import org.lwjgl.opengl.GL11; - -public class RenderFakeBlocks { - public static void drawFakeBlock(TextureAtlasSprite texture, double minX, double minY, double minZ) { - if (texture == null) - return; - - double maxX = minX + 1; - double maxY = minY + 1; - double maxZ = minZ + 1; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - Minecraft.getInstance().renderEngine.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - - wr.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); - - float texMinU = texture.getMinU(); - float texMinV = texture.getMinV(); - float texMaxU = texture.getMaxU(); - float texMaxV = texture.getMaxV(); - - wr.pos(minX, minY, minZ).tex(texMinU, texMinV).endVertex(); - wr.pos(maxX, minY, minZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(maxX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(minX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); - - wr.pos(minX, maxY, maxZ).tex(texMinU, texMaxV).endVertex(); - wr.pos(maxX, maxY, maxZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(maxX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(minX, maxY, minZ).tex(texMinU, texMinV).endVertex(); - - wr.pos(maxX, minY, minZ).tex(texMinU, texMaxV).endVertex(); - wr.pos(minX, minY, minZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(minX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(maxX, maxY, minZ).tex(texMinU, texMinV).endVertex(); - - wr.pos(minX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); - wr.pos(maxX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(maxX, maxY, maxZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(minX, maxY, maxZ).tex(texMinU, texMinV).endVertex(); - - wr.pos(minX, minY, minZ).tex(texMinU, texMaxV).endVertex(); - wr.pos(minX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(minX, maxY, maxZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(minX, maxY, minZ).tex(texMinU, texMinV).endVertex(); - - wr.pos(maxX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); - wr.pos(maxX, minY, minZ).tex(texMaxU, texMaxV).endVertex(); - wr.pos(maxX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); - wr.pos(maxX, maxY, maxZ).tex(texMinU, texMinV).endVertex(); - - tessellator.draw(); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java deleted file mode 100644 index 9fa0fccb..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderItemRoutingNode.java +++ /dev/null @@ -1,110 +0,0 @@ -package WayofTime.bloodmagic.client.render.block; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.iface.INodeRenderer; -import WayofTime.bloodmagic.client.helper.ShaderHelper; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import org.lwjgl.opengl.GL11; - -import java.util.List; - -public class RenderItemRoutingNode extends TileEntityRenderer { - private static final ResourceLocation beamTexture = new ResourceLocation(BloodMagic.MODID, "textures/entities/nodeBeam.png"); - private static final Minecraft mc = Minecraft.getInstance(); - - @Override - public void render(TileRoutingNode tileNode, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - if (mc.player.getHeldItemMainhand().getItem() instanceof INodeRenderer || ConfigHandler.client.alwaysRenderRoutingLines) { - List connectionList = tileNode.getConnected(); - for (BlockPos wantedPos : connectionList) { - BlockPos offsetPos = wantedPos.subtract(tileNode.getPos()); - - //The beam renders towards the east by default. - - int xd = offsetPos.getX(); - int yd = offsetPos.getY(); - int zd = offsetPos.getZ(); - double distance = Math.sqrt(xd * xd + yd * yd + zd * zd); - double subLength = MathHelper.sqrt(xd * xd + zd * zd); - float rotYaw = -((float) (Math.atan2(zd, xd) * 180.0D / Math.PI)); - float rotPitch = ((float) (Math.atan2(yd, subLength) * 180.0D / Math.PI)); - - GlStateManager.pushMatrix(); - float f1 = 1.0f; - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - this.bindTexture(beamTexture); - GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, 10497.0F); - GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, 10497.0F); - GlStateManager.disableLighting(); - GlStateManager.disableCull(); - float f2 = 0; - float f3 = -f2 * 0.2F - (float) MathHelper.floor(-f2 * 0.1F); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - - double width = 0.06; - - float test = (tileNode.getWorld().getTotalWorldTime() + partialTicks) / 5f; - - double d18 = -width / 2; - double d19 = -width / 2; - double d20 = width / 2; - double d21 = -width / 2; - double d22 = -width / 2; - double d23 = width / 2; - double d24 = width / 2; - double d25 = width / 2; - double d26 = distance * f1; - double d27 = 0.0D; - double d28 = 1.0D; - double d29 = (double) (f3) + test; - double d30 = distance * f1 + d29; - - GlStateManager.translate(x + 0.5, y + 0.5, z + 0.5); - - GlStateManager.rotate(rotYaw, 0, 1, 0); - GlStateManager.rotate(rotPitch, 0, 0, 1); - -// tessellator.setBrightness(240); -// float s = 1F / 16F; - wr.begin(7, DefaultVertexFormats.POSITION_TEX); -// tessellator.setColorRGBA(255, 255, 255, 100); - wr.pos(d26, d18, d19).tex(d28, d30).endVertex(); - wr.pos(0, d18, d19).tex(d28, d29).endVertex(); - wr.pos(0, d20, d21).tex(d27, d29).endVertex(); - wr.pos(d26, d20, d21).tex(d27, d30).endVertex(); - wr.pos(d26, d24, d25).tex(d28, d30).endVertex(); - wr.pos(0, d24, d25).tex(d28, d29).endVertex(); - wr.pos(0, d22, d23).tex(d27, d29).endVertex(); - wr.pos(d26, d22, d23).tex(d27, d30).endVertex(); - wr.pos(d26, d20, d21).tex(d28, d30).endVertex(); - wr.pos(0, d20, d21).tex(d28, d29).endVertex(); - wr.pos(0, d24, d25).tex(d27, d29).endVertex(); - wr.pos(d26, d24, d25).tex(d27, d30).endVertex(); - wr.pos(d26, d22, d23).tex(d28, d30).endVertex(); - wr.pos(0, d22, d23).tex(d28, d29).endVertex(); - wr.pos(0, d18, d19).tex(d27, d29).endVertex(); - wr.pos(d26, d18, d19).tex(d27, d30).endVertex(); - - ShaderHelper.useShader(ShaderHelper.psiBar, (int) tileNode.getWorld().getTotalWorldTime()); - tessellator.draw(); - ShaderHelper.releaseShader(); - - GlStateManager.enableLighting(); - GlStateManager.enableTexture2D(); - GlStateManager.popMatrix(); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java deleted file mode 100644 index b4b6f66d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/block/RenderMimic.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.client.render.block; - -import WayofTime.bloodmagic.tile.TileMimic; -import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.client.renderer.tileentity.TileEntityRenderer; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderMimic extends TileEntityRenderer { - public void render(TileMimic mimic, double x, double y, double z, float partialTicks, int destroyStage, float alpha) { - if (mimic.getStackInSlot(0) != null) { - TileEntity testTile = mimic.mimicedTile; - if (mimic != null) { - TileEntityRendererDispatcher.instance.render(testTile, x, y, z, partialTicks, destroyStage); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java deleted file mode 100644 index 272972c9..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/BloodLightRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class BloodLightRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderEntityBloodLight(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java deleted file mode 100644 index 59944834..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedChickenRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class CorruptedChickenRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderCorruptedChicken(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java deleted file mode 100644 index 35c041ba..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSheepRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class CorruptedSheepRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderCorruptedSheep(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java deleted file mode 100644 index 51ced8ba..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedSpiderRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class CorruptedSpiderRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderCorruptedSpider(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java deleted file mode 100644 index 3532162d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/CorruptedZombieRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class CorruptedZombieRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderCorruptedZombie(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java deleted file mode 100644 index 50c24346..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MeteorRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class MeteorRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderEntityMeteor(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java deleted file mode 100644 index 6fb47c9a..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/MimicRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class MimicRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderEntityMimic(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java deleted file mode 100644 index 10c028e3..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedChicken.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedChicken; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderCorruptedChicken extends MobRenderer { - private static final ResourceLocation CHICKEN_TEXTURES = new ResourceLocation("textures/entity/chicken.png"); - - public RenderCorruptedChicken(EntityRendererManager renderManagerIn) { - super(renderManagerIn, new ModelCorruptedChicken(0), 0.3f); - this.addLayer(new LayerWill<>(this, new ModelCorruptedChicken(1.1f))); - } - - @Override - protected ResourceLocation getEntityTexture(EntityCorruptedChicken entity) { - return CHICKEN_TEXTURES; - } - - @Override - protected float handleRotationFloat(EntityCorruptedChicken livingBase, float partialTicks) { - float f = livingBase.oFlap + (livingBase.wingRotation - livingBase.oFlap) * partialTicks; - float f1 = livingBase.oFlapSpeed + (livingBase.destPos - livingBase.oFlapSpeed) * partialTicks; - return (MathHelper.sin(f) + 1.0F) * f1; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java deleted file mode 100644 index 744c1e78..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSheep.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.client.render.entity.layer.LayerAlchemyCircle; -import WayofTime.bloodmagic.client.render.entity.layer.LayerCorruptedSheepWool; -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedSheep; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedSheep2; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderCorruptedSheep extends MobRenderer { - private static final ResourceLocation SHEARED_SHEEP_TEXTURES = new ResourceLocation("textures/entity/sheep/sheep.png"); - - public RenderCorruptedSheep(EntityRendererManager renderManagerIn) { - super(renderManagerIn, new ModelCorruptedSheep2(0), 0.7F); - this.addLayer(new LayerCorruptedSheepWool(this)); - this.addLayer(new LayerWill<>(this, new ModelCorruptedSheep(1.1f))); - this.addLayer(new LayerWill<>(this, new ModelCorruptedSheep2(1.1f))); - this.addLayer(new LayerAlchemyCircle<>()); - } - - @Override - protected ResourceLocation getEntityTexture(EntityCorruptedSheep entity) { - return SHEARED_SHEEP_TEXTURES; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java deleted file mode 100644 index e57c3094..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedSpider.java +++ /dev/null @@ -1,35 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.client.render.entity.layer.LayerCorruptedSpiderEyes; -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedSpider; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import net.minecraft.client.model.ModelSpider; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderCorruptedSpider extends MobRenderer { - private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); - - public RenderCorruptedSpider(EntityRendererManager renderManagerIn) { - super(renderManagerIn, new ModelSpider(), 1.0F); - this.addLayer(new LayerCorruptedSpiderEyes(this)); - this.addLayer(new LayerWill<>(this, new ModelCorruptedSpider(1.1f))); - } - - protected float getDeathMaxRotation(EntityCorruptedSpider entityLivingBaseIn) { - return 180.0F; - } - - /** - * Returns the location of an entity's texture. Doesn't seem to be called - * unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityCorruptedSpider entity) { - return SPIDER_TEXTURES; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java deleted file mode 100644 index cc4bfdb3..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderCorruptedZombie.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.client.render.entity.layer.LayerWill; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedZombie; -import net.minecraft.client.model.ModelZombie; -import net.minecraft.client.model.ModelZombieVillager; -import net.minecraft.client.renderer.entity.BipedRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.entity.layers.*; -import net.minecraft.client.renderer.entity.layers.BipedArmorLayer; -import net.minecraft.client.renderer.entity.layers.HeldItemLayer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderCorruptedZombie extends BipedRenderer { - private static final ResourceLocation ZOMBIE_TEXTURES = new ResourceLocation("textures/entity/zombie/zombie.png"); - private final ModelZombieVillager zombieVillagerModel; - - public RenderCorruptedZombie(EntityRendererManager renderManagerIn) { - super(renderManagerIn, new ModelZombie(), 0.5F); - LayerRenderer layerrenderer = this.layerRenderers.get(0); - this.zombieVillagerModel = new ModelZombieVillager(); - this.addLayer(new HeldItemLayer(this)); - BipedArmorLayer layerbipedarmor = new BipedArmorLayer(this) { - protected void initArmor() { - this.modelLeggings = new ModelZombie(0.5F, true); - this.modelArmor = new ModelZombie(1.0F, true); - } - }; - this.addLayer(layerbipedarmor); - - if (layerrenderer instanceof HeadLayer) { - layerRenderers.remove(layerrenderer); - this.addLayer(new HeadLayer(this.zombieVillagerModel.bipedHead)); - } - - this.layerRenderers.remove(layerbipedarmor); - this.addLayer(new LayerWill<>(this, new ModelZombie(1.2f, false))); - } - - /** - * Allows the render to do state modifications necessary before the model is - * rendered. - */ - protected void preRenderCallback(EntityCorruptedZombie entitylivingbaseIn, float partialTickTime) { - super.preRenderCallback(entitylivingbaseIn, partialTickTime); - } - - /** - * Renders the desired {@code T} type Entity. - */ - public void doRender(EntityCorruptedZombie entity, double x, double y, double z, float entityYaw, float partialTicks) { - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - /** - * Returns the location of an entity's texture. Doesn't seem to be called - * unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntityCorruptedZombie entity) { - return ZOMBIE_TEXTURES; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java deleted file mode 100644 index 8a6c56f2..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityBloodLight.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.util.ResourceLocation; - -public class RenderEntityBloodLight extends EntityRenderer { - private final ItemRenderer renderItem = Minecraft.getInstance().getRenderItem(); - - public RenderEntityBloodLight(EntityRendererManager renderManagerIn) { - super(renderManagerIn); - } - - public void doRender(EntityBloodLight entity, double x, double y, double z, float entityYaw, float partialTicks) { - GlStateManager.pushMatrix(); - GlStateManager.translate((float) x, (float) y, (float) z); - GlStateManager.enableRescaleNormal(); - GlStateManager.scale(0.5F, 0.5F, 0.5F); - GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); - this.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - this.renderItem.renderItem(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), ItemCameraTransforms.TransformType.GROUND); - GlStateManager.disableRescaleNormal(); - GlStateManager.popMatrix(); - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - protected ResourceLocation getEntityTexture(EntityBloodLight entity) { - return AtlasTexture.LOCATION_BLOCKS_TEXTURE; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java deleted file mode 100644 index e9752d3d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMeteor.java +++ /dev/null @@ -1,41 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.render.model.ModelMeteor; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.util.ResourceLocation; - -public class RenderEntityMeteor extends EntityRenderer { - - private static final ResourceLocation TEXTURE = new ResourceLocation(BloodMagic.MODID, "textures/models/Meteor.png"); - private static final float SCALE = 1; - - public ModelBase model = new ModelMeteor(); - - public RenderEntityMeteor(EntityRendererManager renderManagerIn) { - super(renderManagerIn); - } - - @Override - public void doRender(EntityMeteor entity, double x, double y, double z, float entityYaw, float partialTicks) { - GlStateManager.pushMatrix(); - GlStateManager.translate((float) x, (float) y, (float) z); - GlStateManager.enableRescaleNormal(); - GlStateManager.scale(SCALE, SCALE, SCALE); - this.bindTexture(TEXTURE); - model.render(entity, 0, (float) x, (float) y, (float) z, entityYaw, partialTicks); - GlStateManager.disableRescaleNormal(); - GlStateManager.popMatrix(); - - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - @Override - protected ResourceLocation getEntityTexture(EntityMeteor entity) { - return TEXTURE; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java deleted file mode 100644 index 9ef06886..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntityMimic.java +++ /dev/null @@ -1,117 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.client.render.model.ModelMimic; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import com.mojang.authlib.GameProfile; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.tileentity.SkullTileEntityRenderer; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.Items; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.SkullTileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.StringUtils; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderEntityMimic extends MobRenderer { - private static final ResourceLocation SPIDER_TEXTURES = new ResourceLocation("textures/entity/spider/spider.png"); - Minecraft minecraft = Minecraft.getInstance(); - - public RenderEntityMimic(EntityRendererManager renderManagerIn) { - super(renderManagerIn, new ModelMimic(), 1.0F); - } - - @Override - public void doRender(EntityMimic mimic, double x, double y, double z, float entityYaw, float partialTicks) { - super.doRender(mimic, x, y, z, entityYaw, partialTicks); - - GlStateManager.pushMatrix(); - if (mimic.getMimicItemStack() != null) { - GlStateManager.pushMatrix(); - - if (this.renderOutlines) { - GlStateManager.enableColorMaterial(); - GlStateManager.enableOutlineMode(this.getTeamColor(mimic)); - } - - GlStateManager.translate(x, y, z); - - ItemStack itemstack = mimic.getMimicItemStack(); - Item item = itemstack.getItem(); - Minecraft minecraft = Minecraft.getInstance(); - GlStateManager.pushMatrix(); - - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - - if (item == Items.SKULL) { - float f2 = 1.1875F; - GlStateManager.scale(1.1875F, -1.1875F, -1.1875F); - - GameProfile gameprofile = null; - - if (itemstack.hasTagCompound()) { - CompoundNBT nbttagcompound = itemstack.getTagCompound(); - - if (nbttagcompound.hasKey("SkullOwner", 10)) { - gameprofile = NBTUtil.readGameProfileFromNBT(nbttagcompound.getCompoundTag("SkullOwner")); - } else if (nbttagcompound.hasKey("SkullOwner", 8)) { - String s = nbttagcompound.getString("SkullOwner"); - - if (!StringUtils.isNullOrEmpty(s)) { - gameprofile = SkullTileEntity.updateGameProfile(new GameProfile(null, s)); - nbttagcompound.putTag("SkullOwner", NBTUtil.writeGameProfile(new CompoundNBT(), gameprofile)); - } - } - } - - SkullTileEntityRenderer.instance.renderSkull(-0.5F, 0.0F, -0.5F, Direction.UP, 180.0F, itemstack.getMetadata(), gameprofile, -1, 0); - } else if (!(item instanceof ArmorItem) || ((ArmorItem) item).getEquipmentSlot() != EquipmentSlotType.HEAD) { - GlStateManager.translate(0, 0.5f, 0); - GlStateManager.rotate(-(mimic.prevRotationYawHead + partialTicks * (mimic.rotationYawHead - mimic.prevRotationYawHead)) - 180, 0, 1, 0); - - minecraft.getItemRenderer().renderItem(mimic, itemstack, ItemCameraTransforms.TransformType.HEAD); - } - - GlStateManager.popMatrix(); - - if (this.renderOutlines) { - GlStateManager.disableOutlineMode(); - GlStateManager.disableColorMaterial(); - } - - GlStateManager.popMatrix(); - super.doRender(mimic, x, y, z, entityYaw, partialTicks); - - } - GlStateManager.popMatrix(); - - if (!this.renderOutlines) { - this.renderLeash(mimic, x, y, z, entityYaw, partialTicks); - } - } - - @Override - protected float getDeathMaxRotation(EntityMimic mimic) { - return 180.0F; - } - - /** - * Returns the location of an entity's texture. Doesn't seem to be called - * unless you call Render.bindEntityTexture. - */ - @Override - protected ResourceLocation getEntityTexture(EntityMimic mimic) { - return SPIDER_TEXTURES; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java deleted file mode 100644 index 53721ceb..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySentientArrow.java +++ /dev/null @@ -1,108 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.opengl.GL11; - -@SideOnly(Side.CLIENT) -public class RenderEntitySentientArrow extends EntityRenderer { - private static final ResourceLocation defaultTexture = new ResourceLocation("bloodmagic:textures/entities/soulArrow.png"); - private static final ResourceLocation corrosiveTexture = new ResourceLocation("bloodmagic:textures/entities/soulArrow_corrosive.png"); - private static final ResourceLocation vengefulTexture = new ResourceLocation("bloodmagic:textures/entities/soulArrow_vengeful.png"); - private static final ResourceLocation destructiveTexture = new ResourceLocation("bloodmagic:textures/entities/soulArrow_destructive.png"); - private static final ResourceLocation steadfastTexture = new ResourceLocation("bloodmagic:textures/entities/soulArrow_steadfast.png"); - - public RenderEntitySentientArrow(EntityRendererManager renderManagerIn) { - super(renderManagerIn); - } - - public void doRender(EntitySentientArrow entity, double x, double y, double z, float entityYaw, float partialTicks) { - this.bindEntityTexture(entity); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.pushMatrix(); - GlStateManager.translate((float) x, (float) y, (float) z); - GlStateManager.rotate(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * partialTicks - 90.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * partialTicks, 0.0F, 0.0F, 1.0F); - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder worldrenderer = tessellator.getBuffer(); - int i = 0; - float f = 0.0F; - float f1 = 0.5F; - float f2 = (float) (i * 10) / 32.0F; - float f3 = (float) (5 + i * 10) / 32.0F; - float f4 = 0.0F; - float f5 = 0.15625F; - float f6 = (float) (5 + i * 10) / 32.0F; - float f7 = (float) (10 + i * 10) / 32.0F; - float f8 = 0.05625F; - GlStateManager.enableRescaleNormal(); - float f9 = (float) entity.arrowShake - partialTicks; - - if (f9 > 0.0F) { - float f10 = -MathHelper.sin(f9 * 3.0F) * f9; - GlStateManager.rotate(f10, 0.0F, 0.0F, 1.0F); - } - - GlStateManager.rotate(45.0F, 1.0F, 0.0F, 0.0F); - GlStateManager.scale(f8, f8, f8); - GlStateManager.translate(-4.0F, 0.0F, 0.0F); - GL11.glNormal3f(f8, 0.0F, 0.0F); - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); - worldrenderer.pos(-7.0D, -2.0D, -2.0D).tex((double) f4, (double) f6).endVertex(); - worldrenderer.pos(-7.0D, -2.0D, 2.0D).tex((double) f5, (double) f6).endVertex(); - worldrenderer.pos(-7.0D, 2.0D, 2.0D).tex((double) f5, (double) f7).endVertex(); - worldrenderer.pos(-7.0D, 2.0D, -2.0D).tex((double) f4, (double) f7).endVertex(); - tessellator.draw(); - GL11.glNormal3f(-f8, 0.0F, 0.0F); - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); - worldrenderer.pos(-7.0D, 2.0D, -2.0D).tex((double) f4, (double) f6).endVertex(); - worldrenderer.pos(-7.0D, 2.0D, 2.0D).tex((double) f5, (double) f6).endVertex(); - worldrenderer.pos(-7.0D, -2.0D, 2.0D).tex((double) f5, (double) f7).endVertex(); - worldrenderer.pos(-7.0D, -2.0D, -2.0D).tex((double) f4, (double) f7).endVertex(); - tessellator.draw(); - - for (int j = 0; j < 4; ++j) { - GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F); - GL11.glNormal3f(0.0F, 0.0F, f8); - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); - worldrenderer.pos(-8.0D, -2.0D, 0.0D).tex((double) f, (double) f2).endVertex(); - worldrenderer.pos(8.0D, -2.0D, 0.0D).tex((double) f1, (double) f2).endVertex(); - worldrenderer.pos(8.0D, 2.0D, 0.0D).tex((double) f1, (double) f3).endVertex(); - worldrenderer.pos(-8.0D, 2.0D, 0.0D).tex((double) f, (double) f3).endVertex(); - tessellator.draw(); - } - - GlStateManager.disableRescaleNormal(); - GlStateManager.popMatrix(); - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - /** - * Returns the location of an entity's texture. Doesn't seem to be called - * unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntitySentientArrow entity) { - switch (entity.type) { - case CORROSIVE: - return corrosiveTexture; - case DESTRUCTIVE: - return destructiveTexture; - case STEADFAST: - return steadfastTexture; - case VENGEFUL: - return vengefulTexture; - case DEFAULT: - default: - return defaultTexture; - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java deleted file mode 100644 index 783d68d4..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderEntitySoulSnare.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.ItemRenderer; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -public class RenderEntitySoulSnare extends EntityRenderer { - private final ItemRenderer renderItem = Minecraft.getInstance().getRenderItem(); - - public RenderEntitySoulSnare(EntityRendererManager renderManagerIn) { - super(renderManagerIn); - } - - public void doRender(EntitySoulSnare entity, double x, double y, double z, float entityYaw, float partialTicks) { - GlStateManager.pushMatrix(); - GlStateManager.translate((float) x, (float) y, (float) z); - GlStateManager.enableRescaleNormal(); - GlStateManager.scale(0.5F, 0.5F, 0.5F); - GlStateManager.rotate(-this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate(this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); - this.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); - this.renderItem.renderItem(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE), ItemCameraTransforms.TransformType.GROUND); - GlStateManager.disableRescaleNormal(); - GlStateManager.popMatrix(); - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - protected ResourceLocation getEntityTexture(EntitySoulSnare entity) { - return AtlasTexture.LOCATION_BLOCKS_TEXTURE; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java deleted file mode 100644 index 1275180d..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/RenderSentientSpecter.java +++ /dev/null @@ -1,110 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import net.minecraft.client.model.ModelBiped; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.BipedRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.entity.layers.*; -import net.minecraft.client.renderer.entity.layers.BipedArmorLayer; -import net.minecraft.client.renderer.entity.layers.HeadLayer; -import net.minecraft.client.renderer.entity.layers.HeldItemLayer; -import net.minecraft.item.UseAction; -import net.minecraft.item.ItemStack; -import net.minecraft.util.HandSide; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class RenderSentientSpecter extends BipedRenderer { - public static final ResourceLocation texture = new ResourceLocation("bloodmagic", "textures/entities/specter.png"); - - public RenderSentientSpecter(EntityRendererManager renderManager) { - super(renderManager, new ModelBiped(0.0F), 0); - this.addLayer(new BipedArmorLayer(this)); - this.addLayer(new HeldItemLayer(this)); - this.addLayer(new ArrowLayer(this)); - this.addLayer(new HeadLayer(this.getMainModel().bipedHead)); - } - - public ModelBiped getMainModel() { - return (ModelBiped) super.getMainModel(); - } - - /** - * Renders the desired {@code T} type Entity. - */ - public void doRender(EntitySentientSpecter entity, double x, double y, double z, float entityYaw, float partialTicks) { - this.setModelVisibilities(entity); - super.doRender(entity, x, y, z, entityYaw, partialTicks); - } - - private void setModelVisibilities(EntitySentientSpecter clientPlayer) { - ModelBiped modelplayer = this.getMainModel(); - - ItemStack itemstack = clientPlayer.getHeldItemMainhand(); - ItemStack itemstack1 = clientPlayer.getHeldItemOffhand(); - modelplayer.setVisible(false); - - modelplayer.isSneak = clientPlayer.isSneaking(); - ModelBiped.ArmPose modelbiped$armpose = ModelBiped.ArmPose.EMPTY; - ModelBiped.ArmPose modelbiped$armpose1 = ModelBiped.ArmPose.EMPTY; - - if (!itemstack.isEmpty()) { - modelbiped$armpose = ModelBiped.ArmPose.ITEM; - - if (clientPlayer.getItemInUseCount() > 0) { - UseAction enumaction = itemstack.getItemUseAction(); - - if (enumaction == UseAction.BLOCK) { - modelbiped$armpose = ModelBiped.ArmPose.BLOCK; - } else if (enumaction == UseAction.BOW) { - modelbiped$armpose = ModelBiped.ArmPose.BOW_AND_ARROW; - } - } - } - - if (!itemstack1.isEmpty()) { - modelbiped$armpose1 = ModelBiped.ArmPose.ITEM; - - if (clientPlayer.getItemInUseCount() > 0) { - UseAction enumaction1 = itemstack1.getItemUseAction(); - - if (enumaction1 == UseAction.BLOCK) { - modelbiped$armpose1 = ModelBiped.ArmPose.BLOCK; - } - } - } - - if (clientPlayer.getPrimaryHand() == HandSide.RIGHT) { - modelplayer.rightArmPose = modelbiped$armpose; - modelplayer.leftArmPose = modelbiped$armpose1; - } else { - modelplayer.rightArmPose = modelbiped$armpose1; - modelplayer.leftArmPose = modelbiped$armpose; - } - - } - - /** - * Returns the location of an entity's texture. Doesn't seem to be called - * unless you call Render.bindEntityTexture. - */ - protected ResourceLocation getEntityTexture(EntitySentientSpecter entity) { - return texture; - } - - public void transformHeldFull3DItemLayer() { - GlStateManager.translate(0.0F, 0.1875F, 0.0F); - } - - /** - * Allows the render to do state modifications necessary before the model is - * rendered. - */ - protected void preRenderCallback(EntitySentientSpecter entitylivingbaseIn, float partialTickTime) { - float f = 0.9375F; - GlStateManager.scale(0.9375F, 0.9375F, 0.9375F); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java deleted file mode 100644 index 15003afb..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientArrowRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class SentientArrowRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderEntitySentientArrow(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java deleted file mode 100644 index 0048ddcb..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SentientSpecterRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class SentientSpecterRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderSentientSpecter(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java deleted file mode 100644 index cada7206..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/SoulSnareRenderFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity; - -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraftforge.fml.client.registry.IRenderFactory; - -public class SoulSnareRenderFactory implements IRenderFactory { - @Override - public EntityRenderer createRenderFor(EntityRendererManager manager) { - return new RenderEntitySoulSnare(manager); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java deleted file mode 100644 index d818f024..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerAlchemyCircle.java +++ /dev/null @@ -1,82 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity.layer; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class LayerAlchemyCircle implements LayerRenderer { - private static final ResourceLocation ARRAY_TEXTURE = new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"); - - float rotationspeed = 10; - - public LayerAlchemyCircle() { - - } - - @Override - public void doRenderLayer(EntityCorruptedSheep demon, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - if (demon.getCastTimer() <= 0) { - return; - } - - Tessellator tessellator = Tessellator.getInstance(); - BufferBuilder wr = tessellator.getBuffer(); - - GlStateManager.pushMatrix(); - float rot = this.rotationspeed * (partialTicks + demon.ticksExisted); - float secondaryRot = 0; - - float size = 3.0F; - - // Bind the texture to the circle - Minecraft.getInstance().renderEngine.bindTexture(ARRAY_TEXTURE); - - GlStateManager.disableCull(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 1); - GlStateManager.translate(0, 1.5, 0); - GlStateManager.rotate(90.0f, 1, 0, 0); - - GlStateManager.pushMatrix(); -// GlStateManager.translate(0, 0.5f, 0); - - GlStateManager.pushMatrix(); - GlStateManager.rotate(rot, 0, 0, 1); - GlStateManager.rotate(secondaryRot, 1, 0, 0); - GlStateManager.rotate(secondaryRot * 0.45812f, 0, 0, 1); - double var31 = 0.0D; - double var33 = 1.0D; - double var35 = 0; - double var37 = 1; - - GlStateManager.color(1f, 1f, 1f, 1f); - wr.begin(7, DefaultVertexFormats.POSITION_TEX); - // wr.setBrightness(200); - wr.pos(size / 2f, size / 2f, 0.0D).tex(var33, var37).endVertex(); - wr.pos(size / 2f, -size / 2f, 0.0D).tex(var33, var35).endVertex(); - wr.pos(-size / 2f, -size / 2f, 0.0D).tex(var31, var35).endVertex(); - wr.pos(-size / 2f, size / 2f, 0.0D).tex(var31, var37).endVertex(); - tessellator.draw(); - - GlStateManager.popMatrix(); - - GlStateManager.disableBlend(); - GlStateManager.enableCull(); - - GlStateManager.popMatrix(); - GlStateManager.popMatrix(); - } - - @Override - public boolean shouldCombineTextures() { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java deleted file mode 100644 index e95e027e..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSheepWool.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity.layer; - -import WayofTime.bloodmagic.client.render.entity.RenderCorruptedSheep; -import WayofTime.bloodmagic.client.render.model.ModelCorruptedSheep; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.item.DyeColor; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class LayerCorruptedSheepWool implements LayerRenderer { - private static final ResourceLocation TEXTURE = new ResourceLocation("textures/entity/sheep/sheep_fur.png"); - private final RenderCorruptedSheep sheepRenderer; - private final ModelCorruptedSheep sheepModel = new ModelCorruptedSheep(1); - - public LayerCorruptedSheepWool(RenderCorruptedSheep renderCorruptedSheep) { - this.sheepRenderer = renderCorruptedSheep; - } - - public void doRenderLayer(EntityCorruptedSheep entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - if (!entitylivingbaseIn.getSheared() && !entitylivingbaseIn.isInvisible()) { - this.sheepRenderer.bindTexture(TEXTURE); - - if (entitylivingbaseIn.hasCustomName() && "jeb_".equals(entitylivingbaseIn.getCustomNameTag())) { - int i1 = 25; - int i = entitylivingbaseIn.ticksExisted / 25 + entitylivingbaseIn.getEntityId(); - int j = DyeColor.values().length; - int k = i % j; - int l = (i + 1) % j; - float f = ((float) (entitylivingbaseIn.ticksExisted % 25) + partialTicks) / 25.0F; - float[] afloat1 = EntityCorruptedSheep.getDyeRgb(DyeColor.byMetadata(k)); - float[] afloat2 = EntityCorruptedSheep.getDyeRgb(DyeColor.byMetadata(l)); - GlStateManager.color(afloat1[0] * (1.0F - f) + afloat2[0] * f, afloat1[1] * (1.0F - f) + afloat2[1] * f, afloat1[2] * (1.0F - f) + afloat2[2] * f); - } else { - float[] afloat = EntityCorruptedSheep.getDyeRgb(entitylivingbaseIn.getFleeceColor()); - GlStateManager.color(afloat[0], afloat[1], afloat[2]); - } - - this.sheepModel.setModelAttributes(this.sheepRenderer.getMainModel()); - this.sheepModel.setLivingAnimations(entitylivingbaseIn, limbSwing, limbSwingAmount, partialTicks); - this.sheepModel.render(entitylivingbaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); - } - } - - public boolean shouldCombineTextures() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java deleted file mode 100644 index 3d975c05..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerCorruptedSpiderEyes.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity.layer; - -import WayofTime.bloodmagic.client.render.entity.RenderCorruptedSpider; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSpider; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class LayerCorruptedSpiderEyes implements LayerRenderer { - private static final ResourceLocation SPIDER_EYES = new ResourceLocation("textures/entity/spider_eyes.png"); - private final RenderCorruptedSpider spiderRenderer; - - public LayerCorruptedSpiderEyes(RenderCorruptedSpider spiderRendererIn) { - this.spiderRenderer = spiderRendererIn; - } - - public void doRenderLayer(EntityCorruptedSpider entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - this.spiderRenderer.bindTexture(SPIDER_EYES); - GlStateManager.enableBlend(); - GlStateManager.disableAlpha(); - GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - - if (entitylivingbaseIn.isInvisible()) { - GlStateManager.depthMask(false); - } else { - GlStateManager.depthMask(true); - } - - int i = 61680; - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j, (float) k); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.spiderRenderer.getMainModel().render(entitylivingbaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); - i = entitylivingbaseIn.getBrightnessForRender(); - j = i % 65536; - k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j, (float) k); - this.spiderRenderer.setLightmap(entitylivingbaseIn); - GlStateManager.disableBlend(); - GlStateManager.enableAlpha(); - } - - public boolean shouldCombineTextures() { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerWill.java b/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerWill.java deleted file mode 100644 index cdb86db5..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/entity/layer/LayerWill.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.client.render.entity.layer; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.layers.LayerRenderer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class LayerWill implements LayerRenderer { - private static final ResourceLocation RAW_TEXTURE = new ResourceLocation("bloodmagic", "textures/entities/overlay/overlay_raw.png"); - private final MobRenderer renderer; - private final ModelBase model; - - public LayerWill(MobRenderer rendererIn, ModelBase model) { - this.renderer = rendererIn; - this.model = model; - } - - @Override - public void doRenderLayer(EntityDemonBase demon, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { -// if (demon.getPowered()) - - if (demon.isInvisible()) { - return; //TODO: Make this also check if the demon wants the Will layer - } - - boolean flag = demon.isInvisible(); - GlStateManager.depthMask(!flag); - this.renderer.bindTexture(RAW_TEXTURE); - GlStateManager.matrixMode(5890); - GlStateManager.loadIdentity(); - float f = (float) demon.ticksExisted + partialTicks; - GlStateManager.translate(f * 0.01F, f * 0.01F, 0.0F); - GlStateManager.matrixMode(5888); - GlStateManager.enableBlend(); - float f1 = 0.5F; - GlStateManager.color(f1, f1, f1, 1.0F); - GlStateManager.disableLighting(); - GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - this.model.setModelAttributes(this.renderer.getMainModel()); - this.model.render(demon, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); - GlStateManager.matrixMode(5890); - GlStateManager.loadIdentity(); - GlStateManager.matrixMode(5888); - GlStateManager.enableLighting(); - GlStateManager.disableBlend(); - GlStateManager.depthMask(flag); - } - - @Override - public boolean shouldCombineTextures() { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java deleted file mode 100644 index 578cac99..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedChicken.java +++ /dev/null @@ -1,102 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelCorruptedChicken extends ModelBase { - public ModelRenderer head; - public ModelRenderer body; - public ModelRenderer rightLeg; - public ModelRenderer leftLeg; - public ModelRenderer rightWing; - public ModelRenderer leftWing; - public ModelRenderer bill; - public ModelRenderer chin; - - public ModelCorruptedChicken(float scale) { - this.head = new ModelRenderer(this, 0, 0); - this.head.addBox(-2.0F, -6.0F, -2.0F, 4, 6, 3, scale); - this.head.setRotationPoint(0.0F, 15.0F, -4.0F); - this.bill = new ModelRenderer(this, 14, 0); - this.bill.addBox(-2.0F, -4.0F, -4.0F, 4, 2, 2, scale); - this.bill.setRotationPoint(0.0F, 15.0F, -4.0F); - this.chin = new ModelRenderer(this, 14, 4); - this.chin.addBox(-1.0F, -2.0F, -3.0F, 2, 2, 2, scale); - this.chin.setRotationPoint(0.0F, 15.0F, -4.0F); - this.body = new ModelRenderer(this, 0, 9); - this.body.addBox(-3.0F, -4.0F, -3.0F, 6, 8, 6, scale); - this.body.setRotationPoint(0.0F, 16.0F, 0.0F); - this.rightLeg = new ModelRenderer(this, 26, 0); - this.rightLeg.addBox(-1.0F, 0.0F, -3.0F, 3, 5, 3, scale); - this.rightLeg.setRotationPoint(-2.0F, 19.0F, 1.0F); - this.leftLeg = new ModelRenderer(this, 26, 0); - this.leftLeg.addBox(-1.0F, 0.0F, -3.0F, 3, 5, 3, scale); - this.leftLeg.setRotationPoint(1.0F, 19.0F, 1.0F); - this.rightWing = new ModelRenderer(this, 24, 13); - this.rightWing.addBox(0.0F, 0.0F, -3.0F, 1, 4, 6, scale); - this.rightWing.setRotationPoint(-4.0F, 13.0F, 0.0F); - this.leftWing = new ModelRenderer(this, 24, 13); - this.leftWing.addBox(-1.0F, 0.0F, -3.0F, 1, 4, 6, scale); - this.leftWing.setRotationPoint(4.0F, 13.0F, 0.0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - this.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, entityIn); - - if (this.isChild) { - GlStateManager.pushMatrix(); - GlStateManager.translate(0.0F, 5.0F * scale, 2.0F * scale); - this.head.render(scale); - this.bill.render(scale); - this.chin.render(scale); - GlStateManager.popMatrix(); - GlStateManager.pushMatrix(); - GlStateManager.scale(0.5F, 0.5F, 0.5F); - GlStateManager.translate(0.0F, 24.0F * scale, 0.0F); - this.body.render(scale); - this.rightLeg.render(scale); - this.leftLeg.render(scale); - this.rightWing.render(scale); - this.leftWing.render(scale); - GlStateManager.popMatrix(); - } else { - this.head.render(scale); - this.bill.render(scale); - this.chin.render(scale); - this.body.render(scale); - this.rightLeg.render(scale); - this.leftLeg.render(scale); - this.rightWing.render(scale); - this.leftWing.render(scale); - } - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are - * used for animating the movement of arms and legs, where par1 represents - * the time(so that arms and legs swing back and forth) and par2 represents - * how "far" arms and legs can swing at most. - */ - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - this.head.rotateAngleX = headPitch * 0.017453292F; - this.head.rotateAngleY = netHeadYaw * 0.017453292F; - this.bill.rotateAngleX = this.head.rotateAngleX; - this.bill.rotateAngleY = this.head.rotateAngleY; - this.chin.rotateAngleX = this.head.rotateAngleX; - this.chin.rotateAngleY = this.head.rotateAngleY; - this.body.rotateAngleX = ((float) Math.PI / 2F); - this.rightLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F) * 1.4F * limbSwingAmount; - this.leftLeg.rotateAngleX = MathHelper.cos(limbSwing * 0.6662F + (float) Math.PI) * 1.4F * limbSwingAmount; - this.rightWing.rotateAngleZ = ageInTicks; - this.leftWing.rotateAngleZ = -ageInTicks; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java deleted file mode 100644 index 14b72d05..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep.java +++ /dev/null @@ -1,59 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.model.ModelQuadruped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelCorruptedSheep extends ModelQuadruped { - private float headRotationAngleX; - - public ModelCorruptedSheep(float scale) { - super(12, scale); - this.head = new ModelRenderer(this, 0, 0); - this.head.addBox(-3.0F, -4.0F, -4.0F, 6, 6, 6, 0.6F * scale); - this.head.setRotationPoint(0.0F, 6.0F, -8.0F); - this.body = new ModelRenderer(this, 28, 8); - this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 1.75F * scale); - this.body.setRotationPoint(0.0F, 5.0F, 2.0F); - float f = 0.5F; - this.leg1 = new ModelRenderer(this, 0, 16); - this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F * scale); - this.leg1.setRotationPoint(-3.0F, 12.0F, 7.0F); - this.leg2 = new ModelRenderer(this, 0, 16); - this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F * scale); - this.leg2.setRotationPoint(3.0F, 12.0F, 7.0F); - this.leg3 = new ModelRenderer(this, 0, 16); - this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F * scale); - this.leg3.setRotationPoint(-3.0F, 12.0F, -5.0F); - this.leg4 = new ModelRenderer(this, 0, 16); - this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, 0.5F * scale); - this.leg4.setRotationPoint(3.0F, 12.0F, -5.0F); - } - - /** - * Used for easily adding entity-dependent animations. The second and third - * float params here are the same second and third as in the - * setRotationAngles method. - */ - public void setLivingAnimations(LivingEntity entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) { - super.setLivingAnimations(entitylivingbaseIn, p_78086_2_, p_78086_3_, partialTickTime); - this.head.rotationPointY = 6.0F + ((EntityCorruptedSheep) entitylivingbaseIn).getHeadRotationPointY(partialTickTime) * 9.0F; - this.headRotationAngleX = ((EntityCorruptedSheep) entitylivingbaseIn).getHeadRotationAngleX(partialTickTime); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are - * used for animating the movement of arms and legs, where par1 represents - * the time(so that arms and legs swing back and forth) and par2 represents - * how "far" arms and legs can swing at most. - */ - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn); - this.head.rotateAngleX = this.headRotationAngleX; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java deleted file mode 100644 index d80c4205..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSheep2.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.client.model.ModelQuadruped; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelCorruptedSheep2 extends ModelQuadruped { - private float headRotationAngleX; - - public ModelCorruptedSheep2(float scale) { - super(12, scale); - this.head = new ModelRenderer(this, 0, 0); - this.head.addBox(-3.0F, -4.0F, -6.0F, 6, 6, 8, scale); - this.head.setRotationPoint(0.0F, 6.0F, -8.0F); - this.body = new ModelRenderer(this, 28, 8); - this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, scale); - this.body.setRotationPoint(0.0F, 5.0F, 2.0F); - } - - /** - * Used for easily adding entity-dependent animations. The second and third - * float params here are the same second and third as in the - * setRotationAngles method. - */ - public void setLivingAnimations(LivingEntity entitylivingbaseIn, float p_78086_2_, float p_78086_3_, float partialTickTime) { - super.setLivingAnimations(entitylivingbaseIn, p_78086_2_, p_78086_3_, partialTickTime); - this.head.rotationPointY = 6.0F + ((EntityCorruptedSheep) entitylivingbaseIn).getHeadRotationPointY(partialTickTime) * 9.0F; - this.headRotationAngleX = ((EntityCorruptedSheep) entitylivingbaseIn).getHeadRotationAngleX(partialTickTime); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are - * used for animating the movement of arms and legs, where par1 represents - * the time(so that arms and legs swing back and forth) and par2 represents - * how "far" arms and legs can swing at most. - */ - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn); - this.head.rotateAngleX = this.headRotationAngleX; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java deleted file mode 100644 index 3f92fad3..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelCorruptedSpider.java +++ /dev/null @@ -1,166 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelCorruptedSpider extends ModelBase { - /** - * The spider's head box - */ - public ModelRenderer spiderHead; - /** - * The spider's neck box - */ - public ModelRenderer spiderNeck; - /** - * The spider's body box - */ - public ModelRenderer spiderBody; - /** - * Spider's first leg - */ - public ModelRenderer spiderLeg1; - /** - * Spider's second leg - */ - public ModelRenderer spiderLeg2; - /** - * Spider's third leg - */ - public ModelRenderer spiderLeg3; - /** - * Spider's fourth leg - */ - public ModelRenderer spiderLeg4; - /** - * Spider's fifth leg - */ - public ModelRenderer spiderLeg5; - /** - * Spider's sixth leg - */ - public ModelRenderer spiderLeg6; - /** - * Spider's seventh leg - */ - public ModelRenderer spiderLeg7; - /** - * Spider's eight leg - */ - public ModelRenderer spiderLeg8; - - public ModelCorruptedSpider(float scale) { - float f = 0.0F; - int i = 15; - this.spiderHead = new ModelRenderer(this, 32, 4); - this.spiderHead.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, scale); - this.spiderHead.setRotationPoint(0.0F, 15.0F, -3.0F); - this.spiderNeck = new ModelRenderer(this, 0, 0); - this.spiderNeck.addBox(-3.0F, -3.0F, -3.0F, 6, 6, 6, scale); - this.spiderNeck.setRotationPoint(0.0F, 15.0F, 0.0F); - this.spiderBody = new ModelRenderer(this, 0, 12); - this.spiderBody.addBox(-5.0F, -4.0F, -6.0F, 10, 8, 12, scale); - this.spiderBody.setRotationPoint(0.0F, 15.0F, 9.0F); - this.spiderLeg1 = new ModelRenderer(this, 18, 0); - this.spiderLeg1.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg1.setRotationPoint(-4.0F, 15.0F, 2.0F); - this.spiderLeg2 = new ModelRenderer(this, 18, 0); - this.spiderLeg2.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg2.setRotationPoint(4.0F, 15.0F, 2.0F); - this.spiderLeg3 = new ModelRenderer(this, 18, 0); - this.spiderLeg3.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg3.setRotationPoint(-4.0F, 15.0F, 1.0F); - this.spiderLeg4 = new ModelRenderer(this, 18, 0); - this.spiderLeg4.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg4.setRotationPoint(4.0F, 15.0F, 1.0F); - this.spiderLeg5 = new ModelRenderer(this, 18, 0); - this.spiderLeg5.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg5.setRotationPoint(-4.0F, 15.0F, 0.0F); - this.spiderLeg6 = new ModelRenderer(this, 18, 0); - this.spiderLeg6.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg6.setRotationPoint(4.0F, 15.0F, 0.0F); - this.spiderLeg7 = new ModelRenderer(this, 18, 0); - this.spiderLeg7.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg7.setRotationPoint(-4.0F, 15.0F, -1.0F); - this.spiderLeg8 = new ModelRenderer(this, 18, 0); - this.spiderLeg8.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, scale); - this.spiderLeg8.setRotationPoint(4.0F, 15.0F, -1.0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - this.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, entityIn); - this.spiderHead.render(scale); - this.spiderNeck.render(scale); - this.spiderBody.render(scale); - this.spiderLeg1.render(scale); - this.spiderLeg2.render(scale); - this.spiderLeg3.render(scale); - this.spiderLeg4.render(scale); - this.spiderLeg5.render(scale); - this.spiderLeg6.render(scale); - this.spiderLeg7.render(scale); - this.spiderLeg8.render(scale); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are - * used for animating the movement of arms and legs, where par1 represents - * the time(so that arms and legs swing back and forth) and par2 represents - * how "far" arms and legs can swing at most. - */ - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - this.spiderHead.rotateAngleY = netHeadYaw * 0.017453292F; - this.spiderHead.rotateAngleX = headPitch * 0.017453292F; - float f = ((float) Math.PI / 4F); - this.spiderLeg1.rotateAngleZ = -((float) Math.PI / 4F); - this.spiderLeg2.rotateAngleZ = ((float) Math.PI / 4F); - this.spiderLeg3.rotateAngleZ = -0.58119464F; - this.spiderLeg4.rotateAngleZ = 0.58119464F; - this.spiderLeg5.rotateAngleZ = -0.58119464F; - this.spiderLeg6.rotateAngleZ = 0.58119464F; - this.spiderLeg7.rotateAngleZ = -((float) Math.PI / 4F); - this.spiderLeg8.rotateAngleZ = ((float) Math.PI / 4F); - float f1 = -0.0F; - float f2 = 0.3926991F; - this.spiderLeg1.rotateAngleY = ((float) Math.PI / 4F); - this.spiderLeg2.rotateAngleY = -((float) Math.PI / 4F); - this.spiderLeg3.rotateAngleY = 0.3926991F; - this.spiderLeg4.rotateAngleY = -0.3926991F; - this.spiderLeg5.rotateAngleY = -0.3926991F; - this.spiderLeg6.rotateAngleY = 0.3926991F; - this.spiderLeg7.rotateAngleY = -((float) Math.PI / 4F); - this.spiderLeg8.rotateAngleY = ((float) Math.PI / 4F); - float f3 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; - float f4 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; - float f5 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; - float f6 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; - float f7 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; - float f8 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; - float f9 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; - float f10 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; - this.spiderLeg1.rotateAngleY += f3; - this.spiderLeg2.rotateAngleY += -f3; - this.spiderLeg3.rotateAngleY += f4; - this.spiderLeg4.rotateAngleY += -f4; - this.spiderLeg5.rotateAngleY += f5; - this.spiderLeg6.rotateAngleY += -f5; - this.spiderLeg7.rotateAngleY += f6; - this.spiderLeg8.rotateAngleY += -f6; - this.spiderLeg1.rotateAngleZ += f7; - this.spiderLeg2.rotateAngleZ += -f7; - this.spiderLeg3.rotateAngleZ += f8; - this.spiderLeg4.rotateAngleZ += -f8; - this.spiderLeg5.rotateAngleZ += f9; - this.spiderLeg6.rotateAngleZ += -f9; - this.spiderLeg7.rotateAngleZ += f10; - this.spiderLeg8.rotateAngleZ += -f10; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java deleted file mode 100644 index 8e75b6c8..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMeteor.java +++ /dev/null @@ -1,89 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; - -/** - * This is a direct copy of the meteor model from 1.7.10. As such it probably - * needs to be... better. - */ -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); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java b/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java deleted file mode 100644 index e06c1220..00000000 --- a/src/main/java/WayofTime/bloodmagic/client/render/model/ModelMimic.java +++ /dev/null @@ -1,136 +0,0 @@ -package WayofTime.bloodmagic.client.render.model; - -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelRenderer; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -@SideOnly(Side.CLIENT) -public class ModelMimic extends ModelBase { - /** - * Spider's first leg - */ - public ModelRenderer mimicLeg1; - /** - * Spider's second leg - */ - public ModelRenderer mimicLeg2; - /** - * Spider's third leg - */ - public ModelRenderer mimicLeg3; - /** - * Spider's fourth leg - */ - public ModelRenderer mimicLeg4; - /** - * Spider's fifth leg - */ - public ModelRenderer mimicLeg5; - /** - * Spider's sixth leg - */ - public ModelRenderer mimicLeg6; - /** - * Spider's seventh leg - */ - public ModelRenderer mimicLeg7; - /** - * Spider's eight leg - */ - public ModelRenderer mimicLeg8; - - public ModelMimic() { - this.mimicLeg1 = new ModelRenderer(this, 18, 0); - this.mimicLeg1.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg1.setRotationPoint(-4.0F, 15.0F, 2.0F); - this.mimicLeg2 = new ModelRenderer(this, 18, 0); - this.mimicLeg2.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg2.setRotationPoint(4.0F, 15.0F, 2.0F); - this.mimicLeg3 = new ModelRenderer(this, 18, 0); - this.mimicLeg3.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg3.setRotationPoint(-4.0F, 15.0F, 1.0F); - this.mimicLeg4 = new ModelRenderer(this, 18, 0); - this.mimicLeg4.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg4.setRotationPoint(4.0F, 15.0F, 1.0F); - this.mimicLeg5 = new ModelRenderer(this, 18, 0); - this.mimicLeg5.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg5.setRotationPoint(-4.0F, 15.0F, 0.0F); - this.mimicLeg6 = new ModelRenderer(this, 18, 0); - this.mimicLeg6.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg6.setRotationPoint(4.0F, 15.0F, 0.0F); - this.mimicLeg7 = new ModelRenderer(this, 18, 0); - this.mimicLeg7.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg7.setRotationPoint(-4.0F, 15.0F, -1.0F); - this.mimicLeg8 = new ModelRenderer(this, 18, 0); - this.mimicLeg8.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, 0.0F); - this.mimicLeg8.setRotationPoint(4.0F, 15.0F, -1.0F); - } - - /** - * Sets the models various rotation angles then renders the model. - */ - public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale) { - this.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, entityIn); - this.mimicLeg1.render(scale); - this.mimicLeg2.render(scale); - this.mimicLeg3.render(scale); - this.mimicLeg4.render(scale); - this.mimicLeg5.render(scale); - this.mimicLeg6.render(scale); - this.mimicLeg7.render(scale); - this.mimicLeg8.render(scale); - } - - /** - * Sets the model's various rotation angles. For bipeds, par1 and par2 are - * used for animating the movement of arms and legs, where par1 represents - * the time(so that arms and legs swing back and forth) and par2 represents - * how "far" arms and legs can swing at most. - */ - public void setRotationAngles(float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scaleFactor, Entity entityIn) { - this.mimicLeg1.rotateAngleZ = -((float) Math.PI / 4F); - this.mimicLeg2.rotateAngleZ = ((float) Math.PI / 4F); - this.mimicLeg3.rotateAngleZ = -0.58119464F; - this.mimicLeg4.rotateAngleZ = 0.58119464F; - this.mimicLeg5.rotateAngleZ = -0.58119464F; - this.mimicLeg6.rotateAngleZ = 0.58119464F; - this.mimicLeg7.rotateAngleZ = -((float) Math.PI / 4F); - this.mimicLeg8.rotateAngleZ = ((float) Math.PI / 4F); - - this.mimicLeg1.rotateAngleY = ((float) Math.PI / 4F); - this.mimicLeg2.rotateAngleY = -((float) Math.PI / 4F); - this.mimicLeg3.rotateAngleY = 0.3926991F; - this.mimicLeg4.rotateAngleY = -0.3926991F; - this.mimicLeg5.rotateAngleY = -0.3926991F; - this.mimicLeg6.rotateAngleY = 0.3926991F; - this.mimicLeg7.rotateAngleY = -((float) Math.PI / 4F); - this.mimicLeg8.rotateAngleY = ((float) Math.PI / 4F); - float f3 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + 0.0F) * 0.4F) * limbSwingAmount; - float f4 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + (float) Math.PI) * 0.4F) * limbSwingAmount; - float f5 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; - float f6 = -(MathHelper.cos(limbSwing * 0.6662F * 2.0F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; - float f7 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + 0.0F) * 0.4F) * limbSwingAmount; - float f8 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + (float) Math.PI) * 0.4F) * limbSwingAmount; - float f9 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + ((float) Math.PI / 2F)) * 0.4F) * limbSwingAmount; - float f10 = Math.abs(MathHelper.sin(limbSwing * 0.6662F + ((float) Math.PI * 3F / 2F)) * 0.4F) * limbSwingAmount; - this.mimicLeg1.rotateAngleY += f3; - this.mimicLeg2.rotateAngleY += -f3; - this.mimicLeg3.rotateAngleY += f4; - this.mimicLeg4.rotateAngleY += -f4; - this.mimicLeg5.rotateAngleY += f5; - this.mimicLeg6.rotateAngleY += -f5; - this.mimicLeg7.rotateAngleY += f6; - this.mimicLeg8.rotateAngleY += -f6; - this.mimicLeg1.rotateAngleZ += f7; - this.mimicLeg2.rotateAngleZ += -f7; - this.mimicLeg3.rotateAngleZ += f8; - this.mimicLeg4.rotateAngleZ += -f8; - this.mimicLeg5.rotateAngleZ += f9; - this.mimicLeg6.rotateAngleZ += -f9; - this.mimicLeg7.rotateAngleZ += f10; - this.mimicLeg8.rotateAngleZ += -f10; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java b/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java deleted file mode 100644 index 5c143101..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/CommandBloodMagic.java +++ /dev/null @@ -1,34 +0,0 @@ -package WayofTime.bloodmagic.command; - -import WayofTime.bloodmagic.command.sub.*; -import net.minecraft.command.ICommandSender; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -public class CommandBloodMagic extends CommandTreeBase { - - public CommandBloodMagic() { - addSubcommand(new SubCommandBind()); - addSubcommand(new SubCommandNetwork()); - addSubcommand(new SubCommandOrb()); - addSubcommand(new SubCommandRitual()); - addSubcommand(new SubCommandTeleposer()); - addSubcommand(new CommandTreeHelp(this)); - } - - @Override - public String getName() { - return "bloodmagic"; - } - - @Override - public String getUsage(ICommandSender sender) { - return "/bloodmagic help"; - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - -} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java deleted file mode 100644 index 7eedd178..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandBind.java +++ /dev/null @@ -1,91 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.BindableHelper; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -public class SubCommandBind extends CommandTreeBase { - public ServerPlayerEntity player; - - public SubCommandBind() { - addSubcommand(new CommandTreeHelp(this)); - } - - public String getInfo() { - return player.getName(); - } - - @Override - public String getName() { - return "bind"; - } - - @Override - public String getUsage(ICommandSender commandSender) { - return "commands.bloodmagic.bind.usage"; - } - - public String getHelp() { - return "commands.bloodmagic.bind.help"; - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TranslationTextComponent(getHelp())); - return; - } - if (sender.getEntityWorld().isRemote) - return; - ServerPlayerEntity player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - ItemStack held = player.getHeldItemMainhand(); - boolean bind = true; - if (held.getItem() instanceof IBindable) { - Binding binding = ((IBindable) held.getItem()).getBinding(held); - if (binding != null) - bind = false; - if (args.length < 2) - if (args.length == 1) - if (isBoolean(args[0])) - bind = Boolean.parseBoolean(args[0]); - else - player = getPlayer(server, sender, args[0]); - if (bind) { - if (binding.getOwnerName().equals(player.getName())) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.error.ownerEqualsTarget")); - return; - } - binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); - BindableHelper.applyBinding(held, binding); - this.player = player; - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.success", getInfo())); - } else { - if (binding == null) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.error.notBound")); - } - held.getTagCompound().removeTag("binding"); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.remove.success")); - } - } else - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.bind.error.notBindable")); - - - } - - private boolean isBoolean(String string) { - return string.equalsIgnoreCase("true") || string.equalsIgnoreCase("false"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java deleted file mode 100644 index 230dbf08..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandNetwork.java +++ /dev/null @@ -1,228 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -import java.util.List; - -public class SubCommandNetwork extends CommandTreeBase { - - public SubCommandNetwork() { - addSubcommand(new Syphon()); - addSubcommand(new Add()); - addSubcommand(new Set()); - addSubcommand(new Get()); - addSubcommand(new Cap()); - addSubcommand(new Fill()); - addSubcommand(new Tickets()); - addSubcommand(new CommandTreeHelp(this)); - } - - @Override - public String getName() { - return "network"; - } - - @Override - public String getUsage(ICommandSender commandSender) { - return "commands.bloodmagic.network.usage"; - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - abstract class NetworkCommand extends CommandTreeBase { - - public ServerPlayerEntity player; - public SoulNetwork network; - public String uuid; - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - public Integer commandHelperAmount(MinecraftServer server, ICommandSender sender, String[] args) { - int amount; - if (args.length == 0) - amount = 1000; - else if (Utils.isInteger(args[0])) - amount = Integer.parseInt(args[0]); - else if (args.length > 1 && Utils.isInteger(args[1])) - amount = Integer.parseInt(args[1]); - else { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); - return null; - } - if (amount < 0) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); - return null; - } - return amount; - } - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.network." + getName() + ".usage"; - } - - public String getHelp() { - return "commands.bloodmagic.network." + getName() + ".help"; - } - - public String getInfo() { - return ""; - } - - @Override - public final void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TranslationTextComponent(getHelp())); - return; - } - if (!getName().equals("get")) { - this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - this.network = NetworkHelper.getSoulNetwork(uuid); - } - subExecute(server, sender, args); - } - - protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException; - } - - class Syphon extends NetworkCommand { - @Override - public String getName() { - return "syphon"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer amount = commandHelperAmount(server, sender, args); - if (amount == null) - return; - int currE = network.getCurrentEssence(); - if (amount > currE) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.syphon.amountTooHigh")); - if (currE == 0) - return; - amount = Math.min(amount, currE); - } - network.syphonAndDamage(player, SoulTicket.command(sender, this.getName(), amount)); - int newE = network.getCurrentEssence(); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.syphon.success", currE - newE, player.getDisplayName().getFormattedText())); - } - } - - class Add extends NetworkCommand { - @Override - public String getName() { - return "add"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer amount = commandHelperAmount(server, sender, args); - if (amount == null) - return; - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.add.success", network.add(SoulTicket.command(sender, getName(), amount), NetworkHelper.getMaximumForTier(network.getOrbTier())), player.getDisplayName().getFormattedText())); - } - } - - class Set extends NetworkCommand { - @Override - public String getName() { - return "set"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer amount = commandHelperAmount(server, sender, args); - if (amount == null) - return; - network.setCurrentEssence(amount); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.set.success", player.getDisplayName().getFormattedText(), amount)); - } - } - - class Get extends NetworkCommand { - - @Override - public String getName() { - return "get"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - this.player = args.length < 1 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - this.uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - this.network = NetworkHelper.getSoulNetwork(uuid); - sender.sendMessage(new StringTextComponent((player != sender ? player.getDisplayName().getFormattedText() + " " : "" + new TranslationTextComponent("tooltip.bloodmagic.sigil.divination.currentEssence", network.getCurrentEssence()).getFormattedText()))); - } - } - - class Cap extends NetworkCommand { - - @Override - public String getName() { - return "cap"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - network.setCurrentEssence(NetworkHelper.getMaximumForTier(network.getOrbTier())); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.cap.success", player.getDisplayName().getFormattedText())); - } - } - - class Fill extends NetworkCommand { - - @Override - public String getInfo() { - return "" + Integer.MAX_VALUE; - } - - @Override - public String getName() { - return "fill"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - network.setCurrentEssence(Integer.MAX_VALUE); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.network.fill.success", player.getDisplayName().getFormattedText())); - } - } - - class Tickets extends NetworkCommand { - - @Override - public String getName() { - return "tickethistory"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - List tickethistory = network.getTicketHistory(); - if (!tickethistory.isEmpty()) - for (SoulTicket i : network.getTicketHistory()) - sender.sendMessage(i.getDescription()); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success", player.getDisplayName().getFormattedText())); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java deleted file mode 100644 index 10b01fb0..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandOrb.java +++ /dev/null @@ -1,127 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -public class SubCommandOrb extends CommandTreeBase { - public SubCommandOrb() { - addSubcommand(new Get()); - addSubcommand(new Set()); - addSubcommand(new CommandTreeHelp(this)); - } - - @Override - public String getName() { - return "orb"; - } - - @Override - public String getUsage(ICommandSender commandSender) { - return "commands.bloodmagic.orb.usage"; - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - abstract class OrbCommand extends CommandTreeBase { - - public ServerPlayerEntity player; - public String uuid; - public SoulNetwork network; - public Object info; - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.orb." + getName() + ".usage"; - } - - public String getHelp() { - return "commands.bloodmagic.orb." + getName() + ".help"; - } - - public String getInfo() { - return ""; - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && (args[0].equals("?") || args[0].equals("help"))) { - sender.sendMessage(new TranslationTextComponent(getHelp())); - return; - } - player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - uuid = PlayerHelper.getUUIDFromPlayer(player).toString(); - network = NetworkHelper.getSoulNetwork(uuid); - - subExecute(server, sender, args); - } - - protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException; - } - - class Get extends OrbCommand { - - @Override - public String getName() { - return "get"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - super.execute(server, sender, args); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.orb.currenttier", network.getOrbTier())); - } - } - - class Set extends OrbCommand { - //TODO: check whether maxTier check works with custom Blood Orbs - int maxTier = OrbRegistry.getTierMap().size() - 1; - - @Override - public String getInfo() { - return "" + maxTier; - } - - @Override - public String getName() { - return "set"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - super.execute(server, sender, args); - - int targetTier; - if (args.length == 1 && Utils.isInteger(args[0])) - targetTier = Integer.parseInt(args[0]); - else if (args.length == 2 && Utils.isInteger(args[1])) - targetTier = Integer.parseInt(args[1]); - else { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); - return; - } - if (targetTier < 0) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); - return; - } else if (targetTier > maxTier) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.orb.error.tierTooHigh", getInfo())); - return; - } - network.setOrbTier(targetTier); - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java deleted file mode 100644 index e531cf29..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandRitual.java +++ /dev/null @@ -1,150 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.helper.RitualHelper; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - -public class SubCommandRitual extends CommandTreeBase { - public SubCommandRitual() { - addSubcommand(new RitualCreate()); - addSubcommand(new RitualRepair()); - addSubcommand(new CommandTreeHelp(this)); - } - - @Override - public String getName() { - return "ritual"; - } - - @Override - public String getUsage(ICommandSender sender) { - return null; - } - - public TileMasterRitualStone getMRS(ICommandSender sender) { - BlockPos pos = sender.getPosition().down(); - World world = sender.getEntityWorld(); - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMasterRitualStone) { - return (TileMasterRitualStone) tile; - } - return null; - } - - class RitualCreate extends CommandTreeBase { - public List ritualList = new ArrayList<>(); - - public RitualCreate() { - for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { - ritualList.add(BloodMagic.RITUAL_MANAGER.getId(ritual)); - } - } - - @Override - public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) { - return ritualList; - } - - @Override - public String getName() { - return "create"; - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { - if (args.length == 0) { - sender.sendMessage(new TranslationTextComponent("commands.blooodmagic.ritual.create.noRitual")); - return; - } else if (args.length == 2 && (args[1].equals("help") || args[1].equals("?"))) { - sender.sendMessage(new TranslationTextComponent(BloodMagic.RITUAL_MANAGER.getRitual(args[0]).getTranslationKey() + ".info")); - return; - } - ServerPlayerEntity player = args.length < 3 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[1]); - boolean safe = false; - if (args.length > 1 && args.length < 4) { - int k = args.length - 1; - if (args[k].equals("true") || args[k].equals("false")) { - safe = Boolean.parseBoolean(args[k]); - } else if (args[1].equals("safe")) - safe = true; - else - player = getPlayer(server, sender, args[1]); - } - - BlockPos pos = player.getPosition().down(); - World world = player.getEntityWorld(); - Direction direction = player.getHorizontalFacing(); - - if (RitualHelper.createRitual(world, pos, direction, BloodMagic.RITUAL_MANAGER.getRitual(args[0]), safe)) - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - else if (!safe) - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); - else - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritaul.create.error.unsafe")); - - } - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.ritual.create.help"; - } - } - - class RitualRepair extends CommandTreeBase { - - @Override - public String getName() { - return "repair"; - } - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.ritual.repair.usage"; - } - - @Override - public void execute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException { - ServerPlayerEntity player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - TileMasterRitualStone tile = getMRS(player); - boolean safe = false; - if (args.length > 0 && args.length < 3) { - int k = args.length - 1; - if (args[k].equals("true") || args[k].equals("false")) { - safe = Boolean.parseBoolean(args[k]); - } else if (args[0].equals("safe")) - safe = true; - } - if (tile != null) - if (RitualHelper.repairRitualFromRuins(tile, safe)) - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - else if (!safe) - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.create.error.outOfWorldBoundaries")); - else - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritaul.create.error.unsafe")); - else - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.ritual.error.noMRS")); - } - - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java b/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java deleted file mode 100644 index 3187aeeb..00000000 --- a/src/main/java/WayofTime/bloodmagic/command/sub/SubCommandTeleposer.java +++ /dev/null @@ -1,329 +0,0 @@ -package WayofTime.bloodmagic.command.sub; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.teleport.Teleports; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.command.CommandException; -import net.minecraft.command.ICommandSender; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.server.MinecraftServer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.server.command.CommandTreeBase; -import net.minecraftforge.server.command.CommandTreeHelp; - -import java.util.HashSet; -import java.util.Set; - -public class SubCommandTeleposer extends CommandTreeBase { - public static final Set teleposerSet = new HashSet<>(); //contains "valid" teleposers (teleposers with focus), teleposers check themselves every 100 ticks. - public static TileTeleposer[] teleposerArray; - - public SubCommandTeleposer() { - addSubcommand(new OutputTeleposerList()); - addSubcommand(new TeleportToTeleposer()); - addSubcommand(new TeleportToTeleposerFocus()); - addSubcommand(new RemoveTeleposer()); - addSubcommand(new RecursiveRemoveTeleposer()); - addSubcommand(new RemoveAllOfPlayer()); - addSubcommand(new CommandTreeHelp(this)); - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - - @Override - public String getName() { - return "teleposer"; - } - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.teleposer.usage"; - } - - abstract class TeleposeHelper extends CommandTreeBase { - public PlayerEntity player; - - @Override - public String getUsage(ICommandSender sender) { - return "commands.bloodmagic.teleposer." + getName() + ".usage"; - } - - public String getHelp() { - return "commands.bloodmagic.teleposer." + getName() + ".help"; - } - - public String getInfo() { - return ""; - } - - @Override - public int getRequiredPermissionLevel() { - return 2; - } - - public TileTeleposer[] cleanUpAndCreateArrayFromTeleposerList(PlayerEntity player) { - if (player == null) - for (TileTeleposer i : teleposerSet) { - if (i == null || i.isInvalid() || i.isEmpty()) { - teleposerSet.remove(i); - } - } - else { - for (TileTeleposer i : teleposerSet) { - if (i == null || i.isInvalid() || i.isEmpty()) { - teleposerSet.remove(i); - continue; - } - ItemStack stack = i.getStackInSlot(0); - ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); - Binding binding = focus.getBinding(stack); - if (binding != null && !binding.getOwnerName().equals(player.getName())) { - teleposerSet.remove(i); - } - } - } - teleposerArray = teleposerSet.toArray(new TileTeleposer[0]); - return teleposerArray; - - } - - public void sendOwnedTeleposerList(ICommandSender sender, PlayerEntity player) { - teleposerArray = cleanUpAndCreateArrayFromTeleposerList(player); - for (int i = 0; i < teleposerArray.length; i++) { - ItemStack stack = teleposerArray[i].getStackInSlot(0); - ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); - Binding binding = focus.getBinding(stack); - if (binding != null) { - String name = binding.getOwnerName(); - if (player != null) { - if (name.equals(player.getName())) - sender.sendMessage(new StringTextComponent(i + new TranslationTextComponent("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TranslationTextComponent("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TranslationTextComponent("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); - } else - sender.sendMessage(new StringTextComponent(i + new TranslationTextComponent("commands.bloodmagic.teleposer.anddimension").getFormattedText() + teleposerArray[i].getWorld().provider.getDimension() + " " + teleposerArray[i].getPos() + " " + new TranslationTextComponent("commands.bloodmagic.teleposer.focusanddim").getFormattedText() + " " + focus.getWorld(stack).provider.getDimension() + " " + focus.getBlockPos(stack) + " " + new TranslationTextComponent("commands.bloodmagic.teleposer.owner").getFormattedText() + " " + name)); - } - } - } - - public Integer getIDFromArgs(ICommandSender sender, String[] args) { - int teleposerID; - if (args.length == 0) { - return null; - } - - if (Utils.isInteger(args[0])) - teleposerID = Integer.parseInt(args[0]); - else if (args.length > 1 && Utils.isInteger(args[1])) - teleposerID = Integer.parseInt(args[1]); - else { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.arg.invalid")); - sender.sendMessage(new TranslationTextComponent(this.getUsage(sender))); - return null; - } - if (teleposerID < 0) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.negative")); - return null; - } - return teleposerID; - } - - @Override - public final void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && args[0].equals("?") || args[0].equals("help")) { - sender.sendMessage(new TranslationTextComponent(getHelp())); - return; - } - if (!(getName().equals("rmrf") || getName().equals("remove"))) { - this.player = args.length < 2 ? getCommandSenderAsPlayer(sender) : getPlayer(server, sender, args[0]); - } - subExecute(server, sender, args); - } - - protected abstract void subExecute(MinecraftServer server, ICommandSender sender, String... args) throws CommandException; - } - - class OutputTeleposerList extends TeleposeHelper { - - @Override - public String getName() { - return "list"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - sendOwnedTeleposerList(sender, player); - } - } - - class TeleportToTeleposer extends TeleposeHelper { - - @Override - public String getName() { - return "teleport"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer teleposerID = getIDFromArgs(sender, args); - if (teleposerID == null) - sendOwnedTeleposerList(sender, null); - else if (!sender.getEntityWorld().isRemote) { - if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.error.outofbounds")); - return; - } - TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! - BlockPos brunhildePos = brunhilde.getPos(); - World brunhildeWorld = brunhilde.getWorld(); - if (player.getEntityWorld().equals(brunhildeWorld)) - new Teleports.TeleportSameDim(brunhildePos, player, player.getUniqueID(), false).teleport(); - else - new Teleports.TeleportToDim(brunhildePos, player, player.getUniqueID(), player.getEntityWorld(), brunhildeWorld.provider.getDimension(), false).teleport(); - } else - return; - - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - } - } - - class TeleportToTeleposerFocus extends TeleposeHelper { - - @Override - public String getName() { - return "teleportfocus"; - } - - @Override - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer teleposerID = getIDFromArgs(sender, args); - if (teleposerID == null) - sendOwnedTeleposerList(sender, null); - else if (!sender.getEntityWorld().isRemote) { - if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); - return; - } - TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! - ItemStack stack = brunhilde.getStackInSlot(0); - ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); - BlockPos brunhildeFocusPos = focus.getBlockPos(stack); - World brunhildeFocusWorld = focus.getWorld(stack); - if (player.getEntityWorld().equals(brunhildeFocusWorld)) - new Teleports.TeleportSameDim(brunhildeFocusPos, player, player.getUniqueID(), false).teleport(); - else - new Teleports.TeleportToDim(brunhildeFocusPos, player, player.getUniqueID(), player.getEntityWorld(), brunhildeFocusWorld.provider.getDimension(), false).teleport(); - } else - return; - - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - } - } - - class RemoveTeleposer extends TeleposeHelper { - - @Override - public String getName() { - return "remove"; - } - - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer teleposerID = getIDFromArgs(sender, args); - if (teleposerID == null) - sendOwnedTeleposerList(sender, null); - else if (!sender.getEntityWorld().isRemote) { - if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); - return; - } - TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! - BlockPos brunhildePos = brunhilde.getPos(); - World brunhildeWorld = brunhilde.getWorld(); - brunhildeWorld.setBlockToAir(brunhildePos); - cleanUpAndCreateArrayFromTeleposerList(null); - } else - return; - - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - } - } - - class RecursiveRemoveTeleposer extends TeleposeHelper { - - @Override - public String getName() { - return "rmrf"; - } - - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - Integer teleposerID = getIDFromArgs(sender, args); - if (teleposerID == null) - sendOwnedTeleposerList(sender, null); - else if (!sender.getEntityWorld().isRemote) { - if (teleposerID > teleposerArray.length) { - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.outofbounds")); - return; - } - TileTeleposer brunhilde = teleposerArray[teleposerID]; // every teleposer is a brunhilde! - do { - BlockPos brunhildePos = brunhilde.getPos(); - World brunhildeWorld = brunhilde.getWorld(); - ItemStack stack = brunhilde.getStackInSlot(0); - ItemTelepositionFocus focus = (ItemTelepositionFocus) stack.getItem(); - BlockPos brunhildeFocusPos = focus.getBlockPos(stack); - World brunhildeFocusWorld = focus.getWorld(stack); - brunhilde.setInventorySlotContents(0, ItemStack.EMPTY); - brunhildeWorld.setBlockToAir(brunhildePos); - TileEntity testTile = brunhildeFocusWorld.getTileEntity(brunhildeFocusPos); - if (!(testTile instanceof TileTeleposer) || ((TileTeleposer) testTile).getStackInSlot(0).isEmpty()) - break; - for (TileTeleposer i : teleposerArray) { - if (i.getPos().equals(brunhildeFocusPos)) { - brunhilde = i; - break; - } - - } - } while (true); - cleanUpAndCreateArrayFromTeleposerList(null); - } else - return; - - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - } - - } - - class RemoveAllOfPlayer extends TeleposeHelper { - - @Override - public String getName() { - return "removeall"; - } - - public void subExecute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { - cleanUpAndCreateArrayFromTeleposerList(player); - - if (!sender.getEntityWorld().isRemote) { - for (TileTeleposer i : teleposerArray) { - i.setInventorySlotContents(0, ItemStack.EMPTY); - i.getWorld().setBlockToAir(i.getPos()); - } - - } - cleanUpAndCreateArrayFromTeleposerList(null); - - sender.sendMessage(new TranslationTextComponent("commands.bloodmagic.success")); - - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java deleted file mode 100644 index c8b7e847..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/BookUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi; - -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.client.render.alchemyArray.DualAlchemyCircleRenderer; -import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; -import amerifrance.guideapi.page.PageIRecipe; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.List; - -public class BookUtils { - - public static PageAlchemyArray getAlchemyPage(String key) { - ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForArrayEffect(key); - if (recipe[0] != null) { - ItemStack inputStack = recipe[0]; - ItemStack catalystStack = recipe[1]; - - AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); - if (renderer instanceof DualAlchemyCircleRenderer) { - List resources = new ArrayList<>(); - resources.add(((DualAlchemyCircleRenderer) renderer).arrayResource); - resources.add(((DualAlchemyCircleRenderer) renderer).secondaryArrayResource); - return new PageAlchemyArray(resources, inputStack, catalystStack); - } else { - return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack); - } - } - - return null; - } - - public static PageAlchemyArray getAlchemyPage(ItemStack outputStack) { - ItemStack[] recipe = AlchemyArrayRecipeRegistry.getRecipeForOutputStack(outputStack); - if (recipe[0] != null) { - ItemStack inputStack = recipe[0]; - ItemStack catalystStack = recipe[1]; - - AlchemyCircleRenderer renderer = AlchemyArrayRecipeRegistry.getAlchemyCircleRenderer(inputStack, catalystStack); - if (renderer != null) { - if (renderer instanceof DualAlchemyCircleRenderer) { - List resources = new ArrayList<>(); - resources.add(((DualAlchemyCircleRenderer) renderer).arrayResource); - resources.add(((DualAlchemyCircleRenderer) renderer).secondaryArrayResource); - return new PageAlchemyArray(resources, inputStack, catalystStack, outputStack); - } else { - return new PageAlchemyArray(renderer.arrayResource, inputStack, catalystStack, outputStack); - } - } - } - - return null; - } - - public static PageIRecipe getPageForRecipe(IRecipe recipe) { - return new PageIRecipe(recipe); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java deleted file mode 100644 index fadb82ea..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/GuideBloodMagic.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compat.guideapi.book.CategoryAlchemy; -import WayofTime.bloodmagic.compat.guideapi.book.CategoryArchitect; -import WayofTime.bloodmagic.compat.guideapi.book.CategoryDemon; -import WayofTime.bloodmagic.compat.guideapi.book.CategoryRitual; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import amerifrance.guideapi.api.GuideAPI; -import amerifrance.guideapi.api.GuideBook; -import amerifrance.guideapi.api.IGuideBook; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.category.CategoryItemStack; -import net.minecraft.item.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.awt.Color; - -@GuideBook(priority = EventPriority.HIGHEST) -public class GuideBloodMagic implements IGuideBook { - - public static final Book GUIDE_BOOK = new Book(); - - @Nullable - @Override - public Book buildBook() { - GUIDE_BOOK.setTitle("guide.bloodmagic.title"); - GUIDE_BOOK.setDisplayName("guide.bloodmagic.display"); - GUIDE_BOOK.setWelcomeMessage("guide.bloodmagic.welcome"); - GUIDE_BOOK.setAuthor("guide.bloodmagic.author"); - GUIDE_BOOK.setRegistryName(new ResourceLocation(BloodMagic.MODID, "guide")); - GUIDE_BOOK.setColor(Color.RED); - - return GUIDE_BOOK; - } - - @Override - public void handlePost(ItemStack bookStack) { - GUIDE_BOOK.addCategory(new CategoryItemStack(CategoryAlchemy.buildCategory(), "guide.bloodmagic.category.alchemy", new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES))); - GUIDE_BOOK.addCategory(new CategoryItemStack(CategoryArchitect.buildCategory(), "guide.bloodmagic.category.architect", new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION))); - GUIDE_BOOK.addCategory(new CategoryItemStack(CategoryDemon.buildCategory(), "guide.bloodmagic.category.demon", new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD))); - GUIDE_BOOK.addCategory(new CategoryItemStack(CategoryRitual.buildCategory(), "guide.bloodmagic.category.ritual", new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER))); -// guideBook.addCategory(new CategoryItemStack(CategorySpell.buildCategory(), "guide.bloodmagic.category.spell", new ItemStack(ModItems.ritualDiviner))); - } - - @Nullable - @Override - public IRecipe getRecipe(@Nonnull ItemStack bookStack) { - return new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "guide"), GuideAPI.getStackFromBook(GUIDE_BOOK), new ItemStack(Items.BOOK), "blockGlass", "feather").setRegistryName("bloodmagic_guide"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java deleted file mode 100644 index f0b66b63..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryAlchemy.java +++ /dev/null @@ -1,153 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.book; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compat.guideapi.BookUtils; -import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; -import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; -import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.util.helper.RecipeHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.PageHelper; -import amerifrance.guideapi.page.PageText; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class CategoryAlchemy -{ - public static Map buildCategory() - { - Map entries = new LinkedHashMap<>(); - String keyBase = "guide." + BloodMagic.MODID + ".entry.alchemy."; - - List introPages = new ArrayList<>(); - introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "intro"), new EntryText(introPages, TextHelper.localize(keyBase + "intro"), true)); - - List ashPages = new ArrayList<>(); - - TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) - { - ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); - } - ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "ash"), new EntryText(ashPages, TextHelper.localize(keyBase + "ash"), true)); - - List furnacePages = new ArrayList<>(); - - PageAlchemyArray furnaceRecipePage = BookUtils.getAlchemyPage("furnace"); - if (furnaceRecipePage != null) - { - furnacePages.add(furnaceRecipePage); - } - furnacePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "furnace" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "furnace"), new EntryText(furnacePages, TextHelper.localize(keyBase + "furnace"), true)); - - List speedPages = new ArrayList<>(); - - PageAlchemyArray speedRecipePage = BookUtils.getAlchemyPage("movement"); - if (speedRecipePage != null) - { - speedPages.add(speedRecipePage); - } - speedPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "speed" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "speed"), new EntryText(speedPages, TextHelper.localize(keyBase + "speed"), true)); - - List buffPages = new ArrayList<>(); - - buffPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "buff" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "buff"), new EntryText(buffPages, TextHelper.localize(keyBase + "buff"), true)); - - List fastMinerPages = new ArrayList<>(); - - PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage("fastMiner"); - if (fastMinerRecipePage != null) { - fastMinerPages.add(fastMinerRecipePage); - } - fastMinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "fastMiner" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "fastMiner"), new EntryText(fastMinerPages, TextHelper.localize(keyBase + "fastMiner"), true)); - - List updraftPages = new ArrayList<>(); - - PageAlchemyArray updraftRecipePage = BookUtils.getAlchemyPage("updraft"); - if (updraftRecipePage != null) - { - updraftPages.add(updraftRecipePage); - } - updraftPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "updraft" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "updraft"), new EntryText(updraftPages, TextHelper.localize(keyBase + "updraft"), true)); - - List turretPages = new ArrayList<>(); - - PageAlchemyArray turretRecipePage = BookUtils.getAlchemyPage("skeletonTurret"); - if (turretRecipePage != null) - { - turretPages.add(turretRecipePage); - } - turretPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "turret" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "turret"), new EntryText(turretPages, TextHelper.localize(keyBase + "turret"), true)); - - List bouncePages = new ArrayList<>(); - - PageAlchemyArray bounceRecipePage = BookUtils.getAlchemyPage("bounce"); - if (bounceRecipePage != null) - { - bouncePages.add(bounceRecipePage); - } - bouncePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bounce" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "bounce"), new EntryText(bouncePages, TextHelper.localize(keyBase + "bounce"), true)); - - List teleportPages = new ArrayList<>(); - - PageAlchemyArray teleportRecipePage = BookUtils.getAlchemyPage("teleport"); - if (teleportRecipePage != null) - { - teleportPages.add(teleportRecipePage); - } - teleportPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "teleport" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "teleport"), new EntryText(teleportPages, TextHelper.localize(keyBase + "teleport"), true)); - - List standardTurretPages = new ArrayList<>(); - - PageAlchemyArray standardTurretRecipePage = BookUtils.getAlchemyPage("turret"); - if (standardTurretRecipePage != null) - { - standardTurretPages.add(standardTurretRecipePage); - } - standardTurretPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "standardTurret" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "standardTurret"), new EntryText(standardTurretPages, TextHelper.localize(keyBase + "standardTurret"), true)); - - List laputaPages = new ArrayList<>(); - - PageAlchemyArray laputaRecipePage = BookUtils.getAlchemyPage("laputa"); - if (laputaRecipePage != null) - { - laputaPages.add(laputaRecipePage); - } - laputaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "laputa" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "laputa"), new EntryText(laputaPages, TextHelper.localize(keyBase + "laputa"), true)); - - for (Entry entry : entries.entrySet()) - { - for (IPage page : entry.getValue().pageList) - { - if (page instanceof PageText) - { - ((PageText) page).setUnicodeFlag(true); - } - } - } - - return entries; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java deleted file mode 100644 index 005e7ced..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryArchitect.java +++ /dev/null @@ -1,721 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.book; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compat.guideapi.BookUtils; -import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; -import WayofTime.bloodmagic.compat.guideapi.page.PageAlchemyArray; -import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; -import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.util.helper.RecipeHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.PageHelper; -import amerifrance.guideapi.page.PageText; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class CategoryArchitect -{ - public static Map buildCategory() - { - Map entries = new LinkedHashMap<>(); - String keyBase = "guide." + BloodMagic.MODID + ".entry.architect."; - - List introPages = new ArrayList<>(); - introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); -// introPages.add(new PageImage(new ResourceLocation("bloodmagicguide", "textures/guide/" + ritual.getName() + ".png"))); - entries.put(new ResourceLocation(keyBase + "intro"), new EntryText(introPages, TextHelper.localize(keyBase + "intro"), true)); - - List altarPages = new ArrayList<>(); - - IRecipe altarRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ALTAR)); - if (altarRecipe != null) - { - altarPages.add(BookUtils.getPageForRecipe(altarRecipe)); - } - - altarPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bloodaltar" + ".info.1"), 370)); - - IRecipe daggerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER)); - if (daggerRecipe != null) - { - altarPages.add(BookUtils.getPageForRecipe(daggerRecipe)); - } - - altarPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bloodaltar" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "bloodaltar"), new EntryText(altarPages, TextHelper.localize(keyBase + "bloodaltar"), true)); - - List daggerPages = new ArrayList<>(); - - AltarRecipe daggerOfSacrificeRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE)); - if (daggerOfSacrificeRecipe != null) { - daggerPages.add(new PageAltarRecipe(daggerOfSacrificeRecipe)); - } - - daggerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "dagger" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "dagger"), new EntryText(daggerPages, TextHelper.localize(keyBase + "dagger"), true)); - - List ashPages = new ArrayList<>(); - - TartaricForgeRecipe ashRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES)); - if (ashRecipe != null) - { - ashPages.add(new PageTartaricForgeRecipe(ashRecipe)); - } - ashPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ash" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "ash"), new EntryText(ashPages, TextHelper.localize(keyBase + "ash"), true)); - - List divinationPages = new ArrayList<>(); - - PageAlchemyArray divinationRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION)); - if (divinationRecipePage != null) - { - divinationPages.add(divinationRecipePage); - } - - divinationPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "divination" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "divination"), new EntryText(divinationPages, TextHelper.localize(keyBase + "divination"), true)); - - List soulnetworkPages = new ArrayList<>(); - - soulnetworkPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "soulnetwork" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "soulnetwork"), new EntryText(soulnetworkPages, TextHelper.localize(keyBase + "soulnetwork"), true)); - - List weakorbPages = new ArrayList<>(); - weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.1"), 370)); - - AltarRecipe weakorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK)); - if (weakorbRecipe != null) - { - weakorbPages.add(new PageAltarRecipe(weakorbRecipe)); - } - - weakorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakorb" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "weakorb"), new EntryText(weakorbPages, TextHelper.localize(keyBase + "weakorb"), true)); - - List incensePages = new ArrayList<>(); - - IRecipe incenseRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INCENSE_ALTAR)); - if (incenseRecipe != null) - { - incensePages.add(BookUtils.getPageForRecipe(incenseRecipe)); - } - - incensePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "incense" + ".info.1"), 370)); - - IRecipe woodPathRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.PATH, 1, 0)); - if (woodPathRecipe != null) - { - incensePages.add(BookUtils.getPageForRecipe(woodPathRecipe)); - } - - incensePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "incense" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "incense"), new EntryText(incensePages, TextHelper.localize(keyBase + "incense"), true)); - - List runePages = new ArrayList<>(); - - IRecipe runeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 0)); - if (runeRecipe != null) - { - runePages.add(BookUtils.getPageForRecipe(runeRecipe)); - } - - runePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bloodrune" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "bloodrune"), new EntryText(runePages, TextHelper.localize(keyBase + "bloodrune"), true)); - - List inspectPages = new ArrayList<>(); - - AltarRecipe inspectRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK)); - if (inspectRecipe != null) - { - inspectPages.add(new PageAltarRecipe(inspectRecipe)); - } - - inspectPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "inspectoris" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "inspectoris"), new EntryText(inspectPages, TextHelper.localize(keyBase + "inspectoris"), true)); - - List speedRunePages = new ArrayList<>(); - - IRecipe speedRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 1)); - if (speedRecipe != null) - { - speedRunePages.add(BookUtils.getPageForRecipe(speedRecipe)); - } - - speedRunePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "runeSpeed" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "runeSpeed"), new EntryText(speedRunePages, TextHelper.localize(keyBase + "runeSpeed"), true)); - - List waterPages = new ArrayList<>(); - - TartaricForgeRecipe waterRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_WATER.getStack()); - if (waterRecipe != null) - { - waterPages.add(new PageTartaricForgeRecipe(waterRecipe)); - } - - PageAlchemyArray waterRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER)); - if (waterRecipePage != null) - { - waterPages.add(waterRecipePage); - } - - waterPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "water" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "water"), new EntryText(waterPages, TextHelper.localize(keyBase + "water"), true)); - - List lavaPages = new ArrayList<>(); - - TartaricForgeRecipe lavaRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_LAVA.getStack()); - if (lavaRecipe != null) - { - lavaPages.add(new PageTartaricForgeRecipe(lavaRecipe)); - } - - PageAlchemyArray lavaRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA)); - if (lavaRecipePage != null) - { - lavaPages.add(lavaRecipePage); - } - - lavaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lava" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "lava"), new EntryText(lavaPages, TextHelper.localize(keyBase + "lava"), true)); - - List lavaCrystalPages = new ArrayList<>(); - - IRecipe lavaCrystalRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.LAVA_CRYSTAL)); - if (lavaCrystalRecipe != null) - { - lavaCrystalPages.add(BookUtils.getPageForRecipe(lavaCrystalRecipe)); - } - - lavaCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lavaCrystal" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "lavaCrystal"), new EntryText(lavaCrystalPages, TextHelper.localize(keyBase + "lavaCrystal"), true)); - - List apprenticeorbPages = new ArrayList<>(); - - AltarRecipe apprenticeorbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE)); - if (apprenticeorbRecipe != null) - { - apprenticeorbPages.add(new PageAltarRecipe(apprenticeorbRecipe)); - } - - apprenticeorbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "apprenticeorb" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "apprenticeorb"), new EntryText(apprenticeorbPages, TextHelper.localize(keyBase + "apprenticeorb"), true)); - - List runeSacrificePages = new ArrayList<>(); - - IRecipe runeSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 3)); - if (runeSacrificeRecipe != null) - { - runeSacrificePages.add(BookUtils.getPageForRecipe(runeSacrificeRecipe)); - } - - runeSacrificePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "runeSacrifice" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "runeSacrifice"), new EntryText(runeSacrificePages, TextHelper.localize(keyBase + "runeSacrifice"), true)); - - List runeSelfSacrificePages = new ArrayList<>(); - - IRecipe runeSelfSacrificeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 4)); - if (runeSelfSacrificeRecipe != null) - { - runeSelfSacrificePages.add(BookUtils.getPageForRecipe(runeSelfSacrificeRecipe)); - } - - runeSelfSacrificePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "runeSelfSacrifice" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "runeSelfSacrifice"), new EntryText(runeSelfSacrificePages, TextHelper.localize(keyBase + "runeSelfSacrifice"), true)); - - List holdingPages = new ArrayList<>(); - - TartaricForgeRecipe holdingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HOLDING.getStack()); - if (holdingRecipe != null) - { - holdingPages.add(new PageTartaricForgeRecipe(holdingRecipe)); - } - - PageAlchemyArray holdingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING)); - if (holdingRecipePage != null) - { - holdingPages.add(holdingRecipePage); - } - - holdingPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "holding" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "holding"), new EntryText(holdingPages, TextHelper.localize(keyBase + "holding"), true)); - - List airPages = new ArrayList<>(); - - TartaricForgeRecipe airRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AIR.getStack()); - if (airRecipe != null) - { - airPages.add(new PageTartaricForgeRecipe(airRecipe)); - } - - PageAlchemyArray airRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR)); - if (airRecipePage != null) - { - airPages.add(airRecipePage); - } - - airPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "air" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "air"), new EntryText(airPages, TextHelper.localize(keyBase + "air"), true)); - - List voidPages = new ArrayList<>(); - - TartaricForgeRecipe voidRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_VOID.getStack()); - if (voidRecipe != null) - { - voidPages.add(new PageTartaricForgeRecipe(voidRecipe)); - } - - PageAlchemyArray voidRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID)); - if (voidRecipePage != null) - { - voidPages.add(voidRecipePage); - } - - voidPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "void" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "void"), new EntryText(voidPages, TextHelper.localize(keyBase + "void"), true)); - - List greenGrovePages = new ArrayList<>(); - - TartaricForgeRecipe greenGroveRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_GROWTH.getStack()); - if (greenGroveRecipe != null) - { - greenGrovePages.add(new PageTartaricForgeRecipe(greenGroveRecipe)); - } - - PageAlchemyArray greenGroveRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE)); - if (greenGroveRecipePage != null) - { - greenGrovePages.add(greenGroveRecipePage); - } - - greenGrovePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "greenGrove" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "greenGrove"), new EntryText(greenGrovePages, TextHelper.localize(keyBase + "greenGrove"), true)); - - List fastMinerPages = new ArrayList<>(); - - TartaricForgeRecipe fastMinerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_FAST_MINER.getStack()); - if (fastMinerRecipe != null) - { - fastMinerPages.add(new PageTartaricForgeRecipe(fastMinerRecipe)); - } - - PageAlchemyArray fastMinerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER)); - if (fastMinerRecipePage != null) - { - fastMinerPages.add(fastMinerRecipePage); - } - - fastMinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "fastMiner" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "fastMiner"), new EntryText(fastMinerPages, TextHelper.localize(keyBase + "fastMiner"), true)); - - List seerPages = new ArrayList<>(); - - TartaricForgeRecipe seerRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SIGHT.getStack()); - if (seerRecipe != null) - { - seerPages.add(new PageTartaricForgeRecipe(seerRecipe)); - } - - PageAlchemyArray seerRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER)); - if (seerRecipePage != null) - { - seerPages.add(seerRecipePage); - } - - seerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "seer" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "seer"), new EntryText(seerPages, TextHelper.localize(keyBase + "seer"), true)); - - List magicianOrbPages = new ArrayList<>(); - - AltarRecipe magicianOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN)); - if (magicianOrbRecipe != null) - { - magicianOrbPages.add(new PageAltarRecipe(magicianOrbRecipe)); - } - - List tier3Pages = new ArrayList<>(); - - tier3Pages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "tier3" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "tier3"), new EntryText(tier3Pages, TextHelper.localize(keyBase + "tier3"), true)); - - magicianOrbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "magicianOrb" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "magicianOrb"), new EntryText(magicianOrbPages, TextHelper.localize(keyBase + "magicianOrb"), true)); - - List capacityPages = new ArrayList<>(); - - IRecipe capacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 6)); - if (capacityRecipe != null) - { - capacityPages.add(BookUtils.getPageForRecipe(capacityRecipe)); - } - - capacityPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "capacity" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "capacity"), new EntryText(capacityPages, TextHelper.localize(keyBase + "capacity"), true)); - - List displacementPages = new ArrayList<>(); - - IRecipe displacementRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 5)); - if (displacementRecipe != null) - { - displacementPages.add(BookUtils.getPageForRecipe(displacementRecipe)); - } - - displacementPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "displacement" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "displacement"), new EntryText(displacementPages, TextHelper.localize(keyBase + "displacement"), true)); - - List affinityPages = new ArrayList<>(); - - TartaricForgeRecipe affinityRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_AFFINITY.getStack()); - if (affinityRecipe != null) - { - affinityPages.add(new PageTartaricForgeRecipe(affinityRecipe)); - } - - PageAlchemyArray affinityRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY)); - if (affinityRecipePage != null) - { - affinityPages.add(affinityRecipePage); - } - - affinityPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "affinity" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "affinity"), new EntryText(affinityPages, TextHelper.localize(keyBase + "affinity"), true)); - - List lampPages = new ArrayList<>(); - - TartaricForgeRecipe lampRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack()); - if (lampRecipe != null) - { - lampPages.add(new PageTartaricForgeRecipe(lampRecipe)); - } - - PageAlchemyArray lampRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT)); - if (lampRecipePage != null) - { - lampPages.add(lampRecipePage); - } - - lampPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lamp" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "lamp"), new EntryText(lampPages, TextHelper.localize(keyBase + "lamp"), true)); - - List magnetismPages = new ArrayList<>(); - - TartaricForgeRecipe magnetismRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_MAGNETISM.getStack()); - if (magnetismRecipe != null) - { - magnetismPages.add(new PageTartaricForgeRecipe(magnetismRecipe)); - } - - PageAlchemyArray magnetismRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM)); - if (magnetismRecipePage != null) - { - magnetismPages.add(magnetismRecipePage); - } - - magnetismPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "magnetism" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "magnetism"), new EntryText(magnetismPages, TextHelper.localize(keyBase + "magnetism"), true)); - - List peritiaPages = new ArrayList<>(); - - IRecipe peritiaRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.EXPERIENCE_TOME)); - if (peritiaRecipe != null) - { - peritiaPages.add(BookUtils.getPageForRecipe(peritiaRecipe)); - } - - peritiaPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "peritia" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "peritia"), new EntryText(peritiaPages, TextHelper.localize(keyBase + "peritia"), true)); - - List livingArmourPages = new ArrayList<>(); - - TartaricForgeRecipe bindingRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BINDING.getStack()); - if (bindingRecipe != null) - { - livingArmourPages.add(new PageTartaricForgeRecipe(bindingRecipe)); - } - - PageAlchemyArray bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); - if (bindingRecipePage != null) - { - livingArmourPages.add(bindingRecipePage); - } - - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); - if (bindingRecipePage != null) - { - livingArmourPages.add(bindingRecipePage); - } - - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS)); - if (bindingRecipePage != null) - { - livingArmourPages.add(bindingRecipePage); - } - - bindingRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); - if (bindingRecipePage != null) - { - livingArmourPages.add(bindingRecipePage); - } - - livingArmourPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "livingArmour" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "livingArmour"), new EntryText(livingArmourPages, TextHelper.localize(keyBase + "livingArmour"), true)); - - List upgradePages = new ArrayList<>(); - - upgradePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "upgradeTome" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "upgradeTome"), new EntryText(upgradePages, TextHelper.localize(keyBase + "upgradeTome"), true)); - - List downgradePages = new ArrayList<>(); - - downgradePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "downgrade" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "downgrade"), new EntryText(downgradePages, TextHelper.localize(keyBase + "downgrade"), true)); - - List boundBladePages = new ArrayList<>(); - - PageAlchemyArray boundBladePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD)); - if (boundBladePage != null) { - boundBladePages.add(boundBladePage); - } - - boundBladePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundBlade" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "boundBlade"), new EntryText(boundBladePages, TextHelper.localize(keyBase + "boundBlade"), true)); - - List boundToolPages = new ArrayList<>(); - - PageAlchemyArray boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)); - if (boundToolPage != null) { - boundToolPages.add(boundToolPage); - } - - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)); - if (boundToolPage != null) { - boundToolPages.add(boundToolPage); - } - - boundToolPage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)); - if (boundToolPage != null) { - boundToolPages.add(boundToolPage); - } - - boundToolPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "boundTool" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "boundTool"), new EntryText(boundToolPages, TextHelper.localize(keyBase + "boundTool"), true)); - - List weakShardPages = new ArrayList<>(); - - weakShardPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "weakShard" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "weakShard"), new EntryText(weakShardPages, TextHelper.localize(keyBase + "weakShard"), true)); - - List teleposerPages = new ArrayList<>(); - - AltarRecipe teleposerFocusRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)); - if (teleposerFocusRecipe != null) - { - teleposerPages.add(new PageAltarRecipe(teleposerFocusRecipe)); - } - - IRecipe teleposerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER)); - if (teleposerRecipe != null) - { - teleposerPages.add(BookUtils.getPageForRecipe(teleposerRecipe)); - } - - teleposerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "teleposer" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "teleposer"), new EntryText(teleposerPages, TextHelper.localize(keyBase + "teleposer"), true)); - - List masterOrbPages = new ArrayList<>(); - - AltarRecipe masterOrbRecipe = RecipeHelper.getAltarRecipeForOutput(OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER)); - if (magicianOrbRecipe != null) - { - masterOrbPages.add(new PageAltarRecipe(masterOrbRecipe)); - } - - masterOrbPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "masterOrb" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "masterOrb"), new EntryText(masterOrbPages, TextHelper.localize(keyBase + "masterOrb"), true)); - - List orbRunePages = new ArrayList<>(); - - IRecipe orbRuneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 8)); - if (orbRuneRecipe != null) - { - orbRunePages.add(BookUtils.getPageForRecipe(orbRuneRecipe)); - } - - orbRunePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "runeOrb" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "runeOrb"), new EntryText(orbRunePages, TextHelper.localize(keyBase + "runeOrb"), true)); - - List augmentedCapacityPages = new ArrayList<>(); - - IRecipe augmentedCapacityRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 7)); - if (orbRuneRecipe != null) - { - augmentedCapacityPages.add(BookUtils.getPageForRecipe(augmentedCapacityRecipe)); - } - - augmentedCapacityPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "augmentedCapacity" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "augmentedCapacity"), new EntryText(augmentedCapacityPages, TextHelper.localize(keyBase + "augmentedCapacity"), true)); - - List chargingPages = new ArrayList<>(); - - IRecipe chargingRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 10)); - if (orbRuneRecipe != null) - { - chargingPages.add(BookUtils.getPageForRecipe(chargingRecipe)); - } - - chargingPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "charging" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "charging"), new EntryText(chargingPages, TextHelper.localize(keyBase + "charging"), true)); - - List accelerationPages = new ArrayList<>(); - - IRecipe accelerationRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.BLOOD_RUNE, 1, 9)); - if (orbRuneRecipe != null) - { - accelerationPages.add(BookUtils.getPageForRecipe(accelerationRecipe)); - } - - accelerationPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "acceleration" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "acceleration"), new EntryText(accelerationPages, TextHelper.localize(keyBase + "acceleration"), true)); - - List suppressionPages = new ArrayList<>(); - - TartaricForgeRecipe suppressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SUPPRESSION.getStack()); - if (suppressionRecipe != null) - { - suppressionPages.add(new PageTartaricForgeRecipe(suppressionRecipe)); - } - - PageAlchemyArray suppressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION)); - if (suppressionRecipePage != null) - { - suppressionPages.add(suppressionRecipePage); - } - - suppressionPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "suppression" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "suppression"), new EntryText(suppressionPages, TextHelper.localize(keyBase + "suppression"), true)); - - List hastePages = new ArrayList<>(); - - TartaricForgeRecipe hasteRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_HASTE.getStack()); - if (hasteRecipe != null) - { - hastePages.add(new PageTartaricForgeRecipe(hasteRecipe)); - } - - PageAlchemyArray hasteRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE)); - if (hasteRecipePage != null) - { - hastePages.add(hasteRecipePage); - } - - hastePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "haste" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "haste"), new EntryText(hastePages, TextHelper.localize(keyBase + "haste"), true)); - - List severancePages = new ArrayList<>(); - - TartaricForgeRecipe severanceRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_SEVERANCE.getStack()); - if (severanceRecipe != null) - { - severancePages.add(new PageTartaricForgeRecipe(severanceRecipe)); - } - - PageAlchemyArray severanceRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE)); - if (severanceRecipePage != null) - { - severancePages.add(severanceRecipePage); - } - - severancePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "severance" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "severance"), new EntryText(severancePages, TextHelper.localize(keyBase + "severance"), true)); - - List telepositionPages = new ArrayList<>(); - - TartaricForgeRecipe telepositionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_TELEPOSITION.getStack()); - if (telepositionRecipe != null) - { - telepositionPages.add(new PageTartaricForgeRecipe(telepositionRecipe)); - } - - PageAlchemyArray telepositionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION)); - if (telepositionRecipePage != null) - { - telepositionPages.add(telepositionRecipePage); - } - - telepositionPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "teleposition" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "teleposition"), new EntryText(telepositionPages, TextHelper.localize(keyBase + "teleposition"), true)); - - List compressionPages = new ArrayList<>(); - - TartaricForgeRecipe compressionRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_COMPRESSION.getStack()); - if (compressionRecipe != null) - { - compressionPages.add(new PageTartaricForgeRecipe(compressionRecipe)); - } - - PageAlchemyArray compressionRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION)); - if (compressionRecipePage != null) - { - compressionPages.add(compressionRecipePage); - } - - compressionPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "compression" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "compression"), new EntryText(compressionPages, TextHelper.localize(keyBase + "compression"), true)); - - List bridgePages = new ArrayList<>(); - - TartaricForgeRecipe bridgeRecipe = RecipeHelper.getForgeRecipeForOutput(ComponentTypes.REAGENT_BRIDGE.getStack()); - if (bridgeRecipe != null) - { - bridgePages.add(new PageTartaricForgeRecipe(bridgeRecipe)); - } - - PageAlchemyArray bridgeRecipePage = BookUtils.getAlchemyPage(new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE)); - if (bridgeRecipePage != null) - { - bridgePages.add(bridgeRecipePage); - } - - bridgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "bridge" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "bridge"), new EntryText(bridgePages, TextHelper.localize(keyBase + "bridge"), true)); - - List mimicPages = new ArrayList<>(); - - IRecipe mimicRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MIMIC, 1, 1)); - if (mimicRecipe != null) - { - mimicPages.add(BookUtils.getPageForRecipe(mimicRecipe)); - } - - mimicPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "mimic" + ".info.1"), 370)); - entries.put(new ResourceLocation(keyBase + "mimic"), new EntryText(mimicPages, TextHelper.localize(keyBase + "mimic"), true)); - - for (Entry entry : entries.entrySet()) - { - for (IPage page : entry.getValue().pageList) - { - if (page instanceof PageText) - { - ((PageText) page).setUnicodeFlag(true); - } - } - } - - return entries; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java deleted file mode 100644 index eb26e3a4..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryDemon.java +++ /dev/null @@ -1,191 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.book; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.compat.guideapi.BookUtils; -import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; -import WayofTime.bloodmagic.compat.guideapi.page.PageTartaricForgeRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.RecipeHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.PageHelper; -import amerifrance.guideapi.page.PageText; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class CategoryDemon { - //TODO: Add Forge recipe pages - public static Map buildCategory() { - Map entries = new LinkedHashMap<>(); - String keyBase = "guide." + BloodMagic.MODID + ".entry.demon."; - - List introPages = new ArrayList<>(); - introPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "intro" + ".info"), 370)); -// introPages.add(new PageImage(new ResourceLocation("bloodmagicguide", "textures/guide/" + ritual.getName() + ".png"))); - entries.put(new ResourceLocation(keyBase + "intro"), new EntryText(introPages, TextHelper.localize(keyBase + "intro"), true)); - - List snarePages = new ArrayList<>(); - snarePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "snare" + ".info.1"), 370)); - - IRecipe snareRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_SNARE)); - if (snareRecipe != null) { - snarePages.add(BookUtils.getPageForRecipe(snareRecipe)); - } - - snarePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "snare" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "snare"), new EntryText(snarePages, TextHelper.localize(keyBase + "snare"), true)); - - List forgePages = new ArrayList<>(); - forgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "forge" + ".info.1"), 370)); - - IRecipe forgeRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE)); - if (forgeRecipe != null) { - forgePages.add(BookUtils.getPageForRecipe(forgeRecipe)); - } - - forgePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "forge" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "forge"), new EntryText(forgePages, TextHelper.localize(keyBase + "forge"), true)); - - List pettyPages = new ArrayList<>(); - pettyPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "petty" + ".info.1"), 370)); - TartaricForgeRecipe pettyRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM)); - if (pettyRecipe != null) { - pettyPages.add(new PageTartaricForgeRecipe(pettyRecipe)); - } - pettyPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "petty" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "petty"), new EntryText(pettyPages, TextHelper.localize(keyBase + "petty"), true)); - - List swordPages = new ArrayList<>(); - swordPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sword" + ".info.1"), 370)); - TartaricForgeRecipe swordRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD)); - if (swordRecipe != null) { - swordPages.add(new PageTartaricForgeRecipe(swordRecipe)); - } - swordPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sword" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "sword"), new EntryText(swordPages, TextHelper.localize(keyBase + "sword"), true)); - - List lesserPages = new ArrayList<>(); - lesserPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lesser" + ".info.1"), 370)); - TartaricForgeRecipe lesserRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1)); - if (lesserRecipe != null) { - lesserPages.add(new PageTartaricForgeRecipe(lesserRecipe)); - } - lesserPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "lesser" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "lesser"), new EntryText(lesserPages, TextHelper.localize(keyBase + "lesser"), true)); - - List reactionsPages = new ArrayList<>(); - reactionsPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "reactions" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "reactions"), new EntryText(reactionsPages, TextHelper.localize(keyBase + "reactions"), true)); - - List sentientGemPages = new ArrayList<>(); - sentientGemPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sentientGem" + ".info.1"), 370)); - sentientGemPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "sentientGem" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "sentientGem"), new EntryText(sentientGemPages, TextHelper.localize(keyBase + "sentientGem"), true)); - - List routingPages = new ArrayList<>(); - TartaricForgeRecipe nodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - if (nodeRecipe != null) { - routingPages.add(new PageTartaricForgeRecipe(nodeRecipe)); - } - TartaricForgeRecipe inputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE)); - if (inputNodeRecipe != null) { - routingPages.add(new PageTartaricForgeRecipe(inputNodeRecipe)); - } - TartaricForgeRecipe outputNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE)); - if (outputNodeRecipe != null) { - routingPages.add(new PageTartaricForgeRecipe(outputNodeRecipe)); - } - TartaricForgeRecipe masterNodeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE)); - if (masterNodeRecipe != null) { - routingPages.add(new PageTartaricForgeRecipe(masterNodeRecipe)); - } - - TartaricForgeRecipe nodeRouterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER)); - if (nodeRouterRecipe != null) { - routingPages.add(new PageTartaricForgeRecipe(nodeRouterRecipe)); - } - - routingPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "routing" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "routing"), new EntryText(routingPages, TextHelper.localize(keyBase + "routing"), true)); - - List auraPages = new ArrayList<>(); - - auraPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "aura" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "aura"), new EntryText(auraPages, TextHelper.localize(keyBase + "aura"), true)); - - List typesPages = new ArrayList<>(); - - typesPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "types" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "types"), new EntryText(typesPages, TextHelper.localize(keyBase + "types"), true)); - - List cruciblePages = new ArrayList<>(); - - TartaricForgeRecipe crucibleRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE)); - if (crucibleRecipe != null) { - cruciblePages.add(new PageTartaricForgeRecipe(crucibleRecipe)); - } - - cruciblePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "crucible" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "crucible"), new EntryText(cruciblePages, TextHelper.localize(keyBase + "crucible"), true)); - - List crystallizerPages = new ArrayList<>(); - - TartaricForgeRecipe crystallizerRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER)); - if (crystallizerRecipe != null) { - crystallizerPages.add(new PageTartaricForgeRecipe(crystallizerRecipe)); - } - - crystallizerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "crystallizer" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "crystallizer"), new EntryText(crystallizerPages, TextHelper.localize(keyBase + "crystallizer"), true)); - - List clusterPages = new ArrayList<>(); - - TartaricForgeRecipe clusterRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL)); - if (clusterRecipe != null) { - clusterPages.add(new PageTartaricForgeRecipe(clusterRecipe)); - } - - clusterPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "cluster" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "cluster"), new EntryText(clusterPages, TextHelper.localize(keyBase + "cluster"), true)); - - List pylonPages = new ArrayList<>(); - - TartaricForgeRecipe pylonRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON)); - if (pylonRecipe != null) { - pylonPages.add(new PageTartaricForgeRecipe(pylonRecipe)); - } - - pylonPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "pylon" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "pylon"), new EntryText(pylonPages, TextHelper.localize(keyBase + "pylon"), true)); - - List gaugePages = new ArrayList<>(); - - TartaricForgeRecipe gaugeRecipe = RecipeHelper.getForgeRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE)); - if (gaugeRecipe != null) { - gaugePages.add(new PageTartaricForgeRecipe(gaugeRecipe)); - } - - gaugePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "gauge" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "gauge"), new EntryText(gaugePages, TextHelper.localize(keyBase + "gauge"), true)); - - for (Entry entry : entries.entrySet()) { - for (IPage page : entry.getValue().pageList) { - if (page instanceof PageText) { - ((PageText) page).setUnicodeFlag(true); - } - } - } - - return entries; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java deleted file mode 100644 index 35a2adb3..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategoryRitual.java +++ /dev/null @@ -1,157 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.book; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compat.guideapi.BookUtils; -import WayofTime.bloodmagic.compat.guideapi.entry.EntryText; -import WayofTime.bloodmagic.compat.guideapi.page.PageAltarRecipe; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry.AltarRecipe; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.util.helper.RecipeHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.PageHelper; -import amerifrance.guideapi.page.PageText; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.util.ResourceLocation; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class CategoryRitual -{ - static String keyBase = "guide." + BloodMagic.MODID + ".entry.ritual."; - - public static Map buildCategory() - { - Map entries = new LinkedHashMap<>(); - - addRitualPagesToEntries("intro", entries); - addRitualPagesToEntries("basics", entries); - - List ritualStonePages = new ArrayList<>(); - - IRecipe ritualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); - if (ritualStoneRecipe != null) - { - ritualStonePages.add(BookUtils.getPageForRecipe(ritualStoneRecipe)); - } - - ritualStonePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ritualStone" + ".info.1"), 370)); - - for (int i = 1; i < 5; i++) - { - EnumRuneType type = EnumRuneType.values()[i]; - AltarRecipe scribeRecipe = RecipeHelper.getAltarRecipeForOutput(type.getStack()); - if (scribeRecipe != null) - { - ritualStonePages.add(new PageAltarRecipe(scribeRecipe)); - } - } - - ritualStonePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "ritualStone" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "ritualStone"), new EntryText(ritualStonePages, TextHelper.localize(keyBase + "ritualStone"), true)); - - List masterRitualStonePages = new ArrayList<>(); - - IRecipe masterRitualStoneRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER, 1, 0)); - if (masterRitualStoneRecipe != null) - { - masterRitualStonePages.add(BookUtils.getPageForRecipe(masterRitualStoneRecipe)); - } - - masterRitualStonePages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "masterRitualStone" + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + "masterRitualStone"), new EntryText(masterRitualStonePages, TextHelper.localize(keyBase + "masterRitualStone"), true)); - - List activationCrystalPages = new ArrayList<>(); - - activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.1"), 370)); - - AltarRecipe crystalRecipe = RecipeHelper.getAltarRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL)); - if (crystalRecipe != null) - { - activationCrystalPages.add(new PageAltarRecipe(crystalRecipe)); - } - - activationCrystalPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "activationCrystal" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "activationCrystal"), new EntryText(activationCrystalPages, TextHelper.localize(keyBase + "activationCrystal"), true)); - - List divinerPages = new ArrayList<>(); - - divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.1"), 370)); - - IRecipe divinerRecipe = RecipeHelper.getRecipeForOutput(new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER)); - if (divinerRecipe != null) - { - divinerPages.add(BookUtils.getPageForRecipe(divinerRecipe)); - } - - divinerPages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + "diviner" + ".info.2"), 370)); - entries.put(new ResourceLocation(keyBase + "diviner"), new EntryText(divinerPages, TextHelper.localize(keyBase + "diviner"), true)); - - addRitualPagesToEntries("fullSpring", entries); - addRitualPagesToEntries("lava", entries); - addRitualPagesToEntries("greenGrove", entries); - addRitualPagesToEntries("magnetism", entries); - addRitualPagesToEntries("crusher", entries); - addRitualPagesToEntries("highJump", entries); - addRitualPagesToEntries("speed", entries); - addRitualPagesToEntries("wellOfSuffering", entries); - addRitualPagesToEntries("featheredKnife", entries); - addRitualPagesToEntries("regen", entries); - addRitualPagesToEntries("harvest", entries); - addRitualPagesToEntries("interdiction", entries); - addRitualPagesToEntries("containment", entries); - addRitualPagesToEntries("suppression", entries); - addRitualPagesToEntries("expulsion", entries); - addRitualPagesToEntries("zephyr", entries); - addRitualPagesToEntries("laying", entries); - addRitualPagesToEntries("timberman", entries); - addRitualPagesToEntries("meteor", entries); - addRitualPagesToEntries("downgrade", entries); - addRitualPagesToEntries("crystalSplit", entries); - addRitualPagesToEntries("portal", entries); - addRitualPagesToEntries("altarBuilder", entries); - addRitualPagesToEntries("pump", entries); - addRitualPagesToEntries("cobble", entries); - addRitualPagesToEntries("ellipsoid", entries); - addRitualPagesToEntries("crystalHarvest", entries); - addRitualPagesToEntries("forsakenSoul", entries); - addRitualPagesToEntries("animalGrowth", entries); - addRitualPagesToEntries("livingEvolution", entries); - addRitualPagesToEntries("upgradeRemove", entries); - addRitualPagesToEntries("fullStomach", entries); - addRitualPagesToEntries("eternalSoul", entries); - addRitualPagesToEntries("condor", entries); - addRitualPagesToEntries("featheredEarth", entries); - addRitualPagesToEntries("grounding", entries); - addRitualPagesToEntries("veilOfEvil", entries); - addRitualPagesToEntries("wardOfSacrosanctity", entries); - - for (Entry entry : entries.entrySet()) - { - for (IPage page : entry.getValue().pageList) - { - if (page instanceof PageText) - { - ((PageText) page).setUnicodeFlag(true); - } - } - } - - return entries; - } - - public static void addRitualPagesToEntries(String name, Map entries) - { - List pages = new ArrayList<>(); - pages.addAll(PageHelper.pagesForLongText(TextHelper.localize(keyBase + name + ".info"), 370)); - entries.put(new ResourceLocation(keyBase + name), new EntryText(pages, TextHelper.localize(keyBase + name), true)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java deleted file mode 100644 index 680bffda..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/book/CategorySpell.java +++ /dev/null @@ -1,17 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.book; - -import WayofTime.bloodmagic.util.Constants; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import net.minecraft.util.ResourceLocation; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class CategorySpell { - public static Map buildCategory() { - Map entries = new LinkedHashMap<>(); - String keyBase = Constants.Mod.DOMAIN + "spell_"; - - return entries; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java deleted file mode 100644 index 9ce5c229..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/entry/EntryText.java +++ /dev/null @@ -1,52 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.entry; - -import amerifrance.guideapi.api.IPage; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.entry.EntryResourceLocation; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Collections; -import java.util.List; - -public class EntryText extends EntryResourceLocation { - - public EntryText(List pageList, String unlocEntryName, boolean unicode) { - super(pageList, unlocEntryName, new ResourceLocation("bloodmagicguide", "textures/gui/bullet_point.png"), unicode); - } - - public EntryText(List pageList, String unlocEntryName) { - this(pageList, unlocEntryName, false); - } - - @Override - @SideOnly(Side.CLIENT) - public void drawExtras(Book book, CategoryAbstract category, int entryX, int entryY, int entryWidth, int entryHeight, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRendererObj) { - Minecraft.getInstance().getTextureManager().bindTexture(image); - GuiHelper.drawSizedIconWithoutColor(entryX + 4, entryY + 2, 8, 8, 1F); - - boolean startFlag = fontRendererObj.getUnicodeFlag(); - fontRendererObj.setUnicodeFlag(false); - - // Cutting code ripped from GuiButtonExt#drawButton(...) - int strWidth = fontRendererObj.getStringWidth(getLocalizedName()); - boolean cutString = false; - - if (strWidth > guiBase.xSize - 80 && strWidth > fontRendererObj.getStringWidth("...")) - cutString = true; - - if (GuiHelper.isMouseBetween(mouseX, mouseY, entryX, entryY, entryWidth, entryHeight) && cutString) { - - guiBase.drawHoveringText(Collections.singletonList(getLocalizedName()), entryX, entryY + 12); - fontRendererObj.setUnicodeFlag(unicode); - } - - fontRendererObj.setUnicodeFlag(startFlag); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java deleted file mode 100644 index b3325e86..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAlchemyArray.java +++ /dev/null @@ -1,94 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.page; - -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.Page; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class PageAlchemyArray extends Page { - public static final double scale = 58d / 256d; - public final ItemStack inputStack; - public final ItemStack catalystStack; - public final ItemStack outputStack; - public List arrayResources = new ArrayList<>(); - - public PageAlchemyArray(List arrayResources, ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) { - this.arrayResources = arrayResources; - this.inputStack = inputStack; - this.catalystStack = catalystStack; - this.outputStack = outputStack; - } - - public PageAlchemyArray(List resources, ItemStack inputStack, ItemStack catalystStack) { - this(resources, inputStack, catalystStack, ItemStack.EMPTY); - } - - public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack catalystStack, ItemStack outputStack) { - this(Collections.singletonList(resource), inputStack, catalystStack, outputStack); - } - - public PageAlchemyArray(ResourceLocation resource, ItemStack inputStack, ItemStack catalystStack) { - this(Collections.singletonList(resource), inputStack, catalystStack); - } - - @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) { - int x = guiLeft + 65; - int y = guiTop + 30; - - Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/alchemyArrayCrafting.png")); - guiBase.drawTexturedModalRect(x, y, 0, 0, 62, 88 + (outputStack.isEmpty() ? 0 : 26)); - - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.alchemyArray"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - - for (ResourceLocation arrayResource : arrayResources) { - Minecraft.getInstance().getTextureManager().bindTexture(arrayResource); - GlStateManager.pushMatrix(); - GlStateManager.translate(x + 2, y + 28, 0); - GlStateManager.scale(scale, scale, scale); - guiBase.drawTexturedModalRect(0, 0, 0, 0, 256, 256); - GlStateManager.popMatrix(); - } - - int inputX = x + 3; - int inputY = y + 3; - GuiHelper.drawItemStack(inputStack, inputX, inputY); - - int catalystX = x + 43; - int catalystY = y + 3; - GuiHelper.drawItemStack(catalystStack, catalystX, catalystY); - - if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) { - guiBase.renderToolTip(inputStack, mouseX, mouseY); - } - - if (GuiHelper.isMouseBetween(mouseX, mouseY, catalystX, catalystY, 15, 15)) { - guiBase.renderToolTip(catalystStack, mouseX, mouseY); - } - - if (!outputStack.isEmpty()) { - int outputX = x + 43; - int outputY = y + 95; - - GuiHelper.drawItemStack(outputStack, outputX, outputY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { - guiBase.renderToolTip(outputStack, mouseX, mouseY); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java deleted file mode 100644 index a2327e95..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageAltarRecipe.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.page; - -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.Page; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.block.Blocks; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -public class PageAltarRecipe extends Page { - - public List input; - public ItemStack output; - public int tier; - public int bloodRequired; - - public PageAltarRecipe(AltarRecipeRegistry.AltarRecipe recipe) { - this.input = ItemStackWrapper.toStackList(recipe.getInput()); - this.output = recipe.getOutput(); - this.tier = recipe.getMinTier().toInt(); - this.bloodRequired = recipe.getSyphon(); - } - - @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) { - Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/altar.png")); - guiBase.drawTexturedModalRect(guiLeft + 42, guiTop + 53, 0, 0, 146, 104); - - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.bloodAltar"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - - int inputX = (1 + 1) * 20 + (guiLeft + guiBase.xSize / 7) + 1; - int inputY = (20) + (guiTop + guiBase.ySize / 5) - 1; //1 * 20 - GuiHelper.drawItemStack(input.get(0), inputX, inputY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) { - guiBase.renderToolTip(input.get(0), mouseX, mouseY); - } - - if (output.isEmpty()) { - output = new ItemStack(Blocks.BARRIER); - } - int outputX = (5 * 20) + (guiLeft + guiBase.xSize / 7) + 1; - int outputY = (20) + (guiTop + guiBase.xSize / 5) - 1; // 1 * 20 - GuiHelper.drawItemStack(output, outputX, outputY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { - guiBase.renderToolTip(output, outputX, outputY); - } - - if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) { - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("text.furnace.error"), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0xED073D); - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("bm.string.tier") + ": " + String.valueOf(tier), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 + 15, 0); - guiBase.drawCenteredString(fontRenderer, "LP: " + String.valueOf(bloodRequired), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 + 30, 0); - } - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.tier", String.valueOf(tier)), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0); - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.lp", String.valueOf(bloodRequired)), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 + 15, 0); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java deleted file mode 100644 index 7b3dad2b..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/guideapi/page/PageTartaricForgeRecipe.java +++ /dev/null @@ -1,125 +0,0 @@ -package WayofTime.bloodmagic.compat.guideapi.page; - -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.util.helper.TextHelper; -import amerifrance.guideapi.api.impl.Book; -import amerifrance.guideapi.api.impl.Page; -import amerifrance.guideapi.api.impl.abstraction.CategoryAbstract; -import amerifrance.guideapi.api.impl.abstraction.EntryAbstract; -import amerifrance.guideapi.api.util.GuiHelper; -import amerifrance.guideapi.gui.GuiBase; -import net.minecraft.block.Blocks; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.List; -import java.util.Random; - -public class PageTartaricForgeRecipe extends Page { - public List input; - public ItemStack output; - public int tier; - public double minimumWill; - public double drainedWill; - - private int cycleIdx = 0; - private Random rand = new Random(); - - public PageTartaricForgeRecipe(TartaricForgeRecipe recipe) { - this.input = recipe.getInput(); - this.output = recipe.getRecipeOutput(); - this.tier = 0; - this.minimumWill = recipe.getMinimumSouls(); - this.drainedWill = recipe.getSoulsDrained(); - } - - @SuppressWarnings("unchecked") - @Override - @SideOnly(Side.CLIENT) - public void draw(Book book, CategoryAbstract category, EntryAbstract entry, int guiLeft, int guiTop, int mouseX, int mouseY, GuiBase guiBase, FontRenderer fontRenderer) { - Minecraft.getInstance().getTextureManager().bindTexture(new ResourceLocation("bloodmagicguide" + ":textures/gui/soulForge.png")); - guiBase.drawTexturedModalRect(guiLeft + 42, guiTop + 53, 0, 0, 146, 104); - - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.soulForge"), guiLeft + guiBase.xSize / 2, guiTop + 12, 0); - -// int inputX = (1 + 1) * 20 + (guiLeft + guiBase.xSize / 7) + 1; -// int inputY = (20) + (guiTop + guiBase.ySize / 5) - 1; //1 * 20 - - for (int y = 0; y < 2; y++) { - for (int x = 0; x < 2; x++) { - int stackX = (x + 1) * 20 + (guiLeft + guiBase.xSize / 7) + 1; - int stackY = (y + 1) * 20 + (guiTop + guiBase.ySize / 5) - 1; - Object component = input.size() > y * 2 + x ? input.get(y * 2 + x) : null;//recipe.getInput()[y * 2 + x]; - if (component != null) { - if (component instanceof ItemStack) { - ItemStack input = (ItemStack) component; - if (input.getItemDamage() == OreDictionary.WILDCARD_VALUE) - input.setItemDamage(0); - - GuiHelper.drawItemStack((ItemStack) component, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) { -// tooltips = GuiHelper.getTooltip((ItemStack) component); - guiBase.renderToolTip((ItemStack) component, mouseX, mouseY); - } - } else if (component instanceof Integer) { - List list = OrbRegistry.getOrbsDownToTier((Integer) component); - if (!list.isEmpty()) { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 2), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) { -// tooltips = GuiHelper.getTooltip(stack); - guiBase.renderToolTip(stack, mouseX, mouseY); - } - } - } else { - List list = (List) component; - if (!list.isEmpty()) { - ItemStack stack = list.get(getRandomizedCycle(x + (y * 2), list.size())); - GuiHelper.drawItemStack(stack, stackX, stackY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, stackX, stackY, 15, 15)) { -// tooltips = GuiHelper.getTooltip(stack); - guiBase.renderToolTip(stack, mouseX, mouseY); - } - } - } - } - } - } - -// GuiHelper.drawItemStack(input.get(0), inputX, inputY); -// if (GuiHelper.isMouseBetween(mouseX, mouseY, inputX, inputY, 15, 15)) -// { -// guiBase.renderToolTip(input.get(0), mouseX, mouseY); -// } - - if (output == null) { - output = new ItemStack(Blocks.BARRIER); - } - int outputX = (5 * 20) + (guiLeft + guiBase.xSize / 7) + 1; - int outputY = (20) + (guiTop + guiBase.xSize / 5) + 10; // 1 * 20 - GuiHelper.drawItemStack(output, outputX, outputY); - if (GuiHelper.isMouseBetween(mouseX, mouseY, outputX, outputY, 15, 15)) { - guiBase.renderToolTip(output, outputX, outputY); - } - - if (output.getItem() == Item.getItemFromBlock(Blocks.BARRIER)) { - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("text.furnace.error"), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0xED073D); - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("bm.string.tier") + ": " + String.valueOf(tier), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 + 15, 0); -// guiBase.drawCenteredString(fontRenderer, "LP: " + String.valueOf(bloodRequired), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 + 30, 0); - } - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.minimumWill", String.valueOf(minimumWill)), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6 - 15, 0); - guiBase.drawCenteredString(fontRenderer, TextHelper.localize("guide.bloodmagic.page.drainedWill", String.valueOf(drainedWill)), guiLeft + guiBase.xSize / 2, guiTop + 4 * guiBase.ySize / 6, 0); - } - - protected int getRandomizedCycle(int index, int max) { - rand.setSeed(index); - return (index + rand.nextInt(max) + cycleIdx) % max; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java index 2384c305..4ddce32c 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicJEIPlugin.java @@ -1,232 +1,62 @@ -package WayofTime.bloodmagic.compat.jei; +package wayoftime.bloodmagic.compat.jei; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; -import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.block.enums.EnumDecorative; -import WayofTime.bloodmagic.client.gui.GuiSoulForge; -import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingCategory; -import WayofTime.bloodmagic.compat.jei.alchemyArray.AlchemyArrayCraftingRecipeJEI; -import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeCategory; -import WayofTime.bloodmagic.compat.jei.alchemyTable.AlchemyTableRecipeJEI; -import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeCategory; -import WayofTime.bloodmagic.compat.jei.altar.AltarRecipeJEI; -import WayofTime.bloodmagic.compat.jei.armourDowngrade.ArmourDowngradeRecipeCategory; -import WayofTime.bloodmagic.compat.jei.armourDowngrade.ArmourDowngradeRecipeHandler; -import WayofTime.bloodmagic.compat.jei.armourDowngrade.ArmourDowngradeRecipeMaker; -import WayofTime.bloodmagic.compat.jei.binding.BindingRecipeCategory; -import WayofTime.bloodmagic.compat.jei.binding.BindingRecipeHandler; -import WayofTime.bloodmagic.compat.jei.binding.BindingRecipeMaker; -import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeCategory; -import WayofTime.bloodmagic.compat.jei.forge.TartaricForgeRecipeJEI; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; -import mezz.jei.api.*; -import mezz.jei.api.recipe.IRecipeCategoryRegistration; -import mezz.jei.api.recipe.IRecipeWrapper; -import mezz.jei.api.recipe.IVanillaRecipeFactory; -import mezz.jei.api.recipe.VanillaRecipeCategoryUid; +import java.util.Objects; + +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.helpers.IJeiHelpers; +import mezz.jei.api.registration.IRecipeCatalystRegistration; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.compat.jei.altar.BloodAltarRecipeCategory; +import wayoftime.bloodmagic.compat.jei.array.AlchemyArrayCraftingCategory; +import wayoftime.bloodmagic.compat.jei.forge.TartaricForgeRecipeCategory; -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +@JeiPlugin +public class BloodMagicJEIPlugin implements IModPlugin +{ + public static IJeiHelpers jeiHelper; -@JEIPlugin -public class BloodMagicJEIPlugin implements IModPlugin { - public static IJeiHelpers jeiHelper; + private static final ResourceLocation ID = BloodMagic.rl("jei_plugin"); - @Override - public void register(@Nonnull IModRegistry registry) { - jeiHelper = registry.getJeiHelpers(); + @Override + public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) + { + registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.SOUL_FORGE.get()), TartaricForgeRecipeCategory.UID); + registration.addRecipeCatalyst(new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get()), BloodAltarRecipeCategory.UID); + registration.addRecipeCatalyst(new ItemStack(BloodMagicItems.ARCANE_ASHES.get()), AlchemyArrayCraftingCategory.UID); + } - registry.addRecipeHandlers( - new BindingRecipeHandler(), - new ArmourDowngradeRecipeHandler() - ); + @Override + public void registerCategories(IRecipeCategoryRegistration registration) + { + jeiHelper = registration.getJeiHelpers(); + registration.addRecipeCategories(new TartaricForgeRecipeCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new BloodAltarRecipeCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new AlchemyArrayCraftingCategory(registration.getJeiHelpers().getGuiHelper())); + } - registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAltarRecipes(), Constants.Compat.JEI_CATEGORY_ALTAR); - registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForgeRecipes(), Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArrayRecipes(), Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); - registry.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyRecipes(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - registry.addRecipes(AlchemyTableRecipeRegistry.getRecipeList(), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); + @Override + public void registerRecipes(IRecipeRegistration registration) + { + ClientWorld world = Objects.requireNonNull(Minecraft.getInstance().world); + registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForgeRecipes(world), TartaricForgeRecipeCategory.UID); + registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAltarRecipes(world), BloodAltarRecipeCategory.UID); + registration.addRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArrayRecipes(world), AlchemyArrayCraftingCategory.UID); + } - registry.addRecipes(getAnvilRecipes(), VanillaRecipeCategoryUid.ANVIL); + @Override + public ResourceLocation getPluginUid() + { + return ID; + } - registry.handleRecipes(RecipeBloodAltar.class, AltarRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALTAR); - registry.handleRecipes(RecipeTartaricForge.class, TartaricForgeRecipeJEI::new, Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.handleRecipes(RecipeAlchemyArray.class, AlchemyArrayCraftingRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); - registry.handleRecipes(RecipeAlchemyTable.class, AlchemyTableRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - registry.handleRecipes(AlchemyTableRecipe.class, AlchemyTableRecipeJEI::new, Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - - registry.addRecipes(BindingRecipeMaker.getRecipes()); - registry.addRecipes(ArmourDowngradeRecipeMaker.getRecipes()); - - registry.addIngredientInfo(new ItemStack(RegistrarBloodMagicItems.ALTAR_MAKER), ItemStack.class, "jei.bloodmagic.desc.altarBuilder"); - registry.addIngredientInfo(new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL), ItemStack.class, "jei.bloodmagic.desc.demonicWill"); - - for (Map.Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { - String key = entry.getKey(); - int maxLevel = entry.getValue(); - for (int i = 0; i < maxLevel - 1; i++) { - ItemStack stack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); - LivingUpgrades.setKey(stack, key); - LivingUpgrades.setLevel(stack, i); - jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(stack); - } - } - - registry.addRecipeClickArea(GuiSoulForge.class, 115, 15, 16, 88, Constants.Compat.JEI_CATEGORY_SOULFORGE); - - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicBlocks.ALTAR), Constants.Compat.JEI_CATEGORY_ALTAR); - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicBlocks.SOUL_FORGE), Constants.Compat.JEI_CATEGORY_SOULFORGE); - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), Constants.Compat.JEI_CATEGORY_BINDING); - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicBlocks.ALCHEMY_TABLE), Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE); - registry.addRecipeCatalyst(new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER), Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE); - - if (!ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { - jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_TILE.ordinal())); - jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, EnumDecorative.CRYSTAL_BRICK.ordinal())); - jeiHelper.getIngredientBlacklist().addIngredientToBlacklist(new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, 1, EnumRuneType.DAWN.ordinal())); - } - } - - @Override - public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { - subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.UPGRADE_TOME); - subtypeRegistry.useNbtForSubtypes(RegistrarBloodMagicItems.POTION_FLASK); - subtypeRegistry.registerSubtypeInterpreter(RegistrarBloodMagicItems.BLOOD_ORB, stack -> { - if (!(stack.getItem() instanceof IBloodOrb)) - return ISubtypeRegistry.ISubtypeInterpreter.NONE; - - BloodOrb orb = ((IBloodOrb) stack.getItem()).getOrb(stack); - if (orb == null) - return ISubtypeRegistry.ISubtypeInterpreter.NONE; - - return orb.getRegistryName().toString(); - }); - } - - @Override - public void registerCategories(IRecipeCategoryRegistration registry) { - if (jeiHelper == null) - jeiHelper = registry.getJeiHelpers(); - - registry.addRecipeCategories( - new AltarRecipeCategory(), - new BindingRecipeCategory(), - new AlchemyArrayCraftingCategory(), - new TartaricForgeRecipeCategory(), - new AlchemyTableRecipeCategory(), - new ArmourDowngradeRecipeCategory() - ); - } - - public Collection getAnvilRecipes() { - IVanillaRecipeFactory vanillaRecipeFactory = jeiHelper.getVanillaRecipeFactory(); - - - /* Sentient Tool repair recipes */ - - List outputSwords = new LinkedList<>(); - List outputPickaxes = new LinkedList<>(); - List outputAxes = new LinkedList<>(); - List outputBows = new LinkedList<>(); - List outputShovels = new LinkedList<>(); - - List inputRightSentient = new LinkedList<>(); - - List> sentientOutputs = new LinkedList<>(); - - List sentientTools = new LinkedList<>(); - sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE)); - sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_PICKAXE)); - sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW)); - sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL)); - sentientTools.add(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD)); - - for (int i = 4; i > 0; i--) { - for (ItemStack j : sentientTools) { - int maxDmg = j.getMaxDamage(); - j.setItemDamage(maxDmg - (maxDmg / 4) * i); - } - outputAxes.add(sentientTools.get(0).copy()); - outputPickaxes.add(sentientTools.get(1).copy()); - outputBows.add(sentientTools.get(2).copy()); - outputShovels.add(sentientTools.get(3).copy()); - outputSwords.add(sentientTools.get(4).copy()); - - inputRightSentient.add(new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, i)); - } - sentientOutputs.add(outputAxes); - sentientOutputs.add(outputPickaxes); - sentientOutputs.add(outputBows); - sentientOutputs.add(outputShovels); - sentientOutputs.add(outputSwords); - - - Collection collection = new LinkedList<>(); - - for (int i = 0; i < 5; i++) { - ItemStack inputLeft = sentientTools.get(i); - inputLeft.setItemDamage(inputLeft.getMaxDamage()); - collection.add(vanillaRecipeFactory.createAnvilRecipe(inputLeft, inputRightSentient, sentientOutputs.get(i))); - } - - /* Living Armor repair recipes */ - - List outputHelmets = new LinkedList<>(); - List outputChestplates = new LinkedList<>(); - List outputLeggings = new LinkedList<>(); - List outputBoots = new LinkedList<>(); - - List inputRightLiving = new LinkedList<>(); - - List> livingOutputs = new LinkedList<>(); - - List livingTools = new LinkedList<>(); - livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET)); - livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST)); - livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS)); - livingTools.add(new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS)); - - for (int i = 4; i > 0; i--) { - for (ItemStack j : livingTools) { - int maxDmg = j.getMaxDamage(); - j.setItemDamage(maxDmg - (maxDmg / 4) * i); - } - outputHelmets.add(livingTools.get(0).copy()); - outputChestplates.add(livingTools.get(1).copy()); - outputLeggings.add(livingTools.get(2).copy()); - outputBoots.add(livingTools.get(3).copy()); - - inputRightLiving.add(new ItemStack(RegistrarBloodMagicItems.COMPONENT, i, 8)); - } - livingOutputs.add(outputHelmets); - livingOutputs.add(outputChestplates); - livingOutputs.add(outputLeggings); - livingOutputs.add(outputBoots); - - for (int i = 0; i < 4; i++) { - ItemStack inputLeft = livingTools.get(i); - inputLeft.setItemDamage(inputLeft.getMaxDamage()); - collection.add(vanillaRecipeFactory.createAnvilRecipe(inputLeft, inputRightLiving, livingOutputs.get(i))); - } - - return collection; - } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java deleted file mode 100644 index b6284e66..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingCategory.java +++ /dev/null @@ -1,75 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyArray; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class AlchemyArrayCraftingCategory implements IRecipeCategory { - private static final int INPUT_SLOT = 0; - private static final int CATALYST_SLOT = 1; - private static final int OUTPUT_SLOT = 2; - - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/binding.png"), 0, 0, 100, 30); - @Nonnull - private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.alchemyArrayCrafting"); - - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY; - } - - @Nonnull - @Override - public String getTitle() { - return localizedName; - } - - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void drawExtras(Minecraft minecraft) { - - } - - @Nullable - @Override - public IDrawable getIcon() { - return null; - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { - recipeLayout.getItemStacks().init(INPUT_SLOT, true, 0, 5); - recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 29, 3); - recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 73, 5); - - if (recipeWrapper instanceof AlchemyArrayCraftingRecipeJEI) { - recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - recipeLayout.getItemStacks().set(CATALYST_SLOT, ingredients.getInputs(ItemStack.class).get(1)); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - } - } - - @Override - public String getModName() { - return BloodMagic.NAME; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java deleted file mode 100644 index ce5ec8a6..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyArray/AlchemyArrayCraftingRecipeJEI.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyArray; - -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; - -public class AlchemyArrayCraftingRecipeJEI implements IRecipeWrapper { - @Nonnull - private final List inputs; - @Nullable - private final List catalyst; - @Nonnull - private final ItemStack output; - - public AlchemyArrayCraftingRecipeJEI(RecipeAlchemyArray array) { - this.inputs = NonNullList.from(ItemStack.EMPTY, array.getInput().getMatchingStacks()); - this.catalyst = NonNullList.from(ItemStack.EMPTY, array.getCatalyst().getMatchingStacks()); - this.output = array.getOutput(); - } - - @Override - public void getIngredients(IIngredients ingredients) { - ingredients.setInputLists(ItemStack.class, Lists.newArrayList(inputs, catalyst)); - ingredients.setOutput(ItemStack.class, output); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java deleted file mode 100644 index c15e1db3..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeCategory.java +++ /dev/null @@ -1,75 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyTable; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.ICraftingGridHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; - -public class AlchemyTableRecipeCategory implements IRecipeCategory { - - private static final int OUTPUT_SLOT = 0; - private static final int ORB_SLOT = 1; - private static final int INPUT_SLOT = 2; - - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/alchemyTable.png"), 0, 0, 118, 40); - @Nonnull - private final ICraftingGridHelper craftingGridHelper; - - public AlchemyTableRecipeCategory() { - craftingGridHelper = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); - } - - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_ALCHEMYTABLE; - } - - @Nonnull - @Override - public String getTitle() { - return TextHelper.localize("jei.bloodmagic.recipe.alchemyTable"); - } - - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, AlchemyTableRecipeJEI recipeWrapper, IIngredients ingredients) { - IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); - - guiItemStacks.init(OUTPUT_SLOT, false, 91, 13); - guiItemStacks.init(ORB_SLOT, true, 60, 0); - - for (int y = 0; y < 3; ++y) { - for (int x = 0; x < 3; ++x) { - int index = INPUT_SLOT + x + (y * 3); - guiItemStacks.init(index, true, x * 18, y * 18 - 18); - } - } - - guiItemStacks.set(ORB_SLOT, OrbRegistry.getOrbsDownToTier(recipeWrapper.getTier())); - guiItemStacks.set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); - } - - @Override - public String getModName() { - return BloodMagic.NAME; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java deleted file mode 100644 index ba639936..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/alchemyTable/AlchemyTableRecipeJEI.java +++ /dev/null @@ -1,60 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.alchemyTable; - -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -public class AlchemyTableRecipeJEI implements IRecipeWrapper { - - private final List input; - private final ItemStack output; - private final int tier; - private final int syphon; - private final int ticks; - - public AlchemyTableRecipeJEI(AlchemyTableRecipe recipe) { - this.input = recipe.getInput(); - this.output = recipe.getRecipeOutput(Lists.newArrayList()); - this.tier = recipe.getTierRequired(); - this.syphon = recipe.getLpDrained(); - this.ticks = recipe.getTicksRequired(); - } - - public AlchemyTableRecipeJEI(RecipeAlchemyTable recipe) { - this.input = recipe.getInput(); - this.output = recipe.getOutput(); - this.tier = recipe.getMinimumTier(); - this.syphon = recipe.getSyphon(); - this.ticks = recipe.getTicks(); - } - - @Override - public void getIngredients(IIngredients ingredients) { - List> expanded = BloodMagicJEIPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(input); - ingredients.setInputLists(ItemStack.class, expanded); - ingredients.setOutput(ItemStack.class, output); - } - - @Override - public List getTooltipStrings(int mouseX, int mouseY) { - ArrayList ret = new ArrayList<>(); - if (mouseX >= 58 && mouseX <= 78 && mouseY >= 21 && mouseY <= 34) { - ret.add(TextHelper.localize("tooltip.bloodmagic.tier", tier)); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.lpDrained", syphon)); - ret.add(TextHelper.localize("jei.bloodmagic.recipe.ticksRequired", ticks)); - } - return ret; - } - - public int getTier() { - return tier; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java deleted file mode 100644 index 10f2f6a2..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeCategory.java +++ /dev/null @@ -1,68 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.altar; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class AltarRecipeCategory implements IRecipeCategory { - private static final int INPUT_SLOT = 0; - private static final int OUTPUT_SLOT = 1; - - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/altar.png"), 3, 4, 155, 65); - - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_ALTAR; - } - - @Nonnull - @Override - public String getTitle() { - return TextHelper.localize("jei.bloodmagic.recipe.altar"); - } - - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void drawExtras(Minecraft minecraft) { - - } - - @Nullable - @Override - public IDrawable getIcon() { - return null; - } - - @Override - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull AltarRecipeJEI recipeWrapper, @Nonnull IIngredients ingredients) { - recipeLayout.getItemStacks().init(INPUT_SLOT, true, 31, 0); - recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 125, 30); - - recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - } - - @Nonnull - @Override - public String getModName() { - return BloodMagic.NAME; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java deleted file mode 100644 index 281e9b42..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/altar/AltarRecipeJEI.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.altar; - -import WayofTime.bloodmagic.api.impl.recipe.RecipeBloodAltar; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -import javax.annotation.Nonnull; -import java.awt.Color; -import java.util.List; - -public class AltarRecipeJEI implements IRecipeWrapper { - @Nonnull - private final List input; - @Nonnull - private final ItemStack output; - - private final String[] infoString; - private final int consumptionRate; - private final int drainRate; - - public AltarRecipeJEI(RecipeBloodAltar recipe) { - this.input = NonNullList.from(ItemStack.EMPTY, recipe.getInput().getMatchingStacks()); - this.output = recipe.getOutput(); - - this.infoString = new String[]{TextHelper.localize("jei.bloodmagic.recipe.requiredTier", NumeralHelper.toRoman(recipe.getMinimumTier().toInt())), TextHelper.localize("jei.bloodmagic.recipe.requiredLP", recipe.getSyphon())}; - this.consumptionRate = recipe.getConsumeRate(); - this.drainRate = recipe.getDrainRate(); - } - - @Override - public void getIngredients(@Nonnull IIngredients ingredients) { - ingredients.setInputs(ItemStack.class, input); - ingredients.setOutput(ItemStack.class, output); - } - - @Nonnull - @Override - public List getTooltipStrings(int mouseX, int mouseY) { - List tooltip = Lists.newArrayList(); - if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) { - tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.consumptionRate", consumptionRate)); - tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.drainRate", drainRate)); - } - return tooltip; - } - - @Override - public void drawInfo(@Nonnull Minecraft minecraft, int recipeWidth, int recipeHeight, int mouseX, int mouseY) { - minecraft.fontRenderer.drawString(infoString[0], 90 - minecraft.fontRenderer.getStringWidth(infoString[0]) / 2, 0, Color.gray.getRGB()); - minecraft.fontRenderer.drawString(infoString[1], 90 - minecraft.fontRenderer.getStringWidth(infoString[1]) / 2, 10, Color.gray.getRGB()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java deleted file mode 100644 index b14c69fd..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeCategory.java +++ /dev/null @@ -1,93 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.armourDowngrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.ICraftingGridHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class ArmourDowngradeRecipeCategory implements IRecipeCategory { - private static final int OUTPUT_SLOT = 0; - private static final int KEY_SLOT = 1; - private static final int INPUT_SLOT = 2; - - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/alchemyTable.png"), 0, 0, 118, 40); - @Nonnull - private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.armourDowngrade"); - @Nonnull - private final ICraftingGridHelper craftingGridHelper; - - public ArmourDowngradeRecipeCategory() { - craftingGridHelper = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); - } - - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE; - } - - @Nonnull - @Override - public String getTitle() { - return localizedName; - } - - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void drawExtras(Minecraft minecraft) { - - } - - @Nullable - @Override - public IDrawable getIcon() { - return null; - } - - @Override - @SuppressWarnings("unchecked") - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull IRecipeWrapper recipeWrapper, IIngredients ingredients) { - IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); - - guiItemStacks.init(OUTPUT_SLOT, false, 91, 13); - guiItemStacks.init(KEY_SLOT, true, 60, 0); - - for (int y = 0; y < 3; ++y) { - for (int x = 0; x < 3; ++x) { - int index = INPUT_SLOT + x + (y * 3); - guiItemStacks.init(index, true, x * 18, y * 18 - 18); - } - } - - if (recipeWrapper instanceof ArmourDowngradeRecipeJEI) { - guiItemStacks.set(KEY_SLOT, ingredients.getInputs(ItemStack.class).get(ingredients.getInputs(ItemStack.class).size() - 1)); - ingredients.getInputs(ItemStack.class).remove(ingredients.getInputs(ItemStack.class).size() - 1); - guiItemStacks.set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - craftingGridHelper.setInputs(guiItemStacks, ingredients.getInputs(ItemStack.class), 3, 2); - } - } - - @Override - public String getModName() { - return BloodMagic.NAME; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java deleted file mode 100644 index b5c2fd73..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.armourDowngrade; - -import WayofTime.bloodmagic.util.Constants; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class ArmourDowngradeRecipeHandler implements IRecipeHandler { - @Nonnull - @Override - public Class getRecipeClass() { - return ArmourDowngradeRecipeJEI.class; - } - - @Nonnull - @Override - public String getRecipeCategoryUid(ArmourDowngradeRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_ARMOURDOWNGRADE; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull ArmourDowngradeRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull ArmourDowngradeRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java deleted file mode 100644 index ba22f8c5..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeJEI.java +++ /dev/null @@ -1,34 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.armourDowngrade; - -import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.BlankRecipeWrapper; -import net.minecraft.item.ItemStack; - -import java.util.List; - -public class ArmourDowngradeRecipeJEI extends BlankRecipeWrapper { - private LivingArmourDowngradeRecipe recipe; - - public ArmourDowngradeRecipeJEI(LivingArmourDowngradeRecipe recipe) { - this.recipe = recipe; - } - - @Override - public void getIngredients(IIngredients ingredients) { - List> expanded = BloodMagicJEIPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); - expanded.add(Lists.newArrayList(recipe.getKey())); - ingredients.setInputLists(ItemStack.class, expanded); - ItemStack upgradeStack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); - LivingUpgrades.setUpgrade(upgradeStack, recipe.getRecipeOutput()); - ingredients.setOutput(ItemStack.class, upgradeStack); - } - - public LivingArmourDowngradeRecipe getRecipe() { - return recipe; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java deleted file mode 100644 index 90ca286d..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/armourDowngrade/ArmourDowngradeRecipeMaker.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.armourDowngrade; - -import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class ArmourDowngradeRecipeMaker { - @Nonnull - public static List getRecipes() { - List recipeList = LivingArmourDowngradeRecipeRegistry.getRecipeList(); - ArrayList recipes = new ArrayList<>(); - - for (LivingArmourDowngradeRecipe recipe : recipeList) - recipes.add(new ArmourDowngradeRecipeJEI(recipe)); - - return recipes; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java deleted file mode 100644 index a2493fbd..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeCategory.java +++ /dev/null @@ -1,75 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.binding; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class BindingRecipeCategory implements IRecipeCategory { - private static final int INPUT_SLOT = 0; - private static final int CATALYST_SLOT = 1; - private static final int OUTPUT_SLOT = 2; - - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/binding.png"), 0, 0, 100, 30); - @Nonnull - private final String localizedName = TextHelper.localize("jei.bloodmagic.recipe.binding"); - - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_BINDING; - } - - @Nonnull - @Override - public String getTitle() { - return localizedName; - } - - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } - - @Override - public void drawExtras(Minecraft minecraft) { - - } - - @Nullable - @Override - public IDrawable getIcon() { - return null; - } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, IIngredients ingredients) { - recipeLayout.getItemStacks().init(INPUT_SLOT, true, 0, 5); - recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 29, 3); - recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 73, 5); - - if (recipeWrapper instanceof BindingRecipeJEI) { - recipeLayout.getItemStacks().set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - recipeLayout.getItemStacks().set(CATALYST_SLOT, ingredients.getInputs(ItemStack.class).get(1)); - recipeLayout.getItemStacks().set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - } - } - - @Override - public String getModName() { - return BloodMagic.NAME; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java deleted file mode 100644 index 3d429211..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.binding; - -import WayofTime.bloodmagic.util.Constants; -import mezz.jei.api.recipe.IRecipeHandler; -import mezz.jei.api.recipe.IRecipeWrapper; - -import javax.annotation.Nonnull; - -public class BindingRecipeHandler implements IRecipeHandler { - @Nonnull - @Override - public Class getRecipeClass() { - return BindingRecipeJEI.class; - } - - @Override - public String getRecipeCategoryUid(@Nonnull BindingRecipeJEI recipe) { - return Constants.Compat.JEI_CATEGORY_BINDING; - } - - @Nonnull - @Override - public IRecipeWrapper getRecipeWrapper(@Nonnull BindingRecipeJEI recipe) { - return recipe; - } - - @Override - public boolean isRecipeValid(@Nonnull BindingRecipeJEI recipe) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java deleted file mode 100644 index 8a4adb82..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeJEI.java +++ /dev/null @@ -1,34 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.binding; - -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.BlankRecipeWrapper; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.List; - -public class BindingRecipeJEI extends BlankRecipeWrapper { - @Nonnull - private final List inputs; - - @Nonnull - private final ItemStack catalyst; - - @Nonnull - private final ItemStack output; - - @SuppressWarnings("unchecked") - public BindingRecipeJEI(@Nonnull List input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output) { - this.inputs = input; - this.catalyst = catalyst; - this.output = output; - } - - @Override - public void getIngredients(IIngredients ingredients) { - - ingredients.setInputLists(ItemStack.class, Lists.newArrayList(inputs, Lists.newArrayList(catalyst))); - ingredients.setOutput(ItemStack.class, output); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java b/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java deleted file mode 100644 index d921befc..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/binding/BindingRecipeMaker.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.binding; - -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import com.google.common.collect.BiMap; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class BindingRecipeMaker { - @Nonnull - public static List getRecipes() { - Map, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> alchemyArrayRecipeMap = AlchemyArrayRecipeRegistry.getRecipes(); - - ArrayList recipes = new ArrayList<>(); - - for (Map.Entry, AlchemyArrayRecipeRegistry.AlchemyArrayRecipe> itemStackAlchemyArrayRecipeEntry : alchemyArrayRecipeMap.entrySet()) { - List input = itemStackAlchemyArrayRecipeEntry.getValue().getInput(); - BiMap catalystMap = itemStackAlchemyArrayRecipeEntry.getValue().catalystMap; - - for (Map.Entry entry : catalystMap.entrySet()) { - ItemStack catalyst = entry.getKey().toStack(); - if (AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(input, catalyst) instanceof AlchemyArrayEffectBinding) { - ItemStack output = ((AlchemyArrayEffectBinding) itemStackAlchemyArrayRecipeEntry.getValue().getAlchemyArrayEffectForCatalyst(catalyst)).outputStack; - - BindingRecipeJEI recipe = new BindingRecipeJEI(input, catalyst, output); - recipes.add(recipe); - } - } - } - - return recipes; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java index 96b7db2f..44d1fdd3 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java @@ -1,92 +1,172 @@ -package WayofTime.bloodmagic.compat.jei.forge; +package wayoftime.bloodmagic.compat.jei.forge; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mezz.jei.api.gui.ICraftingGridHelper; -import mezz.jei.api.gui.IDrawable; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeCategory; -import net.minecraft.client.Minecraft; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; +import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; -public class TartaricForgeRecipeCategory implements IRecipeCategory { - private static final int OUTPUT_SLOT = 0; - private static final int GEM_SLOT = 1; - private static final int INPUT_SLOT = 2; +import com.google.common.collect.Lists; - @Nonnull - private final IDrawable background = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createDrawable(new ResourceLocation(Constants.Mod.DOMAIN + "gui/jei/soulForge.png"), 0, 0, 100, 40); - @Nonnull - private final ICraftingGridHelper craftingGridHelper; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.TextHelper; - public TartaricForgeRecipeCategory() { - craftingGridHelper = BloodMagicJEIPlugin.jeiHelper.getGuiHelper().createCraftingGridHelper(INPUT_SLOT, OUTPUT_SLOT); - } +public class TartaricForgeRecipeCategory implements IRecipeCategory +{ + private static final int OUTPUT_SLOT = 0; + private static final int GEM_SLOT = 1; + private static final int INPUT_SLOT = 2; + public static final ResourceLocation UID = BloodMagic.rl(Constants.Compat.JEI_CATEGORY_SOULFORGE); - @Nonnull - @Override - public String getUid() { - return Constants.Compat.JEI_CATEGORY_SOULFORGE; - } + @Nonnull + private final IDrawable background; + private final IDrawable icon; +// @Nonnull +// private final ICraftingGridHelper craftingGridHelper; - @Nonnull - @Override - public String getTitle() { - return TextHelper.localize("jei.bloodmagic.recipe.soulForge"); - } + public TartaricForgeRecipeCategory(IGuiHelper guiHelper) + { + icon = guiHelper.createDrawableIngredient(new ItemStack(BloodMagicBlocks.SOUL_FORGE.get())); + background = guiHelper.createDrawable(BloodMagic.rl("gui/jei/soulforge.png"), 0, 0, 100, 40); +// craftingGridHelper = guiHelper.createCraftingGridHelper(INPUT_SLOT); + } - @Nonnull - @Override - public IDrawable getBackground() { - return background; - } + @Nonnull + @Override + public ResourceLocation getUid() + { + return UID; + } - @Override - public void drawExtras(Minecraft minecraft) { + @Override + public List getTooltipStrings(RecipeTartaricForge recipe, double mouseX, double mouseY) + { + List tooltip = Lists.newArrayList(); + if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) + { + tooltip.add(new TranslationTextComponent("jei.bloodmagic.recipe.minimumsouls", ChatUtil.DECIMAL_FORMAT.format(recipe.getMinimumSouls()))); + tooltip.add(new TranslationTextComponent("jei.bloodmagic.recipe.soulsdrained", ChatUtil.DECIMAL_FORMAT.format(recipe.getSoulDrain()))); + } + return tooltip; + } - } + @Nonnull + @Override + public String getTitle() + { + return TextHelper.localize("jei.bloodmagic.recipe.soulforge"); + } - @Nullable - @Override - public IDrawable getIcon() { - return null; - } + @Nonnull + @Override + public IDrawable getBackground() + { + return background; + } - @Override - public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull TartaricForgeRecipeJEI recipeWrapper, @Nonnull IIngredients ingredients) { - IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); + @Nullable + @Override + public IDrawable getIcon() + { + return icon; + } - guiItemStacks.init(OUTPUT_SLOT, false, 73, 13); - guiItemStacks.init(GEM_SLOT, true, 42, 0); + @Override + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull RecipeTartaricForge recipe, @Nonnull IIngredients ingredients) + { + List validGems = Lists.newArrayList(); + for (DefaultWill will : DefaultWill.values()) + { + if (will.minSouls >= recipe.getMinimumSouls()) + { + validGems.add(will.willStack); + } + } - for (int y = 0; y < 3; ++y) { - for (int x = 0; x < 3; ++x) { - int index = INPUT_SLOT + x + (y * 3); - guiItemStacks.init(index, true, x * 18, y * 18); - } - } + IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); - List> inputs = ingredients.getInputs(ItemStack.class); + guiItemStacks.init(OUTPUT_SLOT, false, 73, 13); - guiItemStacks.set(GEM_SLOT, ingredients.getInputs(ItemStack.class).get(ingredients.getInputs(ItemStack.class).size() - 1)); - inputs.remove(ingredients.getInputs(ItemStack.class).size() - 1); - guiItemStacks.set(OUTPUT_SLOT, ingredients.getOutputs(ItemStack.class).get(0)); - guiItemStacks.set(INPUT_SLOT, ingredients.getInputs(ItemStack.class).get(0)); - craftingGridHelper.setInputs(guiItemStacks, inputs); - } + guiItemStacks.init(GEM_SLOT, true, 42, 0); - @Nonnull - @Override - public String getModName() { - return BloodMagic.NAME; - } + for (int y = 0; y < 2; ++y) + { + for (int x = 0; x < 2; ++x) + { + int index = INPUT_SLOT + x + (y * 2); + guiItemStacks.init(index, true, x * 18, y * 18); + } + } + + guiItemStacks.set(GEM_SLOT, validGems); + guiItemStacks.set(OUTPUT_SLOT, ingredients.getOutputs(VanillaTypes.ITEM).get(0)); + guiItemStacks.set(ingredients); + } + + @Override + public Class getRecipeClass() + { + return RecipeTartaricForge.class; + } + + @Override + public void setIngredients(RecipeTartaricForge recipe, IIngredients ingredients) + { + List validGems = Lists.newArrayList(); + for (DefaultWill will : DefaultWill.values()) + { + if (will.minSouls >= recipe.getMinimumSouls()) + { + validGems.add(will.willStack); + } + } + + ItemStack[] validGemStacks = new ItemStack[validGems.size()]; + for (int i = 0; i < validGemStacks.length; i++) + { + validGemStacks[i] = validGems.get(i); + } + + List ingList = Lists.newArrayList(); + ingList.add(Ingredient.fromStacks(validGemStacks)); + ingList.addAll(recipe.getInput()); + + ingredients.setInputIngredients(ingList); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getOutput()); + } + + public enum DefaultWill + { + SOUL(new ItemStack(BloodMagicItems.MONSTER_SOUL_RAW.get()), 64), + PETTY(new ItemStack(BloodMagicItems.PETTY_GEM.get()), 64), + LESSER(new ItemStack(BloodMagicItems.LESSER_GEM.get()), 256), + COMMON(new ItemStack(BloodMagicItems.COMMON_GEM.get()), 1024); +// GREATER(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 4096), +// GRAND(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 16384); + + public final ItemStack willStack; + public final double minSouls; + + DefaultWill(ItemStack willStack, double minSouls) + { + this.willStack = willStack; + this.minSouls = minSouls; + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java b/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java deleted file mode 100644 index 16870613..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/forge/TartaricForgeRecipeJEI.java +++ /dev/null @@ -1,66 +0,0 @@ -package WayofTime.bloodmagic.compat.jei.forge; - -import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.compat.jei.BloodMagicJEIPlugin; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.Lists; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.IRecipeWrapper; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.List; - -public class TartaricForgeRecipeJEI implements IRecipeWrapper { - private RecipeTartaricForge recipe; - private List validGems = Lists.newArrayList(); - - public TartaricForgeRecipeJEI(RecipeTartaricForge recipe) { - this.recipe = recipe; - - for (DefaultWill will : DefaultWill.values()) - if (will.minSouls >= recipe.getMinimumSouls()) - this.validGems.add(will.willStack); - } - - @Override - public void getIngredients(@Nonnull IIngredients ingredients) { - List> expandedInputs = BloodMagicJEIPlugin.jeiHelper.getStackHelper().expandRecipeItemStackInputs(recipe.getInput()); - expandedInputs.add(validGems); - ingredients.setInputLists(ItemStack.class, expandedInputs); - ingredients.setOutput(ItemStack.class, recipe.getOutput()); - } - - @Nonnull - @Override - public List getTooltipStrings(int mouseX, int mouseY) { - List tooltip = Lists.newArrayList(); - if (mouseX >= 40 && mouseX <= 60 && mouseY >= 21 && mouseY <= 34) { - tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.minimumSouls", recipe.getMinimumSouls())); - tooltip.add(TextHelper.localize("jei.bloodmagic.recipe.soulsDrained", recipe.getSoulDrain())); - } - return tooltip; - } - - public RecipeTartaricForge getRecipe() { - return recipe; - } - - public enum DefaultWill { - SOUL(new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL, 1, 0), 64), - PETTY(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 0), 64), - LESSER(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 256), - COMMON(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 1024), - GREATER(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 4096), - GRAND(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 16384); - - public final ItemStack willStack; - public final double minSouls; - - DefaultWill(ItemStack willStack, double minSouls) { - this.willStack = willStack; - this.minSouls = minSouls; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java deleted file mode 100644 index 3366cd65..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/BloodMagicHwylaPlugin.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.compat.waila; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.compat.waila.provider.*; -import WayofTime.bloodmagic.tile.*; -import mcp.mobius.waila.api.IRegistrar; -import mcp.mobius.waila.api.IWailaPlugin; -import mcp.mobius.waila.api.TooltipPosition; -import mcp.mobius.waila.api.WailaPlugin; -import net.minecraft.util.ResourceLocation; - -@WailaPlugin -public class BloodMagicHwylaPlugin implements IWailaPlugin { - - public static final ResourceLocation CONFIG_SHOW_ALTAR_STATS = new ResourceLocation(BloodMagic.MODID, "show_altar_stats"); - - @Override - public void register(IRegistrar registrar) { - registrar.registerComponentProvider(DataProviderBloodAltar.INSTANCE, TooltipPosition.BODY, TileAltar.class); - registrar.registerBlockDataProvider(DataProviderBloodAltar.INSTANCE, TileAltar.class); - registrar.addConfig(CONFIG_SHOW_ALTAR_STATS, true); - - registrar.registerBodyProvider(DataProviderTeleposer.INSTANCE, TileTeleposer.class); - registrar.registerNBTProvider(DataProviderTeleposer.INSTANCE, TileTeleposer.class); - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_TELEPOSER, true); - - registrar.registerBodyProvider(DataProviderRitualController.INSTANCE, TileMasterRitualStone.class); - registrar.registerNBTProvider(DataProviderRitualController.INSTANCE, TileMasterRitualStone.class); - registrar.registerBodyProvider(DataProviderRitualController.INSTANCE, TileImperfectRitualStone.class); - registrar.registerNBTProvider(DataProviderRitualController.INSTANCE, TileImperfectRitualStone.class); - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_RITUAL, true); - - registrar.registerBodyProvider(DataProviderBloodTank.INSTANCE, TileBloodTank.class); - registrar.registerNBTProvider(DataProviderBloodTank.INSTANCE, TileBloodTank.class); - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_BLOOD_TANK, true); - - registrar.registerStackProvider(DataProviderAlchemyArray.INSTANCE, TileAlchemyArray.class); - registrar.registerBodyProvider(DataProviderAlchemyArray.INSTANCE, TileAlchemyArray.class); - registrar.registerNBTProvider(DataProviderAlchemyArray.INSTANCE, TileAlchemyArray.class); - registrar.addConfig(BloodMagic.MODID, Constants.Compat.WAILA_CONFIG_ARRAY, true); - - registrar.registerStackProvider(DataProviderMimic.INSTANCE, TileMimic.class); - registrar.registerNBTProvider(DataProviderMimic.INSTANCE, TileMimic.class); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java deleted file mode 100644 index 31471c74..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderAlchemyArray.java +++ /dev/null @@ -1,56 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.List; - -public class DataProviderAlchemyArray implements IWailaDataProvider { - - public static final IWailaDataProvider INSTANCE = new DataProviderAlchemyArray(); - - @Nonnull - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - return new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES).setStackDisplayName(TextFormatting.WHITE + RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getLocalizedName()); - } - - @Nonnull - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_ARRAY)) - return currenttip; - - if (accessor.getNBTData().hasKey("reagent")) - currenttip.add(TextHelper.localize("waila.bloodmagic.array.reagent", accessor.getNBTData().getString("reagent"))); - if (accessor.getNBTData().hasKey("catalyst")) - currenttip.add(TextHelper.localize("waila.bloodmagic.array.catalyst", accessor.getNBTData().getString("catalyst"))); - - return currenttip; - } - - @Nonnull - @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - TileAlchemyArray alchemyArray = (TileAlchemyArray) te; - if (!alchemyArray.getStackInSlot(0).isEmpty()) - tag.putString("reagent", alchemyArray.getStackInSlot(0).getDisplayName()); - if (!alchemyArray.getStackInSlot(1).isEmpty()) - tag.putString("catalyst", alchemyArray.getStackInSlot(1).getDisplayName()); - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java deleted file mode 100644 index 95169561..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodAltar.java +++ /dev/null @@ -1,116 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.compat.waila.BloodMagicHwylaPlugin; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.sigil.ItemSigilDivination; -import WayofTime.bloodmagic.tile.TileAltar; -import mcp.mobius.waila.api.IComponentProvider; -import mcp.mobius.waila.api.IDataAccessor; -import mcp.mobius.waila.api.IPluginConfig; -import mcp.mobius.waila.api.IServerDataProvider; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; - -import java.util.List; - -/** - * Integrated from WailaPlugins by tterrag1098. Originally implemented - * in ImLookingAtBlood by Pokefenn. - */ -public class DataProviderBloodAltar implements IComponentProvider, IServerDataProvider { - - public static final DataProviderBloodAltar INSTANCE = new DataProviderBloodAltar(); - - @Override - public void appendBody(List tooltip, IDataAccessor accessor, IPluginConfig config) { - if (!config.get(BloodMagicHwylaPlugin.CONFIG_SHOW_ALTAR_STATS)) - return; - - if (accessor.getServerData().contains("altar")) { - CompoundNBT altarData = accessor.getServerData().getCompound("altar"); - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sigil.seer.currentAltarTier", altarData.getInt("tier"))); - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sigil.seer.currentAltarCapacity", altarData.getInt("capacity"))); - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sigil.seer.currentEssence", altarData.getInt("stored"))); - - if (altarData.contains("charge")) { - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent", altarData.getInt("progress") + "%")); - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sigil.seer.currentCharge", altarData.getInt("charge"))); - } - } - } - - @Override - public void appendServerData(CompoundNBT tag, ServerPlayerEntity player, World world, TileEntity tileEntity) { - TileAltar altar = (TileAltar) tileEntity; - - boolean hasSigil = false; - boolean hasSeer = false; - - switch (ConfigHandler.compat.wailaAltarDisplayMode) { - case ALWAYS: { - hasSigil = hasSeer = true; - break; - } - case SIGIL_HELD: { - hasSeer = holdingSeerSigil(player); - hasSigil = hasSeer || holdingDivinationSigil(player); - break; - } - case SIGIL_CONTAINED: { - hasSeer = hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), player); - hasSigil = hasSeer || hasStack(new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), player); - break; - } - } - - if (!hasSeer && !hasSigil) - return; - - CompoundNBT altarData = new CompoundNBT(); - altarData.putInt("tier", altar.getTier().toInt()); - altarData.putInt("capacity", altar.getCapacity()); - altarData.putInt("stored", altar.getCurrentBlood()); - if (hasSeer) { - altarData.putInt("progress", (int) (((double) altar.getProgress() / (double) altar.getLiquidRequired() * 100) / altar.getStackInSlot(0).getCount())); - altarData.putInt("charge", altar.getTotalCharge()); - } - - tag.put("altar", altarData); - } - - public static boolean hasStack(ItemStack stack, PlayerEntity player) { - for (ItemStack inventoryStack : player.inventory.mainInventory) - if (inventoryStack != null && inventoryStack.isItemEqual(stack)) - return true; - - return false; - } - - private static boolean holdingSeerSigil(PlayerEntity player) { - if (player.getHeldItemMainhand().getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - return true; - - if (player.getHeldItemOffhand().getItem() == RegistrarBloodMagicItems.SIGIL_SEER) - return true; - - return false; - } - - private static boolean holdingDivinationSigil(PlayerEntity player) { - if (player.getHeldItemMainhand().getItem() instanceof ItemSigilDivination) - return true; - - if (!player.getHeldItemOffhand().isEmpty() && player.getHeldItemOffhand().getItem() instanceof ItemSigilDivination) - return true; - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java deleted file mode 100644 index 6083ae52..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.tile.TileBloodTank; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; - -import javax.annotation.Nonnull; -import java.util.List; - -public class DataProviderBloodTank implements IWailaDataProvider { - - public static final IWailaDataProvider INSTANCE = new DataProviderBloodTank(); - - @Nonnull - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_BLOOD_TANK) && !config.getConfig("capability.tankinfo")) - return currenttip; - - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", accessor.getNBTData().getInteger("tier"))); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", accessor.getNBTData().getInteger("capacity"))); - if (accessor.getNBTData().hasKey("fluid")) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(accessor.getNBTData().getCompoundTag("fluid")); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, accessor.getNBTData().getInteger("capacity"))); - } - - return currenttip; - } - - @Nonnull - @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - TileBloodTank tank = (TileBloodTank) te; - tag.putInt("tier", tank.getBlockMetadata() + 1); - tag.putInt("capacity", tank.capacity); - if (tank.getTank().getFluid() != null) - tag.put("fluid", tank.getTank().getFluid().writeToNBT(new CompoundNBT())); - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java deleted file mode 100644 index 551fb29f..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderMimic.java +++ /dev/null @@ -1,57 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.tile.TileMimic; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -import javax.annotation.Nonnull; - -public class DataProviderMimic implements IWailaDataProvider { - - public static final IWailaDataProvider INSTANCE = new DataProviderMimic(); - - @Nonnull - @Override - public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (accessor.getNBTData().hasKey("mimiced")) { - CompoundNBT mimiced = accessor.getNBTData().getCompoundTag("mimiced"); - Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(mimiced.getString("id"))); - int meta = mimiced.getInteger("data"); - ItemStack ret = new ItemStack(item, 1, meta); - if (mimiced.hasKey("nbt")) - ret.setTagCompound(mimiced.getCompoundTag("nbt")); - - return ret; - } - - return ItemStack.EMPTY; - } - - @Nonnull - @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - TileMimic mimic = (TileMimic) te; - ItemStack mimiced = mimic.getStackInSlot(0); - if (!mimiced.isEmpty()) { - CompoundNBT item = new CompoundNBT(); - item.setString("id", mimiced.getItem().getRegistryName().toString()); - item.setInteger("data", mimiced.getMetadata()); - CompoundNBT shareTag = mimiced.getItem().getNBTShareTag(mimiced); - if (shareTag != null) - item.setTag("nbt", shareTag); - - tag.put("mimiced", item); - } - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java deleted file mode 100644 index 5d6bad56..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderRitualController.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.List; - -public class DataProviderRitualController implements IWailaDataProvider { - - public static final IWailaDataProvider INSTANCE = new DataProviderRitualController(); - - @Nonnull - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_RITUAL)) - return currenttip; - - CompoundNBT tag = accessor.getNBTData(); - if (tag.getBoolean("master")) { - if (tag.hasKey("ritual")) { - currenttip.add(TextHelper.localizeEffect(tag.getString("ritual"))); - if (tag.hasKey("owner")) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", tag.getString("owner"))); - if (!tag.getBoolean("active")) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.deactivated")); - if (!tag.getBoolean("enabled")) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); - } - } else { - if (tag.hasKey("ritual")) { - currenttip.add(TextHelper.localizeEffect(tag.getString("ritual"))); - if (!tag.getBoolean("enabled")) - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.config.disabled")); - } - } - - return currenttip; - } - - @Nonnull - @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - - if (te instanceof TileMasterRitualStone) { - TileMasterRitualStone mrs = (TileMasterRitualStone) te; - tag.putBoolean("master", true); - if (mrs.getCurrentRitual() != null) { - tag.putString("ritual", mrs.getCurrentRitual().getTranslationKey()); - tag.putBoolean("active", mrs.isActive()); - if (mrs.getOwner() != null) - tag.putString("owner", PlayerHelper.getUsernameFromUUID(mrs.getOwner())); - tag.putBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(mrs.getCurrentRitual()), false)); - } - } else { - tag.putBoolean("master", false); - - ImperfectRitual ritual = BloodMagic.RITUAL_MANAGER.getImperfectRitual(world.getBlockState(pos.up())); - if (ritual != null) { - tag.putString("ritual", ritual.getTranslationKey()); - tag.putBoolean("enabled", BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false)); - } - } - - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java deleted file mode 100644 index 03b9611b..00000000 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderTeleposer.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.compat.waila.provider; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.helper.TextHelper; -import mcp.mobius.waila.api.IWailaConfigHandler; -import mcp.mobius.waila.api.IWailaDataAccessor; -import mcp.mobius.waila.api.IWailaDataProvider; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import org.apache.commons.lang3.text.WordUtils; - -import javax.annotation.Nonnull; -import java.util.List; - -public class DataProviderTeleposer implements IWailaDataProvider { - - public static final IWailaDataProvider INSTANCE = new DataProviderTeleposer(); - - @Nonnull - @Override - public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (!config.getConfig(Constants.Compat.WAILA_CONFIG_TELEPOSER)) - return currenttip; - - if (accessor.getNBTData().hasKey("focus")) { - CompoundNBT focusData = accessor.getNBTData().getCompoundTag("focus"); - BlockPos boundPos = NBTUtil.getPosFromTag(focusData.getCompoundTag("pos")); - int boundDim = focusData.getInteger("dim"); - String dimName = WordUtils.capitalizeFully(DimensionManager.getProviderType(boundDim).getName().replace("_", " ")); - - currenttip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.bound", dimName, boundPos.getX(), boundPos.getY(), boundPos.getZ())); - } - - return currenttip; - } - - @Override - public CompoundNBT getNBTData(ServerPlayerEntity player, TileEntity te, CompoundNBT tag, World world, BlockPos pos) { - TileTeleposer teleposer = (TileTeleposer) te; - ItemStack contained = teleposer.getStackInSlot(0); - if (!contained.isEmpty() && contained.hasTagCompound()) { - ItemTelepositionFocus focus = (ItemTelepositionFocus) contained.getItem(); - CompoundNBT focusData = new CompoundNBT(); - focusData.setTag("pos", NBTUtil.createPosTag(focus.getBlockPos(contained))); - focusData.setInteger("dim", contained.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); - tag.put("focus", focusData); - } - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java deleted file mode 100644 index e2dc02d1..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/AdvancedCompressionHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.compress; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.Tuple; -import net.minecraft.world.World; - - -public class AdvancedCompressionHandler extends CompressionHandler { - - public ItemStack compressInventory(ItemStack[] inv, World world) { - for (ItemStack invStack : inv) { - if (invStack.isEmpty()) { - continue; - } - - for (int i = 3; i >= 2; i--) { - ItemStack invStackCopy = invStack.copy(); - invStackCopy.setCount(1); - Tuple stackTuple = CompressionRegistry.compressionMap.get(invStackCopy); - ItemStack stack; - if (stackTuple == null) { - StorageBlockCraftingManager.reversibleCheck = invStack; - stack = StorageBlockCraftingManager.getRecipe(invStack, world, i); - if (stack.isEmpty()) - continue; - CompressionRegistry.compressionMap.put(invStackCopy, new Tuple<>(stack, i * i)); - } else { - stack = stackTuple.getFirst(); - if (stackTuple.getSecond() != i * i) - return ItemStack.EMPTY; - } - - if (!stack.isEmpty()) { - - int needed = (i == 2 ? 4 : 9); - int remaining = iterateThroughInventory(invStack, CompressionRegistry.getItemThreshold(invStack, needed), inv, needed, true); - if (remaining <= 0) - return stack; - } - } - } - - return ItemStack.EMPTY; - } - - -} diff --git a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java deleted file mode 100644 index 59530a63..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/BaseCompressionHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package WayofTime.bloodmagic.compress; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class BaseCompressionHandler extends CompressionHandler { - private final ItemStack required; - private final ItemStack result; - private final int leftover; - - public BaseCompressionHandler(ItemStack input, ItemStack output, int remainder) { - super(); - this.required = input; - this.result = output; - this.leftover = remainder; - } - - public ItemStack getResultStack() { - return this.result.copy(); - } - - public ItemStack getRequiredStack() { - return this.required.copy(); - } - - @Override - public ItemStack compressInventory(ItemStack[] inv, World world) { - int remaining = this.getRemainingNeeded(inv); - if (remaining <= 0) { - this.drainInventory(inv); - return this.getResultStack(); - } - - return ItemStack.EMPTY; - } - - public int getRemainingNeeded(ItemStack[] inv) { - int needed = this.required.getCount(); - int kept = this.getLeftover(); - return iterateThroughInventory(this.required, kept, inv, needed, true); - } - - public int drainInventory(ItemStack[] inv) { - int needed = this.required.getCount(); - int kept = this.getLeftover(); - return iterateThroughInventory(this.required, kept, inv, needed, true); - } - - public int getLeftover() { - return this.leftover; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java deleted file mode 100644 index 715a7b19..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.compress; - -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import java.util.HashSet; -import java.util.Set; - -public abstract class CompressionHandler { - /** - * Called to look at the inventory and syphons the required stack. Returns - * resultant stack if successful, and null if not. - * - * @param inv The inventory iterated through - * @return The result of the compression - */ - public abstract ItemStack compressInventory(ItemStack[] inv, World world); - - public int iterateThroughInventory(ItemStack required, int kept, ItemStack[] inv, int needed, boolean doDrain) { - int oldNeeded = needed; - int i = -1; - Set consumeSet = new HashSet<>(); - - for (ItemStack invStack : inv) { - i++; - - if (invStack.isEmpty()) { - continue; - } - - if (invStack.isItemEqual(required) && (invStack.getTagCompound() == null ? required.getTagCompound() == null : invStack.getTagCompound().equals(required.getTagCompound()))) { - int stackSize = invStack.getCount(); - int used = 0; - if (kept > 0) { - int remainingFromStack = Math.max(stackSize - kept, 0); - used += stackSize - remainingFromStack; - } - - kept -= used; - - if (kept <= 0 && needed > 0) { - int remainingFromStack = Math.max(stackSize - used - needed, 0); - needed -= (stackSize - used - remainingFromStack); - if (needed != 0 && needed < oldNeeded) { - consumeSet.add(i); - } - - if (doDrain && (!(needed < oldNeeded) || needed == 0)) { - invStack.setCount(remainingFromStack + used); - for (Integer j : consumeSet) { - inv[j].setCount(0); - inv[j] = ItemStack.EMPTY; - } - consumeSet.clear(); - if (invStack.isEmpty()) { - inv[i] = ItemStack.EMPTY; - } - } - } - if (needed <= 0) { - return 0; - } - } - } - return needed; - - - } - -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java b/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java deleted file mode 100644 index fb1de055..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/CompressionRegistry.java +++ /dev/null @@ -1,103 +0,0 @@ -package WayofTime.bloodmagic.compress; - -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Tuple; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * A registry aimed to help compress items in an inventory into its compressible - * form. - */ -public class CompressionRegistry { - private static List compressionRegistry = new ArrayList<>(); - public static Map thresholdMap = new HashMap<>(); - static Map> compressionMap = new HashMap<>(); - - public static void registerHandler(CompressionHandler handler) { - compressionRegistry.add(handler); - } - - /** - * Registers an item so that it only compresses while above this threshold - * - * @param stack item/block to be compressed - * @param threshold amount that is to be compressed - */ - public static void registerItemThreshold(ItemStack stack, int threshold) { - thresholdMap.put(stack, threshold); - } - - public static ItemStack compressInventory(ItemStack[] inv, World world) { - for (CompressionHandler handler : compressionRegistry) { - ItemStack stack = handler.compressInventory(inv, world); - if (!stack.isEmpty()) { - return stack; - } - } - - return null; - } - - public static Pair compressInventory(TileEntity tile, World world) { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) { - IItemHandler itemHandler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); - ItemStack[] inventory = new ItemStack[itemHandler.getSlots()]; //THIS MUST NOT BE EDITED! - ItemStack[] copyInventory = new ItemStack[itemHandler.getSlots()]; - - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - inventory[slot] = itemHandler.extractItem(slot, 64, true); - copyInventory[slot] = inventory[slot].copy(); - } - - for (CompressionHandler handler : compressionRegistry) { - ItemStack stack = handler.compressInventory(copyInventory, world); - if (!stack.isEmpty()) { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - if (inventory[slot] != null && !ItemStack.areItemStacksEqual(inventory[slot], copyInventory[slot])) { - itemHandler.extractItem(slot, inventory[slot].getCount(), false); - if (copyInventory[slot] != null) { - itemHandler.insertItem(slot, copyInventory[slot], false); - } - } - } - - return Pair.of(Utils.insertStackIntoTile(stack, itemHandler), true); - } - } - } - - return Pair.of(ItemStack.EMPTY, false); - } - - - public static int getItemThreshold(ItemStack stack, int needed) { - Integer threshold = thresholdMap.get(stack); - if (threshold != null) - return threshold; - else - return stack.getMaxStackSize() - needed; - } - - public static int getItemThreshold(ItemStack stack) { - Integer threshold = thresholdMap.get(stack); - if (threshold != null) - return threshold; - else - return stack.getMaxStackSize(); - } - - - public static boolean areItemStacksEqual(ItemStack stack, ItemStack compressedStack) { - return stack.isItemEqual(compressedStack) && (stack.getTagCompound() == null ? !compressedStack.hasTagCompound() : stack.getTagCompound().equals(compressedStack.getTagCompound())); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java deleted file mode 100644 index 4b61f7e0..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingManager.java +++ /dev/null @@ -1,160 +0,0 @@ -package WayofTime.bloodmagic.compress; - -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.inventory.container.Container; -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.world.World; - -import java.util.HashSet; -import java.util.Set; - -public class StorageBlockCraftingManager { - private static final StorageBlockCraftingManager instance = new StorageBlockCraftingManager(); - private static CraftingInventory[] inventoryCrafting = { - new CraftingInventory(new Container() { - public boolean canInteractWith(PlayerEntity player) { - return false; - } - }, - 3, 3), - new CraftingInventory(new Container() { - public boolean canInteractWith(PlayerEntity player) { - return false; - } - }, - 2, 2), - new CraftingInventory(new Container() { - public boolean canInteractWith(PlayerEntity player) { - return false; - } - }, - 1, 1) - - }; - static ItemStack reversibleCheck; - private HashSet recipes = new HashSet<>(); // TODO: Clear when recipes are reloaded in 1.14 - private Set blacklist = new HashSet<>(); - - public static boolean isResultStackReversible(ItemStack stack, World world) { - if (stack.isEmpty()) { - return false; - } - - inventoryCrafting[2].setInventorySlotContents(0, stack); - ItemStack returnStack = getNNRecipeOutput(inventoryCrafting[2], world); - - return !returnStack.isEmpty() && CompressionRegistry.areItemStacksEqual(reversibleCheck, returnStack); - } - - public static ItemStack getRecipe(ItemStack stack, World world, int gridSize) { - StorageBlockCraftingManager craftingManagerSB = getInstance(); - if (craftingManagerSB.blacklist.contains(stack)) { - return ItemStack.EMPTY; - } - CraftingInventory inventory = inventoryCrafting[3 - gridSize]; - for (int i = 0; i < inventory.getSizeInventory(); i++) { - inventory.setInventorySlotContents(i, stack); - } - ItemStack notEmptyRecipe = craftingManagerSB.findMatchingRecipe(inventory, world); - if (!notEmptyRecipe.isEmpty()) { - return notEmptyRecipe; - } - ItemStack result = getNNRecipeOutput(inventory, world); - - if (isResultStackReversible(result, world)) { - craftingManagerSB.addRecipe(CraftingManager.findMatchingRecipe(inventory, world)); - return result; - } - craftingManagerSB.blacklist.add(stack); - return ItemStack.EMPTY; - } - - public static ItemStack getNNRecipeOutput(CraftingInventory inventory, World world) { - IRecipe checkForNull = CraftingManager.findMatchingRecipe(inventory, world); - if (checkForNull != null) { - return checkForNull.getRecipeOutput(); - } - return ItemStack.EMPTY; - } - - public static ItemStack get22Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 2); - } - - public static ItemStack get33Recipe(ItemStack stack, World world) { - return getRecipe(stack, world, 3); - } - - public void addRecipe(IRecipe recipe) { - this.recipes.add(recipe); - } - - //recipes are currently added during runtime, this will only return recipes specifically added in init - //through BaseCompressionHandler - public void addStorageBlockRecipes() { - - //this.recipes = new StorageBlockCraftingRecipeAssimilator().getPackingRecipes(); - BMLog.DEBUG.info("Total number of compression recipes: " + this.recipes.size()); - } - - public ItemStack findMatchingRecipe(CraftingInventory craftingInventory, World world) { - return this.findMatchingRecipe(craftingInventory, world, this.recipes); - } - - private ItemStack findMatchingRecipe(CraftingInventory craftingInventory, World world, HashSet list) { - int i = 0; - ItemStack itemstack = ItemStack.EMPTY; - ItemStack itemstack1 = ItemStack.EMPTY; - int j; - - for (j = 0; j < craftingInventory.getSizeInventory(); ++j) { - ItemStack itemstack2 = craftingInventory.getStackInSlot(j); - - if (!itemstack2.isEmpty()) { - if (i == 0) { - itemstack = itemstack2; - } - - if (i == 1) { - itemstack1 = itemstack2; - } - - ++i; - } - } - - if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.getCount() == 1 && itemstack1.getCount() == 1 && itemstack.getItem().isRepairable()) { - Item item = itemstack.getItem(); - int j1 = item.getMaxDamage(itemstack) - itemstack.getItemDamage(); - int k = item.getMaxDamage(itemstack) - itemstack1.getItemDamage(); - int l = j1 + k + item.getMaxDamage(itemstack) * 5 / 100; - int i1 = item.getMaxDamage(itemstack) - l; - - if (i1 < 0) { - i1 = 0; - } - - return new ItemStack(itemstack.getItem(), 1, i1); - } else { - for (IRecipe iRecipe : list) { - - if (iRecipe.matches(craftingInventory, world)) { - return iRecipe.getCraftingResult(craftingInventory); - } - } - - return ItemStack.EMPTY; - } - } - - public static StorageBlockCraftingManager getInstance() { - return instance; - } - - -} diff --git a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java b/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java deleted file mode 100644 index b5870b6d..00000000 --- a/src/main/java/WayofTime/bloodmagic/compress/StorageBlockCraftingRecipeAssimilator.java +++ /dev/null @@ -1,285 +0,0 @@ -package WayofTime.bloodmagic.compress; - -public class StorageBlockCraftingRecipeAssimilator { -// public static final List ignore = new ArrayList(); -// -// public List getPackingRecipes() -// { -// // grab all recipes potentially suitable for packing or unpacking -// -// List packingRecipes = new LinkedList(); -// List unpackingRecipes = new ArrayList(); -// -// for (IRecipe recipe : getCraftingRecipes()) -// { -// if (ignore.contains(recipe.getClass())) -// continue; -// -// ItemStack output = recipe.getRecipeOutput(); -// if (output.isEmpty()) -// continue; -// -// if (output.getCount() == 1) -// { -// PackingRecipe packingRecipe = getPackingRecipe(recipe); -// -// if (packingRecipe != null) -// { -// packingRecipes.add(packingRecipe); -// } -// } else if ((output.getCount() == 4 || output.getCount() == 9) && recipe.canFit(1, 1)) -// { -// unpackingRecipes.add(recipe); -// } -// } -// -// // grab all packing recipes which accept the output of any of the -// // unpacking recipes -// -// Container container = makeDummyContainer(); -// InventoryCrafting inventoryUnpack = new InventoryCrafting(container, 2, 2); -// InventoryCrafting inventory2x2 = new InventoryCrafting(container, 2, 2); -// InventoryCrafting inventory3x3 = new InventoryCrafting(container, 3, 3); -// World world = null; // TODO: use a proper dummy world? -// -// List ret = new ArrayList(); -// -// for (IRecipe recipeUnpack : unpackingRecipes) -// { -// if (ignore.contains(recipeUnpack.getClass())) -// continue; -// -// ItemStack unpacked = recipeUnpack.getRecipeOutput(); -// InventoryCrafting inventory = null; -// -// for (Iterator it = packingRecipes.iterator(); it.hasNext();) -// { -// PackingRecipe recipePack = it.next(); -// -// // check if the packing recipe accepts the unpacking recipe's output -// -// boolean matched = false; -// -// if (recipePack.possibleInputs != null) -// { -// // the recipe could be parsed, use its inputs directly since that's faster verify recipe size -// -// if (recipePack.inputCount != unpacked.getCount()) -// continue; -// -// // check if any of the input options matches the unpacked -// // item stack -// -// for (ItemStack stack : recipePack.possibleInputs) -// { -// if (areInputsIdentical(unpacked, stack)) -// { -// matched = true; -// break; -// } -// } -// } else -// { -// // unknown IRecipe, check through the recipe conventionally verify recipe size for 3x3 to skip anything smaller quickly -// -// if (unpacked.getCount() == 9 && recipePack.recipe.getIngredients().size() < 9) -// continue; -// -// // initialize inventory late, but only once per unpack recipe -// -// if (inventory == null) -// { -// if (unpacked.getCount() == 4) -// { -// inventory = inventory2x2; -// } else -// { -// inventory = inventory3x3; -// } -// -// for (int i = 0; i < unpacked.getCount(); i++) -// { -// inventory.setInventorySlotContents(i, unpacked.copy()); -// } -// } -// -// // check if the packing recipe accepts the unpacked item -// // stack -// -// matched = recipePack.recipe.matches(inventory, world); -// } -// -// if (matched) -// { -// // check if the unpacking recipe accepts the packing -// // recipe's output -// -// ItemStack packOutput = recipePack.recipe.getRecipeOutput(); -// inventoryUnpack.setInventorySlotContents(0, packOutput.copy()); -// -// if (recipeUnpack.matches(inventoryUnpack, world)) -// { -// ret.add(recipePack.recipe); -// it.remove(); -// } -// } -// } -// } -// -// return ret; -// } -// -// @SuppressWarnings("unchecked") -// private List getCraftingRecipes() -// { -// return ForgeRegistries.RECIPES.getValues(); -// } -// -// private Container makeDummyContainer() -// { -// return new Container() -// { -// @Override -// public boolean canInteractWith(EntityPlayer player) -// { -// return true; -// } -// }; -// } -// -// private PackingRecipe getPackingRecipe(IRecipe recipe) -// { -// if (recipe.getIngredients().size() < 4) -// return null; -// -// List inputs = recipe.getIngredients(); -// -// // check if the recipe inputs are size 4 or 9 -// -// int count = 0; -// -// for (Object o : inputs) -// { -// if (o != null) -// count++; -// } -// -// if (count != 4 && count != 9) -// return null; -// -// // grab identical inputs -// -// List identicalInputs = getIdenticalInputs(inputs); -// if (identicalInputs == null) -// return null; -// -// return new PackingRecipe(recipe, identicalInputs, count); -// } -// -// /** -// * Determine the item stacks from the provided inputs which are suitable for -// * every input element. -// * -// * @param inputs -// * List of all inputs, null elements are being ignored. -// * @return List List of all options. -// */ -// @SuppressWarnings("unchecked") -// private List getIdenticalInputs(List inputs) -// { -// List options = null; -// -// for (Ingredient input : inputs) -// { -// if (input == null) -// continue; -// -// List offers; -// -// if (input. instanceof ItemStack) -// { -// offers = Collections.singletonList((ItemStack) input); -// } else if (input instanceof List) -// { -// offers = (List) input; -// -// if (offers.isEmpty()) -// return null; -// } else -// { -// throw new RuntimeException("invalid input: " + input.getClass()); -// } -// -// if (options == null) -// { -// options = new ArrayList(offers); -// continue; -// } -// -// for (Iterator it = options.iterator(); it.hasNext();) -// { -// ItemStack stackReq = it.next(); -// boolean found = false; -// -// for (ItemStack stackCmp : offers) -// { -// if (areInputsIdentical(stackReq, stackCmp)) -// { -// found = true; -// break; -// } -// } -// -// if (!found) -// { -// it.remove(); -// -// if (options.isEmpty()) -// return null; -// } -// } -// } -// -// return options; -// } -// -// private boolean areInputsIdentical(ItemStack a, ItemStack b) -// { -// -// try -// { -// if (a.getItem() != b.getItem()) -// return false; -// -// int dmgA = a.getItemDamage(); -// int dmgB = b.getItemDamage(); -// -// return dmgA == dmgB || dmgA == OreDictionary.WILDCARD_VALUE || dmgB == OreDictionary.WILDCARD_VALUE; -// } catch (NullPointerException e) -// { -// -// BloodMagic.instance.getLogger().error("A mod in this instance has registered an item with a null input. Known problem mods are:"); -// -// // String err = ""; -// // for (String problem : problemMods) -// // err += (err.length() > 0 ? ", " : "") + problem; -// // BloodMagic.instance.getLogger().error(err); -// -// return false; -// } -// } -// -// private static class PackingRecipe -// { -// PackingRecipe(IRecipe recipe, List possibleInputs, int inputCount) -// { -// this.recipe = recipe; -// this.possibleInputs = possibleInputs; -// this.inputCount = inputCount; -// } -// -// final IRecipe recipe; -// final List possibleInputs; -// final int inputCount; -// } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java index e5aaa84a..521fba53 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagic.java @@ -1,159 +1,30 @@ -package WayofTime.bloodmagic.core; +package wayoftime.bloodmagic.core; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.entity.mob.*; -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.potion.PotionBloodMagic; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.potion.Effect; -import net.minecraft.potion.Effects; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityEntryBuilder; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.registries.IForgeRegistry; -import net.minecraftforge.registries.RegistryBuilder; +import wayoftime.bloodmagic.BloodMagic; @Mod.EventBusSubscriber(modid = BloodMagic.MODID) -@GameRegistry.ObjectHolder(BloodMagic.MODID) -public class RegistrarBloodMagic { +public class RegistrarBloodMagic +{ + private RegistrarBloodMagic() + { - private static final BloodOrb ORB_DEF = new BloodOrb("", 0, 0, 0); - @GameRegistry.ObjectHolder("weak") - public static final BloodOrb ORB_WEAK = ORB_DEF; - @GameRegistry.ObjectHolder("apprentice") - public static final BloodOrb ORB_APPRENTICE = ORB_DEF; - @GameRegistry.ObjectHolder("magician") - public static final BloodOrb ORB_MAGICIAN = ORB_DEF; - @GameRegistry.ObjectHolder("master") - public static final BloodOrb ORB_MASTER = ORB_DEF; - @GameRegistry.ObjectHolder("archmage") - public static final BloodOrb ORB_ARCHMAGE = ORB_DEF; - @GameRegistry.ObjectHolder("transcendent") - public static final BloodOrb ORB_TRANSCENDENT = ORB_DEF; + } - public static final Effect BOOST = Effects.HASTE; - public static final Effect WHIRLWIND = Effects.HASTE; - public static final Effect PLANAR_BINDING = Effects.HASTE; - public static final Effect SOUL_SNARE = Effects.HASTE; - public static final Effect SOUL_FRAY = Effects.HASTE; - public static final Effect FIRE_FUSE = Effects.HASTE; - public static final Effect CONSTRICT = Effects.HASTE; - public static final Effect PLANT_LEECH = Effects.HASTE; - public static final Effect DEAFNESS = Effects.HASTE; - public static final Effect BOUNCE = Effects.HASTE; - public static final Effect CLING = Effects.HASTE; - public static final Effect SACRIFICIAL_LAMB = Effects.HASTE; - public static final Effect FLIGHT = Effects.HASTE; - public static final Effect GROUNDED = Effects.HASTE; - public static final Effect HEAVY_HEART = Effects.HASTE; - public static final Effect SUSPENDED = Effects.HASTE; - public static final Effect FEATHERED = Effects.HASTE; +// public static final BloodOrbDeferredRegister BLOOD_ORBS = new BloodOrbDeferredRegister(BloodMagic.MODID); +// +// public static final BloodOrbRegistryObject ORB_WEAK = BLOOD_ORBS.register("weakbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "weakbloodorb"), 0, 5000, 10)); - public static IForgeRegistry BLOOD_ORBS = null; +// public static IForgeRegistry BLOOD_ORBS = new RegistryBuilder().setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")).setIDRange(0, Short.MAX_VALUE).setType(BloodOrb.class).addCallback((IForgeRegistry.AddCallback) ( +// owner, stage, id, obj, +// oldObj) -> OrbRegistry.tierMap.put(obj.getTier(), OrbRegistry.getOrbStack(obj))).create(); - @SubscribeEvent - public static void registerBloodOrbs(RegistryEvent.Register event) { - ResourceLocation orb = RegistrarBloodMagicItems.BLOOD_ORB.getRegistryName(); - event.getRegistry().registerAll( - new BloodOrb("weak", 1, 5000, 2).withModel(new ModelResourceLocation(orb, "type=weak")).setRegistryName("weak"), - new BloodOrb("apprentice", 2, 25000, 5).withModel(new ModelResourceLocation(orb, "type=apprentice")).setRegistryName("apprentice"), - new BloodOrb("magician", 3, 150000, 15).withModel(new ModelResourceLocation(orb, "type=magician")).setRegistryName("magician"), - new BloodOrb("master", 4, 1000000, 25).withModel(new ModelResourceLocation(orb, "type=master")).setRegistryName("master"), - new BloodOrb("archmage", 5, 10000000, 50).withModel(new ModelResourceLocation(orb, "type=archmage")).setRegistryName("archmage") - ); - if (ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { - event.getRegistry().register( - new BloodOrb("transcendent", 6, 30000000, 50).withModel(new ModelResourceLocation(orb, "type=transcendent")).setRegistryName("transcendent") - ); - } - } - - @SubscribeEvent - public static void registerPotions(RegistryEvent.Register event) { - event.getRegistry().registerAll( - new PotionBloodMagic("Boost", false, 0xFFFFFF, 0, 0).setRegistryName("boost"), - new PotionBloodMagic("Whirlwind", false, 0xFFFFFF, 0, 0).setRegistryName("whirlwind"), - new PotionBloodMagic("Planar Binding", false, 0, 2, 0).setRegistryName("planar_binding"), - new PotionBloodMagic("Soul Snare", false, 0xFFFFFF, 3, 0).setRegistryName("soul_snare"), - new PotionBloodMagic("Soul Fray", true, 0xFFFFFF, 4, 0).setRegistryName("soul_fray"), - new PotionBloodMagic("Fire Fuse", true, 0xFF3333, 5, 0).setRegistryName("fire_fuse"), - new PotionBloodMagic("Constriction", true, 0x000000, 6, 0).setRegistryName("constrict"), - new PotionBloodMagic("Plant Leech", true, 0x000000, 7, 0).setRegistryName("plant_leech"), - new PotionBloodMagic("Deaf", true, 0x000000, 0, 1).setRegistryName("deafness"), - new PotionBloodMagic("Bounce", false, 0x000000, 1, 1).setRegistryName("bounce"), - new PotionBloodMagic("Cling", false, 0x000000, 2, 1).setRegistryName("cling"), - new PotionBloodMagic("S. Lamb", false, 0x000000, 3, 1).setRegistryName("sacrificial_lamb"), - new PotionBloodMagic("Flight", false, 0x000000, 4, 0).setRegistryName("flight"), - new PotionBloodMagic("Grounded", true, 0x000000, 1, 0).setRegistryName("grounded"), - new PotionBloodMagic("Suspended", false, 0x000000, 1, 0).setRegistryName("suspended"), - new PotionBloodMagic("Heavy Heart", true, 0x000000, 1, 0).setRegistryName("heavy_heart"), - new PotionBloodMagic("Feathered", false, 0x000000, 0, 0).setRegistryName("feathered") - ); - } - - @SubscribeEvent - public static void registerEntities(RegistryEvent.Register event) { - int entities = 0; - - event.getRegistry().registerAll( - EntityEntryBuilder.create().id("blood_light", ++entities).entity(EntityBloodLight.class).name("blood_light").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("soul_snare", ++entities).entity(EntitySoulSnare.class).name("soul_snare").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("soul_arrow", ++entities).entity(EntitySentientArrow.class).name("sentient_arrow").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("meteor", ++entities).entity(EntityMeteor.class).name("meteor").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("sentient_specter", ++entities).entity(EntitySentientSpecter.class).name("sentient_specter").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("mimic", ++entities).entity(EntityMimic.class).name("mimic").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("corrupted_zombie", ++entities).entity(EntityCorruptedZombie.class).name("corrupted_zombie").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("corrupted_sheep", ++entities).entity(EntityCorruptedSheep.class).name("corrupted_sheep").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("corrupted_chicken", ++entities).entity(EntityCorruptedChicken.class).name("corrupted_chicken").tracker(16 * 4, 3, true).build(), - EntityEntryBuilder.create().id("corrupted_spider", ++entities).entity(EntityCorruptedSpider.class).name("corrupted_spider").tracker(16 * 4, 3, true).build() - ); - } - - @SubscribeEvent - public static void onRegistryCreation(RegistryEvent.NewRegistry event) { - BLOOD_ORBS = new RegistryBuilder() - .setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")) - .setIDRange(0, Short.MAX_VALUE) - .setType(BloodOrb.class) - .addCallback((IForgeRegistry.AddCallback) (owner, stage, id, obj, oldObj) -> OrbRegistry.tierMap.put(obj.getTier(), OrbRegistry.getOrbStack(obj))) - .create(); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) { - for (BloodOrb orb : BLOOD_ORBS) { - ModelResourceLocation modelLocation = orb.getModelLocation(); - if (modelLocation == null) - modelLocation = new ModelResourceLocation(orb.getRegistryName(), "inventory"); - - ModelLoader.registerItemVariants(RegistrarBloodMagicItems.BLOOD_ORB, modelLocation); - } - - ModelLoader.setCustomMeshDefinition(RegistrarBloodMagicItems.BLOOD_ORB, stack -> - { - if (!stack.hasTagCompound()) - return new ModelResourceLocation(ORB_WEAK.getRegistryName(), "inventory"); - - BloodOrb orb = BLOOD_ORBS.getValue(new ResourceLocation(stack.getTagCompound().getString("orb"))); - if (orb == null || orb.getModelLocation() == null) - return new ModelResourceLocation(ORB_WEAK.getRegistryName(), "inventory"); - - return orb.getModelLocation(); - }); - } +// @SubscribeEvent +// public static void onRegistryCreation(RegistryEvent.NewRegistry event) +// { +// System.out.println("Testification3"); +// BLOOD_ORBS = new RegistryBuilder().setName(new ResourceLocation(BloodMagic.MODID, "blood_orb")).setIDRange(0, Short.MAX_VALUE).setType(BloodOrb.class).addCallback((IForgeRegistry.AddCallback) ( +// owner, stage, id, obj, +// oldObj) -> OrbRegistry.tierMap.put(obj.getTier(), OrbRegistry.getOrbStack(obj))).create(); +// } } diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java deleted file mode 100644 index 62815e21..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicBlocks.java +++ /dev/null @@ -1,167 +0,0 @@ -package WayofTime.bloodmagic.core; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.*; -import WayofTime.bloodmagic.block.enums.*; -import WayofTime.bloodmagic.tile.*; -import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileItemRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode; -import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; -import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.renderer.block.statemap.StateMapperBase; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -@GameRegistry.ObjectHolder(BloodMagic.MODID) -@SuppressWarnings("unused") -public class RegistrarBloodMagicBlocks { - public static final Block ALTAR = Blocks.AIR; - public static final Block BLOOD_RUNE = Blocks.AIR; - public static final Block RITUAL_CONTROLLER = Blocks.AIR; - public static final Block RITUAL_STONE = Blocks.AIR; - public static final Block BLOOD_LIGHT = Blocks.AIR; - public static final Block TELEPOSER = Blocks.AIR; - public static final Block ALCHEMY_ARRAY = Blocks.AIR; - public static final Block SPECTRAL = Blocks.AIR; - public static final Block PHANTOM = Blocks.AIR; - public static final Block SOUL_FORGE = Blocks.AIR; - public static final Block INCENSE_ALTAR = Blocks.AIR; - public static final Block DEMON_CRUCIBLE = Blocks.AIR; - public static final Block DEMON_PYLON = Blocks.AIR; - public static final Block DEMON_CRYSTALLIZER = Blocks.AIR; - public static final Block DEMON_CRYSTAL = Blocks.AIR; - public static final Block ALCHEMY_TABLE = Blocks.AIR; - public static final Block LIFE_ESSENCE = Blocks.AIR; - public static final Block DECORATIVE_BRICK = Blocks.AIR; - public static final Block PATH = Blocks.AIR; - public static final Block MASTER_ROUTING_NODE = Blocks.AIR; - public static final Block INPUT_ROUTING_NODE = Blocks.AIR; - public static final Block OUTPUT_ROUTING_NODE = Blocks.AIR; - public static final Block ITEM_ROUTING_NODE = Blocks.AIR; - public static final Block DIMENSIONAL_PORTAL = Blocks.AIR; - public static final Block BLOOD_TANK = Blocks.AIR; - public static final Block MIMIC = Blocks.AIR; - public static final Block DEMON_BRICK_1 = Blocks.AIR; - public static final Block DEMON_BRICK_2 = Blocks.AIR; - public static final Block DEMON_EXTRAS = Blocks.AIR; - public static final Block DEMON_PILLAR_1 = Blocks.AIR; - public static final Block DEMON_PILLAR_2 = Blocks.AIR; - public static final Block DEMON_PILLAR_CAP_1 = Blocks.AIR; - public static final Block DEMON_PILLAR_CAP_2 = Blocks.AIR; - public static final Block DEMON_PILLAR_CAP_3 = Blocks.AIR; - public static final Block DEMON_LIGHT = Blocks.AIR; - public static final Block DEMON_WALL_1 = Blocks.AIR; - public static final Block DEMON_STAIRS_1 = Blocks.AIR; - public static final Block DEMON_STAIRS_2 = Blocks.AIR; - public static final Block DEMON_STAIRS_3 = Blocks.AIR; - public static final Block INVERSION_PILLAR = Blocks.AIR; - public static final Block INVERSION_PILLAR_END = Blocks.AIR; - - static List blocks; - - @SubscribeEvent - public static void registerBlocks(RegistryEvent.Register event) { - FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); - FluidRegistry.addBucketForFluid(BlockLifeEssence.getLifeEssence()); - - blocks = Lists.newArrayList( - new BlockAltar().setRegistryName("altar"), - new BlockBloodRune().setRegistryName("blood_rune"), - new BlockRitualController().setRegistryName("ritual_controller"), - new BlockRitualStone().setRegistryName("ritual_stone"), - new BlockBloodLight().setRegistryName("blood_light"), - new BlockTeleposer().setRegistryName("teleposer"), - new BlockAlchemyArray().setRegistryName("alchemy_array"), - new BlockSpectral().setRegistryName("spectral"), - new BlockPhantom().setRegistryName("phantom"), - new BlockSoulForge().setRegistryName("soul_forge"), - new BlockIncenseAltar().setRegistryName("incense_altar"), - new BlockDemonCrucible().setRegistryName("demon_crucible"), - new BlockDemonPylon().setRegistryName("demon_pylon"), - new BlockDemonCrystallizer().setRegistryName("demon_crystallizer"), - new BlockDemonCrystal().setRegistryName("demon_crystal"), - new BlockAlchemyTable().setRegistryName("alchemy_table"), - new BlockLifeEssence().setRegistryName("life_essence"), - new BlockDecorative().setRegistryName("decorative_brick"), - new BlockPath().setRegistryName("path"), - new BlockMasterRoutingNode().setRegistryName("master_routing_node"), - new BlockInputRoutingNode().setRegistryName("input_routing_node"), - new BlockOutputRoutingNode().setRegistryName("output_routing_node"), - new BlockItemRoutingNode().setRegistryName("item_routing_node"), - new BlockDimensionalPortal().setRegistryName("dimensional_portal"), - new BlockBloodTank().setRegistryName("blood_tank"), - new BlockMimic().setRegistryName("mimic"), - new BlockDemonBase<>("bricks1", EnumDemonBlock1.class).setRegistryName("demon_brick_1"), - new BlockDemonBase<>("bricks2", EnumDemonBlock2.class).setRegistryName("demon_brick_2"), - new BlockDemonBase<>("extras", EnumDemonBlock3.class).setRegistryName("demon_extras"), - new BlockDemonPillarBase<>("pillar1", Material.ROCK, EnumSubWillType.class).setRegistryName("demon_pillar_1"), - new BlockDemonPillarBase<>("pillar2", Material.ROCK, EnumSubWillType.class).setRegistryName("demon_pillar_2"), - new BlockDemonPillarCapBase<>("pillarCap1", Material.ROCK, EnumSubWillType1.class).setRegistryName("demon_pillar_cap_1"), - new BlockDemonPillarCapBase<>("pillarCap2", Material.ROCK, EnumSubWillType2.class).setRegistryName("demon_pillar_cap_2"), - new BlockDemonPillarCapBase<>("pillarCap3", Material.ROCK, EnumSubWillType3.class).setRegistryName("demon_pillar_cap_3"), - new BlockDemonLight().setRegistryName("demon_light"), - new BlockDemonWallBase<>("wall1", Material.ROCK, EnumWillWall.class).setRegistryName("demon_wall_1"), - new BlockDemonStairsBase<>("stairs1", Material.ROCK, EnumSubWillType1.class).setRegistryName("demon_stairs_1"), - new BlockDemonStairsBase<>("stairs2", Material.ROCK, EnumSubWillType2.class).setRegistryName("demon_stairs_2"), - new BlockDemonStairsBase<>("stairs3", Material.ROCK, EnumSubWillType3.class).setRegistryName("demon_stairs_3"), - new BlockInversionPillar().setRegistryName("inversion_pillar"), - new BlockInversionPillarEnd().setRegistryName("inversion_pillar_end") - ); - - event.getRegistry().registerAll(blocks.toArray(new Block[0])); - - registerTileEntities(); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public static void registerModels(ModelRegistryEvent event) { - ModelLoader.setCustomStateMapper(LIFE_ESSENCE, new StateMapperBase() { - @Override - protected ModelResourceLocation getModelResourceLocation(BlockState state) { - return new ModelResourceLocation(state.getBlock().getRegistryName(), "fluid"); - } - }); - } - - private static void registerTileEntities() { - GameRegistry.registerTileEntity(TileAltar.class, BloodMagic.MODID + ":altar"); - GameRegistry.registerTileEntity(TileImperfectRitualStone.class, BloodMagic.MODID + ":imperfect_ritual_stone"); - GameRegistry.registerTileEntity(TileMasterRitualStone.class, BloodMagic.MODID + ":master_ritual_stone"); - GameRegistry.registerTileEntity(TileAlchemyArray.class, BloodMagic.MODID + ":alchemy_array"); - GameRegistry.registerTileEntity(TileSpectralBlock.class, BloodMagic.MODID + ":spectral_block"); - GameRegistry.registerTileEntity(TilePhantomBlock.class, BloodMagic.MODID + ":phantom_block"); - GameRegistry.registerTileEntity(TileTeleposer.class, BloodMagic.MODID + ":teleposer"); - GameRegistry.registerTileEntity(TileSoulForge.class, BloodMagic.MODID + ":soul_forge"); - GameRegistry.registerTileEntity(TileMasterRoutingNode.class, BloodMagic.MODID + ":master_routing_node"); - GameRegistry.registerTileEntity(TileInputRoutingNode.class, BloodMagic.MODID + ":input_routing_node"); - GameRegistry.registerTileEntity(TileOutputRoutingNode.class, BloodMagic.MODID + ":output_routing_node"); - GameRegistry.registerTileEntity(TileItemRoutingNode.class, BloodMagic.MODID + ":item_routing_node"); - GameRegistry.registerTileEntity(TileIncenseAltar.class, BloodMagic.MODID + ":incense_altar"); - GameRegistry.registerTileEntity(TileDemonCrucible.class, BloodMagic.MODID + ":demon_crucible"); - GameRegistry.registerTileEntity(TileDemonPylon.class, BloodMagic.MODID + ":demon_pylon"); - GameRegistry.registerTileEntity(TileDemonCrystallizer.class, BloodMagic.MODID + ":demon_crystallizer"); - GameRegistry.registerTileEntity(TileDemonCrystal.class, BloodMagic.MODID + ":demon_crystal"); - GameRegistry.registerTileEntity(TileAlchemyTable.class, BloodMagic.MODID + ":alchemy_table"); - GameRegistry.registerTileEntity(TileDimensionalPortal.class, BloodMagic.MODID + ":dimensional_portal"); - GameRegistry.registerTileEntity(TileBloodTank.class, BloodMagic.MODID + ":blood_tank"); - GameRegistry.registerTileEntity(TileMimic.class, BloodMagic.MODID + ":mimic"); - GameRegistry.registerTileEntity(TileInversionPillar.class, BloodMagic.MODID + ":inversion_pillar"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java deleted file mode 100644 index c4421b41..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicItems.java +++ /dev/null @@ -1,255 +0,0 @@ -package WayofTime.bloodmagic.core; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.IBMBlock; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.*; -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; -import WayofTime.bloodmagic.item.gear.ItemPackSelfSacrifice; -import WayofTime.bloodmagic.item.routing.ItemFluidRouterFilter; -import WayofTime.bloodmagic.item.routing.ItemNodeRouter; -import WayofTime.bloodmagic.item.routing.ItemRouterFilter; -import WayofTime.bloodmagic.item.sigil.*; -import WayofTime.bloodmagic.item.soul.*; -import WayofTime.bloodmagic.item.soulBreath.ItemFlightScroll; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.item.types.ShardType; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.item.Items; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.common.util.EnumHelper; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.Set; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -@GameRegistry.ObjectHolder(BloodMagic.MODID) -@SuppressWarnings("unchecked") -public class RegistrarBloodMagicItems { - - public static final Item BLOOD_ORB = Items.AIR; - public static final Item ACTIVATION_CRYSTAL = Items.AIR; - public static final Item SLATE = Items.AIR; - public static final Item INSCRIPTION_TOOL = Items.AIR; - public static final Item SACRIFICIAL_DAGGER = Items.AIR; - public static final Item PACK_SELF_SACRIFICE = Items.AIR; - public static final Item PACK_SACRIFICE = Items.AIR; - public static final Item DAGGER_OF_SACRIFICE = Items.AIR; - public static final Item RITUAL_DIVINER = Items.AIR; - public static final Item RITUAL_DISMANTLER = Items.AIR; - public static final Item RITUAL_READER = Items.AIR; - public static final Item LAVA_CRYSTAL = Items.AIR; - public static final Item BOUND_SWORD = Items.AIR; - public static final Item BOUND_PICKAXE = Items.AIR; - public static final Item BOUND_AXE = Items.AIR; - public static final Item BOUND_SHOVEL = Items.AIR; - public static final Item SIGIL_DIVINATION = Items.AIR; - public static final Item SIGIL_AIR = Items.AIR; - public static final Item SIGIL_WATER = Items.AIR; - public static final Item SIGIL_LAVA = Items.AIR; - public static final Item SIGIL_VOID = Items.AIR; - public static final Item SIGIL_GREEN_GROVE = Items.AIR; - public static final Item SIGIL_BLOOD_LIGHT = Items.AIR; - public static final Item SIGIL_ELEMENTAL_AFFINITY = Items.AIR; - public static final Item SIGIL_HASTE = Items.AIR; - public static final Item SIGIL_MAGNETISM = Items.AIR; - public static final Item SIGIL_SUPPRESSION = Items.AIR; - public static final Item SIGIL_FAST_MINER = Items.AIR; - public static final Item SIGIL_SEER = Items.AIR; - public static final Item SIGIL_ENDER_SEVERANCE = Items.AIR; - public static final Item SIGIL_WHIRLWIND = Items.AIR; - public static final Item SIGIL_PHANTOM_BRIDGE = Items.AIR; - public static final Item SIGIL_COMPRESSION = Items.AIR; - public static final Item SIGIL_HOLDING = Items.AIR; - public static final Item SIGIL_TELEPOSITION = Items.AIR; - public static final Item SIGIL_TRANSPOSITION = Items.AIR; - public static final Item SIGIL_CLAW = Items.AIR; - public static final Item SIGIL_BOUNCE = Items.AIR; - public static final Item SIGIL_FROST = Items.AIR; - public static final Item COMPONENT = Items.AIR; - public static final Item ITEM_DEMON_CRYSTAL = Items.AIR; - public static final Item TELEPOSITION_FOCUS = Items.AIR; - public static final Item EXPERIENCE_TOME = Items.AIR; - public static final Item BLOOD_SHARD = Items.AIR; - public static final Item LIVING_ARMOUR_HELMET = Items.AIR; - public static final Item LIVING_ARMOUR_CHEST = Items.AIR; - public static final Item LIVING_ARMOUR_LEGGINGS = Items.AIR; - public static final Item LIVING_ARMOUR_BOOTS = Items.AIR; - public static final Item SENTIENT_ARMOUR_HELMET = Items.AIR; - public static final Item SENTIENT_ARMOUR_CHEST = Items.AIR; - public static final Item SENTIENT_ARMOUR_LEGGINGS = Items.AIR; - public static final Item SENTIENT_ARMOUR_BOOTS = Items.AIR; - public static final Item ALTAR_MAKER = Items.AIR; - public static final Item UPGRADE_TOME = Items.AIR; - public static final Item UPGRADE_TRAINER = Items.AIR; - public static final Item ARCANE_ASHES = Items.AIR; - public static final Item MONSTER_SOUL = Items.AIR; - public static final Item SOUL_GEM = Items.AIR; - public static final Item SOUL_SNARE = Items.AIR; - public static final Item SENTIENT_SWORD = Items.AIR; - public static final Item SENTIENT_BOW = Items.AIR; - public static final Item SENTIENT_ARMOUR_GEM = Items.AIR; - public static final Item SENTIENT_AXE = Items.AIR; - public static final Item SENTIENT_PICKAXE = Items.AIR; - public static final Item SENTIENT_SHOVEL = Items.AIR; - public static final Item NODE_ROUTER = Items.AIR; - public static final Item BASE_ITEM_FILTER = Items.AIR; - public static final Item BASE_FLUID_FILTER = Items.AIR; - public static final Item CUTTING_FLUID = Items.AIR; - public static final Item SANGUINE_BOOK = Items.AIR; - public static final Item POINTS_UPGRADE = Items.AIR; - public static final Item DEMON_WILL_GAUGE = Items.AIR; - public static final Item POTION_FLASK = Items.AIR; - public static final Item ALCHEMIC_VIAL = Items.AIR; - public static final Item ICARUS_SCROLL = Items.AIR; - - public static Item.ToolMaterial BOUND_TOOL_MATERIAL = EnumHelper.addToolMaterial("bound", 4, 1, 10, 8, 50); - public static Item.ToolMaterial SOUL_TOOL_MATERIAL = EnumHelper.addToolMaterial("demonic", 4, 520, 7, 8, 50); - - public static List items; - - @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) { - items = Lists.newArrayList(); - - RegistrarBloodMagicBlocks.blocks.stream().filter(block -> block instanceof IBMBlock && ((IBMBlock) block).getItem() != null).forEach(block -> - { - IBMBlock bmBlock = (IBMBlock) block; - items.add(bmBlock.getItem().setRegistryName(block.getRegistryName())); - }); - - items.addAll(Lists.newArrayList( - new ItemBloodOrb().setRegistryName("blood_orb"), - new ItemActivationCrystal().setRegistryName("activation_crystal"), - new ItemSlate().setRegistryName("slate"), - new ItemInscriptionTool().setRegistryName("inscription_tool"), - new ItemSacrificialDagger().setRegistryName("sacrificial_dagger"), - new ItemPackSacrifice().setRegistryName("pack_sacrifice"), - new ItemPackSelfSacrifice().setRegistryName("pack_self_sacrifice"), - new ItemDaggerOfSacrifice().setRegistryName("dagger_of_sacrifice"), - new ItemRitualDiviner().setRegistryName("ritual_diviner"), - new ItemRitualDismantler().setRegistryName("ritual_dismantler"), - new ItemRitualReader().setRegistryName("ritual_reader"), - new ItemLavaCrystal().setRegistryName("lava_crystal"), - new ItemBoundSword().setRegistryName("bound_sword"), - new ItemBoundPickaxe().setRegistryName("bound_pickaxe"), - new ItemBoundAxe().setRegistryName("bound_axe"), - new ItemBoundShovel().setRegistryName("bound_shovel"), - new ItemSigilDivination(true).setRegistryName("sigil_divination"), - new ItemSigilAir().setRegistryName("sigil_air"), - new ItemSigilWater().setRegistryName("sigil_water"), - new ItemSigilLava().setRegistryName("sigil_lava"), - new ItemSigilVoid().setRegistryName("sigil_void"), - new ItemSigilGreenGrove().setRegistryName("sigil_green_grove"), - new ItemSigilBloodLight().setRegistryName("sigil_blood_light"), - new ItemSigilElementalAffinity().setRegistryName("sigil_elemental_affinity"), - new ItemSigilMagnetism().setRegistryName("sigil_magnetism"), - new ItemSigilSuppression().setRegistryName("sigil_suppression"), - new ItemSigilHaste().setRegistryName("sigil_haste"), - new ItemSigilFastMiner().setRegistryName("sigil_fast_miner"), - new ItemSigilDivination(false).setRegistryName("sigil_seer"), - new ItemSigilPhantomBridge().setRegistryName("sigil_phantom_bridge"), - new ItemSigilWhirlwind().setRegistryName("sigil_whirlwind"), - new ItemSigilCompression().setRegistryName("sigil_compression"), - new ItemSigilEnderSeverance().setRegistryName("sigil_ender_severance"), - new ItemSigilHolding().setRegistryName("sigil_holding"), - new ItemSigilTeleposition().setRegistryName("sigil_teleposition"), - new ItemSigilTransposition().setRegistryName("sigil_transposition"), - new ItemSigilClaw().setRegistryName("sigil_claw"), - new ItemSigilBounce().setRegistryName("sigil_bounce"), - new ItemSigilFrost().setRegistryName("sigil_frost"), - new ItemEnum.Variant<>(ComponentTypes.class, "baseComponent").setRegistryName("component"), - new ItemDemonCrystal().setRegistryName("item_demon_crystal"), - new ItemTelepositionFocus().setRegistryName("teleposition_focus"), - new ItemExperienceBook().setRegistryName("experience_tome"), - new ItemEnum.Variant<>(ShardType.class, "blood_shard").setRegistryName("blood_shard"), - new ItemLivingArmour(EquipmentSlotType.HEAD).setRegistryName("living_armour_helmet"), - new ItemLivingArmour(EquipmentSlotType.CHEST).setRegistryName("living_armour_chest"), - new ItemLivingArmour(EquipmentSlotType.LEGS).setRegistryName("living_armour_leggings"), - new ItemLivingArmour(EquipmentSlotType.FEET).setRegistryName("living_armour_boots"), - new ItemSentientArmour(EquipmentSlotType.HEAD).setRegistryName("sentient_armour_helmet"), - new ItemSentientArmour(EquipmentSlotType.CHEST).setRegistryName("sentient_armour_chest"), - new ItemSentientArmour(EquipmentSlotType.LEGS).setRegistryName("sentient_armour_leggings"), - new ItemSentientArmour(EquipmentSlotType.FEET).setRegistryName("sentient_armour_boots"), - new ItemAltarMaker().setRegistryName("altar_maker"), - new ItemUpgradeTome().setRegistryName("upgrade_tome"), - new ItemUpgradeTrainer().setRegistryName("upgrade_trainer"), - new ItemArcaneAshes().setRegistryName("arcane_ashes"), - new ItemMonsterSoul().setRegistryName("monster_soul"), - new ItemSoulGem().setRegistryName("soul_gem"), - new ItemSoulSnare().setRegistryName("soul_snare"), - new ItemSentientSword().setRegistryName("sentient_sword"), - new ItemSentientBow().setRegistryName("sentient_bow"), - new ItemSentientArmourGem().setRegistryName("sentient_armour_gem"), - new ItemSentientAxe().setRegistryName("sentient_axe"), - new ItemSentientPickaxe().setRegistryName("sentient_pickaxe"), - new ItemSentientShovel().setRegistryName("sentient_shovel"), - new ItemNodeRouter().setRegistryName("node_router"), - new ItemRouterFilter().setRegistryName("base_item_filter"), - new ItemFluidRouterFilter().setRegistryName("base_fluid_filter"), - new ItemCuttingFluid().setRegistryName("cutting_fluid"), - new ItemSanguineBook().setRegistryName("sanguine_book"), - new ItemLivingArmourPointsUpgrade().setRegistryName("points_upgrade"), - new ItemDemonWillGauge().setRegistryName("demon_will_gauge"), - new ItemPotionFlask().setRegistryName("potion_flask"), - new ItemAlchemicVial().setRegistryName("alchemic_vial"), - new ItemFlightScroll().setRegistryName("icarus_scroll") - )); - - event.getRegistry().registerAll(items.toArray(new Item[0])); - } - - @SideOnly(Side.CLIENT) - @SubscribeEvent - public static void registerRenders(ModelRegistryEvent event) { - items.stream().filter(i -> i instanceof IVariantProvider).forEach(i -> - { - Int2ObjectMap variants = new Int2ObjectOpenHashMap<>(); - ((IVariantProvider) i).gatherVariants(variants); - for (Int2ObjectMap.Entry variant : variants.int2ObjectEntrySet()) - ModelLoader.setCustomModelResourceLocation(i, variant.getIntKey(), new ModelResourceLocation(i.getRegistryName(), variant.getValue())); - }); - - items.stream().filter(i -> i instanceof IMeshProvider).forEach(i -> - { - IMeshProvider mesh = (IMeshProvider) i; - ResourceLocation loc = mesh.getCustomLocation(); - if (loc == null) - loc = i.getRegistryName(); - - Set variants = Sets.newHashSet(); - mesh.gatherVariants(variants::add); - for (String variant : variants) - ModelLoader.registerItemVariants(i, new ModelResourceLocation(loc, variant)); - - ModelLoader.setCustomMeshDefinition(i, mesh.getMeshDefinition()); - }); - - RegistrarBloodMagicBlocks.blocks.stream().filter(b -> b instanceof IVariantProvider).forEach(b -> - { - Int2ObjectMap variants = new Int2ObjectOpenHashMap<>(); - ((IVariantProvider) b).gatherVariants(variants); - for (Int2ObjectMap.Entry variant : variants.int2ObjectEntrySet()) - ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(b), variant.getIntKey(), new ModelResourceLocation(b.getRegistryName(), variant.getValue())); - }); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java index 1b4cbdd3..e04f63fd 100644 --- a/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java +++ b/src/main/java/WayofTime/bloodmagic/core/RegistrarBloodMagicRecipes.java @@ -1,239 +1,71 @@ -package WayofTime.bloodmagic.core; +package wayoftime.bloodmagic.core; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.item.ItemSlate; -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.item.alchemy.ItemLivingArmourPointsUpgrade; -import WayofTime.bloodmagic.item.soul.ItemSoulGem; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.PluginUtil; -import com.google.common.collect.Sets; -import net.minecraft.block.Blocks; -import net.minecraft.item.Items; -import net.minecraft.potion.Potions; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.potion.PotionUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.OreIngredient; -import net.minecraftforge.oredict.ShapelessOreRecipe; +import wayoftime.bloodmagic.api.impl.BloodMagicRecipeRegistrar; -import java.util.List; -import java.util.Set; +public class RegistrarBloodMagicRecipes +{ -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class RegistrarBloodMagicRecipes { +// @SubscribeEvent +// public static void registerRecipes(RegistryEvent.Register event) { +// for (int i = 0; i < ItemSoulGem.names.length; i++) { +// for (EnumDemonWillType willType : EnumDemonWillType.values()) { +// ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); +// ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); +// +// ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(willType, newGemStack); +// ShapelessOreRecipe shapeless = new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "soul_gem"), newGemStack, baseGemStack, willType.getStack()); +// event.getRegistry().register(shapeless.setRegistryName("soul_gem_" + willType.getName())); +// } +// } +// +// OreDictionary.registerOre("dustIron", ComponentTypes.SAND_IRON.getStack()); +// OreDictionary.registerOre("dustGold", ComponentTypes.SAND_GOLD.getStack()); +// OreDictionary.registerOre("dustCoal", ComponentTypes.SAND_COAL.getStack()); +// +// PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.RECIPE_REGISTER); +// +// RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL.setRepairItem(EnumDemonWillType.DEFAULT.getStack()); +// } - @SubscribeEvent - public static void registerRecipes(RegistryEvent.Register event) { - for (int i = 0; i < ItemSoulGem.names.length; i++) { - for (EnumDemonWillType willType : EnumDemonWillType.values()) { - ItemStack baseGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); - ItemStack newGemStack = new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, i); + public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) + { +// Ingredient d; + // ONE +// registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), AltarTier.ONE.ordinal(), 2000, 2, 1); +// registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), AltarTier.ONE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), AltarTier.ONE.ordinal(), 1000, 5, 0); +// registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), AltarTier.ONE.ordinal(), 1000, 20, 0); +// +// // TWO +// registrar.addBloodAltar(new OreIngredient("blockRedstone"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), AltarTier.TWO.ordinal(), 5000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.BLANK.getStack()), ItemSlate.SlateType.REINFORCED.getStack(), AltarTier.TWO.ordinal(), 2000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), AltarTier.TWO.ordinal(), 3000, 5, 5); +// +// // THREE +// registrar.addBloodAltar(new OreIngredient("blockGold"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), AltarTier.THREE.ordinal(), 25000, 20, 20); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.REINFORCED.getStack()), ItemSlate.SlateType.IMBUED.getStack(), AltarTier.THREE.ordinal(), 5000, 15, 10); +// registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), AltarTier.THREE.ordinal(), 10000, 20, 10); +// +// // FOUR +// registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), AltarTier.FOUR.ordinal(), 40000, 30, 50); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.IMBUED.getStack()), ItemSlate.SlateType.DEMONIC.getStack(), AltarTier.FOUR.ordinal(), 15000, 20, 20); +// registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getStack(), AltarTier.FOUR.ordinal(), 2000, 20, 10); +// registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), AltarTier.FOUR.ordinal(), 2000, 10, 10); +// registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), AltarTier.FOUR.ordinal(), 10000, 20, 10); +// +// // FIVE +// registrar.addBloodAltar(new OreIngredient("netherStar"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), AltarTier.FIVE.ordinal(), 80000, 50, 100); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), AltarTier.FIVE.ordinal(), 30000, 40, 100); - ((ItemSoulGem) RegistrarBloodMagicItems.SOUL_GEM).setCurrentType(willType, newGemStack); - ShapelessOreRecipe shapeless = new ShapelessOreRecipe(new ResourceLocation(BloodMagic.MODID, "soul_gem"), newGemStack, baseGemStack, willType.getStack()); - event.getRegistry().register(shapeless.setRegistryName("soul_gem_" + willType.getName())); - } - } - - OreDictionary.registerOre("dustIron", ComponentTypes.SAND_IRON.getStack()); - OreDictionary.registerOre("dustGold", ComponentTypes.SAND_GOLD.getStack()); - OreDictionary.registerOre("dustCoal", ComponentTypes.SAND_COAL.getStack()); - - PluginUtil.handlePluginStep(PluginUtil.RegistrationStep.RECIPE_REGISTER); - - RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL.setRepairItem(EnumDemonWillType.DEFAULT.getStack()); - } - - public static void registerAltarRecipes(BloodMagicRecipeRegistrar registrar) { - // ONE - registrar.addBloodAltar(new OreIngredient("gemDiamond"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_WEAK), AltarTier.ONE.ordinal(), 2000, 2, 1); - registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), AltarTier.ONE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), AltarTier.ONE.ordinal(), 1000, 5, 0); - registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), AltarTier.ONE.ordinal(), 1000, 20, 0); - - // TWO - registrar.addBloodAltar(new OreIngredient("blockRedstone"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), AltarTier.TWO.ordinal(), 5000, 5, 5); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.BLANK.getStack()), ItemSlate.SlateType.REINFORCED.getStack(), AltarTier.TWO.ordinal(), 2000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), AltarTier.TWO.ordinal(), 3000, 5, 5); - - // THREE - registrar.addBloodAltar(new OreIngredient("blockGold"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), AltarTier.THREE.ordinal(), 25000, 20, 20); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.REINFORCED.getStack()), ItemSlate.SlateType.IMBUED.getStack(), AltarTier.THREE.ordinal(), 5000, 15, 10); - registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); - registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), AltarTier.THREE.ordinal(), 10000, 20, 10); - - // FOUR - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), AltarTier.FOUR.ordinal(), 40000, 30, 50); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.IMBUED.getStack()), ItemSlate.SlateType.DEMONIC.getStack(), AltarTier.FOUR.ordinal(), 15000, 20, 20); - registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getStack(), AltarTier.FOUR.ordinal(), 2000, 20, 10); - registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), AltarTier.FOUR.ordinal(), 2000, 10, 10); - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), AltarTier.FOUR.ordinal(), 10000, 20, 10); - - // FIVE - registrar.addBloodAltar(new OreIngredient("netherStar"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), AltarTier.FIVE.ordinal(), 80000, 50, 100); - registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), AltarTier.FIVE.ordinal(), 30000, 40, 100); - - // SIX - if (ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) { - registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), AltarTier.SIX.ordinal(), 200000, 100, 200); - registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getStack(), AltarTier.SIX.ordinal(), 200000, 100, 200); - } - } - - public static void registerAlchemyTableRecipes(BloodMagicRecipeRegistrar registrar) { - registrar.addAlchemyTable(new ItemStack(Items.STRING, 4), 0, 100, 0, Blocks.WOOL, Items.FLINT); - registrar.addAlchemyTable(new ItemStack(Items.FLINT, 2), 0, 20, 0, Blocks.GRAVEL, Items.FLINT); - registrar.addAlchemyTable(new ItemStack(Items.LEATHER, 4), 100, 200, 1, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.ROTTEN_FLESH, Items.FLINT, Items.WATER_BUCKET); - registrar.addAlchemyTable(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 500, 200, 1, "gunpowder", "gunpowder", "dustCoal"); - registrar.addAlchemyTable(new ItemStack(Items.BREAD), 100, 200, 1, Items.WHEAT, Items.SUGAR); - registrar.addAlchemyTable(new ItemStack(Blocks.GRASS), 200, 200, 1, Blocks.DIRT, new ItemStack(Items.DYE, 1, 15), Items.WHEAT_SEEDS); - registrar.addAlchemyTable(new ItemStack(Items.CLAY_BALL, 4), 50, 100, 2, Items.WATER_BUCKET, "sand"); - registrar.addAlchemyTable(new ItemStack(Blocks.CLAY, 5), 200, 200, 1, Items.WATER_BUCKET, Blocks.HARDENED_CLAY, Blocks.HARDENED_CLAY, Blocks.HARDENED_CLAY, Blocks.HARDENED_CLAY, Blocks.HARDENED_CLAY); - registrar.addAlchemyTable(new ItemStack(Blocks.OBSIDIAN), 50, 50, 1, Items.WATER_BUCKET, Items.LAVA_BUCKET); - registrar.addAlchemyTable(ComponentTypes.SULFUR.getStack(8), 0, 100, 0, Items.LAVA_BUCKET); - registrar.addAlchemyTable(ComponentTypes.SALTPETER.getStack(4), 0, 100, 0, ComponentTypes.PLANT_OIL.getStack(), ComponentTypes.PLANT_OIL.getStack(), "dustCoal"); - registrar.addAlchemyTable(new ItemStack(Items.GUNPOWDER, 3), 0, 100, 0, "dustSaltpeter", "dustSulfur", new ItemStack(Items.COAL, 1, 1)); - registrar.addAlchemyTable(ComponentTypes.SAND_COAL.getStack(4), 100, 100, 1, new ItemStack(Items.COAL, 1, 0), new ItemStack(Items.COAL, 1, 0), Items.FLINT); - registrar.addAlchemyTable(ItemCuttingFluid.FluidType.BASIC.getStack(), 1000, 400, 1, "dustCoal", "gunpowder", Items.REDSTONE, Items.SUGAR, ComponentTypes.PLANT_OIL.getStack(), PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), Potions.WATER)); - registrar.addAlchemyTable(ComponentTypes.SAND_IRON.getStack(2), 400, 200, 1, "oreIron", ItemCuttingFluid.FluidType.BASIC.getStack()); - registrar.addAlchemyTable(ComponentTypes.SAND_GOLD.getStack(2), 400, 200, 1, "oreGold", ItemCuttingFluid.FluidType.BASIC.getStack()); - registrar.addAlchemyTable(new ItemStack(Items.REDSTONE, 8), 400, 200, 1, "oreRedstone", ItemCuttingFluid.FluidType.BASIC.getStack()); - registrar.addAlchemyTable(new ItemStack(Blocks.GRAVEL), 50, 50, 1, "cobblestone", ItemCuttingFluid.FluidType.EXPLOSIVE.getStack()); - registrar.addAlchemyTable(new ItemStack(Blocks.SAND), 50, 50, 1, Blocks.GRAVEL, ItemCuttingFluid.FluidType.EXPLOSIVE.getStack()); - registrar.addAlchemyTable(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropCarrot", "cropCarrot", "cropCarrot", new ItemStack(Items.DYE, 1, 15)); - registrar.addAlchemyTable(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropPotato", "cropPotato", new ItemStack(Items.DYE, 1, 15)); - registrar.addAlchemyTable(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, "cropWheat", "cropWheat", new ItemStack(Items.DYE, 1, 15)); - registrar.addAlchemyTable(ComponentTypes.PLANT_OIL.getStack(), 100, 100, 1, Items.BEETROOT, Items.BEETROOT, Items.BEETROOT, new ItemStack(Items.DYE, 1, 15)); - registrar.addAlchemyTable(ComponentTypes.NEURO_TOXIN.getStack(), 1000, 100, 2, new ItemStack(Items.FISH, 1, 3)); - registrar.addAlchemyTable(ComponentTypes.ANTISEPTIC.getStack(2), 1000, 200, 2, ComponentTypes.PLANT_OIL.getStack(), "nuggetGold", "cropWheat", Items.SUGAR, Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM); - registrar.addAlchemyTable(ItemLivingArmourPointsUpgrade.UpgradeType.DRAFT_ANGELUS.getStack(), 20000, 400, 3, ComponentTypes.NEURO_TOXIN.getStack(), ComponentTypes.ANTISEPTIC.getStack(), "dustGold", Items.FERMENTED_SPIDER_EYE, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), Items.GHAST_TEAR); - registrar.addAlchemyTable(new ItemStack(RegistrarBloodMagicItems.POTION_FLASK), 1000, 200, 2, PotionUtils.addPotionToItemStack(new ItemStack(Items.POTIONITEM), Potions.WATER), "cropNetherWart", "dustRedstone", "dustGlowstone"); - registrar.addAlchemyTable(ComponentTypes.CATALYST_LENGTH_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "gemLapis"); - registrar.addAlchemyTable(ComponentTypes.CATALYST_POWER_1.getStack(), 1000, 100, 2, "gunpowder", "cropNetherWart", "dustRedstone"); - - Set addedOreRecipeList = Sets.newHashSet("oreIron", "oreGold", "oreCoal", "oreRedstone"); // We already added these above - String[] oreList = OreDictionary.getOreNames().clone(); - for (String ore : oreList) { - if (ore.startsWith("ore") && !addedOreRecipeList.contains(ore)) { - String dustName = ore.replaceFirst("ore", "dust"); - - List discoveredOres = OreDictionary.getOres(ore); - List dustList = OreDictionary.getOres(dustName); - if (dustList != null && !dustList.isEmpty() && discoveredOres != null && !discoveredOres.isEmpty()) { - ItemStack dustStack = dustList.get(0).copy(); - dustStack.setCount(2); - registrar.addAlchemyTable(dustStack, 400, 200, 1, ore, ItemCuttingFluid.FluidType.BASIC.getStack()); - addedOreRecipeList.add(ore); - } - } - } - } - - public static void registerTartaricForgeRecipes(BloodMagicRecipeRegistrar registrar) { - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), 1, 1, "dustRedstone", "ingotGold", "blockGlass", "dyeBlue"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), 60, 20, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), "gemDiamond", "blockRedstone", "blockLapis"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), 240, 50, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "gemDiamond", "blockGold", ItemSlate.SlateType.IMBUED.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), 1000, 100, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 2), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD), EnumDemonWillType.DEFAULT.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 4), 4000, 500, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 3), Items.NETHER_STAR); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SWORD), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SWORD)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_AXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_AXE)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_PICKAXE), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_PICKAXE)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_SHOVEL), 0, 0, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM), new ItemStack(Items.IRON_SHOVEL)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_BOW), 70, 0, new ItemStack(Items.BOW), new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), "string", "string"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.ARCANE_ASHES), 0, 0, "dustRedstone", "dyeWhite", "gunpowder", Items.COAL); - registrar.addTartaricForge(ComponentTypes.REAGENT_WATER.getStack(), 10, 3, new ItemStack(Items.SUGAR), new ItemStack(Items.WATER_BUCKET), new ItemStack(Items.WATER_BUCKET)); - registrar.addTartaricForge(ComponentTypes.REAGENT_LAVA.getStack(), 32, 10, Items.LAVA_BUCKET, "dustRedstone", "cobblestone", "blockCoal"); - registrar.addTartaricForge(ComponentTypes.REAGENT_VOID.getStack(), 64, 10, Items.BUCKET, "string", "string", "gunpowder"); - registrar.addTartaricForge(ComponentTypes.REAGENT_GROWTH.getStack(), 128, 20, "treeSapling", "treeSapling", "sugarcane", Items.SUGAR); - registrar.addTartaricForge(ComponentTypes.REAGENT_AIR.getStack(), 128, 20, Items.GHAST_TEAR, "feather", "feather"); - registrar.addTartaricForge(ComponentTypes.REAGENT_SIGHT.getStack(), 64, 0, RegistrarBloodMagicItems.SIGIL_DIVINATION, "blockGlass", "blockGlass", "dustGlowstone"); - registrar.addTartaricForge(ComponentTypes.REAGENT_HOLDING.getStack(), 64, 20, "chestWood", "leather", "string", "string"); - registrar.addTartaricForge(ComponentTypes.REAGENT_FAST_MINER.getStack(), 128, 10, Items.IRON_PICKAXE, Items.IRON_AXE, Items.IRON_SHOVEL, Items.GUNPOWDER); - registrar.addTartaricForge(ComponentTypes.REAGENT_AFFINITY.getStack(), 300, 30, RegistrarBloodMagicItems.SIGIL_WATER, RegistrarBloodMagicItems.SIGIL_AIR, RegistrarBloodMagicItems.SIGIL_LAVA, Blocks.OBSIDIAN); - registrar.addTartaricForge(ComponentTypes.REAGENT_SUPPRESSION.getStack(), 500, 50, RegistrarBloodMagicBlocks.TELEPOSER, Items.WATER_BUCKET, Items.LAVA_BUCKET, Items.BLAZE_ROD); - registrar.addTartaricForge(ComponentTypes.REAGENT_BINDING.getStack(), 400, 10, "dustGlowstone", "dustRedstone", "nuggetGold", Items.GUNPOWDER); - registrar.addTartaricForge(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), 300, 10, "glowstone", Blocks.TORCH, "dustRedstone", "dustRedstone"); - registrar.addTartaricForge(ComponentTypes.REAGENT_MAGNETISM.getStack(), 600, 10, "string", "ingotGold", "blockIron", "ingotGold"); - registrar.addTartaricForge(ComponentTypes.REAGENT_HASTE.getStack(), 1400, 100, Items.COOKIE, Items.SUGAR, Items.COOKIE, "stone"); - registrar.addTartaricForge(ComponentTypes.REAGENT_BRIDGE.getStack(), 600, 50, Blocks.SOUL_SAND, Blocks.SOUL_SAND, "stone", Blocks.OBSIDIAN); - registrar.addTartaricForge(ComponentTypes.REAGENT_SEVERANCE.getStack(), 800, 70, Items.ENDER_EYE, Items.ENDER_PEARL, "ingotGold", "ingotGold"); - registrar.addTartaricForge(ComponentTypes.REAGENT_COMPRESSION.getStack(), 2000, 200, "blockIron", "blockGold", Blocks.OBSIDIAN, "cobblestone"); - registrar.addTartaricForge(ComponentTypes.REAGENT_TELEPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "glowstone", "blockRedstone", "ingotGold"); - registrar.addTartaricForge(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), 1500, 200, RegistrarBloodMagicBlocks.TELEPOSER, "gemDiamond", Items.ENDER_PEARL, Blocks.OBSIDIAN); - registrar.addTartaricForge(ComponentTypes.REAGENT_CLAW.getStack(), 800, 120, Items.FLINT, Items.FLINT, ItemCuttingFluid.FluidType.BASIC.getStack()); - registrar.addTartaricForge(ComponentTypes.REAGENT_BOUNCE.getStack(), 200, 20, Blocks.SLIME_BLOCK, Blocks.SLIME_BLOCK, Items.LEATHER, "string"); - registrar.addTartaricForge(ComponentTypes.REAGENT_FROST.getStack(), 80, 10, Blocks.ICE, Items.SNOWBALL, Items.SNOWBALL, "dustRedstone"); - - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 240, 150, Items.DIAMOND_CHESTPLATE, new ItemStack(RegistrarBloodMagicItems.SOUL_GEM, 1, 1), Blocks.IRON_BLOCK, Blocks.OBSIDIAN); - - registrar.addTartaricForge(ComponentTypes.FRAME_PART.getStack(), 400, 10, "blockGlass", "stone", ItemSlate.SlateType.BLANK.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.NODE_ROUTER), 400, 5, "stickWood", ItemSlate.SlateType.REINFORCED.getStack(), "gemLapis", "gemLapis"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE), 400, 5, "dustGlowstone", "dustRedstone", "blockGlass", "stone"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.OUTPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.INPUT_ROUTING_NODE), 400, 25, "dustGlowstone", "dustRedstone", "ingotGold", new ItemStack(RegistrarBloodMagicBlocks.ITEM_ROUTING_NODE)); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.MASTER_ROUTING_NODE), 400, 200, "blockIron", "gemDiamond", ItemSlate.SlateType.IMBUED.getStack()); - - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 0), 1200, 100, EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack(), EnumDemonWillType.DEFAULT.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 1), 1200, 100, EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack(), EnumDemonWillType.CORROSIVE.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 2), 1200, 100, EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack(), EnumDemonWillType.DESTRUCTIVE.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 3), 1200, 100, EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack(), EnumDemonWillType.VENGEFUL.getStack()); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTAL, 1, 4), 1200, 100, EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack(), EnumDemonWillType.STEADFAST.getStack()); - - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRUCIBLE), 400, 100, Items.CAULDRON, "stone", "gemLapis", "gemDiamond"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_PYLON), 400, 50, "blockIron", "stone", "gemLapis", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicBlocks.DEMON_CRYSTALLIZER), 500, 100, RegistrarBloodMagicBlocks.SOUL_FORGE, "stone", "gemLapis", "blockGlass"); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.DEMON_WILL_GAUGE), 400, 50, "ingotGold", "dustRedstone", "blockGlass", RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL); - registrar.addTartaricForge(new ItemStack(RegistrarBloodMagicItems.RITUAL_DISMANTLER), 500, 100, new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, 2), new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, 1, 2), new ItemStack(RegistrarBloodMagicItems.RITUAL_DIVINER), new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)); - } - - public static void registerAlchemyArrayRecipes(BloodMagicRecipeRegistrar registrar) { - registrar.addAlchemyArray(new ItemStack(Items.REDSTONE), ItemSlate.SlateType.BLANK.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_DIVINATION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/DivinationSigil.png")); - - registrar.addAlchemyArray(ComponentTypes.REAGENT_WATER.getStack(), ItemSlate.SlateType.BLANK.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_WATER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/WaterSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_LAVA.getStack(), ItemSlate.SlateType.BLANK.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_LAVA), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LavaSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_AIR.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_AIR), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/AirSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_FAST_MINER.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_FAST_MINER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_VOID.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_VOID), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/VoidSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_GROWTH.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_GREEN_GROVE), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/GrowthSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_AFFINITY.getStack(), ItemSlate.SlateType.IMBUED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_ELEMENTAL_AFFINITY), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/ElementalAffinitySigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SIGHT.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_SEER), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SightSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_HOLDING.getStack(), ItemSlate.SlateType.IMBUED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BLOOD_LIGHT.getStack(), ItemSlate.SlateType.IMBUED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/LightSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_MAGNETISM.getStack(), ItemSlate.SlateType.IMBUED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_MAGNETISM), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MagnetismSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SUPPRESSION.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_SUPPRESSION), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SuppressionSigil.png")); - registrar.addAlchemyArray(ComponentTypes.REAGENT_HASTE.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_HASTE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BRIDGE.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_PHANTOM_BRIDGE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_COMPRESSION.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_COMPRESSION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_SEVERANCE.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_ENDER_SEVERANCE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_TELEPOSITION.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_TELEPOSITION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_TRANSPOSITION.getStack(), ItemSlate.SlateType.DEMONIC.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_TRANSPOSITION), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_CLAW.getStack(), ItemSlate.SlateType.IMBUED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_CLAW), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_BOUNCE.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_BOUNCE), null); - registrar.addAlchemyArray(ComponentTypes.REAGENT_FROST.getStack(), ItemSlate.SlateType.REINFORCED.getStack(), new ItemStack(RegistrarBloodMagicItems.SIGIL_FROST), null); - - } - - public static void registerSacrificeCraftRecipes(BloodMagicRecipeRegistrar registrar) { - registrar.addSacrificeCraft(new ItemStack(RegistrarBloodMagicBlocks.TELEPOSER), 10, Items.REDSTONE); - } +// // SIX +// if (ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent) +// { +// registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicBlocks.DECORATIVE_BRICK, 1, 2)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_TRANSCENDENT), AltarTier.SIX.ordinal(), 200000, 100, 200); +// registrar.addBloodAltar(new OreIngredient("glowstone"), EnumRuneType.DAWN.getStack(), AltarTier.SIX.ordinal(), 200000, 100, 200); +// } + } } diff --git a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java index 135aaabd..02ad80a4 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/BMWorldSavedData.java @@ -1,58 +1,66 @@ -package WayofTime.bloodmagic.core.data; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.world.storage.WorldSavedData; +package wayoftime.bloodmagic.core.data; import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class BMWorldSavedData extends WorldSavedData { - public static final String ID = "BloodMagic-SoulNetworks"; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.world.storage.WorldSavedData; +import wayoftime.bloodmagic.util.helper.PlayerHelper; - private Map soulNetworks = new HashMap<>(); +public class BMWorldSavedData extends WorldSavedData +{ + public static final String ID = "BloodMagic-SoulNetworks"; - public BMWorldSavedData(String id) { - super(id); - } + private Map soulNetworks = new HashMap<>(); - public BMWorldSavedData() { - this(ID); - } + public BMWorldSavedData(String id) + { + super(id); + } - public SoulNetwork getNetwork(PlayerEntity player) { - return getNetwork(PlayerHelper.getUUIDFromPlayer(player)); - } + public BMWorldSavedData() + { + this(ID); + } - public SoulNetwork getNetwork(UUID playerId) { - if (!soulNetworks.containsKey(playerId)) - soulNetworks.put(playerId, SoulNetwork.newEmpty(playerId).setParent(this)); - return soulNetworks.get(playerId); - } + public SoulNetwork getNetwork(PlayerEntity player) + { + return getNetwork(PlayerHelper.getUUIDFromPlayer(player)); + } - @Override - public void read(CompoundNBT tagCompound) { - ListNBT networkData = tagCompound.getList("networkData", 10); + public SoulNetwork getNetwork(UUID playerId) + { + if (!soulNetworks.containsKey(playerId)) + soulNetworks.put(playerId, SoulNetwork.newEmpty(playerId).setParent(this)); + return soulNetworks.get(playerId); + } - for (int i = 0; i < networkData.size(); i++) { - CompoundNBT data = networkData.getCompound(i); - SoulNetwork network = SoulNetwork.fromNBT(data); - network.setParent(this); - soulNetworks.put(network.getPlayerId(), network); - } - } + @Override + public void read(CompoundNBT tagCompound) + { + ListNBT networkData = tagCompound.getList("networkData", 10); - @Override - public CompoundNBT write(CompoundNBT tagCompound) { - ListNBT networkData = new ListNBT(); - for (SoulNetwork soulNetwork : soulNetworks.values()) - networkData.add(soulNetwork.serializeNBT()); + for (int i = 0; i < networkData.size(); i++) + { + CompoundNBT data = networkData.getCompound(i); + SoulNetwork network = SoulNetwork.fromNBT(data); + network.setParent(this); + soulNetworks.put(network.getPlayerId(), network); + } + } - tagCompound.put("networkData", networkData); + @Override + public CompoundNBT write(CompoundNBT tagCompound) + { + ListNBT networkData = new ListNBT(); + for (SoulNetwork soulNetwork : soulNetworks.values()) + networkData.add(soulNetwork.serializeNBT()); - return tagCompound; - } -} + tagCompound.put("networkData", networkData); + + return tagCompound; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java index 3c2e9ed1..e6a4bbc8 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/Binding.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/Binding.java @@ -1,4 +1,8 @@ -package WayofTime.bloodmagic.core.data; +package wayoftime.bloodmagic.core.data; + +import java.util.UUID; + +import javax.annotation.Nullable; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -6,71 +10,80 @@ import net.minecraft.nbt.INBT; import net.minecraft.nbt.NBTUtil; import net.minecraftforge.common.util.INBTSerializable; -import javax.annotation.Nullable; -import java.util.UUID; +public class Binding implements INBTSerializable +{ + private UUID uuid; + private String name; -public class Binding implements INBTSerializable { + public Binding(UUID uuid, String name) + { + this.uuid = uuid; + this.name = name; + } - private UUID uuid; - private String name; + private Binding() + { + // No-op + } - public Binding(UUID uuid, String name) { - this.uuid = uuid; - this.name = name; - } + @Override + public CompoundNBT serializeNBT() + { + CompoundNBT tag = new CompoundNBT(); +// tag.put("id", NBTUtil.writeUniqueId(uuid)); + tag.put("id", NBTUtil.func_240626_a_(uuid)); + tag.putString("name", name); + return tag; + } - private Binding() { - // No-op - } + @Override + public void deserializeNBT(CompoundNBT nbt) + { + this.uuid = NBTUtil.readUniqueId(nbt.get("id")); + this.name = nbt.getString("name"); + } - @Override - public CompoundNBT serializeNBT() { - CompoundNBT tag = new CompoundNBT(); - tag.put("id", NBTUtil.writeUniqueId(uuid)); - tag.putString("name", name); - return tag; - } + public UUID getOwnerId() + { + return uuid; + } - @Override - public void deserializeNBT(CompoundNBT nbt) { - this.uuid = NBTUtil.readUniqueId(nbt.getCompound("id")); - this.name = nbt.getString("name"); - } + public Binding setOwnerId(UUID uuid) + { + this.uuid = uuid; + return this; + } - public UUID getOwnerId() { - return uuid; - } + public String getOwnerName() + { + return name; + } - public Binding setOwnerId(UUID uuid) { - this.uuid = uuid; - return this; - } + public Binding setOwnerName(String name) + { + this.name = name; + return this; + } - public String getOwnerName() { - return name; - } + @Nullable + public static Binding fromStack(ItemStack stack) + { + if (!stack.hasTag()) // Definitely hasn't been bound yet. + return null; - public Binding setOwnerName(String name) { - this.name = name; - return this; - } + INBT bindingTag = stack.getTag().get("binding"); + if (bindingTag == null || bindingTag.getId() != 10) // Make sure it's both a tag compound and that it has actual + // data. + return null; - @Nullable - public static Binding fromStack(ItemStack stack) { - if (!stack.hasTag()) // Definitely hasn't been bound yet. - return null; + Binding binding = new Binding(); + binding.deserializeNBT((CompoundNBT) bindingTag); + return binding; + } - INBT bindingTag = stack.getTag().get("binding"); - if (bindingTag == null || bindingTag.getId() != 10) // Make sure it's both a tag compound and that it has actual data. - return null; - - Binding binding = new Binding(); - binding.deserializeNBT((CompoundNBT) bindingTag); - return binding; - } - - @Override - public String toString() { - return "Binding{" + "uuid=" + uuid + ", name='" + name + '\'' + '}'; - } -} + @Override + public String toString() + { + return "Binding{" + "uuid=" + uuid + ", name='" + name + '\'' + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java index 30ec5dea..aa63bc1e 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulNetwork.java @@ -1,255 +1,293 @@ -package WayofTime.bloodmagic.core.data; +package wayoftime.bloodmagic.core.data; + +import java.util.List; +import java.util.Queue; +import java.util.UUID; + +import javax.annotation.Nullable; -import WayofTime.bloodmagic.event.SoulNetworkEvent; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.BooleanResult; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.helper.PlayerHelper; import com.google.common.collect.EvictingQueue; import com.google.common.collect.ImmutableList; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.INBTSerializable; +import wayoftime.bloodmagic.event.SoulNetworkEvent; +import wayoftime.bloodmagic.util.BMLog; +import wayoftime.bloodmagic.util.BooleanResult; +import wayoftime.bloodmagic.util.DamageSourceBloodMagic; +import wayoftime.bloodmagic.util.helper.PlayerHelper; -import javax.annotation.Nullable; -import java.util.List; -import java.util.Queue; -import java.util.UUID; +public class SoulNetwork implements INBTSerializable +{ -public class SoulNetwork implements INBTSerializable { + private final Queue ticketHistory; + private BMWorldSavedData parent; + private PlayerEntity cachedPlayer; + private UUID playerId; + private int currentEssence; + private int orbTier; - private final Queue ticketHistory; - private BMWorldSavedData parent; - private PlayerEntity cachedPlayer; - private UUID playerId; - private int currentEssence; - private int orbTier; + private SoulNetwork() + { + // No-op - For creation via NBT only + ticketHistory = EvictingQueue.create(16); + } - private SoulNetwork() { - // No-op - For creation via NBT only - ticketHistory = EvictingQueue.create(16); - } + public void clear() + { + ticketHistory.clear(); + } - public void clear() { - ticketHistory.clear(); - } + public int add(SoulTicket ticket, int maximum) + { + SoulNetworkEvent.Fill event = new SoulNetworkEvent.Fill(this, ticket, maximum); + if (MinecraftForge.EVENT_BUS.post(event)) + return 0; - public int add(SoulTicket ticket, int maximum) { - SoulNetworkEvent.Fill event = new SoulNetworkEvent.Fill(this, ticket, maximum); - if (MinecraftForge.EVENT_BUS.post(event)) - return 0; + int currEss = getCurrentEssence(); - int currEss = getCurrentEssence(); + if (currEss >= event.getMaximum()) + return 0; - if (currEss >= event.getMaximum()) - return 0; + int newEss = Math.min(event.getMaximum(), currEss + event.getTicket().getAmount()); + setCurrentEssence(newEss); - int newEss = Math.min(event.getMaximum(), currEss + event.getTicket().getAmount()); - setCurrentEssence(newEss); + if (ticketHistory.contains(ticket)) + ticketHistory.remove(ticket); // "Pops" the existing ticket to the top of the queue - if (ticketHistory.contains(ticket)) - ticketHistory.remove(ticket); // "Pops" the existing ticket to the top of the queue + ticketHistory.add(ticket); - ticketHistory.add(ticket); + return newEss - currEss; + } - return newEss - currEss; - } + /** + * @deprecated For future proofing, use {@link #add(SoulTicket, int)} instead. + */ + @Deprecated + public int add(int toAdd, int maximum) + { + return add(new SoulTicket(toAdd), maximum); + } - /** - * @deprecated For future proofing, use {@link #add(SoulTicket, int)} instead. - */ - @Deprecated - public int add(int toAdd, int maximum) { - return add(new SoulTicket(toAdd), maximum); - } + /** + * @deprecated Use {@link #add(SoulTicket, int)} instead. + */ + @Deprecated + public int addLifeEssence(int toAdd, int maximum) + { + return add(toAdd, maximum); + } - /** - * @deprecated Use {@link #add(SoulTicket, int)} instead. - */ - @Deprecated - public int addLifeEssence(int toAdd, int maximum) { - return add(toAdd, maximum); - } + public int syphon(SoulTicket ticket) + { + return syphon(ticket, false); + } - public int syphon(SoulTicket ticket) { - return syphon(ticket, false); - } + public int syphon(SoulTicket ticket, boolean skipEvent) + { + SoulNetworkEvent.Syphon event = new SoulNetworkEvent.Syphon(this, ticket); + if (!skipEvent && MinecraftForge.EVENT_BUS.post(event)) + return 0; - public int syphon(SoulTicket ticket, boolean skipEvent) { - SoulNetworkEvent.Syphon event = new SoulNetworkEvent.Syphon(this, ticket); - if (!skipEvent && MinecraftForge.EVENT_BUS.post(event)) - return 0; + int syphon = event.getTicket().getAmount(); + if (getCurrentEssence() >= syphon) + { + setCurrentEssence(getCurrentEssence() - syphon); + if (ticketHistory.contains(ticket)) + ticketHistory.remove(ticket); - int syphon = event.getTicket().getAmount(); - if (getCurrentEssence() >= syphon) { - setCurrentEssence(getCurrentEssence() - syphon); - if (ticketHistory.contains(ticket)) - ticketHistory.remove(ticket); + ticketHistory.add(ticket); + return syphon; + } - ticketHistory.add(ticket); - return syphon; - } + return 0; + } - return 0; - } + /** + * @deprecated For future proofing, use {@link #syphon(SoulTicket)} instead. + */ + @Deprecated + public int syphon(int amount) + { + return syphon(new SoulTicket(amount)); + } - /** - * @deprecated For future proofing, use {@link #syphon(SoulTicket)} instead. - */ - @Deprecated - public int syphon(int amount) { - return syphon(new SoulTicket(amount)); - } + public BooleanResult syphonAndDamage(PlayerEntity user, SoulTicket ticket) + { + if (user.getEntityWorld().isRemote) + return BooleanResult.newResult(false, 0); - public BooleanResult syphonAndDamage(PlayerEntity user, SoulTicket ticket) { - if (user.getEntityWorld().isRemote) - return BooleanResult.newResult(false, 0); + SoulNetworkEvent.Syphon.User event = new SoulNetworkEvent.Syphon.User(this, ticket, user); - SoulNetworkEvent.Syphon.User event = new SoulNetworkEvent.Syphon.User(this, ticket, user); + if (MinecraftForge.EVENT_BUS.post(event)) + return BooleanResult.newResult(false, 0); - if (MinecraftForge.EVENT_BUS.post(event)) - return BooleanResult.newResult(false, 0); + int drainAmount = syphon(event.getTicket(), true); - int drainAmount = syphon(event.getTicket(), true); + if (drainAmount <= 0 || event.shouldDamage()) + hurtPlayer(user, event.getTicket().getAmount()); - if (drainAmount <= 0 || event.shouldDamage()) - hurtPlayer(user, event.getTicket().getAmount()); + if (ticketHistory.contains(ticket)) + ticketHistory.remove(ticket); - if (ticketHistory.contains(ticket)) - ticketHistory.remove(ticket); + ticketHistory.add(ticket); - ticketHistory.add(ticket); + return BooleanResult.newResult(true, event.getTicket().getAmount()); + } - return BooleanResult.newResult(true, event.getTicket().getAmount()); - } + /** + * @deprecated Use {@link #syphonAndDamage(PlayerEntity, SoulTicket)} instead. + */ + @Deprecated + public boolean syphonAndDamage(PlayerEntity user, int amount) + { + return syphonAndDamage(user, new SoulTicket(amount)).isSuccess(); + } - /** - * @deprecated Use {@link #syphonAndDamage(PlayerEntity, SoulTicket)} instead. - */ - @Deprecated - public boolean syphonAndDamage(PlayerEntity user, int amount) { - return syphonAndDamage(user, new SoulTicket(amount)).isSuccess(); - } + public void causeNausea() + { + if (getPlayer() != null) + getPlayer().addPotionEffect(new EffectInstance(Effects.NAUSEA, 99)); + } - public void causeNausea() { - if (getPlayer() != null) - getPlayer().addPotionEffect(new EffectInstance(Effects.NAUSEA, 99)); - } + /** + * @deprecated - Please use {@link #causeNausea()} + */ + @Deprecated + public void causeNauseaToPlayer() + { + causeNausea(); + } - /** - * @deprecated - Please use {@link #causeNausea()} - */ - @Deprecated - public void causeNauseaToPlayer() { - causeNausea(); - } + public void hurtPlayer(PlayerEntity user, float syphon) + { + if (user != null) + { + if (syphon < 100 && syphon > 0) + { + if (!user.isCreative()) + { + user.hurtResistantTime = 0; + user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); + } - public void hurtPlayer(PlayerEntity user, float syphon) { - if (user != null) { - if (syphon < 100 && syphon > 0) { - if (!user.isCreative()) { - user.hurtResistantTime = 0; - user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); - } + } else if (syphon >= 100) + { + if (!user.isCreative()) + { + for (int i = 0; i < ((syphon + 99) / 100); i++) + { + user.hurtResistantTime = 0; + user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); + } + } + } + } + } - } else if (syphon >= 100) { - if (!user.isCreative()) { - for (int i = 0; i < ((syphon + 99) / 100); i++) { - user.hurtResistantTime = 0; - user.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); - } - } - } - } - } + private void markDirty() + { + if (getParent() != null) + getParent().markDirty(); + else + BMLog.DEFAULT.error("A SoulNetwork was created, but a parent was not set to allow saving."); + } - private void markDirty() { - if (getParent() != null) - getParent().markDirty(); - else - BMLog.DEFAULT.error("A SoulNetwork was created, but a parent was not set to allow saving."); - } + @Nullable + public PlayerEntity getPlayer() + { + if (cachedPlayer == null) + cachedPlayer = PlayerHelper.getPlayerFromUUID(playerId); - @Nullable - public PlayerEntity getPlayer() { - if (cachedPlayer == null) - cachedPlayer = PlayerHelper.getPlayerFromUUID(playerId); + return cachedPlayer; + } - return cachedPlayer; - } + public BMWorldSavedData getParent() + { + return parent; + } - public BMWorldSavedData getParent() { - return parent; - } + public SoulNetwork setParent(BMWorldSavedData parent) + { + this.parent = parent; + markDirty(); + return this; + } - public SoulNetwork setParent(BMWorldSavedData parent) { - this.parent = parent; - markDirty(); - return this; - } + public PlayerEntity getCachedPlayer() + { + return cachedPlayer; + } - public PlayerEntity getCachedPlayer() { - return cachedPlayer; - } + public UUID getPlayerId() + { + return playerId; + } - public UUID getPlayerId() { - return playerId; - } + public int getCurrentEssence() + { + return currentEssence; + } - public int getCurrentEssence() { - return currentEssence; - } + public SoulNetwork setCurrentEssence(int currentEssence) + { + this.currentEssence = currentEssence; + markDirty(); + return this; + } - public SoulNetwork setCurrentEssence(int currentEssence) { - this.currentEssence = currentEssence; - markDirty(); - return this; - } + public int getOrbTier() + { + return orbTier; + } - public int getOrbTier() { - return orbTier; - } + public SoulNetwork setOrbTier(int orbTier) + { + this.orbTier = orbTier; + markDirty(); + return this; + } - public SoulNetwork setOrbTier(int orbTier) { - this.orbTier = orbTier; - markDirty(); - return this; - } + public List getTicketHistory() + { + return ImmutableList.copyOf(ticketHistory); + } - public List getTicketHistory() { - return ImmutableList.copyOf(ticketHistory); - } + // INBTSerializable - // INBTSerializable + @Override + public CompoundNBT serializeNBT() + { + CompoundNBT tagCompound = new CompoundNBT(); + tagCompound.putString("playerId", getPlayerId().toString()); + tagCompound.putInt("currentEssence", getCurrentEssence()); + tagCompound.putInt("orbTier", getOrbTier()); + return tagCompound; + } - @Override - public CompoundNBT serializeNBT() { - CompoundNBT tagCompound = new CompoundNBT(); - tagCompound.putString("playerId", getPlayerId().toString()); - tagCompound.putInt("currentEssence", getCurrentEssence()); - tagCompound.putInt("orbTier", getOrbTier()); - return tagCompound; - } + @Override + public void deserializeNBT(CompoundNBT nbt) + { + this.playerId = UUID.fromString(nbt.getString("playerId")); + this.currentEssence = nbt.getInt("currentEssence"); + this.orbTier = nbt.getInt("orbTier"); + } - @Override - public void deserializeNBT(CompoundNBT nbt) { - this.playerId = UUID.fromString(nbt.getString("playerId")); - this.currentEssence = nbt.getInt("currentEssence"); - this.orbTier = nbt.getInt("orbTier"); - } + public static SoulNetwork fromNBT(CompoundNBT tagCompound) + { + SoulNetwork soulNetwork = new SoulNetwork(); + soulNetwork.deserializeNBT(tagCompound); + return soulNetwork; + } - public static SoulNetwork fromNBT(CompoundNBT tagCompound) { - SoulNetwork soulNetwork = new SoulNetwork(); - soulNetwork.deserializeNBT(tagCompound); - return soulNetwork; - } - - public static SoulNetwork newEmpty(UUID uuid) { - SoulNetwork network = new SoulNetwork(); - network.playerId = uuid; - return network; - } -} + public static SoulNetwork newEmpty(UUID uuid) + { + SoulNetwork network = new SoulNetwork(); + network.playerId = uuid; + return network; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java index 412048d9..e3cc6325 100644 --- a/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java +++ b/src/main/java/WayofTime/bloodmagic/core/data/SoulTicket.java @@ -1,4 +1,4 @@ -package WayofTime.bloodmagic.core.data; +package wayoftime.bloodmagic.core.data; import net.minecraft.command.ICommandSource; import net.minecraft.entity.Entity; @@ -8,78 +8,97 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.World; -public class SoulTicket { +public class SoulTicket +{ - private static final ITextComponent EMPTY = new StringTextComponent(""); + private static final ITextComponent EMPTY = new StringTextComponent(""); - private final ITextComponent description; - private final int amount; + private final ITextComponent description; + private final int amount; - public SoulTicket(ITextComponent description, int amount) { - this.description = description; - this.amount = amount; - } + public SoulTicket(ITextComponent description, int amount) + { + this.description = description; + this.amount = amount; + } - public SoulTicket(int amount) { - this(EMPTY, amount); - } + public SoulTicket(int amount) + { + this(EMPTY, amount); + } - public boolean isSyphon() { - return amount < 0; - } + public boolean isSyphon() + { + return amount < 0; + } - public ITextComponent getDescription() { - return description; - } + public ITextComponent getDescription() + { + return description; + } - public int getAmount() { - return amount; - } + public int getAmount() + { + return amount; + } - /** - * @return A description in the format block|dimensionID|pos - */ - public static SoulTicket block(World world, BlockPos pos, int amount) { - return new SoulTicket(new StringTextComponent("block|" + world.dimension.getDimension() + "|" + pos.toLong()), amount); - } + /** + * @return A description in the format block|dimensionID|pos + */ + public static SoulTicket block(World world, BlockPos pos, int amount) + { + // func_234923_W_() = getDimension + return new SoulTicket(new StringTextComponent("block|" + world.getDimensionKey().getRegistryName() + "|" + + pos.toLong()), amount); + } - /** - * @return A description in the format item|item registry name|dimensionID|entityName|entityPos - */ - public static SoulTicket item(ItemStack itemStack, World world, Entity entity, int amount) { - return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.dimension.getDimension() + "|" + entity.getCachedUniqueIdString()), amount); - } + /** + * @return A description in the format item|item registry + * name|dimensionID|entityName|entityPos + */ + public static SoulTicket item(ItemStack itemStack, World world, Entity entity, int amount) + { + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + + world.getDimensionKey().getRegistryName() + "|" + entity.getCachedUniqueIdString()), amount); + } - /** - * @return A description in the format item|item registry name|dimensionID|pos - */ - public static SoulTicket item(ItemStack itemStack, World world, BlockPos pos, int amount) { - return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + world.dimension.getDimension() + "|" + pos.toLong()), amount); - } + /** + * @return A description in the format item|item registry name|dimensionID|pos + */ + public static SoulTicket item(ItemStack itemStack, World world, BlockPos pos, int amount) + { + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName() + "|" + + world.getDimensionKey().getRegistryName() + "|" + pos.toLong()), amount); + } - /** - * @return A description in the format item|item registry name|dimensionID - */ - public static SoulTicket item(ItemStack itemStack, int amount) { - return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName()), amount); - } + /** + * @return A description in the format item|item registry name|dimensionID + */ + public static SoulTicket item(ItemStack itemStack, int amount) + { + return new SoulTicket(new StringTextComponent("item|" + itemStack.getItem().getRegistryName()), amount); + } - public static SoulTicket command(ICommandSource sender, String command, int amount) { - return new SoulTicket(new StringTextComponent("command|" + command + "|" + sender.toString()), amount); - } + public static SoulTicket command(ICommandSource sender, String command, int amount) + { + return new SoulTicket(new StringTextComponent("command|" + command + "|" + sender.toString()), amount); + } - // TODO maybe make it check the amount?? - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o instanceof SoulTicket) - return ((SoulTicket) o).getDescription().equals(description); + // TODO maybe make it check the amount?? + @Override + public boolean equals(Object o) + { + if (this == o) + return true; + if (o instanceof SoulTicket) + return ((SoulTicket) o).getDescription().equals(description); - return false; - } + return false; + } - @Override - public int hashCode() { - return description.hashCode(); - } -} + @Override + public int hashCode() + { + return description.hashCode(); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java index aab60d48..35962b33 100644 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrb.java @@ -1,82 +1,112 @@ -package WayofTime.bloodmagic.core.recipe; +package wayoftime.bloodmagic.core.recipe; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Stream; + +import com.google.gson.JsonObject; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import it.unimi.dsi.fastutil.ints.IntArrayList; -import it.unimi.dsi.fastutil.ints.IntComparators; -import it.unimi.dsi.fastutil.ints.IntList; -import net.minecraft.item.crafting.RecipeItemHelper; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.crafting.IIngredientSerializer; +import net.minecraftforge.common.crafting.VanillaIngredientSerializer; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.core.registry.OrbRegistry; +import wayoftime.bloodmagic.orb.BloodOrb; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; +public class IngredientBloodOrb extends Ingredient +{ -public class IngredientBloodOrb extends Ingredient { +// private final BloodOrb orb; +// private NonNullList orbs; +// private IntList itemIds = null; +// private ItemStack[] items; - private final BloodOrb orb; - private NonNullList orbs; - private IntList itemIds = null; - private ItemStack[] items; + public static final ResourceLocation NAME = new ResourceLocation(BloodMagic.MODID, "bloodorb"); - public IngredientBloodOrb(BloodOrb orb) { - super(); + public final int orbTier; - this.orb = orb; + public static IngredientBloodOrb fromTier(int orbTier) + { + return new IngredientBloodOrb(orbTier); + } - List orbGet = OrbRegistry.getOrbsDownToTier(orb.getTier()); - orbs = NonNullList.withSize(orbGet.size(), ItemStack.EMPTY); + public static IngredientBloodOrb fromOrb(BloodOrb orb) + { + return new IngredientBloodOrb(orb.getTier()); + } - for (int i = 0; i < orbGet.size(); i++) - orbs.set(i, orbGet.get(i)); - } + protected IngredientBloodOrb(int orbTier) + { + super(Stream.of(new ItemList(orbTier))); + this.orbTier = orbTier; + } - @Override - @Nonnull - public ItemStack[] getMatchingStacks() { - if (items == null) - items = orbs.toArray(new ItemStack[0]); - return items; - } + public net.minecraftforge.common.crafting.IIngredientSerializer getSerializer() + { + return Serializer.INSTANCE; + } - @Override - @Nonnull - @SideOnly(Side.CLIENT) - public IntList getValidItemStacksPacked() { - if (this.itemIds == null || itemIds.size() != orbs.size()) { - this.itemIds = new IntArrayList(orbs.size()); + private static class ItemList implements IItemList + { + private final int orbTier; - for (ItemStack itemstack : orbs) - this.itemIds.add(RecipeItemHelper.pack(itemstack)); + public ItemList(int orbTier) + { + this.orbTier = orbTier; + } - this.itemIds.sort(IntComparators.NATURAL_COMPARATOR); - } + @Override + public Collection getStacks() + { +// System.out.println("BING BONG"); + List orbGet = OrbRegistry.getOrbsDownToTier(orbTier); +// List orbGet = new ArrayList(); +// orbGet.add(new ItemStack(Items.DIAMOND)); +// orbs = NonNullList.withSize(orbGet.size(), ItemStack.EMPTY); +// +// for (int i = 0; i < orbGet.size(); i++) +// orbs.set(i, orbGet.get(i)); + return orbGet; + } - return this.itemIds; - } + @Override + public JsonObject serialize() + { + JsonObject object = new JsonObject(); + object.addProperty("type", NAME.toString()); + object.addProperty("orb_tier", orbTier); + return object; + } + } - @Override - public boolean apply(@Nullable ItemStack input) { - if (input == null || input.isEmpty()) - return false; + public static class Serializer extends VanillaIngredientSerializer + { + public static final IIngredientSerializer INSTANCE = new Serializer(); - if (!input.hasTagCompound()) - return false; + @Override + public Ingredient parse(JsonObject json) + { + System.out.println("Parsing Blood Orb"); + return new IngredientBloodOrb(JSONUtils.getInt(json, "orb_tier")); + } + } - if (!(input.getItem() instanceof IBloodOrb)) - return false; +// +// @Override +// public boolean test(@Nullable ItemStack input) +// { +// System.out.println("Testing"); +// if (input == null || input.isEmpty()) +// return false; +// +// if (!(input.getItem() instanceof IBloodOrb)) +// return false; +// +// BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); +// return orb != null && orb.getTier() >= this.orbTier; +// } - BloodOrb orb = ((IBloodOrb) input.getItem()).getOrb(input); - return orb != null && orb.getTier() >= this.orb.getTier(); - } - - @Override - protected void invalidate() { - this.itemIds = null; - } } diff --git a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java b/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java deleted file mode 100644 index 4c6ab978..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/recipe/IngredientBloodOrbFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.core.recipe; - -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import com.google.gson.JsonObject; -import net.minecraft.item.crafting.Ingredient; -import net.minecraft.util.JSONUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.common.crafting.IIngredientFactory; -import net.minecraftforge.common.crafting.JsonContext; - -import javax.annotation.Nonnull; - -public class IngredientBloodOrbFactory implements IIngredientFactory { - - @Nonnull - @Override - public Ingredient parse(JsonContext context, JsonObject json) { - ResourceLocation orb = new ResourceLocation(JSONUtils.getString(json, "orb")); - return new IngredientBloodOrb(RegistrarBloodMagic.BLOOD_ORBS.getValue(orb)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java deleted file mode 100644 index bc28b170..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyArrayRecipeRegistry.java +++ /dev/null @@ -1,350 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectCrafting; -import WayofTime.bloodmagic.alchemyArray.AlchemyCircleRenderer; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.oredict.OreDictionary; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - -public class AlchemyArrayRecipeRegistry { - public static final AlchemyCircleRenderer DEFAULT_RENDERER = new AlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BaseArray.png")); - - private static BiMap, AlchemyArrayRecipe> recipes = HashBiMap.create(); - private static HashMap effectMap = new HashMap<>(); - - /** - * General case for creating an AlchemyArrayEffect for a given input. - * - * @param input - Input item(s) that is used to change the Alchemy Circle into the - * circle that you are making - * @param catalystStack - Catalyst item that, when right-clicked onto the array, will - * cause an effect - * @param arrayEffect - The effect that will be activated once the array is activated - * @param circleRenderer - Circle rendered when the array is passive - can be substituted - * for a special renderer - */ - public static void registerRecipe(List input, @Nullable ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { - effectMap.put(arrayEffect.getKey(), arrayEffect); - - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (arrayRecipe.doesInputMatchRecipe(input)) { - AlchemyArrayEffect eff = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (eff != null) { - return; // Recipe already exists! - } else { - arrayRecipe.catalystMap.put(ItemStackWrapper.getHolder(catalystStack), arrayEffect); - if (circleRenderer != null) { - if (arrayRecipe.defaultCircleRenderer == null) { - arrayRecipe.defaultCircleRenderer = circleRenderer; - } else { - arrayRecipe.circleMap.put(ItemStackWrapper.getHolder(catalystStack), circleRenderer); - } - } - return; - } - } - } - - recipes.put(input, new AlchemyArrayRecipe(input, catalystStack, arrayEffect, circleRenderer == null ? DEFAULT_RENDERER : circleRenderer)); - } - - public static AlchemyArrayEffect getAlchemyArrayEffect(String key) { - return effectMap.get(key); - } - - /** - * @param key - * @return an array of two ItemStacks - first index is the input stack, - * second is the catalyst stack. Returns {null, null} if no recipe - * is valid. - */ - public static ItemStack[] getRecipeForArrayEffect(String key) { - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe recipe = entry.getValue(); - if (recipe != null && entry.getKey().size() > 0) { - for (Entry effectEntry : recipe.catalystMap.entrySet()) { - if (effectEntry.getValue() != null && effectEntry.getValue().key.equals(key)) { - return new ItemStack[]{entry.getKey().get(0), effectEntry.getKey().toStack()}; - } - } - } - } - - return new ItemStack[]{null, null}; - } - - /** - * @param stack of the recipe - * @return an array of two ItemStacks - first index is the input stack, - * second is the catalyst stack. Returns {null, null} if no recipe - * is valid. - */ - public static ItemStack[] getRecipeForOutputStack(ItemStack stack) { - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe recipe = entry.getValue(); - if (recipe != null && entry.getKey().size() > 0) { - for (Entry effectEntry : recipe.catalystMap.entrySet()) { - if (effectEntry.getValue() instanceof AlchemyArrayEffectCrafting) { - AlchemyArrayEffectCrafting craftingEffect = (AlchemyArrayEffectCrafting) effectEntry.getValue(); - ItemStack resultStack = craftingEffect.outputStack; - if (!resultStack.isEmpty()) { - if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { - return new ItemStack[]{entry.getKey().get(0), effectEntry.getKey().toStack()}; - } - } - } - } - } - } - - return new ItemStack[]{null, null}; - } - - public static void registerCraftingRecipe(ItemStack input, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) { - registerRecipe(input, catalystStack, new AlchemyArrayEffectCrafting(outputStack), arrayResource); - } - - public static void registerCraftingRecipe(List inputStacks, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) { - registerRecipe(inputStacks, catalystStack, new AlchemyArrayEffectCrafting(outputStack), arrayResource); - } - - public static void registerCraftingRecipe(String inputOreDict, ItemStack catalystStack, ItemStack outputStack, ResourceLocation arrayResource) { - registerRecipe(OreDictionary.doesOreNameExist(inputOreDict) && OreDictionary.getOres(inputOreDict).size() > 0 ? OreDictionary.getOres(inputOreDict) : Collections.emptyList(), catalystStack, new AlchemyArrayEffectCrafting(outputStack), arrayResource); - } - - public static void registerCraftingRecipe(ItemStack input, ItemStack catalystStack, ItemStack outputStack) { - registerRecipe(input, catalystStack, new AlchemyArrayEffectCrafting(outputStack)); - } - - public static void registerCraftingRecipe(List inputStacks, ItemStack catalystStack, ItemStack outputStack) { - registerRecipe(inputStacks, catalystStack, new AlchemyArrayEffectCrafting(outputStack)); - } - - public static void registerCraftingRecipe(String inputOreDict, ItemStack catalystStack, ItemStack outputStack) { - registerRecipe(OreDictionary.doesOreNameExist(inputOreDict) && OreDictionary.getOres(inputOreDict).size() > 0 ? OreDictionary.getOres(inputOreDict) : Collections.emptyList(), catalystStack, new AlchemyArrayEffectCrafting(outputStack)); - } - - public static void registerRecipe(ItemStack inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { - AlchemyCircleRenderer circleRenderer = arrayResource == null ? DEFAULT_RENDERER : new AlchemyCircleRenderer(arrayResource); - registerRecipe(Collections.singletonList(inputStacks), catalystStack, arrayEffect, circleRenderer); - } - - public static void registerRecipe(ItemStack inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { - registerRecipe(Collections.singletonList(inputStacks), catalystStack, arrayEffect, circleRenderer); - } - - public static void registerRecipe(List inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { - AlchemyCircleRenderer circleRenderer = arrayResource == null ? DEFAULT_RENDERER : new AlchemyCircleRenderer(arrayResource); - registerRecipe(inputStacks, catalystStack, arrayEffect, circleRenderer); - } - - public static void registerRecipe(String inputOreDict, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, ResourceLocation arrayResource) { - AlchemyCircleRenderer circleRenderer = arrayResource == null ? DEFAULT_RENDERER : new AlchemyCircleRenderer(arrayResource); - registerRecipe(OreDictionary.doesOreNameExist(inputOreDict) && OreDictionary.getOres(inputOreDict).size() > 0 ? OreDictionary.getOres(inputOreDict) : Collections.emptyList(), catalystStack, arrayEffect, circleRenderer); - } - - public static void registerRecipe(ItemStack input, ItemStack catalystStack, AlchemyArrayEffect arrayEffect) { - registerRecipe(Collections.singletonList(input), catalystStack, arrayEffect, (AlchemyCircleRenderer) null); - } - - public static void registerRecipe(List inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect) { - registerRecipe(inputStacks, catalystStack, arrayEffect, (AlchemyCircleRenderer) null); - } - - public static void registerRecipe(String inputOreDict, ItemStack catalystStack, AlchemyArrayEffect arrayEffect) { - registerRecipe(OreDictionary.doesOreNameExist(inputOreDict) && OreDictionary.getOres(inputOreDict).size() > 0 ? OreDictionary.getOres(inputOreDict) : Collections.emptyList(), catalystStack, arrayEffect, (AlchemyCircleRenderer) null); - } - - public static void replaceAlchemyCircle(List input, AlchemyCircleRenderer circleRenderer) { - if (circleRenderer == null) - return; - - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (arrayRecipe.doesInputMatchRecipe(input)) - arrayRecipe.defaultCircleRenderer = circleRenderer; - } - } - - public static AlchemyArrayRecipe getRecipeForInput(List input) { - return recipes.get(input); - } - - public static AlchemyArrayEffect getAlchemyArrayEffect(List input, @Nullable ItemStack catalystStack) { - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (input.size() == 1 && arrayRecipe.getInput().size() == 1) { - if (ItemStack.areItemsEqual(input.get(0), arrayRecipe.input.get(0))) { - AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (effect != null) { - return effect.getNewCopy(); - } else { - return null; - } - } - } else { - if (input.equals(arrayRecipe.getInput())) { - AlchemyArrayEffect effect = arrayRecipe.getAlchemyArrayEffectForCatalyst(catalystStack); - if (effect != null) { - return effect.getNewCopy(); - } else { - return null; - } - } - } - } - - return null; - } - - public static AlchemyArrayEffect getAlchemyArrayEffect(ItemStack input, @Nullable ItemStack catalystStack) { - return getAlchemyArrayEffect(Collections.singletonList(input), catalystStack); - } - - public static AlchemyCircleRenderer getAlchemyCircleRenderer(List input, @Nullable ItemStack catalystStack) { - for (Entry, AlchemyArrayRecipe> entry : recipes.entrySet()) { - AlchemyArrayRecipe arrayRecipe = entry.getValue(); - if (arrayRecipe.doesInputMatchRecipe(input)) { - return arrayRecipe.getAlchemyArrayRendererForCatalyst(catalystStack); - } - } - - return DEFAULT_RENDERER; - } - - public static AlchemyCircleRenderer getAlchemyCircleRenderer(ItemStack itemStack, @Nullable ItemStack catalystStack) { - return getAlchemyCircleRenderer(Collections.singletonList(itemStack), catalystStack); - } - - public static BiMap, AlchemyArrayRecipe> getRecipes() { - return HashBiMap.create(recipes); - } - - public static class AlchemyArrayRecipe { - public final List input; - public final BiMap catalystMap = HashBiMap.create(); - public final BiMap circleMap = HashBiMap.create(); - public AlchemyCircleRenderer defaultCircleRenderer; - - private AlchemyArrayRecipe(List input, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer, boolean useless) { - this.input = input; - - catalystMap.put(ItemStackWrapper.getHolder(catalystStack), arrayEffect); - - this.defaultCircleRenderer = circleRenderer; - } - - public AlchemyArrayRecipe(ItemStack inputStack, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { - this(Collections.singletonList(inputStack), catalystStack, arrayEffect, circleRenderer, false); - } - - public AlchemyArrayRecipe(String inputOreDict, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { - this(OreDictionary.doesOreNameExist(inputOreDict) && OreDictionary.getOres(inputOreDict).size() > 0 ? OreDictionary.getOres(inputOreDict) : Collections.emptyList(), catalystStack, arrayEffect, circleRenderer, false); - } - - public AlchemyArrayRecipe(List inputStacks, ItemStack catalystStack, AlchemyArrayEffect arrayEffect, AlchemyCircleRenderer circleRenderer) { - this(inputStacks, catalystStack, arrayEffect, circleRenderer, false); - } - - /** - * Compares the inputed list of ItemStacks to see if it matches with the - * recipe's list. - * - * @param comparedList - The list to compare with - * @return - True if the ItemStack(s) is a compatible item - */ - public boolean doesInputMatchRecipe(List comparedList) { - return !(comparedList == null || this.input == null) && (this.input.size() == 1 && comparedList.size() == 1 ? this.input.get(0).isItemEqual(comparedList.get(0)) : this.input.equals(comparedList)); - } - - /** - * Gets the actual AlchemyArrayEffect for the given catalyst. - * - * @param comparedStack The catalyst that is being checked - * @return - The effect - */ - public AlchemyArrayEffect getAlchemyArrayEffectForCatalyst(@Nullable ItemStack comparedStack) { - for (Entry entry : catalystMap.entrySet()) { - ItemStack catalystStack = entry.getKey().toStack(); - - if (comparedStack == null && catalystStack == null) - return entry.getValue(); - - if (comparedStack == null || catalystStack == null) - continue; - - if (catalystStack.isItemEqual(comparedStack)) - return entry.getValue(); - } - - return null; - } - - public AlchemyCircleRenderer getAlchemyArrayRendererForCatalyst(@Nullable ItemStack comparedStack) { - for (Entry entry : circleMap.entrySet()) { - ItemStack catalystStack = entry.getKey().toStack(); - - if (comparedStack == null && catalystStack == null) - return entry.getValue(); - - if (comparedStack == null || catalystStack == null) - continue; - - if (catalystStack.isItemEqual(comparedStack)) - return entry.getValue(); - } - - return defaultCircleRenderer; - } - - public AlchemyCircleRenderer getDefaultCircleRenderer() { - return defaultCircleRenderer; - } - - public List getInput() { - return input; - } - - public BiMap getCatalystMap() { - return catalystMap; - } - - public BiMap getCircleMap() { - return circleMap; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof AlchemyArrayRecipe)) return false; - - AlchemyArrayRecipe that = (AlchemyArrayRecipe) o; - - if (defaultCircleRenderer != null ? !defaultCircleRenderer.equals(that.defaultCircleRenderer) : that.defaultCircleRenderer != null) - return false; - if (input != null ? !input.equals(that.input) : that.input != null) return false; - if (catalystMap != null ? !catalystMap.equals(that.catalystMap) : that.catalystMap != null) return false; - return circleMap != null ? circleMap.equals(that.circleMap) : that.circleMap == null; - } - - @Override - public int hashCode() { - int result = defaultCircleRenderer != null ? defaultCircleRenderer.hashCode() : 0; - result = 31 * result + (input != null ? input.hashCode() : 0); - result = 31 * result + (catalystMap != null ? catalystMap.hashCode() : 0); - result = 31 * result + (circleMap != null ? circleMap.hashCode() : 0); - return result; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java deleted file mode 100644 index d27e99c1..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AlchemyTableRecipeRegistry.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class AlchemyTableRecipeRegistry { - private static List recipeList = new ArrayList<>(); - - public static void registerRecipe(AlchemyTableRecipe recipe) { - recipeList.add(recipe); - } - - public static void registerRecipe(ItemStack outputStack, int lpDrained, int ticksRequired, int tierRequired, Object... objects) { - registerRecipe(new AlchemyTableRecipe(outputStack, lpDrained, ticksRequired, tierRequired, objects)); - } - - public static void removeRecipe(AlchemyTableRecipe recipe) { - recipeList.remove(recipe); - } - - public static AlchemyTableRecipe getMatchingRecipe(List itemList, World world, BlockPos pos) { - for (AlchemyTableRecipe recipe : recipeList) { - if (recipe.matches(itemList, world, pos)) { - return recipe; - } - } - - return null; - } - - public static List getRecipeList() { - return new ArrayList<>(recipeList); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java deleted file mode 100644 index c0c74d3a..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/AltarRecipeRegistry.java +++ /dev/null @@ -1,215 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.altar.AltarTier; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.Collections; -import java.util.List; - -public class AltarRecipeRegistry { - private static BiMap, AltarRecipe> recipes = HashBiMap.create(); - - /** - * Registers an {@link AltarRecipe} for the Blood Altar. This can be a - * {@code ItemStack}, {@code List}, or {@code String} - * OreDictionary entry. - *

- * If the OreDictionary entry does not exist or is empty, it will not be - * registered. - * - * @param altarRecipe - The AltarRecipe to register - */ - public static void registerRecipe(AltarRecipe altarRecipe) { - if (!recipes.containsValue(altarRecipe) && altarRecipe.getInput().size() > 0) - recipes.put(altarRecipe.getInput(), altarRecipe); - else - BMLog.DEFAULT.error("Error adding altar recipe for input [{}].", altarRecipe.toString()); - } - - public static void registerFillRecipe(ItemStack orbStack, AltarTier tier, int maxForOrb, int consumeRate, int drainRate) { - registerRecipe(new AltarRecipe(orbStack, orbStack, tier, maxForOrb, consumeRate, drainRate, true)); - } - - public static void removeRecipe(AltarRecipe altarRecipe) { - recipes.remove(altarRecipe.getInput()); - } - - /** - * Gets the recipe that the provided input is registered to. - * - * @param input - The input ItemStack to get the recipe for - * @return - The recipe that the provided input is registered to. - */ - public static AltarRecipe getRecipeForInput(List input) { - List wrapperList = ItemStackWrapper.toWrapperList(input); - if (recipes.keySet().contains(wrapperList)) - return recipes.get(wrapperList); - - return null; - } - - //TODO: Determine a more time-effective method - public static AltarRecipe getRecipeForInput(ItemStack input) { - for (AltarRecipe recipe : recipes.values()) { - if (recipe.doesRequiredItemMatch(input, recipe.getMinTier())) { - return recipe; - } - } - - return null; - } - - public static AltarRecipe getRecipeForInput(String input) { - return getRecipeForInput(OreDictionary.getOres(input)); - } - - public static BiMap, AltarRecipe> getRecipes() { - return HashBiMap.create(recipes); - } - - public static class AltarRecipe { - private final List input; - private final ItemStack output; - private final AltarTier minTier; - private final int syphon, consumeRate, drainRate; - private final boolean fillable; - - /** - * Allows creation of a recipe for the - * {@link WayofTime.bloodmagic.block.BlockAltar} / - * {@link WayofTime.bloodmagic.tile.TileAltar}. The output ItemStack is - * allowed to be null as some recipes do not contain an output. (Blood - * Orbs) - * - * @param input - The input ItemStack - * @param output - The ItemStack obtained from the recipe - * @param minTier - The minimum tier of Altar required - * @param syphon - The amount of LP to syphon from the Altar - * @param consumeRate - The rate at which LP is consumed during crafting - * @param drainRate - The rate at which LP is drained during crafting - * @param fillable - Whether the input item can be filled with LP. IE: Orbs - */ - public AltarRecipe(List input, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { - this.input = ItemStackWrapper.toWrapperList(input); - this.output = output; - this.minTier = minTier; - this.syphon = syphon < 0 ? -syphon : syphon; - this.consumeRate = consumeRate < 0 ? -consumeRate : consumeRate; - this.drainRate = drainRate < 0 ? -drainRate : drainRate; - this.fillable = fillable; - } - - public AltarRecipe(List input, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate) { - this(input, output, minTier, syphon, consumeRate, drainRate, false); - } - - public AltarRecipe(ItemStack input, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { - this(Collections.singletonList(input), output, minTier, syphon, consumeRate, drainRate, fillable); - } - - public AltarRecipe(ItemStack input, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate) { - this(Collections.singletonList(input), output, minTier, syphon, consumeRate, drainRate, false); - } - - public AltarRecipe(String inputEntry, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate, boolean fillable) { - this(OreDictionary.doesOreNameExist(inputEntry) && OreDictionary.getOres(inputEntry).size() > 0 ? OreDictionary.getOres(inputEntry) : Collections.emptyList(), output, minTier, syphon, consumeRate, drainRate, fillable); - } - - public AltarRecipe(String inputEntry, ItemStack output, AltarTier minTier, int syphon, int consumeRate, int drainRate) { - this(OreDictionary.doesOreNameExist(inputEntry) && OreDictionary.getOres(inputEntry).size() > 0 ? OreDictionary.getOres(inputEntry) : Collections.emptyList(), output, minTier, syphon, consumeRate, drainRate, false); - } - - public boolean doesRequiredItemMatch(ItemStack comparedStack, AltarTier tierCheck) { - if (comparedStack == null || this.input == null) - return false; - - if (tierCheck.ordinal() < minTier.ordinal()) - return false; - - for (ItemStackWrapper stack : input) { - if (comparedStack.isItemEqual(stack.toStack())) - return true; - - if (comparedStack.getItem() == stack.item && stack.meta == OreDictionary.WILDCARD_VALUE) - return true; - } - - return false; - } - - public List getInput() { - return input; - } - - public ItemStack getOutput() { - return output; - } - - public AltarTier getMinTier() { - return minTier; - } - - public int getSyphon() { - return syphon; - } - - public int getConsumeRate() { - return consumeRate; - } - - public int getDrainRate() { - return drainRate; - } - - public boolean isFillable() { - return fillable; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof AltarRecipe)) return false; - - AltarRecipe that = (AltarRecipe) o; - - if (syphon != that.syphon) return false; - if (consumeRate != that.consumeRate) return false; - if (drainRate != that.drainRate) return false; - if (fillable != that.fillable) return false; - if (input != null ? !input.equals(that.input) : that.input != null) return false; - if (output != null ? !output.equals(that.output) : that.output != null) return false; - return minTier == that.minTier; - } - - @Override - public int hashCode() { - int result = input != null ? input.hashCode() : 0; - result = 31 * result + (output != null ? output.hashCode() : 0); - result = 31 * result + (minTier != null ? minTier.hashCode() : 0); - result = 31 * result + syphon; - result = 31 * result + consumeRate; - result = 31 * result + drainRate; - result = 31 * result + (fillable ? 1 : 0); - return result; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("input", input) - .append("output", output) - .append("minTier", minTier) - .append("syphon", syphon) - .append("consumeRate", consumeRate) - .append("drainRate", drainRate) - .append("fillable", fillable) - .toString(); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java deleted file mode 100644 index 61a28fb5..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/LivingArmourDowngradeRecipeRegistry.java +++ /dev/null @@ -1,60 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class LivingArmourDowngradeRecipeRegistry { - private static List recipeList = new ArrayList<>(); - private static Map>> dialogueMap = new HashMap<>(); - - public static void registerRecipe(LivingArmourDowngradeRecipe recipe) { - recipeList.add(recipe); - } - - public static void registerDialog(ItemStack keyStack, Map> map) { - dialogueMap.put(keyStack, map); - } - - public static List getDialogForProcessTick(ItemStack keyStack, int tick) { - for (Entry>> entry : dialogueMap.entrySet()) { - ItemStack key = entry.getKey(); - if (OreDictionary.itemMatches(key, keyStack, false)) { - Map> map = entry.getValue(); - if (map.containsKey(tick)) { - return map.get(tick); - } - } - } - - return null; - } - - public static void registerRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) { - registerRecipe(new LivingArmourDowngradeRecipe(upgrade, keyStack, recipe)); - } - - public static LivingArmourDowngradeRecipe getMatchingRecipe(ItemStack keyStack, List itemList, World world, BlockPos pos) { - for (LivingArmourDowngradeRecipe recipe : recipeList) { - if (recipe.matches(keyStack, itemList, world, pos)) { - return recipe; - } - } - - return null; - } - - public static List getRecipeList() { - return new ArrayList<>(recipeList); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java index 189ab880..ee76030b 100644 --- a/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java +++ b/src/main/java/WayofTime/bloodmagic/core/registry/OrbRegistry.java @@ -1,62 +1,63 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.orb.BloodOrb; -import com.google.common.collect.ArrayListMultimap; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraftforge.fml.common.registry.GameRegistry; +package wayoftime.bloodmagic.core.registry; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.google.common.collect.ArrayListMultimap; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.altar.AltarTier; +import wayoftime.bloodmagic.orb.BloodOrb; + /** * This is only for those who wish to add a basic {@link BloodOrb}. If you need * custom handling, you will need your own item class. */ -@Deprecated -public class OrbRegistry { - @GameRegistry.ObjectHolder("bloodmagic:blood_orb") - private static final Item ORB_ITEM = null; - public static ArrayListMultimap tierMap = ArrayListMultimap.create(); - private static List orbs = new ArrayList<>(); +public class OrbRegistry +{ + public static ArrayListMultimap tierMap = ArrayListMultimap.create(); + private static List orbs = new ArrayList<>(); - public static List getOrbsForTier(int tier) { - if (getTierMap().containsKey(tier)) - return getTierMap().get(tier); + public static List getOrbsForTier(int tier) + { + if (getTierMap().containsKey(tier)) + return getTierMap().get(tier); - return Collections.emptyList(); - } + return Collections.emptyList(); + } - public static List getOrbsUpToTier(int tier) { - List ret = new ArrayList<>(); + public static List getOrbsUpToTier(int tier) + { + List ret = new ArrayList<>(); - for (int i = 1; i <= tier; i++) - ret.addAll(getOrbsForTier(i)); + for (int i = 1; i <= tier; i++) ret.addAll(getOrbsForTier(i)); - return ret; - } + return ret; + } - public static List getOrbsDownToTier(int tier) { - List ret = new ArrayList<>(); + public static List getOrbsDownToTier(int tier) + { + List ret = new ArrayList<>(); - for (int i = AltarTier.MAXTIERS; i >= tier; i--) - ret.addAll(getOrbsForTier(i)); + for (int i = AltarTier.MAXTIERS; i >= tier; i--) ret.addAll(getOrbsForTier(i)); - return ret; - } + return ret; + } - public static ItemStack getOrbStack(BloodOrb orb) { - ItemStack ret = new ItemStack(ORB_ITEM); - CompoundNBT tag = new CompoundNBT(); - tag.putString("orb", orb.getRegistryName().toString()); - ret.setTagCompound(tag); - return ret; - } + public static ItemStack getOrbStack(BloodOrb orb) + { + Item orbItem = ForgeRegistries.ITEMS.getValue(orb.getResourceLocation()); + if (orbItem == null) + return null; - public static ArrayListMultimap getTierMap() { - return ArrayListMultimap.create(tierMap); - } -} + return new ItemStack(orbItem); + } + + public static ArrayListMultimap getTierMap() + { + return ArrayListMultimap.create(tierMap); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java b/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java deleted file mode 100644 index 595310ae..00000000 --- a/src/main/java/WayofTime/bloodmagic/core/registry/TartaricForgeRecipeRegistry.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.core.registry; - -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class TartaricForgeRecipeRegistry { - private static List recipeList = new ArrayList<>(); - - public static void registerRecipe(TartaricForgeRecipe recipe) { - recipeList.add(recipe); - } - - public static void registerRecipe(ItemStack outputStack, double minimulSouls, double drain, Object... objects) { - registerRecipe(new TartaricForgeRecipe(outputStack, minimulSouls, drain, objects)); - } - - public static void removeRecipe(TartaricForgeRecipe recipe) { - recipeList.remove(recipe); - } - - public static TartaricForgeRecipe getMatchingRecipe(List itemList, World world, BlockPos pos) { - for (TartaricForgeRecipe recipe : recipeList) { - if (recipe.matches(itemList, world, pos)) { - return recipe; - } - } - - return null; - } - - public static List getRecipeList() { - return new ArrayList<>(recipeList); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java b/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java deleted file mode 100644 index f2b3f4c3..00000000 --- a/src/main/java/WayofTime/bloodmagic/demonAura/PosXY.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.demonAura; - -import org.apache.commons.lang3.builder.ToStringBuilder; - -public class PosXY implements Comparable { - public int x; - public int y; - - public PosXY() { - } - - public PosXY(int x, int y) { - this.x = x; - this.y = y; - } - - @Override - public int compareTo(PosXY c) { - return this.y == c.y ? this.x - c.x : this.y - c.y; - } - - public float getDistanceSquared(int x, int z) { - float f = this.x - x; - float f2 = this.y - z; - return f * f + f2 * f2; - } - - public float getDistanceSquaredToChunkCoordinates(PosXY c) { - return getDistanceSquared(c.x, c.y); - } - - public void setX(int x) { - this.x = x; - } - - public void setY(int y) { - this.y = y; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("x", x) - .append("y", y) - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PosXY)) return false; - - PosXY posXY = (PosXY) o; - - if (x != posXY.x) return false; - return y == posXY.y; - } - - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - return result; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java deleted file mode 100644 index 658280f0..00000000 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillChunk.java +++ /dev/null @@ -1,60 +0,0 @@ -package WayofTime.bloodmagic.demonAura; - -import WayofTime.bloodmagic.soul.DemonWillHolder; -import net.minecraft.world.chunk.Chunk; - -import java.lang.ref.WeakReference; - -public class WillChunk { - PosXY loc; - private short base; - private DemonWillHolder currentWill = new DemonWillHolder(); - private WeakReference chunkRef; - - public WillChunk(PosXY loc) { - this.loc = loc; - } - - public WillChunk(Chunk chunk, short base, DemonWillHolder currentWill) { - this.loc = new PosXY(chunk.x, chunk.z); - this.chunkRef = new WeakReference(chunk); - this.base = base; - this.currentWill = currentWill; - } - - public boolean isModified() { - return (this.chunkRef != null) && (this.chunkRef.get() != null) && this.chunkRef.get().needsSaving(false); - } - - public PosXY getLoc() { - return loc; - } - - public void setLoc(PosXY loc) { - this.loc = loc; - } - - public short getBase() { - return base; - } - - public void setBase(short base) { - this.base = base; - } - - public DemonWillHolder getCurrentWill() { - return currentWill; - } - - public void setCurrentWill(DemonWillHolder currentWill) { - this.currentWill = currentWill; - } - - public WeakReference getChunkRef() { - return chunkRef; - } - - public void setChunkRef(WeakReference chunkRef) { - this.chunkRef = chunkRef; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java b/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java deleted file mode 100644 index 76bf8a75..00000000 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WillWorld.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.demonAura; - -import java.util.concurrent.ConcurrentHashMap; - -public class WillWorld { - int dim; - ConcurrentHashMap willChunks = new ConcurrentHashMap<>(); - -// private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); - - public WillWorld(int dim) { - this.dim = dim; - } - - public WillChunk getWillChunkAt(int x, int y) { - return getWillChunkAt(new PosXY(x, y)); - } - - public WillChunk getWillChunkAt(PosXY loc) { - return this.willChunks.get(loc); - } - - public ConcurrentHashMap getWillChunks() { - return willChunks; - } - - public void setWillChunks(ConcurrentHashMap willChunks) { - this.willChunks = willChunks; - } - -// public static ConcurrentHashMap getNodeTickets() -// { -// return nodeTickets; -// } -// -// public static void setNodeTickets(ConcurrentHashMap nodeTickets) -// { -// nodeTickets = nodeTickets; -// } -} diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java deleted file mode 100644 index 06639138..00000000 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ /dev/null @@ -1,178 +0,0 @@ -package WayofTime.bloodmagic.demonAura; - -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; - -import javax.annotation.Nullable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -public class WorldDemonWillHandler { - public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap<>(); - static ConcurrentHashMap containedWills = new ConcurrentHashMap<>(); - - @Nullable - public static DemonWillHolder getWillHolder(int dim, int x, int y) { - WillChunk chunk = getWillChunk(dim, x, y); - if (chunk != null) { - return chunk.getCurrentWill(); - } - - return null; - } - - public static DemonWillHolder getWillHolder(World world, BlockPos pos) { - return getWillHolder(world.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - } - - public static WillWorld getWillWorld(int dim) { - return containedWills.get(dim); - } - - @Nullable - public static WillChunk getWillChunk(int dim, int x, int y) { - if (!containedWills.containsKey(dim)) { - addWillWorld(dim); - } - - return (containedWills.get(dim)).getWillChunkAt(x, y); - } - - public static void addWillWorld(int dim) { - if (!containedWills.containsKey(dim)) { - containedWills.put(dim, new WillWorld(dim)); - BMLog.DEBUG.info("Creating demon will cache for world {}", dim); - } - } - - public static void removeWillWorld(int dim) { - containedWills.remove(dim); - BMLog.DEBUG.info("Removing demon will cache for world {}", dim); - } - - public static void addWillChunk(int dim, Chunk chunk, short base, DemonWillHolder currentWill) { - WillWorld aw = containedWills.get(dim); - if (aw == null) { - aw = new WillWorld(dim); - } - aw.getWillChunks().put(new PosXY(chunk.x, chunk.z), new WillChunk(chunk, base, currentWill)); - - containedWills.put(dim, aw); - } - - public static void removeWillChunk(int dim, int x, int y) { - WillWorld aw = containedWills.get(dim); - if (aw != null) { - WillChunk chunk = aw.getWillChunks().remove(new PosXY(x, y)); - if (chunk != null) { - markChunkAsDirty(chunk, dim); - } - } - } - - public static EnumDemonWillType getHighestDemonWillType(World world, BlockPos pos) { - double currentMax = 0; - EnumDemonWillType currentHighest = EnumDemonWillType.DEFAULT; - - WillChunk willChunk = getWillChunk(world, pos); - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (currentWill.getWill(type) > currentMax) { - currentMax = currentWill.getWill(type); - currentHighest = type; - } - } - - return currentHighest; - } - - public static double drainWill(World world, BlockPos pos, EnumDemonWillType type, double amount, boolean doDrain) { - WillChunk willChunk = getWillChunk(world, pos); - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - double drain = Math.min(currentWill.getWill(type), amount); - if (!doDrain) { - return drain; - } - - drain = currentWill.drainWill(type, drain); - markChunkAsDirty(willChunk, world.provider.getDimension()); - - return drain; - } - - public static double fillWillToMaximum(World world, BlockPos pos, EnumDemonWillType type, double amount, double max, boolean doFill) { - WillChunk willChunk = getWillChunk(world, pos); - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - double fill = Math.min(amount, max - currentWill.getWill(type)); - if (!doFill || fill <= 0) { - return fill > 0 ? fill : 0; - } - - fill = currentWill.addWill(type, amount, max); - markChunkAsDirty(willChunk, world.provider.getDimension()); - - return fill; - } - - public static double fillWill(World world, BlockPos pos, EnumDemonWillType type, double amount, boolean doFill) { - WillChunk willChunk = getWillChunk(world, pos); - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - if (!doFill) { - return amount; - } - - currentWill.addWill(type, amount); - markChunkAsDirty(willChunk, world.provider.getDimension()); - - return amount; - } - - public static WillChunk getWillChunk(World world, BlockPos pos) { - WillChunk willChunk = getWillChunk(world.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - if (willChunk == null) { - Chunk chunk = world.getChunk(pos); - generateWill(chunk); - - willChunk = getWillChunk(world.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - } - - return willChunk; - } - - public static double getCurrentWill(World world, BlockPos pos, EnumDemonWillType type) { - WillChunk willChunk = getWillChunk(world, pos); - - if (willChunk == null) { - return 0; - } - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - return currentWill.getWill(type); - } - - private static void markChunkAsDirty(WillChunk chunk, int dim) { - if (chunk.isModified()) { - return; - } - PosXY pos = new PosXY(chunk.loc.x, chunk.loc.y); - if (!dirtyChunks.containsKey(dim)) { - dirtyChunks.put(dim, new CopyOnWriteArrayList<>()); - } - CopyOnWriteArrayList dc = dirtyChunks.get(dim); - if (!dc.contains(pos)) { - dc.add(pos); - } - } - - public static void generateWill(Chunk chunk) { - addWillChunk(chunk.getWorld().provider.getDimension(), chunk, (short) 1, new DemonWillHolder()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java deleted file mode 100644 index c776b47a..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackRangedBow.java +++ /dev/null @@ -1,138 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.item.BowItem; -import net.minecraft.util.Hand; - -public class EntityAIAttackRangedBow extends Goal { - private final EntityDemonBase entity; - private final double moveSpeedAmp; - private final float maxAttackDistance; - private int attackCooldown; - private int attackTime = -1; - private int seeTime; - private boolean strafingClockwise; - private boolean strafingBackwards; - private int strafingTime = -1; - - public EntityAIAttackRangedBow(EntityDemonBase entityDemonBase, double speedAmplifier, int delay, float maxDistance) { - this.entity = entityDemonBase; - this.moveSpeedAmp = speedAmplifier; - this.attackCooldown = delay; - this.maxAttackDistance = maxDistance * maxDistance; - this.setMutexBits(3); - } - - public void setAttackCooldown(int p_189428_1_) { - this.attackCooldown = p_189428_1_; - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - return this.entity.getAttackTarget() != null && this.isBowInMainhand(); - } - - protected boolean isBowInMainhand() { - return this.entity.getHeldItemMainhand().getItem() instanceof BowItem; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return (this.shouldExecute() || !this.entity.getNavigator().noPath()) && this.isBowInMainhand(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - super.startExecuting(); - } - - /** - * Resets the task - */ - public void resetTask() { - super.startExecuting(); - this.seeTime = 0; - this.attackTime = -1; - this.entity.resetActiveHand(); - } - - /** - * Updates the task - */ - public void updateTask() { - LivingEntity entitylivingbase = this.entity.getAttackTarget(); - - if (entitylivingbase != null) { - double d0 = this.entity.getDistanceSq(entitylivingbase.posX, entitylivingbase.getEntityBoundingBox().minY, entitylivingbase.posZ); - boolean flag = this.entity.getEntitySenses().canSee(entitylivingbase); - boolean flag1 = this.seeTime > 0; - - if (flag != flag1) { - this.seeTime = 0; - } - - if (flag) { - ++this.seeTime; - } else { - --this.seeTime; - } - - if (d0 <= (double) this.maxAttackDistance && this.seeTime >= 20) { - this.entity.getNavigator().clearPath(); - ++this.strafingTime; - } else { - this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.moveSpeedAmp); - this.strafingTime = -1; - } - - if (this.strafingTime >= 20) { - if ((double) this.entity.getRNG().nextFloat() < 0.3D) { - this.strafingClockwise = !this.strafingClockwise; - } - - if ((double) this.entity.getRNG().nextFloat() < 0.3D) { - this.strafingBackwards = !this.strafingBackwards; - } - - this.strafingTime = 0; - } - - if (this.strafingTime > -1) { - if (d0 > (double) (this.maxAttackDistance * 0.75F)) { - this.strafingBackwards = false; - } else if (d0 < (double) (this.maxAttackDistance * 0.25F)) { - this.strafingBackwards = true; - } - - this.entity.getMoveHelper().strafe(this.strafingBackwards ? -0.5F : 0.5F, this.strafingClockwise ? 0.5F : -0.5F); - this.entity.faceEntity(entitylivingbase, 30.0F, 30.0F); - } else { - this.entity.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); - } - - if (this.entity.isHandActive()) { - if (!flag && this.seeTime < -60) { - this.entity.resetActiveHand(); - } else if (flag) { - int i = this.entity.getItemInUseMaxCount(); - - if (i >= 20) { - this.entity.resetActiveHand(); - this.entity.attackEntityWithRangedAttack(entitylivingbase, BowItem.getArrowVelocity(i)); - this.attackTime = this.attackCooldown; - } - } - } else if (--this.attackTime <= 0 && this.seeTime >= -60) { - this.entity.setActiveHand(Hand.MAIN_HAND); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java deleted file mode 100644 index 08ecf2d4..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIAttackStealthMelee.java +++ /dev/null @@ -1,142 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.pathfinding.Path; -import net.minecraft.util.Hand; -import net.minecraft.world.World; - -public class EntityAIAttackStealthMelee extends Goal { - protected final int attackInterval = 20; - protected EntityCorruptedChicken chicken; - /** - * An amount of decrementing ticks that allows the entity to attack once the - * tick reaches 0. - */ - protected int attackTick; - World worldObj; - /** - * The speed with which the mob will approach the target - */ - double speedTowardsTarget; - /** - * When true, the mob will continue chasing its target, even if it can't - * find a path to them right now. - */ - boolean longMemory; - /** - * The PathEntity of our entity. - */ - Path entityPathEntity; - private int delayCounter; - private double targetX; - private double targetY; - private double targetZ; - private int failedPathFindingPenalty = 0; - private boolean canPenalize = false; - - public EntityAIAttackStealthMelee(EntityCorruptedChicken creature, double speedIn, boolean useLongMemory) { - this.chicken = creature; - this.worldObj = creature.getEntityWorld(); - this.speedTowardsTarget = speedIn; - this.longMemory = useLongMemory; - this.setMutexBits(3); - } - - @Override - public boolean shouldExecute() { - if (chicken.attackStateMachine != 1) { - return false; - } - - LivingEntity entitylivingbase = this.chicken.getAttackTarget(); - - if (entitylivingbase == null) { - return false; - } else if (!entitylivingbase.isEntityAlive()) { - return false; - } else { - if (canPenalize) { - if (--this.delayCounter <= 0) { - this.entityPathEntity = this.chicken.getNavigator().getPathToEntityLiving(entitylivingbase); - this.delayCounter = 4 + this.chicken.getRNG().nextInt(7); - return this.entityPathEntity != null; - } else { - return true; - } - } - this.entityPathEntity = this.chicken.getNavigator().getPathToEntityLiving(entitylivingbase); - return this.entityPathEntity != null; - } - } - - @Override - public boolean shouldContinueExecuting() { - return chicken.attackStateMachine == 1 && super.shouldContinueExecuting(); - } - - @Override - public void resetTask() { - if (chicken.attackStateMachine == 1) { - chicken.attackStateMachine = 0; - } - } - - @Override - public void updateTask() { - LivingEntity entitylivingbase = this.chicken.getAttackTarget(); - this.chicken.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); - double d0 = this.chicken.getDistanceSq(entitylivingbase.posX, entitylivingbase.getEntityBoundingBox().minY, entitylivingbase.posZ); - --this.delayCounter; - - if ((this.longMemory || this.chicken.getEntitySenses().canSee(entitylivingbase)) && this.delayCounter <= 0 && (this.targetX == 0.0D && this.targetY == 0.0D && this.targetZ == 0.0D || entitylivingbase.getDistanceSq(this.targetX, this.targetY, this.targetZ) >= 1.0D || this.chicken.getRNG().nextFloat() < 0.05F)) { - this.targetX = entitylivingbase.posX; - this.targetY = entitylivingbase.getEntityBoundingBox().minY; - this.targetZ = entitylivingbase.posZ; - this.delayCounter = 4 + this.chicken.getRNG().nextInt(7); - - if (this.canPenalize) { - this.delayCounter += failedPathFindingPenalty; - if (this.chicken.getNavigator().getPath() != null) { - net.minecraft.pathfinding.PathPoint finalPathPoint = this.chicken.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.x, finalPathPoint.y, finalPathPoint.z) < 1) - failedPathFindingPenalty = 0; - else - failedPathFindingPenalty += 10; - } else { - failedPathFindingPenalty += 10; - } - } - - if (d0 > 1024.0D) { - this.delayCounter += 10; - } else if (d0 > 256.0D) { - this.delayCounter += 5; - } - - if (!this.chicken.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) { - this.delayCounter += 15; - } - } - - this.attackTick = Math.max(this.attackTick - 1, 0); - this.attackEntity(entitylivingbase, d0); - } - - protected void attackEntity(LivingEntity attacked, double distance) { - double d0 = this.getAttackReachSqr(attacked); - - if (distance <= d0 && this.attackTick <= 0) { - this.attackTick = 20; - this.chicken.swingArm(Hand.MAIN_HAND); - this.chicken.attackEntityAsMob(attacked); - - chicken.attackStateMachine = 2; - } - } - - protected double getAttackReachSqr(LivingEntity attackTarget) { - return (double) (this.chicken.width * 2.0F * this.chicken.width * 2.0F + attackTarget.width); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java deleted file mode 100644 index 0f6d167a..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIEatAndCorruptBlock.java +++ /dev/null @@ -1,99 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -import WayofTime.bloodmagic.inversion.CorruptionHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class EntityAIEatAndCorruptBlock extends Goal { - /** - * The entity owner of this AITask - */ - private final EntityAspectedDemonBase grassEaterEntity; - /** - * The world the grass eater entity is eating from - */ - private final World world; - /** - * Number of ticks since the entity started to eat grass - */ - int eatingGrassTimer; - - public EntityAIEatAndCorruptBlock(EntityAspectedDemonBase entity) { - this.grassEaterEntity = entity; - this.world = entity.getEntityWorld(); - this.setMutexBits(7); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - if (this.grassEaterEntity.getRNG().nextInt(50) != 0) { - return false; - } else { - BlockPos pos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ).down(); - BlockState offsetState = world.getBlockState(pos); - Block offsetBlock = offsetState.getBlock(); - return CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), pos, offsetState, offsetBlock); - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.eatingGrassTimer = 40; - this.world.setEntityState(this.grassEaterEntity, (byte) 10); - this.grassEaterEntity.getNavigator().clearPath(); - } - - /** - * Resets the task - */ - public void resetTask() { - this.eatingGrassTimer = 0; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return this.eatingGrassTimer > 0; - } - - /** - * Number of ticks since the entity started to eat grass - */ - public int getEatingGrassTimer() { - return this.eatingGrassTimer; - } - - /** - * Updates the task - */ - public void updateTask() { - this.eatingGrassTimer = Math.max(0, this.eatingGrassTimer - 1); - - if (this.eatingGrassTimer == 4) { - BlockPos blockpos = new BlockPos(this.grassEaterEntity.posX, this.grassEaterEntity.posY, this.grassEaterEntity.posZ); - - BlockPos offsetPos = blockpos.down(); - BlockState offsetState = world.getBlockState(offsetPos); - Block offsetBlock = offsetState.getBlock(); - - if (CorruptionHandler.isBlockCorruptible(world, grassEaterEntity.getType(), offsetPos, offsetState, offsetBlock)) { -// if (this.world.getGameRules().getBoolean("mobGriefing")) - { - this.world.playEvent(2001, offsetPos, Block.getIdFromBlock(offsetBlock)); - CorruptionHandler.corruptSurroundingBlocks(world, grassEaterEntity.getType(), offsetPos, 2, 0.5, 0.5); - } - - this.grassEaterEntity.eatGrassBonus(); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java deleted file mode 100644 index 6fe42c3b..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIFollowOwner.java +++ /dev/null @@ -1,125 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.pathfinding.GroundPathNavigator; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.pathfinding.PathNodeType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; - -public class EntityAIFollowOwner extends Goal { - World theWorld; - float maxDist; - float minDist; - private EntityDemonBase thePet; - private LivingEntity theOwner; - private double followSpeed; - private PathNavigator petPathfinder; - private int timeToRecalcPath; - private float oldWaterCost; - - public EntityAIFollowOwner(EntityDemonBase thePetIn, double followSpeedIn, float minDistIn, float maxDistIn) { - this.thePet = thePetIn; - this.theWorld = thePetIn.getEntityWorld(); - this.followSpeed = followSpeedIn; - this.petPathfinder = thePetIn.getNavigator(); - this.minDist = minDistIn; - this.maxDist = maxDistIn; - this.setMutexBits(3); - - if (!(thePetIn.getNavigator() instanceof GroundPathNavigator)) { - throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); - } - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - LivingEntity entitylivingbase = this.thePet.getOwner(); - - if (entitylivingbase == null) { - return false; - } else if (entitylivingbase instanceof PlayerEntity && ((PlayerEntity) entitylivingbase).isSpectator()) { - return false; - } else if (this.thePet.isStationary()) { - return false; - } else if (this.thePet.getDistanceSq(entitylivingbase) < (double) (this.minDist * this.minDist)) { - return false; - } else { - this.theOwner = entitylivingbase; - return true; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return !this.petPathfinder.noPath() && this.thePet.getDistanceSq(this.theOwner) > (double) (this.maxDist * this.maxDist) && !this.thePet.isStationary(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.timeToRecalcPath = 0; - this.oldWaterCost = this.thePet.getPathPriority(PathNodeType.WATER); - this.thePet.setPathPriority(PathNodeType.WATER, 0.0F); - } - - /** - * Resets the task - */ - public void resetTask() { - this.theOwner = null; - this.petPathfinder.clearPath(); - this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); - } - - private boolean isEmptyBlock(BlockPos pos) { - BlockState iblockstate = this.theWorld.getBlockState(pos); - Block block = iblockstate.getBlock(); - return block == Blocks.AIR || !iblockstate.isFullCube(); - } - - /** - * Updates the task - */ - public void updateTask() { - this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float) this.thePet.getVerticalFaceSpeed()); - - if (!this.thePet.isStationary()) { - if (--this.timeToRecalcPath <= 0) { - this.timeToRecalcPath = 10; - - if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { - if (!this.thePet.getLeashed()) { - if (this.thePet.getDistanceSq(this.theOwner) >= 144.0D) { - int i = MathHelper.floor(this.theOwner.posX) - 2; - int j = MathHelper.floor(this.theOwner.posZ) - 2; - int k = MathHelper.floor(this.theOwner.getEntityBoundingBox().minY); - - for (int l = 0; l <= 4; ++l) { - for (int i1 = 0; i1 <= 4; ++i1) { - if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.theWorld.getBlockState(new BlockPos(i + l, k - 1, j + i1)).isTopSolid() && this.isEmptyBlock(new BlockPos(i + l, k, j + i1)) && this.isEmptyBlock(new BlockPos(i + l, k + 1, j + i1))) { - this.thePet.setLocationAndAngles((double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.thePet.rotationYaw, this.thePet.rotationPitch); - this.petPathfinder.clearPath(); - return; - } - } - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java deleted file mode 100644 index 83092001..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIGrabEffectsFromOwner.java +++ /dev/null @@ -1,136 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.pathfinding.GroundPathNavigator; -import net.minecraft.pathfinding.PathNodeType; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; - -public class EntityAIGrabEffectsFromOwner extends Goal { - World theWorld; - float minDist; - private EntitySentientSpecter thePet; - private LivingEntity theOwner; - private double followSpeed; - private PathNavigator petPathfinder; - private int timeToRecalcPath; - private float oldWaterCost; - - /** - * In order to steal effects from the owner, the mob has to be close to the - * owner. - */ - public EntityAIGrabEffectsFromOwner(EntitySentientSpecter thePetIn, double followSpeedIn, float minDistIn) { - this.thePet = thePetIn; - this.theWorld = thePetIn.getEntityWorld(); - this.followSpeed = followSpeedIn; - this.petPathfinder = thePetIn.getNavigator(); - this.minDist = minDistIn; - this.setMutexBits(3); - - if (!(thePetIn.getNavigator() instanceof GroundPathNavigator)) { - throw new IllegalArgumentException("Unsupported mob type for FollowOwnerGoal"); - } - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - LivingEntity entitylivingbase = this.thePet.getOwner(); - - if (entitylivingbase == null) { - return false; - } else if (entitylivingbase instanceof PlayerEntity && ((PlayerEntity) entitylivingbase).isSpectator()) { - return false; - } else if (this.thePet.isStationary()) { - return false; -// } else if (this.thePet.getDistanceSqToEntity(entitylivingbase) < (double) (this.minDist * this.minDist)) -// { -// return false; - } else if (!this.thePet.canStealEffectFromOwner(entitylivingbase)) { - return false; - } else { - this.theOwner = entitylivingbase; - return true; - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return this.thePet.canStealEffectFromOwner(theOwner);// || !this.petPathfinder.noPath() && this.thePet.getDistanceSqToEntity(this.theOwner) > (double) (this.minDist * this.minDist) && !this.thePet.isStationary(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.timeToRecalcPath = 0; - this.oldWaterCost = this.thePet.getPathPriority(PathNodeType.WATER); - this.thePet.setPathPriority(PathNodeType.WATER, 0.0F); - } - - /** - * Resets the task - */ - public void resetTask() { - this.theOwner = null; - this.petPathfinder.clearPath(); - this.thePet.setPathPriority(PathNodeType.WATER, this.oldWaterCost); - } - - private boolean isEmptyBlock(BlockPos pos) { - BlockState iblockstate = this.theWorld.getBlockState(pos); - Block block = iblockstate.getBlock(); - return block == Blocks.AIR || !iblockstate.isFullCube(); - } - - /** - * Updates the task - */ - public void updateTask() { - this.thePet.getLookHelper().setLookPositionWithEntity(this.theOwner, 10.0F, (float) this.thePet.getVerticalFaceSpeed()); - - if (this.thePet.getDistanceSq(theOwner) < this.minDist * this.minDist) { - if (this.thePet.stealEffectsFromOwner(theOwner)) { - return; - } - } - - if (!this.thePet.isStationary()) { - if (--this.timeToRecalcPath <= 0) { - this.timeToRecalcPath = 10; - - if (!this.petPathfinder.tryMoveToEntityLiving(this.theOwner, this.followSpeed)) { - if (!this.thePet.getLeashed()) { - if (this.thePet.getDistanceSq(this.theOwner) >= 144.0D) { - int i = MathHelper.floor(this.theOwner.posX) - 2; - int j = MathHelper.floor(this.theOwner.posZ) - 2; - int k = MathHelper.floor(this.theOwner.getEntityBoundingBox().minY); - - for (int l = 0; l <= 4; ++l) { - for (int i1 = 0; i1 <= 4; ++i1) { - if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.theWorld.getBlockState(new BlockPos(i + l, k - 1, j + i1)).isTopSolid() && this.isEmptyBlock(new BlockPos(i + l, k, j + i1)) && this.isEmptyBlock(new BlockPos(i + l, k + 1, j + i1))) { - this.thePet.setLocationAndAngles((double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.thePet.rotationYaw, this.thePet.rotationPitch); - this.petPathfinder.clearPath(); - return; - } - } - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java deleted file mode 100644 index 44690ec5..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIHurtByTargetIgnoreTamed.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import net.minecraft.entity.CreatureEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.IEntityOwnable; -import net.minecraft.entity.ai.goal.HurtByTargetGoal; - -import java.util.UUID; - -public class EntityAIHurtByTargetIgnoreTamed extends HurtByTargetGoal { - public EntityAIHurtByTargetIgnoreTamed(CreatureEntity creatureIn, boolean entityCallsForHelpIn, Class... targetClassesIn) { - super(creatureIn, true, targetClassesIn); - } - - @Override - public boolean isSuitableTarget(LivingEntity target, boolean includeInvincibles) { - if (this.taskOwner instanceof IEntityOwnable && target instanceof IEntityOwnable) { - UUID thisId = ((IEntityOwnable) this.taskOwner).getOwnerId(); - UUID targetId = ((IEntityOwnable) target).getOwnerId(); - if (thisId != null && targetId != null && thisId.equals(targetId)) { - return false; - } - } - - return super.isSuitableTarget(target, includeInvincibles); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java deleted file mode 100644 index 787dcaec..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIMimicReform.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.util.math.BlockPos; - -public class EntityAIMimicReform extends Goal { - private final EntityMimic theEntity; - - public EntityAIMimicReform(EntityMimic creatureIn) { - this.theEntity = creatureIn; - this.setMutexBits(2); - } - - @Override - public boolean shouldExecute() { - return this.theEntity.ticksExisted > 100 && this.theEntity.hasHome() && this.theEntity.isWithinHomeDistanceCurrentPosition(); - } - - @Override - public void startExecuting() { - BlockPos homePos = this.theEntity.getHomePosition(); - if (theEntity.reformIntoMimicBlock(homePos)) { - this.theEntity.setDead(); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java deleted file mode 100644 index 371c3b4c..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtByTarget.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.TargetGoal; - -public class EntityAIOwnerHurtByTarget extends TargetGoal { - EntityDemonBase theDefendingTameable; - LivingEntity theOwnerAttacker; - private int timestamp; - - public EntityAIOwnerHurtByTarget(EntityDemonBase theDefendingTameableIn) { - super(theDefendingTameableIn, false); - this.theDefendingTameable = theDefendingTameableIn; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - if (!this.theDefendingTameable.isTamed()) { - return false; - } else { - LivingEntity owner = this.theDefendingTameable.getOwner(); - - if (owner == null) { - return false; - } else { - this.theOwnerAttacker = owner.getRevengeTarget(); - int i = owner.getRevengeTimer(); - return i != this.timestamp && this.isSuitableTarget(this.theOwnerAttacker, false) && this.theDefendingTameable.shouldAttackEntity(this.theOwnerAttacker, owner); - } - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.taskOwner.setAttackTarget(this.theOwnerAttacker); - LivingEntity owner = this.theDefendingTameable.getOwner(); - - if (owner != null) { - this.timestamp = owner.getRevengeTimer(); - } - - super.startExecuting(); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java deleted file mode 100644 index 61433ccd..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIOwnerHurtTarget.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.TargetGoal; - -public class EntityAIOwnerHurtTarget extends TargetGoal { - EntityDemonBase theEntityDemonBase; - LivingEntity theTarget; - private int timestamp; - - public EntityAIOwnerHurtTarget(EntityDemonBase theEntityDemonBaseIn) { - super(theEntityDemonBaseIn, false); - this.theEntityDemonBase = theEntityDemonBaseIn; - this.setMutexBits(1); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - if (!this.theEntityDemonBase.isTamed()) { - return false; - } else { - LivingEntity entitylivingbase = this.theEntityDemonBase.getOwner(); - - if (entitylivingbase == null) { - return false; - } else { - this.theTarget = entitylivingbase.getLastAttackedEntity(); - int i = entitylivingbase.getLastAttackedEntityTime(); - return i != this.timestamp && this.isSuitableTarget(this.theTarget, false) && this.theEntityDemonBase.shouldAttackEntity(this.theTarget, entitylivingbase); - } - } - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.taskOwner.setAttackTarget(this.theTarget); - LivingEntity entitylivingbase = this.theEntityDemonBase.getOwner(); - - if (entitylivingbase != null) { - this.timestamp = entitylivingbase.getLastAttackedEntityTime(); - } - - super.startExecuting(); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java deleted file mode 100644 index 77e9f9d9..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIPickUpAlly.java +++ /dev/null @@ -1,154 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.pathfinding.Path; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.World; - -import java.util.List; - -public class EntityAIPickUpAlly extends Goal { - protected final int attackInterval = 20; - protected EntityAspectedDemonBase entity; - /** - * An amount of decrementing ticks that allows the entity to attack once the - * tick reaches 0. - */ - protected int attackTick; - World worldObj; - /** - * The speed with which the mob will approach the target - */ - double speedTowardsTarget; - /** - * When true, the mob will continue chasing its target, even if it can't - * find a path to them right now. - */ - boolean longMemory; - /** - * The PathEntity of our entity. - */ - Path entityPathEntity; - private int delayCounter; - private double targetX; - private double targetY; - private double targetZ; - private int failedPathFindingPenalty = 0; - private boolean canPenalize = false; - - private LivingEntity pickupTarget = null; - - public EntityAIPickUpAlly(EntityAspectedDemonBase creature, double speedIn, boolean useLongMemory) { - this.entity = creature; - this.worldObj = creature.getEntityWorld(); - this.speedTowardsTarget = speedIn; - this.longMemory = useLongMemory; - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - if (this.entity.getRidingEntity() != null) { - return false; - } - - AxisAlignedBB bb = new AxisAlignedBB(entity.posX - 0.5, entity.posY - 0.5, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + 0.5, entity.posZ + 0.5).grow(5); - List list = this.entity.getEntityWorld().getEntitiesWithinAABB(LivingEntity.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (LivingEntity testEntity : list) { - if (testEntity != this.entity) { - Path path = this.entity.getNavigator().getPathToEntityLiving(testEntity); - if (path != null) { - this.entityPathEntity = path; - this.pickupTarget = testEntity; - return true; - } - } - } - - return false; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean continueExecuting() { - return this.entity.getRidingEntity() != null; - } - - /** - * Execute a one shot task or start executing a continuous task - */ - public void startExecuting() { - this.entity.getNavigator().setPath(this.entityPathEntity, this.speedTowardsTarget); - this.delayCounter = 0; - } - - /** - * Resets the task - */ - public void resetTask() { - this.entity.getNavigator().clearPath(); - this.pickupTarget = null; - } - - /** - * Updates the task - */ - public void updateTask() { - LivingEntity entitylivingbase = this.pickupTarget; - this.entity.getLookHelper().setLookPositionWithEntity(entitylivingbase, 30.0F, 30.0F); - double d0 = this.entity.getDistanceSq(entitylivingbase.posX, entitylivingbase.getEntityBoundingBox().minY, entitylivingbase.posZ); - --this.delayCounter; - - if ((this.longMemory || this.entity.getEntitySenses().canSee(entitylivingbase)) && this.delayCounter <= 0 && (this.targetX == 0.0D && this.targetY == 0.0D && this.targetZ == 0.0D || entitylivingbase.getDistanceSq(this.targetX, this.targetY, this.targetZ) >= 1.0D || this.entity.getRNG().nextFloat() < 0.05F)) { - this.targetX = entitylivingbase.posX; - this.targetY = entitylivingbase.getEntityBoundingBox().minY; - this.targetZ = entitylivingbase.posZ; - this.delayCounter = 4 + this.entity.getRNG().nextInt(7); - - if (this.canPenalize) { - this.delayCounter += failedPathFindingPenalty; - if (this.entity.getNavigator().getPath() != null) { - net.minecraft.pathfinding.PathPoint finalPathPoint = this.entity.getNavigator().getPath().getFinalPathPoint(); - if (finalPathPoint != null && entitylivingbase.getDistanceSq(finalPathPoint.x, finalPathPoint.y, finalPathPoint.z) < 1) - failedPathFindingPenalty = 0; - else - failedPathFindingPenalty += 10; - } else { - failedPathFindingPenalty += 10; - } - } - - if (d0 > 1024.0D) { - this.delayCounter += 10; - } else if (d0 > 256.0D) { - this.delayCounter += 5; - } - - if (!this.entity.getNavigator().tryMoveToEntityLiving(entitylivingbase, this.speedTowardsTarget)) { - this.delayCounter += 15; - } - } - - this.attackTick = Math.max(this.attackTick - 1, 0); - this.pickUpEntity(entitylivingbase, d0); - } - - protected void pickUpEntity(LivingEntity potentialPickup, double distance) { - double d0 = this.getAttackReachSqr(potentialPickup); - - if (distance <= d0 && this.attackTick <= 0 && !potentialPickup.isRiding()) { - BMLog.DEBUG.info("Hai!"); - potentialPickup.startRiding(this.entity, true); - } - } - - protected double getAttackReachSqr(LivingEntity attackTarget) { - return (double) (this.entity.width * 2.0F * this.entity.width * 2.0F + attackTarget.width); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java deleted file mode 100644 index 5f7b7981..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIProtectAlly.java +++ /dev/null @@ -1,98 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityAspectedDemonBase; -import WayofTime.bloodmagic.entity.mob.EntityCorruptedSheep; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.World; - -import java.util.List; - -public class EntityAIProtectAlly extends Goal { - /** - * The entity owner of this AITask - */ - private final EntityCorruptedSheep entity; - /** - * The world the grass eater entity is eating from - */ - private final World world; - /** - * Number of ticks since the entity started to eat grass - */ - int castTimer; - - public EntityAIProtectAlly(EntityCorruptedSheep entity) { - this.entity = entity; - this.world = entity.getEntityWorld(); - this.setMutexBits(7); - } - - public int getCastTimer() { - return this.castTimer; - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - AxisAlignedBB bb = new AxisAlignedBB(entity.posX - 0.5, entity.posY - 0.5, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + 0.5, entity.posZ + 0.5).grow(5); - List list = world.getEntitiesWithinAABB(LivingEntity.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (LivingEntity testEntity : list) { - if (testEntity != this.entity) { - if (this.entity.canProtectAlly(testEntity)) { - return true; - } - } - } - - return false; - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() { - this.castTimer = 100; - this.world.setEntityState(this.entity, (byte) 53); - this.entity.getNavigator().clearPath(); - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - this.castTimer = 0; - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean shouldContinueExecuting() { - return castTimer > 0; - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - this.castTimer = Math.max(0, this.castTimer - 1); - if (castTimer == 0) { - AxisAlignedBB bb = new AxisAlignedBB(entity.posX - 0.5, entity.posY - 0.5, entity.posZ - 0.5, entity.posX + 0.5, entity.posY + 0.5, entity.posZ + 0.5).grow(5); - List list = world.getEntitiesWithinAABB(LivingEntity.class, bb, new EntityAspectedDemonBase.WillTypePredicate(entity.getType())); - for (LivingEntity testEntity : list) { - if (testEntity != this.entity) { - if (this.entity.applyProtectionToAlly(testEntity)) { - return; - } - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java deleted file mode 100644 index 76d47389..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIRetreatToHeal.java +++ /dev/null @@ -1,135 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityDemonBase; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.pathfinding.Path; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.util.EntityPredicates; -import net.minecraft.util.math.Vec3d; - -import java.util.List; - -public class EntityAIRetreatToHeal extends Goal { - private final Predicate canBeSeenSelector; - /** - * The entity we are attached to - */ - protected EntityDemonBase theEntity; - protected T closestLivingEntity; - private double farSpeed; - private double nearSpeed; - private double safeHealDistance = 3; - private float avoidDistance; - /** - * The PathEntity of our entity - */ - private Path entityPathEntity; - /** - * The PathNavigate of our entity - */ - private PathNavigator entityPathNavigate; - private Class classToAvoid; - private Predicate avoidTargetSelector; - - public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { - this(theEntityIn, classToAvoidIn, Predicates.alwaysTrue(), avoidDistanceIn, farSpeedIn, nearSpeedIn); - } - - public EntityAIRetreatToHeal(EntityDemonBase theEntityIn, Class classToAvoidIn, Predicate avoidTargetSelectorIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { - this.canBeSeenSelector = p_apply_1_ -> p_apply_1_.isEntityAlive() && EntityAIRetreatToHeal.this.theEntity.getEntitySenses().canSee(p_apply_1_); - this.theEntity = theEntityIn; - this.classToAvoid = classToAvoidIn; - this.avoidTargetSelector = avoidTargetSelectorIn; - this.avoidDistance = avoidDistanceIn; - this.farSpeed = farSpeedIn; - this.nearSpeed = nearSpeedIn; - this.entityPathNavigate = theEntityIn.getNavigator(); - this.setMutexBits(3); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - @Override - public boolean shouldExecute() { - if (!this.theEntity.shouldEmergencyHeal()) { - return false; - } - - //This part almost doesn't matter - List list = this.theEntity.getEntityWorld().getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double) this.avoidDistance, 3.0D, (double) this.avoidDistance), Predicates.and(EntityPredicates.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector)); - - if (list.isEmpty()) { - return true; //No entities nearby, so I can freely heal - } else { - this.closestLivingEntity = list.get(0); - Vec3d vec3d = RandomPositionGenerator.findRandomTargetBlockAwayFrom(this.theEntity, 16, 7, new Vec3d(this.closestLivingEntity.posX, this.closestLivingEntity.posY, this.closestLivingEntity.posZ)); - - if (vec3d == null) { - return false; //Nowhere to run, gotta fight! - } else if (this.closestLivingEntity.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < this.closestLivingEntity.getDistanceSq(this.theEntity)) { - return false; //I'll be headed off if I choose this direction. - } else { - this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); - return this.entityPathEntity != null; - } - } - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - @Override - public boolean shouldContinueExecuting() { - return this.theEntity.shouldEmergencyHeal();//!this.entityPathNavigate.noPath(); - } - - /** - * Execute a one shot task or start executing a continuous task - */ - @Override - public void startExecuting() { - if (this.entityPathEntity != null) { - this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); - } - } - - /** - * Resets the task - */ - @Override - public void resetTask() { - this.closestLivingEntity = null; - } - - /** - * Updates the task - */ - @Override - public void updateTask() { - if (this.closestLivingEntity != null) { - if (this.theEntity.getDistanceSq(this.closestLivingEntity) < 49.0D) { - this.theEntity.getNavigator().setSpeed(this.nearSpeed); - } else { - this.theEntity.getNavigator().setSpeed(this.farSpeed); - } - - if (this.theEntity.ticksExisted % 20 == 0 && this.theEntity.getDistanceSq(this.closestLivingEntity) >= safeHealDistance * safeHealDistance) { - healEntity(); - return; - } - } - - if (this.theEntity.ticksExisted % 20 == 0) { - healEntity(); - } - } - - public void healEntity() { - this.theEntity.performEmergencyHeal(2); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java deleted file mode 100644 index 43d4e275..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthRetreat.java +++ /dev/null @@ -1,96 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.pathfinding.Path; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.util.math.Vec3d; - -public class EntityAIStealthRetreat extends Goal { - private final double farSpeed; - private final double nearSpeed; - private final float avoidDistance; - /** - * The PathNavigate of our entity - */ - private final PathNavigator entityPathNavigate; - /** - * The entity we are attached to - */ - protected EntityCorruptedChicken entity; - /** - * The PathEntity of our entity - */ - private Path entityPathEntity; - private int ticksLeft = 0; - - public EntityAIStealthRetreat(EntityCorruptedChicken theEntityIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn) { - this.entity = theEntityIn; - this.avoidDistance = avoidDistanceIn; - this.farSpeed = farSpeedIn; - this.nearSpeed = nearSpeedIn; - this.entityPathNavigate = theEntityIn.getNavigator(); - this.setMutexBits(1); - } - - @Override - public boolean shouldExecute() { - if (this.entity.attackStateMachine == 2) { - LivingEntity attacked = this.entity.getAttackTarget(); - if (attacked == null) { - return false; - } - - Vec3d vec3d = RandomPositionGenerator.findRandomTargetBlockAwayFrom(this.entity, 16, 7, new Vec3d(attacked.posX, attacked.posY, attacked.posZ)); - - if (vec3d == null) { - return false; - } else if (attacked.getDistanceSq(vec3d.x, vec3d.y, vec3d.z) < attacked.getDistanceSq(this.entity)) { - return false; - } else { - this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.x, vec3d.y, vec3d.z); - return this.entityPathEntity != null; - } - } - - return false; - } - - @Override - public boolean shouldContinueExecuting() { - if (this.entityPathNavigate.noPath()) { - this.entity.attackStateMachine = 0; - return false; - } - - return this.entity.attackStateMachine == 2; - } - - @Override - public void resetTask() { - ticksLeft = 0; - } - - @Override - public void startExecuting() { - ticksLeft = this.entity.getEntityWorld().rand.nextInt(100) + 100; - this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); - } - - @Override - public void updateTask() { - ticksLeft--; - if (ticksLeft <= 0 || this.entity.getAttackTarget() == null) { - this.entity.attackStateMachine = 0; - return; - } - - if (this.entity.getDistanceSq(this.entity.getAttackTarget()) < 49.0D) { - this.entity.getNavigator().setSpeed(this.nearSpeed); - } else { - this.entity.getNavigator().setSpeed(this.farSpeed); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java b/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java deleted file mode 100644 index 7e25dd39..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/ai/EntityAIStealthTowardsTarget.java +++ /dev/null @@ -1,87 +0,0 @@ -package WayofTime.bloodmagic.entity.ai; - -import WayofTime.bloodmagic.entity.mob.EntityCorruptedChicken; -import net.minecraft.entity.CreatureEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.RandomPositionGenerator; -import net.minecraft.util.math.Vec3d; - -public class EntityAIStealthTowardsTarget extends Goal { - private final EntityCorruptedChicken entity; - private final double speed; - private double xPosition; - private double yPosition; - private double zPosition; - private int ticksLeft = 0; - - public EntityAIStealthTowardsTarget(EntityCorruptedChicken creatureIn, double speedIn) { - this.entity = creatureIn; - this.speed = speedIn; - this.setMutexBits(1); - } - - @Override - public boolean shouldExecute() { - if (this.entity.attackStateMachine != 0 || this.entity.getAttackTarget() == null) { - return false; - } - - LivingEntity target = this.entity.getAttackTarget(); - Vec3d vec3d = null; - if (target instanceof CreatureEntity) { - vec3d = RandomPositionGenerator.findRandomTarget((CreatureEntity) target, 10, 7); - } else { - vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); - } - - if (vec3d == null) { - return false; - } else { - ticksLeft = this.entity.getEntityWorld().rand.nextInt(200) + 100; - this.xPosition = vec3d.x; - this.yPosition = vec3d.y; - this.zPosition = vec3d.z; - return true; - } - } - - @Override - public void resetTask() { - ticksLeft = 0; - } - - @Override - public boolean shouldContinueExecuting() { - ticksLeft--; - if (ticksLeft <= 0) { - this.entity.attackStateMachine = 1; - } - - this.entity.cloak(); - - if (this.entity.getNavigator().noPath()) { - LivingEntity target = this.entity.getAttackTarget(); - Vec3d vec3d; - if (target instanceof CreatureEntity) { - vec3d = RandomPositionGenerator.findRandomTarget((CreatureEntity) target, 10, 7); - } else { - vec3d = RandomPositionGenerator.findRandomTarget(this.entity, 10, 7); - } - - if (vec3d != null) { - this.xPosition = vec3d.x; - this.yPosition = vec3d.y; - this.zPosition = vec3d.z; - this.entity.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); - } - } - - return this.entity.attackStateMachine == 0; - } - - @Override - public void startExecuting() { - this.entity.getNavigator().tryMoveToXYZ(this.xPosition, this.yPosition, this.zPosition, this.speed); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java deleted file mode 100644 index 4200cf0d..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityAspectedDemonBase.java +++ /dev/null @@ -1,242 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.gson.Serializers; -import com.google.common.base.Predicate; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; - -import java.util.Locale; - -public abstract class EntityAspectedDemonBase extends EntityDemonBase { - protected static final DataParameter TYPE = EntityDataManager.createKey(EntityAspectedDemonBase.class, Serializers.WILL_TYPE_SERIALIZER); - - public EntityAspectedDemonBase(World worldIn) { - super(worldIn); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataManager.register(TYPE, EnumDemonWillType.DEFAULT); - } - - public double getMeleeResist() { - return 0; - } - - public double getProjectileResist() { - return 0; - } - - public double getMagicResist() { - return 0; - } - - public double getBaseHP(EnumDemonWillType type) { - double baseHP = 40; - - switch (type) { - case DEFAULT: - break; - case CORROSIVE: - break; - case DESTRUCTIVE: - break; - case VENGEFUL: - baseHP *= 0.8; - break; - case STEADFAST: - baseHP *= 1.25; - break; - } - - return baseHP; - } - - public double getBaseMeleeDamage(EnumDemonWillType type) { - double baseDamage = 8; - - switch (type) { - case DEFAULT: - break; - case CORROSIVE: - baseDamage *= 0.8; - break; - case DESTRUCTIVE: - baseDamage *= 1.5; - break; - case VENGEFUL: - baseDamage *= 0.8; - break; - case STEADFAST: - baseDamage *= 0.6; - break; - } - - return baseDamage; - } - - public double getBaseSpeed(EnumDemonWillType type) { - double baseSpeed = 0.27; - - switch (type) { - case DEFAULT: - break; - case CORROSIVE: - break; - case DESTRUCTIVE: - break; - case VENGEFUL: - baseSpeed *= 1.3; - break; - case STEADFAST: - break; - } - - return baseSpeed; - } - - public double getBaseSprintModifier(EnumDemonWillType type) { - double baseSprint = 1; - - switch (type) { - case DEFAULT: - break; - case CORROSIVE: - break; - case DESTRUCTIVE: - break; - case VENGEFUL: - baseSprint *= 1.2; - break; - case STEADFAST: - break; - } - - return baseSprint; - } - - public double getBaseKnockbackResist(EnumDemonWillType type) { - double baseKnockback = 0; - - switch (type) { - case DEFAULT: - break; - case CORROSIVE: - break; - case DESTRUCTIVE: - break; - case VENGEFUL: - break; - case STEADFAST: - baseKnockback += 0.35; - break; - } - - return baseKnockback; - } - - public void applyEntityAttributes(EnumDemonWillType type) { - this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(this.getBaseHP(type)); - this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(this.getBaseSpeed(type)); - this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(this.getBaseMeleeDamage(type)); - this.getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(this.getBaseKnockbackResist(type)); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - if (this.isEntityInvulnerable(source)) { - return false; - } else { - float newAmount = amount; - if (source.isProjectile()) { - newAmount *= MathHelper.clamp(1 - getProjectileResist(), 0, 1); - } else { - newAmount *= MathHelper.clamp(1 - getMeleeResist(), 0, 1); - } - - if (source.isMagicDamage()) { - newAmount *= MathHelper.clamp(1 - getMagicResist(), 0, 1); - } - - return super.attackEntityFrom(source, newAmount); - } - } - - public EnumDemonWillType getType() { - return this.dataManager.get(TYPE); - } - - public void setType(EnumDemonWillType type) { - this.dataManager.set(TYPE, type); - this.applyEntityAttributes(type); - this.setCombatTask(); - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - - tag.putString(Constants.NBT.WILL_TYPE, this.getType().toString()); - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - setType(EnumDemonWillType.DEFAULT); - } else { - setType(EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH))); - } - } - - //Returns true if the inputted mob is on the same team. - public static class WillTypePredicate implements Predicate { - private final EnumDemonWillType type; - - public WillTypePredicate(EnumDemonWillType type) { - this.type = type; - } - - //Returns true if this mob is the same type. - @Override - public boolean apply(LivingEntity input) { - if (input instanceof EntityAspectedDemonBase) { - if (((EntityAspectedDemonBase) input).getType() == type) { - return true; - } - } - - return false; - } - } - - public class TeamAttackPredicate implements Predicate { - private final EntityAspectedDemonBase demon; - - public TeamAttackPredicate(EntityAspectedDemonBase demon) { - this.demon = demon; - } - - //Returns true if this mob can attack the inputted mob. - @Override - public boolean apply(LivingEntity input) { - if (input instanceof EntityAspectedDemonBase) { - if (((EntityAspectedDemonBase) input).getType() == demon.getType()) { - return false; - } - } - - return input != null; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java deleted file mode 100644 index 417d62d5..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedChicken.java +++ /dev/null @@ -1,202 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackStealthMelee; -import WayofTime.bloodmagic.entity.ai.EntityAIStealthRetreat; -import WayofTime.bloodmagic.entity.ai.EntityAIStealthTowardsTarget; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.potion.Effects; -import net.minecraft.util.SoundEvents; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.pathfinding.PathNodeType; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; - -public class EntityCorruptedChicken extends EntityAspectedDemonBase { - private final int attackPriority = 3; - public float wingRotation; - public float destPos; - public float oFlapSpeed; - public float oFlap; - public float wingRotDelta = 1.0F; - /** - * The time until the next egg is spawned. - */ - public int timeUntilNextEgg; - /* - * 0 means the chicken is casting stealth on itself when targeted, running - * to a random location near the target. 1 means the chicken is running - * after the target, attempting to attack it. 2 means it is running away - * from the target for a certain amount of time, before going back into - * state 0. - */ - public int attackStateMachine = 0; - private EntityAIAttackStealthMelee aiAttackOnCollide; - - public EntityCorruptedChicken(World world) { - this(world, EnumDemonWillType.DEFAULT); - } - - public EntityCorruptedChicken(World world, EnumDemonWillType type) { - super(world); - this.setSize(0.4F, 0.7F); - this.timeUntilNextEgg = this.rand.nextInt(600) + 600; - this.setPathPriority(PathNodeType.WATER, 0.0F); - - this.setType(type); - } - - protected void initEntityAI() { - this.tasks.addTask(0, new SwimGoal(this)); -// this.tasks.addTask(1, new EntityAIPanic(this, 1.4D)); - this.tasks.addTask(attackPriority, new EntityAIStealthTowardsTarget(this, 1)); - this.tasks.addTask(attackPriority, new EntityAIStealthRetreat(this, 6.0F, 1.4D, 1.4D)); - this.tasks.addTask(5, new RandomWalkingGoal(this, 1.0D)); - this.tasks.addTask(6, new LookAtGoal(this, PlayerEntity.class, 6.0F)); - this.tasks.addTask(7, new LookRandomlyGoal(this)); - - this.targetTasks.addTask(1, new NearestAttackableTargetGoal<>(this, PlayerEntity.class, true)); - this.targetTasks.addTask(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); - } - - @Override - public void setCombatTask() { - if (aiAttackOnCollide != null) { - this.tasks.removeTask(aiAttackOnCollide); - } - - aiAttackOnCollide = new EntityAIAttackStealthMelee(this, this.getBaseSprintModifier(getType()), false); - this.tasks.addTask(attackPriority, aiAttackOnCollide); - } - - public void cloak() { - this.addPotionEffect(new EffectInstance(Effects.INVISIBILITY, 50, 0, false, false)); - } - - @Override - public double getBaseHP(EnumDemonWillType type) { - return super.getBaseHP(type) * 0.5; - } - - @Override - public double getBaseMeleeDamage(EnumDemonWillType type) { - return super.getBaseMeleeDamage(type) * 2.5; - } - - @Override - public double getBaseSpeed(EnumDemonWillType type) { - return super.getBaseSpeed(type); - } - - @Override - public double getBaseSprintModifier(EnumDemonWillType type) { - return super.getBaseSprintModifier(type); - } - - @Override - public double getBaseKnockbackResist(EnumDemonWillType type) { - return super.getBaseKnockbackResist(type); - } - - @Override - public float getEyeHeight() { - return this.height; - } - - @Override - public void onLivingUpdate() { - super.onLivingUpdate(); - -// if (!worldObj.isRemote) -// System.out.println("State machine: " + this.attackStateMachine); - - this.oFlap = this.wingRotation; - this.oFlapSpeed = this.destPos; - this.destPos = (float) ((double) this.destPos + (double) (this.onGround ? -1 : 4) * 0.3D); - this.destPos = MathHelper.clamp(this.destPos, 0.0F, 1.0F); - - if (!this.onGround && this.wingRotDelta < 1.0F) { - this.wingRotDelta = 1.0F; - } - - this.wingRotDelta = (float) ((double) this.wingRotDelta * 0.9D); - - if (!this.onGround && this.motionY < 0.0D) { - this.motionY *= 0.6D; - } - - this.wingRotation += this.wingRotDelta * 2.0F; - - if (!this.getEntityWorld().isRemote && !this.isChild() && --this.timeUntilNextEgg <= 0) { - this.playSound(SoundEvents.ENTITY_CHICKEN_EGG, 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); - this.dropItem(Items.EGG, 1); - this.timeUntilNextEgg = this.rand.nextInt(600) + 600; - } - } - - @Override - public void fall(float distance, float damageMultiplier) { - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_CHICKEN_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_CHICKEN_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_CHICKEN_DEATH; - } - - @Override - protected float getSoundPitch() { - return super.getSoundPitch() * 0.5f; - } - - @Override - protected void playStepSound(BlockPos pos, Block blockIn) { - this.playSound(SoundEvents.ENTITY_CHICKEN_STEP, 0.15F, 1.0F); - } - - @Override - public void readEntityFromNBT(CompoundNBT compound) { - super.readEntityFromNBT(compound); - - if (compound.hasKey("EggLayTime")) { - this.timeUntilNextEgg = compound.getInt("EggLayTime"); - } - } - - @Override - public void writeEntityToNBT(CompoundNBT compound) { - super.writeEntityToNBT(compound); - compound.putInt("EggLayTime", this.timeUntilNextEgg); - } - - @Override - public void updatePassenger(Entity passenger) { - super.updatePassenger(passenger); - float f = MathHelper.sin(this.renderYawOffset * 0.017453292F); - float f1 = MathHelper.cos(this.renderYawOffset * 0.017453292F); - float f2 = 0.1F; - float f3 = 0.0F; - passenger.setPosition(this.posX + (double) (0.1F * f), this.posY + (double) (this.height * 0.5F) + passenger.getYOffset() + 0.0D, this.posZ - (double) (0.1F * f1)); - - if (passenger instanceof LivingEntity) { - ((LivingEntity) passenger).renderYawOffset = this.renderYawOffset; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java deleted file mode 100644 index 5e4acc3b..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSheep.java +++ /dev/null @@ -1,354 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIEatAndCorruptBlock; -import WayofTime.bloodmagic.entity.ai.EntityAIProtectAlly; -import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.entity.ILivingEntityData; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.item.DyeColor; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.DifficultyInstance; -import net.minecraft.world.World; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; - -public class EntityCorruptedSheep extends EntityAspectedDemonBase implements IShearable { - private static final DataParameter DYE_COLOR = EntityDataManager.createKey(EntityCorruptedSheep.class, DataSerializers.BYTE); - - private static final Map DYE_TO_RGB = Maps.newEnumMap(DyeColor.class); - public static int maxProtectionCooldown = 90 * 20; //90 second cooldown - - static { - DYE_TO_RGB.put(DyeColor.WHITE, new float[]{1.0F, 1.0F, 1.0F}); - DYE_TO_RGB.put(DyeColor.ORANGE, new float[]{0.85F, 0.5F, 0.2F}); - DYE_TO_RGB.put(DyeColor.MAGENTA, new float[]{0.7F, 0.3F, 0.85F}); - DYE_TO_RGB.put(DyeColor.LIGHT_BLUE, new float[]{0.4F, 0.6F, 0.85F}); - DYE_TO_RGB.put(DyeColor.YELLOW, new float[]{0.9F, 0.9F, 0.2F}); - DYE_TO_RGB.put(DyeColor.LIME, new float[]{0.5F, 0.8F, 0.1F}); - DYE_TO_RGB.put(DyeColor.PINK, new float[]{0.95F, 0.5F, 0.65F}); - DYE_TO_RGB.put(DyeColor.GRAY, new float[]{0.3F, 0.3F, 0.3F}); - DYE_TO_RGB.put(DyeColor.SILVER, new float[]{0.6F, 0.6F, 0.6F}); - DYE_TO_RGB.put(DyeColor.CYAN, new float[]{0.3F, 0.5F, 0.6F}); - DYE_TO_RGB.put(DyeColor.PURPLE, new float[]{0.5F, 0.25F, 0.7F}); - DYE_TO_RGB.put(DyeColor.BLUE, new float[]{0.2F, 0.3F, 0.7F}); - DYE_TO_RGB.put(DyeColor.BROWN, new float[]{0.4F, 0.3F, 0.2F}); - DYE_TO_RGB.put(DyeColor.GREEN, new float[]{0.4F, 0.5F, 0.2F}); - DYE_TO_RGB.put(DyeColor.RED, new float[]{0.6F, 0.2F, 0.2F}); - DYE_TO_RGB.put(DyeColor.BLACK, new float[]{0.1F, 0.1F, 0.1F}); - } - - private final int attackPriority = 3; - public int protectionCooldown = 0; - /** - * Used to control movement as well as wool regrowth. Set to 40 on - * handleHealthUpdate and counts down with each tick. - */ - private int sheepTimer; - private int castTimer = 0; - private EntityAIEatAndCorruptBlock entityAIEatGrass; - private EntityAIProtectAlly entityAIProtectAlly; - private MeleeAttackGoal aiAttackOnCollide; - - public EntityCorruptedSheep(World world) { - this(world, EnumDemonWillType.DEFAULT); - } - - public EntityCorruptedSheep(World world, EnumDemonWillType type) { - super(world); - this.setSize(0.9F, 1.3F); - - this.setType(type); - } - - protected void initEntityAI() { - this.entityAIEatGrass = new EntityAIEatAndCorruptBlock(this); - this.entityAIProtectAlly = new EntityAIProtectAlly(this); - - this.tasks.addTask(0, new SwimGoal(this)); - this.tasks.addTask(2, entityAIProtectAlly); - this.tasks.addTask(5, this.entityAIEatGrass); - this.tasks.addTask(6, new RandomWalkingGoal(this, 1.0D)); - this.tasks.addTask(7, new LookAtGoal(this, PlayerEntity.class, 6.0F)); - this.tasks.addTask(8, new LookRandomlyGoal(this)); - - this.targetTasks.addTask(1, new NearestAttackableTargetGoal<>(this, PlayerEntity.class, true)); - this.targetTasks.addTask(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); - } - - @Override - public void setCombatTask() { - if (aiAttackOnCollide != null) { - this.tasks.removeTask(aiAttackOnCollide); - } - - aiAttackOnCollide = new MeleeAttackGoal(this, this.getBaseSprintModifier(getType()), false); - this.tasks.addTask(attackPriority, aiAttackOnCollide); - } - - @Override - protected void updateAITasks() { - this.sheepTimer = this.entityAIEatGrass.getEatingGrassTimer(); - this.castTimer = this.entityAIProtectAlly.getCastTimer(); - super.updateAITasks(); - } - - @Override - public void onLivingUpdate() { - if (this.getEntityWorld().isRemote) { - this.sheepTimer = Math.max(0, this.sheepTimer - 1); - this.castTimer = Math.max(0, castTimer - 1); - if (this.castTimer == 70) { - this.playSound(this.getHurtSound(), this.getSoundVolume() * 2, this.getSoundPitch()); - } - } - - this.protectionCooldown = Math.max(0, this.protectionCooldown - 1); - - super.onLivingUpdate(); - } - - public boolean canProtectAlly(LivingEntity entity) { - return this.protectionCooldown <= 0 && entity.getHealth() < entity.getMaxHealth() && !entity.isPotionActive(Effects.RESISTANCE); - } - - public boolean applyProtectionToAlly(LivingEntity entity) { - if (canProtectAlly(entity)) { - entity.addPotionEffect(new EffectInstance(Effects.RESISTANCE, 20 * 20, 3)); - this.protectionCooldown = maxProtectionCooldown; - } - - return false; - } - - @Override - public double getBaseHP(EnumDemonWillType type) { - return super.getBaseHP(type) * 0.75; - } - - @Override - public double getBaseMeleeDamage(EnumDemonWillType type) { - return super.getBaseMeleeDamage(type) * 0.75; - } - - @Override - public double getBaseSpeed(EnumDemonWillType type) { - return super.getBaseSpeed(type); - } - - @Override - public double getBaseSprintModifier(EnumDemonWillType type) { - return super.getBaseSprintModifier(type); - } - - @Override - public double getBaseKnockbackResist(EnumDemonWillType type) { - return super.getBaseKnockbackResist(type) + 0.2; - } - - @Override - public double getMeleeResist() { - return 0.2; - } - - @Override - public double getProjectileResist() { - return 0.6; - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataManager.register(DYE_COLOR, (byte) 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void handleStatusUpdate(byte id) { - if (id == 10) { - this.sheepTimer = 40; - } else if (id == 53) { - this.castTimer = 100; - } else { - super.handleStatusUpdate(id); - } - } - - @SideOnly(Side.CLIENT) - public float getHeadRotationPointY(float partialTick) { - return this.sheepTimer <= 0 ? 0.0F : (this.sheepTimer >= 4 && this.sheepTimer <= 36 ? 1.0F : (this.sheepTimer < 4 ? ((float) this.sheepTimer - partialTick) / 4.0F : -((float) (this.sheepTimer - 40) - partialTick) / 4.0F)); - } - - @SideOnly(Side.CLIENT) - public float getHeadRotationAngleX(float partialTick) { - if (this.sheepTimer > 4 && this.sheepTimer <= 36) { - float f = ((float) (this.sheepTimer - 4) - partialTick) / 32.0F; - return ((float) Math.PI / 5F) + ((float) Math.PI * 7F / 100F) * MathHelper.sin(f * 28.7F); - } else { - return this.sheepTimer > 0 ? ((float) Math.PI / 5F) : this.rotationPitch * 0.017453292F; - } - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - tag.putBoolean("Sheared", this.getSheared()); - tag.putByte("Color", (byte) this.getFleeceColor().getMetadata()); - tag.putInt("protection", this.protectionCooldown); - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - this.setSheared(tag.getBoolean("Sheared")); - this.setFleeceColor(DyeColor.byMetadata(tag.getByte("Color"))); - this.protectionCooldown = tag.getInt("protection"); - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_SHEEP_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_SHEEP_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_SHEEP_DEATH; - } - - @Override - protected float getSoundPitch() { - return super.getSoundPitch() * 0.5f; - } - - @Override - protected void playStepSound(BlockPos pos, Block blockIn) { - this.playSound(SoundEvents.ENTITY_SHEEP_STEP, 0.15F, 1.0F); - } - - /** - * Gets the wool color of this sheep. - */ - public DyeColor getFleeceColor() { - return DyeColor.byMetadata(this.dataManager.get(DYE_COLOR) & 15); - } - - /** - * Sets the wool color of this sheep - */ - public void setFleeceColor(DyeColor color) { - byte b0 = this.dataManager.get(DYE_COLOR); - this.dataManager.set(DYE_COLOR, (byte) (b0 & 240 | color.getMetadata() & 15)); - } - - /** - * returns true if a sheeps wool has been sheared - */ - public boolean getSheared() { - return (this.dataManager.get(DYE_COLOR) & 16) != 0; - } - - /** - * make a sheep sheared if set to true - */ - public void setSheared(boolean sheared) { - byte b0 = this.dataManager.get(DYE_COLOR); - - if (sheared) { - this.dataManager.set(DYE_COLOR, (byte) (b0 | 16)); - } else { - this.dataManager.set(DYE_COLOR, (byte) (b0 & -17)); - } - } - - /** - * This function applies the benefits of growing back wool and faster - * growing up to the acting entity. (This function is used in the - * AIEatGrass) - */ - @Override - public void eatGrassBonus() { - this.setSheared(false); - - if (this.isChild()) { - this.heal(3); - } - } - - /** - * Called only once on an entity when first time spawned, via egg, mob - * spawner, natural spawning etc, but not called when entity is reloaded - * from nbt. Mainly used for initializing attributes and inventory - */ - @Override - public ILivingEntityData onInitialSpawn(DifficultyInstance difficulty, @Nullable ILivingEntityData livingdata) { - livingdata = super.onInitialSpawn(difficulty, livingdata); - this.setFleeceColor(getRandomSheepColor(this.getEntityWorld().rand)); - return livingdata; - } - - @Override - public float getEyeHeight() { - return 0.95F * this.height; - } - - @Override - public boolean isShearable(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos) { - return !this.getSheared() && !this.isChild(); - } - - @Override - public List onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos, int fortune) { - this.setSheared(true); - int i = 1 + this.rand.nextInt(3); - - List ret = new ArrayList<>(); - for (int j = 0; j < i; ++j) - ret.add(new ItemStack(Item.getItemFromBlock(Blocks.WOOL), 1, this.getFleeceColor().getMetadata())); - - this.playSound(SoundEvents.ENTITY_SHEEP_SHEAR, 1.0F, 1.0F); - return ret; - } - - public int getCastTimer() { - return castTimer; - } - - public static float[] getDyeRgb(DyeColor dyeColor) { - return DYE_TO_RGB.get(dyeColor); - } - - /** - * Chooses a "vanilla" sheep color based on the provided random. - */ - public static DyeColor getRandomSheepColor(Random random) { - int i = random.nextInt(100); - return i < 5 ? DyeColor.BLACK : (i < 10 ? DyeColor.GRAY : (i < 15 ? DyeColor.SILVER : (i < 18 ? DyeColor.BROWN : (random.nextInt(500) == 0 ? DyeColor.PINK : DyeColor.WHITE)))); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java deleted file mode 100644 index 1a35bddd..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedSpider.java +++ /dev/null @@ -1,202 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.entity.ai.EntityAIPickUpAlly; -import net.minecraft.block.Block; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.pathfinding.ClimberPathNavigator; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.potion.Effects; -import net.minecraft.util.SoundEvents; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class EntityCorruptedSpider extends EntityAspectedDemonBase { - private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityCorruptedSpider.class, DataSerializers.BYTE); - - public EntityCorruptedSpider(World world) { - this(world, EnumDemonWillType.DEFAULT); - } - - public EntityCorruptedSpider(World world, EnumDemonWillType type) { - super(world); - this.setSize(1.4F, 0.9F); - - this.setType(type); - } - - protected void initEntityAI() { - this.tasks.addTask(1, new SwimGoal(this)); - this.tasks.addTask(3, new LeapAtTargetGoal(this, 0.4F)); - this.tasks.addTask(3, new EntityAIPickUpAlly(this, 1, true)); - this.tasks.addTask(4, new EntityCorruptedSpider.AISpiderAttack(this)); - this.tasks.addTask(5, new RandomWalkingGoal(this, 0.8D)); - this.tasks.addTask(6, new LookAtGoal(this, PlayerEntity.class, 8.0F)); - this.tasks.addTask(6, new LookRandomlyGoal(this)); - this.targetTasks.addTask(1, new HurtByTargetGoal(this, false)); - - this.targetTasks.addTask(1, new NearestAttackableTargetGoal<>(this, PlayerEntity.class, true)); - this.targetTasks.addTask(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new EntityAspectedDemonBase.TeamAttackPredicate(this))); - } - - @Override - public double getBaseHP(EnumDemonWillType type) { - return super.getBaseHP(type); - } - - @Override - public double getBaseMeleeDamage(EnumDemonWillType type) { - return super.getBaseMeleeDamage(type); - } - - @Override - public double getBaseSpeed(EnumDemonWillType type) { - return super.getBaseSpeed(type); - } - - @Override - public double getBaseSprintModifier(EnumDemonWillType type) { - return super.getBaseSprintModifier(type); - } - - @Override - public double getBaseKnockbackResist(EnumDemonWillType type) { - return super.getBaseKnockbackResist(type); - } - - @Override - public double getMountedYOffset() { - return (double) (this.height * 0.5F); - } - - @Override - protected PathNavigator createNavigator(World worldIn) { - return new ClimberPathNavigator(this, worldIn); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataManager.register(CLIMBING, (byte) 0); - } - - @Override - public void onUpdate() { - super.onUpdate(); - - if (!this.getEntityWorld().isRemote) { - this.setBesideClimbableBlock(this.collidedHorizontally); - } - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_SPIDER_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_SPIDER_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_SPIDER_DEATH; - } - - @Override - protected float getSoundPitch() { - return super.getSoundPitch() * 0.5f; - } - - @Override - protected void playStepSound(BlockPos pos, Block blockIn) { - this.playSound(SoundEvents.ENTITY_SPIDER_STEP, 0.15F, 1.0F); - } - - @Override - public boolean isOnLadder() { - return this.isBesideClimbableBlock(); - } - - @Override - public void setInWeb() { - } - - @Override - public EnumCreatureAttribute getCreatureAttribute() { - return EnumCreatureAttribute.ARTHROPOD; - } - - @Override - public boolean isPotionApplicable(EffectInstance potioneffectIn) { - return potioneffectIn.getPotion() != Effects.POISON && super.isPotionApplicable(potioneffectIn); - } - - public boolean isBesideClimbableBlock() { - return (this.dataManager.get(CLIMBING) & 1) != 0; - } - - public void setBesideClimbableBlock(boolean climbing) { - byte b0 = this.dataManager.get(CLIMBING); - - if (climbing) { - b0 = (byte) (b0 | 1); - } else { - b0 = (byte) (b0 & -2); - } - - this.dataManager.set(CLIMBING, b0); - } - - @Override - public float getEyeHeight() { - return 0.65F; - } - - static class AISpiderAttack extends MeleeAttackGoal { - public AISpiderAttack(EntityCorruptedSpider spider) { - super(spider, 1.0D, true); - } - - /** - * Returns whether an in-progress EntityAIBase should continue executing - */ - public boolean shouldContinueExecuting() { - float f = this.attacker.getBrightness(); - - if (f >= 0.5F && this.attacker.getRNG().nextInt(100) == 0) { - this.attacker.setAttackTarget(null); - return false; - } else { - return super.shouldContinueExecuting(); - } - } - - protected double getAttackReachSqr(LivingEntity attackTarget) { - return (double) (4.0F + attackTarget.width); - } - } - - static class AISpiderTarget extends NearestAttackableTargetGoal { - public AISpiderTarget(EntityCorruptedSpider spider, Class classTarget) { - super(spider, classTarget, true); - } - - /** - * Returns whether the EntityAIBase should begin execution. - */ - public boolean shouldExecute() { - float f = this.taskOwner.getBrightness(); - return !(f >= 0.5F) && super.shouldExecute(); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java deleted file mode 100644 index cae520a3..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityCorruptedZombie.java +++ /dev/null @@ -1,185 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackRangedBow; -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.monster.CreeperEntity; -import net.minecraft.entity.monster.GhastEntity; -import net.minecraft.entity.monster.ZombiePigmanEntity; -import net.minecraft.entity.passive.IronGolemEntity; -import net.minecraft.entity.merchant.villager.VillagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BowItem; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; - -public class EntityCorruptedZombie extends EntityAspectedDemonBase { - private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); - private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.0D, false); - - private final int attackPriority = 3; - - public EntityCorruptedZombie(World worldIn) { - super(worldIn); - this.setSize(0.6F, 1.95F); -// ((PathNavigateGround) getNavigator()).setCanSwim(false); - this.tasks.addTask(0, new SwimGoal(this)); - this.tasks.addTask(attackPriority, aiAttackOnCollide); - this.tasks.addTask(5, new MoveTowardsRestrictionGoal(this, 1.0D)); - this.tasks.addTask(7, new RandomWalkingGoal(this, 1.0D)); - this.tasks.addTask(8, new LookAtGoal(this, PlayerEntity.class, 8.0F)); - this.tasks.addTask(8, new LookRandomlyGoal(this)); - - this.tasks.addTask(6, new MoveThroughVillageGoal(this, 1.0D, false)); - this.targetTasks.addTask(1, new HurtByTargetGoal(this, true, ZombiePigmanEntity.class)); - this.targetTasks.addTask(2, new NearestAttackableTargetGoal<>(this, PlayerEntity.class, true)); - this.targetTasks.addTask(3, new NearestAttackableTargetGoal<>(this, VillagerEntity.class, false)); - this.targetTasks.addTask(3, new NearestAttackableTargetGoal<>(this, IronGolemEntity.class, true)); - - this.setCombatTask(); -// this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityMob.class, 10, true, false, new TargetPredicate(this))); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(35.0D); - getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(40.0D); - getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(6.0D); - getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.27D); - this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue(2.0D); - } - - @Override - public void setCombatTask() { - if (!this.getEntityWorld().isRemote) { - this.tasks.removeTask(this.aiAttackOnCollide); - this.tasks.removeTask(this.aiArrowAttack); - ItemStack itemstack = this.getHeldItemMainhand(); - - if (!itemstack.isEmpty() && itemstack.getItem() instanceof BowItem) { - int i = 20; - - if (this.getEntityWorld().getDifficulty() != Difficulty.HARD) { - i = 40; - } - - this.aiArrowAttack.setAttackCooldown(i); - this.tasks.addTask(attackPriority, this.aiArrowAttack); - } else { - this.tasks.addTask(attackPriority, this.aiAttackOnCollide); - } - } - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); - } - - /** - * Redone from EntityMob to prevent despawning on peaceful. - */ - @Override - public boolean attackEntityAsMob(Entity attackedEntity) { - boolean flag = super.attackEntityAsMob(attackedEntity); - - if (flag) { - //EMPTY - - return true; - } else { - return false; - } - } - - /** - * @param toHeal - * @return Amount of Will consumed from the Aura to heal - */ - public double absorbWillFromAuraToHeal(double toHeal) { - if (getEntityWorld().isRemote) { - return 0; - } - - double healthMissing = this.getMaxHealth() - this.getHealth(); - if (healthMissing <= 0) { - return 0; - } - - double will = WorldDemonWillHandler.getCurrentWill(getEntityWorld(), getPosition(), getType()); - - toHeal = Math.min(healthMissing, Math.min(toHeal, will / getWillToHealth())); - if (toHeal > 0) { - this.heal((float) toHeal); - return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); - } - - return 0; - } - - public double getWillToHealth() { - return 2; - } - - @Override - protected boolean canDespawn() { - return !this.isTamed() && super.canDespawn(); - } - - public void onUpdate() { - if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { - absorbWillFromAuraToHeal(2); - } - - super.onUpdate(); - } - - //TODO: Change to fit the given AI - @Override - public boolean shouldAttackEntity(LivingEntity attacker, LivingEntity owner) { - return !(attacker instanceof CreeperEntity) && !(attacker instanceof GhastEntity) && super.shouldAttackEntity(attacker, owner); - } - - @Override - protected float getSoundPitch() { - return super.getSoundPitch() * 0.5f; - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_ZOMBIE_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_ZOMBIE_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_ZOMBIE_DEATH; - } - - @Override - protected void playStepSound(BlockPos pos, Block block) { - this.playSound(SoundEvents.ENTITY_ZOMBIE_STEP, 0.15F, 1.0F); - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() { - return 0.4F; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java deleted file mode 100644 index c43c7b98..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityDemonBase.java +++ /dev/null @@ -1,304 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.*; -import net.minecraft.entity.monster.CreeperEntity; -import net.minecraft.entity.monster.GhastEntity; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.passive.horse.HorseEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvents; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.server.management.PreYggdrasilConverter; -import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Explosion; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; - -import javax.annotation.Nullable; -import java.util.UUID; - -public class EntityDemonBase extends CreatureEntity implements IEntityOwnable { - protected static final DataParameter TAMED = EntityDataManager.createKey(EntityDemonBase.class, DataSerializers.BYTE); - protected static final DataParameter> OWNER_UNIQUE_ID = EntityDataManager.createKey(EntityDemonBase.class, DataSerializers.OPTIONAL_UNIQUE_ID); - - public EntityDemonBase(World worldIn) { - super(worldIn); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataManager.register(TAMED, (byte) 0); - this.dataManager.register(OWNER_UNIQUE_ID, Optional.absent()); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getAttributeMap().registerAttribute(SharedMonsterAttributes.ATTACK_DAMAGE); - } - - public void setCombatTask() { - - } - - @Override - public boolean isPotionApplicable(EffectInstance effect) { - return super.isPotionApplicable(effect); - } - - @Override - public void onLivingUpdate() { - this.updateArmSwingProgress(); - - super.onLivingUpdate(); - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); - } - - /** - * Redone from EntityMob to prevent despawning on peaceful. - */ - @Override - public boolean attackEntityAsMob(Entity attackedEntity) { - float f = (float) this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getAttributeValue(); - int i = 0; - - if (attackedEntity instanceof LivingEntity) { - f += EnchantmentHelper.getModifierForCreature(this.getHeldItemMainhand(), ((LivingEntity) attackedEntity).getCreatureAttribute()); - i += EnchantmentHelper.getKnockbackModifier(this); - } - - boolean flag = attackedEntity.attackEntityFrom(DamageSource.causeMobDamage(this), f); - - if (flag) { - if (i > 0) { - ((LivingEntity) attackedEntity).knockBack(this, (float) i * 0.5F, (double) MathHelper.sin(this.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(this.rotationYaw * 0.017453292F))); - this.motionX *= 0.6D; - this.motionZ *= 0.6D; - } - - int j = EnchantmentHelper.getFireAspectModifier(this); - - if (j > 0) { - attackedEntity.setFire(j * 4); - } - - if (attackedEntity instanceof PlayerEntity) { - PlayerEntity entityplayer = (PlayerEntity) attackedEntity; - ItemStack itemstack = this.getHeldItemMainhand(); - ItemStack itemstack1 = entityplayer.isHandActive() ? entityplayer.getActiveItemStack() : ItemStack.EMPTY; - - if (!itemstack.isEmpty() && !itemstack1.isEmpty() && itemstack.getItem() instanceof AxeItem && itemstack1.getItem() == Items.SHIELD) { - float f1 = 0.25F + (float) EnchantmentHelper.getEfficiencyModifier(this) * 0.05F; - - if (this.rand.nextFloat() < f1) { - entityplayer.getCooldownTracker().setCooldown(Items.SHIELD, 100); - this.getEntityWorld().setEntityState(entityplayer, (byte) 30); - } - } - } - - this.applyEnchantments(this, attackedEntity); - } - - return flag; - } - - @Override - public void setItemStackToSlot(EquipmentSlotType slotIn, ItemStack stack) { - super.setItemStackToSlot(slotIn, stack); - - if (!this.getEntityWorld().isRemote && slotIn == EquipmentSlotType.MAINHAND) { - this.setCombatTask(); - } - } - - public boolean isStationary() { - return false; - } - - public boolean absorbExplosion(Explosion explosion) { - return false; - } - - public void performEmergencyHeal(double toHeal) { - this.heal((float) toHeal); - - if (getEntityWorld() instanceof ServerWorld) { - ServerWorld server = (ServerWorld) getEntityWorld(); - server.spawnParticle(EnumParticleTypes.HEART, this.posX + (double) (this.rand.nextFloat() * this.width * 2.0F) - (double) this.width, this.posY + 0.5D + (double) (this.rand.nextFloat() * this.height), this.posZ + (double) (this.rand.nextFloat() * this.width * 2.0F) - (double) this.width, 7, 0.2, 0.2, 0.2, 0); - } - } - - public boolean shouldEmergencyHeal() { - return this.getHealth() < this.getMaxHealth() * 0.5; - } - - @Override - protected boolean canDespawn() { - return !this.isTamed() && super.canDespawn(); - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - - if (this.getOwnerId() == null) { - tag.putString("OwnerUUID", ""); - } else { - tag.putString("OwnerUUID", this.getOwnerId().toString()); - } - - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - - String s; - - if (tag.hasKey("OwnerUUID", 8)) { - s = tag.getString("OwnerUUID"); - } else { - String s1 = tag.getString("Owner"); - s = PreYggdrasilConverter.convertMobOwnerIfNeeded(this.getServer(), s1); - } - - if (!s.isEmpty()) { - try { - this.setOwnerId(UUID.fromString(s)); - this.setTamed(true); - } catch (Throwable var4) { - this.setTamed(false); - } - } - - this.setCombatTask(); - } - - //TODO: Change to fit the given AI - public boolean shouldAttackEntity(LivingEntity attacker, LivingEntity owner) { - if (!(attacker instanceof CreeperEntity) && !(attacker instanceof GhastEntity)) { - if (attacker instanceof IEntityOwnable) { - IEntityOwnable entityOwnable = (IEntityOwnable) attacker; - - if (entityOwnable.getOwner() == owner) { - return false; - } - } - - return !(attacker instanceof PlayerEntity && owner instanceof PlayerEntity && !((PlayerEntity) owner).canAttackPlayer((PlayerEntity) attacker)) && (!(attacker instanceof HorseEntity) || !((HorseEntity) attacker).isTame()); - } else { - return false; - } - } - - public void attackEntityWithRangedAttack(LivingEntity target, float velocity) { - - } - - public boolean isTamed() { - return (this.dataManager.get(TAMED) & 4) != 0; - } - - public void setTamed(boolean tamed) { - byte b0 = this.dataManager.get(TAMED); - - if (tamed) { - this.dataManager.set(TAMED, (byte) (b0 | 4)); - } else { - this.dataManager.set(TAMED, (byte) (b0 & -5)); - } - -// this.setupTamedAI(); - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_COW_AMBIENT; - } - - @Nullable - @Override - protected SoundEvent getHurtSound(DamageSource damageSourceIn) { - return getHurtSound(); - } - - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_COW_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_COW_DEATH; - } - - @Override - protected void playStepSound(BlockPos pos, Block block) { - this.playSound(SoundEvents.ENTITY_COW_STEP, 0.15F, 1.0F); - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() { - return 0.4F; - } - - @Override - public UUID getOwnerId() { - return (this.dataManager.get(OWNER_UNIQUE_ID)).orNull(); - } - - public void setOwnerId(UUID uuid) { - this.dataManager.set(OWNER_UNIQUE_ID, Optional.fromNullable(uuid)); - } - - @Override - public LivingEntity getOwner() { - try { - UUID uuid = this.getOwnerId(); - return uuid == null ? null : this.getEntityWorld().getPlayerEntityByUUID(uuid); - } catch (IllegalArgumentException var2) { - return null; - } - } - - public void setOwner(PlayerEntity player) { - setOwnerId(player.getUniqueID()); - } - - public class TargetPredicate implements Predicate { - EntityDemonBase entity; - - public TargetPredicate(EntityDemonBase entity) { - this.entity = entity; - } - - @Override - public boolean apply(MonsterEntity input) { - return entity.shouldAttackEntity(input, this.entity.getOwner()); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java deleted file mode 100644 index 40ca056f..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntityMimic.java +++ /dev/null @@ -1,327 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.block.BlockMimic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.entity.ai.EntityAIMimicReform; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.util.StateUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.EnumCreatureAttribute; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.passive.IronGolemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.pathfinding.ClimberPathNavigator; -import net.minecraft.pathfinding.PathNavigator; -import net.minecraft.potion.Effects; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.network.datasync.EntityDataManager; -import net.minecraft.potion.EffectInstance; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.DamageSource; -import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; - -public class EntityMimic extends EntityDemonBase { - /** - * Copy of EntitySpider's AI (should be pretty evident...) - */ - private static final DataParameter CLIMBING = EntityDataManager.createKey(EntityMimic.class, DataSerializers.BYTE); - - public boolean dropItemsOnBreak = true; - public CompoundNBT tileTag = new CompoundNBT(); - public int metaOfReplacedBlock = 0; - public BlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); - public int playerCheckRadius = 5; - - public EntityMimic(World worldIn) { - super(worldIn); - this.setSize(0.9F, 0.9F); - - this.tasks.addTask(1, new SwimGoal(this)); - this.tasks.addTask(3, new LeapAtTargetGoal(this, 0.4F)); - this.tasks.addTask(4, new EntityMimic.AISpiderAttack(this)); - this.tasks.addTask(5, new MoveTowardsRestrictionGoal(this, 1)); - this.tasks.addTask(6, new RandomWalkingGoal(this, 0.8D)); - this.tasks.addTask(8, new LookAtGoal(this, PlayerEntity.class, 8.0F)); - this.tasks.addTask(8, new LookRandomlyGoal(this)); - this.tasks.addTask(7, new EntityAIMimicReform(this)); - - this.targetTasks.addTask(1, new HurtByTargetGoal(this, false)); - this.targetTasks.addTask(2, new EntityMimic.AISpiderTarget(this, PlayerEntity.class)); - this.targetTasks.addTask(3, new EntityMimic.AISpiderTarget(this, IronGolemEntity.class)); - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - - tag.putBoolean("dropItemsOnBreak", dropItemsOnBreak); - tag.put("tileTag", tileTag); - tag.putInt("metaOfReplacedBlock", metaOfReplacedBlock); - tag.putInt("playerCheckRadius", playerCheckRadius); - tag.putString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - - dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); - tileTag = tag.getCompound("tileTag"); - metaOfReplacedBlock = tag.getInt("metaOfReplacedBlock"); - playerCheckRadius = tag.getInt("playerCheckRadius"); - stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); - } - - public ItemStack getMimicItemStack() { - return this.getItemStackFromSlot(EquipmentSlotType.CHEST); - } - - public void setMimicItemStack(ItemStack stack) { - this.setItemStackToSlot(EquipmentSlotType.CHEST, stack); - } - - public boolean spawnHeldBlockOnDeath(World world, BlockPos pos) { - return world.isAirBlock(pos) && TileMimic.replaceMimicWithBlockActual(world, pos, getMimicItemStack(), tileTag, stateOfReplacedBlock); - } - - public boolean spawnMimicBlockAtPosition(World world, BlockPos pos) { - if (world.isAirBlock(pos)) { - BlockState mimicState = RegistrarBloodMagicBlocks.MIMIC.getStateFromMeta(BlockMimic.sentientMimicMeta); - world.setBlockState(pos, mimicState, 3); - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) { - TileMimic mimic = (TileMimic) tile; - mimic.setReplacedState(this.stateOfReplacedBlock); - mimic.tileTag = tileTag; - mimic.setInventorySlotContents(0, getMimicItemStack()); - mimic.dropItemsOnBreak = dropItemsOnBreak; - mimic.refreshTileEntity(); - } - - return true; - } - - return false; - } - - public void initializeMimic(ItemStack heldStack, CompoundNBT tileTag, boolean dropItemsOnBreak, BlockState stateOfReplacedBlock, int playerCheckRadius, BlockPos homePosition) { - this.setMimicItemStack(heldStack); - this.tileTag = tileTag; - this.dropItemsOnBreak = dropItemsOnBreak; - this.stateOfReplacedBlock = stateOfReplacedBlock; - this.playerCheckRadius = playerCheckRadius; - this.setHomePosAndDistance(homePosition, 2); //TODO: Save this. - } - - public boolean reformIntoMimicBlock(BlockPos centerPos) { - int horizontalRadius = 1; - int verticalRadius = 1; - - for (int hR = 0; hR <= horizontalRadius; hR++) { - for (int vR = 0; vR <= verticalRadius; vR++) { - for (int i = -hR; i <= hR; i++) { - for (int k = -hR; k <= hR; k++) { - for (int j = -vR; j <= vR; j += 2 * vR + (vR > 0 ? 0 : 1)) { - if (!(Math.abs(i) == hR || Math.abs(k) == hR)) { - continue; - } - - BlockPos newPos = centerPos.add(i, j, k); - if (spawnMimicBlockAtPosition(getEntityWorld(), newPos)) { - return true; - } - } - } - } - } - } - - return false; - } - - @Override - public void onDeath(DamageSource cause) { - super.onDeath(cause); - - if (!getEntityWorld().isRemote) { - BlockPos centerPos = this.getPosition(); - - int horizontalRadius = 1; - int verticalRadius = 1; - - for (int hR = 0; hR <= horizontalRadius; hR++) { - for (int vR = 0; vR <= verticalRadius; vR++) { - for (int i = -hR; i <= hR; i++) { - for (int k = -hR; k <= hR; k++) { - for (int j = -vR; j <= vR; j += 2 * vR + (vR > 0 ? 0 : 1)) { - if (!(Math.abs(i) == hR || Math.abs(k) == hR)) { - continue; - } - - BlockPos newPos = centerPos.add(i, j, k); - if (spawnHeldBlockOnDeath(getEntityWorld(), newPos)) { - return; - } - } - } - } - } - } - } - } - - /** - * Returns the Y offset from the entity's position for any entity riding - * this one. - */ - @Override - public double getMountedYOffset() { - return (double) (this.height * 0.5F); - } - - /** - * Returns new PathNavigateGround instance - */ - @Override - protected PathNavigator createNavigator(World worldIn) { - return new ClimberPathNavigator(this, worldIn); - } - - @Override - protected void entityInit() { - super.entityInit(); - this.dataManager.register(CLIMBING, (byte) 0); -// this.dataManager.register(ITEMSTACK, null); - } - - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() { - if (!this.getEntityWorld().isRemote && this.getEntityWorld().getDifficulty() == Difficulty.PEACEFUL) { - if (reformIntoMimicBlock(this.getPosition())) { - this.setDead(); - } - } - - super.onUpdate(); - - if (!this.getEntityWorld().isRemote) { - this.setBesideClimbableBlock(this.collidedHorizontally); - } - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(16.0D); - this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.3D); - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_SPIDER_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_SPIDER_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_SPIDER_DEATH; - } - - @Override - protected void playStepSound(BlockPos pos, Block blockIn) { - this.playSound(SoundEvents.ENTITY_SPIDER_STEP, 0.15F, 1.0F); - } - - /** - * returns true if this entity is by a ladder, false otherwise - */ - @Override - public boolean isOnLadder() { - return this.isBesideClimbableBlock(); - } - - /** - * Sets the Entity inside a web block. - */ - @Override - public void setInWeb() { - - } - - /** - * Get this Entity's EnumCreatureAttribute - */ - @Override - public EnumCreatureAttribute getCreatureAttribute() { - return EnumCreatureAttribute.ARTHROPOD; - } - - @Override - public boolean isPotionApplicable(EffectInstance potioneffectIn) { - return potioneffectIn.getPotion() != Effects.POISON && super.isPotionApplicable(potioneffectIn); - } - - /** - * Returns true if the WatchableObject (Byte) is 0x01 otherwise returns - * false. The WatchableObject is updated using setBesideClimableBlock. - */ - public boolean isBesideClimbableBlock() { - return (this.dataManager.get(CLIMBING) & 1) != 0; - } - - /** - * Updates the WatchableObject (Byte) created in entityInit(), setting it to - * 0x01 if par1 is true or 0x00 if it is false. - */ - public void setBesideClimbableBlock(boolean climbing) { - byte b0 = this.dataManager.get(CLIMBING); - - if (climbing) { - b0 = (byte) (b0 | 1); - } else { - b0 = (byte) (b0 & -2); - } - - this.dataManager.set(CLIMBING, b0); - } - - public float getEyeHeight() { - return 0.65F; - } - - static class AISpiderAttack extends MeleeAttackGoal { - public AISpiderAttack(EntityMimic spider) { - super(spider, 1.0D, true); - } - - @Override - protected double getAttackReachSqr(LivingEntity attackTarget) { - return (double) (4.0F + attackTarget.width); - } - } - - static class AISpiderTarget extends NearestAttackableTargetGoal { - public AISpiderTarget(EntityMimic spider, Class classTarget) { - super(spider, classTarget, true); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java b/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java deleted file mode 100644 index f2b2f999..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/mob/EntitySentientSpecter.java +++ /dev/null @@ -1,483 +0,0 @@ -package WayofTime.bloodmagic.entity.mob; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.ai.EntityAIAttackRangedBow; -import WayofTime.bloodmagic.entity.ai.EntityAIFollowOwner; -import WayofTime.bloodmagic.entity.ai.*; -import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtByTarget; -import WayofTime.bloodmagic.entity.ai.EntityAIOwnerHurtTarget; -import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import net.minecraft.block.Block; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.*; -import net.minecraft.entity.CreatureEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.*; -import net.minecraft.entity.monster.CreeperEntity; -import net.minecraft.entity.monster.GhastEntity; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ArrowEntity; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.util.*; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.BowItem; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Effect; -import net.minecraft.util.Hand; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.*; -import net.minecraft.world.Difficulty; -import net.minecraft.world.ServerWorld; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -public class EntitySentientSpecter extends EntityDemonBase { - private final EntityAIAttackRangedBow aiArrowAttack = new EntityAIAttackRangedBow(this, 1.0D, 20, 15.0F); - private final MeleeAttackGoal aiAttackOnCollide = new MeleeAttackGoal(this, 1.0D, false); - private final int attackPriority = 3; - protected EnumDemonWillType type = EnumDemonWillType.DESTRUCTIVE; - protected boolean wasGivenSentientArmour = false; - - public EntitySentientSpecter(World worldIn) { - super(worldIn); - this.setSize(0.6F, 1.95F); -// ((PathNavigateGround) getNavigator()).setCanSwim(false); - this.tasks.addTask(0, new SwimGoal(this)); - this.tasks.addTask(2, new EntityAIRetreatToHeal<>(this, CreatureEntity.class, 6.0F, 1.0D, 1.2D)); - this.tasks.addTask(attackPriority, aiAttackOnCollide); - this.tasks.addTask(4, new EntityAIGrabEffectsFromOwner(this, 2.0D, 1.0F)); - this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F)); - this.tasks.addTask(6, new RandomWalkingGoal(this, 1.0D)); - this.tasks.addTask(7, new LookAtGoal(this, PlayerEntity.class, 6.0F)); - this.tasks.addTask(8, new LookRandomlyGoal(this)); - - this.targetTasks.addTask(1, new EntityAIOwnerHurtByTarget(this)); - this.targetTasks.addTask(2, new EntityAIOwnerHurtTarget(this)); - this.targetTasks.addTask(3, new NearestAttackableTargetGoal<>(this, MonsterEntity.class, true)); - - this.targetTasks.addTask(4, new EntityAIHurtByTargetIgnoreTamed(this, false)); - - this.setCombatTask(); -// this.targetTasks.addTask(8, new EntityAINearestAttackableTarget(this, EntityMob.class, 10, true, false, new TargetPredicate(this))); - } - - @Override - protected void applyEntityAttributes() { - super.applyEntityAttributes(); - getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(40.0D); - getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(6.0D); - getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.27D); - } - - @Override - public void setCombatTask() { - if (!this.getEntityWorld().isRemote) { - this.tasks.removeTask(this.aiAttackOnCollide); - this.tasks.removeTask(this.aiArrowAttack); - ItemStack itemstack = this.getHeldItemMainhand(); - - if (!itemstack.isEmpty() && itemstack.getItem() instanceof BowItem) { - int i = 20; - - if (this.getEntityWorld().getDifficulty() != Difficulty.HARD) { - i = 40; - } - - this.aiArrowAttack.setAttackCooldown(i); - this.tasks.addTask(attackPriority, this.aiArrowAttack); - } else { - this.tasks.addTask(attackPriority, this.aiAttackOnCollide); - } - } - } - - @Override - public boolean isPotionApplicable(EffectInstance effect) { - Effect potion = effect.getPotion(); - - //Specter cannot be healed by normal means - return !(potion == Effects.REGENERATION || potion == Effects.INSTANT_HEALTH) && super.isPotionApplicable(effect); - } - - public boolean canStealEffectFromOwner(LivingEntity owner, EffectInstance effect) { - return effect.getPotion().isBadEffect() && this.type == EnumDemonWillType.CORROSIVE; - } - - public boolean canStealEffectFromOwner(LivingEntity owner) { - if (this.type != EnumDemonWillType.CORROSIVE) { - return false; - } - - for (EffectInstance eff : owner.getActivePotionEffects()) { - if (canStealEffectFromOwner(owner, eff)) { - return true; - } - } - - return false; - } - - public boolean stealEffectsFromOwner(LivingEntity owner) { - if (this.type != EnumDemonWillType.CORROSIVE) { - return false; - } - - boolean hasStolenEffect = false; - - List removedEffects = new ArrayList<>(); - - for (EffectInstance eff : owner.getActivePotionEffects()) { - if (canStealEffectFromOwner(owner, eff)) { - removedEffects.add(eff); - hasStolenEffect = true; - } - } - - for (EffectInstance eff : removedEffects) { - owner.removePotionEffect(eff.getPotion()); - this.addPotionEffect(eff); - } - - return hasStolenEffect; - } - - public boolean applyNegativeEffectsToAttacked(LivingEntity attackedEntity, float percentTransmitted) { - boolean hasProvidedEffect = false; - List removedEffects = new ArrayList<>(); - for (EffectInstance eff : this.getActivePotionEffects()) { - if (eff.getPotion().isBadEffect() && attackedEntity.isPotionApplicable(eff)) { - if (!attackedEntity.isPotionActive(eff.getPotion())) { - removedEffects.add(eff); - hasProvidedEffect = true; - } else { - EffectInstance activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); - if (activeEffect.getAmplifier() < eff.getAmplifier() || activeEffect.getDuration() < eff.getDuration() * percentTransmitted) { - removedEffects.add(eff); - hasProvidedEffect = true; - } - } - } - } - - for (EffectInstance eff : removedEffects) { - if (!attackedEntity.isPotionActive(eff.getPotion())) { - EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); - attackedEntity.addPotionEffect(newEffect); - - EffectInstance newSentientEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); - this.removePotionEffect(eff.getPotion()); - this.addPotionEffect(newSentientEffect); - } else { - EffectInstance activeEffect = attackedEntity.getActivePotionEffect(eff.getPotion()); - - EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), activeEffect.getIsAmbient(), activeEffect.doesShowParticles()); - attackedEntity.addPotionEffect(newEffect); - - EffectInstance newSentientEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); - this.removePotionEffect(eff.getPotion()); - this.addPotionEffect(newSentientEffect); - } - } - - return hasProvidedEffect; - } - - public List getPotionEffectsForArrowRemovingDuration(float percentTransmitted) { - List arrowEffects = new ArrayList<>(); - - if (type != EnumDemonWillType.CORROSIVE) { - return arrowEffects; - } - - List removedEffects = new ArrayList<>(); - for (EffectInstance eff : this.getActivePotionEffects()) { - if (eff.getPotion().isBadEffect()) { - removedEffects.add(eff); - } - } - - for (EffectInstance eff : removedEffects) { - EffectInstance newEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * percentTransmitted), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); - arrowEffects.add(newEffect); - - EffectInstance newSentientEffect = new EffectInstance(eff.getPotion(), (int) (eff.getDuration() * (1 - percentTransmitted)), eff.getAmplifier(), eff.getIsAmbient(), eff.doesShowParticles()); - this.removePotionEffect(eff.getPotion()); - this.addPotionEffect(newSentientEffect); - } - - return arrowEffects; - } - - @Override - public boolean attackEntityFrom(DamageSource source, float amount) { - return !this.isEntityInvulnerable(source) && super.attackEntityFrom(source, amount); - } - - /** - * Redone from EntityMob to prevent despawning on peaceful. - */ - @Override - public boolean attackEntityAsMob(Entity attackedEntity) { - boolean flag = super.attackEntityAsMob(attackedEntity); - - if (flag) { - if (this.type == EnumDemonWillType.CORROSIVE && attackedEntity instanceof LivingEntity) { -// ((EntityLivingBase) attackedEntity).addPotionEffect(new PotionEffect(MobEffects.WITHER, 200)); - applyNegativeEffectsToAttacked((LivingEntity) attackedEntity, 1); - } - - return true; - } else { - return false; - } - } - - @Override - public void onDeath(DamageSource cause) { - super.onDeath(cause); - - if (!getEntityWorld().isRemote && !getHeldItemMainhand().isEmpty()) { - this.entityDropItem(getHeldItemMainhand(), 0); - } - } - - @Override - public boolean isStationary() { - return false; - } - - @Override - public boolean absorbExplosion(Explosion explosion) { - if (this.type == EnumDemonWillType.DESTRUCTIVE) { - this.addPotionEffect(new EffectInstance(Effects.STRENGTH, 600, 1)); - - explosion.doExplosionB(true); - - return true; - } - - return false; - } - - @Override - public boolean processInteract(PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (this.isTamed() && player.equals(this.getOwner()) && hand == Hand.MAIN_HAND) { - if (stack.isEmpty() && player.isSneaking()) //Should return to the entity - { - if (!getEntityWorld().isRemote) { - if (!getHeldItemMainhand().isEmpty()) { - this.entityDropItem(getHeldItemMainhand(), 0); - } - - if (!getHeldItemOffhand().isEmpty()) { - this.entityDropItem(getHeldItemOffhand(), 0); - } - - if (wasGivenSentientArmour) { - this.entityDropItem(new ItemStack(RegistrarBloodMagicItems.SENTIENT_ARMOUR_GEM), 0); - } - - this.setDead(); - } - } - } - - return super.processInteract(player, hand); - } - - public boolean isEntityInvulnerable(DamageSource source) { - return super.isEntityInvulnerable(source) && (this.type == EnumDemonWillType.DESTRUCTIVE && source.isExplosion()); - } - - @Override - public void performEmergencyHeal(double toHeal) { - this.heal((float) toHeal); - - if (getEntityWorld() instanceof ServerWorld) { - ServerWorld server = (ServerWorld) getEntityWorld(); - server.spawnParticle(EnumParticleTypes.HEART, this.posX + (double) (this.rand.nextFloat() * this.width * 2.0F) - (double) this.width, this.posY + 0.5D + (double) (this.rand.nextFloat() * this.height), this.posZ + (double) (this.rand.nextFloat() * this.width * 2.0F) - (double) this.width, 7, 0.2, 0.2, 0.2, 0); - } - } - - /** - * @param toHeal - * @return Amount of Will consumed from the Aura to heal - */ - public double absorbWillFromAuraToHeal(double toHeal) { - if (getEntityWorld().isRemote) { - return 0; - } - - double healthMissing = this.getMaxHealth() - this.getHealth(); - if (healthMissing <= 0) { - return 0; - } - - double will = WorldDemonWillHandler.getCurrentWill(getEntityWorld(), getPosition(), getType()); - - toHeal = Math.min(healthMissing, Math.min(toHeal, will / getWillToHealth())); - if (toHeal > 0) { - this.heal((float) toHeal); - return WorldDemonWillHandler.drainWill(getEntityWorld(), getPosition(), getType(), toHeal * getWillToHealth(), true); - } - - return 0; - } - - public double getWillToHealth() { - return 2; - } - - @Override - protected boolean canDespawn() { - return !this.isTamed() && super.canDespawn(); - } - - public void onUpdate() { - if (!this.getEntityWorld().isRemote && this.ticksExisted % 20 == 0) { - absorbWillFromAuraToHeal(2); - } - - super.onUpdate(); - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - - tag.putBoolean("sentientArmour", wasGivenSentientArmour); - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - type = EnumDemonWillType.DEFAULT; - } else { - type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - wasGivenSentientArmour = tag.getBoolean("sentientArmour"); - - this.setCombatTask(); - } - - //TODO: Change to fit the given AI - @Override - public boolean shouldAttackEntity(LivingEntity attacker, LivingEntity owner) { - if (!(attacker instanceof CreeperEntity) && !(attacker instanceof GhastEntity)) { - return super.shouldAttackEntity(attacker, owner); - } - return false; - } - - @Override - public void attackEntityWithRangedAttack(LivingEntity target, float velocity) { - ItemStack heldStack = this.getItemStackFromSlot(EquipmentSlotType.MAINHAND); - if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW) { - ArrowEntity arrowEntity = ((ItemSentientBow) heldStack.getItem()).getArrowEntity(getEntityWorld(), heldStack, target, this, velocity); - if (arrowEntity != null) { - List effects = getPotionEffectsForArrowRemovingDuration(0.2f); - for (EffectInstance eff : effects) { - arrowEntity.addEffect(eff); - } - - this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.getEntityWorld().spawnEntity(arrowEntity); - } - } else { - ArrowEntity entitytippedarrow = new ArrowEntity(this.getEntityWorld(), this); //TODO: Change to an arrow created by the Sentient Bow - double d0 = target.posX - this.posX; - double d1 = target.getEntityBoundingBox().minY + (double) (target.height / 3.0F) - entitytippedarrow.posY; - double d2 = target.posZ - this.posZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entitytippedarrow.shoot(d0, d1 + d3 * 0.2, d2, 1.6F, 0); //TODO: Yes, it is an accurate arrow. Don't be hatin' - int i = EnchantmentHelper.getMaxEnchantmentLevel(Enchantments.POWER, this); - int j = EnchantmentHelper.getMaxEnchantmentLevel(Enchantments.PUNCH, this); - entitytippedarrow.setDamage((double) (velocity * 2.0F) + this.rand.nextGaussian() * 0.25D + (double) ((float) this.getEntityWorld().getDifficulty().getId() * 0.11F)); - - if (i > 0) { - entitytippedarrow.setDamage(entitytippedarrow.getDamage() + (double) i * 0.5D + 0.5D); - } - - if (j > 0) { - entitytippedarrow.setKnockbackStrength(j); - } - - boolean burning = this.isBurning(); - burning = burning || EnchantmentHelper.getMaxEnchantmentLevel(Enchantments.FLAME, this) > 0; - - if (burning) { - entitytippedarrow.setFire(100); - } - - if (true) //TODO: Add potion effects to the arrows - { - entitytippedarrow.addEffect(new EffectInstance(Effects.SLOWNESS, 600)); - } - - this.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRNG().nextFloat() * 0.4F + 0.8F)); - this.getEntityWorld().spawnEntity(entitytippedarrow); - } - } - - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.ENTITY_COW_AMBIENT; - } - - @Override - protected SoundEvent getHurtSound() { - return SoundEvents.ENTITY_COW_HURT; - } - - @Override - protected SoundEvent getDeathSound() { - return SoundEvents.ENTITY_COW_DEATH; - } - - @Override - protected void playStepSound(BlockPos pos, Block block) { - this.playSound(SoundEvents.ENTITY_COW_STEP, 0.15F, 1.0F); - } - - /** - * Returns the volume for the sounds this mob makes. - */ - @Override - protected float getSoundVolume() { - return 0.4F; - } - - public EnumDemonWillType getType() { - return type; - } - - public void setType(EnumDemonWillType type) { - this.type = type; - } - - public boolean isWasGivenSentientArmour() { - return wasGivenSentientArmour; - } - - public void setWasGivenSentientArmour(boolean wasGivenSentientArmour) { - this.wasGivenSentientArmour = wasGivenSentientArmour; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java index bb8b8cab..f5ce9da8 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityBloodLight.java @@ -1,171 +1,100 @@ -package WayofTime.bloodmagic.entity.projectile; +package wayoftime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import io.netty.buffer.ByteBuf; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; +import net.minecraft.block.BlockState; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.projectile.ThrowableEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Direction; +import net.minecraft.entity.projectile.ProjectileHelper; +import net.minecraft.entity.projectile.ProjectileItemEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.IPacket; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ItemParticleData; +import net.minecraft.particles.ParticleTypes; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; -import net.minecraftforge.fml.common.registry.IThrowableEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.NetworkHooks; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes; -public class EntityBloodLight extends ThrowableEntity implements IThrowableEntity, IEntityAdditionalSpawnData { - public LivingEntity shootingEntity; - protected int ticksInAir = 0; - protected int maxTicksInAir = 600; +public class EntityBloodLight extends ProjectileItemEntity +{ + public EntityBloodLight(EntityType p_i50159_1_, World p_i50159_2_) + { + super(p_i50159_1_, p_i50159_2_); + } - public EntityBloodLight(World world) { - super(world); - this.setSize(0.5F, 0.5F); - } + public EntityBloodLight(World worldIn, LivingEntity throwerIn) + { + super(BloodMagicEntityTypes.BLOOD_LIGHT.getEntityType(), throwerIn, worldIn); + } - public EntityBloodLight(World world, double x, double y, double z) { - super(world); - this.setSize(0.5F, 0.5F); - this.setPosition(x, y, z); - } + public EntityBloodLight(World worldIn, double x, double y, double z) + { + super(BloodMagicEntityTypes.BLOOD_LIGHT.getEntityType(), x, y, z, worldIn); + } - public EntityBloodLight(World world, LivingEntity player) { - super(world, player); - shootingEntity = player; - float par3 = 0.8F; - this.setSize(0.5F, 0.5F); - this.setLocationAndAngles(player.posX, player.posY + player.getEyeHeight(), player.posZ, player.rotationYaw, player.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); - 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.shoot(motionX, motionY, motionZ, par3 * 1.5F, 1.0F); - } + protected Item getDefaultItem() + { + return BloodMagicItems.REAGENT_BLOOD_LIGHT.get(); + } - @Override - protected float getGravityVelocity() { - return 0F; - } + @Override + public IPacket createSpawnPacket() + { + return NetworkHooks.getEntitySpawningPacket(this); + } - @Override - public void shoot(double var1, double var3, double var5, float var7, float var8) { - float var9 = MathHelper.sqrt(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(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 + public void tick() + { + super.tick(); + RayTraceResult raytraceresult = ProjectileHelper.func_234618_a_(this, this::func_230298_a_); +// boolean flag = false; + if (raytraceresult.getType() == RayTraceResult.Type.BLOCK) + { + BlockPos blockpos = ((BlockRayTraceResult) raytraceresult).getPos().offset(((BlockRayTraceResult) raytraceresult).getFace()); + BlockState blockstate = this.world.getBlockState(blockpos); + if (blockstate.isAir()) + { + this.getEntityWorld().setBlockState(blockpos, BloodMagicBlocks.BLOOD_LIGHT.get().getDefaultState()); + this.setDead(); + } + } + } - @Override - public void onUpdate() { - super.onUpdate(); - if (this.ticksExisted > this.maxTicksInAir) { - setDead(); - } - } + protected float getGravityVelocity() + { + return 0; + } - @Override - protected void onImpact(RayTraceResult mop) { - if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null) { - if (mop.entityHit == shootingEntity) { - return; - } + @OnlyIn(Dist.CLIENT) + private IParticleData makeParticle() + { + ItemStack itemstack = this.func_213882_k(); + return (IParticleData) (itemstack.isEmpty() ? ParticleTypes.LAVA + : new ItemParticleData(ParticleTypes.ITEM, itemstack)); + } - this.onImpact(mop.entityHit); - } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) { - Direction sideHit = mop.sideHit; - BlockPos blockPos = mop.getBlockPos().offset(sideHit); + /** + * Handler for {@link World#setEntityState} + */ + @OnlyIn(Dist.CLIENT) + public void handleStatusUpdate(byte id) + { + if (id == 3) + { + IParticleData iparticledata = this.makeParticle(); - if (getEntityWorld().isAirBlock(blockPos)) { - getEntityWorld().setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); - } - } - - this.setDead(); - } - - protected void onImpact(Entity mop) { - if (mop == shootingEntity && ticksInAir > 3) { - shootingEntity.attackEntityFrom(DamageSource.causeMobDamage(shootingEntity), 1); - this.setDead(); - } else { - if (mop instanceof LivingEntity) { - ((LivingEntity) mop).setRevengeTarget(shootingEntity); - doDamage(1, mop); - } - } - - if (getEntityWorld().isAirBlock(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ))) { - getEntityWorld().setBlockState(new BlockPos((int) this.posX, (int) this.posY, (int) this.posZ), Blocks.FIRE.getDefaultState()); - } - - // spawnHitParticles("magicCrit", 8); - this.setDead(); - } - - protected void doDamage(int i, Entity mop) { - mop.attackEntityFrom(this.getDamageSource(), i); - } - - public DamageSource getDamageSource() { - return DamageSource.causeMobDamage(shootingEntity); - } - - @Override - public void writeSpawnData(ByteBuf data) { - data.writeByte(this.ticksInAir); - } - - @Override - public void readSpawnData(ByteBuf data) { - this.ticksInAir = data.readByte(); - } - - @Override - public void writeEntityToNBT(CompoundNBT nbt) { - super.writeEntityToNBT(nbt); - nbt.putInt(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); - nbt.putInt(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); - } - - @Override - public void readEntityFromNBT(CompoundNBT nbt) { - super.readEntityFromNBT(nbt); - ticksInAir = nbt.getInt(Constants.NBT.PROJECTILE_TICKS_IN_AIR); - maxTicksInAir = nbt.getInt(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); - } - - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean canBeCollidedWith() { - return false; - } - - @Override - public void setThrower(Entity entity) { - if (entity instanceof LivingEntity) - this.shootingEntity = (LivingEntity) entity; - } -} + for (int i = 0; i < 8; ++i) + { + this.world.addParticle(iparticledata, this.getPosX(), this.getPosY(), this.getPosZ(), 0.0D, 0.0D, 0.0D); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java deleted file mode 100644 index 5a73d56e..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntityMeteor.java +++ /dev/null @@ -1,134 +0,0 @@ -package WayofTime.bloodmagic.entity.projectile; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.meteor.MeteorRegistry; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.projectile.ThrowableEntity; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.IThrowableEntity; - -public class EntityMeteor extends ThrowableEntity implements IThrowableEntity { - public ItemStack meteorStack = ItemStack.EMPTY; - protected int ticksInAir = 0; - protected int maxTicksInAir = 600; - protected double radiusModifier = 1; - protected double explosionModifier = 1; - protected double fillerChance = 0; - - public EntityMeteor(World world) { - super(world); - } - - public EntityMeteor(World world, double x, double y, double z, double velX, double velY, double velZ, double radiusModifier, double explosionModifier, double fillerChance) { - super(world); - this.setSize(1F, 1F); - this.setPosition(x, y, z); - motionX = velX; - motionY = velY; - motionZ = velZ; - this.radiusModifier = radiusModifier; - this.explosionModifier = explosionModifier; - this.fillerChance = fillerChance; - } - - @Override - protected float getGravityVelocity() { - return 0.03F; - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (this.ticksExisted > this.maxTicksInAir) { - setDead(); - } - } - - @Override - protected void onImpact(RayTraceResult mop) { - if (mop.typeOfHit == RayTraceResult.Type.ENTITY && mop.entityHit != null) { - this.onImpact(mop.entityHit); - } else if (mop.typeOfHit == RayTraceResult.Type.BLOCK) { - generateMeteor(mop.getBlockPos()); - } - - this.setDead(); - } - - protected void onImpact(Entity mop) { - if (mop instanceof LivingEntity) { - doDamage(100, mop); - } - - generateMeteor(mop.getPosition()); - - // spawnHitParticles("magicCrit", 8); - this.setDead(); - } - - protected void doDamage(int i, Entity mop) { - mop.attackEntityFrom(this.getDamageSource(), i); - } - - public void generateMeteor(BlockPos pos) { - MeteorRegistry.generateMeteorForItem(meteorStack, getEntityWorld(), pos, Blocks.STONE.getDefaultState(), radiusModifier, explosionModifier, fillerChance); - } - - public DamageSource getDamageSource() { - return DamageSource.ANVIL; - } - - @Override - public void writeEntityToNBT(CompoundNBT nbt) { - super.writeEntityToNBT(nbt); - nbt.putInt(Constants.NBT.PROJECTILE_TICKS_IN_AIR, ticksInAir); - nbt.putInt(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR, maxTicksInAir); - nbt.putDouble("radiusModifier", radiusModifier); - nbt.putDouble("explosionModifier", explosionModifier); - nbt.putDouble("fillerChance", fillerChance); - if (!meteorStack.isEmpty()) - meteorStack.writeToNBT(nbt); - else - nbt.putBoolean("noItem", true); - } - - @Override - public void readEntityFromNBT(CompoundNBT nbt) { - super.readEntityFromNBT(nbt); - ticksInAir = nbt.getInt(Constants.NBT.PROJECTILE_TICKS_IN_AIR); - maxTicksInAir = nbt.getInt(Constants.NBT.PROJECTILE_MAX_TICKS_IN_AIR); - radiusModifier = nbt.getDouble("radiusModifier"); - explosionModifier = nbt.getDouble("explosionModifier"); - fillerChance = nbt.getDouble("fillerChance"); - if (!nbt.hasKey("noItem")) - meteorStack = new ItemStack(nbt); - else - meteorStack = ItemStack.EMPTY; - } - - @Override - protected boolean canTriggerWalking() { - return false; - } - - @Override - public boolean canBeCollidedWith() { - return false; - } - - @Override - public void setThrower(Entity entity) { - - } - - public void setMeteorStack(ItemStack meteorStack) { - this.meteorStack = meteorStack; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java deleted file mode 100644 index baf6538f..00000000 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySentientArrow.java +++ /dev/null @@ -1,295 +0,0 @@ -package WayofTime.bloodmagic.entity.projectile; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.AbstractArrowEntity; -import net.minecraft.entity.projectile.ArrowEntity; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.*; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Potion; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Locale; - -public class EntitySentientArrow extends ArrowEntity { - public Potion potion = Potions.EMPTY; - public double reimbursedAmountOnHit = 0; - public EnumDemonWillType type = EnumDemonWillType.DEFAULT; - public int currentLevel = 0; - public ItemStack itemStack; - public Class specialArrowClass; - public float[] destructiveExplosionRadius = {0.5f, 1, 1.5f, 2, 2.5f, 3, 3.5f}; - public int[] poisonDuration = {50, 100, 150, 80, 120, 160, 200}; - public int[] poisonLevel = {0, 0, 0, 1, 1, 1, 1}; - public int[] levitationDuration = {20, 40, 60, 80, 100, 120, 160}; - public int[] levitationLevel = {0, 0, 0, 1, 1, 1, 2}; - public int[] slownessDuration = {40, 60, 100, 150, 200, 250, 300}; - public int[] slownessLevel = {0, 0, 0, 1, 1, 1, 2}; - public AbstractArrowEntity specialEntity; - public MethodHandle specialHitMH; - public Method specialHit; - - public EntitySentientArrow(World worldIn) { - super(worldIn); - } - - public EntitySentientArrow(World worldIn, double x, double y, double z) { - super(worldIn, x, y, z); - } - - public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel) { - super(worldIn, shooter); - this.reimbursedAmountOnHit = reimburseAmount; - this.type = type; - this.currentLevel = currentLevel; - } - - public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, Potion potion) { - super(worldIn, shooter); - this.reimbursedAmountOnHit = reimburseAmount; - this.type = type; - this.currentLevel = currentLevel; - this.potion = potion; - } - - public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, ItemStack itemStack) { - super(worldIn, shooter); - this.reimbursedAmountOnHit = reimburseAmount; - this.type = type; - this.currentLevel = currentLevel; - this.potion = PotionUtils.getPotionFromItem(itemStack); - } - - public EntitySentientArrow(World worldIn, LivingEntity shooter, EnumDemonWillType type, double reimburseAmount, int currentLevel, AbstractArrowEntity specialArrow) { - super(worldIn, shooter); - this.reimbursedAmountOnHit = reimburseAmount; - this.type = type; - this.currentLevel = currentLevel; - this.specialEntity = specialArrow; - this.specialArrowClass = specialArrow.getClass(); - } - - public void reimbursePlayer(LivingEntity hitEntity, float damage) { - if (this.shootingEntity instanceof PlayerEntity) { - if (hitEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(hitEntity instanceof IMob)) { - return; - } - - PlayerDemonWillHandler.addDemonWill(type, (PlayerEntity) this.shootingEntity, reimbursedAmountOnHit * damage / 20f); - } - } - - @Override - protected void arrowHit(LivingEntity living) { - int amp = -1; - switch (type) { - case CORROSIVE: - if (this.potion != null) - for (EffectInstance i : this.potion.getEffects()) { - if (i.getEffectName().equals("poison")) { - amp = i.getAmplifier(); - continue; - } - living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); - } - living.addPotionEffect(new EffectInstance(Effects.POISON, currentLevel >= 0 ? (amp > -1 && poisonLevel[currentLevel] != amp) ? poisonDuration[currentLevel] / 2 : poisonDuration[currentLevel] : 0, currentLevel >= 0 ? (amp > -1) ? Math.max(poisonLevel[currentLevel], amp) + 1 : poisonLevel[currentLevel] : 0)); - break; - case DEFAULT: - if (this.potion != null) - for (EffectInstance i : this.potion.getEffects()) { - living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); - } - break; - case DESTRUCTIVE: - this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); - createPotionFromArrow(living); - break; - case STEADFAST: - if (this.potion != null) - for (EffectInstance i : this.potion.getEffects()) { - if (i.getEffectName().equals("levitation")) { - amp = i.getAmplifier(); - continue; - } - living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); - } - living.addPotionEffect(new EffectInstance(Effects.LEVITATION, currentLevel >= 0 ? (amp > -1 && levitationLevel[currentLevel] != amp) ? levitationDuration[currentLevel] / 2 : levitationDuration[currentLevel] : 0, currentLevel >= 0 ? (amp > -1) ? Math.max(levitationLevel[currentLevel], amp) + 1 : levitationLevel[currentLevel] : 0)); - break; - case VENGEFUL: - if (this.potion != null) - for (EffectInstance i : this.potion.getEffects()) { - if (i.getEffectName().equals("slowness")) { - amp = i.getAmplifier(); - continue; - } - living.addPotionEffect(new EffectInstance(i.getPotion(), i.getDuration(), i.getAmplifier())); - } - living.addPotionEffect(new EffectInstance(Effects.SLOWNESS, currentLevel >= 0 ? (amp > -1 && slownessLevel[currentLevel] != amp) ? slownessDuration[currentLevel] / 2 : slownessDuration[currentLevel] : 0, currentLevel >= 0 ? (amp > -1) ? Math.max(slownessLevel[currentLevel], amp) + 1 : slownessLevel[currentLevel] : 0)); - break; - default: - break; - } - if (this.specialArrowClass != null) { - try { - this.specialHit = this.specialArrowClass.getMethod("arrowHit", LivingEntity.class); - this.specialHitMH = MethodHandles.lookup().unreflect(this.specialHit).bindTo(this.specialEntity); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } finally { - try { - if (this.specialHitMH != null) - this.specialHitMH.invoke(living); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - } - - @Override - public void onUpdate() { - super.onUpdate(); - if (this.specialArrowClass != null) { - if (!this.world.isRemote) { - this.specialEntity.posX = this.posX; - this.specialEntity.posY = this.posY; - this.specialEntity.posZ = this.posZ; - - this.specialEntity.onUpdate(); - if (this.inGround) { - this.specialEntity.setDead(); - } - } - } - switch (type) { - case DESTRUCTIVE: - if (this.potion != null) { - this.spawnPotionParticles(2); - } - if (!this.world.isRemote && this.inGround) { - this.world.createExplosion(this, this.posX, this.posY, this.posZ, currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0, false); - if (this.potion != null && this.specialArrowClass == null) { - createPotionFromArrow(null); - } - this.setDead(); - } - break; - case CORROSIVE: - this.spawnPotionParticles(2); - - break; - case DEFAULT: - if (this.potion != null) { - this.spawnPotionParticles(2); - } - break; - case STEADFAST: - if (this.potion != null) { - this.spawnPotionParticles(2); - } - break; - case VENGEFUL: - if (this.potion != null) { - this.spawnPotionParticles(2); - } - break; - default: - break; - } - - - } - - //TODO: Potion splash (for destructive will fired tipped arrows) currently does not have a visual effect. - private void createPotionFromArrow(LivingEntity living) { - if (this.potion != null) { - float radius = currentLevel >= 0 ? destructiveExplosionRadius[currentLevel] : 0; - AxisAlignedBB axisalignedbb = this.getEntityBoundingBox().grow(radius * 2, radius, radius * 2); - List list = this.world.getEntitiesWithinAABB(LivingEntity.class, axisalignedbb); - - if (!list.isEmpty()) { - for (LivingEntity entitylivingbase : list) { - if (entitylivingbase.canBeHitWithPotion()) { - double d0 = this.getDistanceSq(entitylivingbase); - - if (d0 < 16.0D) { - double d1 = 1.0D - Math.sqrt(d0) / 4.0D; - - if (entitylivingbase == living) { - d1 = 1.0D; - } - - for (EffectInstance potioneffect : this.potion.getEffects()) { - Effect potion = potioneffect.getPotion(); - - if (potion.isInstant()) { - potion.affectEntity(this, this.shootingEntity, entitylivingbase, potioneffect.getAmplifier(), d1); - } else { - int i = (int) (d1 * (double) potioneffect.getDuration() + 0.5D); - - if (i > 20) { - entitylivingbase.addPotionEffect(new EffectInstance(potion, i, potioneffect.getAmplifier(), potioneffect.getIsAmbient(), potioneffect.doesShowParticles())); - } - } - } - } - } - } - } - } - } - - @Override - public void writeEntityToNBT(CompoundNBT tag) { - super.writeEntityToNBT(tag); - - tag.putDouble("reimbursement", reimbursedAmountOnHit); - tag.putInt("currentLevel", currentLevel); - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public void readEntityFromNBT(CompoundNBT tag) { - super.readEntityFromNBT(tag); - - reimbursedAmountOnHit = tag.getDouble("reimbursement"); - type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - currentLevel = tag.getInt("currentLevel"); - } - - @Override - protected ItemStack getArrowStack() { - return new ItemStack(Items.ARROW); - } - - public void spawnPotionParticles(int particleCount) { - int i = this.getColor(); - - if (i != -1 && particleCount > 0) { - double d0 = (double) (i >> 16 & 255) / 255.0D; - double d1 = (double) (i >> 8 & 255) / 255.0D; - double d2 = (double) (i >> 0 & 255) / 255.0D; - - for (int j = 0; j < particleCount; ++j) { - this.world.spawnParticle(EnumParticleTypes.SPELL_MOB, this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width, this.posY + this.rand.nextDouble() * (double) this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width, d0, d1, d2); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java index 5fc9ff13..4510f1ac 100644 --- a/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java +++ b/src/main/java/WayofTime/bloodmagic/entity/projectile/EntitySoulSnare.java @@ -1,43 +1,94 @@ -package WayofTime.bloodmagic.entity.projectile; +package wayoftime.bloodmagic.entity.projectile; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; +import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.projectile.ThrowableEntity; +import net.minecraft.entity.projectile.ProjectileItemEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.IPacket; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ItemParticleData; +import net.minecraft.particles.ParticleTypes; import net.minecraft.potion.EffectInstance; import net.minecraft.util.DamageSource; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.EntityRayTraceResult; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.network.NetworkHooks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes; +import wayoftime.bloodmagic.potion.BloodMagicPotions; -public class EntitySoulSnare extends ThrowableEntity { +public class EntitySoulSnare extends ProjectileItemEntity +{ + public EntitySoulSnare(EntityType p_i50159_1_, World p_i50159_2_) + { + super(p_i50159_1_, p_i50159_2_); + } - public EntitySoulSnare(World worldIn) { - super(worldIn); - } + public EntitySoulSnare(World worldIn, LivingEntity throwerIn) + { + super(BloodMagicEntityTypes.SNARE.getEntityType(), throwerIn, worldIn); + } - public EntitySoulSnare(World worldIn, LivingEntity throwerIn) { - super(worldIn, throwerIn); - } + public EntitySoulSnare(World worldIn, double x, double y, double z) + { + super(BloodMagicEntityTypes.SNARE.getEntityType(), x, y, z, worldIn); + } - public EntitySoulSnare(World worldIn, double x, double y, double z) { - super(worldIn, x, y, z); - } + protected Item getDefaultItem() + { + return BloodMagicItems.SOUL_SNARE.get(); + } - @Override - protected void onImpact(RayTraceResult result) { - if (result.entityHit == this.getThrower() || this.ticksExisted < 2 || getEntityWorld().isRemote) - return; + @Override + public IPacket createSpawnPacket() + { + return NetworkHooks.getEntitySpawningPacket(this); + } - if (result.entityHit instanceof LivingEntity) { - if (result.entityHit.getEntityWorld().rand.nextDouble() < 0.25) - ((LivingEntity) result.entityHit).addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_SNARE, 300, 0)); + /** + * Called when the arrow hits an entity + */ + protected void onEntityHit(EntityRayTraceResult result) + { + if (result.getEntity() == this.func_234616_v_() || this.ticksExisted < 2 || getEntityWorld().isRemote) + return; - result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, this.getThrower()), (float) 0); - } + if (result.getEntity() instanceof LivingEntity) + { + ((LivingEntity) result.getEntity()).addPotionEffect(new EffectInstance(BloodMagicPotions.soulSnare, 300, 0)); - for (int j = 0; j < 8; ++j) - this.getEntityWorld().spawnParticle(EnumParticleTypes.SNOWBALL, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D); + result.getEntity().attackEntityFrom(DamageSource.causeThrownDamage(this, this.func_234616_v_()), (float) 0); + } - this.setDead(); - } -} \ No newline at end of file + this.setDead(); + } + + @OnlyIn(Dist.CLIENT) + private IParticleData makeParticle() + { + ItemStack itemstack = this.func_213882_k(); + return (IParticleData) (itemstack.isEmpty() ? ParticleTypes.ITEM_SNOWBALL + : new ItemParticleData(ParticleTypes.ITEM, itemstack)); + } + + /** + * Handler for {@link World#setEntityState} + */ + @OnlyIn(Dist.CLIENT) + public void handleStatusUpdate(byte id) + { + if (id == 3) + { + IParticleData iparticledata = this.makeParticle(); + + for (int i = 0; i < 8; ++i) + { + this.world.addParticle(iparticledata, this.getPosX(), this.getPosY(), this.getPosZ(), 0.0D, 0.0D, 0.0D); + } + } + + } +} diff --git a/src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java deleted file mode 100644 index 4e4798c7..00000000 --- a/src/main/java/WayofTime/bloodmagic/event/AddToNetworkEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.event; - -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; - -@Cancelable -public class AddToNetworkEvent extends Event { - public final String ownerNetwork; - public int addedAmount; - public int maximum; - - /** - * This event is called whenever the network is added to. If cancelled, no - * LP will be drained from the source. If result is set to Result.DENY, the - * LP will still be drained but the soul network will not be added to. - * - * @param ownerNetwork Key used for the soul network - * @param addedAmount Amount added - * @param maximum Ceiling that the network can add to - */ - public AddToNetworkEvent(String ownerNetwork, int addedAmount, int maximum) { - this.ownerNetwork = ownerNetwork; - this.addedAmount = addedAmount; - this.maximum = maximum; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java b/src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java deleted file mode 100644 index 0aca6bcd..00000000 --- a/src/main/java/WayofTime/bloodmagic/event/AltarCraftedEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.event; - -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.Event; - -/** - * Fired whenever a craft is completed in a BloodAltar. - *

- * It is not cancelable, however you can modify the output stack. - */ -public class AltarCraftedEvent extends Event { - - private final AltarRecipeRegistry.AltarRecipe altarRecipe; - private final ItemStack output; - - /** - * @param altarRecipe - The recipe that was crafted. - * @param output - The item obtained from the recipe - */ - public AltarCraftedEvent(AltarRecipeRegistry.AltarRecipe altarRecipe, ItemStack output) { - this.altarRecipe = altarRecipe; - this.output = output; - } - - public AltarRecipeRegistry.AltarRecipe getAltarRecipe() { - return altarRecipe; - } - - public ItemStack getOutput() { - return output; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java b/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java deleted file mode 100644 index 68a94aa6..00000000 --- a/src/main/java/WayofTime/bloodmagic/event/BoundToolEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.event; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; - -public class BoundToolEvent extends Event { - public PlayerEntity player; - - public BoundToolEvent(PlayerEntity player) { - this.player = player; - } - - /** - * This event is called when a - * {@link WayofTime.bloodmagic.item.ItemBoundTool} is being charged. - *

- * If canceled, will result in the charging being canceled. - */ - - @Cancelable - public static class Charge extends BoundToolEvent { - public ItemStack result; - - public Charge(PlayerEntity player, ItemStack result) { - super(player); - this.result = result; - } - } - - /** - * This event is called when a - * {@link WayofTime.bloodmagic.item.ItemBoundTool}'s charge is released. - *

- * If canceled, will result in the charge not being released. - */ - - @Cancelable - public static class Release extends BoundToolEvent { - public final ItemStack boundTool; - public int charge; - - public Release(PlayerEntity player, ItemStack boundTool, int charge) { - super(player); - this.boundTool = boundTool; - this.charge = charge; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java index ec613007..48f9bdcc 100644 --- a/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/ItemBindEvent.java @@ -1,35 +1,38 @@ -package WayofTime.bloodmagic.event; +package wayoftime.bloodmagic.event; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; @Cancelable -public class ItemBindEvent extends Event { +public class ItemBindEvent extends Event +{ + private final PlayerEntity player; + private final ItemStack itemStack; - private final PlayerEntity player; - private final ItemStack itemStack; + /** + * This event is called whenever a player attempts to bind a + * {@link wayoftime.bloodmagic.iface.IBindable} item. + * + * @param player The player doing the binding + * @param itemStack The {@link ItemStack} that the player is binding + *

+ * This event is {@link Cancelable}.
+ */ + public ItemBindEvent(PlayerEntity player, ItemStack itemStack) + { + this.player = player; + this.itemStack = itemStack; + } - /** - * This event is called whenever a player attempts to bind a - * {@link WayofTime.bloodmagic.iface.IBindable} item. - * - * @param player The player doing the binding - * @param itemStack The {@link ItemStack} that the player is binding - *

- * This event is {@link Cancelable}.
- */ - public ItemBindEvent(PlayerEntity player, ItemStack itemStack) { - this.player = player; - this.itemStack = itemStack; - } + public PlayerEntity getNewOwner() + { + return player; + } - public PlayerEntity getNewOwner() { - return player; - } - - public ItemStack getBindingStack() { - return itemStack; - } -} + public ItemStack getBindingStack() + { + return itemStack; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java b/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java deleted file mode 100644 index 2a5d5536..00000000 --- a/src/main/java/WayofTime/bloodmagic/event/RitualEvent.java +++ /dev/null @@ -1,133 +0,0 @@ -package WayofTime.bloodmagic.event; - -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; - -import java.util.UUID; - -public class RitualEvent extends Event { - - private final IMasterRitualStone mrs; - private final UUID ownerId; - private final Ritual ritual; - - private RitualEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { - this.mrs = mrs; - this.ownerId = ownerId; - this.ritual = ritual; - } - - public IMasterRitualStone getRitualStone() { - return mrs; - } - - public UUID getOwnerId() { - return ownerId; - } - - public Ritual getRitual() { - return ritual; - } - - /** - * This event is called when a ritual is activated. If cancelled, it will - * not activate. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, PlayerEntity, Ritual)} - */ - @Cancelable - public static class RitualActivatedEvent extends RitualEvent { - - private final PlayerEntity player; - private final ItemStack crystalStack; - private final int crystalTier; - - public RitualActivatedEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, PlayerEntity player, ItemStack activationCrystal, int crystalTier) { - super(mrs, ownerId, ritual); - - this.player = player; - this.crystalStack = activationCrystal; - this.crystalTier = crystalTier; - } - - public PlayerEntity getPlayer() { - return player; - } - - public ItemStack getCrystalStack() { - return crystalStack; - } - - public int getCrystalTier() { - return crystalTier; - } - } - - /** - * This event is called when a Ritual effect is performed. If cancelled, the - * effect will not happen. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#performRitual(World, net.minecraft.util.math.BlockPos)} - */ - @Cancelable - public static class RitualRunEvent extends RitualEvent { - - public RitualRunEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual) { - super(mrs, ownerId, ritual); - } - } - - /** - * This event is called when a Ritual is stopped by a - * {@link Ritual.BreakType}. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#stopRitual(Ritual.BreakType)} - */ - public static class RitualStopEvent extends RitualEvent { - - private final Ritual.BreakType method; - - public RitualStopEvent(IMasterRitualStone mrs, UUID ownerId, Ritual ritual, Ritual.BreakType method) { - super(mrs, ownerId, ritual); - - this.method = method; - } - - public Ritual.BreakType getMethod() { - return method; - } - } - - @Cancelable - public static class ImperfectRitualActivatedEvent extends Event { - - private final IImperfectRitualStone ims; - private final PlayerEntity activator; - private final ImperfectRitual imperfectRitual; - - public ImperfectRitualActivatedEvent(IImperfectRitualStone ims, PlayerEntity activator, ImperfectRitual imperfectRitual) { - this.ims = ims; - this.activator = activator; - this.imperfectRitual = imperfectRitual; - } - - public IImperfectRitualStone getRitualStone() { - return ims; - } - - public PlayerEntity getActivator() { - return activator; - } - - public ImperfectRitual getImperfectRitual() { - return imperfectRitual; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java index 0893883f..6fc6bbd4 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SacrificeKnifeUsedEvent.java @@ -1,35 +1,37 @@ -package WayofTime.bloodmagic.event; +package wayoftime.bloodmagic.event; import net.minecraft.entity.player.PlayerEntity; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; +import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.Event; @Cancelable -public class SacrificeKnifeUsedEvent extends Event { - public final PlayerEntity player; - public final int healthDrained; - public int lpAdded; - public boolean shouldDrainHealth; - public boolean shouldFillAltar; +public class SacrificeKnifeUsedEvent extends Event +{ + public final PlayerEntity player; + public final int healthDrained; + public int lpAdded; + public boolean shouldDrainHealth; + public boolean shouldFillAltar; - /** - * This event is called whenever a player attempts to use a - * {@link WayofTime.bloodmagic.item.ItemSacrificialDagger} to self-sacrifice - * near an altar. - * - * @param player The player doing the sacrificing - * @param shouldDrainHealth Determines whether or not health is lost - * @param shouldFillAltar Determines whether or not an altar should be filled - * @param hp Amount of health lost - * @param lpAdded Amount of LP added to the altar - *

- * This event is {@link Cancelable}.
- */ - public SacrificeKnifeUsedEvent(PlayerEntity player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) { - this.player = player; - this.shouldDrainHealth = shouldDrainHealth; - this.shouldFillAltar = shouldFillAltar; - this.healthDrained = hp; - this.lpAdded = lpAdded; - } -} \ No newline at end of file + /** + * This event is called whenever a player attempts to use a + * {@link WayofTime.bloodmagic.item.ItemSacrificialDagger} to self-sacrifice + * near an altar. + * + * @param player The player doing the sacrificing + * @param shouldDrainHealth Determines whether or not health is lost + * @param shouldFillAltar Determines whether or not an altar should be filled + * @param hp Amount of health lost + * @param lpAdded Amount of LP added to the altar + *

+ * This event is {@link Cancelable}.
+ */ + public SacrificeKnifeUsedEvent(PlayerEntity player, boolean shouldDrainHealth, boolean shouldFillAltar, int hp, int lpAdded) + { + this.player = player; + this.shouldDrainHealth = shouldDrainHealth; + this.shouldFillAltar = shouldFillAltar; + this.healthDrained = hp; + this.lpAdded = lpAdded; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java index 2f27c0d0..c4079c4d 100644 --- a/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java +++ b/src/main/java/WayofTime/bloodmagic/event/SoulNetworkEvent.java @@ -1,99 +1,116 @@ -package WayofTime.bloodmagic.event; +package wayoftime.bloodmagic.event; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraftforge.eventbus.api.Cancelable; import net.minecraftforge.eventbus.api.Event; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.core.data.SoulTicket; -public class SoulNetworkEvent extends Event { +public class SoulNetworkEvent extends Event +{ + private final SoulNetwork network; + private SoulTicket ticket; - private final SoulNetwork network; - private SoulTicket ticket; + public SoulNetworkEvent(SoulNetwork network, SoulTicket ticket) + { + this.network = network; + this.ticket = ticket; + } - public SoulNetworkEvent(SoulNetwork network, SoulTicket ticket) { - this.network = network; - this.ticket = ticket; - } + public SoulNetwork getNetwork() + { + return network; + } - public SoulNetwork getNetwork() { - return network; - } + public SoulTicket getTicket() + { + return ticket; + } - public SoulTicket getTicket() { - return ticket; - } + public void setTicket(SoulTicket ticket) + { + this.ticket = ticket; + } - public void setTicket(SoulTicket ticket) { - this.ticket = ticket; - } + @Cancelable + public static class Syphon extends SoulNetworkEvent + { + private boolean shouldDamage; - @Cancelable - public static class Syphon extends SoulNetworkEvent { + public Syphon(SoulNetwork network, SoulTicket ticket) + { + super(network, ticket); + } - private boolean shouldDamage; + public boolean shouldDamage() + { + return shouldDamage; + } - public Syphon(SoulNetwork network, SoulTicket ticket) { - super(network, ticket); - } + public void setShouldDamage(boolean shouldDamage) + { + this.shouldDamage = shouldDamage; + } - public boolean shouldDamage() { - return shouldDamage; - } + public static class Item extends Syphon + { - public void setShouldDamage(boolean shouldDamage) { - this.shouldDamage = shouldDamage; - } + private final ItemStack stack; - public static class Item extends Syphon { + public Item(SoulNetwork network, SoulTicket ticket, ItemStack stack) + { + super(network, ticket); - private final ItemStack stack; + this.stack = stack; + } - public Item(SoulNetwork network, SoulTicket ticket, ItemStack stack) { - super(network, ticket); + public ItemStack getStack() + { + return stack; + } + } - this.stack = stack; - } + public static class User extends Syphon + { - public ItemStack getStack() { - return stack; - } - } + private final PlayerEntity user; - public static class User extends Syphon { + public User(SoulNetwork network, SoulTicket ticket, PlayerEntity user) + { + super(network, ticket); - private final PlayerEntity user; + this.user = user; + } - public User(SoulNetwork network, SoulTicket ticket, PlayerEntity user) { - super(network, ticket); + public PlayerEntity getUser() + { + return user; + } + } + } - this.user = user; - } + @Cancelable + public static class Fill extends SoulNetworkEvent + { - public PlayerEntity getUser() { - return user; - } - } - } + private int maximum; - @Cancelable - public static class Fill extends SoulNetworkEvent { + public Fill(SoulNetwork network, SoulTicket ticket, int maximum) + { + super(network, ticket); - private int maximum; + this.maximum = maximum; + } - public Fill(SoulNetwork network, SoulTicket ticket, int maximum) { - super(network, ticket); + public int getMaximum() + { + return maximum; + } - this.maximum = maximum; - } - - public int getMaximum() { - return maximum; - } - - public void setMaximum(int maximum) { - this.maximum = maximum; - } - } -} + public void setMaximum(int maximum) + { + this.maximum = maximum; + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java b/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java deleted file mode 100644 index 527f9e19..00000000 --- a/src/main/java/WayofTime/bloodmagic/event/TeleposeEvent.java +++ /dev/null @@ -1,78 +0,0 @@ -package WayofTime.bloodmagic.event; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.eventhandler.Cancelable; -import net.minecraftforge.fml.common.eventhandler.Event; - -/** - * Fired when a teleposer attempts to transpose two blocks. Use this to perform - * special cleanup or compensation, or cancel it entirely to prevent the - * transposition. - */ -@Cancelable -public class TeleposeEvent extends Event { - public final World initalWorld; - public final BlockPos initialBlockPos; - public final BlockState initialState; - - public final World finalWorld; - public final BlockPos finalBlockPos; - public final BlockState finalState; - - public TeleposeEvent(World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { - this.initalWorld = initialWorld; - this.initialBlockPos = initialBlockPos; - this.initialState = initialWorld.getBlockState(initialBlockPos); - - this.finalWorld = finalWorld; - this.finalBlockPos = finalBlockPos; - this.finalState = finalWorld.getBlockState(finalBlockPos); - } - - public TileEntity getInitialTile() { - return initalWorld.getTileEntity(initialBlockPos); - } - - public TileEntity getFinalTile() { - return finalWorld.getTileEntity(finalBlockPos); - } - - /** - * Fired when a Teleposer attempts to move an Entity between locations. Can - * be cancelled to stop transposition. - */ - @Cancelable - public static class Ent extends TeleposeEvent { - public final Entity entity; - - public Ent(Entity entity, World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { - super(initialWorld, initialBlockPos, finalWorld, finalBlockPos); - - this.entity = entity; - } - - @Override - public TileEntity getInitialTile() throws IllegalArgumentException { - throw new IllegalArgumentException("Attempted to get a TileEntity from an Entity Telepose Event."); - } - - @Override - public TileEntity getFinalTile() throws IllegalArgumentException { - throw new IllegalArgumentException("Attempted to get a TileEntity from an Entity Telepose Event."); - } - - /** - * Called after the entity has been transposed. - */ - public static class Post extends Ent { - - public Post(Entity entity, World initialWorld, BlockPos initialBlockPos, World finalWorld, BlockPos finalBlockPos) { - super(entity, initialWorld, initialBlockPos, finalWorld, finalBlockPos); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java deleted file mode 100644 index 92508702..00000000 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakeNetHandlerPlayServer.java +++ /dev/null @@ -1,160 +0,0 @@ -package WayofTime.bloodmagic.fakePlayer; - -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.network.IPacket; -import net.minecraft.network.PacketDirection; -import net.minecraft.network.play.ServerPlayNetHandler; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.play.client.*; -import net.minecraft.network.play.server.SPlayerPositionLookPacket; -import net.minecraft.util.text.ITextComponent; -import net.minecraftforge.fml.common.FMLCommonHandler; - -import java.util.Set; - -/** - * All credits for this go to CrazyPants, from EIO - */ -public class FakeNetHandlerPlayServer extends ServerPlayNetHandler { - public FakeNetHandlerPlayServer(ServerPlayerEntity p_i1530_3_) { - super(FMLCommonHandler.instance().getMinecraftServerInstance(), new net.minecraft.network.NetworkManager(PacketDirection.CLIENTBOUND), p_i1530_3_); - } - - @Override - public NetworkManager getNetworkManager() { - return null; - } - - @Override - public void update() { - } - - @Override - public void disconnect(final ITextComponent textComponent) { - } - - @Override - public void processVehicleMove(CMoveVehiclePacket packetIn) { - } - - @Override - public void processConfirmTeleport(CConfirmTeleportPacket packetIn) { - } - - @Override - public void setPlayerLocation(double x, double y, double z, float yaw, float pitch, Set relativeSet) { - } - - @Override - public void processTryUseItemOnBlock(CPlayerTryUseItemOnBlockPacket packetIn) { - } - - @Override - public void processTryUseItem(CPlayerTryUseItemPacket packetIn) { - } - - @Override - public void processSteerBoat(CSteerBoatPacket packetIn) { - } - - @Override - public void processCustomPayload(CCustomPayloadPacket packetIn) { - } - - @Override - public void processInput(CInputPacket p_147358_1_) { - } - - @Override - public void processPlayer(CPlayerPacket p_147347_1_) { - } - - @Override - public void setPlayerLocation(double p_147364_1_, double p_147364_3_, double p_147364_5_, float p_147364_7_, float p_147364_8_) { - } - - @Override - public void processPlayerDigging(CPlayerDiggingPacket p_147345_1_) { - } - - @Override - public void onDisconnect(ITextComponent p_147231_1_) { - } - - @Override - public void sendPacket(IPacket p_147359_1_) { - } - - @Override - public void processHeldItemChange(CHeldItemChangePacket p_147355_1_) { - } - - @Override - public void processChatMessage(CChatMessagePacket p_147354_1_) { - } - - @Override - public void handleAnimation(CAnimateHandPacket packetIn) { - - } - - @Override - public void processEntityAction(CEntityActionPacket p_147357_1_) { - } - - @Override - public void processUseEntity(CUseEntityPacket p_147340_1_) { - } - - @Override - public void processClientStatus(CClientStatusPacket p_147342_1_) { - } - - @Override - public void processCloseWindow(CCloseWindowPacket p_147356_1_) { - } - - @Override - public void processClickWindow(CClickWindowPacket p_147351_1_) { - } - - @Override - public void processEnchantItem(CEnchantItemPacket p_147338_1_) { - } - - @Override - public void processCreativeInventoryAction(CCreativeInventoryActionPacket p_147344_1_) { - } - - @Override - public void processConfirmTransaction(CConfirmTransactionPacket p_147339_1_) { - } - - @Override - public void processUpdateSign(CUpdateSignPacket p_147343_1_) { - } - - @Override - public void processKeepAlive(CKeepAlivePacket p_147353_1_) { - } - - @Override - public void processPlayerAbilities(CPlayerAbilitiesPacket p_147348_1_) { - } - - @Override - public void processTabComplete(CTabCompletePacket p_147341_1_) { - } - - @Override - public void processClientSettings(CClientSettingsPacket p_147352_1_) { - } - - @Override - public void handleSpectate(CSpectatePacket packetIn) { - } - - @Override - public void handleResourcePackStatus(CResourcePackStatusPacket packetIn) { - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java b/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java deleted file mode 100644 index e8436777..00000000 --- a/src/main/java/WayofTime/bloodmagic/fakePlayer/FakePlayerBM.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.fakePlayer; - -import com.mojang.authlib.GameProfile; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.common.FMLCommonHandler; - -import javax.annotation.Nullable; - -/** - * All credits for this go to CrazyPants, from EIO - */ -@SuppressWarnings("EntityConstructor") -public class FakePlayerBM extends FakePlayer { - - public FakePlayerBM(ServerWorld world, GameProfile name) { - super(world, name); - } - - public FakePlayerBM(World world, BlockPos pos, GameProfile profile) { - super(FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(world.provider.getDimension()), profile); - posX = pos.getX() + 0.5; - posY = pos.getY() + 0.5; - posZ = pos.getZ() + 0.5; - connection = new FakeNetHandlerPlayServer(this); - } - - @Override - protected void onNewPotionEffect(EffectInstance p_70670_1_) { - } - - @Override - protected void onChangedPotionEffect(EffectInstance effect, boolean p_70695_2_) { - } - - @Override - protected void onFinishedPotionEffect(EffectInstance effect) { - } - - protected void playEquipSound(@Nullable ItemStack stack) { - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java b/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java deleted file mode 100644 index 9b67708b..00000000 --- a/src/main/java/WayofTime/bloodmagic/gson/SerializerBase.java +++ /dev/null @@ -1,19 +0,0 @@ -package WayofTime.bloodmagic.gson; - -import com.google.gson.*; - -import java.lang.reflect.Type; - -public abstract class SerializerBase implements JsonDeserializer, JsonSerializer { - @Override - public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return context.deserialize(json, getType()); - } - - @Override - public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { - return context.serialize(src); - } - - public abstract Class getType(); -} diff --git a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java b/src/main/java/WayofTime/bloodmagic/gson/Serializers.java deleted file mode 100644 index 543c3e38..00000000 --- a/src/main/java/WayofTime/bloodmagic/gson/Serializers.java +++ /dev/null @@ -1,100 +0,0 @@ -package WayofTime.bloodmagic.gson; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import com.google.gson.*; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.network.datasync.IDataSerializer; -import net.minecraft.network.datasync.DataSerializers; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -import java.lang.reflect.Type; - -public class Serializers { - // Data serializers - public static final IDataSerializer WILL_TYPE_SERIALIZER = new IDataSerializer() { - @Override - public void write(PacketBuffer buf, EnumDemonWillType value) { - buf.writeEnumValue(value); - } - - @Override - public EnumDemonWillType read(PacketBuffer buf) { - return buf.readEnumValue(EnumDemonWillType.class); - } - - @Override - public DataParameter createKey(int id) { - return new DataParameter<>(id, this); - } - - @Override - public EnumDemonWillType copyValue(EnumDemonWillType value) { - return EnumDemonWillType.valueOf(value.name()); - } - }; - - // Serializers - public static final SerializerBase FACING_SERIALIZER = new SerializerBase() { - @Override - public Class getType() { - return Direction.class; - } - - @Override - public Direction deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return Direction.byName(json.getAsString()); - } - }; - public static final SerializerBase RESOURCELOCATION_SERIALIZER = new SerializerBase() { - @Override - public Class getType() { - return ResourceLocation.class; - } - - @Override - public ResourceLocation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - String domain = json.getAsJsonObject().get("domain").getAsString(); - String path = json.getAsJsonObject().get("path").getAsString(); - return new ResourceLocation(domain, path); - } - - @Override - public JsonElement serialize(ResourceLocation src, Type typeOfSrc, JsonSerializationContext context) { - JsonObject object = new JsonObject(); - object.addProperty("domain", src.getNamespace()); - object.addProperty("path", src.getPath()); - return object; - } - }; - public static final SerializerBase ITEMMETA_SERIALIZER = new SerializerBase() { - @Override - public Class getType() { - return ItemStack.class; - } - - @Override - public ItemStack deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - ResourceLocation registryName = context.deserialize(json.getAsJsonObject().get("registryName").getAsJsonObject(), ResourceLocation.class); - int meta = json.getAsJsonObject().get("meta").getAsInt(); - return new ItemStack(ForgeRegistries.ITEMS.getValue(registryName), 1, meta); - } - - @Override - public JsonElement serialize(ItemStack src, Type typeOfSrc, JsonSerializationContext context) { - JsonObject jsonObject = new JsonObject(); - jsonObject.add("registryName", context.serialize(src.getItem().getRegistryName())); - jsonObject.addProperty("meta", src.getItemDamage()); - return jsonObject; - } - }; - - public static final Gson GSON = new GsonBuilder().serializeNulls().setPrettyPrinting().disableHtmlEscaping().registerTypeAdapter(FACING_SERIALIZER.getType(), FACING_SERIALIZER).registerTypeAdapter(RESOURCELOCATION_SERIALIZER.getType(), RESOURCELOCATION_SERIALIZER).registerTypeAdapter(ITEMMETA_SERIALIZER.getType(), ITEMMETA_SERIALIZER).create(); - - static { - DataSerializers.registerSerializer(WILL_TYPE_SERIALIZER); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java index f5435580..fba799a3 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IActivatable.java @@ -1,26 +1,30 @@ -package WayofTime.bloodmagic.iface; - -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; +package wayoftime.bloodmagic.iface; import javax.annotation.Nonnull; -public interface IActivatable { +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import wayoftime.bloodmagic.util.Constants; - default boolean getActivated(ItemStack stack) { - return !stack.isEmpty() && stack.hasTagCompound() && stack.getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - } +public interface IActivatable +{ - @Nonnull - default ItemStack setActivatedState(ItemStack stack, boolean activated) { - if (!stack.isEmpty()) { - if (!stack.hasTagCompound()) - stack.setTagCompound(new CompoundNBT()); + default boolean getActivated(ItemStack stack) + { + return !stack.isEmpty() && stack.hasTag() && stack.getTag().getBoolean(Constants.NBT.ACTIVATED); + } - stack.getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); - } + @Nonnull + default ItemStack setActivatedState(ItemStack stack, boolean activated) + { + if (!stack.isEmpty()) + { + if (!stack.hasTag()) + stack.setTag(new CompoundNBT()); - return stack; - } -} + stack.getTag().putBoolean(Constants.NBT.ACTIVATED, activated); + } + + return stack; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java deleted file mode 100644 index 4b3321c6..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IAlchemyArray.java +++ /dev/null @@ -1,7 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.util.Direction; - -public interface IAlchemyArray { - Direction getRotation(); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java b/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java index 0e2e5fbe..5fa997cc 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IAltarReader.java @@ -1,9 +1,10 @@ -package WayofTime.bloodmagic.iface; +package wayoftime.bloodmagic.iface; /** * Any item that implements this interface will not be pulled into the Altar on * right click. */ -public interface IAltarReader { +public interface IAltarReader +{ -} +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java index 6253c37b..a894faed 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IBindable.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBindable.java @@ -1,38 +1,40 @@ -package WayofTime.bloodmagic.iface; - -import WayofTime.bloodmagic.core.data.Binding; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; +package wayoftime.bloodmagic.iface; import javax.annotation.Nullable; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import wayoftime.bloodmagic.core.data.Binding; + /** * Implement this interface on any Item that can be bound to a player. */ -public interface IBindable { +public interface IBindable +{ + /** + * Gets an object that stores who this item is bound to. + *

+ * If the item is not bound, this will be null. + * + * @param stack - The owned ItemStack + * @return - The binding object + */ + @Nullable + default Binding getBinding(ItemStack stack) + { + Binding binding = Binding.fromStack(stack); + return !stack.isEmpty() && binding != null ? binding : null; + } - /** - * Gets an object that stores who this item is bound to. - *

- * If the item is not bound, this will be null. - * - * @param stack - The owned ItemStack - * @return - The binding object - */ - @Nullable - default Binding getBinding(ItemStack stack) { - Binding binding = Binding.fromStack(stack); - return !stack.isEmpty() && binding != null ? binding : null; - } - - /** - * Called when the player attempts to bind the item. - * - * @param player - The Player attempting to bind the item - * @param stack - The ItemStack to attempt binding - * @return If binding was successful. - */ - default boolean onBind(PlayerEntity player, ItemStack stack) { - return true; - } -} + /** + * Called when the player attempts to bind the item. + * + * @param player - The Player attempting to bind the item + * @param stack - The ItemStack to attempt binding + * @return If binding was successful. + */ + default boolean onBind(PlayerEntity player, ItemStack stack) + { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java index 51ae4323..e225b5e2 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IBloodRune.java @@ -1,15 +1,14 @@ -package WayofTime.bloodmagic.iface; - - -import WayofTime.bloodmagic.block.enums.BloodRuneType; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.IBlockAccess; +package wayoftime.bloodmagic.iface; import javax.annotation.Nullable; -public interface IBloodRune { +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import wayoftime.bloodmagic.block.enums.BloodRuneType; - @Nullable - BloodRuneType getBloodRune(IBlockAccess world, BlockPos pos, BlockState state); +public interface IBloodRune +{ + + @Nullable + BloodRuneType getBloodRune(World world, BlockPos pos); } diff --git a/src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java b/src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java deleted file mode 100644 index 708067ba..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/ICustomAlchemyConsumable.java +++ /dev/null @@ -1,11 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.item.ItemStack; - -/** - * An interface for items that have custom drainage behaviour when used in - * certain alchemy recipes. - */ -public interface ICustomAlchemyConsumable { - ItemStack drainUseOnAlchemyCraft(ItemStack stack); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java b/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java deleted file mode 100644 index 2647c6f6..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IDemonWillViewer.java +++ /dev/null @@ -1,11 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public interface IDemonWillViewer { - boolean canSeeDemonWillAura(World world, ItemStack stack, PlayerEntity player); - - int getDemonWillAuraResolution(World world, ItemStack stack, PlayerEntity player); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java b/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java deleted file mode 100644 index 5038d0a0..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IDocumentedBlock.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.List; - -/** - * Marks blocks as one that is documented. - *

- * This documentation can be read by an - * {@link WayofTime.bloodmagic.item.ItemSanguineBook} (or child) - */ -public interface IDocumentedBlock { - /** - * Provides the documentation to provide to the player. Usually a - * short'n'sweet description about basic usage. - * - * @param player - The EntityPlayer attempting to view the Documentation. - * @param world - The World interaction is happening in. - * @param pos - The BlockPos being interacted at. - * @param state - The IBlockState of the interacted Block. - * @return - A list of formatted ITextComponent to provide to the player. - * Provide an empty list if there is no available documentation. - */ - @Nonnull - List getDocumentation(PlayerEntity player, World world, BlockPos pos, BlockState state); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java b/src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java deleted file mode 100644 index b2daff9c..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IItemLPContainer.java +++ /dev/null @@ -1,14 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.item.ItemStack; - -/** - * Interface used for any item that can store LP in itself - */ -public interface IItemLPContainer { - int getCapacity(); - - void setStoredLP(ItemStack stack, int lp); - - int getStoredLP(ItemStack stack); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java b/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java index cda13f64..9a95f145 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java +++ b/src/main/java/WayofTime/bloodmagic/iface/IMultiWillTool.java @@ -1,8 +1,9 @@ -package WayofTime.bloodmagic.iface; +package wayoftime.bloodmagic.iface; -import WayofTime.bloodmagic.soul.EnumDemonWillType; import net.minecraft.item.ItemStack; +import wayoftime.bloodmagic.will.EnumDemonWillType; -public interface IMultiWillTool { - EnumDemonWillType getCurrentType(ItemStack stack); -} +public interface IMultiWillTool +{ + EnumDemonWillType getCurrentType(ItemStack stack); +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java b/src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java deleted file mode 100644 index cc93b3bc..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/INodeRenderer.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.iface; - -/** - * Held items that implement this will cause the beams between routing nodes to - * render. - */ -public interface INodeRenderer { -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java b/src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java deleted file mode 100644 index 22355522..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IPurificationAsh.java +++ /dev/null @@ -1,11 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.item.ItemStack; - -public interface IPurificationAsh { - double getTotalPurity(ItemStack stack); - - double getMaxPurity(ItemStack stack); - - double getPurityRate(ItemStack stack); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java b/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java deleted file mode 100644 index e620478f..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/ISentientSwordEffectProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; - -public interface ISentientSwordEffectProvider { - boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, LivingEntity attacker, LivingEntity target); - - boolean providesEffectForWill(EnumDemonWillType type); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java b/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java deleted file mode 100644 index a36935e2..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/ISentientTool.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; - -public interface ISentientTool { - boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player); -} diff --git a/src/main/java/WayofTime/bloodmagic/iface/ISigil.java b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java index 683fdf3c..7c5d020c 100644 --- a/src/main/java/WayofTime/bloodmagic/iface/ISigil.java +++ b/src/main/java/WayofTime/bloodmagic/iface/ISigil.java @@ -1,29 +1,32 @@ -package WayofTime.bloodmagic.iface; +package wayoftime.bloodmagic.iface; + +import javax.annotation.Nonnull; -import WayofTime.bloodmagic.item.sigil.ItemSigil; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; - -import javax.annotation.Nonnull; +import wayoftime.bloodmagic.common.item.ItemSigil; /** - * Used for all {@link ItemSigil} EXCEPT - * Sigils of Holdings. + * Used for all {@link ItemSigil} EXCEPT Sigils of Holdings. */ -public interface ISigil { +public interface ISigil +{ - default boolean performArrayEffect(World world, BlockPos pos) { - return false; - } + default boolean performArrayEffect(World world, BlockPos pos) + { + return false; + } - default boolean hasArrayEffect() { - return false; - } + default boolean hasArrayEffect() + { + return false; + } - interface Holding { - @Nonnull - ItemStack getHeldItem(ItemStack holdingStack, PlayerEntity player); - } -} + interface Holding + { + @Nonnull + ItemStack getHeldItem(ItemStack holdingStack, PlayerEntity player); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java deleted file mode 100644 index 6e9197e9..00000000 --- a/src/main/java/WayofTime/bloodmagic/iface/IUpgradeTrainer.java +++ /dev/null @@ -1,15 +0,0 @@ -package WayofTime.bloodmagic.iface; - -import net.minecraft.item.ItemStack; - -import java.util.List; - -/** - * This interface is used for items intended to train specific upgrades while - * held in the player's inventory. - */ -public interface IUpgradeTrainer { - List getTrainedUpgrades(ItemStack stack); - - boolean setTrainedUpgrades(ItemStack stack, List keys); -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java b/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java deleted file mode 100644 index d2221dbf..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/EnumTranquilityType.java +++ /dev/null @@ -1,12 +0,0 @@ -package WayofTime.bloodmagic.incense; - -public enum EnumTranquilityType { - PLANT(), - CROP(), - TREE(), - EARTHEN(), - WATER(), - FIRE(), - LAVA(), - ; -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java b/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java deleted file mode 100644 index 77efdb42..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/IIncensePath.java +++ /dev/null @@ -1,14 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public interface IIncensePath { - /** - * Goes from 0 to however far this path block can be from the altar while - * still functioning. 0 represents a block that can work when it is two - * blocks horizontally away from the altar. - */ - int getLevelOfPath(World world, BlockPos pos, BlockState state); -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java b/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java deleted file mode 100644 index af9e425c..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/ITranquilityHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public interface ITranquilityHandler { - TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, BlockState state); -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java deleted file mode 100644 index ebdd88ca..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarComponent.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -public class IncenseAltarComponent { - public final BlockPos offsetPos; - public final Block block; - public final BlockState state; - - public IncenseAltarComponent(BlockPos offsetPos, Block block, BlockState state) { - this.offsetPos = offsetPos; - this.block = block; - this.state = state; - } - - public boolean doesBlockMatch(Block block, BlockState state) { - return this.block == block && block.getMetaFromState(state) == this.block.getMetaFromState(this.state); - } - - /** - * Base rotation is north. - */ - public BlockPos getOffset(Direction rotation) { - return new BlockPos(this.getX(rotation), offsetPos.getY(), this.getZ(rotation)); - } - - public int getX(Direction direction) { - switch (direction) { - case EAST: - return -this.offsetPos.getZ(); - case SOUTH: - return -this.offsetPos.getX(); - case WEST: - return this.offsetPos.getZ(); - default: - return this.offsetPos.getX(); - } - } - - public int getZ(Direction direction) { - switch (direction) { - case EAST: - return this.offsetPos.getX(); - case SOUTH: - return -this.offsetPos.getZ(); - case WEST: - return -this.offsetPos.getX(); - default: - return this.offsetPos.getZ(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java deleted file mode 100644 index ad8a1659..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseAltarHandler.java +++ /dev/null @@ -1,92 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public class IncenseAltarHandler { - public static Map> incenseComponentMap = new TreeMap<>(); - //Incense bonus maximum applied for the tier of blocks. - public static double[] incenseBonuses = new double[]{0.2, 0.6, 1.2, 2, 3, 4.5}; - public static double[] tranquilityRequired = new double[]{0, 6, 14.14, 28, 44.09, 83.14}; - public static int[] roadsRequired = new int[]{0, 1, 4, 6, 8, 10, 12}; //TODO: Change for when the roads are fully implemented - - public static void registerIncenseComponent(int altarLevel, IncenseAltarComponent component) { - if (incenseComponentMap.containsKey(altarLevel)) { - incenseComponentMap.get(altarLevel).add(component); - } else { - List list = new ArrayList<>(); - list.add(component); - incenseComponentMap.put(altarLevel, list); - } - } - - public static void registerIncenseComponent(int altarLevel, BlockPos offsetPos, Block block, BlockState state) { - registerIncenseComponent(altarLevel, new IncenseAltarComponent(offsetPos, block, state)); - } - - public static double getMaxIncenseBonusFromComponents(World world, BlockPos pos) { - double accumulatedBonus = 0; - for (int i = 0; i < incenseBonuses.length; i++) { - double previousBonus = (i <= 0 ? 0 : incenseBonuses[i - 1]); - double nextBonus = incenseBonuses[i]; - if (!incenseComponentMap.containsKey(i)) { - accumulatedBonus += (nextBonus - previousBonus); - } else { - boolean hasAllComponentsThisTier = true; - for (IncenseAltarComponent component : incenseComponentMap.get(i)) { - BlockPos offsetPos = pos.add(component.getOffset(Direction.NORTH)); - BlockState state = world.getBlockState(offsetPos); - Block block = state.getBlock(); - if (component.doesBlockMatch(block, state)) { - hasAllComponentsThisTier = false; - } else { - accumulatedBonus += (nextBonus - previousBonus) / incenseComponentMap.get(i).size(); - } - } - - if (!hasAllComponentsThisTier) { - break; - } - } - } - - return accumulatedBonus; - } - - public static double getMaxIncenseBonusFromRoads(int roads) { - double previousBonus = 0; - for (int i = 0; i < incenseBonuses.length; i++) { - if (roads >= roadsRequired[i]) { - previousBonus = incenseBonuses[i]; - } else { - return previousBonus; - } - } - - return previousBonus; - } - - public static double getIncenseBonusFromComponents(World world, BlockPos pos, double tranquility, int roads) { - double maxBonus = Math.min(getMaxIncenseBonusFromComponents(world, pos), getMaxIncenseBonusFromRoads(roads)); - double possibleBonus = 0; - - for (int i = 0; i < incenseBonuses.length; i++) { - if (tranquility >= tranquilityRequired[i]) { - possibleBonus = incenseBonuses[i]; - } else if (i >= 1) { - possibleBonus += (incenseBonuses[i] - possibleBonus) * (tranquility - tranquilityRequired[i - 1]) / (tranquilityRequired[i] - tranquilityRequired[i - 1]); - break; - } - } - - return Math.min(maxBonus, possibleBonus); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java b/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java deleted file mode 100644 index 8273d848..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/IncenseTranquilityRegistry.java +++ /dev/null @@ -1,28 +0,0 @@ -package WayofTime.bloodmagic.incense; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class IncenseTranquilityRegistry { - public static List handlerList = new ArrayList<>(); - - public static void registerTranquilityHandler(ITranquilityHandler handler) { - handlerList.add(handler); - } - - public static TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, BlockState state) { - for (ITranquilityHandler handler : handlerList) { - TranquilityStack tranq = handler.getTranquilityOfBlock(world, pos, block, state); - if (tranq != null) { - return tranq; - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java b/src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java deleted file mode 100644 index 7dd3de54..00000000 --- a/src/main/java/WayofTime/bloodmagic/incense/TranquilityStack.java +++ /dev/null @@ -1,11 +0,0 @@ -package WayofTime.bloodmagic.incense; - -public class TranquilityStack { - public final EnumTranquilityType type; - public double value; - - public TranquilityStack(EnumTranquilityType type, double value) { - this.type = type; - this.value = value; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java deleted file mode 100644 index baad0d7b..00000000 --- a/src/main/java/WayofTime/bloodmagic/inversion/CorruptionHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package WayofTime.bloodmagic.inversion; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.HashMap; -import java.util.Map; - -public class CorruptionHandler { - public static Map, Map> corruptBlockMap = new HashMap<>(); - - public static void registerBlockCorruption(EnumDemonWillType type, Block block, int meta, BlockState corruptedState) { - Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) { - Map stateMap = corruptBlockMap.get(pair); - stateMap.put(type, corruptedState); - } else { - Map stateMap = new HashMap<>(); - stateMap.put(type, corruptedState); - corruptBlockMap.put(pair, stateMap); - } - } - - public static boolean isBlockCorruptible(World world, EnumDemonWillType type, BlockPos pos, BlockState state, Block block) { - int meta = block.getMetaFromState(state); - Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) { - Map stateMap = corruptBlockMap.get(pair); - return stateMap.containsKey(type); - } - - return false; - } - - public static boolean corruptBlock(World world, EnumDemonWillType type, BlockPos pos, BlockState state, Block block) { - int meta = block.getMetaFromState(state); - Pair pair = Pair.of(block, meta); - if (corruptBlockMap.containsKey(pair)) { - Map stateMap = corruptBlockMap.get(pair); - if (stateMap.containsKey(type)) { - return world.setBlockState(pos, stateMap.get(type)); - } - } - - return false; - } - - /** - * @param world - * @param type - * @param centerPos - * @param radius - * @param featheringChance Chance that the block within the featheringDepth is NOT altered. - * @param featheringDepth - * @return - */ - public static boolean corruptSurroundingBlocks(World world, EnumDemonWillType type, BlockPos centerPos, int radius, double featheringChance, double featheringDepth) { - 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.5) * (radius + 0.5)) { - continue; - } - - if (featheringChance > 0 && i * i + j * j + k * k > (radius - featheringDepth + 0.5) * (radius - featheringDepth + 0.5) && world.rand.nextDouble() < featheringChance) { - continue; - } - - if (world.isAirBlock(centerPos)) { - continue; - } - - BlockPos offsetPos = centerPos.add(i, j, k); - BlockState offsetState = world.getBlockState(offsetPos); - Block offsetBlock = offsetState.getBlock(); - corruptBlock(world, type, offsetPos, offsetState, offsetBlock); - } - } - } - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java b/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java deleted file mode 100644 index 34a090ef..00000000 --- a/src/main/java/WayofTime/bloodmagic/inversion/InversionPillarHandler.java +++ /dev/null @@ -1,193 +0,0 @@ -package WayofTime.bloodmagic.inversion; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.*; - -public class InversionPillarHandler { - public static final double farthestDistanceSquared = 16 * 16; - public static Map>> pillarMap = new HashMap<>(); - public static Map>>> nearPillarMap = new HashMap<>(); - - public static boolean addPillarToMap(World world, EnumDemonWillType type, BlockPos pos) { - int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) { - Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) { - if (!willMap.get(type).contains(pos)) { - willMap.get(type).add(pos); - onPillarAdded(world, type, pos); - return true; - } else { - return false; - } - } else { - List posList = new ArrayList<>(); - posList.add(pos); - willMap.put(type, posList); - onPillarAdded(world, type, pos); - return true; - } - } else { - Map> willMap = new HashMap<>(); - List posList = new ArrayList<>(); - posList.add(pos); - - willMap.put(type, posList); - pillarMap.put(dim, willMap); - onPillarAdded(world, type, pos); - return true; - } - } - - public static boolean removePillarFromMap(World world, EnumDemonWillType type, BlockPos pos) { - int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) { - Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) { - if (willMap.get(type).contains(pos)) { - onPillarRemoved(world, type, pos); - return willMap.get(type).remove(pos); - } else { - return false; - } - } else { - return false; - } - } else { - return false; - } - } - - //Assume that it has been added already. - private static void onPillarAdded(World world, EnumDemonWillType type, BlockPos pos) { - BMLog.DEBUG.info("Adding..."); - List closePosList = new ArrayList<>(); - - int dim = world.provider.getDimension(); - if (pillarMap.containsKey(dim)) { - Map> willMap = pillarMap.get(dim); - if (willMap.containsKey(type)) { - List otherPosList = willMap.get(type); - - for (BlockPos closePos : otherPosList) { - if (!closePos.equals(pos) && closePos.distanceSq(pos) <= farthestDistanceSquared) { - closePosList.add(closePos); - } - } - - } - } - if (nearPillarMap.containsKey(dim)) { - Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) { - Map> posMap = willMap.get(type); - - for (BlockPos closePos : closePosList) { - List posList = posMap.get(closePos); - if (posList != null && !posList.contains(pos)) { - posList.add(pos); - } else { - posList = new ArrayList<>(); - posList.add(pos); - posMap.put(closePos, posList); - } - } - - posMap.put(pos, closePosList); - } else { - Map> posMap = new HashMap<>(); - - posMap.put(pos, closePosList); - willMap.put(type, posMap); - } - } else { - Map>> willMap = new HashMap<>(); - Map> posMap = new HashMap<>(); - - posMap.put(pos, closePosList); - willMap.put(type, posMap); - nearPillarMap.put(dim, willMap); - } - } - - private static void onPillarRemoved(World world, EnumDemonWillType type, BlockPos pos) { - BMLog.DEBUG.info("Removing..."); - int dim = world.provider.getDimension(); - if (nearPillarMap.containsKey(dim)) { - Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) { - Map> posMap = willMap.get(type); - List posList = posMap.get(pos); - if (posList != null) { - for (BlockPos checkPos : posList) { - List checkPosList = posMap.get(checkPos); - if (checkPosList != null) { - checkPosList.remove(pos); - } - } - - posMap.remove(pos); - } - } - } - } - - //TODO: Change to use the nearPillarMap. - public static List getNearbyPillars(World world, EnumDemonWillType type, BlockPos pos) { - int dim = world.provider.getDimension(); - if (nearPillarMap.containsKey(dim)) { - Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) { - Map> posMap = willMap.get(type); - List posList = posMap.get(pos); - if (posList != null) { - return posList; - } - } - } - - return new ArrayList<>(); - } - - public static List getAllConnectedPillars(World world, EnumDemonWillType type, BlockPos pos) { - List checkedPosList = new ArrayList<>(); - List uncheckedPosList = new ArrayList<>(); //Positions where we did not check their connections. - - uncheckedPosList.add(pos); - - int dim = world.provider.getDimension(); - if (nearPillarMap.containsKey(dim)) { - Map>> willMap = nearPillarMap.get(dim); - if (willMap.containsKey(type)) { - Map> posMap = willMap.get(type); - // This is where the magic happens. - - while (!uncheckedPosList.isEmpty()) { - //Positions that are new this iteration and need to be dumped into uncheckedPosList next iteration. - List newPosList = new ArrayList<>(); - - for (BlockPos checkPos : uncheckedPosList) { - List posList = posMap.get(checkPos); - if (posList != null) { - for (BlockPos testPos : posList) { - //Check if the position has already been checked, is scheduled to be checked, or is already found it needs to be checked. - if (!checkedPosList.contains(testPos) && !uncheckedPosList.contains(testPos) && !newPosList.contains(testPos)) { - newPosList.add(testPos); - } - } - } - } - - checkedPosList.addAll(uncheckedPosList); - uncheckedPosList = newPosList; - } - } - } - - return checkedPosList; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java deleted file mode 100644 index ca52fadd..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.Locale; - -public class ItemActivationCrystal extends ItemEnum.Variant implements IBindable { - - public ItemActivationCrystal() { - super(CrystalType.class, "activation_crystal"); - - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.activation_crystal." + getItemType(stack).getInternalName())); - - if (!stack.hasTagCompound()) - return; - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); - - super.addInformation(stack, world, tooltip, flag); - } - - public int getCrystalLevel(ItemStack stack) { - return stack.getItemDamage() > 1 ? Integer.MAX_VALUE : stack.getItemDamage() + 1; - } - - public enum CrystalType implements ISubItem { - WEAK, - AWAKENED, - CREATIVE, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java b/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java deleted file mode 100644 index 6c9f5b79..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAlchemicVial.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.item.types.AlchemicVialType; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; - -public class ItemAlchemicVial extends ItemEnum.Variant { - public ItemAlchemicVial() { - super(AlchemicVialType.class, "alchemic_vial"); - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (AlchemicVialType type : types) - variants.put(type.ordinal(), "type=normal"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java deleted file mode 100644 index 8ed4f7b7..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java +++ /dev/null @@ -1,140 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.*; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantProvider { - private AltarTier tierToBuild = AltarTier.ONE; - - public ItemAltarMaker() { - super(); - setTranslationKey(BloodMagic.MODID + ".altarMaker"); - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - setFull3D(); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentTier", stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - return super.onItemRightClick(world, player, hand); - - if (!player.capabilities.isCreativeMode) { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.creativeOnly"), true); - return super.onItemRightClick(world, player, hand); - } - - stack = NBTHelper.checkNBT(stack); - - if (player.isSneaking()) { - if (stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) >= AltarTier.MAXTIERS - 1) - stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, 0); - else - stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1); - - setTierToBuild(AltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)), true); - return super.onItemRightClick(world, player, hand); - } - - RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) - return super.onItemRightClick(world, player, hand); - - BlockState state = world.getBlockState(rayTrace.getBlockPos()); - if (state.getBlock() instanceof BlockAltar) { - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.building", NumeralHelper.toRoman(tierToBuild.toInt())), true); - buildAltar(world, rayTrace.getBlockPos()); - - world.notifyBlockUpdate(rayTrace.getBlockPos(), state, state, 3); - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=altarmaker"); // FIXME - } - - public void setTierToBuild(AltarTier tierToBuild) { - this.tierToBuild = tierToBuild; - } - - public void buildAltar(World world, BlockPos pos) { - if (world.isRemote) - return; - - if (tierToBuild == AltarTier.ONE) - return; - - for (AltarComponent altarComponent : tierToBuild.getAltarComponents()) { - BlockPos componentPos = pos.add(altarComponent.getOffset()); - if (altarComponent.getComponent() == ComponentType.NOTAIR) { - world.setBlockState(componentPos, Blocks.STONEBRICK.getDefaultState()); - continue; - } - - world.setBlockState(componentPos, BloodMagicAPI.INSTANCE.getComponentStates(altarComponent.getComponent()).get(0)); - } - - ((IBloodAltar) world.getTileEntity(pos)).checkTier(); - } - - public String destroyAltar(PlayerEntity player) { - World world = player.getEntityWorld(); - if (world.isRemote) - return ""; - - RayTraceResult rayTrace = rayTrace(world, player, false); - BlockPos pos = rayTrace.getBlockPos(); - BlockState state = world.getBlockState(pos); - AltarTier altarTier = AltarUtil.getTier(world, pos); - - if (altarTier.equals(AltarTier.ONE)) - return "" + altarTier.toInt(); - else { - for (AltarComponent altarComponent : altarTier.getAltarComponents()) { - BlockPos componentPos = pos.add(altarComponent.getOffset()); - world.setBlockToAir(componentPos); - } - } - - world.notifyBlockUpdate(pos, state, state, 3); - return String.valueOf(altarTier.toInt()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java deleted file mode 100644 index df8f3037..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -public class ItemArcaneAshes extends Item implements IVariantProvider { - public ItemArcaneAshes() { - setTranslationKey(BloodMagic.MODID + ".arcaneAshes"); - setMaxStackSize(1); - setMaxDamage(19); //Allows for 20 uses - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.arcaneAshes")); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos blockPos, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - BlockPos newPos = blockPos.offset(side); - - if (world.isAirBlock(newPos)) { - if (!world.isRemote) { - Direction rotation = Direction.fromAngle(player.getRotationYawHead()); - world.setBlockState(newPos, RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getDefaultState()); - TileEntity tile = world.getTileEntity(newPos); - if (tile instanceof TileAlchemyArray) { - ((TileAlchemyArray) tile).setRotation(rotation); - } - - stack.damageItem(1, player); - } - - return ActionResultType.SUCCESS; - } - - return ActionResultType.FAIL; - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - variants.put(0, "type=arcaneashes"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java b/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java deleted file mode 100644 index fb39ec76..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBindableBase.java +++ /dev/null @@ -1,34 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -public class ItemBindableBase extends Item implements IBindable { - public ItemBindableBase() { - super(); - - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentOwner", binding.getOwnerName()).getFormattedText()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java deleted file mode 100644 index 7b15599a..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodOrb.java +++ /dev/null @@ -1,123 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.*; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemGroup; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.*; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.List; - -public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb { - public ItemBloodOrb() { - setTranslationKey(BloodMagic.MODID + ".orb"); - this.setMaxDamage(0); - setHasSubtypes(true); - } - - @Override - public String getTranslationKey(ItemStack stack) { - BloodOrb orb = getOrb(stack); - if (orb == null) - return super.getTranslationKey(stack); - - return super.getTranslationKey(stack) + "." + orb.getName(); - } - - @Override - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (BloodOrb orb : RegistrarBloodMagic.BLOOD_ORBS) { - ItemStack orbStack = new ItemStack(this); - CompoundNBT tag = new CompoundNBT(); - tag.putString("orb", orb.getRegistryName().toString()); - orbStack.setTagCompound(tag); - list.add(orbStack); - } - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - BloodOrb orb = getOrb(stack); - - if (orb == null) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (world == null) - return super.onItemRightClick(world, player, hand); - - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); - - if (PlayerHelper.isFakePlayer(player)) - return super.onItemRightClick(world, player, hand); - - if (!stack.hasTagCompound()) - return super.onItemRightClick(world, player, hand); - - Binding binding = getBinding(stack); - if (binding == null) - return super.onItemRightClick(world, player, hand); - - if (world.isRemote) - return super.onItemRightClick(world, player, hand); - - SoulNetwork ownerNetwork = NetworkHelper.getSoulNetwork(binding); - if (binding.getOwnerId().equals(player.getGameProfile().getId())) - ownerNetwork.setOrbTier(orb.getTier()); - - ownerNetwork.add(SoulTicket.item(stack, world, player, 200), orb.getCapacity()); // Add LP to owner's network - ownerNetwork.hurtPlayer(player, 200); // Hurt whoever is using it - return super.onItemRightClick(world, player, hand); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.desc")); - - BloodOrb orb = getOrb(stack); - if (flag.isAdvanced() && orb != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.orb.owner", orb.getRegistryName().getNamespace())); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public ItemStack getContainerItem(ItemStack stack) { - return stack.copy(); - } - - @Override - public boolean hasContainerItem(ItemStack stack) { - return true; - } - - // IBloodOrb - - @Nullable - @Override - public BloodOrb getOrb(ItemStack stack) { - if (!stack.hasTagCompound()) - return null; - - ResourceLocation id = new ResourceLocation(stack.getTagCompound().getString("orb")); - return RegistrarBloodMagic.BLOOD_ORBS.getValue(id); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java deleted file mode 100644 index 934a4efd..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java +++ /dev/null @@ -1,112 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Set; -import java.util.function.Consumer; - -public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider { - private static final Set EFFECTIVE_ON = Sets.newHashSet(Blocks.PLANKS, Blocks.BOOKSHELF, Blocks.LOG, Blocks.LOG2, Blocks.CHEST, Blocks.PUMPKIN, Blocks.LIT_PUMPKIN, Blocks.MELON_BLOCK, Blocks.LADDER); - - public ItemBoundAxe() { - super("axe", 7, EFFECTIVE_ON); - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - return true; - } - - @Override - public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { - return true; - } - - @Override - protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { - if (world.isRemote) - return; - - int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; - - int range = charge / 6; //Charge is a max of 30 - want 5 to be the max - - HashMultiset drops = HashMultiset.create(); - - BlockPos playerPos = player.getPosition(); - - for (int i = -range; i <= range; i++) { - for (int j = 0; j <= 2 * range; j++) { - for (int k = -range; k <= range; k++) { - BlockPos blockPos = playerPos.add(i, j, k); - BlockState blockState = world.getBlockState(blockPos); - - if (world.isAirBlock(blockPos)) - continue; - - if (blockState.getMaterial() != Material.WOOD && !EFFECTIVE_ON.contains(blockState.getBlock())) - continue; - - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockPos, blockState, player); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) - continue; - - sharedHarvest(stack, world, player, blockPos, blockState, silkTouch, fortuneLvl); - } - } - } - - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, (int) (charge * charge * charge / 2.7))); - world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.1F, false); - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { - Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 11 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -3.0, 0)); - } - return multimap; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("bound_axe"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=true"); - variants.accept("active=false"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java deleted file mode 100644 index 9c648e11..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java +++ /dev/null @@ -1,123 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Set; -import java.util.function.Consumer; - -public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider { - private static final Set EFFECTIVE_ON = Sets.newHashSet(Blocks.ACTIVATOR_RAIL, Blocks.COAL_ORE, Blocks.COBBLESTONE, Blocks.DETECTOR_RAIL, Blocks.DIAMOND_BLOCK, Blocks.DIAMOND_ORE, Blocks.STONE_SLAB, Blocks.GOLDEN_RAIL, Blocks.GOLD_BLOCK, Blocks.GOLD_ORE, Blocks.ICE, Blocks.IRON_BLOCK, Blocks.IRON_ORE, Blocks.LAPIS_BLOCK, Blocks.LAPIS_ORE, Blocks.LIT_REDSTONE_ORE, Blocks.MOSSY_COBBLESTONE, Blocks.NETHERRACK, Blocks.PACKED_ICE, Blocks.RAIL, Blocks.REDSTONE_ORE, Blocks.SANDSTONE, Blocks.RED_SANDSTONE, Blocks.STONE, Blocks.STONE_SLAB); - - public ItemBoundPickaxe() { - super("pickaxe", 5, EFFECTIVE_ON); - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - return true; - } - - @Override - public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { - return true; - } - - @Override - public boolean canHarvestBlock(BlockState blockIn) { - return blockIn == Blocks.OBSIDIAN ? this.toolMaterial.getHarvestLevel() == 3 - : (blockIn != Blocks.DIAMOND_BLOCK && blockIn != Blocks.DIAMOND_ORE ? (blockIn != Blocks.EMERALD_ORE && blockIn != Blocks.EMERALD_BLOCK ? (blockIn != Blocks.GOLD_BLOCK && blockIn != Blocks.GOLD_ORE ? (blockIn != Blocks.IRON_BLOCK && blockIn != Blocks.IRON_ORE ? (blockIn != Blocks.LAPIS_BLOCK && blockIn != Blocks.LAPIS_ORE ? (blockIn != Blocks.REDSTONE_ORE && blockIn != Blocks.LIT_REDSTONE_ORE ? (blockIn.getMaterial() == Material.ROCK || (blockIn.getMaterial() == Material.IRON || blockIn.getMaterial() == Material.ANVIL)) : this.toolMaterial.getHarvestLevel() >= 2) - : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2); - } - - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - if (!getActivated(stack)) - return 1.0F; - - return state.getMaterial() != Material.IRON && state.getMaterial() != Material.ANVIL && state.getMaterial() != Material.ROCK ? super.getDestroySpeed(stack, state) : this.efficiency; - } - - @Override - protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { - if (world.isRemote) - return; - - int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; - - int range = (charge / 6); //Charge is a max of 30 - want 5 to be the max - - BlockPos playerPos = player.getPosition(); - - for (int i = -range; i <= range; i++) { - for (int j = 0; j <= 2 * range; j++) { - for (int k = -range; k <= range; k++) { - BlockPos blockPos = playerPos.add(i, j, k); - BlockState blockState = world.getBlockState(blockPos); - - if (world.isAirBlock(blockPos)) - continue; - - if (blockState.getMaterial() != Material.ROCK && !EFFECTIVE_ON.contains(blockState.getBlock())) - continue; - - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockPos, blockState, player); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) - continue; - - sharedHarvest(stack, world, player, blockPos, blockState, silkTouch, fortuneLvl); - } - } - } - - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, (int) (charge * charge * charge / 2.7))); - world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.5F, false); - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { - Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 5 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -2.5, 0)); - } - return multimap; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("bound_pickaxe"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=true"); - variants.accept("active=false"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java deleted file mode 100644 index 1606f0e5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java +++ /dev/null @@ -1,113 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.ItemStackWrapper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Set; -import java.util.function.Consumer; - -public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider { - private static final Set EFFECTIVE_ON = Sets.newHashSet(Blocks.CLAY, Blocks.DIRT, Blocks.FARMLAND, Blocks.GRASS, Blocks.GRAVEL, Blocks.MYCELIUM, Blocks.SAND, Blocks.SNOW, Blocks.SNOW_LAYER, Blocks.SOUL_SAND); - - public ItemBoundShovel() { - super("shovel", 1, EFFECTIVE_ON); - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - return true; - } - - @Override - public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { - return true; - } - - @Override - protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { - if (world.isRemote) - return; - int fortuneLvl = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, stack); - boolean silkTouch = EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0; - - int range = charge / 6; //Charge is a max of 30 - want 5 to be the max - - HashMultiset drops = HashMultiset.create(); - - BlockPos playerPos = player.getPosition(); - - - for (int i = -range; i <= range; i++) { - for (int j = 0; j <= 2 * range; j++) { - for (int k = -range; k <= range; k++) { - BlockPos blockPos = playerPos.add(i, j, k); - BlockState blockState = world.getBlockState(blockPos); - - if (world.isAirBlock(blockPos)) - continue; - - Material material = blockState.getMaterial(); - if (material != Material.GROUND && material != Material.CLAY && material != Material.GRASS && !EFFECTIVE_ON.contains(blockState.getBlock())) - continue; - - BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, blockPos, blockState, player); - if (MinecraftForge.EVENT_BUS.post(event) || event.getResult() == Event.Result.DENY) - continue; - - sharedHarvest(stack, world, player, blockPos, blockState, silkTouch, fortuneLvl); - } - } - } - - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, (int) (charge * charge * charge / 2.7))); - world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.5F, false); - } - - @Override - public Multimap getItemAttributeModifiers(EquipmentSlotType equipmentSlot) { - Multimap multimap = super.getItemAttributeModifiers(equipmentSlot); - if (equipmentSlot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", 5, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Tool modifier", -2.5, 0)); - } - return multimap; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("bound_shovel"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=true"); - variants.accept("active=false"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java deleted file mode 100644 index d3536283..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java +++ /dev/null @@ -1,135 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.IActivatable; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemGroup; -import net.minecraft.entity.*; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.item.ItemStack; -import net.minecraft.item.SwordItem; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.function.Consumer; - -public class ItemBoundSword extends SwordItem implements IBindable, IActivatable, IMeshProvider { - public ItemBoundSword() { - super(RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL); - - setTranslationKey(BloodMagic.MODID + ".bound.sword"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (player.isSneaking()) - setActivatedState(stack, !getActivated(stack)); - -// if (!player.isSneaking() && getActivated(stack)) -// { -// BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack); -// if (MinecraftForge.EVENT_BUS.post(event)) -// return new ActionResult(EnumActionResult.FAIL, event.result); -// -// player.setActiveHand(hand); -// return new ActionResult(EnumActionResult.SUCCESS, stack); -// } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - Binding binding = getBinding(stack); - if (binding == null) { - setActivatedState(stack, false); - return; - } - - if (entity instanceof PlayerEntity && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((PlayerEntity) entity, SoulTicket.item(stack, world, entity, 20)); - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - return true; - } - - @Override - public boolean onBlockDestroyed(ItemStack stack, World world, BlockState block, BlockPos pos, LivingEntity entityLiving) { - return true; - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup tab, NonNullList subItems) { - if (!isInCreativeTab(tab)) - return; - - subItems.add(Utils.setUnbreakable(new ItemStack(this))); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - if (TextHelper.canTranslate("tooltip.bloodmagic.bound.sword.desc")) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.bound.sword.desc")); - - tooltip.add(TextHelper.localize("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlotType equipmentSlot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (equipmentSlot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getActivated(stack) ? 8 : 2, 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4, 0)); - } - return multimap; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("bound_sword"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=true"); - variants.accept("active=false"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java deleted file mode 100644 index 83bedf2d..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java +++ /dev/null @@ -1,254 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.event.BoundToolEvent; -import WayofTime.bloodmagic.iface.IActivatable; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.*; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.item.ToolItem; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.items.ItemHandlerHelper; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class ItemBoundTool extends ToolItem implements IBindable, IActivatable { - public final int chargeTime = 30; - protected final String tooltipBase; - private final String name; - public Map heldDownMap = new HashMap<>(); - public Map heldDownCountMap = new HashMap<>(); - - public ItemBoundTool(String name, float damage, Set effectiveBlocks) { - super(damage, 1, RegistrarBloodMagicItems.BOUND_TOOL_MATERIAL, effectiveBlocks); - setTranslationKey(BloodMagic.MODID + ".bound." + name); - setCreativeTab(BloodMagic.TAB_BM); - setHarvestLevel(name, 4); - - this.name = name; - this.tooltipBase = "tooltip.bloodmagic.bound." + name + "."; - } - - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - return getActivated(stack) ? toolMaterial.getEfficiency() : 1.0F; - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return slotChanged; - } - - @Override - public void getSubItems(ItemGroup tab, NonNullList subItems) { - if (!isInCreativeTab(tab)) - return; - - subItems.add(Utils.setUnbreakable(new ItemStack(this))); - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - Binding binding = getBinding(stack); - if (binding == null) { - setActivatedState(stack, false); - return; - } - - if (entity instanceof PlayerEntity && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((PlayerEntity) entity).getActiveItemStack()) { - PlayerEntity player = (PlayerEntity) entity; - setHeldDownCount(stack, Math.min(player.getItemInUseCount(), chargeTime)); - } else if (!isSelected) { - setBeingHeldDown(stack, false); - } - - if (entity instanceof PlayerEntity && getActivated(stack) && world.getTotalWorldTime() % 80 == 0) - NetworkHelper.getSoulNetwork(binding).syphonAndDamage((PlayerEntity) entity, SoulTicket.item(stack, world, entity, 20)); - } - - protected int getHeldDownCount(ItemStack stack) { - if (!heldDownCountMap.containsKey(stack)) - return 0; - - return heldDownCountMap.get(stack); - } - - protected void setHeldDownCount(ItemStack stack, int count) { - heldDownCountMap.put(stack, count); - } - - protected boolean getBeingHeldDown(ItemStack stack) { - if (!heldDownMap.containsKey(stack)) - return false; - - return heldDownMap.get(stack); - } - - protected void setBeingHeldDown(ItemStack stack, boolean heldDown) { - heldDownMap.put(stack, heldDown); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (player.isSneaking()) - setActivatedState(stack, !getActivated(stack)); - - if (!player.isSneaking() && getActivated(stack)) { - BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack); - if (MinecraftForge.EVENT_BUS.post(event)) - return new ActionResult<>(ActionResultType.FAIL, event.result); - - player.setActiveHand(hand); - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) { - if (entityLiving instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entityLiving; - if (!player.isSneaking() && getActivated(stack)) { - int i = this.getMaxItemUseDuration(stack) - timeLeft; - BoundToolEvent.Release event = new BoundToolEvent.Release(player, stack, i); - if (MinecraftForge.EVENT_BUS.post(event)) - return; - - i = event.charge; - - onBoundRelease(stack, worldIn, player, Math.min(i, chargeTime)); - setBeingHeldDown(stack, false); - } - } - } - - protected void onBoundRelease(ItemStack stack, World world, PlayerEntity player, int charge) { - - } - - @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, LivingEntity entityLiving) { - return stack; - } - - @Override - public int getMaxItemUseDuration(ItemStack stack) { - return 72000; - } - - @Override - public UseAction getItemUseAction(ItemStack stack) { - return UseAction.BOW; - } - - @Override - public int getItemEnchantability() { - return 50; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (TextHelper.canTranslate(tooltipBase + "desc")) - tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc")); - - tooltip.add(TextHelper.localize("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated"))); - - if (!stack.hasTagCompound()) - return; - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public Set getToolClasses(ItemStack stack) { - return ImmutableSet.of(name); - } - - public Multimap getItemAttributeModifiers(EquipmentSlotType equipmentSlot) { - return ArrayListMultimap.create(); // No-op - } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return getActivated(stack) && getBeingHeldDown(stack); - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - return ((double) -Math.min(getHeldDownCount(stack), chargeTime) / chargeTime) + 1; - } - - public String getTooltipBase() { - return tooltipBase; - } - - public String getName() { - return name; - } - - public Map getHeldDownMap() { - return heldDownMap; - } - - public Map getHeldDownCountMap() { - return heldDownCountMap; - } - - public int getChargeTime() { - return chargeTime; - } - - protected void sharedHarvest(ItemStack stack, World world, PlayerEntity player, BlockPos blockPos, BlockState blockState, boolean silkTouch, int fortuneLvl) { - - if (blockState.getBlockHardness(world, blockPos) != -1.0F) { - float strengthVsBlock = getDestroySpeed(stack, blockState); - - if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) { - if (!player.isCreative()) - if (silkTouch && blockState.getBlock().canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player)) - ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(Item.getItemFromBlock(blockState.getBlock()))); - else { - NonNullList itemDrops = NonNullList.create(); - blockState.getBlock().getDrops(itemDrops, world, blockPos, world.getBlockState(blockPos), fortuneLvl); - for (ItemStack stacks : itemDrops) - ItemHandlerHelper.giveItemToPlayer(player, stacks); - } - blockState.getBlock().removedByPlayer(world.getBlockState(blockPos), world, blockPos, player, false); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java deleted file mode 100644 index 3d4f6c19..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java +++ /dev/null @@ -1,84 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.util.helper.PurificationHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.SoundCategory; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityRegistry; - -import javax.annotation.Nonnull; - -public class ItemDaggerOfSacrifice extends Item implements IVariantProvider { - public ItemDaggerOfSacrifice() { - super(); - setTranslationKey(BloodMagic.MODID + ".daggerOfSacrifice"); - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - setFull3D(); - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (attacker instanceof FakePlayer) - return false; - - if (target == null || attacker == null || attacker.getEntityWorld().isRemote || (attacker instanceof PlayerEntity && !(attacker instanceof ServerPlayerEntity))) - return false; - - if (!target.isNonBoss()) - return false; - - if (target instanceof PlayerEntity) - return false; - - if (target.isChild() && !(target instanceof IMob)) - return false; - - if (target.isDead || target.getHealth() < 0.5F) - return false; - - EntityEntry entityEntry = EntityRegistry.getEntry(target.getClass()); - if (entityEntry == null) - return false; - int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getValueManager().getSacrificial().getOrDefault(entityEntry.getRegistryName(), 25); - - if (lifeEssenceRatio <= 0) - return false; - - int lifeEssence = (int) (lifeEssenceRatio * target.getHealth()); - if (target instanceof AnimalEntity) { - lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((AnimalEntity) target))); - } - - if (target.isChild()) { - lifeEssence *= 0.5F; - } - - if (PlayerSacrificeHelper.findAndFillAltar(attacker.getEntityWorld(), target, lifeEssence, true)) { - target.getEntityWorld().playSound(null, target.posX, target.posY, target.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (target.getEntityWorld().rand.nextFloat() - target.getEntityWorld().rand.nextFloat()) * 0.8F); - target.setHealth(-1); - target.onDeath(DamageSourceBloodMagic.INSTANCE); - } - - return false; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java deleted file mode 100644 index 4e62706e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java +++ /dev/null @@ -1,45 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDiscreteDemonWill; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; - -public class ItemDemonCrystal extends ItemEnum.Variant implements IDiscreteDemonWill { - - public ItemDemonCrystal() { - super(EnumDemonWillType.class, "demonCrystal"); - - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public double getWill(ItemStack willStack) { - return getDiscretization(willStack) * willStack.getCount(); - } - - @Override - public double drainWill(ItemStack willStack, double drainAmount) { - double discretization = getDiscretization(willStack); - int drainedNumber = (int) Math.floor(Math.min(willStack.getCount() * discretization, drainAmount) / discretization); - - if (drainedNumber > 0) { - willStack.shrink(drainedNumber); - return drainedNumber * discretization; - } - - return 0; - } - - @Override - public double getDiscretization(ItemStack willStack) { - return 50; - } - - @Override - public EnumDemonWillType getType(ItemStack willStack) { - return EnumDemonWillType.values()[MathHelper.clamp(willStack.getMetadata(), 0, EnumDemonWillType.values().length - 1)]; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java deleted file mode 100644 index e26e7d49..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.IDemonWillViewer; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; - -public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemonWillViewer { - public ItemDemonWillGauge() { - setTranslationKey(BloodMagic.MODID + ".willGauge"); - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.willGauge")))); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=willgauge"); - } - - @Override - public boolean canSeeDemonWillAura(World world, ItemStack stack, PlayerEntity player) { - return true; - } - - @Override - public int getDemonWillAuraResolution(World world, ItemStack stack, PlayerEntity player) { - return 100; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java deleted file mode 100644 index bec6de84..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java +++ /dev/null @@ -1,60 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.types.ISubItem; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class ItemEnum & ISubItem> extends Item { - - protected final T[] types; - - public ItemEnum(Class enumClass, String baseName) { - super(); - - this.types = enumClass.getEnumConstants(); - - setTranslationKey(BloodMagic.MODID + "." + baseName); - setHasSubtypes(types.length > 1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + "." + getItemType(stack).getInternalName(); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup tab, NonNullList subItems) { - if (!isInCreativeTab(tab)) - return; - - for (T type : types) - subItems.add(new ItemStack(this, 1, type.ordinal())); - } - - public T getItemType(ItemStack stack) { - return types[MathHelper.clamp(stack.getItemDamage(), 0, types.length - 1)]; - } - - public static class Variant & ISubItem> extends ItemEnum implements IVariantProvider { - - public Variant(Class enumClass, String baseName) { - super(enumClass, baseName); - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - for (int i = 0; i < types.length; i++) - variants.put(i, "type=" + types[i].getInternalName()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java deleted file mode 100644 index 426c4679..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ /dev/null @@ -1,184 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemExperienceBook extends Item implements IVariantProvider { - public ItemExperienceBook() { - setTranslationKey(BloodMagic.MODID + ".experienceTome"); - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public boolean hasEffect(ItemStack stack) { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome")); - - if (!stack.hasTagCompound()) - return; - - double storedExp = getStoredExperience(stack); - - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome.exp", (int) storedExp)); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.experienceTome.expLevel", (int) getLevelForExperience(storedExp))); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) { - if (player.isSneaking()) - absorbOneLevelExpFromPlayer(stack, player); - else - giveOneLevelExpToPlayer(stack, player); - } - - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=experiencetome"); - } - - public void giveOneLevelExpToPlayer(ItemStack stack, PlayerEntity player) { - float progress = player.experience; - int expToNext = getExperienceForNextLevel(player.experienceLevel); - - int neededExp = (int) Math.ceil((1 - progress) * expToNext); - float containedExp = (float) getStoredExperience(stack); - - BMLog.DEBUG.info("Needed: " + neededExp + ", contained: " + containedExp + ", exp to next: " + expToNext); - - if (containedExp >= neededExp) { - setStoredExperience(stack, containedExp - neededExp); - addPlayerXP(player, neededExp); - - if (player.experienceLevel % 5 == 0) { - float f = player.experienceLevel > 30 ? 1.0F : (float) player.experienceLevel / 30.0F; - player.getEntityWorld().playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_LEVELUP, player.getSoundCategory(), f * 0.75F, 1.0F); - } - } else { - setStoredExperience(stack, 0); - addPlayerXP(player, (int) containedExp); - } - } - - public void absorbOneLevelExpFromPlayer(ItemStack stack, PlayerEntity player) { - float progress = player.experience; - - if (progress > 0) { - int expDeduction = (int) getExperienceAcquiredToNext(player); - if (expDeduction > 0) { - addPlayerXP(player, -expDeduction); - addExperience(stack, expDeduction); - } - } else if (progress == 0 && player.experienceLevel > 0) { - int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1); - addPlayerXP(player, -expDeduction); - addExperience(stack, expDeduction); - } - } - - // Credits to Ender IO for some of the experience code, although now modified slightly for my convenience. - public static int getPlayerXP(PlayerEntity player) { - return (int) (getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap())); - } - - public static void addPlayerXP(PlayerEntity player, int amount) { - int experience = Math.max(0, getPlayerXP(player) + amount); - player.experienceTotal = experience; - player.experienceLevel = getLevelForExperience(experience); - int expForLevel = getExperienceForLevel(player.experienceLevel); - player.experience = (float) (experience - expForLevel) / (float) player.xpBarCap(); - } - - public static void setStoredExperience(ItemStack stack, double exp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("experience", exp); - } - - public static double getStoredExperience(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - return tag.getDouble("experience"); - } - - public static void addExperience(ItemStack stack, double exp) { - setStoredExperience(stack, getStoredExperience(stack) + exp); - } - - public static int getExperienceForNextLevel(int currentLevel) { - if (currentLevel < 16) { - return 2 * currentLevel + 7; - } else if (currentLevel < 31) { - return 5 * currentLevel - 38; - } else { - return 9 * currentLevel - 158; - } - } - - //TODO: Change to calculation form. - public static int getExperienceForLevel(int level) { - if (level >= 21863) { - return Integer.MAX_VALUE; - } - if (level == 0) { - return 0; - } - int res = 0; - for (int i = 0; i < level; i++) { - res += getExperienceForNextLevel(i); - } - return res; - } - - public static double getExperienceAcquiredToNext(PlayerEntity player) { - return player.experience * player.xpBarCap(); - } - - public static int getLevelForExperience(double exp) { - if (exp <= 352) { - return (int) Math.floor(solveParabola(1, 6, -exp)); - } else if (exp <= 1507) { - return (int) Math.floor(solveParabola(2.5, -40.5, 360 - exp)); - } else { - return (int) Math.floor(solveParabola(4.5, -162.5, 2220 - exp)); - } - } - - public static double solveParabola(double a, double b, double c) { - return (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java deleted file mode 100644 index fda68ca5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java +++ /dev/null @@ -1,108 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.block.BlockRitualStone; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Arrays; -import java.util.List; - -public class ItemInscriptionTool extends ItemEnum.Variant implements IBindable { - - public ItemInscriptionTool() { - super(EnumRuneType.class, "scribe"); - - setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (EnumRuneType runeType : types) { - if (runeType == EnumRuneType.BLANK || !ConfigHandler.general.enableTierSixEvenThoughThereIsNoContent && runeType == EnumRuneType.DAWN) - continue; - - ItemStack stack = new ItemStack(this, 1, runeType.ordinal()); - CompoundNBT tag = new CompoundNBT(); - tag.putInt(Constants.NBT.USES, 10); - stack.setTagCompound(tag); - list.add(stack); - } - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - BlockState state = world.getBlockState(pos); - - if (state.getBlock() instanceof BlockRitualStone && !((BlockRitualStone) state.getBlock()).isRuneType(world, pos, getItemType(stack))) { - stack = NBTHelper.checkNBT(stack); - int uses = stack.getTagCompound().getInteger(Constants.NBT.USES); - - world.setBlockState(pos, state.withProperty(((BlockRitualStone) state.getBlock()).getProperty(), getItemType(stack))); - if (!player.capabilities.isCreativeMode) { - stack.getTagCompound().setInteger(Constants.NBT.USES, --uses); - if (uses <= 0) - player.inventory.setInventorySlotContents(player.inventory.currentItem, ItemStack.EMPTY); - } - return ActionResultType.SUCCESS; - } - - return ActionResultType.FAIL; - } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return stack.hasTagCompound(); - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - int uses = stack.getTagCompound().getInteger(Constants.NBT.USES); - - return 1.0 - ((double) uses / (double) 10); - } - - @Override - public int getRGBDurabilityForDisplay(ItemStack stack) { - int uses = stack.getTagCompound().getInteger(Constants.NBT.USES); - - return MathHelper.hsvToRGB(Math.max(0.0F, (float) (uses) / 10) / 3.0F, 1.0F, 1.0F); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.inscriber.desc")))); - - if (!stack.hasTagCompound()) - return; - - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java deleted file mode 100644 index 78ad52d6..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java +++ /dev/null @@ -1,109 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.advancements.CriteriaTriggers; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.util.*; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.INBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -// TODO: Make some hook somewhere that attaches the pos to the ticket otherwise the tickets are basically useless lmao -public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvider { - - public ItemLavaCrystal() { - super(); - setTranslationKey(BloodMagic.MODID + ".lavaCrystal"); - } - - @Override - public ItemStack getContainerItem(ItemStack stack) { - Binding binding = getBinding(stack); - if (binding != null) - NetworkHelper.getSoulNetwork(binding.getOwnerId()).syphon(SoulTicket.item(stack, 25)); - - ItemStack returnStack = new ItemStack(this); - returnStack.setTagCompound(stack.getTagCompound()); - return returnStack; - } - - @Override - public boolean hasContainerItem(ItemStack stack) { - return true; - } - - @Override - public int getItemBurnTime(ItemStack stack) { - Binding binding = getBinding(stack); - if (binding == null) - return -1; - - if (NetworkHelper.syphonFromContainer(stack, SoulTicket.item(stack, 25))) - return 200; - else { - PlayerEntity player = PlayerHelper.getPlayerFromUUID(binding.getOwnerId()); - if (player != null) - player.addPotionEffect(new EffectInstance(Effects.NAUSEA, 99)); - } - - return -1; - } - - @Nullable - @Override - public Binding getBinding(ItemStack stack) { - if (stack.getTagCompound() == null) // hasTagCompound doesn't work on empty stacks with tags - return null; - - INBT bindingTag = stack.getTagCompound().getTag("binding"); - if (bindingTag == null || bindingTag.getId() != 10 || bindingTag.isEmpty()) // Make sure it's both a tag compound and that it has actual data. - return null; - - CompoundNBT nbt = (CompoundNBT) bindingTag; - return new Binding(NBTUtil.getUUIDFromTag(nbt.getCompound("id")), nbt.getString("name")); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World worldIn, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - pos = pos.offset(facing); - ItemStack itemstack = player.getHeldItem(hand); - - if (!player.canPlayerEdit(pos, facing, itemstack)) - return ActionResultType.FAIL; - - if (worldIn.isAirBlock(pos) && NetworkHelper.getSoulNetwork(getBinding(player.getHeldItem(hand))).syphonAndDamage(player, SoulTicket.item(player.getHeldItem(hand), 100)).isSuccess()) { - worldIn.playSound(player, pos, SoundEvents.ITEM_FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, itemRand.nextFloat() * 0.4F + 0.8F); - worldIn.setBlockState(pos, Blocks.FIRE.getDefaultState(), 11); - } else - return ActionResultType.FAIL; - - if (player instanceof ServerPlayerEntity) - CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, pos, itemstack); - - return ActionResultType.SUCCESS; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java deleted file mode 100644 index b97c9313..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java +++ /dev/null @@ -1,133 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.UseAction; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.PotionUtils; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.function.Consumer; - -public class ItemPotionFlask extends Item implements IMeshProvider { - public ItemPotionFlask() { - setTranslationKey(BloodMagic.MODID + ".potionFlask"); - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - setMaxDamage(8); - setNoRepair(); - } - - @Override - public ItemStack onItemUseFinish(ItemStack stack, World world, LivingEntity entityLiving) { - PlayerEntity player = entityLiving instanceof PlayerEntity ? (PlayerEntity) entityLiving : null; - - int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); - if (remainingUses <= 0) { - NBTHelper.checkNBT(stack); - stack.getTagCompound().setBoolean("empty", true); - return stack; - } - - if (player == null || !player.capabilities.isCreativeMode) { - stack.setItemDamage(stack.getItemDamage() + 1); - } - - if (!world.isRemote) { - for (EffectInstance potioneffect : PotionUtils.getEffectsFromStack(stack)) { - entityLiving.addPotionEffect(new EffectInstance(potioneffect)); - } - } - - return stack; - } - - @Override - public int getMaxItemUseDuration(ItemStack stack) { - return 32; - } - - @Override - public UseAction getItemUseAction(ItemStack stack) { - return UseAction.DRINK; - } - - @Override - public boolean isDamaged(ItemStack stack) { - return false; - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); - if (remainingUses > 0 || !stack.hasTagCompound() || !stack.getTagCompound().hasKey("empty")) - return ActionResultType.PASS; - - RayTraceResult trace = rayTrace(world, player, true); - - if (trace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(trace.getBlockPos()).getMaterial() == Material.WATER) { - world.playSound(player, player.posX, player.posY, player.posZ, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.NEUTRAL, 1.0F, 1.0F); - player.setHeldItem(hand, new ItemStack(this)); - return ActionResultType.SUCCESS; - } - - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - int remainingUses = stack.getMaxDamage() - stack.getItemDamage(); - if (remainingUses <= 0) { - NBTHelper.checkNBT(stack); - stack.getTagCompound().setBoolean("empty", true); - return new ActionResult<>(ActionResultType.PASS, stack); - } - player.setActiveHand(hand); - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - PotionUtils.addPotionTooltip(stack, tooltip, 1.0F); - tooltip.add(""); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.potion.uses", stack.getMaxDamage() - stack.getItemDamage())); - } - - - @SideOnly(Side.CLIENT) - @Override - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - boolean full = true; - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) - full = false; - return new ModelResourceLocation(getRegistryName(), "full=" + full); - }; - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("full=true"); - variants.accept("full=false"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java deleted file mode 100644 index af90c890..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDismantler.java +++ /dev/null @@ -1,78 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.block.BlockRitualStone; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.RitualHelper; -import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.ItemHandlerHelper; - -import java.util.List; - -public class ItemRitualDismantler extends Item implements IVariantProvider { - public ItemRitualDismantler() { - setTranslationKey(BloodMagic.MODID + ".ritualDismantler"); - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - Block block = world.getBlockState(pos).getBlock(); - TileEntity tileEntity = world.getTileEntity(pos); - ItemStack stack = player.getHeldItem(hand); - - if (tileEntity instanceof TileMasterRitualStone) { - TileMasterRitualStone masterRitualStone = (TileMasterRitualStone) tileEntity; - Direction direction = masterRitualStone.getDirection(); - - String ritualName = RitualHelper.getValidRitual(world, pos); - masterRitualStone.setActive(false); - - if (ritualName.equals("")) { - world.setBlockToAir(pos); - ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER)); - NetworkHelper.getSoulNetwork(player).syphon(SoulTicket.item(stack, 100)); - return ActionResultType.SUCCESS; - } - - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(ritualName); - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - for (RitualComponent component : components) { - BlockPos newPos = pos.add(component.getOffset(direction)); - if (world.getBlockState(newPos).getBlock() instanceof BlockRitualStone) { - world.setBlockToAir(newPos); - ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); - } - } - - NetworkHelper.getSoulNetwork(player).syphon(SoulTicket.item(stack, 200)); // smallest Ritual has 4 stones - return ActionResultType.SUCCESS; - - } else if (player.isSneaking() && block instanceof BlockRitualStone) { - block.removedByPlayer(world.getBlockState(pos), world, pos, player, false); - ItemHandlerHelper.giveItemToPlayer(player, new ItemStack(RegistrarBloodMagicBlocks.RITUAL_STONE)); - NetworkHelper.getSoulNetwork(player).syphon(SoulTicket.item(stack, 50)); - return ActionResultType.SUCCESS; - } - - return ActionResultType.FAIL; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java deleted file mode 100644 index bb914f7e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java +++ /dev/null @@ -1,517 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.handler.event.ClientHandler; -import WayofTime.bloodmagic.util.helper.RitualHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.input.Keyboard; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class ItemRitualDiviner extends Item implements IVariantProvider { - public static final String tooltipBase = "tooltip.bloodmagic.diviner."; - public static String[] names = {"normal", "dusk", "dawn"}; - - public ItemRitualDiviner() { - setTranslationKey(BloodMagic.MODID + ".ritualDiviner"); - setCreativeTab(BloodMagic.TAB_BM); - setHasSubtypes(true); - setMaxStackSize(1); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[stack.getItemDamage()]; - } - - @Override - public String getHighlightTip(ItemStack stack, String displayName) { - if (Strings.isNullOrEmpty(getCurrentRitual(stack))) - return displayName; - - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(getCurrentRitual(stack)); - if (ritual == null) - return displayName; - - return displayName + ": " + TextHelper.localize(ritual.getTranslationKey()); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (player.isSneaking()) { - if (world.isRemote) { - trySetDisplayedRitual(stack, world, pos); - } - - return ActionResultType.SUCCESS; - } else if (addRuneToRitual(stack, world, pos, player)) { - if (world.isRemote) { - spawnParticles(world, pos.up(), 15); - } - - return ActionResultType.SUCCESS; - // TODO: Have the diviner automagically build the ritual - } - - return ActionResultType.PASS; - } - - /** - * Adds a single rune to the ritual. - * - * @param stack - The Ritual Diviner stack - * @param world - The World - * @param pos - Block Position of the MRS. - * @param player - The Player attempting to place the ritual - * @return - True if a rune was successfully added - */ - public boolean addRuneToRitual(ItemStack stack, World world, BlockPos pos, PlayerEntity player) { - TileEntity tile = world.getTileEntity(pos); - - if (tile instanceof TileMasterRitualStone) { - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); - if (ritual != null) { - Direction direction = getDirection(stack); - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - for (RitualComponent component : components) { - if (!canPlaceRitualStone(component.getRuneType(), stack)) { - return false; - } - BlockPos offset = component.getOffset(direction); - BlockPos newPos = pos.add(offset); - BlockState state = world.getBlockState(newPos); - Block block = state.getBlock(); - if (RitualHelper.isRune(world, newPos)) { - if (RitualHelper.isRuneType(world, newPos, component.getRuneType())) { - if (world.isRemote) { - undisplayHologram(); - } - } else { - // Replace existing ritual stone - RitualHelper.setRuneType(world, newPos, component.getRuneType()); - return true; - } - } else if (block.isAir(state, world, newPos) || block.isReplaceable(world, newPos)) { - if (!consumeStone(stack, world, player)) { - return false; - } - int meta = component.getRuneType().ordinal(); - BlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); - world.setBlockState(newPos, newState); - return true; - } else { - return false; // TODO: Possibly replace the block with a - // ritual stone - } - } - } - } - - return false; - } - - @SideOnly(Side.CLIENT) - public void trySetDisplayedRitual(ItemStack itemStack, World world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - - if (tile instanceof TileMasterRitualStone) { - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(itemStack)); - TileMasterRitualStone masterRitualStone = (TileMasterRitualStone) tile; - - if (ritual != null) { - Direction direction = getDirection(itemStack); - ClientHandler.setRitualHolo(masterRitualStone, ritual, direction, true); - } - } - } - - @SideOnly(Side.CLIENT) - public void undisplayHologram() { - ClientHandler.setRitualHoloToNull(); - } - - // TODO: Make this work for any IRitualStone - public boolean consumeStone(ItemStack stack, World world, PlayerEntity player) { - if (player.capabilities.isCreativeMode) { - return true; - } - - NonNullList inventory = player.inventory.mainInventory; - for (ItemStack newStack : inventory) { - if (newStack.isEmpty()) { - - continue; - } - Item item = newStack.getItem(); - if (item instanceof BlockItem) { - Block block = ((BlockItem) item).getBlock(); - if (block == RegistrarBloodMagicBlocks.RITUAL_STONE) { - newStack.shrink(1); - return true; - } - } - } - - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(this.getCurrentRitual(stack)); - if (ritual != null) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.diviner.currentRitual", TextHelper.localize(ritual.getTranslationKey()))); - - boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); - boolean extraInfo = sneaking && Keyboard.isKeyDown(Keyboard.KEY_M); - - if (extraInfo) { - tooltip.add(""); - - for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (TextHelper.canTranslate(ritual.getTranslationKey() + "." + type.getName().toLowerCase() + ".info")) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getTranslationKey() + "." + type.getName().toLowerCase() + ".info")))); - } - } - } else if (sneaking) { - tooltip.add(TextHelper.localize(tooltipBase + "currentDirection", Utils.toFancyCasing(getDirection(stack).getName()))); - tooltip.add(""); - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - - int blankRunes = 0; - int airRunes = 0; - int waterRunes = 0; - int fireRunes = 0; - int earthRunes = 0; - int duskRunes = 0; - int dawnRunes = 0; - int totalRunes = components.size(); - - for (RitualComponent component : components) { - switch (component.getRuneType()) { - case BLANK: - blankRunes++; - break; - case AIR: - airRunes++; - break; - case EARTH: - earthRunes++; - break; - case FIRE: - fireRunes++; - break; - case WATER: - waterRunes++; - break; - case DUSK: - duskRunes++; - break; - case DAWN: - dawnRunes++; - break; - } - } - - if (blankRunes > 0) - tooltip.add(EnumRuneType.BLANK.colorCode + TextHelper.localize(tooltipBase + "blankRune", blankRunes)); - if (waterRunes > 0) - tooltip.add(EnumRuneType.WATER.colorCode + TextHelper.localize(tooltipBase + "waterRune", waterRunes)); - if (airRunes > 0) - tooltip.add(EnumRuneType.AIR.colorCode + TextHelper.localize(tooltipBase + "airRune", airRunes)); - if (fireRunes > 0) - tooltip.add(EnumRuneType.FIRE.colorCode + TextHelper.localize(tooltipBase + "fireRune", fireRunes)); - if (earthRunes > 0) - tooltip.add(EnumRuneType.EARTH.colorCode + TextHelper.localize(tooltipBase + "earthRune", earthRunes)); - if (duskRunes > 0) - tooltip.add(EnumRuneType.DUSK.colorCode + TextHelper.localize(tooltipBase + "duskRune", duskRunes)); - if (dawnRunes > 0) - tooltip.add(EnumRuneType.DAWN.colorCode + TextHelper.localize(tooltipBase + "dawnRune", dawnRunes)); - - tooltip.add(""); - tooltip.add(TextHelper.localize(tooltipBase + "totalRune", totalRunes)); - } else { - tooltip.add(""); - if (TextHelper.canTranslate(ritual.getTranslationKey() + ".info")) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(ritual.getTranslationKey() + ".info")))); - tooltip.add(""); - } - - tooltip.add(TextHelper.localizeEffect(tooltipBase + "extraInfo")); - tooltip.add(TextHelper.localizeEffect(tooltipBase + "extraExtraInfo")); - } - } - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - RayTraceResult ray = this.rayTrace(world, player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { - return new ActionResult<>(ActionResultType.PASS, stack); - } - - if (player.isSneaking()) { - if (!world.isRemote) { - cycleRitual(stack, player, false); - } - - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - return new ActionResult<>(ActionResultType.PASS, stack); - } - - @Override - public boolean onEntitySwing(LivingEntity entityLiving, ItemStack stack) { - if (!entityLiving.world.isRemote && entityLiving instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entityLiving; - - RayTraceResult ray = this.rayTrace(player.getEntityWorld(), player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { - return false; - } - - if (!player.isSwingInProgress) { - if (player.isSneaking()) { - cycleRitual(stack, player, true); - } else { - cycleDirection(stack, player); - } - } - } - - return false; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=basic"); - variants.put(1, "type=dusk"); - variants.put(2, "type=dawn"); - } - - public void cycleDirection(ItemStack stack, PlayerEntity player) { - Direction direction = getDirection(stack); - Direction newDirection; - switch (direction) { - case NORTH: - newDirection = Direction.EAST; - break; - case EAST: - newDirection = Direction.SOUTH; - break; - case SOUTH: - newDirection = Direction.WEST; - break; - case WEST: - newDirection = Direction.NORTH; - break; - default: - newDirection = Direction.NORTH; - } - - setDirection(stack, newDirection); - notifyDirectionChange(newDirection, player); - } - - public void notifyDirectionChange(Direction direction, PlayerEntity player) { - player.sendStatusMessage(new TranslationTextComponent(tooltipBase + "currentDirection", Utils.toFancyCasing(direction.name())), true); - } - - public void setDirection(ItemStack stack, Direction direction) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - } - - CompoundNBT tag = stack.getTagCompound(); - - tag.putInt(Constants.NBT.DIRECTION, direction.getIndex()); - } - - public Direction getDirection(ItemStack stack) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - return Direction.NORTH; - } - - CompoundNBT tag = stack.getTagCompound(); - - int dir = tag.getInt(Constants.NBT.DIRECTION); - if (dir == 0) { - return Direction.NORTH; - } - - return Direction.VALUES[tag.getInt(Constants.NBT.DIRECTION)]; - } - - /** - * Cycles the ritual forward or backward - */ - public void cycleRitual(ItemStack stack, PlayerEntity player, boolean reverse) { - String key = getCurrentRitual(stack); - List rituals = BloodMagic.RITUAL_MANAGER.getSortedRituals(); - if (reverse) - Collections.reverse(rituals = Lists.newArrayList(rituals)); - - String firstId = ""; - boolean foundId = false; - boolean foundFirst = false; - - for (Ritual ritual : rituals) { - String id = BloodMagic.RITUAL_MANAGER.getId(ritual); - - if (!BloodMagic.RITUAL_MANAGER.enabled(id, false) || !canDivinerPerformRitual(stack, ritual)) { - continue; - } - - if (!foundFirst) { - firstId = id; - foundFirst = true; - } - - if (foundId) { - setCurrentRitual(stack, id); - notifyRitualChange(id, player); - return; - } else if (id.equals(key)) { - foundId = true; - } - } - - if (foundFirst) { - setCurrentRitual(stack, firstId); - notifyRitualChange(firstId, player); - } - } - - public boolean canDivinerPerformRitual(ItemStack stack, Ritual ritual) { - if (ritual == null) { - return false; - } - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - for (RitualComponent component : components) { - if (!canPlaceRitualStone(component.getRuneType(), stack)) { - return false; - } - } - - return true; - } - - public void notifyRitualChange(String key, PlayerEntity player) { - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(key); - if (ritual != null) { - player.sendStatusMessage(new TranslationTextComponent(ritual.getTranslationKey()), true); - } - } - - public void setCurrentRitual(ItemStack stack, String key) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - } - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString("current_ritual", key); - } - - public String getCurrentRitual(ItemStack stack) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - } - - CompoundNBT tag = stack.getTagCompound(); - return tag.getString("current_ritual"); - } - - public boolean canPlaceRitualStone(EnumRuneType rune, ItemStack stack) { - int meta = stack.getItemDamage(); - switch (rune) { - case BLANK: - case AIR: - case EARTH: - case FIRE: - case WATER: - return true; - case DUSK: - return meta >= 1; - case DAWN: - return meta >= 2; - } - - return false; - } - - public static void spawnParticles(World worldIn, BlockPos pos, int amount) { - BlockState state = worldIn.getBlockState(pos); - Block block = worldIn.getBlockState(pos).getBlock(); - - if (block.isAir(state, worldIn, pos)) { - for (int i = 0; i < amount; ++i) { - double d0 = itemRand.nextGaussian() * 0.02D; - double d1 = itemRand.nextGaussian() * 0.02D; - double d2 = itemRand.nextGaussian() * 0.02D; - worldIn.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, (double) ((float) pos.getX() + itemRand.nextFloat()), (double) pos.getY() + (double) itemRand.nextFloat(), (double) ((float) pos.getZ() + itemRand.nextFloat()), d0, d1, d2); - } - } else { - for (int i1 = 0; i1 < amount; ++i1) { - double d0 = itemRand.nextGaussian() * 0.02D; - double d1 = itemRand.nextGaussian() * 0.02D; - double d2 = itemRand.nextGaussian() * 0.02D; - worldIn.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, (double) ((float) pos.getX() + itemRand.nextFloat()), (double) pos.getY() + (double) itemRand.nextFloat() * 1.0f, (double) ((float) pos.getZ() + itemRand.nextFloat()), d0, d1, d2); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java deleted file mode 100644 index 9888fad3..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java +++ /dev/null @@ -1,280 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.ritual.EnumRitualReaderState; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.input.Keyboard; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ItemRitualReader extends Item implements IVariantProvider { - public static final String tooltipBase = "tooltip.bloodmagic.ritualReader."; - - public ItemRitualReader() { - super(); - setTranslationKey(BloodMagic.MODID + ".ritualReader"); - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag tooltipFlag) { - if (!stack.hasTagCompound()) - return; - - EnumRitualReaderState state = this.getState(stack); - tooltip.add(TextHelper.localizeEffect(tooltipBase + "currentState", TextHelper.localizeEffect(tooltipBase + state.toString().toLowerCase()))); - - tooltip.add(""); - - boolean sneaking = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); - - if (sneaking) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect(tooltipBase + "desc." + state.toString().toLowerCase())))); - } else { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.extraInfo")); - } - - super.addInformation(stack, world, tooltip, tooltipFlag); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - RayTraceResult ray = this.rayTrace(world, player, false); - if (ray != null && ray.typeOfHit == RayTraceResult.Type.BLOCK) { - return new ActionResult<>(ActionResultType.PASS, stack); - } - - if (player.isSneaking()) { - if (!world.isRemote) { - cycleReader(stack, player); - } - - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - return new ActionResult<>(ActionResultType.PASS, stack); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (!world.isRemote) { - EnumRitualReaderState state = this.getState(stack); - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof IMasterRitualStone) { - IMasterRitualStone master = (IMasterRitualStone) tile; - if (master.getCurrentRitual() == null) - super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - this.setMasterBlockPos(stack, pos); - this.setBlockPos(stack, BlockPos.ORIGIN); - - switch (state) { - case INFORMATION: - master.provideInformationOfRitualToPlayer(player); - - break; - case SET_AREA: - if (player.isSneaking() && player.getHeldItem(Hand.OFF_HAND).getItem() instanceof ItemBloodOrb) { - Ritual ritual = master.getCurrentRitual(); - for (String range : ritual.getListOfRanges()) { - AreaDescriptor aabb = ritual.getBlockRange(range); - master.setBlockRange(range, aabb); - } - break; - } - - String range = this.getCurrentBlockRange(stack); - - if (range == null || range.isEmpty() || player.isSneaking()) { - String newRange = master.getNextBlockRange(range); - range = newRange; - this.setCurrentBlockRange(stack, newRange); - } - - master.provideInformationOfRangeToPlayer(player, range); - break; - case SET_WILL_TYPES: - List typeList = new ArrayList<>(); - NonNullList inv = player.inventory.mainInventory; - for (int i = 0; i < 9; i++) { - ItemStack testStack = inv.get(i); - if (testStack.isEmpty()) { - continue; - } - - if (testStack.getItem() instanceof IDiscreteDemonWill) { - EnumDemonWillType type = ((IDiscreteDemonWill) testStack.getItem()).getType(testStack); - if (!typeList.contains(type)) { - typeList.add(type); - } - } - } - - master.setActiveWillConfig(player, typeList); - master.provideInformationOfWillConfigToPlayer(player, typeList); - break; - } - - return ActionResultType.FAIL; - } else { - if (state == EnumRitualReaderState.SET_AREA) { - BlockPos masterPos = this.getMasterBlockPos(stack); - if (!masterPos.equals(BlockPos.ORIGIN)) { - BlockPos containedPos = getBlockPos(stack); - if (containedPos.equals(BlockPos.ORIGIN)) { - BlockPos pos1 = pos.subtract(masterPos); - this.setBlockPos(stack, pos1); - player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.firstBlock"), true); - } else { - tile = world.getTileEntity(masterPos); - if (tile instanceof IMasterRitualStone) { - IMasterRitualStone master = (IMasterRitualStone) tile; - BlockPos pos2 = pos.subtract(masterPos); - String range = this.getCurrentBlockRange(stack); - if (range == null || range.isEmpty()) { - String newRange = master.getNextBlockRange(range); - range = newRange; - this.setCurrentBlockRange(stack, newRange); - } - Ritual ritual = master.getCurrentRitual(); - - int maxHorizontalRange = ritual.getMaxHorizontalRadiusForRange(range, null, null); - int maxVerticalRange = ritual.getMaxVerticalRadiusForRange(range, null, null); - int maxVolume = ritual.getMaxVolumeForRange(range, null, null); - - switch (master.setBlockRangeByBounds(player, range, containedPos, pos2)) { - case SUCCESS: - player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.success"), true); - break; - case NOT_WITHIN_BOUNDARIES: - player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.tooFar", maxVerticalRange, maxHorizontalRange), false); - break; - case VOLUME_TOO_LARGE: - player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", maxVolume), false); - break; - default: - player.sendStatusMessage(new TranslationTextComponent("ritual.bloodmagic.blockRange.noRange"), false); - break; - } - } - this.setBlockPos(stack, BlockPos.ORIGIN); - } - } - } - } - } - - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - - public BlockPos getBlockPos(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return new BlockPos(stack.getTagCompound().getInteger(Constants.NBT.X_COORD), stack.getTagCompound().getInteger(Constants.NBT.Y_COORD), stack.getTagCompound().getInteger(Constants.NBT.Z_COORD)); - } - - public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { - stack = NBTHelper.checkNBT(stack); - CompoundNBT itemTag = stack.getTagCompound(); - itemTag.putInt(Constants.NBT.X_COORD, pos.getX()); - itemTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - itemTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - return stack; - } - - public BlockPos getMasterBlockPos(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return new BlockPos(stack.getTagCompound().getInteger(Constants.NBT.X_COORD + "master"), stack.getTagCompound().getInteger(Constants.NBT.Y_COORD + "master"), stack.getTagCompound().getInteger(Constants.NBT.Z_COORD + "master")); - } - - public ItemStack setMasterBlockPos(ItemStack stack, BlockPos pos) { - stack = NBTHelper.checkNBT(stack); - CompoundNBT itemTag = stack.getTagCompound(); - itemTag.putInt(Constants.NBT.X_COORD + "master", pos.getX()); - itemTag.putInt(Constants.NBT.Y_COORD + "master", pos.getY()); - itemTag.putInt(Constants.NBT.Z_COORD + "master", pos.getZ()); - return stack; - } - - public String getCurrentBlockRange(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - return tag.getString("range"); - } - - public void setCurrentBlockRange(ItemStack stack, String range) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString("range", range); - } - - public void cycleReader(ItemStack stack, PlayerEntity player) { - EnumRitualReaderState prevState = getState(stack); - int val = prevState.ordinal(); - int nextVal = val + 1 >= EnumRitualReaderState.values().length ? 0 : val + 1; - EnumRitualReaderState nextState = EnumRitualReaderState.values()[nextVal]; - - setState(stack, nextState); - notifyPlayerOfStateChange(nextState, player); - } - - public void notifyPlayerOfStateChange(EnumRitualReaderState state, PlayerEntity player) { - ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase + "currentState", new TranslationTextComponent(tooltipBase + state.toString().toLowerCase()))); - } - - public void setState(ItemStack stack, EnumRitualReaderState state) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putInt(Constants.NBT.RITUAL_READER, state.ordinal()); - } - - public EnumRitualReaderState getState(ItemStack stack) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - return EnumRitualReaderState.INFORMATION; - } - - CompoundNBT tag = stack.getTagCompound(); - - return EnumRitualReaderState.values()[tag.getInt(Constants.NBT.RITUAL_READER)]; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java deleted file mode 100644 index 657724c0..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java +++ /dev/null @@ -1,205 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.helper.*; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.UseAction; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.function.Consumer; - -public class ItemSacrificialDagger extends ItemEnum implements IMeshProvider { - - public ItemSacrificialDagger() { - super(DaggerType.class, "sacrificial_dagger"); - - setHasSubtypes(true); - setMaxStackSize(1); - setFull3D(); - } - - @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { - list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.desc")))); - - if (stack.getItemDamage() == 1) - list.add(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.creative")); - } - - @Override - public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) { - if (entityLiving instanceof PlayerEntity && !entityLiving.getEntityWorld().isRemote) - if (PlayerSacrificeHelper.sacrificePlayerHealth((PlayerEntity) entityLiving)) - IncenseHelper.setHasMaxIncense(stack, (PlayerEntity) entityLiving, false); - } - - @Override - public int getMaxItemUseDuration(ItemStack stack) { - return 72000; - } - - @Override - public UseAction getItemUseAction(ItemStack stack) { - return UseAction.BOW; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (PlayerHelper.isFakePlayer(player)) - return super.onItemRightClick(world, player, hand); - - if (this.canUseForSacrifice(stack)) { - player.setActiveHand(hand); - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - int lpAdded = ConfigHandler.values.sacrificialDaggerConversion * 2; - - RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); - - if (tile != null && tile instanceof TileAltar && stack.getItemDamage() == 1) - lpAdded = ((TileAltar) tile).getCapacity(); - } - - if (!player.capabilities.isCreativeMode) { - SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, 2, lpAdded); - if (MinecraftForge.EVENT_BUS.post(evt)) - return super.onItemRightClick(world, player, hand); - - if (evt.shouldDrainHealth) { - DamageSourceBloodMagic damageSrc = DamageSourceBloodMagic.INSTANCE; - player.hurtResistantTime = 0; - float playerHealth = player.getHealth(); - if (Math.ceil(player.getHealth() - 2) <= 0) { - player.attackEntityFrom(damageSrc, Float.MAX_VALUE); - } else { - float damageAmount = net.minecraftforge.common.ForgeHooks.onLivingDamage(player, damageSrc, 2.0F); - player.getCombatTracker().trackDamage(damageSrc, playerHealth, damageAmount); - player.setHealth(Math.max(player.getHealth() - 2, 0.001f)); - } - } - - if (!evt.shouldFillAltar) - return super.onItemRightClick(world, player, hand); - - lpAdded = evt.lpAdded; - } - - double posX = player.posX; - double posY = player.posY; - double posZ = player.posZ; - world.playSound(null, posX, posY, posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); - - for (int l = 0; l < 8; ++l) - world.spawnParticle(EnumParticleTypes.REDSTONE, posX + Math.random() - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), 0, 0, 0); - - if (!world.isRemote && PlayerHelper.isFakePlayer(player) || player.isPotionActive(PlayerSacrificeHelper.soulFrayId)) - return super.onItemRightClick(world, player, hand); - - - PlayerSacrificeHelper.findAndFillAltar(world, player, lpAdded, false); - - return super.onItemRightClick(world, player, hand); - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) { - if (!world.isRemote && entity instanceof PlayerEntity) { - boolean prepared = this.isPlayerPreparedForSacrifice(world, (PlayerEntity) entity); - this.setUseForSacrifice(stack, prepared); - if (IncenseHelper.getHasMaxIncense(stack) && !prepared) - IncenseHelper.setHasMaxIncense(stack, (PlayerEntity) entity, false); - if (prepared) { - boolean isMax = IncenseHelper.getMaxIncense((PlayerEntity) entity) == IncenseHelper.getCurrentIncense((PlayerEntity) entity); - IncenseHelper.setHasMaxIncense(stack, (PlayerEntity) entity, isMax); - } - } - } - - public boolean isPlayerPreparedForSacrifice(World world, PlayerEntity player) { - return !world.isRemote && (PlayerSacrificeHelper.getPlayerIncense(player) > 0); - } - - public boolean canUseForSacrifice(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return stack.getTagCompound().getBoolean(Constants.NBT.SACRIFICE); - } - - public void setUseForSacrifice(ItemStack stack, boolean sacrifice) { - stack = NBTHelper.checkNBT(stack); - stack.getTagCompound().setBoolean(Constants.NBT.SACRIFICE, sacrifice); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - String variant = "type=normal"; - if (stack.getItemDamage() != 0) - variant = "type=creative"; - - if (canUseForSacrifice(stack)) - variant = "type=ceremonial"; - - return new ModelResourceLocation(getRegistryName(), variant); - }; - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("type=normal"); - variants.accept("type=creative"); - variants.accept("type=ceremonial"); - } - - @Override - public boolean hasEffect(ItemStack stack) { - return IncenseHelper.getHasMaxIncense(stack) || super.hasEffect(stack); - } - - public enum DaggerType implements ISubItem { - - NORMAL, - CREATIVE, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER, count, ordinal()); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java deleted file mode 100644 index a3088076..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java +++ /dev/null @@ -1,115 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.IDocumentedBlock; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NumeralHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.util.text.TextFormatting; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemSanguineBook extends Item implements IVariantProvider, IAltarManipulator { - private AltarTier currentDisplayedTier = AltarTier.ONE; - - public ItemSanguineBook() { - setTranslationKey(BloodMagic.MODID + ".sanguineBook"); - setCreativeTab(BloodMagic.TAB_BM); - setMaxStackSize(1); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - if (world.isRemote) - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - - BlockState hitState = world.getBlockState(pos); - if (player.isSneaking()) { - if (hitState.getBlock() instanceof IDocumentedBlock) { - trySetDisplayedTier(world, pos); - IDocumentedBlock documentedBlock = (IDocumentedBlock) hitState.getBlock(); - List docs = documentedBlock.getDocumentation(player, world, pos, hitState); - if (!docs.isEmpty()) { - ChatUtil.sendNoSpam(player, docs.toArray(new ITextComponent[docs.size()])); - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - } - } - - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - return super.onItemRightClick(world, player, hand); - - stack = NBTHelper.checkNBT(stack); - - RayTraceResult rayTrace = rayTrace(world, player, false); - if (rayTrace == null || rayTrace.typeOfHit == RayTraceResult.Type.MISS || rayTrace.typeOfHit == RayTraceResult.Type.ENTITY) { - if (stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) >= AltarTier.MAXTIERS - 1) - stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, 0); - else - stack.getTagCompound().setInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER, stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1); - - currentDisplayedTier = AltarTier.values()[stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER)]; - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.setTier", NumeralHelper.toRoman(stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)), true); - - return super.onItemRightClick(world, player, hand); - } - - return super.onItemRightClick(world, player, hand); - } - - public boolean trySetDisplayedTier(World world, BlockPos pos) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAltar) { - return !((TileAltar) tile).setCurrentTierDisplayed(currentDisplayedTier); - } - - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.book.shifting")); - tooltip.add(TextFormatting.OBFUSCATED + "~ILikeTehNutsAndICannotLie"); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentTier", stack.getTagCompound().getInteger(Constants.NBT.ALTARMAKER_CURRENT_TIER) + 1)); - } - - // IVariantProvider - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java deleted file mode 100644 index b2d294b5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -public class ItemSlate extends ItemEnum.Variant { - - public ItemSlate() { - super(SlateType.class, "slate"); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { - list.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.slate.desc")))); - } - - public enum SlateType implements ISubItem { - - BLANK, - REINFORCED, - IMBUED, - DEMONIC, - ETHEREAL, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.SLATE, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java deleted file mode 100644 index 0bf4a0b3..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java +++ /dev/null @@ -1,111 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -public class ItemTelepositionFocus extends ItemEnum.Variant implements IBindable { - - public ItemTelepositionFocus() { - super(FocusType.class, "focus"); - - setMaxStackSize(1); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - if (player.isSneaking()) { - RayTraceResult mop = rayTrace(world, player, false); - - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { - setBlockPos(player.getHeldItem(hand), world, mop.getBlockPos()); - } - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localize("tooltip.bloodmagic.telepositionFocus." + getItemType(stack).getInternalName())))); - - super.addInformation(stack, world, tooltip, flag); - Binding binding = getBinding(stack); - if (binding != null) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); - - if (!stack.hasTagCompound()) - return; - - CompoundNBT tag = stack.getTagCompound(); - BlockPos coords = getBlockPos(stack); - - if (coords != null && tag != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", coords.getX(), coords.getY(), coords.getZ())); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", tag.getInt(Constants.NBT.DIMENSION_ID))); - } - } - - public World getWorld(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return DimensionManager.getWorld(stack.getTagCompound().getInteger(Constants.NBT.DIMENSION_ID)); - } - - public BlockPos getBlockPos(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return new BlockPos(stack.getTagCompound().getInteger(Constants.NBT.X_COORD), stack.getTagCompound().getInteger(Constants.NBT.Y_COORD), stack.getTagCompound().getInteger(Constants.NBT.Z_COORD)); - } - - public ItemStack setBlockPos(ItemStack stack, World world, BlockPos pos) { - stack = NBTHelper.checkNBT(stack); - CompoundNBT itemTag = stack.getTagCompound(); - itemTag.putInt(Constants.NBT.X_COORD, pos.getX()); - itemTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - itemTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - itemTag.putInt(Constants.NBT.DIMENSION_ID, world.provider.getDimension()); - return stack; - } - - public enum FocusType implements ISubItem { - - WEAK, - ENHANCED, - REINFORCED, - DEMONIC, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java deleted file mode 100644 index 571b2a86..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java +++ /dev/null @@ -1,112 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemGroup; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.Map.Entry; - -public class ItemUpgradeTome extends Item implements IVariantProvider { - public ItemUpgradeTome() { - super(); - - setCreativeTab(BloodMagic.TAB_TOMES); - setTranslationKey(BloodMagic.MODID + ".upgradeTome"); - setHasSubtypes(true); - setMaxStackSize(1); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) { - return super.onItemRightClick(world, player, hand); - } - - LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade == null) { - return super.onItemRightClick(world, player, hand); - } - - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - if (chestStack.getItem() instanceof ItemLivingArmour) { - LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour == null) { - return super.onItemRightClick(world, player, hand); - } - - if (armour.upgradeArmour(player, upgrade)) { - ItemLivingArmour.setLivingArmour(chestStack, armour); -// ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(stack, armour, false); - stack.shrink(1); - } - } - return super.onItemRightClick(world, player, hand); - } - - @Override - public String getTranslationKey(ItemStack stack) { - if (!stack.hasTagCompound()) - return super.getTranslationKey(stack); - - LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade != null && upgrade.isDowngrade()) - return "item." + BloodMagic.MODID + ".downgradeTome"; - - return super.getTranslationKey(stack); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { - String key = entry.getKey(); - int maxLevel = entry.getValue(); - for (int i = 0; i < maxLevel; i++) { - ItemStack stack = new ItemStack(this); - LivingUpgrades.setKey(stack, key); - LivingUpgrades.setLevel(stack, i); - list.add(stack); - } - } - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=upgradetome"); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getTranslationKey()), upgrade.getUpgradeLevel() + 1)); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java deleted file mode 100644 index aad3bc39..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java +++ /dev/null @@ -1,88 +0,0 @@ -package WayofTime.bloodmagic.item; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; - -public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVariantProvider { - public ItemUpgradeTrainer() { - super(); - - setCreativeTab(BloodMagic.TAB_TOMES); - setTranslationKey(BloodMagic.MODID + ".upgradeTrainer"); - setHasSubtypes(true); - setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - list.add(new ItemStack(this)); - for (Entry entry : LivingArmourHandler.upgradeMaxLevelMap.entrySet()) { - String key = entry.getKey(); - ItemStack stack = new ItemStack(this); - LivingUpgrades.setKey(stack, key); - list.add(stack); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { -// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour")))); - if (!stack.hasTagCompound()) - return; - LivingArmourUpgrade upgrade = LivingUpgrades.getUpgrade(stack); - if (upgrade != null) { - tooltip.add(TextHelper.localize(upgrade.getTranslationKey())); - } - } - - @Override - public List getTrainedUpgrades(ItemStack stack) { - List keyList = new ArrayList<>(); - String key = LivingUpgrades.getKey(stack); - - if (!key.isEmpty()) { - keyList.add(key); - } - - return keyList; - } - - @Override - public boolean setTrainedUpgrades(ItemStack stack, List keys) { - if (keys.isEmpty()) { - return false; - } - - LivingUpgrades.setKey(stack, keys.get(0)); - return true; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=upgradetrainer"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java deleted file mode 100644 index 4ed016d5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java +++ /dev/null @@ -1,99 +0,0 @@ -package WayofTime.bloodmagic.item.alchemy; - -import WayofTime.bloodmagic.iface.ICustomAlchemyConsumable; -import WayofTime.bloodmagic.item.ItemEnum; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.Locale; - -public class ItemCuttingFluid extends ItemEnum.Variant implements ICustomAlchemyConsumable { - - public ItemCuttingFluid() { - super(FluidType.class, "cutting_fluid"); - - setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - int max = getMaxUsesForFluid(stack); - tooltip.add(TextHelper.localize("tooltip.bloodmagic.cuttingFluidRatio", max - getDamageOfFluid(stack), max)); - } - - public int getDamageOfFluid(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getInt("used"); - } - - public void applyDamageToFluid(ItemStack stack) { - int damage = Math.min(getDamageOfFluid(stack) + 1, getMaxUsesForFluid(stack)); - CompoundNBT tag = stack.getTagCompound(); - - tag.putInt("used", damage); - } - - public int getMaxUsesForFluid(ItemStack stack) { - switch (stack.getMetadata()) { - case 0: - return 16; - case 1: - return 64; - default: - return 1; - } - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - return (double) (getDamageOfFluid(stack)) / (double) (getMaxUsesForFluid(stack)); - } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return getDamageOfFluid(stack) > 0; - } - - @Override - public ItemStack drainUseOnAlchemyCraft(ItemStack stack) { - applyDamageToFluid(stack); - if (getDamageOfFluid(stack) >= getMaxUsesForFluid(stack)) { - return ItemStack.EMPTY; - } - - return stack; - } - - public enum FluidType implements ISubItem { - BASIC, - EXPLOSIVE, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.CUTTING_FLUID, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java deleted file mode 100644 index 134006b5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java +++ /dev/null @@ -1,105 +0,0 @@ -package WayofTime.bloodmagic.item.alchemy; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemEnum; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.Iterables; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.UseAction; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -public class ItemLivingArmourPointsUpgrade extends ItemEnum.Variant { - - public ItemLivingArmourPointsUpgrade() { - super(UpgradeType.class, "living_point_upgrade"); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmourPointsUpgrade.desc", 200)))); - } - - @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) { - playerIn.setActiveHand(hand); - return new ActionResult<>(ActionResultType.SUCCESS, playerIn.getHeldItem(hand)); - } - - @Override - public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) { - if (!(entityLiving instanceof PlayerEntity)) - return super.onItemUseFinish(stack, worldIn, entityLiving); - - PlayerEntity player = (PlayerEntity) entityLiving; - - if (!player.capabilities.isCreativeMode) - stack.shrink(1); - - if (!worldIn.isRemote) { - player.addPotionEffect(new EffectInstance(Effects.WITHER, 300, 5)); - player.addPotionEffect(new EffectInstance(Effects.POISON, 300, 5)); - player.addPotionEffect(new EffectInstance(Effects.REGENERATION, 400, 1)); - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = Iterables.toArray(player.getArmorInventoryList(), ItemStack.class)[2]; - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (armour.maxUpgradePoints < 200) { - armour.maxUpgradePoints = 200; - ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); - ItemLivingArmour.setLivingArmour(chestStack, armour); - } - } - } - } - - return stack; - } - - @Override - public int getMaxItemUseDuration(ItemStack stack) { - return 32; - } - - @Override - public UseAction getItemUseAction(ItemStack stack) { - return UseAction.DRINK; - } - - public enum UpgradeType implements ISubItem { - - DRAFT_ANGELUS, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.POINTS_UPGRADE, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java deleted file mode 100644 index 73edf6c5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ /dev/null @@ -1,505 +0,0 @@ -package WayofTime.bloodmagic.item.armour; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerRepairing; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeElytra; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.PlayerFallDistancePacketProcessor; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.datasync.DataParameter; -import net.minecraft.util.DamageSource; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.fml.relauncher.ReflectionHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.input.Keyboard; - -import javax.annotation.Nullable; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.UUID; -import java.util.function.Consumer; - -public class ItemLivingArmour extends ArmorItem implements ISpecialArmor, IMeshProvider { - public static final boolean useSpecialArmourCalculation = true; - public static String[] names = {"helmet", "chest", "legs", "boots"}; - //TODO: Save/delete cache periodically. - public static Map armourMap = new HashMap<>(); - private static Field _FLAGS = ReflectionHelper.findField(Entity.class, "FLAGS", "field_184240_ax"); - private static DataParameter FLAGS = null; - - public ItemLivingArmour(EquipmentSlotType armorType) { - super(ArmorItem.ArmorMaterial.IRON, 0, armorType); - setTranslationKey(BloodMagic.MODID + ".livingArmour."); -// setMaxDamage(250); - setMaxDamage((int) (getMaxDamage() * 1.5)); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public void onCreated(ItemStack stack, World world, PlayerEntity player) { - if (stack != null && !world.isRemote && stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - Utils.setUUID(stack); - } - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlotType slot, String type) { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET || this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) { - return "bloodmagic:models/armor/livingArmour_layer_1.png"; - } - - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { - return "bloodmagic:models/armor/livingArmour_layer_2.png"; - } else { - return null; - } - } - -// public double getRemainderForDamage(double damage, double plating) //TODO: Add plating, which shifts the damage -// { -// if (damage <= 0) -// { -// return 1; -// } -// -// double protectionAmount = 1 - Math.max(3, 15 - damage / 2) / 25; //This puts the base armour protection at vanilla iron level -// -// return 0; -// } - - @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return ItemStack.areItemsEqual(repair, ComponentTypes.REAGENT_BINDING.getStack()); - } - - @Override - public ArmorProperties getProperties(LivingEntity player, ItemStack stack, DamageSource source, double damage, int slot) { - double armourReduction = 0.0; - double damageAmount = 0.25; - - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { - damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { - damageAmount = 6d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - damageAmount = 0.64; - } - - double armourPenetrationReduction = 0; - - int maxAbsorption = 100000; - - if (source.equals(DamageSource.DROWN)) { - return new ArmorProperties(-1, 0, 0); - } - - if (source.equals(DamageSource.OUT_OF_WORLD)) { - return new ArmorProperties(-1, 0, 0); - } - - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - armourReduction = 0.24 / 0.64; // This values puts it at iron level - - ItemStack helmet = player.getItemStackFromSlot(EquipmentSlotType.HEAD); - ItemStack leggings = player.getItemStackFromSlot(EquipmentSlotType.LEGS); - ItemStack boots = player.getItemStackFromSlot(EquipmentSlotType.FEET); - - if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) { - damageAmount *= (armourReduction); - - return new ArmorProperties(-1, damageAmount, maxAbsorption); - } - - if (helmet.getItem() instanceof ItemLivingArmour && leggings.getItem() instanceof ItemLivingArmour && boots.getItem() instanceof ItemLivingArmour) { - double remainder = 1; // Multiply this number by the armour upgrades for protection - - if (hasLivingArmour(stack)) { - LivingArmour armour = getLivingArmour(stack); - if (armour != null && isEnabled(stack)) { - for (Entry entry : armour.upgradeMap.entrySet()) { - LivingArmourUpgrade upgrade = entry.getValue(); - remainder *= (1 - upgrade.getArmourProtection(player, source)); - } - } - } - - armourReduction = armourReduction + (1 - remainder) * (1 - armourReduction); - damageAmount *= (armourReduction); - -// if (source.isUnblockable()) -// { -// return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); -// } - - return new ArmorProperties(-1, source.isUnblockable() ? 1 - remainder : damageAmount, maxAbsorption); - } - } else { - if (source.isUnblockable()) { - return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); - } - - return new ArmorProperties(-1, damageAmount, maxAbsorption); - } - - return new ArmorProperties(-1, 0, 0); - } - - @Override - public int getArmorDisplay(PlayerEntity player, ItemStack armor, int slot) { - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) { - return 3; - } - - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - return 8; - } - - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) { - return 6; - } - - if (armor.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS) { - return 3; - } - - return 5; - } - - @Override - public void damageArmor(LivingEntity entity, ItemStack stack, DamageSource source, int damage, int slot) { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - int preDamage = stack.getItemDamage(); - if (source.isUnblockable()) { - return; - } - - if (damage > this.getMaxDamage(stack) - this.getDamage(stack)) { - //TODO: Syphon a load of LP. - if (entity.getEntityWorld().isRemote && entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - network.syphonAndDamage(player, SoulTicket.item(stack, entity.getEntityWorld(), entity, damage * 100)); - } - - return; - } - - stack.damageItem(damage, entity); - - int receivedDamage = stack.getItemDamage() - preDamage; - if (entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - if (LivingArmour.hasFullSet(player)) { - LivingArmour armour = ItemLivingArmour.getLivingArmour(stack); - if (armour != null) { - StatTrackerRepairing.incrementCounter(armour, receivedDamage); - } - } - } - - } else { - stack.damageItem(damage, entity); - } - - return; // TODO Armour shouldn't get damaged... for now - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - LivingArmour armour = getLivingArmourFromStack(stack); - for (Entry entry : armour.upgradeMap.entrySet()) { - LivingArmourUpgrade upgrade = entry.getValue(); - if (upgrade != null) { - if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_M)) { - StatTracker tracker = null; - for (StatTracker searchTracker : armour.trackerMap.values()) { - if (searchTracker != null && searchTracker.providesUpgrade(upgrade.getUniqueIdentifier())) { - tracker = searchTracker; - break; - } - } - - if (tracker != null) { - double progress = tracker.getProgress(armour, upgrade.getUpgradeLevel()); - tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.progress", TextHelper.localize(upgrade.getTranslationKey()), MathHelper.clamp((int) (progress * 100D), 0, 100))); - } - } else { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.livingArmour.upgrade.level", TextHelper.localize(upgrade.getTranslationKey()), upgrade.getUpgradeLevel() + 1)); - } - } - } - - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.upgrade.points", armour.totalUpgradePoints, armour.maxUpgradePoints)); - if (!(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && Keyboard.isKeyDown(Keyboard.KEY_M))) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.livingArmour.extraExtraInfo")); - } - } - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { - super.onArmorTick(world, player, stack); - - if (world.isRemote && this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - if (player instanceof ClientPlayerEntity) //Sanity check - { - ClientPlayerEntity spPlayer = (ClientPlayerEntity) player; - - if (FLAGS == null) { - try { - FLAGS = (DataParameter) _FLAGS.get(null); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - if (FLAGS != null) { - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.elytra", chestStack); - if (upgrade instanceof LivingArmourUpgradeElytra) { - if (spPlayer.movementInput.jump && !spPlayer.onGround && spPlayer.motionY < 0.0D && !spPlayer.capabilities.isFlying) { - if (spPlayer.motionY > -0.5D) { - BloodMagicPacketHandler.INSTANCE.sendToServer(new PlayerFallDistancePacketProcessor(1)); - } - - if (!spPlayer.isElytraFlying()) { - byte b0 = player.getDataManager().get(FLAGS); - player.getDataManager().set(FLAGS, (byte) (b0 | 1 << 7)); - } - } else if (spPlayer.isElytraFlying() && !spPlayer.movementInput.jump && !spPlayer.onGround) { - byte b0 = player.getDataManager().get(FLAGS); - player.getDataManager().set(FLAGS, (byte) (b0 & ~(1 << 7))); - } - } - } - } - } - } - - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) { - if (!hasLivingArmour(stack)) { - setLivingArmour(stack, getLivingArmourFromStack(stack)); - } - - LivingArmour armour = getLivingArmour(stack); - if (LivingArmour.hasFullSet(player)) { - this.setIsEnabled(stack, true); - armour.onTick(world, player); - } - - setLivingArmour(stack, armour, false); - } - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - if (this == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST && isEnabled(stack) && slot == EquipmentSlotType.CHEST) { - LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(stack); - - return armour.getAttributeModifiers(); - } - - return HashMultimap.create(); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[3 - armorType.getIndex()]; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET) - return new ModelResourceLocation(getCustomLocation(), "armour=head"); - else if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST) - return new ModelResourceLocation(getCustomLocation(), "armour=body"); - else if (stack.getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS) - return new ModelResourceLocation(getCustomLocation(), "armour=leg"); - else - return new ModelResourceLocation(getCustomLocation(), "armour=feet"); - }; - } - - @Override - public ResourceLocation getCustomLocation() { - return new ResourceLocation(BloodMagic.MODID, "living_armour"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("armour=head"); - variants.accept("armour=body"); - variants.accept("armour=leg"); - variants.accept("armour=feet"); - } - - public void setLivingArmour(ItemStack stack, LivingArmour armour, boolean forceWrite) { - CompoundNBT livingTag = new CompoundNBT(); - - if (!forceWrite) { - livingTag = getArmourTag(stack); - armour.writeDirtyToNBT(livingTag); - } else { - armour.writeToNBT(livingTag); - } - - setArmourTag(stack, livingTag); - } - - public void setArmourTag(ItemStack stack, CompoundNBT livingTag) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - } - - CompoundNBT tag = stack.getTagCompound(); - - tag.put(Constants.NBT.LIVING_ARMOUR, livingTag); - } - - public void setIsEnabled(ItemStack stack, boolean bool) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - tag.putBoolean("enabled", bool); - } - - public boolean isEnabled(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - return tag.getBoolean("enabled"); - } - - public void setIsElytra(ItemStack stack, boolean bool) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - tag.putBoolean("elytra", bool); - } - - public boolean isElytra(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - return tag.getBoolean("elytra"); - } - - @Nullable - public static LivingArmour getLivingArmourFromStack(ItemStack stack) { - CompoundNBT livingTag = getArmourTag(stack); - - LivingArmour livingArmour = new LivingArmour(); - livingArmour.readFromNBT(livingTag); - - return livingArmour; - } - - public static CompoundNBT getArmourTag(ItemStack stack) { - if (!stack.hasTagCompound()) { - stack.setTagCompound(new CompoundNBT()); - } - - CompoundNBT tag = stack.getTagCompound(); - return tag.getCompound(Constants.NBT.LIVING_ARMOUR); - } - - //TODO: Add the ability to have the armour give an upgrade with a higher level - public static LivingArmourUpgrade getUpgrade(String uniqueIdentifier, ItemStack stack) { - if (!hasLivingArmour(stack)) { - setLivingArmour(stack, getLivingArmourFromStack(stack)); - } - - LivingArmour armour = getLivingArmour(stack); - - for (Entry entry : armour.upgradeMap.entrySet()) { - if (entry.getKey().equals(uniqueIdentifier)) { - return entry.getValue(); - } - } - - return null; - } - - public static LivingArmourUpgrade getUpgradeFromNBT(String uniqueIdentifier, ItemStack stack) { - LivingArmour armour = getLivingArmourFromStack(stack); - - for (Entry entry : armour.upgradeMap.entrySet()) { - if (entry.getKey().equals(uniqueIdentifier)) { - return entry.getValue(); - } - } - - return null; - } - - public static boolean hasLivingArmour(ItemStack stack) { - UUID uuid = Utils.getUUID(stack); - return uuid != null && armourMap.containsKey(uuid); - } - - @Nullable - public static LivingArmour getLivingArmour(ItemStack stack) { - UUID uuid = Utils.getUUID(stack); - - return armourMap.get(uuid); - } - - public static void setLivingArmour(ItemStack stack, LivingArmour armour) { - if (!Utils.hasUUID(stack)) { - Utils.setUUID(stack); - } - - UUID uuid = Utils.getUUID(stack); - - armourMap.put(uuid, armour); - } - - public static boolean hasUpgrade(String id, ItemStack stack) { - if (!hasLivingArmour(stack)) { - setLivingArmour(stack, getLivingArmourFromStack(stack)); - } - - LivingArmour armour = getLivingArmour(stack); - - return armour.upgradeMap.containsKey(id); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java deleted file mode 100644 index 622c5111..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java +++ /dev/null @@ -1,583 +0,0 @@ -package WayofTime.bloodmagic.item.armour; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.DamageSource; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.Locale; -import java.util.Map; -import java.util.UUID; -import java.util.function.Consumer; - -public class ItemSentientArmour extends ArmorItem implements ISpecialArmor, IMeshProvider, IMultiWillTool { - public static String[] names = {"helmet", "chest", "legs", "boots"}; - - public static double[] willBracket = new double[]{30, 200, 600, 1500, 4000, 6000, 8000, 16000}; - public static double[] consumptionPerHit = new double[]{0.1, 0.12, 0.15, 0.2, 0.3, 0.35, 0.4, 0.5}; - public static double[] extraProtectionLevel = new double[]{0, 0.25, 0.5, 0.6, 0.7, 0.75, 0.85, 0.9}; - public static double[] steadfastProtectionLevel = new double[]{0.25, 0.5, 0.6, 0.7, 0.75, 0.85, 0.9, 0.95}; - - //public static double[] healthBonus = new double[] { 3, 6, 9, 12, 15, 20, 25, 30 }; - public static double[] knockbackBonus = new double[]{0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1}; - - public static double[] damageBoost = new double[]{0.03, 0.06, 0.09, 0.12, 0.15, 0.18, 0.22, 0.25}; - public static double[] attackSpeed = new double[]{-0.02, -0.04, -0.06, -0.08, -0.1, -0.12, -0.14, -0.16}; - - public static double[] speedBonus = new double[]{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4}; - - public ItemSentientArmour(EquipmentSlotType armorType) { - super(ArmorItem.ArmorMaterial.IRON, 0, armorType); - setTranslationKey(BloodMagic.MODID + ".sentientArmour."); - setMaxDamage(250); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlotType slot, String type) { - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) { - switch (this.getCurrentType(stack)) { - case DEFAULT: - return "bloodmagic:models/armor/sentientArmour_layer_1.png"; - case CORROSIVE: - return "bloodmagic:models/armor/sentientArmour_corrosive_layer_1.png"; - case VENGEFUL: - return "bloodmagic:models/armor/sentientArmour_vengeful_layer_1.png"; - case DESTRUCTIVE: - return "bloodmagic:models/armor/sentientArmour_destructive_layer_1.png"; - case STEADFAST: - return "bloodmagic:models/armor/sentientArmour_steadfast_layer_1.png"; - } - return "bloodmagic:models/armor/sentientArmour_layer_1.png"; - } - - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { - switch (this.getCurrentType(stack)) { - case DEFAULT: - return "bloodmagic:models/armor/sentientArmour_layer_2.png"; - case CORROSIVE: - return "bloodmagic:models/armor/sentientArmour_corrosive_layer_2.png"; - case VENGEFUL: - return "bloodmagic:models/armor/sentientArmour_vengeful_layer_2.png"; - case DESTRUCTIVE: - return "bloodmagic:models/armor/sentientArmour_destructive_layer_2.png"; - case STEADFAST: - return "bloodmagic:models/armor/sentientArmour_steadfast_layer_2.png"; - } - return "bloodmagic:models/armor/sentientArmour_layer_1.png"; - } else { - return null; - } - } - - @Override - public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { - if (this.armorType == EquipmentSlotType.CHEST) { - EnumDemonWillType type = this.getCurrentType(stack); - switch (type) { - case CORROSIVE: - if (player.isPotionActive(Effects.POISON)) { - player.removeActivePotionEffect(Effects.POISON); - } - if (player.isPotionActive(Effects.WITHER)) { - player.removeActivePotionEffect(Effects.WITHER); - } - break; - default: - } - } - } - - public void onPlayerAttacked(ItemStack stack, DamageSource source, PlayerEntity attackedPlayer) { - if (source.getTrueSource() instanceof LivingEntity) { - LivingEntity attacker = (LivingEntity) source.getTrueSource(); - EnumDemonWillType type = this.getCurrentType(stack); - switch (type) { - case CORROSIVE: - if (!source.isProjectile()) { - attacker.addPotionEffect(new EffectInstance(Effects.POISON, 100)); //TODO: customize duration - } - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - break; - case VENGEFUL: - break; - } - } - } - - @Override - public ArmorProperties getProperties(LivingEntity player, ItemStack stack, DamageSource source, double damage, int slot) { - double armourReduction = 0.0; - double damageAmount = 0.25; - - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS || this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { - damageAmount = 3d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { - damageAmount = 6d / 20d * 0.6; - } else if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { - damageAmount = 0.64; - } - - double armourPenetrationReduction = 0; - - int maxAbsorption = 100000; - - if (source.equals(DamageSource.DROWN)) { - return new ArmorProperties(-1, 0, 0); - } - - if (source.equals(DamageSource.OUT_OF_WORLD)) { - return new ArmorProperties(-1, 0, 0); - } - - if (this == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { - armourReduction = 0.24 / 0.64; // This values puts it at iron level - - ItemStack helmet = player.getItemStackFromSlot(EquipmentSlotType.HEAD); - ItemStack leggings = player.getItemStackFromSlot(EquipmentSlotType.LEGS); - ItemStack boots = player.getItemStackFromSlot(EquipmentSlotType.FEET); - - if (helmet.isEmpty() || leggings.isEmpty() || boots.isEmpty()) { - damageAmount *= (armourReduction); - - return new ArmorProperties(-1, damageAmount, maxAbsorption); - } - - if (helmet.getItem() instanceof ItemSentientArmour && leggings.getItem() instanceof ItemSentientArmour && boots.getItem() instanceof ItemSentientArmour) { - double remainder = 1; // Multiply this number by the armour upgrades for protection - remainder *= (1 - this.getArmourModifier(stack)); - - armourReduction = armourReduction + (1 - remainder) * (1 - armourReduction); - damageAmount *= (armourReduction); - - if (source.isUnblockable()) { - return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); - } - - return new ArmorProperties(-1, damageAmount, maxAbsorption); - } - } else { - if (source.isUnblockable()) { - return new ArmorProperties(-1, damageAmount * armourPenetrationReduction, maxAbsorption); - } - - return new ArmorProperties(-1, damageAmount, maxAbsorption); - } - - return new ArmorProperties(-1, 0, 0); - } - - @Override - public int getArmorDisplay(PlayerEntity player, ItemStack armor, int slot) { - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) { - return 3; - } - - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) { - return 8; - } - - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) { - return 6; - } - - if (armor.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS) { - return 3; - } - - return 5; - } - - @Override - public void damageArmor(LivingEntity entity, ItemStack stack, DamageSource source, int damage, int slot) { - if (entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - - EnumDemonWillType type = getCurrentType(stack); - - double willRequired = this.getCostModifier(stack) * damage; - double willLeft = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (willLeft >= willRequired && canSustainArmour(type, willLeft)) { - this.setAbilitiesOfArmour(type, willLeft - willRequired, stack); - PlayerDemonWillHandler.consumeDemonWill(type, player, willRequired); - } else { - this.revertArmour(player, stack); - } - } - } - - public double getCostModifier(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getDouble("costModifier"); - } - - public void setCostModifier(ItemStack stack, double modifier) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("costModifier", modifier); - } - - public double getArmourModifier(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getDouble("armourModifier"); - } - - public void setArmourModifier(ItemStack stack, double modifier) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("armourModifier", modifier); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[3 - armorType.getIndex()]; - } - - public void revertArmour(PlayerEntity player, ItemStack itemStack) { - ItemStack stack = this.getContainedArmourStack(itemStack); - player.setItemStackToSlot(armorType, stack); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - EnumDemonWillType type = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET).getCurrentType(stack); - String additional = "_" + type.getName().toLowerCase(); - if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET) - return new ModelResourceLocation(getCustomLocation(), "armour=head" + additional); - else if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST) - return new ModelResourceLocation(getCustomLocation(), "armour=body" + additional); - else if (stack.getItem() == RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS) - return new ModelResourceLocation(getCustomLocation(), "armour=leg" + additional); - else - return new ModelResourceLocation(getCustomLocation(), "armour=feet" + additional); - }; - } - - @Override - public ResourceLocation getCustomLocation() { - return new ResourceLocation(BloodMagic.MODID, "sentient_armour"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) { - String additional = "_" + type.getName().toLowerCase(); - - variants.accept("armour=head" + additional); - variants.accept("armour=body" + additional); - variants.accept("armour=leg" + additional); - variants.accept("armour=feet" + additional); - } - } - - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (slot == EquipmentSlotType.CHEST) { - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(0, 318145), "Armor modifier", this.getHealthBonus(stack), 0)); - multimap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getName(), new AttributeModifier(new UUID(0, 8145), "Armor modifier", this.getKnockbackResistance(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(0, 94021), "Armor modifier", this.getSpeedBoost(stack), 2)); - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(new UUID(0, 96721), "Armor modifier", this.getDamageBoost(stack), 2)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(new UUID(0, 73245), "Armor modifier", this.getAttackSpeedBoost(stack), 2)); - } - return multimap; - } - - public void setContainedArmourStack(ItemStack newArmour, ItemStack previousArmour) { - if (newArmour == null || previousArmour == null) { - return; - } - - CompoundNBT tag = new CompoundNBT(); - previousArmour.writeToNBT(tag); - - CompoundNBT omegaTag = newArmour.getTagCompound(); - if (omegaTag == null) { - omegaTag = new CompoundNBT(); - newArmour.setTagCompound(omegaTag); - } - - omegaTag.put("armour", tag); - Map enchantmentMap = EnchantmentHelper.getEnchantments(previousArmour); - EnchantmentHelper.setEnchantments(enchantmentMap, newArmour); - } - - public ItemStack getContainedArmourStack(ItemStack newArmour) { - CompoundNBT omegaTag = newArmour.getTagCompound(); - if (omegaTag == null) { - return null; - } - - CompoundNBT tag = omegaTag.getCompound("armour"); - return new ItemStack(tag); - } - - public ItemStack getSubstituteStack(EnumDemonWillType type, double will, ItemStack previousArmour) { - ItemStack newArmour = new ItemStack(this); - - this.setContainedArmourStack(newArmour, previousArmour); - this.setAbilitiesOfArmour(type, will, newArmour); - - return newArmour; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(EnumDemonWillType type, ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - public void setAbilitiesOfArmour(EnumDemonWillType type, double willValue, ItemStack armourStack) { - int willBracket = getWillBracket(willValue); - if (willBracket >= 0) { - double recurringCost = consumptionPerHit[willBracket]; - - this.setCostModifier(armourStack, recurringCost); - this.setCurrentType(type, armourStack); - - if (this.armorType == EquipmentSlotType.CHEST) { - this.setArmourModifier(armourStack, getArmourModifier(type, willBracket)); - this.setHealthBonus(armourStack, this.getHealthModifier(type, willBracket)); - this.setKnockbackResistance(armourStack, getKnockbackModifier(type, willBracket)); - this.setSpeedBoost(armourStack, getSpeedModifier(type, willBracket)); - this.setDamageBoost(armourStack, getDamageModifier(type, willBracket)); - this.setAttackSpeedBoost(armourStack, getAttackSpeedModifier(type, willBracket)); - } - } - } - - public double getArmourModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return steadfastProtectionLevel[willBracket]; - default: - return extraProtectionLevel[willBracket]; - } - } - - public double getHealthModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - //return healthBonus[willBracket]; - default: - return 0; - } - } - - public double getKnockbackModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return knockbackBonus[willBracket]; - default: - return 0; - } - } - - public double getSpeedModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return speedBonus[willBracket]; - default: - return 0; - } - } - - public double getDamageModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case DESTRUCTIVE: - return damageBoost[willBracket]; - default: - return 0; - } - } - - public double getAttackSpeedModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case DESTRUCTIVE: - return attackSpeed[willBracket]; - default: - return 0; - } - } - - public double getHealthBonus(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonus(ItemStack stack, double hp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getKnockbackResistance(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble("knockback"); - } - - public void setKnockbackResistance(ItemStack stack, double kb) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("knockback", kb); - } - - public double getSpeedBoost(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble("speed"); - } - - public void setSpeedBoost(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("speed", speed); - } - - public double getDamageBoost(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble("damage"); - } - - public void setDamageBoost(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("damage", damage); - } - - public double getAttackSpeedBoost(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble("attackSpeed"); - } - - public void setAttackSpeedBoost(ItemStack stack, double attackSpeed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("attackSpeed", attackSpeed); - } - - public static void revertAllArmour(PlayerEntity player) { - NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack stack : armourInventory) { - if (stack != null && stack.getItem() instanceof ItemSentientArmour) { - ((ItemSentientArmour) stack.getItem()).revertArmour(player, stack); - } - } - } - - public static boolean convertPlayerArmour(EnumDemonWillType type, double will, PlayerEntity player) { - if (!canSustainArmour(type, will)) { - return false; - } - - ItemStack helmetStack = player.getItemStackFromSlot(EquipmentSlotType.HEAD); - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - ItemStack leggingsStack = player.getItemStackFromSlot(EquipmentSlotType.LEGS); - ItemStack bootsStack = player.getItemStackFromSlot(EquipmentSlotType.FEET); - - { - ItemStack omegaHelmetStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_HELMET).getSubstituteStack(type, will, helmetStack); - ItemStack omegaChestStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_CHEST).getSubstituteStack(type, will, chestStack); - ItemStack omegaLeggingsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_LEGGINGS).getSubstituteStack(type, will, leggingsStack); - ItemStack omegaBootsStack = ((ItemSentientArmour) RegistrarBloodMagicItems.SENTIENT_ARMOUR_BOOTS).getSubstituteStack(type, will, bootsStack); - - player.setItemStackToSlot(EquipmentSlotType.HEAD, omegaHelmetStack); - player.setItemStackToSlot(EquipmentSlotType.CHEST, omegaChestStack); - player.setItemStackToSlot(EquipmentSlotType.LEGS, omegaLeggingsStack); - player.setItemStackToSlot(EquipmentSlotType.FEET, omegaBootsStack); - - return true; - } - } - - public static boolean canSustainArmour(EnumDemonWillType type, double willValue) { - return getWillBracket(willValue) >= 0; - } - - public static int getWillBracket(double will) { - int bracket = -1; - - for (int i = 0; i < willBracket.length; i++) { - if (will >= willBracket[i]) { - bracket = i; - } - } - - return bracket; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java deleted file mode 100644 index 9715a33d..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java +++ /dev/null @@ -1,67 +0,0 @@ -package WayofTime.bloodmagic.item.block; - -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemBlockAlchemyTable extends BlockItem implements IVariantProvider { - public ItemBlockAlchemyTable(Block block) { - super(block); - } - - @Override - public boolean placeBlockAt(ItemStack stack, PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ, BlockState newState) { - float yaw = player.rotationYaw; - Direction direction = Direction.fromAngle(yaw); - - if (direction.getYOffset() != 0) { - return false; - } - - if (!world.isAirBlock(pos.offset(direction))) { - return false; - } - -// newState = block.getDefaultState().withProperty(BlockAlchemyTable.DIRECTION, direction).withProperty(BlockAlchemyTable.INVISIBLE, true); - - if (!world.setBlockState(pos, newState, 3)) { - return false; - } - - if (!world.setBlockState(pos.offset(direction), newState, 3)) { - return false; - } - - BlockState state = world.getBlockState(pos); - if (state.getBlock() == this.block) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileAlchemyTable) { - ((TileAlchemyTable) tile).setInitialTableParameters(direction, false, pos.offset(direction)); - } - - TileEntity slaveTile = world.getTileEntity(pos.offset(direction)); - if (slaveTile instanceof TileAlchemyTable) { - ((TileAlchemyTable) slaveTile).setInitialTableParameters(direction, true, pos); - } - - setTileEntityNBT(world, player, pos, stack); - this.block.onBlockPlacedBy(world, pos, state, player, stack); - } - - return true; - } - - @Override - public void gatherVariants(Int2ObjectMap variants) { - variants.put(0, "inventory"); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java deleted file mode 100644 index f0e80c1d..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ /dev/null @@ -1,78 +0,0 @@ -package WayofTime.bloodmagic.item.block; - -import WayofTime.bloodmagic.block.BlockBloodTank; -import WayofTime.bloodmagic.tile.TileBloodTank; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.block.Block; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStack; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; - -public class ItemBlockBloodTank extends BlockItem { - public ItemBlockBloodTank(Block block) { - super(block); - - setHasSubtypes(true); - } - - @Override - public int getMetadata(int meta) { - return meta; - } - - @Override - public String getItemStackDisplayName(ItemStack stack) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(stack.getTagCompound()); - if (fluidStack != null) { - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1) + " (" + fluidStack.getLocalizedName() + ")"; - } else { - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1); - } - } - - @Override - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.tier", stack.getItemDamage() + 1)); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.capacity", getCapacity(stack))); - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("Fluid")) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag("Fluid")); - if (fluidStack != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.type", fluidStack.getLocalizedName())); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.fluid.amount", fluidStack.amount, getCapacity(stack))); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - public int getCapacity(ItemStack container) { - int meta = MathHelper.clamp(container.getItemDamage(), 0, TileBloodTank.CAPACITIES.length - 1); - return !container.isEmpty() && Block.getBlockFromItem(container.getItem()) instanceof BlockBloodTank ? TileBloodTank.CAPACITIES[meta] * Fluid.BUCKET_VOLUME : 0; - } - - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, CompoundNBT nbt) { - return new FluidHandlerItemStack(stack, getCapacity(stack)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java deleted file mode 100644 index 7aed772a..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockDemonCrystal.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.item.block; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.Locale; - -public class ItemBlockDemonCrystal extends BlockItem { - public ItemBlockDemonCrystal(Block block) { - super(block); - setHasSubtypes(true); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + EnumDemonWillType.values()[stack.getItemDamage()].toString().toLowerCase(Locale.ENGLISH); - } - - @Override - public int getMetadata(int meta) { - return meta; - } - - @Override - public boolean placeBlockAt(ItemStack stack, PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ, BlockState newState) { - if (super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, newState)) { - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileDemonCrystal) { - ((TileDemonCrystal) tile).setPlacement(side); - } - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java deleted file mode 100644 index c3ef8980..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockMimic.java +++ /dev/null @@ -1,124 +0,0 @@ -package WayofTime.bloodmagic.item.block; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.SoundType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.ChestTileEntity; -import net.minecraft.util.*; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import WayofTime.bloodmagic.tile.TileMimic; -import WayofTime.bloodmagic.block.base.BlockEnum; -import WayofTime.bloodmagic.item.block.base.ItemBlockEnum; - -public class ItemBlockMimic extends ItemBlockEnum { - public ItemBlockMimic(BlockEnum block) { - super(block); - setHasSubtypes(true); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - - //If not sneaking, do normal item use - if (!player.isSneaking()) { - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - - //IF sneaking and player has permission, replace the targeted block - if (player.canPlayerEdit(pos, facing, stack)) { - //Store information about the block being replaced and its appropriate itemstack - BlockState replacedBlockstate = world.getBlockState(pos); - Block replacedBlock = replacedBlockstate.getBlock(); - ItemStack replacedStack = replacedBlock.getItem(world, pos, replacedBlockstate); - - //Get the state for the mimic - BlockState mimicBlockstate = this.getBlock().getStateFromMeta(stack.getMetadata()); - - - //Check if the block can be replaced - - if (!canReplaceBlock(world, pos, replacedBlockstate)) { - return super.onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - } - - //Check if the tile entity, if any, can be replaced - TileEntity tileReplaced = world.getTileEntity(pos); - if (!canReplaceTile(tileReplaced)) { - return ActionResultType.FAIL; - } - - //If tile can be replaced, store info about the tile - CompoundNBT tileTag = getTagFromTileEntity(tileReplaced); - if (tileReplaced != null) { - CompoundNBT voidTag = new CompoundNBT(); - voidTag.putInt("x", pos.getX()); - voidTag.putInt("y", pos.getY()); - voidTag.putInt("z", pos.getZ()); - tileReplaced.readFromNBT(voidTag); - } - - //Remove one item from stack - stack.shrink(1); - - - //Replace the block - world.setBlockState(pos, mimicBlockstate, 3); - //Make placing sound - SoundType soundtype = this.block.getSoundType(); - world.playSound(player, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F); - - //Replace the tile entity - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileMimic) { - TileMimic mimic = (TileMimic) tile; - mimic.tileTag = tileTag; - mimic.setReplacedState(replacedBlockstate); - mimic.setInventorySlotContents(0, replacedStack); - mimic.refreshTileEntity(); - - if (player.capabilities.isCreativeMode) { - mimic.dropItemsOnBreak = false; - } - } - return ActionResultType.SUCCESS; - } - - return ActionResultType.FAIL; - - } - - public boolean canReplaceTile(TileEntity tile) { - if (tile instanceof ChestTileEntity) { - return true; - } - - return tile == null; - } - - public boolean canReplaceBlock(World world, BlockPos pos, BlockState state) { - return state.getBlockHardness(world, pos) != -1.0F; - } - - public CompoundNBT getTagFromTileEntity(TileEntity tile) { - CompoundNBT tag = new CompoundNBT(); - - if (tile != null) { - return tile.writeToNBT(tag); - } - - return tag; - } - - @Override - public int getMetadata(int meta) { - return meta; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java deleted file mode 100644 index 4739bec2..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockEnum.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.item.block.base; - -import WayofTime.bloodmagic.block.base.BlockEnum; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.math.MathHelper; - -public class ItemBlockEnum & IStringSerializable> extends BlockItem { - - public ItemBlockEnum(BlockEnum block) { - super(block); - - if (block.getTypes().length > 1) - setHasSubtypes(true); - } - - @SuppressWarnings("unchecked") - @Override - public BlockEnum getBlock() { - return (BlockEnum) super.getBlock(); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return getBlock().getTranslationKey() + getBlock().getTypes()[MathHelper.clamp(stack.getItemDamage(), 0, getBlock().getTypes().length - 1)].getName(); - } - - @Override - public int getMetadata(int damage) { - return damage; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java b/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java deleted file mode 100644 index 20f656cd..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/block/base/ItemBlockInteger.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.item.block.base; - -import WayofTime.bloodmagic.block.base.BlockInteger; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; - -public class ItemBlockInteger extends BlockItem { - - public ItemBlockInteger(BlockInteger block) { - super(block); - - if (block.getMaxMeta() > 1) - setHasSubtypes(true); - } - - @SuppressWarnings("unchecked") - @Override - public BlockInteger getBlock() { - return (BlockInteger) super.getBlock(); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return getBlock().getTranslationKey() + "." + stack.getItemDamage(); - } - - @Override - public int getMetadata(int damage) { - return damage; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java deleted file mode 100644 index 116c1c22..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java +++ /dev/null @@ -1,100 +0,0 @@ -package WayofTime.bloodmagic.item.gear; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.IItemLPContainer; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.ItemHelper.LPContainer; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemPackSacrifice extends ArmorItem implements IAltarManipulator, IItemLPContainer, IVariantProvider { - public final int CAPACITY = 10000; // Max LP storage - - public ItemPackSacrifice() { - super(ArmorMaterial.CHAIN, 0, EquipmentSlotType.CHEST); - - setTranslationKey(BloodMagic.MODID + ".pack.sacrifice"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - RayTraceResult rayTrace = this.rayTrace(world, player, false); - - if (rayTrace == null) { - return super.onItemRightClick(world, player, hand); - } else { - if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) { - TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); - - if (!(tile instanceof IBloodAltar)) - return super.onItemRightClick(world, player, hand); - - LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, rayTrace.getBlockPos()); - } - } - - return ActionResult.newResult(ActionResultType.FAIL, stack); - } - - @Override - public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { - if (getStoredLP(stack) > CAPACITY) - setStoredLP(stack, CAPACITY); - } - - @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - list.add(TextHelper.localize("tooltip.bloodmagic.pack.sacrifice.desc")); - list.add(TextHelper.localize("tooltip.bloodmagic.pack.stored", getStoredLP(stack))); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } - - // IFillable - - @Override - public int getCapacity() { - return this.CAPACITY; - } - - @Override - public int getStoredLP(ItemStack stack) { - return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.STORED_LP) : 0; - } - - @Override - public void setStoredLP(ItemStack stack, int lp) { - if (stack != null) { - NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.STORED_LP, lp); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java deleted file mode 100644 index 4c70b592..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java +++ /dev/null @@ -1,125 +0,0 @@ -package WayofTime.bloodmagic.item.gear; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.IAltarManipulator; -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.IItemLPContainer; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.ItemHelper.LPContainer; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemPackSelfSacrifice extends ArmorItem implements IAltarManipulator, IItemLPContainer, IVariantProvider { - /** - * How much LP per half heart - */ - public final int CONVERSION = 100; - /** - * Max LP storage - */ - public final int CAPACITY = 10000; - /** - * How often the pack syphons - */ - public final int INTERVAL = 20; - /** - * How much health is required for the pack to syphon (0 - 1) - */ - public final float HEALTHREQ = 0.5f; - - public ItemPackSelfSacrifice() { - super(ArmorMaterial.CHAIN, 0, EquipmentSlotType.CHEST); - - setTranslationKey(BloodMagic.MODID + ".pack.selfSacrifice"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - RayTraceResult position = this.rayTrace(world, player, false); - - if (position == null) { - return super.onItemRightClick(world, player, hand); - } else { - if (position.typeOfHit == RayTraceResult.Type.BLOCK) { - TileEntity tile = world.getTileEntity(position.getBlockPos()); - - if (!(tile instanceof IBloodAltar)) - return super.onItemRightClick(world, player, hand); - - LPContainer.tryAndFillAltar((IBloodAltar) tile, stack, world, position.getBlockPos()); - } - } - - return ActionResult.newResult(ActionResultType.FAIL, stack); - } - - @Override - public void onArmorTick(World world, PlayerEntity player, ItemStack stack) { - if (world.isRemote || player.capabilities.isCreativeMode) - return; - - boolean shouldSyphon = player.getHealth() / player.getMaxHealth() > HEALTHREQ && getStoredLP(stack) < CAPACITY; - - if (shouldSyphon & world.getTotalWorldTime() % INTERVAL == 0) { - NetworkHelper.getSoulNetwork(player).hurtPlayer(player, 1.0F); - LPContainer.addLPToItem(stack, CONVERSION, CAPACITY); - } - - if (getStoredLP(stack) > CAPACITY) - setStoredLP(stack, CAPACITY); - } - - @Override - public void addInformation(ItemStack stack, World world, List list, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - list.add(TextHelper.localize("tooltip.bloodmagic.pack.selfSacrifice.desc")); - list.add(TextHelper.localize("tooltip.bloodmagic.pack.stored", getStoredLP(stack))); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } - - // IFillable - - @Override - public int getCapacity() { - return this.CAPACITY; - } - - @Override - public int getStoredLP(ItemStack stack) { - return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.STORED_LP) : 0; - } - - @Override - public void setStoredLP(ItemStack stack, int lp) { - if (stack != null) { - NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.STORED_LP, lp); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java deleted file mode 100644 index d4608ab9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ContainerHolding.java +++ /dev/null @@ -1,153 +0,0 @@ -package WayofTime.bloodmagic.item.inventory; - -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.FMLCommonHandler; - -public class ContainerHolding extends Container { - public final InventoryHolding inventoryHolding; - private final int PLAYER_INVENTORY_ROWS = 3; - private final int PLAYER_INVENTORY_COLUMNS = 9; - private final PlayerEntity player; - - public ContainerHolding(PlayerEntity player, InventoryHolding inventoryHolding) { - this.player = player; - this.inventoryHolding = inventoryHolding; - int currentSlotHeldIn = player.inventory.currentItem; - - for (int columnIndex = 0; columnIndex < ItemSigilHolding.inventorySize; ++columnIndex) { - this.addSlotToContainer(new SlotHolding(this, inventoryHolding, player, columnIndex, 8 + columnIndex * 36, 17)); - } - - for (int rowIndex = 0; rowIndex < PLAYER_INVENTORY_ROWS; ++rowIndex) { - for (int columnIndex = 0; columnIndex < PLAYER_INVENTORY_COLUMNS; ++columnIndex) { - this.addSlotToContainer(new Slot(player.inventory, columnIndex + rowIndex * 9 + 9, 8 + columnIndex * 18, 41 + rowIndex * 18)); - } - } - - for (int actionBarIndex = 0; actionBarIndex < PLAYER_INVENTORY_COLUMNS; ++actionBarIndex) { - if (actionBarIndex == currentSlotHeldIn) { - this.addSlotToContainer(new SlotDisabled(player.inventory, actionBarIndex, 8 + actionBarIndex * 18, 99)); - } else { - this.addSlotToContainer(new Slot(player.inventory, actionBarIndex, 8 + actionBarIndex * 18, 99)); - } - } - } - - @Override - public boolean canInteractWith(PlayerEntity entityPlayer) { - return true; - } - - @Override - public void onContainerClosed(PlayerEntity entityPlayer) { - super.onContainerClosed(entityPlayer); - - if (!entityPlayer.getEntityWorld().isRemote) { - saveInventory(entityPlayer); - } - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - - if (!player.getEntityWorld().isRemote) { - saveInventory(player); - } - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity entityPlayer, int slotIndex) { - ItemStack stack = ItemStack.EMPTY; - Slot slotObject = inventorySlots.get(slotIndex); - int slots = inventorySlots.size(); - - if (slotObject != null && slotObject.getHasStack()) { - ItemStack stackInSlot = slotObject.getStack(); - stack = stackInSlot.copy(); - - if (stack.getItem() instanceof ISigil) { - if (slotIndex < ItemSigilHolding.inventorySize) { - if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize, slots, false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(stackInSlot, 0, ItemSigilHolding.inventorySize, false)) { - return ItemStack.EMPTY; - } - } else if (stack.getItem() instanceof ItemSigilHolding) { - if (slotIndex < ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS)) { - if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS), inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(stackInSlot, ItemSigilHolding.inventorySize, ItemSigilHolding.inventorySize + (PLAYER_INVENTORY_ROWS * PLAYER_INVENTORY_COLUMNS), false)) { - return ItemStack.EMPTY; - } - } - - if (stackInSlot.isEmpty()) { - slotObject.putStack(ItemStack.EMPTY); - } else { - slotObject.onSlotChanged(); - } - - if (stackInSlot.getCount() == stack.getCount()) { - return ItemStack.EMPTY; - } - - slotObject.onTake(player, stackInSlot); - } - - return stack; - } - - public void saveInventory(PlayerEntity entityPlayer) { - inventoryHolding.onGuiSaved(entityPlayer); - } - - private class SlotHolding extends Slot { - private final PlayerEntity player; - private ContainerHolding containerHolding; - - public SlotHolding(ContainerHolding containerHolding, IInventory inventory, PlayerEntity player, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - this.player = player; - this.containerHolding = containerHolding; - } - - @Override - public void onSlotChanged() { - super.onSlotChanged(); - - if (FMLCommonHandler.instance().getEffectiveSide().isServer()) { - containerHolding.saveInventory(player); - } - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof ISigil && !(itemStack.getItem() instanceof ItemSigilHolding); - } - } - - private class SlotDisabled extends Slot { - public SlotDisabled(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return false; - } - - @Override - public boolean canTakeStack(PlayerEntity player) { - return false; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java b/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java deleted file mode 100644 index 56c517c7..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/InventoryHolding.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.item.inventory; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -import java.util.UUID; - -public class InventoryHolding extends ItemInventory { - protected ItemStack[] inventory; - - public InventoryHolding(ItemStack itemStack) { - super(itemStack, ItemSigilHolding.inventorySize, "SigilOfHolding"); - } - - public void onGuiSaved(PlayerEntity entityPlayer) { - masterStack = findParentStack(entityPlayer); - - if (!masterStack.isEmpty()) { - save(); - } - } - - public ItemStack findParentStack(PlayerEntity entityPlayer) { - if (Utils.hasUUID(masterStack)) { - UUID parentStackUUID = new UUID(masterStack.getTagCompound().getLong(Constants.NBT.MOST_SIG), masterStack.getTagCompound().getLong(Constants.NBT.LEAST_SIG)); - for (int i = 0; i < entityPlayer.inventory.getSizeInventory(); i++) { - ItemStack itemStack = entityPlayer.inventory.getStackInSlot(i); - - if (!itemStack.isEmpty() && Utils.hasUUID(itemStack)) { - if (itemStack.getTagCompound().getLong(Constants.NBT.MOST_SIG) == parentStackUUID.getMostSignificantBits() && itemStack.getTagCompound().getLong(Constants.NBT.LEAST_SIG) == parentStackUUID.getLeastSignificantBits()) { - return itemStack; - } - } - } - } - - return ItemStack.EMPTY; - } - - public void save() { - CompoundNBT nbtTagCompound = masterStack.getTagCompound(); - - if (nbtTagCompound == null) { - nbtTagCompound = new CompoundNBT(); - - UUID uuid = UUID.randomUUID(); - nbtTagCompound.putLong(Constants.NBT.MOST_SIG, uuid.getMostSignificantBits()); - nbtTagCompound.putLong(Constants.NBT.LEAST_SIG, uuid.getLeastSignificantBits()); - } - - writeToNBT(nbtTagCompound); - masterStack.setTagCompound(nbtTagCompound); - } - - @Override - public boolean isItemValidForSlot(int slotIndex, ItemStack itemStack) { - return itemStack.getItem() instanceof ISigil && !(itemStack.getItem() instanceof ItemSigilHolding); - } - - @Override - public int getInventoryStackLimit() { - return 1; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java b/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java deleted file mode 100644 index 93c07286..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/inventory/ItemInventory.java +++ /dev/null @@ -1,224 +0,0 @@ -package WayofTime.bloodmagic.item.inventory; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.NonNullList; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; - -public class ItemInventory implements IInventory { - protected int[] syncedSlots = new int[0]; - protected ItemStack masterStack; - private NonNullList inventory; - private int size; - private String name; - - public ItemInventory(ItemStack masterStack, int size, String name) { - this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); - this.size = size; - this.name = name; - this.masterStack = masterStack; - - if (!masterStack.isEmpty()) - this.readFromStack(masterStack); - } - - public void initializeInventory(ItemStack masterStack) { - this.masterStack = masterStack; - this.clear(); - this.readFromStack(masterStack); - } - - private boolean isSyncedSlot(int slot) { - for (int s : this.syncedSlots) { - if (s == slot) { - return true; - } - } - return false; - } - - public void readFromNBT(CompoundNBT tagCompound) { - ListNBT tags = tagCompound.getTagList(Constants.NBT.ITEMS, 10); - inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); - - for (int i = 0; i < tags.tagCount(); i++) { - if (!isSyncedSlot(i)) { - CompoundNBT data = tags.getCompound(i); - byte j = data.getByte(Constants.NBT.SLOT); - - if (j >= 0 && j < inventory.size()) { - inventory.set(i, new ItemStack(data)); - } - } - } - } - - public void writeToNBT(CompoundNBT tagCompound) { - ListNBT tags = new ListNBT(); - - for (int i = 0; i < inventory.size(); i++) { - if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { - CompoundNBT data = new CompoundNBT(); - data.setByte(Constants.NBT.SLOT, (byte) i); - inventory.get(i).writeToNBT(data); - tags.appendTag(data); - } - } - - tagCompound.putTag(Constants.NBT.ITEMS, tags); - } - - public void readFromStack(ItemStack masterStack) { - if (masterStack != null) { - NBTHelper.checkNBT(masterStack); - CompoundNBT tag = masterStack.getTagCompound(); - readFromNBT(tag.getCompound(Constants.NBT.ITEM_INVENTORY)); - } - } - - public void writeToStack(ItemStack masterStack) { - if (masterStack != null) { - NBTHelper.checkNBT(masterStack); - CompoundNBT tag = masterStack.getTagCompound(); - CompoundNBT invTag = new CompoundNBT(); - writeToNBT(invTag); - tag.put(Constants.NBT.ITEM_INVENTORY, invTag); - } - } - - @Override - public int getSizeInventory() { - return size; - } - - @Override - public ItemStack getStackInSlot(int index) { - return inventory.get(index); - } - - @Override - public ItemStack decrStackSize(int index, int count) { - if (!inventory.get(index).isEmpty()) { -// if (!worldObj.isRemote) -// worldObj.markBlockForUpdate(this.pos); - - if (inventory.get(index).getCount() <= count) { - ItemStack itemStack = inventory.get(index); - inventory.set(index, ItemStack.EMPTY); - markDirty(); - return itemStack; - } - - ItemStack itemStack = inventory.get(index).splitStack(count); - if (inventory.get(index).isEmpty()) - inventory.set(index, ItemStack.EMPTY); - - markDirty(); - return itemStack; - } - - return null; - } - - @Override - public ItemStack removeStackFromSlot(int slot) { - if (!inventory.get(slot).isEmpty()) { - ItemStack itemStack = inventory.get(slot); - setInventorySlotContents(slot, ItemStack.EMPTY); - return itemStack; - } - return ItemStack.EMPTY; - } - - @Override - public void setInventorySlotContents(int slot, ItemStack stack) { - inventory.set(slot, stack); - if (stack.getCount() > getInventoryStackLimit()) - stack.setCount(getInventoryStackLimit()); - markDirty(); -// if (!worldObj.isRemote) -// worldObj.markBlockForUpdate(this.pos); - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUsableByPlayer(PlayerEntity player) { - return true; - } - - @Override - public void openInventory(PlayerEntity player) { - - } - - @Override - public void closeInventory(PlayerEntity player) { - - } - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } - - @Override - public int getField(int id) { - return 0; - } - - @Override - public void setField(int id, int value) { - - } - - @Override - public int getFieldCount() { - return 0; - } - - @Override - public void clear() { - this.inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); - } - - @Override - public String getName() { - return name; - } - - @Override - public boolean hasCustomName() { - return false; - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent(getName()); - } - - @Override - public void markDirty() { - if (masterStack != null) { - this.writeToStack(masterStack); - } - } - - @Override - public boolean isEmpty() { - return false; - } - - public boolean canInventoryBeManipulated() { - return masterStack != null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java deleted file mode 100644 index 66342e9c..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IFluidFilterProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import WayofTime.bloodmagic.routing.IFluidFilter; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fluids.capability.IFluidHandler; - -public interface IFluidFilterProvider extends IRoutingFilterProvider { - IFluidFilter getInputFluidFilter(ItemStack stack, TileEntity tile, IFluidHandler handler); - - IFluidFilter getOutputFluidFilter(ItemStack stack, TileEntity tile, IFluidHandler handler); -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java deleted file mode 100644 index 2f0cfe61..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IItemFilterProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import WayofTime.bloodmagic.routing.IItemFilter; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.items.IItemHandler; - -public interface IItemFilterProvider extends IRoutingFilterProvider { - IItemFilter getInputItemFilter(ItemStack stack, TileEntity tile, IItemHandler handler); - - IItemFilter getOutputItemFilter(ItemStack stack, TileEntity tile, IItemHandler handler); -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java b/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java deleted file mode 100644 index 2ae42343..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/IRoutingFilterProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import net.minecraft.item.ItemStack; - -public interface IRoutingFilterProvider { - /** - * Translates the inputed keyStack into the proper filtered key - * - * @param filterStack - * @param keyStack - * @return A new ItemStack which modifies the keyStack - */ - ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack); -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java deleted file mode 100644 index 45a7f63d..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java +++ /dev/null @@ -1,133 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.routing.IFluidFilter; -import WayofTime.bloodmagic.routing.RoutingFluidFilter; -import WayofTime.bloodmagic.util.GhostItemHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider, IVariantProvider { - public static String[] names = {"exact"}; - - public ItemFluidRouterFilter() { - super(); - - setTranslationKey(BloodMagic.MODID + ".fluidFilter."); - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.fluidFilter." + names[stack.getItemDamage()])); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public IFluidFilter getInputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { - IFluidFilter testFilter; - - switch (filterStack.getMetadata()) { - case 0: - testFilter = new RoutingFluidFilter(); - break; - - default: - testFilter = new RoutingFluidFilter(); - } - - List filteredList = new ArrayList<>(); - ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - filteredList.add(ghostStack); - } - - testFilter.initializeFilter(filteredList, tile, handler, false); - return testFilter; - } - - @Override - public IFluidFilter getOutputFluidFilter(ItemStack filterStack, TileEntity tile, IFluidHandler handler) { - IFluidFilter testFilter; - switch (filterStack.getMetadata()) { - case 0: - testFilter = new RoutingFluidFilter(); - break; - - default: - testFilter = new RoutingFluidFilter(); - } - - List filteredList = new ArrayList<>(); - ItemInventory inv = new ItemInventory(filterStack, 9, ""); //TODO: Change to grab the filter from the Item later. - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) { - ghostStack.setCount(Integer.MAX_VALUE); - } - - filteredList.add(ghostStack); - } - - testFilter.initializeFilter(filteredList, tile, handler, true); - return testFilter; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=exact"); - } - - @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { - ItemStack copyStack = keyStack.copy(); - GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.setCount(1); - return copyStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java deleted file mode 100644 index 4d475a5f..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java +++ /dev/null @@ -1,195 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.iface.INodeRenderer; -import WayofTime.bloodmagic.routing.IMasterRoutingNode; -import WayofTime.bloodmagic.routing.IRoutingNode; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.LinkedList; -import java.util.List; - -public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvider { - public ItemNodeRouter() { - setTranslationKey(BloodMagic.MODID + ".nodeRouter"); - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - CompoundNBT tag = stack.getTagCompound(); - BlockPos coords = getBlockPos(stack); - - if (coords != null && tag != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", coords.getX(), coords.getY(), coords.getZ())); - } - } - - @Override - public ActionResultType onItemUseFirst(PlayerEntity player, World world, BlockPos pos, Direction side, float hitX, float hitY, float hitZ, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (world.isRemote) { - return ActionResultType.PASS; - } - - TileEntity tileHit = world.getTileEntity(pos); - - if (!(tileHit instanceof IRoutingNode)) { - // TODO: Remove contained position? - BlockPos containedPos = getBlockPos(stack); - if (!containedPos.equals(BlockPos.ORIGIN)) { - this.setBlockPos(stack, BlockPos.ORIGIN); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.remove"), true); - return ActionResultType.FAIL; - } - return ActionResultType.FAIL; - } - IRoutingNode node = (IRoutingNode) tileHit; - BlockPos containedPos = getBlockPos(stack); - if (containedPos.equals(BlockPos.ORIGIN)) { - this.setBlockPos(stack, pos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.set"), true); - return ActionResultType.SUCCESS; - } else { - TileEntity pastTile = world.getTileEntity(containedPos); - if (pastTile instanceof IRoutingNode) { - IRoutingNode pastNode = (IRoutingNode) pastTile; - if (pastNode instanceof IMasterRoutingNode) { - IMasterRoutingNode master = (IMasterRoutingNode) pastNode; - - if (!node.isMaster(master)) { - if (node.getMasterPos().equals(BlockPos.ORIGIN)) //If the node is not the master and it is receptive - { - node.connectMasterToRemainingNode(world, new LinkedList<>(), master); - master.addConnection(pos, containedPos); - master.addNodeToList(node); - node.addConnection(containedPos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } - } else { - master.addConnection(pos, containedPos); - node.addConnection(containedPos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } - - } else if (node instanceof IMasterRoutingNode) { - IMasterRoutingNode master = (IMasterRoutingNode) node; - - if (!pastNode.isMaster(master)) { - if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //TODO: This is where the issue is - { - pastNode.connectMasterToRemainingNode(world, new LinkedList<>(), master); - master.addConnection(pos, containedPos); - pastNode.addConnection(pos); - master.addNodeToList(pastNode); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } - } else { - master.addConnection(pos, containedPos); - pastNode.addConnection(pos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } - } else { - //Both nodes are not master nodes, so normal linking - if (pastNode.getMasterPos().equals(node.getMasterPos())) { - if (!pastNode.getMasterPos().equals(BlockPos.ORIGIN)) { - TileEntity testTile = world.getTileEntity(pastNode.getMasterPos()); - if (testTile instanceof IMasterRoutingNode) { - IMasterRoutingNode master = (IMasterRoutingNode) testTile; - master.addConnection(pos, containedPos); - } - } - pastNode.addConnection(pos); - node.addConnection(containedPos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link.master"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } else if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //pastNode is not connected to a master, but node is - { - TileEntity tile = world.getTileEntity(node.getMasterPos()); - if (tile instanceof IMasterRoutingNode) { - IMasterRoutingNode master = (IMasterRoutingNode) tile; - master.addConnection(pos, containedPos); - master.addNodeToList(pastNode); - pastNode.connectMasterToRemainingNode(world, new LinkedList<>(), master); - } - pastNode.addConnection(pos); - node.addConnection(containedPos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } else if (node.getMasterPos().equals(BlockPos.ORIGIN)) //node is not connected to a master, but pastNode is - { - TileEntity tile = world.getTileEntity(pastNode.getMasterPos()); - if (tile instanceof IMasterRoutingNode) { - IMasterRoutingNode master = (IMasterRoutingNode) tile; - master.addConnection(pos, containedPos); - master.addNodeToList(node); - node.connectMasterToRemainingNode(world, new LinkedList<>(), master); - } - pastNode.addConnection(pos); - node.addConnection(containedPos); - player.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.routing.link"), true); - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } else { - this.setBlockPos(stack, BlockPos.ORIGIN); - return ActionResultType.SUCCESS; - } - } - } - } - - return ActionResultType.FAIL; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } - - public BlockPos getBlockPos(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return new BlockPos(stack.getTagCompound().getInteger(Constants.NBT.X_COORD), stack.getTagCompound().getInteger(Constants.NBT.Y_COORD), stack.getTagCompound().getInteger(Constants.NBT.Z_COORD)); - } - - public ItemStack setBlockPos(ItemStack stack, BlockPos pos) { - NBTHelper.checkNBT(stack); - CompoundNBT itemTag = stack.getTagCompound(); - itemTag.putInt(Constants.NBT.X_COORD, pos.getX()); - itemTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - itemTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - return stack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java deleted file mode 100644 index b5f1da4e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java +++ /dev/null @@ -1,155 +0,0 @@ -package WayofTime.bloodmagic.item.routing; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.routing.*; -import WayofTime.bloodmagic.util.GhostItemHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.NonNullList; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import net.minecraftforge.items.IItemHandler; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class ItemRouterFilter extends Item implements IItemFilterProvider, IVariantProvider { - public static String[] names = {"exact", "ignoreNBT", "modItems", "oreDict"}; - - public ItemRouterFilter() { - super(); - - setTranslationKey(BloodMagic.MODID + ".itemFilter."); - setHasSubtypes(true); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.add(TextHelper.localize("tooltip.bloodmagic.itemFilter." + names[stack.getItemDamage()])); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public IItemFilter getInputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { - IItemFilter testFilter = new TestItemFilter(); - - switch (filterStack.getMetadata()) { - case 0: - testFilter = new TestItemFilter(); - break; - case 1: - testFilter = new IgnoreNBTItemFilter(); - break; - case 2: - testFilter = new ModIdItemFilter(); - break; - case 3: - testFilter = new OreDictItemFilter(); - break; - - default: - testFilter = new DefaultItemFilter(); - } - - List filteredList = new ArrayList<>(); - ItemInventory inv = new ItemInventory(filterStack, 9, ""); - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - - filteredList.add(ghostStack); - } - - testFilter.initializeFilter(filteredList, tile, handler, false); - return testFilter; - } - - @Override - public IItemFilter getOutputItemFilter(ItemStack filterStack, TileEntity tile, IItemHandler handler) { - IItemFilter testFilter; - - switch (filterStack.getMetadata()) { - case 0: - testFilter = new TestItemFilter(); - break; - case 1: - testFilter = new IgnoreNBTItemFilter(); - break; - case 2: - testFilter = new ModIdItemFilter(); - break; - case 3: - testFilter = new OreDictItemFilter(); - break; - - default: - testFilter = new DefaultItemFilter(); - } - - List filteredList = new ArrayList<>(); - ItemInventory inv = new ItemInventory(filterStack, 9, ""); //TODO: Change to grab the filter from the Item later. - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - ItemStack ghostStack = GhostItemHelper.getStackFromGhost(stack); - if (ghostStack.isEmpty()) { - ghostStack.setCount(Integer.MAX_VALUE); - } - - filteredList.add(ghostStack); - } - - testFilter.initializeFilter(filteredList, tile, handler, true); - return testFilter; - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=exact"); - variants.put(1, "type=ignorenbt"); - variants.put(2, "type=moditems"); - variants.put(3, "type=oredict"); - } - - @Override - public ItemStack getContainedStackForItem(ItemStack filterStack, ItemStack keyStack) { - ItemStack copyStack = keyStack.copy(); - GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.setCount(1); - return copyStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java deleted file mode 100644 index 496958e1..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigil.java +++ /dev/null @@ -1,39 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.item.ItemBindableBase; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import net.minecraft.item.ItemStack; - -/** - * Base class for all (static) sigils. - */ -public class ItemSigil extends ItemBindableBase implements ISigil { - private int lpUsed; - - public ItemSigil(int lpUsed) { - super(); - - this.lpUsed = lpUsed; - - setMaxStackSize(1); - } - - public boolean isUnusable(ItemStack stack) { - NBTHelper.checkNBT(stack); - - return stack.getTagCompound().getBoolean(Constants.NBT.UNUSABLE); - } - - public ItemStack setUnusable(ItemStack stack, boolean unusable) { - NBTHelper.checkNBT(stack); - - stack.getTagCompound().setBoolean(Constants.NBT.UNUSABLE, unusable); - return stack; - } - - public int getLpUsed() { - return lpUsed; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java deleted file mode 100644 index e849c0c5..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilAir.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.Effects; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.*; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class ItemSigilAir extends ItemSigilBase implements ISentientSwordEffectProvider { - public ItemSigilAir() { - super("air", 50); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - boolean unusable = isUnusable(stack); - if (world.isRemote && !unusable) { - Vec3d vec = player.getLookVec(); - double wantedVelocity = 1.7; - - // TODO - Revisit after potions - if (player.isPotionActive(RegistrarBloodMagic.BOOST)) { - int amplifier = player.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); - wantedVelocity += (1 + amplifier) * (0.35); - } - - player.motionX = vec.x * wantedVelocity; - player.motionY = vec.y * wantedVelocity; - player.motionZ = vec.z * wantedVelocity; - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); - } - - if (!world.isRemote) { - if (!player.capabilities.isCreativeMode) - this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()); - - if (!unusable) - player.fallDistance = 0; - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean applyOnHitEffect(EnumDemonWillType type, ItemStack swordStack, ItemStack providerStack, LivingEntity attacker, LivingEntity target) { - target.addPotionEffect(new EffectInstance(Effects.LEVITATION, 200, 0)); - return true; - } - - @Override - public boolean providesEffectForWill(EnumDemonWillType type) { - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java deleted file mode 100644 index 26b44789..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java +++ /dev/null @@ -1,53 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.apache.commons.lang3.text.WordUtils; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; - -public class ItemSigilBase extends ItemSigil implements IVariantProvider { - - protected final String tooltipBase; - private final String name; - - public ItemSigilBase(String name, int lpUsed) { - super(lpUsed); - - setTranslationKey(BloodMagic.MODID + ".sigil." + name); - - this.name = name; - this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; - } - - public ItemSigilBase(String name) { - this(name, 0); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (TextHelper.canTranslate(tooltipBase + "desc")) - tooltip.addAll(Arrays.asList(WordUtils.wrap(TextHelper.localizeEffect(tooltipBase + "desc"), 30, "/cut", false).split("/cut"))); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=normal"); - } - - public String getName() { - return name; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java deleted file mode 100644 index db5c1c32..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBloodLight.java +++ /dev/null @@ -1,83 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.*; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; - -public class ItemSigilBloodLight extends ItemSigilBase { - public ItemSigilBloodLight() { - super("blood_light", 10); - } - - @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { - if (getCooldownRemainder(stack) > 0) - reduceCooldown(stack); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - RayTraceResult mop = this.rayTrace(world, player, false); - - if (getCooldownRemainder(stack) > 0) - return super.onItemRightClick(world, player, hand); - - if (mop != null && mop.typeOfHit == RayTraceResult.Type.BLOCK) { - BlockPos blockPos = mop.getBlockPos().offset(mop.sideHit); - - if (world.isAirBlock(blockPos)) { - world.setBlockState(blockPos, RegistrarBloodMagicBlocks.BLOOD_LIGHT.getDefaultState()); - if (!world.isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); - network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); - } - resetCooldown(stack); - player.swingArm(hand); - return super.onItemRightClick(world, player, hand); - } - } else { - if (!world.isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); - world.spawnEntity(new EntityBloodLight(world, player)); - network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); - } - resetCooldown(stack); - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - public int getCooldownRemainder(ItemStack stack) { - return NBTHelper.checkNBT(stack).getTagCompound().getInteger(Constants.NBT.TICKS_REMAINING); - } - - public void reduceCooldown(ItemStack stack) { - NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); - } - - public void resetCooldown(ItemStack stack) { - NBTHelper.checkNBT(stack).getTagCompound().setInteger(Constants.NBT.TICKS_REMAINING, 10); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java deleted file mode 100644 index 9e6359d9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBounce.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -public class ItemSigilBounce extends ItemSigilToggleableBase { - public ItemSigilBounce() { - super("bounce", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.BOUNCE, 2, 0, true, false)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java deleted file mode 100644 index d69e9a40..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilClaw.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -public class ItemSigilClaw extends ItemSigilToggleableBase { - public ItemSigilClaw() { - super("claw", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.CLING, 2, 0, true, false)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java deleted file mode 100644 index e0cb5d17..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilCompression.java +++ /dev/null @@ -1,31 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ItemSigilCompression extends ItemSigilToggleableBase { - public ItemSigilCompression() { - super("compression", 200); - } - - // TODO REWRITE all compression stuff if someone has time - // TODO for now, there is a semi-working system in place - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - - if (PlayerHelper.isFakePlayer(player)) - return; - - ItemStack compressedStack = CompressionRegistry.compressInventory(player.inventory.mainInventory.toArray(new ItemStack[player.inventory.mainInventory.size()]), world); - - if (compressedStack != null) { - ItemEntity entityItem = new ItemEntity(world, player.posX, player.posY, player.posZ, compressedStack); - world.spawnEntity(entityItem); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java deleted file mode 100644 index 89f8663c..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ /dev/null @@ -1,49 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IAltarReader; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import com.google.common.collect.Lists; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; - -import java.util.List; - -public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { - - public ItemSigilDivination(boolean simple) { - super(simple ? "divination" : "seer"); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (!world.isRemote) { - super.onItemRightClick(world, player, hand); - - Binding binding = getBinding(stack); - if (binding != null) { - int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence(); - List toSend = Lists.newArrayList(); - if (!binding.getOwnerId().equals(player.getGameProfile().getId())) - toSend.add(new TranslationTextComponent(tooltipBase + "otherNetwork", binding.getOwnerName())); - toSend.add(new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence)); - ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); - } - } - - return super.onItemRightClick(world, player, hand); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java deleted file mode 100644 index 96061711..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilElementalAffinity.java +++ /dev/null @@ -1,25 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ItemSigilElementalAffinity extends ItemSigilToggleableBase { - public ItemSigilElementalAffinity() { - super("elemental_affinity", 200); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - player.fallDistance = 0; - player.extinguish(); - player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, 2, 1, true, false)); - player.addPotionEffect(new EffectInstance(Effects.WATER_BREATHING, 2, 0, true, false)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java deleted file mode 100644 index 26855657..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilEnderSeverance.java +++ /dev/null @@ -1,30 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.Entity; -import net.minecraft.entity.monster.EndermanEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -import java.util.List; - -public class ItemSigilEnderSeverance extends ItemSigilToggleableBase { - public ItemSigilEnderSeverance() { - super("ender_severance", 200); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - List entityList = world.getEntitiesWithinAABB(Entity.class, new net.minecraft.util.math.AxisAlignedBB(player.posX - 4.5, player.posY - 4.5, player.posZ - 4.5, player.posX + 4.5, player.posY + 4.5, player.posZ + 4.5)); - for (Entity entity : entityList) { - if (entity instanceof EndermanEntity) - ((EndermanEntity) entity).addPotionEffect(new EffectInstance(RegistrarBloodMagic.PLANAR_BINDING, 40, 0)); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java deleted file mode 100644 index bedc2c06..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFastMiner.java +++ /dev/null @@ -1,52 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; - -public class ItemSigilFastMiner extends ItemSigilToggleableBase { - public ItemSigilFastMiner() { - super("fast_miner", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - player.addPotionEffect(new EffectInstance(Effects.HASTE, 2, 1, true, false)); - } - - @Override - public boolean performArrayEffect(World world, BlockPos pos) { - double radius = 10; - int ticks = 600; - int potionPotency = 2; - - AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); - List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, bb); - for (PlayerEntity player : playerList) { - if (!player.isPotionActive(Effects.HASTE) || (player.isPotionActive(Effects.HASTE) && player.getActivePotionEffect(Effects.HASTE).getAmplifier() < potionPotency)) { - player.addPotionEffect(new EffectInstance(Effects.HASTE, ticks, potionPotency)); - if (!player.capabilities.isCreativeMode) { - player.hurtResistantTime = 0; - player.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); - } - } - } - - return false; - } - - @Override - public boolean hasArrayEffect() { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java deleted file mode 100644 index 67a0d430..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFilledHand.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.handler.event.GenericHandler; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ItemSigilFilledHand extends ItemSigilToggleableBase { - public ItemSigilFilledHand() { - super("hand", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - GenericHandler.filledHandMapMap.get(world).put(player, 4); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java deleted file mode 100644 index f9ef8238..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFluidBase.java +++ /dev/null @@ -1,178 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.ISigilFluidItem; -import WayofTime.bloodmagic.util.SigilFluidWrapper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.block.Block; -import net.minecraft.block.BlockLiquid; -import net.minecraft.block.BlockState; -import net.minecraft.block.material.Material; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; -import net.minecraftforge.fluids.capability.wrappers.BlockWrapper; -import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; - -import javax.annotation.Nullable; - -public abstract class ItemSigilFluidBase extends ItemSigilBase implements ISigilFluidItem { - //Class for sigils that interact with fluids, either creating or deleting them. - //Sigils still have to define their own onRightClick behavior, but the actual fluid-interacting code is largely limited to here. - public final FluidStack sigilFluid; - - public ItemSigilFluidBase(String name, int lpUsed, FluidStack fluid) { - super(name, lpUsed); - sigilFluid = fluid; - } - - public ItemSigilFluidBase(String name, FluidStack fluid) { - super(name); - sigilFluid = fluid; - } - - public ItemSigilFluidBase(String name) { - super(name); - sigilFluid = null; - } - - //The following are handler functions for fluids, all genericized. - //They're all based off of the Forge FluidUtil methods, but directly taking the sigilFluid constant instead of getting an argument. - - /* Gets a fluid handler for the targeted block and siding. - * Works for both tile entity liquid containers and fluid blocks. - * This one is literally identical to the FluidUtil method of the same signature. - */ - @Nullable - protected IFluidHandler getFluidHandler(World world, BlockPos blockPos, @Nullable Direction side) { - BlockState state = world.getBlockState(blockPos); - Block block = state.getBlock(); - TileEntity tile = world.getTileEntity(blockPos); - if (tile != null) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - if (handler != null) - return handler; - } - if (block instanceof IFluidBlock) - return new FluidBlockWrapper((IFluidBlock) block, world, blockPos); - else if (block instanceof BlockLiquid) - return new BlockLiquidWrapper((BlockLiquid) block, world, blockPos); - return null; - } - - /* Tries to insert fluid into a fluid handler. - * If doTransfer is false, only simulate the transfer. If true, actually do so. - * Returns true if the transfer is successful, false otherwise. - */ - protected boolean tryInsertSigilFluid(IFluidHandler destination, boolean doTransfer) { - if (destination == null) - return false; - return destination.fill(sigilFluid, doTransfer) > 0; - } - - /* Tries basically the oppostive of the above, removing fluids instead of adding them - */ - protected boolean tryRemoveFluid(IFluidHandler source, int amount, boolean doTransfer) { - if (source == null) - return false; - return source.drain(amount, doTransfer) != null; - } - - /* Tries to place a fluid block in the world. - * Returns true if successful, otherwise false. - * This is the big troublesome one, oddly enough. - * It's genericized in case anyone wants to create variant sigils with weird fluids. - */ - protected boolean tryPlaceSigilFluid(PlayerEntity player, World world, BlockPos blockPos) { - - //Make sure world coordinants are valid - if (world == null || blockPos == null) { - return false; - } - //Make sure fluid is placeable - Fluid fluid = sigilFluid.getFluid(); - if (!fluid.canBePlacedInWorld()) { - return false; - } - - //Check if the block is an air block or otherwise replaceable - BlockState state = world.getBlockState(blockPos); - Material mat = state.getMaterial(); - boolean isDestSolid = mat.isSolid(); - boolean isDestReplaceable = state.getBlock().isReplaceable(world, blockPos); - if (!world.isAirBlock(blockPos) && isDestSolid && !isDestReplaceable) { - return false; - } - - //If the fluid vaporizes, this exists here in the lava sigil solely so the code is usable for other fluids - if (world.provider.doesWaterVaporize() && fluid.doesVaporize(sigilFluid)) { - fluid.vaporize(player, world, blockPos, sigilFluid); - return true; - } - - //Finally we've done enough checking to make sure everything at the end is safe, let's place some fluid. - IFluidHandler handler; - Block block = fluid.getBlock(); - if (block instanceof IFluidBlock) - handler = new FluidBlockWrapper((IFluidBlock) block, world, blockPos); - else if (block instanceof BlockLiquid) - handler = new BlockLiquidWrapper((BlockLiquid) block, world, blockPos); - else - handler = new BlockWrapper(block, world, blockPos); - return tryInsertSigilFluid(handler, true); - } - - @Override - public FluidStack getFluid(ItemStack sigil) { - return sigilFluid; - } - - @Override - public int getCapacity(ItemStack sigil) { - return 0; - } - - @Override - public FluidStack drain(ItemStack sigil, int maxDrain, boolean doDrain) { - Binding binding = getBinding(sigil); - - if (binding == null) - return null; - - SoulNetwork network = NetworkHelper.getSoulNetwork(binding); - - if (network.getCurrentEssence() < getLpUsed()) { - network.causeNausea(); - return null; - } - - if (doDrain) - network.syphon(SoulTicket.item(sigil, getLpUsed())); - - return sigilFluid; - } - - @Override - public int fill(ItemStack sigil, FluidStack resource, boolean doFill) { - return 0; - } - - @Override - public ICapabilityProvider initCapabilities(ItemStack stack, CompoundNBT nbt) { - return new SigilFluidWrapper(stack, this); - } - -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java deleted file mode 100644 index 0f4b8118..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilFrost.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.enchantment.FrostWalkerEnchantment; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ItemSigilFrost extends ItemSigilToggleableBase { - public ItemSigilFrost() { - super("frost", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - FrostWalkerEnchantment.freezeNearby(player, world, player.getPosition(), 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java deleted file mode 100644 index 41faf9ba..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilGreenGrove.java +++ /dev/null @@ -1,96 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.block.IGrowable; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.BonemealEvent; -import net.minecraftforge.fml.common.eventhandler.Event.Result; - -public class ItemSigilGreenGrove extends ItemSigilToggleableBase { - public ItemSigilGreenGrove() { - super("green_grove", 150); - } - - @Override - public boolean onSigilUse(ItemStack stack, PlayerEntity player, World world, BlockPos blockPos, Direction side, float hitX, float hitY, float hitZ) { - if (PlayerHelper.isFakePlayer(player)) - return false; - - if (NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() && applyBonemeal(world, blockPos, player, stack)) { - if (!world.isRemote) { - world.playEvent(2005, blockPos, 0); - } - return true; - } - - return false; - } - - @Override - public void onSigilUpdate(ItemStack stack, World worldIn, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - int range = 3; - 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++) { - BlockPos blockPos = new BlockPos(ix, iy, iz); - BlockState state = worldIn.getBlockState(blockPos); - - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (state.getBlock() instanceof IGrowable) { - if (worldIn.rand.nextInt(50) == 0) { - BlockState preBlockState = worldIn.getBlockState(blockPos); - state.getBlock().updateTick(worldIn, blockPos, state, worldIn.rand); - - BlockState newState = worldIn.getBlockState(blockPos); - if (!newState.equals(preBlockState) && !worldIn.isRemote) - worldIn.playEvent(2005, blockPos, 0); - } - } - } - } - } - } - } - - private boolean applyBonemeal(World worldIn, BlockPos target, PlayerEntity player, ItemStack sigilStack) { - BlockState iblockstate = worldIn.getBlockState(target); - - BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate, Hand.MAIN_HAND, sigilStack); - if (MinecraftForge.EVENT_BUS.post(event)) - return false; - else if (event.getResult() == Result.ALLOW) - return true; - - if (iblockstate.getBlock() instanceof IGrowable) { - IGrowable igrowable = (IGrowable) iblockstate.getBlock(); - - if (igrowable.canGrow(worldIn, target, iblockstate, worldIn.isRemote)) { - if (!worldIn.isRemote) { - if (igrowable.canUseBonemeal(worldIn, worldIn.rand, target, iblockstate)) - igrowable.grow(worldIn, worldIn.rand, target, iblockstate); - } - return true; - } - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java deleted file mode 100644 index ddd1937e..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHaste.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -public class ItemSigilHaste extends ItemSigilToggleableBase { - public ItemSigilHaste() { - super("haste", 250); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.BOOST, 2, 0, true, false)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java deleted file mode 100644 index 425e9ee6..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java +++ /dev/null @@ -1,303 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.key.IKeybindable; -import WayofTime.bloodmagic.client.key.KeyBindings; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IAltarReader; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.function.Consumer; - -public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAltarReader, ISigil.Holding, IMeshProvider { - public static final int inventorySize = 5; - - public ItemSigilHolding() { - super("holding"); - } - - @Override - public void onKeyPressed(ItemStack stack, PlayerEntity player, KeyBindings key, boolean showInChat) { - if (stack == player.getHeldItemMainhand() && stack.getItem() instanceof ItemSigilHolding && key.equals(KeyBindings.OPEN_HOLDING)) { - Utils.setUUID(stack); - player.openGui(BloodMagic.instance, Constants.Gui.SIGIL_HOLDING_GUI, player.getEntityWorld(), (int) player.posX, (int) player.posY, (int) player.posZ); - } - } - - @Override - public String getHighlightTip(ItemStack stack, String displayName) { - List inv = getInternalInventory(stack); - int currentSlot = getCurrentItemOrdinal(stack); - ItemStack item = inv.get(currentSlot); - - if (item.isEmpty()) - return displayName; - else - return TextHelper.localizeEffect("item.bloodmagic.sigil.holding.display", displayName, item.getDisplayName()); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.press", KeyBindings.OPEN_HOLDING.getKey().getDisplayName())); - - if (!stack.hasTagCompound()) - return; - - List inv = getInternalInventory(stack); - int currentSlot = getCurrentItemOrdinal(stack); - ItemStack item = inv.get(currentSlot); - - for (int i = 0; i < inventorySize; i++) { - ItemStack invStack = inv.get(i); - if (!invStack.isEmpty()) - if (!item.isEmpty() && invStack == item) - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + invStack.getDisplayName())); - else - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, invStack.getDisplayName())); - } - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction facing, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (PlayerHelper.isFakePlayer(player)) - return ActionResultType.FAIL; - - int currentSlot = getCurrentItemOrdinal(stack); - List inv = getInternalInventory(stack); - ItemStack itemUsing = inv.get(currentSlot); - - if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(itemUsing) == null) - return ActionResultType.PASS; - - ActionResultType result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); - saveInventory(stack, inv); - - return result; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - int currentSlot = getCurrentItemOrdinal(stack); - List inv = getInternalInventory(stack); - ItemStack itemUsing = inv.get(currentSlot); - - if (itemUsing.isEmpty() || ((IBindable) itemUsing.getItem()).getBinding(itemUsing) == null) - return ActionResult.newResult(ActionResultType.PASS, stack); - - itemUsing.getItem().onItemRightClick(world, player, hand); - - saveInventory(stack, inv); - - return ActionResult.newResult(ActionResultType.PASS, stack); - } - - @Nonnull - @Override - public ItemStack getHeldItem(ItemStack holdingStack, PlayerEntity player) { - return getInternalInventory(holdingStack).get(getCurrentItemOrdinal(holdingStack)); - } - - public void saveInventory(ItemStack itemStack, List inventory) { - CompoundNBT itemTag = itemStack.getTagCompound(); - - if (itemTag == null) - itemStack.setTagCompound(itemTag = new CompoundNBT()); - - CompoundNBT inventoryTag = new CompoundNBT(); - ListNBT itemList = new ListNBT(); - - for (int i = 0; i < inventorySize; i++) { - if (!inventory.get(i).isEmpty()) { - CompoundNBT tag = new CompoundNBT(); - tag.putByte(Constants.NBT.SLOT, (byte) i); - inventory.get(i).writeToNBT(tag); - itemList.appendTag(tag); - } - } - - inventoryTag.put(Constants.NBT.ITEMS, itemList); - itemTag.put(Constants.NBT.ITEM_INVENTORY, inventoryTag); - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - if (stack.hasTagCompound()) - tickInternalInventory(stack, world, entity, itemSlot, isSelected); - } - - public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) { - for (ItemStack stack : getInternalInventory(itemStack)) { - if (stack.isEmpty() || !(stack.getItem() instanceof IBindable) || !(stack.getItem() instanceof ISigil)) - continue; - - Binding binding = ((IBindable) stack.getItem()).getBinding(stack); - if (binding == null) - continue; - - stack.getItem().onUpdate(stack, world, entity, itemSlot, isSelected); - } - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - // No-op - Just here to stop the super from running since we're using a mesh provider - } - - @Override - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("color")) - return new ModelResourceLocation(getRegistryName(), "type=color"); - return new ModelResourceLocation(getRegistryName(), "type=normal"); - }; - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("type=normal"); - variants.accept("type=color"); - } - - public static int next(int mode) { - int index = mode + 1; - - if (index >= inventorySize) { - index = 0; - } - - return index; - } - - public static int prev(int mode) { - int index = mode - 1; - - if (index < 0) { - index = inventorySize; - } - - return index; - } - - private static void initModeTag(ItemStack stack) { - if (!stack.hasTagCompound()) { - stack = NBTHelper.checkNBT(stack); - stack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, inventorySize); - } - } - - public static ItemStack getItemStackInSlot(ItemStack itemStack, int slot) { - if (itemStack.getItem() instanceof ItemSigilHolding) { - List inv = getInternalInventory(itemStack); - if (inv != null) - return inv.get(slot == 5 ? 4 : slot); - else - return ItemStack.EMPTY; - } - - return ItemStack.EMPTY; - } - - public static int getCurrentItemOrdinal(ItemStack stack) { - if (stack.getItem() instanceof ItemSigilHolding) { - initModeTag(stack); - int currentSigil = stack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL); - currentSigil = MathHelper.clamp(currentSigil, 0, inventorySize - 1); - return currentSigil; - } - - return 0; - } - - public static List getInternalInventory(ItemStack stack) { - initModeTag(stack); - CompoundNBT tagCompound = stack.getTagCompound(); - - if (tagCompound == null) { - return NonNullList.withSize(inventorySize, ItemStack.EMPTY); - } - - CompoundNBT inventoryTag = tagCompound.getCompoundTag(Constants.NBT.ITEM_INVENTORY); - ListNBT tagList = inventoryTag.getList(Constants.NBT.ITEMS, 10); - - if (tagList.isEmpty()) { - return NonNullList.withSize(inventorySize, ItemStack.EMPTY); - } - - List inv = NonNullList.withSize(inventorySize, ItemStack.EMPTY); - - for (int i = 0; i < tagList.tagCount(); i++) { - CompoundNBT data = tagList.getCompoundTagAt(i); - byte j = data.getByte(Constants.NBT.SLOT); - - if (j >= 0 && j < inv.size()) { - inv.set(j, new ItemStack(data)); - } - } - - return inv; - } - - public static void cycleToNextSigil(ItemStack itemStack, int mode) { - if (itemStack.getItem() instanceof ItemSigilHolding) { - initModeTag(itemStack); - - int index = mode; - if (mode == 120 || mode == -120) { - int currentIndex = getCurrentItemOrdinal(itemStack); - ItemStack currentItemStack = getItemStackInSlot(itemStack, currentIndex); - if (currentItemStack.isEmpty()) - return; - if (mode < 0) { - index = next(currentIndex); - currentItemStack = getItemStackInSlot(itemStack, index); - - while (currentItemStack.isEmpty()) { - index = next(index); - currentItemStack = getItemStackInSlot(itemStack, index); - } - } else { - index = prev(currentIndex); - currentItemStack = getItemStackInSlot(itemStack, index); - - while (currentItemStack.isEmpty()) { - index = prev(index); - currentItemStack = getItemStackInSlot(itemStack, index); - } - } - } - - itemStack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, index); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java deleted file mode 100644 index 9d259798..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilLava.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - - -public class ItemSigilLava extends ItemSigilFluidBase { - - public ItemSigilLava() { - super("lava", 1000, new FluidStack(FluidRegistry.LAVA, 1000)); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (!world.isRemote && !isUnusable(stack)) { - RayTraceResult rayTrace = this.rayTrace(world, player, false); - - if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { - return ActionResult.newResult(ActionResultType.PASS, stack); - } - - BlockPos blockPos = rayTrace.getBlockPos(); - - if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockPos, rayTrace.sideHit, stack)) { - //Case for if block at blockPos is a fluid handler like a tank - //Try to put fluid into tank - IFluidHandler destination = getFluidHandler(world, blockPos, null); - if (destination != null && tryInsertSigilFluid(destination, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - boolean result = tryInsertSigilFluid(destination, true); - if (result) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - //Do the same as above, but use sidedness to interact with the fluid handler. - IFluidHandler destinationSide = getFluidHandler(world, blockPos, rayTrace.sideHit); - if (destinationSide != null && tryInsertSigilFluid(destinationSide, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - boolean result = tryInsertSigilFluid(destinationSide, true); - if (result) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - //Case for if block at blockPos is not a tank - //Place fluid in world - if (destination == null && destinationSide == null) { - BlockPos targetPos = blockPos.offset(rayTrace.sideHit); - if (tryPlaceSigilFluid(player, world, targetPos) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - } - } - } - return super.onItemRightClick(world, player, hand); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java deleted file mode 100644 index 6bf62a91..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilMagnetism.java +++ /dev/null @@ -1,43 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.item.ExperienceOrbEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.World; - -import java.util.List; - -public class ItemSigilMagnetism extends ItemSigilToggleableBase { - public ItemSigilMagnetism() { - super("magnetism", 50); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - 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.getEntityWorld().getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(posX - 0.5f, posY - 0.5f, posZ - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).grow(range, verticalRange, range)); - List xpOrbs = player.getEntityWorld().getEntitiesWithinAABB(ExperienceOrbEntity.class, new AxisAlignedBB(posX - 0.5f, posY - 0.5f, posZ - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).grow(range, verticalRange, range)); - - for (ItemEntity entity : entities) { - if (entity != null && !world.isRemote && !entity.isDead) { - entity.onCollideWithPlayer(player); - } - } - - for (ExperienceOrbEntity xpOrb : xpOrbs) { - if (xpOrb != null && !world.isRemote) { - xpOrb.onCollideWithPlayer(player); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java deleted file mode 100644 index 5edc3928..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilPhantomBridge.java +++ /dev/null @@ -1,217 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import com.google.common.base.Predicate; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ItemSigilPhantomBridge extends ItemSigilToggleableBase { - public static final Predicate IS_PHANTOM_ACTIVE = (Entity entity) -> entity instanceof PlayerEntity && isPhantomActive((PlayerEntity) entity); - - public static final String[] CIRCLE7X7 = new String[]{ - " XXX ", - " XXXXX ", - "XXXXXXX", - "XXXXXXX", - "XXXXXXX", - " XXXXX ", - " XXX " - }; - - public static final String[] CIRCLE9X9 = new String[]{ - " XXXXX ", - " XXXXXXX ", - "XXXXXXXXX", - "XXXXXXXXX", - "XXXXXXXXX", - "XXXXXXXXX", - "XXXXXXXXX", - " XXXXXXX ", - " XXXXX " - }; - - //imagine you're looking into positive Z - public static final String[] DIAG = new String[]{ - "XXX ", // ----------------- - "XXXX ", // Template Guide - "XXXXX ", // ----------------- - " XXXXX",// ^ // You stand in the bottom right corner, 1 block right, 1 block below the bottom right X - " XXXX",// | // inverted: flips it so you are in top left corner - " XXX" // Z // XnZ: mirrors the template on the X axis - // <--X - }; - - private Map> prevPositionMap = new HashMap<>(); - - public ItemSigilPhantomBridge() { - super("phantom_bridge", 100); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - if (!prevPositionMap.containsKey(player)) { - prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); - } - - if ((!player.onGround && !player.isRiding()) && !player.isSneaking()) { - prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); - return; - } - - int verticalOffset = -1; - - if (player.isSneaking()) - verticalOffset--; - - Pair prevPosition = prevPositionMap.get(player); - - double playerVelX = player.posX - prevPosition.getLeft(); - double playerVelZ = player.posZ - prevPosition.getRight(); - - double totalVel = Math.sqrt(playerVelX * playerVelX + playerVelZ * playerVelZ); - //Moves more than totalVel^2 blocks in any direction within a tick - if (totalVel > 2) { - //I am SURE you are teleporting! - playerVelX = 0; - playerVelZ = 0; - totalVel = 0; - } - - BlockPos playerPos = player.getPosition(); - int posX = playerPos.getX(); - int posY = playerPos.getY(); - int posZ = playerPos.getZ(); - - //Standing still, sneaking or walking with framerate drops - if (totalVel >= 0 && totalVel < 0.3) { - circleTemplate7x7(posX, posY, posZ, verticalOffset, world); - //anything between the first case and being slightly faster than walking - //walking fairly quickly on X-axis - } else if (playerVelZ > -0.2 && playerVelZ < 0.2) { - if (playerVelX > 0.4) { - if (playerVelX > 1) { - rectangleBridge(posX, posY, posZ, verticalOffset, world, -1, 1, 7, 9); // long bridge - } - rectangleBridge(posX, posY, posZ, verticalOffset, world, -2, 2, 1, 6); // short bridge - } - if (playerVelX < -0.4) { - if (playerVelX < -1) { - rectangleBridge(posX, posY, posZ, verticalOffset, world, 7, 9, -1, 1); - } - rectangleBridge(posX, posY, posZ, verticalOffset, world, -2, 2, -6, -1); - } - //walking fairly quickly on Z-axis - } else if (playerVelX > -0.2 && playerVelX < 0.2) { - if (playerVelZ > 0.4) { - if (playerVelZ > 1) { - rectangleBridge(posX, posY, posZ, verticalOffset, world, 2, 6, -2, 2); - } - rectangleBridge(posX, posY, posZ, verticalOffset, world, 1, 6, -2, 2); - } - if (playerVelZ < -0.4) { - if (playerVelZ < -1) { - rectangleBridge(posX, posY, posZ, verticalOffset, world, -9, -7, -1, 1); - } - rectangleBridge(posX, posY, posZ, verticalOffset, world, -6, -1, -2, 2); - } - } else if (playerVelX > 0.2) { // diagonal movement - if (playerVelZ > 0.2) { - templateReaderCustom(posX, posY, posZ, verticalOffset, world, 1, 1, DIAG, false, false); - } else if (playerVelZ < -0.2) { - templateReaderCustom(posX, posY, posZ, verticalOffset, world, 1, -1, DIAG, false, true); - } - } else if (playerVelX < -0.2) { - if (playerVelZ > 0.2) { - templateReaderCustom(posX, posY, posZ, verticalOffset, world, -1, 1, DIAG, true, true); - } else if (playerVelZ < -0.2) { - templateReaderCustom(posX, posY, posZ, verticalOffset, world, -1, -1, DIAG, true, false); - } - } else { - circleTemplate9x9(posX, posY, posZ, verticalOffset, world); - } - - prevPositionMap.put(player, Pair.of(player.posX, player.posZ)); - } - - private static void circleTemplate9x9(int posX, int posY, int posZ, int verticalOffset, World world) { - int x = -5; - int z = -5; - templateReader(posX, posY, posZ, verticalOffset, world, z, x, CIRCLE9X9); - } - - private static void circleTemplate7x7(int posX, int posY, int posZ, int verticalOffset, World world) { - int x = -4; - int z = -4; - templateReader(posX, posY, posZ, verticalOffset, world, z, x, CIRCLE7X7); - } - - private static void rectangleBridge(int posX, int posY, int posZ, int verticalOffset, World world, int startZ, int endZ, int startX, int endX) { - for (int z = startZ; z <= endZ; z++) { - for (int x = startX; x <= endX; x++) { - BlockPos blockPos = new BlockPos(posX + x, posY + verticalOffset, posZ + z); - - if (world.isAirBlock(blockPos)) - world.setBlockState(blockPos, RegistrarBloodMagicBlocks.PHANTOM.getDefaultState()); - } - } - } - - private static void templateReader(int posX, int posY, int posZ, int verticalOffset, World world, int offsetZ, int offsetX, String[] template) { - templateReaderCustom(posX, posY, posZ, verticalOffset, world, offsetZ, offsetX, template, false, false); - } - - private static void templateReaderCustom(int posX, int posY, int posZ, int verticalOffset, World world, int offsetZ, int offsetX, String[] template, boolean inverted, boolean XnZ) { - int x = 0; - for (String row : template) { - if (inverted) - x--; - else - x++; - int z = 0; - for (char block : row.toCharArray()) { - if (inverted && !XnZ || XnZ && !inverted) - z--; - else - z++; - if (block == 'X') { - BlockPos blockPos = new BlockPos(posX + offsetX + x, posY + verticalOffset, posZ + offsetZ + z); - - if (world.isAirBlock(blockPos)) - world.setBlockState(blockPos, RegistrarBloodMagicBlocks.PHANTOM.getDefaultState()); - } - } - } - } - - public static boolean isPhantomActive(PlayerEntity entity) { - for (int i = 0; i < entity.inventory.getSizeInventory(); i++) { - ItemStack stack = entity.inventory.getStackInSlot(i); - if (stack.getItem() instanceof ItemSigilPhantomBridge) - return NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - if (stack.getItem() instanceof ItemSigilHolding) { - List inv = ItemSigilHolding.getInternalInventory(stack); - for (int j = 0; j < ItemSigilHolding.inventorySize; j++) { - ItemStack invStack = inv.get(j); - if (invStack.getItem() instanceof ItemSigilPhantomBridge) - return NBTHelper.checkNBT(invStack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - } - } - - } - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java deleted file mode 100644 index 686e57eb..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSuppression.java +++ /dev/null @@ -1,50 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemSigilSuppression extends ItemSigilToggleableBase { - public ItemSigilSuppression() { - super("suppression", 400); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - int x = (int) player.posX; - int y = (int) player.posY; - int z = (int) player.posZ; - final int radius = 5; - final int refresh = 100; - - 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; - } - - BlockPos blockPos = new BlockPos(x + i, y + j, z + k); - BlockState state = world.getBlockState(blockPos); - - if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) - TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); - else { - TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileSpectralBlock) - ((TileSpectralBlock) tile).resetDuration(refresh); - } - } - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java deleted file mode 100644 index 3950db3b..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTeleposition.java +++ /dev/null @@ -1,160 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.teleport.Teleports; -import WayofTime.bloodmagic.tile.TileTeleposer; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.UUID; - -public class ItemSigilTeleposition extends ItemSigilBase { - - public ItemSigilTeleposition() { - super("teleposition"); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); - - TeleportLocation location = getTeleportLocation(stack); - if (location != null) { - tooltip.add(""); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", location.pos.getX(), location.pos.getY(), location.pos.getZ())); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", location.dim)); - } - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - TeleportLocation location = getTeleportLocation(stack); - Binding binding = getBinding(stack); - if (!world.isRemote && location != null && binding != null) { - World teleportTo = DimensionManager.getWorld(location.dim); - if (teleportTo != null) { - TileEntity tile = teleportTo.getTileEntity(location.pos); - if (tile instanceof TileTeleposer) { - BlockPos blockPos = location.pos.up(); - UUID bindingOwnerID = binding.getOwnerId(); - if (world.provider.getDimension() == location.dim) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, bindingOwnerID, true)); - - } else { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, bindingOwnerID, world, tile.getWorld().provider.getDimension(), true)); - } - } - } - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResultType.FAIL; - - if (!world.isRemote && player.isSneaking() && NBTHelper.checkNBT(stack) != null) { - if (world.getTileEntity(pos) != null && world.getTileEntity(pos) instanceof TileTeleposer) { - TeleportLocation teleportLocation = new TeleportLocation(world.provider.getDimension(), pos); - updateLocation(stack, teleportLocation); - return ActionResultType.SUCCESS; - } - } - return ActionResultType.FAIL; - } - - @Nullable - public TeleportLocation getTeleportLocation(ItemStack stack) { - if (!(stack.getItem() instanceof ItemSigilTeleposition)) - return null; - - if (!stack.hasTagCompound()) - return null; - - CompoundNBT locationTag = stack.getSubCompound("tplocation"); - if (locationTag == null) - return null; - - return TeleportLocation.fromTag(locationTag); - } - - public void updateLocation(ItemStack stack, TeleportLocation location) { - CompoundNBT tagCompound; - if (!stack.hasTagCompound()) - stack.setTagCompound(tagCompound = new CompoundNBT()); - else - tagCompound = stack.getTagCompound(); - - tagCompound.putTag("tplocation", location.serializeNBT()); - } - - public static class TeleportLocation implements INBTSerializable { - - private int dim; - private BlockPos pos; - - private TeleportLocation() { - } - - public TeleportLocation(int dim, BlockPos pos) { - this.dim = dim; - this.pos = pos; - } - - public TeleportLocation(int dim, int x, int y, int z) { - this(dim, new BlockPos(x, y, z)); - } - - @Override - public CompoundNBT serializeNBT() { - CompoundNBT tag = new CompoundNBT(); - tag.putInt("dim", dim); - tag.putLong("pos", pos.toLong()); - return tag; - } - - @Override - public void deserializeNBT(CompoundNBT nbt) { - this.dim = nbt.getInt("dim"); - this.pos = BlockPos.fromLong(nbt.getLong("pos")); - } - - public static TeleportLocation fromTag(CompoundNBT tpTag) { - TeleportLocation location = new TeleportLocation(); - location.deserializeNBT(tpTag); - return location; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java deleted file mode 100644 index bb21d6d6..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleable.java +++ /dev/null @@ -1,96 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.iface.IActivatable; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -/** - * Base class for all toggleable sigils. - */ -public class ItemSigilToggleable extends ItemSigil implements IActivatable { - - public ItemSigilToggleable(int lpUsed) { - super(lpUsed); - } - - @Override - public boolean getActivated(ItemStack stack) { - return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - } - - @Override - public ItemStack setActivatedState(ItemStack stack, boolean activated) { - if (!stack.isEmpty()) { - NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); - return stack; - } - - return stack; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (!world.isRemote && !isUnusable(stack)) { - if (player.isSneaking()) - setActivatedState(stack, !getActivated(stack)); - if (getActivated(stack)) - return super.onItemRightClick(world, player, hand); - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos pos, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - - Binding binding = getBinding(stack); - if (binding == null || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while toggling state - return ActionResultType.PASS; - - return onSigilUse(player.getHeldItem(hand), player, world, pos, side, hitX, hitY, hitZ) ? ActionResultType.SUCCESS : ActionResultType.FAIL; - } - - public boolean onSigilUse(ItemStack itemStack, PlayerEntity player, World world, BlockPos blockPos, Direction side, float hitX, float hitY, float hitZ) { - return false; - } - - @Override - public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { - if (!worldIn.isRemote && entityIn instanceof ServerPlayerEntity && getActivated(stack)) { - if (entityIn.ticksExisted % 100 == 0) { - if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((PlayerEntity) entityIn, SoulTicket.item(stack, worldIn, entityIn, getLpUsed())).isSuccess()) { - setActivatedState(stack, false); - } - } - - onSigilUpdate(stack, worldIn, (PlayerEntity) entityIn, itemSlot, isSelected); - } - } - - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java deleted file mode 100644 index 190e8b98..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java +++ /dev/null @@ -1,54 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.Locale; -import java.util.function.Consumer; - -public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMeshProvider { - - protected final String tooltipBase; - private final String name; - - public ItemSigilToggleableBase(String name, int lpUsed) { - super(lpUsed); - - setTranslationKey(BloodMagic.MODID + ".sigil." + name); - setCreativeTab(BloodMagic.TAB_BM); - - this.name = name; - this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); - if (!stack.hasTagCompound()) - return; - - tooltip.add(new TranslationTextComponent("tooltip.bloodmagic." + (getActivated(stack) ? "activated" : "deactivated")).getFormattedText()); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("sigil_" + name.toLowerCase(Locale.ROOT)); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=false"); - variants.accept("active=true"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java deleted file mode 100644 index fa898cb9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilTransposition.java +++ /dev/null @@ -1,142 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.block.BlockState; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.NBTUtil; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.tileentity.MobSpawnerTileEntity; -import net.minecraft.util.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nullable; -import java.util.List; - -public class ItemSigilTransposition extends ItemSigilBase { - - public ItemSigilTransposition() { - super("transposition", 1000); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - super.addInformation(stack, world, tooltip, flag); - - if (!stack.hasTagCompound()) - return; - CompoundNBT tag = stack.getTagCompound(); - - if (tag.hasKey("stored")) { - tooltip.add(" "); - tooltip.add(tag.getCompound("stored").getString("display")); - } - } - - @SideOnly(Side.CLIENT) - @Override - public String getItemStackDisplayName(ItemStack stack) { - if (!stack.hasTagCompound()) - return super.getItemStackDisplayName(stack); - - CompoundNBT tag = stack.getTagCompound(); - if (tag.hasKey("stored")) - return super.getItemStackDisplayName(stack) + " (" + tag.getCompound("stored").getString("display") + ")"; - - return super.getItemStackDisplayName(stack); - } - - @Override - public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos blockPos, Hand hand, Direction side, float hitX, float hitY, float hitZ) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResultType.FAIL; - - BlockState state = world.getBlockState(blockPos); - if (!world.isRemote) { - if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state)) - return ActionResultType.FAIL; - - if (player.isSneaking() && stack.hasTagCompound() && !stack.getTagCompound().hasKey("stored")) { - if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) { - int cost = getLpUsed(); - - CompoundNBT stored = new CompoundNBT(); - stored.setTag("state", NBTUtil.writeBlockState(new CompoundNBT(), state)); - stored.setString("display", state.getBlock().getPickBlock(state, null, world, blockPos, player).getDisplayName()); - if (state.getBlock().hasTileEntity(state)) { - TileEntity tile = world.getTileEntity(blockPos); - if (tile != null) { - cost *= 5; - stored.setTag("tileData", tile.writeToNBT(new CompoundNBT())); - - if (world.getTileEntity(blockPos) instanceof MobSpawnerTileEntity) - cost *= 6; - } - } - - stack.getTagCompound().setTag("stored", stored); - NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, cost)); - world.removeTileEntity(blockPos); - world.setBlockToAir(blockPos); - return ActionResultType.SUCCESS; - } - } else if (stack.hasTagCompound() && stack.getTagCompound().hasKey("stored")) { - BlockState worldState = world.getBlockState(blockPos); - CompoundNBT storedTag = stack.getTagCompound().getCompoundTag("stored"); - BlockState storedState = NBTUtil.readBlockState(storedTag.getCompound("state")); - CompoundNBT tileData = storedTag.hasKey("tileData") ? storedTag.getCompound("tileData") : null; - - if (!worldState.getBlock().isReplaceable(world, blockPos)) - blockPos = blockPos.offset(side); - - if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(storedState.getBlock(), blockPos, false, side, player)) { - if (world.setBlockState(blockPos, storedState, 3)) { - storedState.getBlock().onBlockPlacedBy(world, blockPos, storedState, player, ItemStack.EMPTY); - - if (tileData != null) { - tileData.setInteger("x", blockPos.getX()); - tileData.setInteger("y", blockPos.getY()); - tileData.setInteger("z", blockPos.getZ()); - TileEntity worldTile = world.getTileEntity(blockPos); - if (worldTile != null) - worldTile.readFromNBT(tileData); - } - - world.notifyBlockUpdate(blockPos, state, state, 3); - stack.getTagCompound().removeTag("stored"); - return ActionResultType.SUCCESS; - } - } - } - } - return ActionResultType.FAIL; - } - - // We only want to send the display name to the client rather than the bloated tag with tile data and such - @Nullable - @Override - public CompoundNBT getNBTShareTag(ItemStack stack) { - if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("stored")) - return super.getNBTShareTag(stack); - - CompoundNBT shareTag = stack.getTagCompound().copy(); - CompoundNBT storedTag = shareTag.getCompound("stored"); - storedTag.removeTag("state"); - storedTag.removeTag("stored"); - - return shareTag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java deleted file mode 100644 index 809042d1..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilVoid.java +++ /dev/null @@ -1,97 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - -public class ItemSigilVoid extends ItemSigilFluidBase { - public ItemSigilVoid() { - super("void", 50, null); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (!world.isRemote && !isUnusable(stack)) { - RayTraceResult rayTrace = this.rayTrace(world, player, true); - - if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { - return ActionResult.newResult(ActionResultType.PASS, stack); - } - - BlockPos blockPos = rayTrace.getBlockPos(); - - if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockPos, rayTrace.sideHit, stack)) { - //Void is simpler than the other fluid sigils, because getFluidHandler grabs fluid blocks just fine - //So extract from fluid tanks with a null side; or drain fluid blocks. - IFluidHandler destination = getFluidHandler(world, blockPos, null); - if (destination != null && tryRemoveFluid(destination, 1000, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - if (tryRemoveFluid(destination, 1000, true)) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - //Do the same as above, but use sidedness to interact with the fluid handler. - IFluidHandler destinationSide = getFluidHandler(world, blockPos, rayTrace.sideHit); - if (destinationSide != null && tryRemoveFluid(destinationSide, 1000, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - if (tryRemoveFluid(destinationSide, 1000, true)) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - } - } - return super.onItemRightClick(world, player, hand); - } - - @Override - public FluidStack getFluid(ItemStack sigil) { - return null; - } - - @Override - public int getCapacity(ItemStack sigil) { - return 10000; - } - - @Override - public int fill(ItemStack sigil, FluidStack resource, boolean doFill) { - if (resource == null || resource.amount <= 0) - return 0; - - Binding binding = getBinding(sigil); - - if (binding == null) - return 0; - - int capacity = getCapacity(sigil); - - if (!doFill) - return Math.min(capacity, resource.amount); - - SoulNetwork network = NetworkHelper.getSoulNetwork(binding); - - if (network.getCurrentEssence() < getLpUsed()) { - network.causeNausea(); - return 0; - } - - network.syphon(SoulTicket.item(sigil, getLpUsed())); - return Math.min(capacity, resource.amount); - } -} - diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java deleted file mode 100644 index 9417adc1..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWater.java +++ /dev/null @@ -1,79 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.block.Blocks; -import net.minecraft.block.CauldronBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - -public class ItemSigilWater extends ItemSigilFluidBase { - public ItemSigilWater() { - super("water", 100, new FluidStack(FluidRegistry.WATER, 1000)); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - if (stack.getItem() instanceof ISigil.Holding) - stack = ((Holding) stack.getItem()).getHeldItem(stack, player); - if (PlayerHelper.isFakePlayer(player)) - return ActionResult.newResult(ActionResultType.FAIL, stack); - - if (!world.isRemote && !isUnusable(stack)) { - RayTraceResult rayTrace = this.rayTrace(world, player, false); - - if (rayTrace == null || rayTrace.typeOfHit != RayTraceResult.Type.BLOCK) { - return ActionResult.newResult(ActionResultType.PASS, stack); - } - - BlockPos blockPos = rayTrace.getBlockPos(); - - if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockPos, rayTrace.sideHit, stack)) { - //Case for if block at blockPos is a fluid handler like a tank - //Try to put fluid into tank - IFluidHandler destination = getFluidHandler(world, blockPos, null); - if (destination != null && tryInsertSigilFluid(destination, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - boolean result = tryInsertSigilFluid(destination, true); - if (result) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - //Do the same as above, but use sidedness to interact with the fluid handler. - IFluidHandler destinationSide = getFluidHandler(world, blockPos, rayTrace.sideHit); - if (destinationSide != null && tryInsertSigilFluid(destinationSide, false) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - boolean result = tryInsertSigilFluid(destinationSide, true); - if (result) - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - - //Special vanilla cauldron handling, yay. - if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().withProperty(CauldronBlock.LEVEL, 3)); - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - - //Case for if block at blockPos is not a tank - //Place fluid in world - if (destination == null && destinationSide == null) { - BlockPos targetPos = blockPos.offset(rayTrace.sideHit); - if (tryPlaceSigilFluid(player, world, targetPos) && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) { - return ActionResult.newResult(ActionResultType.SUCCESS, stack); - } - } - } - } - - return super.onItemRightClick(world, player, hand); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java deleted file mode 100644 index fffbb349..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilWhirlwind.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.item.sigil; - -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -public class ItemSigilWhirlwind extends ItemSigilToggleableBase { - public ItemSigilWhirlwind() { - super("whirlwind", 250); - } - - @Override - public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - if (PlayerHelper.isFakePlayer(player)) - return; - - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.WHIRLWIND, 2, 0, true, false)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java deleted file mode 100644 index 3445bbe1..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java +++ /dev/null @@ -1,122 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemEnum; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.Locale; - -public class ItemMonsterSoul extends ItemEnum.Variant implements IDemonWill { - - public ItemMonsterSoul() { - super(WillType.class, "monster_soul"); - - setMaxStackSize(1); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - tooltip.add(TextHelper.localize("tooltip.bloodmagic.will", getWill(getType(stack), stack))); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public EnumDemonWillType getType(ItemStack stack) { - return EnumDemonWillType.values()[stack.getItemDamage() % 5]; - } - - @Override - public double getWill(EnumDemonWillType type, ItemStack soulStack) { - if (type != this.getType(soulStack)) { - return 0; - } - - NBTHelper.checkNBT(soulStack); - - CompoundNBT tag = soulStack.getTagCompound(); - - return tag.getDouble(Constants.NBT.SOULS); - } - - @Override - public void setWill(EnumDemonWillType type, ItemStack soulStack, double souls) { - NBTHelper.checkNBT(soulStack); - - CompoundNBT tag = soulStack.getTagCompound(); - - soulStack.setItemDamage(type.ordinal()); - - tag.putDouble(Constants.NBT.SOULS, souls); - } - - @Override - public double drainWill(EnumDemonWillType type, ItemStack soulStack, double drainAmount) { - double souls = getWill(type, soulStack); - - double soulsDrained = Math.min(drainAmount, souls); - setWill(type, soulStack, souls - soulsDrained); - - return soulsDrained; - } - - @Override - public ItemStack createWill(int meta, double number) { - ItemStack soulStack = new ItemStack(this, 1, meta % 5); - setWill(getType(soulStack), soulStack, number); - return soulStack; - } - - @Override - public double getWill(ItemStack willStack) { - return this.getWill(EnumDemonWillType.DEFAULT, willStack); - } - - @Override - public void setWill(ItemStack willStack, double will) { - this.setWill(EnumDemonWillType.DEFAULT, willStack, will); - } - - @Override - public double drainWill(ItemStack willStack, double drainAmount) { - return this.drainWill(EnumDemonWillType.DEFAULT, willStack, drainAmount); - } - - public enum WillType implements ISubItem { - - RAW, - CORROSIVE, - DESTRUCTIVE, - VENGEFUL, - STEADFAST, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.MONSTER_SOUL, count, ordinal()); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java deleted file mode 100644 index 2406975f..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.function.Consumer; - -public class ItemSentientArmourGem extends Item implements IMeshProvider { - public ItemSentientArmourGem() { - super(); - - setCreativeTab(BloodMagic.TAB_BM); - setTranslationKey(BloodMagic.MODID + ".sentientArmourGem"); - setMaxStackSize(1); - } - - public EnumDemonWillType getCurrentType(ItemStack stack) { - return EnumDemonWillType.DEFAULT; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - boolean hasSentientArmour = false; - NonNullList armourInventory = player.inventory.armorInventory; - for (ItemStack armourStack : armourInventory) { - if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { - hasSentientArmour = true; - } - } - - if (hasSentientArmour) { - ItemSentientArmour.revertAllArmour(player); - } else { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double will = PlayerDemonWillHandler.getTotalDemonWill(type, player); - -// PlayerDemonWillHandler.consumeDemonWill(player, willBracket[bracket]); - ItemSentientArmour.convertPlayerArmour(type, will, player); - } - - return new ActionResult<>(ActionResultType.PASS, player.getHeldItem(hand)); - } - - @SideOnly(Side.CLIENT) - @Override - public ItemMeshDefinition getMeshDefinition() { - return stack -> { - boolean flag = false; - NonNullList armourInventory = Minecraft.getInstance().player.inventory.armorInventory; - for (ItemStack armourStack : armourInventory) { - if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) { - flag = true; - } - } - - return new ModelResourceLocation(stack.getItem().getRegistryName(), "type=" + (flag ? "" : "de") + "activated"); - }; - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("type=activated"); - variants.accept("type=deactivated"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java deleted file mode 100644 index 5fcc00bb..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java +++ /dev/null @@ -1,489 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.SlimeEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.*; -import java.util.function.Consumer; - -public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; - public static double[] defaultDamageAdded = new double[]{1, 2, 3, 3.5, 4}; - public static double[] destructiveDamageAdded = new double[]{2, 3, 4, 5, 6}; - public static double[] vengefulDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] steadfastDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] defaultDigSpeedAdded = new double[]{1, 1.5, 2, 3, 4}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75}; - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3}; - - public static double[] healthBonus = new double[]{0, 0, 0, 0, 0}; //TODO: Think of implementing this later - public static double[] vengefulAttackSpeed = new double[]{-3, -2.8, -2.7, -2.6, -2.5}; - public static double[] destructiveAttackSpeed = new double[]{-3.1, -3.1, -3.2, -3.3, -3.3}; - - public static int[] absorptionTime = new int[]{200, 300, 400, 500, 600}; - - public static double maxAbsorptionHearts = 10; - - public static int[] poisonTime = new int[]{25, 50, 60, 80, 100}; - public static int[] poisonLevel = new int[]{0, 0, 0, 1, 1}; - - public static double[] movementSpeed = new double[]{0.05, 0.1, 0.15, 0.2, 0.25}; - - public final double baseAttackDamage = 8; - public final double baseAttackSpeed = -3; - - public ItemSentientAxe() { - super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL, 8.0F, 3.1F); - setMaxDamage(getMaxDamage() * 2); -// super(ModItems.soulToolMaterial); - - setTranslationKey(BloodMagic.MODID + ".sentientAxe"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - float value = super.getDestroySpeed(stack, state); - if (value > 1) { - return (float) (value + getDigSpeedOfSword(stack)); - } else { - return value; - } - } - - public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(stack, soulsRemaining); - - double drain = level >= 0 ? soulDrainPerSwing[level] : 0; - double extraDamage = getExtraDamage(type, level); - - setDrainOfActivatedSword(stack, drain); - setDamageOfActivatedSword(stack, baseAttackDamage + extraDamage); - setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); - setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - setAttackSpeedOfSword(stack, level >= 0 ? getAttackSpeed(type, level) : baseAttackSpeed); - setHealthBonusOfSword(stack, level >= 0 ? getHealthBonus(type, level) : 0); - setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); - setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); - } - - public double getExtraDamage(EnumDemonWillType type, int willBracket) { - if (willBracket < 0) { - return 0; - } - - switch (type) { - case CORROSIVE: - case DEFAULT: - return defaultDamageAdded[willBracket]; - case DESTRUCTIVE: - return destructiveDamageAdded[willBracket]; - case VENGEFUL: - return vengefulDamageAdded[willBracket]; - case STEADFAST: - return steadfastDamageAdded[willBracket]; - } - - return 0; - } - - public double getAttackSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return vengefulAttackSpeed[willBracket]; - case DESTRUCTIVE: - return destructiveAttackSpeed[willBracket]; - default: - return -2.9; - } - } - - public double getHealthBonus(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return healthBonus[willBracket]; - default: - return 0; - } - } - - public double getMovementSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return movementSpeed[willBracket]; - default: - return 0; - } - } - - public double getDigSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: -// return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; - } - } - - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { - switch (type) { - case CORROSIVE: - target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - if (!target.isEntityAlive()) { - float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); - attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); - } - break; - case VENGEFUL: - break; - } - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof PlayerEntity) { - PlayerEntity attackerPlayer = (PlayerEntity) attacker; - this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); - EnumDemonWillType type = this.getCurrentType(stack); - double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); - int willBracket = this.getLevel(stack, will); - - applyEffectToEntity(type, willBracket, target, attackerPlayer); - - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) { - ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) { - provider.applyOnHitEffect(type, stack, offStack, attacker, target); - } - } - } - - return true; - } - - return false; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - recalculatePowers(player.getHeldItem(hand), world, player); - - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - private int getLevel(ItemStack stack, double soulsRemaining) { - int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { - lvl = i; - } - } - - return lvl; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientAxe.desc")))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - } - - @Override - public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { - recalculatePowers(stack, player.getEntityWorld(), player); - - double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) { - EnumDemonWillType type = getCurrentType(stack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - - if (drain > soulsRemaining) { - return false; - } else { - PlayerDemonWillHandler.consumeDemonWill(type, player, drain); - } - } - - return super.onLeftClickEntity(stack, player, entity); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("sentient_axe"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) - variants.accept("type=" + type.getName().toLowerCase()); - } - - @Override - public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList<>(); - - if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { - return soulList; - } - - double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; - - IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); - - EnumDemonWillType type = this.getCurrentType(stack); - - for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); - soulList.add(soulStack); - } - } - - return soulList; - } - - //TODO: Change attack speed. - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (slot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); - } - - return multimap; - } - - public double getDamageOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); - } - - public void setDamageOfActivatedSword(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); - } - - public double getDrainOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); - } - - public void setDrainOfActivatedSword(ItemStack stack, double drain) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); - } - - public double getStaticDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); - } - - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); - } - - public double getDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); - } - - public void setDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); - } - - public double getHealthBonusOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonusOfSword(ItemStack stack, double hp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getAttackSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); - } - - public void setAttackSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); - } - - public double getSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); - } - - public void setSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); - } - - public double getDigSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); - } - - public void setDigSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); - } - - @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { - World world = player.getEntityWorld(); - if (!world.isRemote) { - this.recalculatePowers(droppedStack, world, player); - - EnumDemonWillType type = this.getCurrentType(droppedStack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { - return false; - } - - PlayerDemonWillHandler.consumeDemonWill(type, player, 100); - - EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); - specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntity(specterEntity); - - specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); - - specterEntity.setType(this.getCurrentType(droppedStack)); - specterEntity.setOwner(player); - specterEntity.setTamed(true); - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java deleted file mode 100644 index d23b0a96..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java +++ /dev/null @@ -1,477 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.AbstractArrowEntity; -import net.minecraft.entity.projectile.ArrowEntity; -import net.minecraft.item.*; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.stats.Stats; -import net.minecraft.util.SoundEvents; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.BowItem; -import net.minecraft.item.Items; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Potion; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public class ItemSentientBow extends BowItem implements IMultiWillTool, ISentientTool, IVariantProvider//, IMeshProvider -{ - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000, 2000, 4000}; - public static double[] defaultDamageAdded = new double[]{0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75}; - public static float[] velocityAdded = new float[]{0.25f, 0.5f, 0.75f, 1, 1.25f, 1.5f, 1.75f}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75, 1, 1.5}; //TODO - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13, 16, 24}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3, 3, 4}; - public static float soullessShotVelocity = 2.5F; - - public ItemSentientBow() { - - super(); - setTranslationKey(BloodMagic.MODID + ".sentientBow"); - setCreativeTab(BloodMagic.TAB_BM); - this.addPropertyOverride(new ResourceLocation("pull"), new IItemPropertyGetter() { - @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, LivingEntity entityIn) { - if (entityIn == null) { - return 0.0F; - } else { - ItemStack itemstack = entityIn.getActiveItemStack(); - return !itemstack.isEmpty() && itemstack.getItem() == RegistrarBloodMagicItems.SENTIENT_BOW ? (float) (stack.getMaxItemUseDuration() - entityIn.getItemInUseCount()) / 20.0F : 0.0F; - } - } - }); - this.addPropertyOverride(new ResourceLocation("pulling"), new IItemPropertyGetter() { - @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, LivingEntity entityIn) { - return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F; - } - }); - this.addPropertyOverride(new ResourceLocation("type"), new IItemPropertyGetter() { - @SideOnly(Side.CLIENT) - public float apply(ItemStack stack, World world, LivingEntity entityIn) { - return ((ItemSentientBow) RegistrarBloodMagicItems.SENTIENT_BOW).getCurrentType(stack).ordinal(); - } - }); - } - - @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); - } - - public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - recalculatePowers(stack, type, soulsRemaining); - } - - public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) { - this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(will); -// - double drain = level >= 0 ? soulDrainPerSwing[level] : 0; - - setDrainOfActivatedBow(stack, drain); - setStaticDropOfActivatedBow(stack, level >= 0 ? staticDrop[level] : 1); - setDropOfActivatedBow(stack, level >= 0 ? soulDrop[level] : 0); -// double drain = level >= 0 ? soulDrainPerSwing[level] : 0; -// double extraDamage = level >= 0 ? damageAdded[level] : 0; -// -// setDrainOfActivatedSword(stack, drain); -// setDamageOfActivatedSword(stack, 7 + extraDamage); -// setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); -// setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - - setVelocityOfArrow(stack, level >= 0 ? 3 + getVelocityModifier(type, level) : soullessShotVelocity); - setDamageAdded(stack, level >= 0 ? getDamageModifier(type, level) : 0); - } - - private int getLevel(double soulsRemaining) { - int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { - lvl = i; - } - } - - return lvl; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public double getDamageModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return 0; - case DEFAULT: - case CORROSIVE: - case DESTRUCTIVE: - case STEADFAST: - return defaultDamageAdded[willBracket]; - } - - return 0; - } - - public float getVelocityModifier(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return velocityAdded[willBracket]; - default: - return 0; - } - } - - public void setDamageAdded(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble("damage", damage); - } - - public double getDamageAdded(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - return tag.getDouble("damage"); - } - - public void setVelocityOfArrow(ItemStack stack, float velocity) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putFloat("velocity", velocity); - } - - public float getVelocityOfArrow(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (tag.hasKey("velocity")) { - return tag.getFloat("velocity"); - } - - return 3; - } - - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - public double getDrainOfActivatedBow(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); - } - - public void setDrainOfActivatedBow(ItemStack stack, double drain) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); - } - - public double getStaticDropOfActivatedBow(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); - } - - public void setStaticDropOfActivatedBow(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); - } - - public double getDropOfActivatedBow(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); - } - - public void setDropOfActivatedBow(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - this.recalculatePowers(stack, world, player); - return super.onItemRightClick(world, player, hand); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "inventory"); - } - - public ArrowEntity getArrowEntity(World world, ItemStack stack, LivingEntity target, LivingEntity user, float velocity) { - EnumDemonWillType type = this.getCurrentType(stack); - - double amount = user instanceof PlayerEntity ? (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)) : 0; - - float newArrowVelocity = velocity * getVelocityOfArrow(stack); - double soulsRemaining = user instanceof PlayerEntity ? (PlayerDemonWillHandler.getTotalDemonWill(type, (PlayerEntity) user)) : 0; - EntitySentientArrow entityArrow = new EntitySentientArrow(world, user, type, amount, getLevel(soulsRemaining), (Potion) null); - - double d0 = target.posX - user.posX; - double d1 = target.getEntityBoundingBox().minY + (double) (target.height / 3.0F) - entityArrow.posY; - double d2 = target.posZ - user.posZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entityArrow.shoot(d0, d1 + d3 * 0.05, d2, newArrowVelocity, 0); - - if (newArrowVelocity == 0) { - world.playSound(null, user.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); - return null; - } - - if (velocity == 1.0F) { - entityArrow.setIsCritical(true); - } - - int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack); - - entityArrow.setDamage(entityArrow.getDamage() + this.getDamageAdded(stack) + (j > 0 ? j * 0.5 + 0.5 : 0)); - - int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - - if (k > 0) { - entityArrow.setKnockbackStrength(k); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { - entityArrow.setFire(100); - } - - entityArrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; - - return entityArrow; - } - - public EntitySentientArrow getDuplicateArrow(ItemStack bowStack, World world, PlayerEntity player, double reimburseMultiplier) { - - EnumDemonWillType willType = this.getCurrentType(bowStack); - ItemStack arrow = this.getFiredArrow(player); - - ArrowItem itemarrow = ((ArrowItem) (arrow.getItem() instanceof ArrowItem ? arrow.getItem() : Items.ARROW)); - EntitySentientArrow entityArrow; - double reimburseAmount = (this.getDropOfActivatedBow(bowStack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(bowStack)) * reimburseMultiplier; - - if (itemarrow == Items.ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(willType, player); - entityArrow = new EntitySentientArrow(world, player, willType, reimburseAmount, getLevel(soulsRemaining), (Potion) null); - } else if (itemarrow == Items.TIPPED_ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(willType, player); - entityArrow = new EntitySentientArrow(world, player, willType, reimburseAmount, getLevel(soulsRemaining), arrow); - } else if (itemarrow == Items.SPECTRAL_ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(willType, player); - entityArrow = new EntitySentientArrow(world, player, willType, reimburseAmount, getLevel(soulsRemaining), new Potion(new EffectInstance(Effects.GLOWING, 200, 0))); - } else { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(willType, player); - entityArrow = new EntitySentientArrow(world, player, willType, reimburseAmount, getLevel(soulsRemaining), itemarrow.createArrow(world, bowStack, player)); - } - - player.addStat(Stats.getObjectUseStats(this)); - return entityArrow; - } - - @Override - public void onPlayerStoppedUsing(ItemStack stack, World world, LivingEntity entityLiving, int timeLeft) { - if (entityLiving instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entityLiving; - boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantments.INFINITY, stack) > 0; - ItemStack itemstack = this.getFiredArrow(player); - - int i = this.getMaxItemUseDuration(stack) - timeLeft; - i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(stack, world, (PlayerEntity) entityLiving, i, itemstack != null || flag); - if (i < 0) - return; - - if (itemstack != null || flag) { - if (itemstack == null) { - itemstack = new ItemStack(Items.ARROW); - } - - float arrowVelocity = getArrowVelocity(i); - - if ((double) arrowVelocity >= 0.1D) { - boolean flag1 = flag && itemstack.getItem() == Items.ARROW; //Forge: Fix consuming custom arrows. - - if (!world.isRemote) { - this.recalculatePowers(stack, world, player); - EnumDemonWillType type = this.getCurrentType(stack); - - ArrowItem itemarrow = ((ArrowItem) (itemstack.getItem() instanceof ArrowItem ? itemstack.getItem() : Items.ARROW)); - AbstractArrowEntity entityArrow; - double amount = (this.getDropOfActivatedBow(stack) * world.rand.nextDouble() + this.getStaticDropOfActivatedBow(stack)); - - float newArrowVelocity = arrowVelocity * getVelocityOfArrow(stack); - - if (getLevel(PlayerDemonWillHandler.getTotalDemonWill(type, player)) <= 0) { - entityArrow = itemarrow.createArrow(world, itemstack, entityLiving); - } else if (itemarrow == Items.ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining), (Potion) null); - } else if (itemarrow == Items.TIPPED_ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining), itemstack); - } else if (itemarrow == Items.SPECTRAL_ARROW) { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining), new Potion(new EffectInstance(Effects.GLOWING, 200, 0))); - } else { - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - entityArrow = new EntitySentientArrow(world, entityLiving, type, amount, getLevel(soulsRemaining), itemarrow.createArrow(world, stack, entityLiving)); - } - - entityArrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, newArrowVelocity, 1.0F); - - if (Float.compare(getVelocityOfArrow(stack), soullessShotVelocity) < Float.MIN_NORMAL) { - world.playSound(null, player.getPosition(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.NEUTRAL, 0.4F, 1.0F); - } - - if (arrowVelocity == 1.0F) { - entityArrow.setIsCritical(true); - } - - int j = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack); - - entityArrow.setDamage(entityArrow.getDamage() + this.getDamageAdded(stack) + (j > 0 ? j * 0.5 + 0.5 : 0)); - - int k = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - - if (k > 0) { - entityArrow.setKnockbackStrength(k); - } - - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) { - entityArrow.setFire(100); - } - - stack.damageItem(1, player); - - if (flag1) { - entityArrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; - } - - world.spawnEntity(entityArrow); - } - - world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + arrowVelocity * 0.5F); - - if (!flag1) { - itemstack.shrink(1); - - if (itemstack.isEmpty()) { - player.inventory.deleteStack(itemstack); - } - } - - player.addStat(Stats.getObjectUseStats(this)); - } - } - } - } - - protected ItemStack getFiredArrow(PlayerEntity player) { - if (this.isArrow(player.getHeldItem(Hand.OFF_HAND))) { - return player.getHeldItem(Hand.OFF_HAND); - } else if (this.isArrow(player.getHeldItem(Hand.MAIN_HAND))) { - return player.getHeldItem(Hand.MAIN_HAND); - } else { - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { - ItemStack itemstack = player.inventory.getStackInSlot(i); - - if (this.isArrow(itemstack)) { - return itemstack; - } - } - - return null; - } - } - - @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { - World world = player.getEntityWorld(); - if (!world.isRemote) { - this.recalculatePowers(droppedStack, world, player); - - EnumDemonWillType type = this.getCurrentType(droppedStack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { - return false; - } - - PlayerDemonWillHandler.consumeDemonWill(type, player, 100); - - EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); - specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntity(specterEntity); - - specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); - - specterEntity.setType(this.getCurrentType(droppedStack)); - specterEntity.setOwner(player); - specterEntity.setTamed(true); - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java deleted file mode 100644 index a1556a5b..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java +++ /dev/null @@ -1,488 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.SlimeEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.PickaxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.*; -import java.util.function.Consumer; - -public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; - public static double[] defaultDamageAdded = new double[]{1, 2, 3, 3.5, 4}; - public static double[] destructiveDamageAdded = new double[]{2, 3, 4, 5, 6}; - public static double[] vengefulDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] steadfastDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] defaultDigSpeedAdded = new double[]{1, 1.5, 2, 3, 4}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75}; - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3}; - - public static double[] healthBonus = new double[]{0, 0, 0, 0, 0}; //TODO: Think of implementing this later - public static double[] vengefulAttackSpeed = new double[]{-3, -2.8, -2.7, -2.6, -2.5}; - public static double[] destructiveAttackSpeed = new double[]{-3.1, -3.1, -3.2, -3.3, -3.3}; - - public static int[] absorptionTime = new int[]{200, 300, 400, 500, 600}; - - public static double maxAbsorptionHearts = 10; - - public static int[] poisonTime = new int[]{25, 50, 60, 80, 100}; - public static int[] poisonLevel = new int[]{0, 0, 0, 1, 1}; - - public static double[] movementSpeed = new double[]{0.05, 0.1, 0.15, 0.2, 0.25}; - - public final double baseAttackDamage = 3; - public final double baseAttackSpeed = -2.8; - - public ItemSentientPickaxe() { - super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - setMaxDamage(getMaxDamage() * 2); -// super(ModItems.soulToolMaterial); - - setTranslationKey(BloodMagic.MODID + ".sentientPickaxe"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - float value = super.getDestroySpeed(stack, state); - if (value > 1) { - return (float) (value + getDigSpeedOfSword(stack)); - } else { - return value; - } - } - - public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(stack, soulsRemaining); - - double drain = level >= 0 ? soulDrainPerSwing[level] : 0; - double extraDamage = getExtraDamage(type, level); - - setDrainOfActivatedSword(stack, drain); - setDamageOfActivatedSword(stack, baseAttackDamage + extraDamage); - setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); - setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - setAttackSpeedOfSword(stack, level >= 0 ? getAttackSpeed(type, level) : baseAttackSpeed); - setHealthBonusOfSword(stack, level >= 0 ? getHealthBonus(type, level) : 0); - setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); - setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); - } - - public double getExtraDamage(EnumDemonWillType type, int willBracket) { - if (willBracket < 0) { - return 0; - } - - switch (type) { - case CORROSIVE: - case DEFAULT: - return defaultDamageAdded[willBracket]; - case DESTRUCTIVE: - return destructiveDamageAdded[willBracket]; - case VENGEFUL: - return vengefulDamageAdded[willBracket]; - case STEADFAST: - return steadfastDamageAdded[willBracket]; - } - - return 0; - } - - public double getAttackSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return vengefulAttackSpeed[willBracket]; - case DESTRUCTIVE: - return destructiveAttackSpeed[willBracket]; - default: - return -2.9; - } - } - - public double getHealthBonus(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return healthBonus[willBracket]; - default: - return 0; - } - } - - public double getMovementSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return movementSpeed[willBracket]; - default: - return 0; - } - } - - public double getDigSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: -// return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; - } - } - - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { - switch (type) { - case CORROSIVE: - target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - if (!target.isEntityAlive()) { - float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); - attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); - } - break; - case VENGEFUL: - break; - } - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof PlayerEntity) { - PlayerEntity attackerPlayer = (PlayerEntity) attacker; - this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); - EnumDemonWillType type = this.getCurrentType(stack); - double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); - int willBracket = this.getLevel(stack, will); - - applyEffectToEntity(type, willBracket, target, attackerPlayer); - - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) { - ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) { - provider.applyOnHitEffect(type, stack, offStack, attacker, target); - } - } - } - - return true; - } - - return false; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - recalculatePowers(player.getHeldItem(hand), world, player); - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - private int getLevel(ItemStack stack, double soulsRemaining) { - int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { - lvl = i; - } - } - - return lvl; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientPickaxe.desc")))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - } - - @Override - public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { - recalculatePowers(stack, player.getEntityWorld(), player); - - double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) { - EnumDemonWillType type = getCurrentType(stack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - - if (drain > soulsRemaining) { - return false; - } else { - PlayerDemonWillHandler.consumeDemonWill(type, player, drain); - } - } - - return super.onLeftClickEntity(stack, player, entity); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("sentient_pickaxe"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) - variants.accept("type=" + type.getName().toLowerCase()); - } - - @Override - public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList<>(); - - if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { - return soulList; - } - - double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; - - IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); - - EnumDemonWillType type = this.getCurrentType(stack); - - for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); - soulList.add(soulStack); - } - } - - return soulList; - } - - //TODO: Change attack speed. - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (slot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); - } - - return multimap; - } - - public double getDamageOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); - } - - public void setDamageOfActivatedSword(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); - } - - public double getDrainOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); - } - - public void setDrainOfActivatedSword(ItemStack stack, double drain) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); - } - - public double getStaticDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); - } - - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); - } - - public double getDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); - } - - public void setDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); - } - - public double getHealthBonusOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonusOfSword(ItemStack stack, double hp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getAttackSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); - } - - public void setAttackSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); - } - - public double getSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); - } - - public void setSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); - } - - public double getDigSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); - } - - public void setDigSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); - } - - @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { - World world = player.getEntityWorld(); - if (!world.isRemote) { - this.recalculatePowers(droppedStack, world, player); - - EnumDemonWillType type = this.getCurrentType(droppedStack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { - return false; - } - - PlayerDemonWillHandler.consumeDemonWill(type, player, 100); - - EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); - specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntity(specterEntity); - - specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); - - specterEntity.setType(this.getCurrentType(droppedStack)); - specterEntity.setOwner(player); - specterEntity.setTamed(true); - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java deleted file mode 100644 index d04beea9..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java +++ /dev/null @@ -1,489 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.SlimeEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ShovelItem; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.*; -import java.util.function.Consumer; - -public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000}; - public static double[] defaultDamageAdded = new double[]{1, 2, 3, 3.5, 4}; - public static double[] destructiveDamageAdded = new double[]{2, 3, 4, 5, 6}; - public static double[] vengefulDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] steadfastDamageAdded = new double[]{0, 0.5, 1, 1.5, 2}; - public static double[] defaultDigSpeedAdded = new double[]{1, 1.5, 2, 3, 4}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75}; - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3}; - - public static double[] healthBonus = new double[]{0, 0, 0, 0, 0}; //TODO: Think of implementing this later - public static double[] vengefulAttackSpeed = new double[]{-3, -2.8, -2.7, -2.6, -2.5}; - public static double[] destructiveAttackSpeed = new double[]{-3.1, -3.1, -3.2, -3.3, -3.3}; - - public static int[] absorptionTime = new int[]{200, 300, 400, 500, 600}; - - public static double maxAbsorptionHearts = 10; - - public static int[] poisonTime = new int[]{25, 50, 60, 80, 100}; - public static int[] poisonLevel = new int[]{0, 0, 0, 1, 1}; - - public static double[] movementSpeed = new double[]{0.05, 0.1, 0.15, 0.2, 0.25}; - - public final double baseAttackDamage = 3; - public final double baseAttackSpeed = -2.8; - - public ItemSentientShovel() { - super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - setMaxDamage(getMaxDamage() * 2); -// super(ModItems.soulToolMaterial); - - setTranslationKey(BloodMagic.MODID + ".sentientShovel"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public float getDestroySpeed(ItemStack stack, BlockState state) { - float value = super.getDestroySpeed(stack, state); - if (value > 1) { - return (float) (value + getDigSpeedOfSword(stack)); - } else { - return value; - } - } - - public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - this.setCurrentType(stack, soulsRemaining > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(stack, soulsRemaining); - - double drain = level >= 0 ? soulDrainPerSwing[level] : 0; - double extraDamage = getExtraDamage(type, level); - - setDrainOfActivatedSword(stack, drain); - setDamageOfActivatedSword(stack, baseAttackDamage + extraDamage); - setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); - setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - setAttackSpeedOfSword(stack, level >= 0 ? getAttackSpeed(type, level) : baseAttackSpeed); - setHealthBonusOfSword(stack, level >= 0 ? getHealthBonus(type, level) : 0); - setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); - setDigSpeedOfSword(stack, level >= 0 ? getDigSpeed(type, level) : 0); - } - - public double getExtraDamage(EnumDemonWillType type, int willBracket) { - if (willBracket < 0) { - return 0; - } - - switch (type) { - case CORROSIVE: - case DEFAULT: - return defaultDamageAdded[willBracket]; - case DESTRUCTIVE: - return destructiveDamageAdded[willBracket]; - case VENGEFUL: - return vengefulDamageAdded[willBracket]; - case STEADFAST: - return steadfastDamageAdded[willBracket]; - } - - return 0; - } - - public double getAttackSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return vengefulAttackSpeed[willBracket]; - case DESTRUCTIVE: - return destructiveAttackSpeed[willBracket]; - default: - return -2.9; - } - } - - public double getHealthBonus(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return healthBonus[willBracket]; - default: - return 0; - } - } - - public double getMovementSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return movementSpeed[willBracket]; - default: - return 0; - } - } - - public double getDigSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: -// return movementSpeed[willBracket]; - default: - return defaultDigSpeedAdded[willBracket]; - } - } - - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, PlayerEntity attacker) { - switch (type) { - case CORROSIVE: - target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - if (!target.isEntityAlive()) { - float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); - attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); - } - break; - case VENGEFUL: - break; - } - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof PlayerEntity) { - PlayerEntity attackerPlayer = (PlayerEntity) attacker; - this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); - EnumDemonWillType type = this.getCurrentType(stack); - double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); - int willBracket = this.getLevel(stack, will); - - applyEffectToEntity(type, willBracket, target, attackerPlayer); - - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) { - ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) { - provider.applyOnHitEffect(type, stack, offStack, attacker, target); - } - } - } - - return true; - } - - return false; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - recalculatePowers(player.getHeldItem(hand), world, player); - - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - private int getLevel(ItemStack stack, double soulsRemaining) { - int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { - lvl = i; - } - } - - return lvl; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientShovel.desc")))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - } - - @Override - public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { - recalculatePowers(stack, player.getEntityWorld(), player); - - double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) { - EnumDemonWillType type = getCurrentType(stack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - - if (drain > soulsRemaining) { - return false; - } else { - PlayerDemonWillHandler.consumeDemonWill(type, player, drain); - } - } - - return super.onLeftClickEntity(stack, player, entity); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("sentient_shovel"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) - variants.accept("type=" + type.getName().toLowerCase()); - } - - @Override - public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList<>(); - - if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { - return soulList; - } - - double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; - - IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); - - EnumDemonWillType type = this.getCurrentType(stack); - - for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); - soulList.add(soulStack); - } - } - - return soulList; - } - - //TODO: Change attack speed. - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (slot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); - } - - return multimap; - } - - public double getDamageOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); - } - - public void setDamageOfActivatedSword(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); - } - - public double getDrainOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); - } - - public void setDrainOfActivatedSword(ItemStack stack, double drain) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); - } - - public double getStaticDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); - } - - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); - } - - public double getDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); - } - - public void setDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); - } - - public double getHealthBonusOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonusOfSword(ItemStack stack, double hp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getAttackSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); - } - - public void setAttackSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); - } - - public double getSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); - } - - public void setSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); - } - - public double getDigSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED); - } - - public void setDigSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DIG_SPEED, speed); - } - - @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { - World world = player.getEntityWorld(); - if (!world.isRemote) { - this.recalculatePowers(droppedStack, world, player); - - EnumDemonWillType type = this.getCurrentType(droppedStack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { - return false; - } - - PlayerDemonWillHandler.consumeDemonWill(type, player, 100); - - EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); - specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntity(specterEntity); - - specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); - - specterEntity.setType(this.getCurrentType(droppedStack)); - specterEntity.setOwner(player); - specterEntity.setTamed(true); - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java deleted file mode 100644 index 4953ba3b..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java +++ /dev/null @@ -1,455 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionMultiWill; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.iface.ISentientSwordEffectProvider; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillWeapon; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.monster.SlimeEntity; -import net.minecraft.entity.monster.IMob; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.item.SwordItem; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.*; -import java.util.function.Consumer; - -public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool { - public static int[] soulBracket = new int[]{16, 60, 200, 400, 1000, 2000, 4000}; - public static double[] defaultDamageAdded = new double[]{1, 1.5, 2, 2.5, 3, 3.5, 4}; - public static double[] destructiveDamageAdded = new double[]{1.5, 2.25, 3, 3.75, 4.5, 5.25, 6}; - public static double[] vengefulDamageAdded = new double[]{0, 0.5, 1, 1.5, 2, 2.25, 2.5}; - public static double[] steadfastDamageAdded = new double[]{0, 0.5, 1, 1.5, 2, 2.25, 2.5}; - public static double[] soulDrainPerSwing = new double[]{0.05, 0.1, 0.2, 0.4, 0.75, 1, 1.25}; - public static double[] soulDrop = new double[]{2, 4, 7, 10, 13, 15, 18}; - public static double[] staticDrop = new double[]{1, 1, 2, 3, 3, 4, 4}; - - public static double[] healthBonus = new double[]{0, 0, 0, 0, 0, 0, 0}; //TODO: Think of implementing this later - public static double[] vengefulAttackSpeed = new double[]{-2.1, -2, -1.8, -1.7, -1.6, -1.6, -1.5}; - public static double[] destructiveAttackSpeed = new double[]{-2.6, -2.7, -2.8, -2.9, -3, -3, -3}; - - public static int[] absorptionTime = new int[]{200, 300, 400, 500, 600, 700, 800}; - - public static double maxAbsorptionHearts = 10; - - public static int[] poisonTime = new int[]{25, 50, 60, 80, 100, 120, 150}; - public static int[] poisonLevel = new int[]{0, 0, 0, 1, 1, 1, 1}; - - public static double[] movementSpeed = new double[]{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4}; - - public ItemSentientSword() { - super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); - - setTranslationKey(BloodMagic.MODID + ".sentientSword"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) { - return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() || super.getIsRepairable(toRepair, repair); - } - - public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) { - EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - recalculatePowers(stack, type, soulsRemaining); - } - - public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) { - this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); - int level = getLevel(stack, will); - - double drain = level >= 0 ? soulDrainPerSwing[level] : 0; - double extraDamage = getExtraDamage(type, level); - - setDrainOfActivatedSword(stack, drain); - setDamageOfActivatedSword(stack, 5 + extraDamage); - setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); - setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); - setAttackSpeedOfSword(stack, level >= 0 ? getAttackSpeed(type, level) : -2.4); - setHealthBonusOfSword(stack, level >= 0 ? getHealthBonus(type, level) : 0); - setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); - } - - public double getExtraDamage(EnumDemonWillType type, int willBracket) { - if (willBracket < 0) { - return 0; - } - - switch (type) { - case CORROSIVE: - case DEFAULT: - return defaultDamageAdded[willBracket]; - case DESTRUCTIVE: - return destructiveDamageAdded[willBracket]; - case VENGEFUL: - return vengefulDamageAdded[willBracket]; - case STEADFAST: - return steadfastDamageAdded[willBracket]; - } - - return 0; - } - - public double getAttackSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return vengefulAttackSpeed[willBracket]; - case DESTRUCTIVE: - return destructiveAttackSpeed[willBracket]; - default: - return -2.4; - } - } - - public double getHealthBonus(EnumDemonWillType type, int willBracket) { - switch (type) { - case STEADFAST: - return healthBonus[willBracket]; - default: - return 0; - } - } - - public double getMovementSpeed(EnumDemonWillType type, int willBracket) { - switch (type) { - case VENGEFUL: - return movementSpeed[willBracket]; - default: - return 0; - } - } - - public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, LivingEntity attacker) { - switch (type) { - case CORROSIVE: - target.addPotionEffect(new EffectInstance(Effects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); - break; - case DEFAULT: - break; - case DESTRUCTIVE: - break; - case STEADFAST: - if (!target.isEntityAlive()) { - float absorption = attacker.getAbsorptionAmount(); - attacker.addPotionEffect(new EffectInstance(Effects.ABSORPTION, absorptionTime[willBracket], 127)); - attacker.setAbsorptionAmount((float) Math.min(absorption + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); - } - break; - case VENGEFUL: - break; - } - } - - @Override - public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) { - if (super.hitEntity(stack, target, attacker)) { - if (attacker instanceof PlayerEntity) { - PlayerEntity attackerPlayer = (PlayerEntity) attacker; - this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); - EnumDemonWillType type = this.getCurrentType(stack); - double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); - int willBracket = this.getLevel(stack, will); - - applyEffectToEntity(type, willBracket, target, attackerPlayer); - - ItemStack offStack = attackerPlayer.getItemStackFromSlot(EquipmentSlotType.OFFHAND); - if (offStack.getItem() instanceof ISentientSwordEffectProvider) { - ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); - if (provider.providesEffectForWill(type)) { - provider.applyOnHitEffect(type, stack, offStack, attacker, target); - } - } - } - - return true; - } - - return false; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(ItemStack stack, EnumDemonWillType type) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - recalculatePowers(player.getHeldItem(hand), world, player); - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { - return oldStack.getItem() != newStack.getItem(); - } - - private int getLevel(ItemStack stack, double soulsRemaining) { - int lvl = -1; - for (int i = 0; i < soulBracket.length; i++) { - if (soulsRemaining >= soulBracket[i]) { - lvl = i; - } - } - - return lvl; - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientSword.desc")))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - } - - @Override - public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) { - recalculatePowers(stack, player.getEntityWorld(), player); - - double drain = this.getDrainOfActivatedSword(stack); - if (drain > 0) { - EnumDemonWillType type = getCurrentType(stack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - - if (drain > soulsRemaining) { - return false; - } else { - PlayerDemonWillHandler.consumeDemonWill(type, player, drain); - } - } - - return super.onLeftClickEntity(stack, player, entity); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionMultiWill("sentient_sword"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) - variants.accept("type=" + type.getName().toLowerCase()); - } - - @Override - public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) { - List soulList = new ArrayList<>(); - - if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) { - return soulList; - } - - double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; - - IDemonWill soul = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL); - - EnumDemonWillType type = this.getCurrentType(stack); - - for (int i = 0; i <= looting; i++) { - if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) { - ItemStack soulStack = soul.createWill(type.ordinal(), willModifier * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + this.getStaticDropOfActivatedSword(stack)) * killedEntity.getMaxHealth() / 20d); - soulList.add(soulStack); - } - } - - return soulList; - } - - //TODO: Change attack speed. - @Override - public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) { - Multimap multimap = HashMultimap.create(); - if (slot == EquipmentSlotType.MAINHAND) { - multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), 0)); - multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), 0)); - multimap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), 2)); - } - - return multimap; - } - - public double getDamageOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); - } - - public void setDamageOfActivatedSword(ItemStack stack, double damage) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); - } - - public double getDrainOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); - } - - public void setDrainOfActivatedSword(ItemStack stack, double drain) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); - } - - public double getStaticDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); - } - - public void setStaticDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); - } - - public double getDropOfActivatedSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); - } - - public void setDropOfActivatedSword(ItemStack stack, double drop) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); - } - - public double getHealthBonusOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); - } - - public void setHealthBonusOfSword(ItemStack stack, double hp) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); - } - - public double getAttackSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); - } - - public void setAttackSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); - } - - public double getSpeedOfSword(ItemStack stack) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); - } - - public void setSpeedOfSword(ItemStack stack, double speed) { - NBTHelper.checkNBT(stack); - - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); - } - - @Override - public boolean spawnSentientEntityOnDrop(ItemStack droppedStack, PlayerEntity player) { - World world = player.getEntityWorld(); - if (!world.isRemote) { - this.recalculatePowers(droppedStack, world, player); - - EnumDemonWillType type = this.getCurrentType(droppedStack); - double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); - if (soulsRemaining < 1024) { - return false; - } - - PlayerDemonWillHandler.consumeDemonWill(type, player, 100); - - EntitySentientSpecter specterEntity = new EntitySentientSpecter(world); - specterEntity.setPosition(player.posX, player.posY, player.posZ); - world.spawnEntity(specterEntity); - - specterEntity.setItemStackToSlot(EquipmentSlotType.MAINHAND, droppedStack.copy()); - - specterEntity.setType(this.getCurrentType(droppedStack)); - specterEntity.setOwner(player); - specterEntity.setTamed(true); - - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java deleted file mode 100644 index 9cec0e42..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ /dev/null @@ -1,267 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionWillGem; -import WayofTime.bloodmagic.iface.IMultiWillTool; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillGem; -import WayofTime.bloodmagic.soul.PlayerDemonWillHandler; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.*; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Hand; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.List; -import java.util.Locale; -import java.util.function.Consumer; - -public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, IMultiWillTool { - public static String[] names = {"petty", "lesser", "common", "greater", "grand"}; - - public ItemSoulGem() { - super(); - - setTranslationKey(BloodMagic.MODID + ".soulGem."); - setHasSubtypes(true); - setMaxStackSize(1); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[stack.getItemDamage()]; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - EnumDemonWillType type = this.getCurrentType(stack); - double drain = Math.min(this.getWill(type, stack), this.getMaxWill(type, stack) / 10); - - double filled = PlayerDemonWillHandler.addDemonWill(type, player, drain, stack); - this.drainWill(type, stack, filled, true); - - return new ActionResult<>(ActionResultType.PASS, stack); - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionWillGem("soul_gem"); - } - - @Override - public void gatherVariants(Consumer variants) { - for (EnumDemonWillType type : EnumDemonWillType.values()) { - variants.accept("type=petty_" + type.getName().toLowerCase()); - variants.accept("type=lesser_" + type.getName().toLowerCase()); - variants.accept("type=common_" + type.getName().toLowerCase()); - variants.accept("type=greater_" + type.getName().toLowerCase()); - variants.accept("type=grand_" + type.getName().toLowerCase()); - } - } - - @Override - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) { - ItemStack emptyStack = new ItemStack(this, 1, i); - - list.add(emptyStack); - } - for (EnumDemonWillType type : EnumDemonWillType.values()) { - for (int i = 0; i < names.length; i++) { - ItemStack fullStack = new ItemStack(this, 1, i); - setWill(type, fullStack, getMaxWill(EnumDemonWillType.DEFAULT, fullStack)); - list.add(fullStack); - } - } - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - if (!stack.hasTagCompound()) - return; - - EnumDemonWillType type = this.getCurrentType(stack); - tooltip.add(TextHelper.localize("tooltip.bloodmagic.soulGem." + names[stack.getItemDamage()])); - tooltip.add(TextHelper.localize("tooltip.bloodmagic.will", getWill(type, stack))); - tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.currentType." + getCurrentType(stack).getName().toLowerCase())); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return true; - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - EnumDemonWillType type = this.getCurrentType(stack); - double maxWill = getMaxWill(type, stack); - if (maxWill <= 0) { - return 1; - } - return 1.0 - (getWill(type, stack) / maxWill); - } - - @Override - public int getRGBDurabilityForDisplay(ItemStack stack) { - EnumDemonWillType type = this.getCurrentType(stack); - double maxWill = getMaxWill(type, stack); - if (maxWill <= 0) { - return 1; - } - - return MathHelper.hsvToRGB(Math.max(0.0F, (float) (getWill(type, stack)) / (float) maxWill) / 3.0F, 1.0F, 1.0F); - } - - @Override - public ItemStack fillDemonWillGem(ItemStack soulGemStack, ItemStack soulStack) { - if (soulStack != null && soulStack.getItem() instanceof IDemonWill) { - EnumDemonWillType thisType = this.getCurrentType(soulGemStack); - if (thisType != ((IDemonWill) soulStack.getItem()).getType(soulStack)) { - return soulStack; - } - IDemonWill soul = (IDemonWill) soulStack.getItem(); - double soulsLeft = getWill(thisType, soulGemStack); - - if (soulsLeft < getMaxWill(thisType, soulGemStack)) { - double newSoulsLeft = Math.min(soulsLeft + soul.getWill(thisType, soulStack), getMaxWill(thisType, soulGemStack)); - soul.drainWill(thisType, soulStack, newSoulsLeft - soulsLeft); - - setWill(thisType, soulGemStack, newSoulsLeft); - if (soul.getWill(thisType, soulStack) <= 0) { - return ItemStack.EMPTY; - } - } - } - - return soulStack; - } - - @Override - public double getWill(EnumDemonWillType type, ItemStack soulGemStack) { - if (!type.equals(getCurrentType(soulGemStack))) { - return 0; - } - - CompoundNBT tag = soulGemStack.getTagCompound(); - - return tag.getDouble(Constants.NBT.SOULS); - } - - @Override - public void setWill(EnumDemonWillType type, ItemStack soulGemStack, double souls) { - setCurrentType(type, soulGemStack); - - CompoundNBT tag = soulGemStack.getTagCompound(); - - tag.putDouble(Constants.NBT.SOULS, souls); - } - - @Override - public double drainWill(EnumDemonWillType type, ItemStack soulGemStack, double drainAmount, boolean doDrain) { - EnumDemonWillType currentType = this.getCurrentType(soulGemStack); - if (currentType != type) { - return 0; - } - double souls = getWill(type, soulGemStack); - - double soulsDrained = Math.min(drainAmount, souls); - - if (doDrain) { - setWill(type, soulGemStack, souls - soulsDrained); - } - - return soulsDrained; - } - - @Override - public int getMaxWill(EnumDemonWillType type, ItemStack soulGemStack) { - EnumDemonWillType currentType = getCurrentType(soulGemStack); - if (!type.equals(currentType) && currentType != EnumDemonWillType.DEFAULT) { - return 0; - } - - switch (soulGemStack.getMetadata()) { - case 0: - return 64; - case 1: - return 256; - case 2: - return 1024; - case 3: - return 4096; - case 4: - return 16384; - } - return 64; - } - - @Override - public EnumDemonWillType getCurrentType(ItemStack soulGemStack) { - NBTHelper.checkNBT(soulGemStack); - - CompoundNBT tag = soulGemStack.getTagCompound(); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - return EnumDemonWillType.DEFAULT; - } - - return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - } - - public void setCurrentType(EnumDemonWillType type, ItemStack soulGemStack) { - NBTHelper.checkNBT(soulGemStack); - - CompoundNBT tag = soulGemStack.getTagCompound(); - - if (type == EnumDemonWillType.DEFAULT) { - if (tag.hasKey(Constants.NBT.WILL_TYPE)) { - tag.removeTag(Constants.NBT.WILL_TYPE); - } - - return; - } - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - } - - @Override - public double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill) { - if (!type.equals(getCurrentType(stack)) && this.getWill(getCurrentType(stack), stack) > 0) { - return 0; - } - - double current = this.getWill(type, stack); - double maxWill = this.getMaxWill(type, stack); - - double filled = Math.min(fillAmount, maxWill - current); - - if (doFill) { - this.setWill(type, stack, filled + current); - } - - return filled; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java deleted file mode 100644 index 83ee8e05..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.item.soul; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IVariantProvider; -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import WayofTime.bloodmagic.util.helper.TextHelper; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.item.ItemGroup; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.SoundEvents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.*; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import javax.annotation.Nonnull; -import java.util.Arrays; -import java.util.List; - -public class ItemSoulSnare extends Item implements IVariantProvider { - public static String[] names = {"base"}; - - public ItemSoulSnare() { - super(); - - setTranslationKey(BloodMagic.MODID + ".soulSnare."); - setCreativeTab(BloodMagic.TAB_BM); - setHasSubtypes(true); - setMaxStackSize(16); - } - - @Override - public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) { - ItemStack stack = playerIn.getHeldItem(hand); - if (!playerIn.capabilities.isCreativeMode) { - stack.shrink(1); - } - - worldIn.playSound(null, playerIn.posX, playerIn.posY, playerIn.posZ, SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F)); - - if (!worldIn.isRemote) { - EntitySoulSnare snare = new EntitySoulSnare(worldIn, playerIn); - snare.shoot(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); - worldIn.spawnEntity(snare); - } - - return new ActionResult<>(ActionResultType.SUCCESS, stack); - } - - @Override - public String getTranslationKey(ItemStack stack) { - return super.getTranslationKey(stack) + names[stack.getItemDamage()]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubItems(ItemGroup creativeTab, NonNullList list) { - if (!isInCreativeTab(creativeTab)) - return; - - for (int i = 0; i < names.length; i++) - list.add(new ItemStack(this, 1, i)); - } - - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) { - tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.soulSnare.desc")))); - - super.addInformation(stack, world, tooltip, flag); - } - - @Override - public void gatherVariants(@Nonnull Int2ObjectMap variants) { - variants.put(0, "type=soulsnare"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java deleted file mode 100644 index 42a33ceb..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemFlightScroll.java +++ /dev/null @@ -1,274 +0,0 @@ -package WayofTime.bloodmagic.item.soulBreath; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Consumer; - -import javax.annotation.Nullable; -import javax.vecmath.Vector3d; - -import net.minecraft.client.renderer.ItemMeshDefinition; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.IMeshProvider; -import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.iface.IActivatable; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NBTHelper; - -public class ItemFlightScroll extends ItemSoulBreathContainer implements IMeshProvider, IActivatable { - public static Map> floatMap = new HashMap>(); - public static Map heldEntityMap = new HashMap(); - public static Map heldEntityOffsetMap = new HashMap(); - - //TODO: A lot of this stuff could be moved to a toggle-able variant - public ItemFlightScroll() { - super(); - setTranslationKey(BloodMagic.MODID + ".icarusScroll"); - setCreativeTab(BloodMagic.TAB_BM); - } - - @Override - public boolean getActivated(ItemStack stack) { - return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED); - } - - @Override - public ItemStack setActivatedState(ItemStack stack, boolean activated) { - if (!stack.isEmpty()) { - NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated); - return stack; - } - - return stack; - } - - @Override - public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { - ItemStack stack = player.getHeldItem(hand); - - if (!world.isRemote) { - if (player.isSneaking()) { - if (!getActivated(stack)) { - double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { - setActivatedState(stack, true); - } - } else { - setActivatedState(stack, false); - } - } else { - //TODO: Add an effect where it "draws back" like a bow in order to cast Levitation on a mob. - //Only Levitated mobs can be grabbed. - } - } - - return super.onItemRightClick(world, player, hand); - } - - @Override - public boolean itemInteractionForEntity(ItemStack stack, PlayerEntity player, LivingEntity entity, Hand hand) { - if (entity.world.isRemote) { - return false; - } - - //TODO: Do check to see if the entity is levitating - will only "ensnare" a mob that is levitating. - - if (player.isSneaking()) { - //TODO: Release entity completely? - removeEntity(player, entity); - } else { - LivingEntity heldEntity = getHeldEntity(player); - if (heldEntity != null && heldEntity.equals(entity)) { - heldEntityMap.remove(player); - } else { - holdEntity(player, entity); //Hold the entity so you can place it around yourself where needed. - } - } - - return true; - } - - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { - if (!world.isRemote && entity instanceof ServerPlayerEntity && getActivated(stack)) { - if (entity.ticksExisted % 20 == 0) { - double drainNeeded = getBreathCostPerSecond(stack); - if (this.drainBreath(stack, drainNeeded, false) >= drainNeeded) { - this.drainBreath(stack, drainNeeded, true); - } else { - this.setActivatedState(stack, false); - } - } - - onEffectUpdate(stack, world, (PlayerEntity) entity, itemSlot, isSelected); - } - - if (!world.isRemote) { - if (entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - updateHeldEntityPosition(player); - if (floatMap.containsKey(player)) { - Map entityMap = floatMap.get(player); - if (entityMap == null) { - return; - } - - List removalList = new ArrayList(); - - for (Entry entry : entityMap.entrySet()) { - LivingEntity floatingEntity = entry.getKey(); - if (floatingEntity == null || floatingEntity.isDead || floatingEntity.dimension != player.dimension) { - removalList.add(floatingEntity); - } - - followOwner(player, floatingEntity, entry.getValue()); - } - - for (LivingEntity livingEntity : removalList) { - entityMap.remove(livingEntity); - } - - if (entityMap.isEmpty()) { - floatMap.remove(player); - } - - } - } - } - } - - public static boolean updateEntityOffset(PlayerEntity player, LivingEntity living, Vector3d updatedOffset) { - //TODO: Check if this entity is contained in another player's map to prevent weird things. - if (floatMap.containsKey(player)) { - Map entityMap = floatMap.get(player); - entityMap.put(living, updatedOffset); - return true; - } else { - Map entityMap = new HashMap(); - entityMap.put(living, updatedOffset); - floatMap.put(player, entityMap); - return true; - } - } - - @Nullable - public static LivingEntity getHeldEntity(PlayerEntity player) { - if (heldEntityMap.containsKey(player)) { - return heldEntityMap.get(player); - } - - return null; - } - - public static double getHeldEntityOffset(PlayerEntity player) { - if (heldEntityMap.containsKey(player)) { - return heldEntityOffsetMap.get(player); - } - - return 1; - } - - public static void holdEntity(PlayerEntity player, LivingEntity entityLiving) { - float distance = player.getDistance(entityLiving); - Vec3d lookVec = player.getLookVec(); - heldEntityMap.put(player, entityLiving); - heldEntityOffsetMap.put(player, (double) distance); - updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * distance, lookVec.y * distance, lookVec.z * distance)); - } - - public static void updateHeldEntityPosition(PlayerEntity player) { - LivingEntity entityLiving = getHeldEntity(player); - if (entityLiving != null) { - double offset = getHeldEntityOffset(player); - Vec3d lookVec = player.getLookVec(); - updateEntityOffset(player, entityLiving, new Vector3d(lookVec.x * offset, lookVec.y * offset, lookVec.z * offset)); - } - } - - public static void removeEntity(PlayerEntity player, LivingEntity living) { - if (living == null) { - return; - } - - if (floatMap.containsKey(player)) { - Map entityMap = floatMap.get(player); - if (entityMap.containsKey(living)) { - entityMap.remove(living); - } - - if (entityMap.isEmpty()) { - floatMap.remove(player); - } - } - } - - public void followOwner(PlayerEntity owner, LivingEntity livingEntity, Vector3d offset) { - double offsetX = offset.x; - double offsetY = offset.y; - double offsetZ = offset.z; - double ownerSpeed = Math.sqrt(owner.motionX * owner.motionX + owner.motionY * owner.motionY + owner.motionZ * owner.motionZ); -// double ownerSpeed = Math.sqrt((owner.posX - owner.prevPosX) * (owner.posX - owner.prevPosX) + (owner.posY - owner.prevPosY) * (owner.posY - owner.prevPosY) + (owner.posZ - owner.prevPosZ) * (owner.posZ - owner.prevPosZ)); - - double speed = Math.max(ownerSpeed * 20, 2); //May just want to call it a day and set this to "2" - - livingEntity.addPotionEffect(new EffectInstance(Effects.LEVITATION, 20, 0, false, true)); - - double wantedX = owner.posX + offsetX; - double wantedY = owner.posY + offsetY; - double wantedZ = owner.posZ + offsetZ; - - Vector3d vec = new Vector3d(wantedX - livingEntity.posX, wantedY - livingEntity.posY, wantedZ - livingEntity.posZ); - double vecDistance = Math.sqrt(vec.dot(vec)); - speed = Math.min(vecDistance, speed); - - vec.normalize(); - - if (speed <= 0.00001) { - return; - } - - livingEntity.setVelocity(vec.x * speed, vec.y * speed, vec.z * speed); - } - - public void onEffectUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) { - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FLIGHT, 2, 0)); - } - - @Override - public int getMaxBreath(ItemStack stack) { - return 20; - } - - public double getBreathCostPerSecond(ItemStack stack) { - return 0.01; - } - - @Override - @SideOnly(Side.CLIENT) - public ItemMeshDefinition getMeshDefinition() { - return new CustomMeshDefinitionActivatable("icarus_scroll"); - } - - @Override - public void gatherVariants(Consumer variants) { - variants.accept("active=false"); - variants.accept("active=true"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java deleted file mode 100644 index 47743536..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/soulBreath/ItemSoulBreathContainer.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.item.soulBreath; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import WayofTime.bloodmagic.soul.ISoulBreathContainer; -import WayofTime.bloodmagic.util.Constants; - -public abstract class ItemSoulBreathContainer extends Item implements ISoulBreathContainer { - @Override - public double getBreath(ItemStack stack) { - CompoundNBT tag = stack.getTagCompound(); - - return tag.getDouble(Constants.NBT.BREATH); - } - - @Override - public void setBreath(ItemStack stack, double amount) { - CompoundNBT tag = stack.getTagCompound(); - - tag.putDouble(Constants.NBT.BREATH, amount); - } - - @Override - public double drainBreath(ItemStack stack, double drainAmount, boolean doDrain) { - double breath = getBreath(stack); - - double breathDrained = Math.min(drainAmount, breath); - - if (doDrain) { - setBreath(stack, breath - breathDrained); - } - - return breathDrained; - } - - @Override - public double fillBreath(ItemStack stack, double fillAmount, boolean doFill) { - double current = this.getBreath(stack); - double maxBreath = this.getMaxBreath(stack); - - double filled = Math.min(fillAmount, maxBreath - current); - - if (doFill) { - this.setBreath(stack, filled + current); - } - - return filled; - } - - @Override - public boolean showDurabilityBar(ItemStack stack) { - return true; - } - - @Override - public double getDurabilityForDisplay(ItemStack stack) { - double maxWill = getMaxBreath(stack); - if (maxWill <= 0) { - return 1; - } - return 1.0 - (getBreath(stack) / maxWill); - } - -} diff --git a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java b/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java deleted file mode 100644 index 1539372c..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/types/AlchemicVialType.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.item.types; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public enum AlchemicVialType implements ISubItem { - BASE(0x2e35ff); - - final int potionColour; - - AlchemicVialType(int colour1) { - potionColour = colour1; - } - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.ALCHEMIC_VIAL, count, ordinal()); - } - - public int getColourForLayer(int layer) { - if (layer == 0) { - return potionColour; - } - return -1; - } - - public static int getColourForLayer(int variant, int layer) { - if (variant >= AlchemicVialType.values().length) { - return -1; - } - - return AlchemicVialType.values()[variant].getColourForLayer(layer); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java b/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java deleted file mode 100644 index c49aa09b..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/types/ComponentTypes.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.item.types; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public enum ComponentTypes implements ISubItem { - - REAGENT_WATER, - REAGENT_LAVA, - REAGENT_AIR, - REAGENT_FAST_MINER, - REAGENT_VOID, - REAGENT_GROWTH, - REAGENT_AFFINITY, - REAGENT_SIGHT, - REAGENT_BINDING, - REAGENT_SUPPRESSION, - FRAME_PART, - REAGENT_BLOOD_LIGHT, - REAGENT_MAGNETISM, - REAGENT_HASTE, - REAGENT_COMPRESSION, - REAGENT_BRIDGE, - REAGENT_SEVERANCE, - REAGENT_TELEPOSITION, - REAGENT_TRANSPOSITION, - SAND_IRON, - SAND_GOLD, - SAND_COAL, - PLANT_OIL, - SULFUR, - SALTPETER, - NEURO_TOXIN, - ANTISEPTIC, - REAGENT_HOLDING, - CATALYST_LENGTH_1, - CATALYST_POWER_1, - REAGENT_CLAW, - REAGENT_BOUNCE, - REAGENT_FROST, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack() { - return getStack(1); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.COMPONENT, count, ordinal()); - } -} - diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java b/src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java deleted file mode 100644 index 27204050..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/types/ISubItem.java +++ /dev/null @@ -1,19 +0,0 @@ -package WayofTime.bloodmagic.item.types; - -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; - -public interface ISubItem { - - @Nonnull - String getInternalName(); - - @Nonnull - default ItemStack getStack() { - return getStack(1); - } - - @Nonnull - ItemStack getStack(int count); -} diff --git a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java b/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java deleted file mode 100644 index d3edd6e3..00000000 --- a/src/main/java/WayofTime/bloodmagic/item/types/ShardType.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.item.types; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public enum ShardType implements ISubItem { - - WEAK, - DEMONIC, - ; - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, count, ordinal()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java deleted file mode 100644 index 414a920d..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/ILivingArmour.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.livingArmour; - -import com.google.common.collect.Multimap; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -/** - * An interface this is used purely for internal implementation. - * - * @author WayofTime - */ -public interface ILivingArmour { - Multimap getAttributeModifiers(); - - boolean canApplyUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); - - boolean upgradeArmour(PlayerEntity user, LivingArmourUpgrade upgrade); - - boolean removeUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); - - void notifyPlayerOfUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade); - - /** - * Ticks the upgrades and stat trackers, passing in the world and player as - * well as the LivingArmour - * - * @param world - The World - * @param player - The player wearing the Armour - */ - void onTick(World world, PlayerEntity player); - - void readFromNBT(CompoundNBT tag); - - void writeToNBT(CompoundNBT tag, boolean forceWrite); - - /** - * Writes the LivingArmour to the NBTTag. This will only write the trackers - * that are dirty. - * - * @param tag - The NBT tag to write to - */ - void writeDirtyToNBT(CompoundNBT tag); - - void writeToNBT(CompoundNBT tag); -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java deleted file mode 100644 index ac8474d6..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmour.java +++ /dev/null @@ -1,334 +0,0 @@ -package WayofTime.bloodmagic.livingArmour; - -import WayofTime.bloodmagic.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - -public class LivingArmour implements ILivingArmour { - public static String chatBase = "chat.bloodmagic.livingArmour."; - public HashMap trackerMap = new HashMap<>(); - public HashMap upgradeMap = new HashMap<>(); - - public int maxUpgradePoints = 100; - public int totalUpgradePoints = 0; - - public StatTracker getTracker(String key) { - return trackerMap.get(key); - } - - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - double total = 0; - for (Entry entry : upgradeMap.entrySet()) { - total += entry.getValue().getAdditionalDamageOnHit(damage, wearer, hitEntity, weapon); - } - - return total; - } - - public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - double total = 0; - for (Entry entry : upgradeMap.entrySet()) { - total += entry.getValue().getKnockbackOnHit(wearer, hitEntity, weapon); - } - - return total; - } - - public void recalculateUpgradePoints() { - totalUpgradePoints = 0; - for (LivingArmourUpgrade upgrade : upgradeMap.values()) { - totalUpgradePoints += upgrade.getCostOfUpgrade(); - } - } - - @Override - public Multimap getAttributeModifiers() { - HashMultimap modifierMap = HashMultimap.create(); - - for (Entry entry : upgradeMap.entrySet()) { - LivingArmourUpgrade upgrade = entry.getValue(); - if (upgrade == null) { - continue; - } - modifierMap.putAll(upgrade.getAttributeModifiers()); - } - - return modifierMap; - } - - @Override - public boolean upgradeArmour(PlayerEntity user, LivingArmourUpgrade upgrade) { - String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) { - //Check if this is a higher level than the previous upgrade - int nextLevel = upgrade.getUpgradeLevel(); - int currentLevel = upgradeMap.get(key).getUpgradeLevel(); - - if (nextLevel > currentLevel) { - int upgradePointDifference = upgrade.getCostOfUpgrade() - upgradeMap.get(key).getCostOfUpgrade(); - if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) { - upgradeMap.put(key, upgrade); - totalUpgradePoints += upgradePointDifference; - notifyPlayerOfUpgrade(user, upgrade); - for (StatTracker tracker : trackerMap.values()) { - tracker.onArmourUpgradeAdded(upgrade); - } - - return true; - } - } - } else { - int upgradePoints = upgrade.getCostOfUpgrade(); - if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) { - upgradeMap.put(key, upgrade); - totalUpgradePoints += upgradePoints; - notifyPlayerOfUpgrade(user, upgrade); - for (StatTracker tracker : trackerMap.values()) { - tracker.onArmourUpgradeAdded(upgrade); - } - - return true; - } - } - - return false; - } - - @Override - public boolean canApplyUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade) { - String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) { - //Check if this is a higher level than the previous upgrade - int nextLevel = upgrade.getUpgradeLevel(); - int currentLevel = upgradeMap.get(key).getUpgradeLevel(); - - if (nextLevel > currentLevel) { - int upgradePointDifference = upgrade.getCostOfUpgrade() - upgradeMap.get(key).getCostOfUpgrade(); - if (totalUpgradePoints + upgradePointDifference <= maxUpgradePoints) { - return true; - } - } - } else { - int upgradePoints = upgrade.getCostOfUpgrade(); - if (totalUpgradePoints + upgradePoints <= maxUpgradePoints) { - return true; - } - } - - return false; - } - - @Override - public void notifyPlayerOfUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade) { - user.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "newUpgrade")), true); - } - - /** - * Ticks the upgrades and stat trackers, passing in the world and player as - * well as the LivingArmour - * - * @param world - * @param player - */ - @Override - public void onTick(World world, PlayerEntity player) { - for (Entry entry : upgradeMap.entrySet()) { - LivingArmourUpgrade upgrade = entry.getValue(); - - if (upgrade == null) { - continue; - } - - if (!world.isRemote || upgrade.runOnClient()) { - upgrade.onTick(world, player, this); - } - } - - if (world.isRemote) { - return; - } - - List allowedUpgradesList = new ArrayList<>(); - for (ItemStack stack : player.inventory.mainInventory) { - if (stack != null && stack.getItem() instanceof IUpgradeTrainer) { - List keyList = ((IUpgradeTrainer) stack.getItem()).getTrainedUpgrades(stack); - if (!keyList.isEmpty()) { - allowedUpgradesList.addAll(keyList); - } - } - } - - for (Entry entry : trackerMap.entrySet()) { - StatTracker tracker = entry.getValue(); - - if (tracker == null) { - continue; - } - - if (!allowedUpgradesList.isEmpty()) { - boolean allowed = false; - - for (String key : allowedUpgradesList) { - if (tracker.providesUpgrade(key)) { - allowed = true; - break; - } - } - - if (!allowed) { - tracker.onDeactivatedTick(world, player, this); - continue; - } - } - - if (tracker.onTick(world, player, this)) { - List upgradeList = tracker.getUpgrades(); - - for (LivingArmourUpgrade upgrade : upgradeList) //TODO: make a getNextUpgrade? - { - upgradeArmour(player, upgrade); - } - } - - } - } - - @Override - public void readFromNBT(CompoundNBT tag) { - maxUpgradePoints = Math.max(100, tag.getInt("maxUpgradePoints")); - - ListNBT upgradeTags = tag.getList("upgrades", 10); - if (upgradeTags != null) { - for (int i = 0; i < upgradeTags.tagCount(); i++) { - CompoundNBT upgradeTag = upgradeTags.getCompound(i); - String key = upgradeTag.getString("key"); - int level = upgradeTag.getInt("level"); - CompoundNBT nbtTag = upgradeTag.getCompound("upgrade"); - LivingArmourUpgrade upgrade = LivingArmourHandler.generateUpgradeFromKey(key, level, nbtTag); - if (upgrade != null) { - upgradeMap.put(key, upgrade); - totalUpgradePoints += upgrade.getCostOfUpgrade(); - } - } - } - - for (Class clazz : LivingArmourHandler.trackers) { - try { - Constructor ctor = clazz.getConstructor(); - Object obj = ctor.newInstance(); - if (!(obj instanceof StatTracker)) { - // ????? - } - StatTracker tracker = (StatTracker) obj; - String key = tracker.getUniqueIdentifier(); - CompoundNBT trackerTag = tag.getCompound(key); - if (!trackerTag.isEmpty()) { - tracker.readFromNBT(trackerTag); - } - trackerMap.put(key, tracker); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - @Override - public void writeToNBT(CompoundNBT tag, boolean forceWrite) { - tag.putInt("maxUpgradePoints", maxUpgradePoints); - - ListNBT tags = new ListNBT(); - - for (Entry entry : upgradeMap.entrySet()) { - CompoundNBT upgradeTag = new CompoundNBT(); - - LivingArmourUpgrade upgrade = entry.getValue(); - CompoundNBT nbtTag = new CompoundNBT(); - upgrade.writeToNBT(nbtTag); - - upgradeTag.putString("key", upgrade.getUniqueIdentifier()); - upgradeTag.putInt("level", upgrade.getUpgradeLevel()); - upgradeTag.put("upgrade", nbtTag); - - tags.appendTag(upgradeTag); - } - - tag.put("upgrades", tags); - - for (Entry entry : trackerMap.entrySet()) { - StatTracker tracker = entry.getValue(); - - if (tracker == null) { - continue; - } - - String key = tracker.getUniqueIdentifier(); - - if (forceWrite || tracker.isDirty()) { - CompoundNBT trackerTag = new CompoundNBT(); - tracker.writeToNBT(trackerTag); - - tag.put(key, trackerTag); - - tracker.resetDirty(); - } - } - } - - /** - * Writes the LivingArmour to the NBTTag. This will only write the trackers - * that are dirty. - * - * @param tag - */ - @Override - public void writeDirtyToNBT(CompoundNBT tag) { - writeToNBT(tag, false); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - writeToNBT(tag, true); - } - - @Override - public boolean removeUpgrade(PlayerEntity user, LivingArmourUpgrade upgrade) { - String key = upgrade.getUniqueIdentifier(); - if (upgradeMap.containsKey(key)) { - upgradeMap.remove(key); - - return true; - } - - return false; - } - - public static boolean hasFullSet(PlayerEntity player) { - for (EquipmentSlotType slot : EquipmentSlotType.values()) { - if (slot.getSlotType() != EquipmentSlotType.Type.ARMOR) { - continue; - } - ItemStack slotStack = player.getItemStackFromSlot(slot); - if (slotStack.isEmpty() || !(slotStack.getItem() instanceof ItemLivingArmour)) - return false; - } - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java deleted file mode 100644 index 6fbb06ca..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.livingArmour; - -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.nbt.CompoundNBT; - -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class LivingArmourHandler { - public static List> trackers = new ArrayList<>(); - public static HashMap> upgradeMap = new HashMap<>(); - public static HashMap> upgradeConstructorMap = new HashMap<>(); - public static HashMap upgradeMaxLevelMap = new HashMap<>(); - - public static void registerStatTracker(Class tracker) { - trackers.add(tracker); - } - - /** - * Registers a LivingArmourUpgrade using its unique identifier and class. - * This is done to more easily load upgrades - * - * @param upgrade - */ - public static void registerArmourUpgrade(LivingArmourUpgrade upgrade) { - Class clazz = upgrade.getClass(); - upgradeMap.put(upgrade.getUniqueIdentifier(), clazz); - upgradeMaxLevelMap.put(upgrade.getUniqueIdentifier(), upgrade.getMaxTier()); - try { - Constructor ctor = clazz.getConstructor(int.class); - if (ctor == null) { - BMLog.DEFAULT.error("Error adding living armour upgrade {} as it doesn't have a valid constructor.", upgrade.getUniqueIdentifier()); - } else { - upgradeConstructorMap.put(upgrade.getUniqueIdentifier(), ctor); - } - } catch (Exception e) { - e.printStackTrace(); - } - - } - - public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level) { - return generateUpgradeFromKey(key, level, null); - } - - public static LivingArmourUpgrade generateUpgradeFromKey(String key, int level, CompoundNBT tag) { - Constructor ctor = upgradeConstructorMap.get(key); - if (ctor != null) { - try { - LivingArmourUpgrade upgrade = ctor.newInstance(level); - if (upgrade != null && tag != null) { - upgrade.readFromNBT(tag); - } - return upgrade; - } catch (Exception e) { - e.printStackTrace(); - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java b/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java deleted file mode 100644 index 46a13263..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/LivingArmourUpgrade.java +++ /dev/null @@ -1,90 +0,0 @@ -package WayofTime.bloodmagic.livingArmour; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public abstract class LivingArmourUpgrade { - public static String chatBase = "chat.bloodmagic.livingArmour.upgrade."; - public static String tooltipBase = "tooltip.bloodmagic.livingArmour.upgrade."; - - /** - * Upgrade level 0 is the first upgrade. Upgrade goes from 0 to getMaxTier() - * - 1. - */ - protected int level = 0; - - /** - * The LivingArmourUpgrade must have a constructor that has a single integer - * parameter. Upgrades may have other constructors, but must have one of - * these. - * - * @param level The level of the upgrade - */ - public LivingArmourUpgrade(int level) { - this.level = Math.min(level, getMaxTier() - 1); - } - - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - return 0; - } - - public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - return 0; - } - - /** - * Percentage of damage blocked. This stacks multiplicities with other - * upgrades. - * - * @return 0 for no damage blocked, 1 for full damage blocked - */ - public double getArmourProtection(LivingEntity wearer, DamageSource source) { - return 0; - } - - public int getUpgradeLevel() { - return this.level; - } - - public abstract String getUniqueIdentifier(); - - public abstract String getTranslationKey(); - - public abstract int getMaxTier(); - - public abstract int getCostOfUpgrade(); - - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - } - - public Multimap getAttributeModifiers() { - return HashMultimap.create(); - } - - public double getMiningSpeedModifier(PlayerEntity player) { - return 1; - } - - public abstract void writeToNBT(CompoundNBT tag); - - public abstract void readFromNBT(CompoundNBT tag); - - public int getRunicShielding() { - return 0; - } - - public boolean runOnClient() { - return false; - } - - public boolean isDowngrade() { - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java b/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java deleted file mode 100644 index 02f5f971..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/StatTracker.java +++ /dev/null @@ -1,66 +0,0 @@ -package WayofTime.bloodmagic.livingArmour; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.List; - -public abstract class StatTracker { - private boolean isDirty = false; - - public abstract String getUniqueIdentifier(); - - /** - * When called the StatTracker should reset all of its data, including - * upgrades. - */ - public abstract void resetTracker(); - - public abstract void readFromNBT(CompoundNBT tag); - - public abstract void writeToNBT(CompoundNBT tag); - - /** - * Called each tick to update the tracker's information. Called in - * LivingArmour - * - * @param world World the player is in - * @param player The player that has the armour equipped - * @param livingArmour The equipped LivingArmour - * @return True if there is a new upgrade unlocked this tick. - */ - public abstract boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour); - - public abstract void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour); - - public abstract List getUpgrades(); - - /** - * Used to obtain the progress from the current level to the next level. - *

- * 0.0 being 0% - 1.0 being 100%. - * - * @param livingArmour The equipped LivingArmour - * @return the progress from the current level to the next level. - */ - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return 1.0D; - } - - public final boolean isDirty() { - return isDirty; - } - - public final void markDirty() { - this.isDirty = true; - } - - public final void resetDirty() { - this.isDirty = false; - } - - public abstract boolean providesUpgrade(String key); - - public abstract void onArmourUpgradeAdded(LivingArmourUpgrade upgrade); -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java deleted file mode 100644 index 868b5b27..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeBattleHungry.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeBattleHungry extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -20, -35, -50, -75}; - public static final float[] exhaustionAdded = new float[]{0.02f, 0.04f, 0.06f, 0.08f, 0.1f}; - public static final int[] delay = new int[]{600, 600, 600, 500, 400}; - - public int timer = 0; - - public LivingArmourUpgradeBattleHungry(int level) { - super(level); - } - - public void resetTimer() { - this.timer = delay[this.level]; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (timer > 0) { - timer--; - return; - } - - if (player.ticksExisted % 20 == 0) { - player.addExhaustion(exhaustionAdded[this.level]); //TODO: Change exhaustion added per level. - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.battleHunger"; - } - - @Override - public int getMaxTier() { - return 5; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt("timer", timer); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - timer = tag.getInt("timer"); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "battleHunger"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java deleted file mode 100644 index 8a01bc0b..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeCrippledArm.java +++ /dev/null @@ -1,54 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeCrippledArm extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-150}; - - public LivingArmourUpgradeCrippledArm(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.crippledArm"; - } - - @Override - public int getMaxTier() { - return 1; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "crippledArm"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java deleted file mode 100644 index e3b250e3..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDigSlowdown.java +++ /dev/null @@ -1,65 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.HashMap; - -public class LivingArmourUpgradeDigSlowdown extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -17, -28, -42, -60, -80, -100, -125, -160, -200}; - public static final double[] digSpeedModifier = new double[]{0.9, 0.8, 0.7, 0.6, 0.55, 0.5, 0.4, 0.35, 0.3, 0.2}; - public static HashMap changeMap = new HashMap<>(); - - public LivingArmourUpgradeDigSlowdown(int level) { - super(level); - } - - @Override - public double getMiningSpeedModifier(PlayerEntity player) { - return digSpeedModifier[this.level]; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.digSlowdown"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "digSlowdown"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java deleted file mode 100644 index 1c8fe54d..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeDisoriented.java +++ /dev/null @@ -1,63 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeDisoriented extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -20, -30, -40, -70, -80, -100, -140, -180, -220}; - public static final double[] chance = new double[]{0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.008, 0.010, 0.012, 0.014}; - - public LivingArmourUpgradeDisoriented(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (world.isRemote && player.ticksExisted % 20 == 0 && world.rand.nextDouble() <= chance[this.level]) { - player.rotationYaw = world.rand.nextFloat() * 360; - player.rotationPitch = world.rand.nextFloat() * 180 - 90; - } - } - - @Override - public boolean runOnClient() { - return true; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.disoriented"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "disoriented"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java deleted file mode 100644 index cbccbfde..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeMeleeDecrease.java +++ /dev/null @@ -1,74 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; - -public class LivingArmourUpgradeMeleeDecrease extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -17, -28, -42, -60, -80, -100, -125, -160, -200}; - public static final double[] meleeDamage = new double[]{-0.1, -0.2, -0.25, -0.3, -0.35, -0.4, -0.5, -0.6, -0.7, -0.8}; - - public LivingArmourUpgradeMeleeDecrease(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - - String name = getUniqueIdentifier() + "-DamageModifier1"; - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "DamageModifier1", meleeDamage[this.level], 1)); - - return modifierMap; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.meleeDecrease"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "meleeDecrease"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java deleted file mode 100644 index edf6dc1c..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeQuenched.java +++ /dev/null @@ -1,54 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeQuenched extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-100}; - - public LivingArmourUpgradeQuenched(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.quenched"; - } - - @Override - public int getMaxTier() { - return 1; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "quenched"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java deleted file mode 100644 index 3d694dbf..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlippery.java +++ /dev/null @@ -1,91 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class LivingArmourUpgradeSlippery extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-50}; - public static final int[] slipperyDuration = new int[]{30 * 20}; - - public LivingArmourUpgradeSlippery(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (world.isRemote && player.onGround) { -// if (player.moveForward == 0) - { - - float f6 = 0.91F; - BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain(player.posX, player.getEntityBoundingBox().minY - 1.0D, player.posZ); - - if (player.onGround) { - f6 = world.getBlockState(blockpos$pooledmutableblockpos).getBlock().slipperiness * 0.91F; - } - - player.motionX /= f6 / 0.91; - player.motionZ /= f6 / 0.91; - - float f7 = 0.16277136F / (f6 * f6 * f6); - float f8; - - if (player.onGround) { - f8 = player.getAIMoveSpeed() * f7; - } else { - f8 = player.jumpMovementFactor; - } - - player.moveRelative(-player.moveStrafing, -player.moveForward, f8, 0.02F); - - player.moveRelative(player.moveStrafing, player.moveForward, f8 / 10, 0.02F); - - player.motionX *= 0.90; - player.motionY *= 0.90; - } - } - } - - @Override - public boolean runOnClient() { - return true; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.slippery"; - } - - @Override - public int getMaxTier() { - return 1; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "slippery"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java deleted file mode 100644 index ac3fb774..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowHeal.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeSlowHeal extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -17, -28, -42, -60, -80, -100, -125, -160, -200}; - - public static final double[] healModifier = new double[]{0.9, 0.8, 0.7, 0.6, 0.55, 0.5, 0.4, 0.35, 0.3, 0.2}; - - public LivingArmourUpgradeSlowHeal(int level) { - super(level); - } - - public double getHealingModifier() { - return healModifier[this.level]; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.slowHeal"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "slowHeal"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java deleted file mode 100644 index 75d40db8..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeSlowness.java +++ /dev/null @@ -1,72 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; - -public class LivingArmourUpgradeSlowness extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -17, -23, -35, -48, -60, -80, -110, -160, -200}; - public static final double[] speedModifier = new double[]{-0.1, -0.2, -0.3, -0.4, -0.45, -0.5, -0.55, -0.6, -0.65, -0.7}; - - public LivingArmourUpgradeSlowness(int level) { - super(level); - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - - String name = getUniqueIdentifier() + "-SpeedModifier1"; - modifierMap.put(SharedMonsterAttributes.MOVEMENT_SPEED.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "SpeedModifier1", speedModifier[this.level], 1)); - - return modifierMap; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.slowness"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "slowness"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java b/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java deleted file mode 100644 index 464c408b..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/downgrade/LivingArmourUpgradeStormTrooper.java +++ /dev/null @@ -1,59 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.downgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeStormTrooper extends LivingArmourUpgrade { - public static final int[] costs = new int[]{-10, -25, -40, -65, -90}; - public static final float[] inaccuracy = new float[]{0.04f, 0.08f, 0.12f, 0.16f, 0.2f}; - - public LivingArmourUpgradeStormTrooper(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - public float getArrowJiggle(PlayerEntity player) { - return inaccuracy[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.stormTrooper"; - } - - @Override - public int getMaxTier() { - return 5; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - } - - @Override - public void readFromNBT(CompoundNBT tag) { - } - - @Override - public String getTranslationKey() { - return tooltipBase + "stormTrooper"; - } - - @Override - public boolean isDowngrade() { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java deleted file mode 100644 index 66aa6b7d..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowProtect.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowProtect; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerArrowProtect extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{30, 200, 400, 800, 1500, 2500, 3500, 5000, 7000, 15000}; - public int totalDamage = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.arrowProtect"; - } - - @Override - public void resetTracker() { - this.totalDamage = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.arrowProtect"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.arrowProtect", totalDamage); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamage += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalDamage >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeArrowProtect(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.arrowProtect"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeArrowProtect) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamage = Math.max(totalDamage, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java deleted file mode 100644 index fb9c3932..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerArrowShot.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeArrowShot; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerArrowShot extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] shotsRequired = new int[]{50, 200, 700, 1500, 3000}; - public int totalShots = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.trickShot"; - } - - @Override - public void resetTracker() { - this.totalShots = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalShots = tag.getInt(BloodMagic.MODID + ".tracker.trickShot"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.trickShot", totalShots); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalShots += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalShots >= shotsRequired[i]) { - upgradeList.add(new LivingArmourUpgradeArrowShot(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalShots, shotsRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.arrowShot"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeArrowShot) { - int level = upgrade.getUpgradeLevel(); - if (level < shotsRequired.length) { - totalShots = Math.max(totalShots, shotsRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java deleted file mode 100644 index 2d5f2e23..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerCriticalStrike.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeCriticalStrike; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerCriticalStrike extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800}; - public double totalDamageDealt = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.criticalStrike"; - } - - @Override - public void resetTracker() { - this.totalDamageDealt = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.criticalStrike"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.criticalStrike", totalDamageDealt); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamageDealt += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalDamageDealt >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeCriticalStrike(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.criticalStrike"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeCriticalStrike) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamageDealt = Math.max(totalDamageDealt, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java deleted file mode 100644 index fe324590..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerDigging.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerDigging extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] blocksRequired = new int[]{128, 512, 1024, 2048, 8192, 16000, 32000, 50000, 80000, 150000}; - public int totalBlocksDug = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.digging"; - } - - @Override - public void resetTracker() { - this.totalBlocksDug = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalBlocksDug = tag.getInt(BloodMagic.MODID + ".tracker.digging"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.digging", totalBlocksDug); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalBlocksDug += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalBlocksDug >= blocksRequired[i]) { - upgradeList.add(new LivingArmourUpgradeDigging(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalBlocksDug, blocksRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.digging"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeDigging) { - int level = upgrade.getUpgradeLevel(); - if (level < blocksRequired.length) { - totalBlocksDug = Math.max(totalBlocksDug, blocksRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java deleted file mode 100644 index 6e334002..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerExperience.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerExperience extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] experienceRequired = new int[]{100, 400, 1000, 1600, 3200, 5000, 7000, 9200, 11500, 140000}; - public double totalExperienceGained = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.experienced"; - } - - @Override - public void resetTracker() { - this.totalExperienceGained = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalExperienceGained = tag.getDouble(BloodMagic.MODID + ".tracker.experienced"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.experienced", totalExperienceGained); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalExperienceGained += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalExperienceGained >= experienceRequired[i]) { - upgradeList.add(new LivingArmourUpgradeExperience(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalExperienceGained, experienceRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.experienced"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeExperience) { - int level = upgrade.getUpgradeLevel(); - if (level < experienceRequired.length) { - totalExperienceGained = Math.max(totalExperienceGained, experienceRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, int exp) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + exp : exp); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java deleted file mode 100644 index f40aaad7..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFallProtect.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFallProtect; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerFallProtect extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{30, 200, 400, 800, 1500}; - public int totalDamage = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.fallProtect"; - } - - @Override - public void resetTracker() { - this.totalDamage = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.fallProtect"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.fallProtect", totalDamage); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamage += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalDamage >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeFallProtect(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.fallProtect"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeFallProtect) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamage = Math.max(totalDamage, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java deleted file mode 100644 index becc5329..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFireResist.java +++ /dev/null @@ -1,89 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeFireResist; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class StatTrackerFireResist extends StatTracker { - public static int[] fireTicksRequired = new int[]{60 * 20, 3 * 60 * 20, 10 * 60 * 20, 20 * 60 * 20, 25 * 60 * 20}; - public int totalFireTicks = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.fire"; - } - - @Override - public void resetTracker() { - this.totalFireTicks = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalFireTicks = tag.getInt(BloodMagic.MODID + ".tracker.fire"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.fire", totalFireTicks); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (player.isBurning()) { - totalFireTicks++; - this.markDirty(); - return true; - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalFireTicks >= fireTicksRequired[i]) { - upgradeList.add(new LivingArmourUpgradeFireResist(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalFireTicks, fireTicksRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.fireResist"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeFireResist) { - int level = upgrade.getUpgradeLevel(); - if (level < fireTicksRequired.length) { - totalFireTicks = Math.max(totalFireTicks, fireTicksRequired[level]); - this.markDirty(); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java deleted file mode 100644 index 06a2bd42..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerFood.java +++ /dev/null @@ -1,108 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeKnockbackResist; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class StatTrackerFood extends StatTracker { - public static Map lastFoodEatenMap = new HashMap<>(); - - public static int[] foodRequired = new int[]{100, 200, 300, 500, 1000}; - - public int foodEaten = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.foodEaten"; - } - - @Override - public void resetTracker() { - this.foodEaten = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - foodEaten = tag.getInt(BloodMagic.MODID + ".tracker.foodEaten"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.foodEaten", foodEaten); - - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (!lastFoodEatenMap.containsKey(player)) { - lastFoodEatenMap.put(player, 20); - return false; - } - - int currentFood = player.getFoodStats().getFoodLevel(); - int prevFood = lastFoodEatenMap.get(player); - lastFoodEatenMap.put(player, currentFood); - - if (currentFood > prevFood) { - foodEaten += (currentFood - prevFood); - - markDirty(); - - return true; - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (lastFoodEatenMap.containsKey(player)) { - lastFoodEatenMap.remove(player); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < foodRequired.length; i++) { - if (foodEaten >= foodRequired[i]) { - upgradeList.add(new LivingArmourUpgradeKnockbackResist(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(foodEaten, foodRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.knockback"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeKnockbackResist) { - int level = upgrade.getUpgradeLevel(); - if (level < foodRequired.length) { - foodEaten = Math.max(foodEaten, foodRequired[level]); - this.markDirty(); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java deleted file mode 100644 index 465d68a2..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGraveDigger.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGraveDigger; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerGraveDigger extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800, 5000, 7000, 9200, 11500, 140000}; - public double totalDamageDealt = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.graveDigger"; - } - - @Override - public void resetTracker() { - this.totalDamageDealt = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.graveDigger"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.graveDigger", totalDamageDealt); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamageDealt += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalDamageDealt >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeGraveDigger(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.graveDigger"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeGraveDigger) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamageDealt = Math.max(totalDamageDealt, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java deleted file mode 100644 index 9fb78303..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerGrimReaperSprint.java +++ /dev/null @@ -1,111 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeGrimReaperSprint; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerGrimReaperSprint extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] deathsRequired = new int[]{6, 10, 15, 25, 50, 70, 90, 120, 150, 200}; //TODO: Modify - public int totalDeaths = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.grimReaper"; - } - - @Override - public void resetTracker() { - this.totalDeaths = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDeaths = tag.getInt(BloodMagic.MODID + ".tracker.grimReaper"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.grimReaper", totalDeaths); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDeaths += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return true; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalDeaths >= deathsRequired[i]) { - upgradeList.add(new LivingArmourUpgradeGrimReaperSprint(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDeaths, deathsRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.grimReaper"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint) { - int level = upgrade.getUpgradeLevel(); - if (level < deathsRequired.length) { - totalDeaths = Math.max(totalDeaths, deathsRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour) { - StatTracker tracker = armour.getTracker(BloodMagic.MODID + ".tracker.grimReaper"); - if (tracker instanceof StatTrackerGrimReaperSprint) { - ((StatTrackerGrimReaperSprint) tracker).totalDeaths++; - BMLog.DEBUG.info(String.valueOf(((StatTrackerGrimReaperSprint) tracker).totalDeaths)); - tracker.markDirty(); - } -// changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java deleted file mode 100644 index 04efda5f..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerHealthboost.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeHealthboost; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerHealthboost extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] healthedRequired = new int[]{80, 200, 340, 540, 800, 1600, 2800, 5000, 7600, 10000}; - public double totalHealthGenned = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.health"; - } - - @Override - public void resetTracker() { - this.totalHealthGenned = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.health"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.health", totalHealthGenned); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalHealthGenned += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalHealthGenned >= healthedRequired[i]) { - upgradeList.add(new LivingArmourUpgradeHealthboost(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalHealthGenned, healthedRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.health"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeHealthboost) { - int level = upgrade.getUpgradeLevel(); - if (level < healthedRequired.length) { - totalHealthGenned = Math.max(totalHealthGenned, healthedRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double health) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + health : health); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java deleted file mode 100644 index 155c8b70..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerJump.java +++ /dev/null @@ -1,106 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeJump; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerJump extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] jumpsRequired = new int[]{30, 200, 400, 700, 1100, 1500, 2000, 2800, 3600, 5000}; //testing - - public int totalJumps = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.jump"; - } - - @Override - public void resetTracker() { - this.totalJumps = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalJumps = tag.getInt(BloodMagic.MODID + ".tracker.jump"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.jump", totalJumps); - - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalJumps += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalJumps >= jumpsRequired[i]) { - upgradeList.add(new LivingArmourUpgradeJump(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalJumps, jumpsRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.jump"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeJump) { - int level = upgrade.getUpgradeLevel(); - if (level < jumpsRequired.length) { - totalJumps = Math.max(totalJumps, jumpsRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + 1 : 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java deleted file mode 100644 index 54aafd31..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMeleeDamage.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeMeleeDamage; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerMeleeDamage extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800, 5000, 7000, 9200, 11500, 140000}; - public double totalDamageDealt = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.meleeDamage"; - } - - @Override - public void resetTracker() { - this.totalDamageDealt = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.meleeDamage"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.meleeDamage", totalDamageDealt); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamageDealt += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalDamageDealt >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeMeleeDamage(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.meleeDamage"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeMeleeDamage) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamageDealt = Math.max(totalDamageDealt, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java deleted file mode 100644 index ab355dbd..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerMovement.java +++ /dev/null @@ -1,116 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSpeed; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class StatTrackerMovement extends StatTracker { - public static Map lastPosX = new HashMap<>(); - public static Map lastPosZ = new HashMap<>(); - - public static int[] blocksRequired = new int[]{200, 1000, 2000, 4000, 7000, 15000, 25000, 35000, 50000, 70000}; - - public double totalMovement = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.movement"; - } - - @Override - public void resetTracker() { - this.totalMovement = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.movement"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.movement", totalMovement); - - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (!lastPosX.containsKey(player)) { - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - return false; - } - - if (!player.onGround) { - return false; - } - - double distanceTravelled = Math.sqrt(Math.pow(lastPosX.get(player) - player.posX, 2) + Math.pow(lastPosZ.get(player) - player.posZ, 2)); - - if (distanceTravelled > 0.0001 && distanceTravelled < 2) { - totalMovement += distanceTravelled; - - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - - markDirty(); - - return true; - } - - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalMovement >= blocksRequired[i]) { - upgradeList.add(new LivingArmourUpgradeSpeed(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalMovement, blocksRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.movement"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeSpeed) { - int level = upgrade.getUpgradeLevel(); - if (level < blocksRequired.length) { - totalMovement = Math.max(totalMovement, blocksRequired[level]); - this.markDirty(); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java deleted file mode 100644 index 85978584..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerNightSight.java +++ /dev/null @@ -1,124 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeNightSight; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerNightSight extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{0, 200, 800, 1300, 2500, 3800, 5000, 7000, 9200, 11500}; - public static int neededNightVision = 3 * 60 * 20; - public double totalDamageDealt = 0; - public int totalNightVision = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.nightSight"; - } - - @Override - public void resetTracker() { - this.totalDamageDealt = 0; - this.totalNightVision = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.nightSight"); - totalNightVision = tag.getInt(BloodMagic.MODID + ".tracker.nightSightVision"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.nightSight", totalDamageDealt); - tag.putInt(BloodMagic.MODID + ".tracker.nightSightVision", totalNightVision); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - boolean test = false; - - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamageDealt += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - test = true; - } - } - - if (world.getLight(player.getPosition()) <= 9 && player.isPotionActive(Effects.NIGHT_VISION)) { - totalNightVision++; - test = true; - } - - if (test) { - this.markDirty(); - } - - return test; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - if (totalNightVision < neededNightVision) { - return upgradeList; - } - - for (int i = 0; i < 10; i++) { - if (totalDamageDealt >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeNightSight(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.nightSight"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeNightSight) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamageDealt = Math.max(totalDamageDealt, damageRequired[level]); - totalNightVision = neededNightVision; - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java deleted file mode 100644 index 2cf5da7d..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPhysicalProtect.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePhysicalProtect; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerPhysicalProtect extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{30, 50, 80, 140, 200, 300, 400, 500, 650, 800}; - public int totalDamage = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.physicalProtect"; - } - - @Override - public void resetTracker() { - this.totalDamage = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getInt(BloodMagic.MODID + ".tracker.physicalProtect"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.physicalProtect", totalDamage); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamage += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalDamage >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradePhysicalProtect(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.physicalProtect"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradePhysicalProtect) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamage = Math.max(totalDamage, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java deleted file mode 100644 index 56d4b125..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerPoison.java +++ /dev/null @@ -1,90 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradePoisonResist; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; - -public class StatTrackerPoison extends StatTracker { - public static int[] poisonTicksRequired = new int[]{60 * 20, 3 * 60 * 20, 10 * 60 * 20, 20 * 60 * 20, 25 * 60 * 20}; - public int totalPoisonTicks = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.poison"; - } - - @Override - public void resetTracker() { - this.totalPoisonTicks = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalPoisonTicks = tag.getInt(BloodMagic.MODID + ".tracker.poison"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.poison", totalPoisonTicks); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (player.isPotionActive(Effects.POISON)) { - totalPoisonTicks++; - this.markDirty(); - return true; - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalPoisonTicks >= poisonTicksRequired[i]) { - upgradeList.add(new LivingArmourUpgradePoisonResist(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalPoisonTicks, poisonTicksRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.poisonResist"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradePoisonResist) { - int level = upgrade.getUpgradeLevel(); - if (level < poisonTicksRequired.length) { - totalPoisonTicks = Math.max(totalPoisonTicks, poisonTicksRequired[level]); - this.markDirty(); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java deleted file mode 100644 index 4ab0bb17..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerRepairing.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeRepairing; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerRepairing extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{500}; - public double totalDamage = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.repair"; - } - - @Override - public void resetTracker() { - this.totalDamage = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamage = tag.getDouble(BloodMagic.MODID + ".tracker.repair"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.repair", totalDamage); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamage += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 1; i++) { - if (totalDamage >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeRepairing(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamage, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.repair"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeRepairing) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamage = Math.max(totalDamage, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, int receivedDamage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + receivedDamage : receivedDamage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java deleted file mode 100644 index 06712f6c..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSelfSacrifice.java +++ /dev/null @@ -1,106 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerSelfSacrifice extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] sacrificesRequired = new int[]{30, 200, 400, 700, 1100, 1500, 2000, 2800, 3600, 5000}; //testing - - public int totalSacrifices = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.selfSacrifice"; - } - - @Override - public void resetTracker() { - this.totalSacrifices = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalSacrifices = tag.getInt(BloodMagic.MODID + ".tracker.selfSacrifice"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.selfSacrifice", totalSacrifices); - - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - int change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalSacrifices += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalSacrifices >= sacrificesRequired[i]) { - upgradeList.add(new LivingArmourUpgradeSelfSacrifice(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalSacrifices, sacrificesRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.selfSacrifice"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { - int level = upgrade.getUpgradeLevel(); - if (level < sacrificesRequired.length) { - totalSacrifices = Math.max(totalSacrifices, sacrificesRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, int hearts) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + hearts : hearts); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java deleted file mode 100644 index 6e738b1a..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSolarPowered.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSolarPowered; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerSolarPowered extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] healthedRequired = new int[]{70, 150, 300, 500, 700, 1400, 2400, 4000, 7000, 9000}; - public double totalHealthGenned = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.solarPowered"; - } - - @Override - public void resetTracker() { - this.totalHealthGenned = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalHealthGenned = tag.getDouble(BloodMagic.MODID + ".tracker.solarPowered"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.solarPowered", totalHealthGenned); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalHealthGenned += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - if (totalHealthGenned >= healthedRequired[i]) { - upgradeList.add(new LivingArmourUpgradeSolarPowered(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalHealthGenned, healthedRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.solarPowered"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeSolarPowered) { - int level = upgrade.getUpgradeLevel(); - if (level < healthedRequired.length) { - totalHealthGenned = Math.max(totalHealthGenned, healthedRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double health) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + health : health); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java deleted file mode 100644 index 3ab852ed..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerSprintAttack.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSprintAttack; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class StatTrackerSprintAttack extends StatTracker { - public static HashMap changeMap = new HashMap<>(); - public static int[] damageRequired = new int[]{200, 800, 1300, 2500, 3800}; - public double totalDamageDealt = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.sprintAttack"; - } - - @Override - public void resetTracker() { - this.totalDamageDealt = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalDamageDealt = tag.getDouble(BloodMagic.MODID + ".tracker.sprintAttack"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.sprintAttack", totalDamageDealt); - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - double change = Math.abs(changeMap.get(livingArmour)); - if (change > 0) { - totalDamageDealt += Math.abs(changeMap.get(livingArmour)); - - changeMap.put(livingArmour, 0d); - - this.markDirty(); - - return true; - } - } - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour)) { - changeMap.remove(livingArmour); - } - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - for (int i = 0; i < 5; i++) { - if (totalDamageDealt >= damageRequired[i]) { - upgradeList.add(new LivingArmourUpgradeSprintAttack(i)); - } - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - return Utils.calculateStandardProgress(totalDamageDealt, damageRequired, currentLevel); - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.sprintAttack"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeSprintAttack) { - int level = upgrade.getUpgradeLevel(); - if (level < damageRequired.length) { - totalDamageDealt = Math.max(totalDamageDealt, damageRequired[level]); - this.markDirty(); - } - } - } - - public static void incrementCounter(LivingArmour armour, double damage) { - changeMap.put(armour, changeMap.containsKey(armour) ? changeMap.get(armour) + damage : damage); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java deleted file mode 100644 index 5a55d555..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/tracker/StatTrackerStepAssist.java +++ /dev/null @@ -1,114 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.tracker; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeStepAssist; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class StatTrackerStepAssist extends StatTracker { - public static Map lastPosX = new HashMap<>(); - public static Map lastPosZ = new HashMap<>(); - - public static int blocksRequired = 1000; - - public double totalMovement = 0; - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".tracker.stepAssist"; - } - - @Override - public void resetTracker() { - this.totalMovement = 0; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - totalMovement = tag.getDouble(BloodMagic.MODID + ".tracker.stepAssist"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putDouble(BloodMagic.MODID + ".tracker.stepAssist", totalMovement); - - } - - @Override - public boolean onTick(World world, PlayerEntity player, LivingArmour livingArmour) { - if (!lastPosX.containsKey(player)) { - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - return false; - } - - if (!player.onGround || player.stepHeight < 1) { - return false; - } - - double distanceTravelled = Math.sqrt(Math.pow(lastPosX.get(player) - player.posX, 2) + Math.pow(lastPosZ.get(player) - player.posZ, 2)); - - if (distanceTravelled > 0.0001 && distanceTravelled < 2) { - double previousMovement = totalMovement; - totalMovement += distanceTravelled; - - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - - markDirty(); - - return previousMovement < blocksRequired && totalMovement >= blocksRequired; - } - - lastPosX.put(player, player.posX); - lastPosZ.put(player, player.posZ); - - return false; - } - - @Override - public void onDeactivatedTick(World world, PlayerEntity player, LivingArmour livingArmour) { - - } - - @Override - public List getUpgrades() { - List upgradeList = new ArrayList<>(); - - if (totalMovement >= blocksRequired) { - upgradeList.add(new LivingArmourUpgradeStepAssist(0)); - } - - return upgradeList; - } - - @Override - public double getProgress(LivingArmour livingArmour, int currentLevel) { - if (currentLevel == 1) - return 1.0D; - - return totalMovement / (double) blocksRequired; - } - - @Override - public boolean providesUpgrade(String key) { - return key.equals(BloodMagic.MODID + ".upgrade.stepAssist"); - } - - @Override - public void onArmourUpgradeAdded(LivingArmourUpgrade upgrade) { - if (upgrade instanceof LivingArmourUpgradeStepAssist) { - totalMovement = Math.max(totalMovement, blocksRequired); - this.markDirty(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java deleted file mode 100644 index 994091cc..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowProtect.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; - -public class LivingArmourUpgradeArrowProtect extends LivingArmourUpgrade { - public static final int[] costs = new int[]{4, 9, 16, 30, 60, 90, 125, 165, 210, 250}; - public static final double[] protectionLevel = new double[]{0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.75, 0.77, 0.80, 0.83}; - - public LivingArmourUpgradeArrowProtect(int level) { - super(level); - } - - @Override - public double getArmourProtection(LivingEntity wearer, DamageSource source) { - if (source.isProjectile()) { - return protectionLevel[this.level]; - } - - return 0; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.arrowProtect"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "arrowProtect"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java deleted file mode 100644 index ca457179..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeArrowShot.java +++ /dev/null @@ -1,56 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeArrowShot extends LivingArmourUpgrade { - public static final int[] costs = new int[]{20, 50, 90, 160, 290}; - public static final int[] extraArrow = new int[]{1, 2, 3, 4, 5}; - - public LivingArmourUpgradeArrowShot(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.arrowShot"; - } - - @Override - public int getMaxTier() { - return 5; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public String getTranslationKey() { - return tooltipBase + "arrowShot"; - } - - public int getExtraArrows() { - return extraArrow[this.level]; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java deleted file mode 100644 index 2254a320..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeCriticalStrike.java +++ /dev/null @@ -1,63 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; - -public class LivingArmourUpgradeCriticalStrike extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 12, 22, 35, 49}; - public static final double[] damageBoost = new double[]{0.1, 0.2, 0.3, 0.4, 0.5}; - - public LivingArmourUpgradeCriticalStrike(int level) { - super(level); - } - - @Override - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - boolean flag = wearer.fallDistance > 0.0F && !wearer.onGround && !wearer.isOnLadder() && !wearer.isInWater() && !wearer.isPotionActive(Effects.BLINDNESS) && !wearer.isRiding() && !wearer.isSprinting(); - - if (flag) { - return getDamageModifier() * damage; - } - - return 0; - } - - public double getDamageModifier() { - return damageBoost[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.criticalStrike"; - } - - @Override - public int getMaxTier() { - return 5; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "criticalStrike"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java deleted file mode 100644 index 559fc941..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeDigging.java +++ /dev/null @@ -1,75 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; -import net.minecraft.world.World; - -import java.util.HashMap; - -public class LivingArmourUpgradeDigging extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 10, 18, 32, 60, 90, 140, 180, 240, 300}; - public static final int[] digSpeedTime = new int[]{0, 50, 60, 100, 100, 100, 100, 150, 150, 150}; - public static final int[] digSpeedLevel = new int[]{0, 0, 0, 1, 1, 1, 1, 1, 2, 2}; - public static final double[] digSpeedModifier = new double[]{1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.8, 2, 2.2, 2.5}; - public static HashMap changeMap = new HashMap<>(); - - public LivingArmourUpgradeDigging(int level) { - super(level); - } - - @Override - public double getMiningSpeedModifier(PlayerEntity player) { - return digSpeedModifier[this.level]; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (changeMap.containsKey(livingArmour) && changeMap.get(livingArmour)) { - changeMap.put(livingArmour, false); - - if (digSpeedTime[this.level] > 0) { - player.addPotionEffect(new EffectInstance(Effects.SPEED, digSpeedTime[this.level], digSpeedLevel[this.level], false, false)); - } - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.digging"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "digging"; - } - - public static void hasDug(LivingArmour armour) { - changeMap.put(armour, true); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java deleted file mode 100644 index 695df8f6..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeElytra.java +++ /dev/null @@ -1,51 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeElytra extends LivingArmourUpgrade { - public static final int[] costs = new int[]{20}; - - public LivingArmourUpgradeElytra(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.elytra"; - } - - @Override - public int getMaxTier() { - return 1; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public String getTranslationKey() { - return tooltipBase + "elytra"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java deleted file mode 100644 index 92719265..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeExperience.java +++ /dev/null @@ -1,48 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeExperience extends LivingArmourUpgrade { - public static final int[] costs = new int[]{7, 13, 22, 40, 65, 90, 130, 180, 250, 350}; - public static final double[] experienceModifier = new double[]{0.15, 0.3, 0.45, 0.6, 0.75, 0.9, 1.05, 1.2, 1.35, 1.5}; - - public LivingArmourUpgradeExperience(int level) { - super(level); - } - - public double getExperienceModifier() { - return experienceModifier[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.experienced"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "experienced"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java deleted file mode 100644 index d831435c..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFallProtect.java +++ /dev/null @@ -1,49 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeFallProtect extends LivingArmourUpgrade { - public static final int[] costs = new int[]{2, 5, 9, 15, 25}; - public static final float[] protectionLevel = new float[]{0.2F, 0.4F, 0.6F, 0.8F, 1F}; - - public LivingArmourUpgradeFallProtect(int level) { - super(level); - } - - - public float getDamageMultiplier() { - return 1 - protectionLevel[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.fallProtect"; - } - - @Override - public int getMaxTier() { - return 5; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "fallProtect"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java deleted file mode 100644 index ec34a3cc..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeFireResist.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.Effects; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -public class LivingArmourUpgradeFireResist extends LivingArmourUpgrade { - public static final int[] costs = new int[]{2, 6, 14, 25, 40}; - public static final int[] fireCooldownTime = new int[]{5 * 60 * 20, 5 * 60 * 20, 4 * 60 * 20, 3 * 60 * 20, 2 * 60 * 20}; - public static final int[] fireResistDuration = new int[]{30 * 20, 30 * 20, 40 * 20, 50 * 20, 60 * 20}; - - public int fireCooldown = 0; - - public LivingArmourUpgradeFireResist(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (player.isBurning() && fireCooldown <= 0) { - - player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, fireResistDuration[this.level])); - fireCooldown = fireCooldownTime[this.level]; - - player.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "fireRemove")), true); - - } else if (fireCooldown > 0) { - fireCooldown--; - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.fireResist"; - } - - @Override - public int getMaxTier() { - return 5; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(Constants.NBT.UPGRADE_FIRE_TIMER, fireCooldown); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - fireCooldown = tag.getInt(Constants.NBT.UPGRADE_FIRE_TIMER); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "fireResist"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java deleted file mode 100644 index b3b984d2..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGraveDigger.java +++ /dev/null @@ -1,61 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeGraveDigger extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 12, 20, 35, 49, 78, 110, 160, 215, 320}; - public static final double[] damageBoost = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - - public LivingArmourUpgradeGraveDigger(int level) { - super(level); - } - - @Override - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - if (!weapon.isEmpty() && weapon.getItem() instanceof ShovelItem) { - return getDamageModifier(); - } - - return 0; - } - - public double getDamageModifier() { - return damageBoost[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.graveDigger"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "graveDigger"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java deleted file mode 100644 index ffea15d0..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeGrimReaperSprint.java +++ /dev/null @@ -1,86 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -public class LivingArmourUpgradeGrimReaperSprint extends LivingArmourUpgrade { - public static final int[] costs = new int[]{20, 50, 130, 270, 450, 580, 700, 800, 900, 1000}; - public static final int[] rebirthDelay = new int[]{20 * 60 * 60, 20 * 60 * 50, 20 * 60 * 45, 20 * 60 * 40, 20 * 60 * 30, 20 * 60 * 25, 20 * 60 * 15, 20 * 60 * 10, 20 * 60 * 5, 20 * 60}; - public static final int[] strengthDuration = new int[]{0, 0, 100, 100, 200, 200, 200, 300, 300, 400}; - public static final int[] strengthValue = new int[]{0, 0, 0, 0, 0, 1, 1, 2, 2, 3}; - public static final int[] resistanceDuration = new int[]{100, 100, 100, 100, 100, 100, 100, 100, 100, 100}; - public static final int[] resistanceValue = new int[]{0, 0, 0, 0, 0, 1, 1, 2, 2, 3}; - public static final float[] healthOnRevive = new float[]{0.2f, 0.2f, 0.3f, 0.3f, 0.4f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f}; - - public int deathTimer = 0; - - public LivingArmourUpgradeGrimReaperSprint(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (deathTimer > 0) { - deathTimer--; - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.grimReaper"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void readFromNBT(CompoundNBT tag) { - deathTimer = tag.getInt(BloodMagic.MODID + ".tracker.grimReaper"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.grimReaper", deathTimer); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "grimReaper"; - } - - public void applyEffectOnRebirth(PlayerEntity player) { - player.setHealth(player.getMaxHealth() * healthOnRevive[this.level]); - - int strDur = strengthDuration[this.level]; - if (strDur > 0) { - player.addPotionEffect(new EffectInstance(Effects.STRENGTH, strDur, strengthValue[this.level])); - } - - int resDur = resistanceDuration[this.level]; - if (resDur > 0) { - player.addPotionEffect(new EffectInstance(Effects.RESISTANCE, resDur, resistanceValue[this.level])); - } - - deathTimer = rebirthDelay[this.level]; - player.sendStatusMessage(new StringTextComponent(TextHelper.localizeEffect(chatBase + "grimReaper")), true); - } - - public boolean canSavePlayer(PlayerEntity player) { - return deathTimer <= 0; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java deleted file mode 100644 index 3a1aaf13..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeHealthboost.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; - -public class LivingArmourUpgradeHealthboost extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 12, 20, 35, 49, 78, 110, 160, 215, 320}; - public static final int[] healthModifier = new int[]{4, 8, 12, 16, 20, 26, 32, 38, 44, 50}; - - public LivingArmourUpgradeHealthboost(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - - String name = getUniqueIdentifier() + "-HealthModifier1"; - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "HealthModifier1", healthModifier[this.level], 0)); - - return modifierMap; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.health"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "health"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java deleted file mode 100644 index 3fc4e734..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeJump.java +++ /dev/null @@ -1,63 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeJump extends LivingArmourUpgrade { - public static final int[] costs = new int[]{3, 6, 11, 23, 37, 50, 70, 100, 140, 200}; - public static final double[] jumpModifier = new double[]{0.10, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5}; - public static final double[] fallModifier = new double[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.75, 0.8, 0.85}; - - public LivingArmourUpgradeJump(int level) { - super(level); - } - - public double getJumpModifier() { - return jumpModifier[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.jump"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (!world.isRemote) { - double motionY = player.motionY; - - if (motionY < 0) { - player.fallDistance = (float) Math.max(0, player.fallDistance + motionY * fallModifier[this.level]); - } - } - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "jump"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java deleted file mode 100644 index 15914a0f..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeKnockbackResist.java +++ /dev/null @@ -1,67 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.nbt.CompoundNBT; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; - -public class LivingArmourUpgradeKnockbackResist extends LivingArmourUpgrade { - public static final int[] costs = new int[]{3, 7, 13, 26, 42}; - public static final double[] kbModifier = new double[]{0.2, 0.4, 0.6, 0.8, 1.0}; - public static final int[] healthModifier = new int[]{0, 0, 0, 4, 10}; - - public LivingArmourUpgradeKnockbackResist(int level) { - super(level); - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - - String name = getUniqueIdentifier() + "-KnockbackModifier1"; - modifierMap.put(SharedMonsterAttributes.KNOCKBACK_RESISTANCE.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "KnockbackModifier1", kbModifier[this.level], 0)); - - if (healthModifier[this.level] > 0) { - name = getUniqueIdentifier() + "-HealthModifier1"; - modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "HealthModifier1", healthModifier[this.level], 0)); - } - - return modifierMap; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.knockback"; - } - - @Override - public int getMaxTier() { - return 5; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "knockback"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java deleted file mode 100644 index d08722fd..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeMeleeDamage.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; -import org.apache.commons.codec.binary.StringUtils; - -import java.util.UUID; - -public class LivingArmourUpgradeMeleeDamage extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 12, 20, 35, 49, 78, 110, 160, 215, 320}; - public static final double[] meleeDamage = new double[]{0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 6, 7}; - - public LivingArmourUpgradeMeleeDamage(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - - String name = getUniqueIdentifier() + "-DamageModifier1"; - modifierMap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "DamageModifier1", meleeDamage[this.level], 0)); - - return modifierMap; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.meleeDamage"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "meleeDamage"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java deleted file mode 100644 index a33a241a..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeNightSight.java +++ /dev/null @@ -1,72 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class LivingArmourUpgradeNightSight extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 8, 15, 20, 34, 45, 70, 100, 150, 200}; - public static final double[] meleeDamage = new double[]{0, 0.5, 1, 1.5, 2, 2.5, 3, 4, 5, 6}; - - public boolean isActive = false; - - public LivingArmourUpgradeNightSight(int level) { - super(level); - } - - @Override - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - return isActive ? meleeDamage[this.level] : 0; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (world.getLight(player.getPosition(), false) <= 9) { - isActive = true; - if (player.isPotionActive(Effects.NIGHT_VISION)) - return; - - player.addPotionEffect(new EffectInstance(Effects.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false)); - } else if (isActive) { - isActive = false; - player.removePotionEffect(Effects.NIGHT_VISION); - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.nightSight"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - - } - - @Override - public void readFromNBT(CompoundNBT tag) { - - } - - @Override - public String getTranslationKey() { - return tooltipBase + "nightSight"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java deleted file mode 100644 index 1b69b807..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePhysicalProtect.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.DamageSource; - -public class LivingArmourUpgradePhysicalProtect extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 10, 18, 35, 65, 100, 140, 190, 250, 300}; - public static final double[] protectionLevel = new double[]{0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.75, 0.77, 0.80, 0.83}; - - public LivingArmourUpgradePhysicalProtect(int level) { - super(level); - } - - @Override - public double getArmourProtection(LivingEntity wearer, DamageSource source) { - if (source.getTrueSource() != null && !source.isMagicDamage() && !source.isProjectile()) { - return protectionLevel[this.level]; - } - - return 0; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.physicalProtect"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "physicalProtect"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java deleted file mode 100644 index 87e2d273..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradePoisonResist.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.helper.TextHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; - -public class LivingArmourUpgradePoisonResist extends LivingArmourUpgrade { - public static final int[] costs = new int[]{2, 6, 14, 25, 40}; - public static final int[] poisonCooldownTime = new int[]{1200, 800, 600, 300, 100}; - public static final int[] poisonMaxCure = new int[]{0, 1, 2, 2, 3}; - - public int poisonCooldown = 0; - - public LivingArmourUpgradePoisonResist(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (player.isPotionActive(Effects.POISON) && poisonCooldown <= 0) { - EffectInstance eff = player.getActivePotionEffect(Effects.POISON); - if (eff.getAmplifier() <= poisonMaxCure[this.level]) { - player.removePotionEffect(Effects.POISON); - poisonCooldown = poisonCooldownTime[this.level]; - - player.sendStatusMessage(new StringTextComponent(TextHelper.localize(chatBase + "poisonRemove")), true); - } - } else if (poisonCooldown > 0) { - poisonCooldown--; - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.poisonResist"; - } - - @Override - public int getMaxTier() { - return 5; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(Constants.NBT.UPGRADE_POISON_TIMER, poisonCooldown); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - poisonCooldown = tag.getInt(Constants.NBT.UPGRADE_POISON_TIMER); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "poisonResist"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java deleted file mode 100644 index 36b8ad84..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeRepairing.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.world.World; - -public class LivingArmourUpgradeRepairing extends LivingArmourUpgrade { - public static final int[] costs = new int[]{15}; - public static final int[] repairDelay = new int[]{200}; - - int maxRepair = 1; - - int delay = 0; - - public LivingArmourUpgradeRepairing(int level) { - super(level); - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (delay <= 0) { - delay = repairDelay[this.level]; - - EquipmentSlotType randomSlot = EquipmentSlotType.values()[2 + world.rand.nextInt(4)]; - ItemStack repairStack = player.getItemStackFromSlot(randomSlot); - if (!repairStack.isEmpty()) { - if (repairStack.isItemStackDamageable() && repairStack.isItemDamaged()) { - int toRepair = Math.min(maxRepair, repairStack.getItemDamage()); - if (toRepair > 0) { - repairStack.setItemDamage(repairStack.getItemDamage() - toRepair); - } - } - } - } else { - delay--; - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.repair"; - } - - @Override - public int getMaxTier() { - return 1; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt("repairingDelay", delay); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - delay = tag.getInt("repairingDelay"); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "repair"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java deleted file mode 100644 index 997a72ab..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSelfSacrifice.java +++ /dev/null @@ -1,49 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeSelfSacrifice extends LivingArmourUpgrade { - //TODO: Add extra effects for higher levels - public static final int[] costs = new int[]{7, 13, 22, 40, 65, 90, 130, 180, 250, 350}; - public static final double[] sacrificeModifier = new double[]{0.15, 0.3, 0.45, 0.6, 0.75, 0.9, 1.05, 1.2, 1.35, 1.5}; - - public LivingArmourUpgradeSelfSacrifice(int level) { - super(level); - } - - public double getSacrificeModifier() { - return sacrificeModifier[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.selfSacrifice"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "selfSacrifice"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java deleted file mode 100644 index 81be945d..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSolarPowered.java +++ /dev/null @@ -1,79 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.DamageSource; -import net.minecraft.world.World; - -public class LivingArmourUpgradeSolarPowered extends LivingArmourUpgrade { - public static final int[] costs = new int[]{5, 12, 20, 35, 49, 78, 110, 160, 215, 320}; - public static final int[] regenCooldown = new int[]{200, 180, 160, 120, 100, 80, 40, 20, 10, 10}; - public static final int[] fireResistCooldown = new int[]{1, 1, 60 * 60, 50 * 60, 40 * 60, 35 * 60, 30 * 60, 25 * 60, 20 * 60, 10 * 60}; - public static final int[] fireResistTime = new int[]{0, 0, 15 * 60, 20 * 60, 30 * 60, 35 * 60, 40 * 60, 50 * 60, 60 * 60, 100 * 60}; - public static final double[] protectionLevel = new double[]{0.02, 0.04, 0.06, 0.08, 0.10, 0.13, 0.16, 0.19, 0.22, 0.25}; - - public int counter = 0; - - public LivingArmourUpgradeSolarPowered(int level) { - super(level); - } - - @Override - public double getArmourProtection(LivingEntity wearer, DamageSource source) { - if (wearer.getEntityWorld().canSeeSky(wearer.getPosition()) && wearer.getEntityWorld().provider.isDaytime()) { - return protectionLevel[this.level]; - } - - return 0; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - counter++; - if (world.canSeeSky(player.getPosition()) && world.provider.isDaytime()) { - if (counter % regenCooldown[this.level] == 0 && player.getHealth() < player.getMaxHealth()) { - player.heal(1); - } - - if (fireResistTime[this.level] != 0 && counter % fireResistCooldown[this.level] == 0) { - player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, fireResistTime[this.level], 0, false, false)); - } - } - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.solarPowered"; - } - - @Override - public int getMaxTier() { - return 10; // Set to here until I can add more upgrades to it. - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(BloodMagic.MODID + ".tracker.solarPowered", counter); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - counter = tag.getInt(BloodMagic.MODID + ".tracker.solarPowered"); - } - - @Override - public String getTranslationKey() { - return tooltipBase + "solarPowered"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java deleted file mode 100644 index 4b595b5b..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSpeed.java +++ /dev/null @@ -1,87 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.ILivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.world.World; - -public class LivingArmourUpgradeSpeed extends LivingArmourUpgrade { - public static final int[] costs = new int[]{3, 7, 13, 26, 42, 60, 90, 130, 180, 250}; - public static final double[] speedModifier = new double[]{0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5}; - public static final int[] sprintSpeedTime = new int[]{0, 0, 0, 0, 0, 20, 60, 60, 100, 200}; - public static final int[] sprintSpeedLevel = new int[]{0, 0, 0, 0, 0, 0, 0, 1, 1, 2}; - public static final int[] healthModifier = new int[]{0, 0, 0, 0, 0, 0, 0, 4, 10, 20}; - public static final int[] sprintRegenTime = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 25}; - - public LivingArmourUpgradeSpeed(int level) { - super(level); - } - - public double getSpeedModifier() { - return speedModifier[this.level]; - } - - @Override - public void onTick(World world, PlayerEntity player, ILivingArmour livingArmour) { - if (player.isSprinting()) { - if (sprintSpeedTime[this.level] > 0) { - player.addPotionEffect(new EffectInstance(Effects.SPEED, sprintSpeedTime[this.level], sprintSpeedLevel[this.level], false, false)); - } - - if (sprintRegenTime[this.level] > 0 && !player.isPotionActive(Effects.REGENERATION)) { - player.addPotionEffect(new EffectInstance(Effects.REGENERATION, sprintRegenTime[this.level], 0, false, false)); - } - } - } - - @Override - public Multimap getAttributeModifiers() { - Multimap modifierMap = HashMultimap.create(); - -// modifierMap.put(SharedMonsterAttributes.movementSpeed.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(895132, 1), "Speed modifier" + 1, speedModifier[this.level], 1)); - -// if (healthModifier[this.level] > 0) { -// String name = getUniqueIdentifier() + "-HealthModifier1"; -// modifierMap.put(SharedMonsterAttributes.MAX_HEALTH.getName(), new AttributeModifier(UUID.nameUUIDFromBytes(StringUtils.getBytesUtf8(name)), "HealthModifier1", healthModifier[this.level], 0)); -// } - - return modifierMap; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.movement"; - } - - @Override - public int getMaxTier() { - return 10; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "speed"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java deleted file mode 100644 index 4b9fa00b..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeSprintAttack.java +++ /dev/null @@ -1,74 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeSprintAttack extends LivingArmourUpgrade { - public static final int[] costs = new int[]{3, 7, 15, 25, 40}; - public static final double[] damageBoost = new double[]{0.5, 0.75, 1, 1.25, 1.5}; - public static final double[] knockbackModifier = new double[]{1, 2, 3, 4, 5}; - - public LivingArmourUpgradeSprintAttack(int level) { - super(level); - } - - @Override - public double getAdditionalDamageOnHit(double damage, PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - if (wearer.isSprinting()) { - return getDamageModifier(); - } - - return 0; - } - - @Override - public double getKnockbackOnHit(PlayerEntity wearer, LivingEntity hitEntity, ItemStack weapon) { - if (wearer.isSprinting()) { - return getKnockbackModifier(); - } - - return 0; - } - - public double getDamageModifier() { - return damageBoost[this.level]; - } - - public double getKnockbackModifier() { - return knockbackModifier[this.level]; - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.sprintAttack"; - } - - @Override - public int getMaxTier() { - return 5; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "sprintAttack"; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java b/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java deleted file mode 100644 index 26cdf8e3..00000000 --- a/src/main/java/WayofTime/bloodmagic/livingArmour/upgrade/LivingArmourUpgradeStepAssist.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.livingArmour.upgrade; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import net.minecraft.nbt.CompoundNBT; - -public class LivingArmourUpgradeStepAssist extends LivingArmourUpgrade { - public static final int[] costs = new int[]{20}; - public static final float[] assist = new float[]{Constants.Misc.ALTERED_STEP_HEIGHT}; - -// public static final double[] speedModifier = new double[] { 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5 }; -// public static final int[] sprintSpeedTime = new int[] { 0, 0, 0, 0, 0, 20, 60, 60, 100, 200 }; -// public static final int[] sprintSpeedLevel = new int[] { 0, 0, 0, 0, 0, 0, 0, 1, 1, 2 }; -// public static final int[] healthModifier = new int[] { 0, 0, 0, 0, 0, 0, 0, 4, 10, 20 }; -// public static final int[] sprintRegenTime = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 }; - - public LivingArmourUpgradeStepAssist(int level) { - super(level); - } - - @Override - public String getUniqueIdentifier() { - return BloodMagic.MODID + ".upgrade.stepAssist"; - } - - @Override - public int getMaxTier() { - return 1; - } - - @Override - public int getCostOfUpgrade() { - return costs[this.level]; - } - - @Override - public void writeToNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public void readFromNBT(CompoundNBT tag) { - // EMPTY - } - - @Override - public String getTranslationKey() { - return tooltipBase + "stepAssist"; - } - - public float getStepAssist() { - return assist[this.level]; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java b/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java deleted file mode 100644 index bd5d9158..00000000 --- a/src/main/java/WayofTime/bloodmagic/meteor/Meteor.java +++ /dev/null @@ -1,115 +0,0 @@ -package WayofTime.bloodmagic.meteor; - -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Random; - -public class Meteor { - private static final Random RAND = new Random(); - - private final ItemStack catalystStack; - private final List components; - private final float explosionStrength; - private final int radius; - private final int maxWeight; - public int version; - public int cost = 1000000; - - public Meteor(ItemStack catalystStack, List components, float explosionStrength, int radius) { - this.catalystStack = catalystStack; - this.components = components; - this.explosionStrength = explosionStrength; - this.radius = radius; - - int weight = 0; - for (MeteorComponent component : components) - weight += component.getWeight(); - this.maxWeight = weight; - } - - public void generateMeteor(World world, BlockPos pos, BlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { - world.newExplosion(null, pos.getX(), pos.getY(), pos.getZ(), (float) (explosionStrength * explosionModifier), true, true); - int radius = (int) Math.ceil(getRadius() * radiusModifier); - double floatingRadius = getRadius() * radiusModifier; - - 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 > (floatingRadius + 0.5) * (floatingRadius + 0.5)) { - continue; - } - - BlockPos newPos = pos.add(i, j, k); - BlockState state = world.getBlockState(newPos); - - if (world.isAirBlock(newPos) || Utils.isBlockLiquid(state)) { - BlockState placedState = getRandomOreFromComponents(fillerBlock, fillerChance); - if (placedState != null) { - world.setBlockState(newPos, placedState); - } - } - } - } - } - } - - //fillerChance is the chance that the filler block will NOT be placed - public BlockState getRandomOreFromComponents(BlockState fillerBlock, double fillerChance) { - int goal = RAND.nextInt(getMaxWeight()); - - for (MeteorComponent component : getComponents()) { - goal -= component.getWeight(); - if (goal < 0) { - BlockState state = component.getStateFromOre(); - if (state != null) { - return state; - } else { - return RAND.nextDouble() > fillerChance ? fillerBlock : null; - } - } - } - - return RAND.nextDouble() > fillerChance ? fillerBlock : null; - } - - public ItemStack getCatalystStack() { - return catalystStack; - } - - public List getComponents() { - return components; - } - - public float getExplosionStrength() { - return explosionStrength; - } - - public int getRadius() { - return radius; - } - - public int getMaxWeight() { - return maxWeight; - } - - public int getVersion() { - return version; - } - - public void setVersion(int version) { - this.version = version; - } - - public void setCost(int performCost) { - this.cost = performCost; - } - - public int getCost() { - return cost; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java deleted file mode 100644 index 5e820a31..00000000 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorComponent.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.meteor; - -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.List; - -public class MeteorComponent { - public int weight; - public String oreName; - - public MeteorComponent(int weight, String oreName) { - this.weight = weight; - this.oreName = oreName; - } - - public BlockState getStateFromOre() { - if (oreName.contains(":")) { - String[] stringList = oreName.split(":"); - String domain = stringList[0]; - String block = stringList[1]; - int meta = 0; - if (stringList.length > 2 && Utils.isInteger(stringList[2])) { - meta = Integer.parseInt(stringList[2]); - } - - Block ore = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(domain, block)); - if (ore != Blocks.AIR) { - return ore.getStateFromMeta(meta); - } - } - - List list = OreDictionary.getOres(oreName); - if (list != null && !list.isEmpty()) { - for (ItemStack stack : list) { - if (stack != null && stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - BlockState state = block.getStateFromMeta(stack.getItemDamage()); - - return state; - } - } - } - - return null; - } - - public int getWeight() { - return weight; - } - - public void setWeight(int weight) { - this.weight = weight; - } - - public String getOreName() { - return oreName; - } - - public void setOreName(String oreName) { - this.oreName = oreName; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java deleted file mode 100644 index 0be375e3..00000000 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorConfigHandler.java +++ /dev/null @@ -1,165 +0,0 @@ -package WayofTime.bloodmagic.meteor; - -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.gson.Serializers; -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.filefilter.FileFilterUtils; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.*; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class MeteorConfigHandler { - private static final Map DEFAULT_METEORS = Maps.newHashMap(); - - private static File meteorDir; - - public static void init(File meteorDirectory) { - meteorDir = meteorDirectory; - handleMeteors(true); - } - - public static void handleMeteors(boolean checkNewVersion) { - if (meteorDir == null) { - BMLog.DEFAULT.error("Attempted to handle meteor config but the folder has not been initialized. Was this run too early?"); - return; - } - - // Clear the meteors so that reloading in-game can be done - MeteorRegistry.meteorMap.clear(); - List> defaultMeteors = getDefaultMeteors(); - - try { - // Create defaults if the folder doesn't exist - if (!meteorDir.exists() && meteorDir.mkdir()) { - for (Pair meteor : defaultMeteors) { - String json = Serializers.GSON.toJson(meteor.getRight()); - FileWriter writer = new FileWriter(new File(meteorDir, meteor.getLeft() + ".json")); - writer.write(json); - writer.close(); - } - } - - // Collect all meteors from the files - File[] meteorFiles = meteorDir.listFiles((FileFilter) FileFilterUtils.suffixFileFilter(".json")); - if (meteorFiles == null) - return; - - List> meteors = Lists.newArrayList(); - - // Filter names so we can compare to defaults - for (File meteorFile : meteorFiles) { - FileReader reader = new FileReader(meteorFile); - Meteor meteor = Serializers.GSON.fromJson(reader, Meteor.class); - meteors.add(Pair.of(FilenameUtils.removeExtension(meteorFile.getName()), meteor)); - reader.close(); - } - - if (checkNewVersion && ConfigHandler.values.shouldResyncMeteors) { - Set discoveredDefaults = Sets.newHashSet(); - - // Check existing defaults for new version - for (Pair meteor : meteors) { - Meteor defaultMeteor = DEFAULT_METEORS.get(meteor.getLeft()); - if (defaultMeteor != null) { - discoveredDefaults.add(meteor.getLeft()); - if (defaultMeteor.version > meteor.getRight().version) { - writeMeteor(meteor.getLeft(), defaultMeteor); - meteors.set(meteors.indexOf(meteor), Pair.of(meteor.getLeft(), defaultMeteor)); - } - } - } - - // Generate new defaults - for (Map.Entry entry : DEFAULT_METEORS.entrySet()) { - if (discoveredDefaults.contains(entry.getKey())) - continue; - - writeMeteor(entry.getKey(), entry.getValue()); - } - } - - // Finally, register all of our meteors - for (Pair meteor : meteors) - MeteorRegistry.registerMeteor(meteor.getRight().getCatalystStack(), meteor.getRight()); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static List> getDefaultMeteors() { - List> holders = Lists.newArrayList(); - - // Iron - List ironMeteorList = Lists.newArrayList(); - ironMeteorList.add(new MeteorComponent(400, "oreIron")); - ironMeteorList.add(new MeteorComponent(200, "oreCopper")); - ironMeteorList.add(new MeteorComponent(140, "oreTin")); - ironMeteorList.add(new MeteorComponent(70, "oreSilver")); - ironMeteorList.add(new MeteorComponent(80, "oreLead")); - ironMeteorList.add(new MeteorComponent(30, "oreGold")); - ironMeteorList.add(new MeteorComponent(60, "oreLapis")); - ironMeteorList.add(new MeteorComponent(100, "oreRedstone")); - Meteor ironMeteor = new Meteor(new ItemStack(Blocks.IRON_BLOCK), ironMeteorList, 15, 5); - ironMeteor.setVersion(3); - ironMeteor.setCost(1000000); - - // Gold - List goldMeteorList = Lists.newArrayList(); - goldMeteorList.add(new MeteorComponent(200, "oreIron")); - goldMeteorList.add(new MeteorComponent(100, "oreCopper")); - goldMeteorList.add(new MeteorComponent(60, "oreTin")); - goldMeteorList.add(new MeteorComponent(100, "oreGold")); - goldMeteorList.add(new MeteorComponent(120, "oreLapis")); - goldMeteorList.add(new MeteorComponent(30, "oreDiamond")); - goldMeteorList.add(new MeteorComponent(20, "oreEmerald")); - goldMeteorList.add(new MeteorComponent(20, "oreCoal")); - Meteor goldMeteor = new Meteor(new ItemStack(Blocks.GOLD_BLOCK), goldMeteorList, 18, 6); - goldMeteor.setVersion(4); - goldMeteor.setCost(2500000); - - // Diamond - List diamondMeteorList = Lists.newArrayList(); - diamondMeteorList.add(new MeteorComponent(50, "oreIron")); - diamondMeteorList.add(new MeteorComponent(100, "oreGold")); - diamondMeteorList.add(new MeteorComponent(10, "oreLapis")); - diamondMeteorList.add(new MeteorComponent(250, "oreDiamond")); - diamondMeteorList.add(new MeteorComponent(180, "oreEmerald")); - diamondMeteorList.add(new MeteorComponent(50, "oreRedstone")); - diamondMeteorList.add(new MeteorComponent(400, "oreDiamond")); - Meteor diamondMeteor = new Meteor(new ItemStack(Blocks.DIAMOND_BLOCK), diamondMeteorList, 10, 3); - diamondMeteor.setVersion(4); - diamondMeteor.setCost(5000000); - - holders.add(Pair.of("iron", ironMeteor)); - DEFAULT_METEORS.put("iron", ironMeteor); - - holders.add(Pair.of("gold", goldMeteor)); - DEFAULT_METEORS.put("gold", goldMeteor); - - holders.add(Pair.of("diamond", diamondMeteor)); - DEFAULT_METEORS.put("diamond", diamondMeteor); - return holders; - } - - private static void writeMeteor(String name, Meteor meteor) { - try { - String json = Serializers.GSON.toJson(meteor); - File meteorFile = new File(meteorDir, name + ".json"); - new PrintWriter(meteorFile).close(); // Clear the file - FileWriter fileWriter = new FileWriter(meteorFile); - fileWriter.write(json); // Write the new contents - fileWriter.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java b/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java deleted file mode 100644 index a74f5c43..00000000 --- a/src/main/java/WayofTime/bloodmagic/meteor/MeteorRegistry.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.meteor; - -import com.google.common.collect.Maps; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; -import java.util.List; -import java.util.Map; - -public class MeteorRegistry { - - public static Map meteorMap = Maps.newHashMap(); - - public static void registerMeteor(ItemStack stack, Meteor holder) { - if (!stack.isEmpty()) - meteorMap.put(stack, holder); - } - - public static void registerMeteor(ItemStack stack, List componentList, float explosionStrength, int radius) { - Meteor holder = new Meteor(stack, componentList, explosionStrength, radius); - registerMeteor(stack, holder); - } - - @Nullable - public static Meteor getMeteorForItem(ItemStack stack) { - if (stack.isEmpty()) - return null; - - for (Map.Entry entry : meteorMap.entrySet()) - if (ItemStack.areItemsEqual(stack, entry.getKey())) - return entry.getValue(); - - return null; - } - - public static void generateMeteorForItem(ItemStack stack, World world, BlockPos pos, BlockState fillerBlock, double radiusModifier, double explosionModifier, double fillerChance) { - Meteor meteor = getMeteorForItem(stack); - if (meteor != null) - meteor.generateMeteor(world, pos, fillerBlock, radiusModifier, explosionModifier, fillerChance); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java index 06f2c1a0..77fa79df 100644 --- a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java @@ -1,37 +1,47 @@ -package WayofTime.bloodmagic.network; +package wayoftime.bloodmagic.network; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.ChatUtil; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fml.common.network.NetworkRegistry; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.network.simple.SimpleChannel; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.util.ChatUtil; -public class BloodMagicPacketHandler { - public static final SimpleNetworkWrapper INSTANCE = new SimpleNetworkWrapper(BloodMagic.MODID); +public class BloodMagicPacketHandler extends BasePacketHandler +{ +// public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(new ResourceLocation(BloodMagic.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); + public static final SimpleChannel INSTANCE = createChannel(new ResourceLocation(BloodMagic.MODID, "main")); - public static void init() { - INSTANCE.registerMessage(ChatUtil.PacketNoSpamChat.Handler.class, ChatUtil.PacketNoSpamChat.class, 0, Side.CLIENT); - INSTANCE.registerMessage(ItemRouterButtonPacketProcessor.class, ItemRouterButtonPacketProcessor.class, 1, Side.SERVER); - INSTANCE.registerMessage(PlayerVelocityPacketProcessor.class, PlayerVelocityPacketProcessor.class, 2, Side.CLIENT); - INSTANCE.registerMessage(PlayerFallDistancePacketProcessor.class, PlayerFallDistancePacketProcessor.class, 3, Side.SERVER); - INSTANCE.registerMessage(SigilHoldingPacketProcessor.class, SigilHoldingPacketProcessor.class, 4, Side.SERVER); - INSTANCE.registerMessage(KeyProcessor.class, KeyProcessor.class, 5, Side.SERVER); - INSTANCE.registerMessage(DemonAuraPacketProcessor.class, DemonAuraPacketProcessor.class, 6, Side.CLIENT); - INSTANCE.registerMessage(ItemRouterAmountPacketProcessor.class, ItemRouterAmountPacketProcessor.class, 7, Side.SERVER); - } + @Override + public void initialize() + { + registerServerToClient(ChatUtil.PacketNoSpamChat.class, ChatUtil.PacketNoSpamChat::encode, ChatUtil.PacketNoSpamChat::decode, ChatUtil.PacketNoSpamChat::handle); +// INSTANCE.registerMessage(id, messageType, encoder, decoder, messageConsumer); +// INSTANCE.registerMessage(ChatUtil.PacketNoSpamChat.Handler.class, ChatUtil.PacketNoSpamChat.class, 0, Side.CLIENT); +// INSTANCE.registerMessage(ItemRouterButtonPacketProcessor.class, ItemRouterButtonPacketProcessor.class, 1, Side.SERVER); +// INSTANCE.registerMessage(PlayerVelocityPacketProcessor.class, PlayerVelocityPacketProcessor.class, 2, Side.CLIENT); +// INSTANCE.registerMessage(PlayerFallDistancePacketProcessor.class, PlayerFallDistancePacketProcessor.class, 3, Side.SERVER); +// INSTANCE.registerMessage(SigilHoldingPacketProcessor.class, SigilHoldingPacketProcessor.class, 4, Side.SERVER); +// INSTANCE.registerMessage(KeyProcessor.class, KeyProcessor.class, 5, Side.SERVER); +// INSTANCE.registerMessage(DemonAuraPacketProcessor.class, DemonAuraPacketProcessor.class, 6, Side.CLIENT); +// INSTANCE.registerMessage(ItemRouterAmountPacketProcessor.class, ItemRouterAmountPacketProcessor.class, 7, Side.SERVER); + } - public static void sendToAllAround(IMessage message, TileEntity te, int range) { - INSTANCE.sendToAllAround(message, new NetworkRegistry.TargetPoint(te.getWorld().provider.getDimension(), te.getPos().getX(), te.getPos().getY(), te.getPos().getZ(), range)); - } + protected SimpleChannel getChannel() + { + return INSTANCE; + } - public static void sendToAllAround(IMessage message, TileEntity te) { - sendToAllAround(message, te, 64); - } - - public static void sendTo(IMessage message, ServerPlayerEntity player) { - INSTANCE.sendTo(message, player); - } -} +// public static void sendToAllAround(IMessage message, TileEntity te, int range) +// { +// INSTANCE.sendToAllAround(message, new NetworkRegistry.TargetPoint(te.getWorld().provider.getDimension(), te.getPos().getX(), te.getPos().getY(), te.getPos().getZ(), range)); +// } +// +// public static void sendToAllAround(IMessage message, TileEntity te) +// { +// sendToAllAround(message, te, 64); +// } +// +// public static void sendTo(IMessage message, EntityPlayerMP player) +// { +// INSTANCE.sendTo(message, player); +// } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java deleted file mode 100644 index 9d0ea6ce..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java +++ /dev/null @@ -1,57 +0,0 @@ -package WayofTime.bloodmagic.network; - -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.proxy.ClientProxy; -import io.netty.buffer.ByteBuf; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class DemonAuraPacketProcessor implements IMessage, IMessageHandler { - public DemonWillHolder currentWill = new DemonWillHolder(); - - public DemonAuraPacketProcessor() { - - } - - public DemonAuraPacketProcessor(DemonWillHolder holder) { - this.currentWill = holder; - } - - @Override - public void fromBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - currentWill.willMap.put(type, buff.readDouble()); - } - } - - @Override - public void toBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (currentWill.willMap.containsKey(type)) { - buff.writeDouble(currentWill.willMap.get(type)); - } else { - buff.writeDouble(0); - } - } - } - - @Override - public IMessage onMessage(DemonAuraPacketProcessor message, MessageContext ctx) { - if (ctx.side == Side.CLIENT) { - message.onMessageFromServer(); - } - return null; - } - - @SideOnly(Side.CLIENT) - public void onMessageFromServer() { - ClientProxy.currentAura = currentWill; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java deleted file mode 100644 index de84fd3d..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterAmountPacketProcessor.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.network; - -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import io.netty.buffer.ByteBuf; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; - -public class ItemRouterAmountPacketProcessor implements IMessage, IMessageHandler { - private int ghostItemSlot; - private int amount; - private int dimension; - private BlockPos pos; - - public ItemRouterAmountPacketProcessor() { - - } - - public ItemRouterAmountPacketProcessor(int ghostItemSlot, int amount, BlockPos pos, World world) { - this.ghostItemSlot = ghostItemSlot; - this.amount = amount; - this.pos = pos; - this.dimension = world.provider.getDimension(); - } - - @Override - public void fromBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - dimension = buff.readInt(); - pos = buff.readBlockPos(); - ghostItemSlot = buff.readInt(); - amount = buff.readInt(); - } - - @Override - public void toBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - buff.writeInt(dimension); - buff.writeBlockPos(pos); - buff.writeInt(ghostItemSlot); - buff.writeInt(amount); - } - - @Override - public IMessage onMessage(ItemRouterAmountPacketProcessor message, MessageContext ctx) { - if (ctx.side == Side.SERVER) { - message.onMessageFromClient(); - } - return null; - } - - public void onMessageFromClient() { - World world = DimensionManager.getWorld(dimension); - if (world != null) { - if (!world.isBlockLoaded(pos)) - return; - - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileFilteredRoutingNode) { - ((TileFilteredRoutingNode) tile).setGhostItemAmount(ghostItemSlot, amount); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java deleted file mode 100644 index e8aafad7..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/ItemRouterButtonPacketProcessor.java +++ /dev/null @@ -1,74 +0,0 @@ -package WayofTime.bloodmagic.network; - -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import io.netty.buffer.ByteBuf; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; - -public class ItemRouterButtonPacketProcessor implements IMessage, IMessageHandler { - private int buttonPress; - private int dimension; - private BlockPos pos; - - public ItemRouterButtonPacketProcessor() { - - } - - public ItemRouterButtonPacketProcessor(int buttonPress, BlockPos pos, World world) { - this.buttonPress = buttonPress; - this.pos = pos; - this.dimension = world.provider.getDimension(); - } - - @Override - public void fromBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - dimension = buff.readInt(); - pos = buff.readBlockPos(); - buttonPress = buff.readInt(); - } - - @Override - public void toBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - buff.writeInt(dimension); - buff.writeBlockPos(pos); - buff.writeInt(buttonPress); - } - - @Override - public IMessage onMessage(ItemRouterButtonPacketProcessor message, MessageContext ctx) { - if (ctx.side == Side.SERVER) { - message.onMessageFromClient(); - } - return null; - } - - public void onMessageFromClient() { - World world = DimensionManager.getWorld(dimension); - if (world != null) { - if (!world.isBlockLoaded(pos)) - return; - - TileEntity tile = world.getTileEntity(pos); - if (tile instanceof TileFilteredRoutingNode) { - if (buttonPress >= 6) { - if (buttonPress == 6) { - ((TileFilteredRoutingNode) tile).incrementCurrentPriotiryToMaximum(9); - } else if (buttonPress == 7) { - ((TileFilteredRoutingNode) tile).decrementCurrentPriority(); - } - } else { - ((TileFilteredRoutingNode) tile).swapFilters(buttonPress); - } - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java b/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java deleted file mode 100644 index 513e56cc..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/KeyProcessor.java +++ /dev/null @@ -1,52 +0,0 @@ -package WayofTime.bloodmagic.network; - -import WayofTime.bloodmagic.client.key.IKeybindable; -import WayofTime.bloodmagic.client.key.KeyBindings; -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; - -public class KeyProcessor implements IMessage, IMessageHandler { - public int keyId; - public boolean showInChat; - - public KeyProcessor() { - } - - public KeyProcessor(KeyBindings key, boolean showInChat) { - this.keyId = key.ordinal(); - this.showInChat = showInChat; - } - - @Override - public void fromBytes(ByteBuf buf) { - this.keyId = buf.readInt(); - this.showInChat = buf.readBoolean(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(this.keyId); - buf.writeBoolean(this.showInChat); - } - - @Override - public IMessage onMessage(KeyProcessor msg, MessageContext ctx) { - PlayerEntity entityPlayer = ctx.getServerHandler().player; - - if (entityPlayer != null) { - ItemStack heldStack = entityPlayer.getHeldItemMainhand(); - if (heldStack.getItem() instanceof IKeybindable) { - if (msg.keyId < 0 || msg.keyId >= KeyBindings.values().length) { - return null; - } - KeyBindings key = KeyBindings.values()[msg.keyId]; - ((IKeybindable) heldStack.getItem()).onKeyPressed(heldStack, entityPlayer, key, msg.showInChat); - } - } - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java deleted file mode 100644 index 0e29a52e..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerFallDistancePacketProcessor.java +++ /dev/null @@ -1,45 +0,0 @@ -package WayofTime.bloodmagic.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; - -public class PlayerFallDistancePacketProcessor implements IMessage, IMessageHandler { - private float fallDistance; - - public PlayerFallDistancePacketProcessor() { - - } - - public PlayerFallDistancePacketProcessor(float fallDistance) { - this.fallDistance = fallDistance; - } - - @Override - public void fromBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - fallDistance = buff.readFloat(); - } - - @Override - public void toBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - buff.writeFloat(fallDistance); - } - - @Override - public IMessage onMessage(PlayerFallDistancePacketProcessor message, MessageContext ctx) { - if (ctx.side == Side.SERVER) { - message.onMessageFromClient(ctx.getServerHandler().player); - } - return null; - } - - public void onMessageFromClient(PlayerEntity player) { - player.fallDistance = fallDistance; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java deleted file mode 100644 index 324c4d0f..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/PlayerVelocityPacketProcessor.java +++ /dev/null @@ -1,59 +0,0 @@ -package WayofTime.bloodmagic.network; - -import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class PlayerVelocityPacketProcessor implements IMessage, IMessageHandler { - private double motionX; - private double motionY; - private double motionZ; - - public PlayerVelocityPacketProcessor() { - - } - - public PlayerVelocityPacketProcessor(double motionX, double motionY, double motionZ) { - this.motionX = motionX; - this.motionY = motionY; - this.motionZ = motionZ; - } - - @Override - public void fromBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - motionX = buff.readDouble(); - motionY = buff.readDouble(); - motionZ = buff.readDouble(); - } - - @Override - public void toBytes(ByteBuf buffer) { - PacketBuffer buff = new PacketBuffer(buffer); - buff.writeDouble(motionX); - buff.writeDouble(motionY); - buff.writeDouble(motionZ); - } - - @Override - public IMessage onMessage(PlayerVelocityPacketProcessor message, MessageContext ctx) { - if (ctx.side == Side.CLIENT) { - message.onMessageFromServer(); - } - return null; - } - - @SideOnly(Side.CLIENT) - public void onMessageFromServer() { - PlayerEntity player = Minecraft.getInstance().player; - player.motionX = motionX; - player.motionY = motionY; - player.motionZ = motionZ; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java deleted file mode 100644 index 9cd7631f..00000000 --- a/src/main/java/WayofTime/bloodmagic/network/SigilHoldingPacketProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -package WayofTime.bloodmagic.network; - -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import io.netty.buffer.ByteBuf; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; - -public class SigilHoldingPacketProcessor implements IMessage, IMessageHandler { - private int slot; - private int mode; - - public SigilHoldingPacketProcessor() { - } - - public SigilHoldingPacketProcessor(int slot, int mode) { - this.slot = slot; - this.mode = mode; - } - - @Override - public void toBytes(ByteBuf buffer) { - buffer.writeInt(slot); - buffer.writeInt(mode); - } - - @Override - public void fromBytes(ByteBuf buffer) { - slot = buffer.readInt(); - mode = buffer.readInt(); - } - - @Override - public IMessage onMessage(SigilHoldingPacketProcessor message, MessageContext ctx) { - ItemStack itemStack = ItemStack.EMPTY; - - if (message.slot > -1 && message.slot < 9) { - itemStack = ctx.getServerHandler().player.inventory.getStackInSlot(message.slot); - } - - if (!itemStack.isEmpty()) { - ItemSigilHolding.cycleToNextSigil(itemStack, message.mode); - } - - return null; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java index 5ac147c2..753bd1f6 100644 --- a/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/orb/BloodOrb.java @@ -1,68 +1,61 @@ -package WayofTime.bloodmagic.orb; +package wayoftime.bloodmagic.orb; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraftforge.registries.IForgeRegistryEntry; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import net.minecraft.util.ResourceLocation; /** - * Base object for all Blood Orbs. Makes Orb creation quite a bit easier. - *

- * Just create a new BloodOrb instance then register it in {@link net.minecraftforge.event.RegistryEvent.Register} + * Refactoring of the original BloodOrb. BloodOrbs are no longer registered due + * to The Flattening. */ -public class BloodOrb extends IForgeRegistryEntry.Impl { - private final String name; - private final int tier; - private final int capacity; - private final int fillRate; - @Nullable - private ModelResourceLocation modelLocation; +public class BloodOrb extends net.minecraftforge.registries.ForgeRegistryEntry +{ + private final ResourceLocation name; + private final int tier; + private final int capacity; + private final int fillRate; - /** - * A base object for BloodOrbs. A bit cleaner than the old way through - * EnergyItems. - * - * @param name - A name for the Orb. Gets put into an unlocalized name. - * @param tier - The tier of the Orb. - * @param capacity - The max amount of LP the Orb can store. - * @param fillRate - The amount of LP per tick the Altar can fill the network with. - */ - public BloodOrb(String name, int tier, int capacity, int fillRate) { - this.name = name; - this.tier = tier; - this.capacity = capacity; - this.fillRate = fillRate; - } + /** + * A base object for BloodOrbs. A bit cleaner than the old way through + * EnergyItems. + * + * @param name - A name for the Orb. Gets put into an unlocalized name. + * @param tier - The tier of the Orb. + * @param capacity - The max amount of LP the Orb can store. + * @param fillRate - The amount of LP per tick the Altar can fill the network + * with. + */ + public BloodOrb(ResourceLocation name, int tier, int capacity, int fillRate) + { + this.name = name; + this.tier = tier; + this.capacity = capacity; + this.fillRate = fillRate; + } - public String getName() { - return name; - } + public ResourceLocation getResourceLocation() + { + return name; + } - public int getTier() { - return tier; - } + public int getTier() + { + return tier; + } - public int getCapacity() { - return capacity; - } + public int getCapacity() + { + return capacity; + } - public int getFillRate() { - return fillRate; - } + public int getFillRate() + { + return fillRate; + } - @Nullable - public ModelResourceLocation getModelLocation() { - return modelLocation; - } - - public BloodOrb withModel(@Nonnull ModelResourceLocation modelLocation) { - this.modelLocation = modelLocation; - return this; - } - - @Override - public String toString() { - return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + ", owner=" + getRegistryName() + '}'; - } -} + @Override + public String toString() + { +// return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + ", owner=" +// + getRegistryName() + '}'; + return "BloodOrb{" + "name='" + name + '\'' + ", tier=" + tier + ", capacity=" + capacity + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java b/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java index 09848dbb..ae3a637b 100644 --- a/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java +++ b/src/main/java/WayofTime/bloodmagic/orb/IBloodOrb.java @@ -1,10 +1,11 @@ -package WayofTime.bloodmagic.orb; - -import net.minecraft.item.ItemStack; +package wayoftime.bloodmagic.orb; import javax.annotation.Nullable; -public interface IBloodOrb { - @Nullable - BloodOrb getOrb(ItemStack stack); -} +import net.minecraft.item.ItemStack; + +public interface IBloodOrb +{ + @Nullable + BloodOrb getOrb(ItemStack stack); +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java b/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java deleted file mode 100644 index be6b60bf..00000000 --- a/src/main/java/WayofTime/bloodmagic/potion/BMPotionUtils.java +++ /dev/null @@ -1,137 +0,0 @@ -package WayofTime.bloodmagic.potion; - -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionAugmentRecipe; -import net.minecraft.block.Block; -import net.minecraft.block.IGrowable; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.potion.Effect; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Random; - -public class BMPotionUtils { - public static Random rand = new Random(); - - public static double damageMobAndGrowSurroundingPlants(LivingEntity entity, int horizontalRadius, int verticalRadius, double damageRatio, int maxPlantsGrown) { - World world = entity.getEntityWorld(); - if (world.isRemote) { - return 0; - } - - if (entity.isDead) { - return 0; - } - - double incurredDamage = 0; - - List growList = new ArrayList<>(); - - for (int i = 0; i < maxPlantsGrown; i++) { - BlockPos blockPos = entity.getPosition().add(rand.nextInt(horizontalRadius * 2 + 1) - horizontalRadius, rand.nextInt(verticalRadius * 2 + 1) - verticalRadius, rand.nextInt(horizontalRadius * 2 + 1) - horizontalRadius); - BlockState state = world.getBlockState(blockPos); - - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - if (state.getBlock() instanceof IGrowable) { - growList.add(blockPos); - } - } - } - - for (BlockPos blockPos : growList) { - Block block = world.getBlockState(blockPos).getBlock(); -// if (world.rand.nextInt(50) == 0) - { - BlockState preBlockState = world.getBlockState(blockPos); - for (int n = 0; n < 10; n++) - block.updateTick(world, blockPos, world.getBlockState(blockPos), world.rand); - - BlockState newState = world.getBlockState(blockPos); - if (!newState.equals(preBlockState)) { - world.playEvent(2001, blockPos, Block.getIdFromBlock(newState.getBlock()) + (newState.getBlock().getMetaFromState(newState) << 12)); - incurredDamage += damageRatio; - } - } - } - - if (incurredDamage > 0) { - entity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, (float) incurredDamage); - } - - return incurredDamage; - } - - public static double getLengthAugment(ItemStack flaskStack, Effect potion) { - NBTHelper.checkNBT(flaskStack); - CompoundNBT tag = flaskStack.getTagCompound(); - - return tag.getDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName()); - } - - public static void setLengthAugment(ItemStack flaskStack, Effect potion, double value) { - if (value < 0) { - value = 0; - } - - NBTHelper.checkNBT(flaskStack); - CompoundNBT tag = flaskStack.getTagCompound(); - - tag.putDouble(Constants.NBT.POTION_AUGMENT_LENGHT + potion.getName(), value); - } - - public static int getAugmentedLength(int originalLength, double lengthAugment, double powerAugment) { - return Math.max((int) (originalLength * (Math.pow(8f / 3f, lengthAugment) * Math.pow(0.5, powerAugment))), 1); - } - - /** - * Copied from PotionUtils - * - * @param stack - * @param effects - * @return - */ - public static ItemStack setEffects(ItemStack stack, Collection effects) { - if (effects.isEmpty()) { - return stack; - } else { - CompoundNBT nbttagcompound = stack.hasTagCompound() ? stack.getTagCompound() : new CompoundNBT(); - ListNBT nbttaglist = new ListNBT(); - - for (EffectInstance potioneffect : effects) { - nbttaglist.appendTag(potioneffect.writeCustomPotionEffectToNBT(new CompoundNBT())); - } - - nbttagcompound.putTag("CustomPotionEffects", nbttaglist); - stack.setTagCompound(nbttagcompound); - return stack; - } - } - - public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, EffectInstance baseEffect, double lengthAugment) { - return new AlchemyTablePotionAugmentRecipe(lpDrained, ticksRequired, tierRequired, inputItems, baseEffect, lengthAugment, 0); - } - - public static AlchemyTablePotionAugmentRecipe getPowerAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, EffectInstance baseEffect, int powerAugment) { - return new AlchemyTablePotionAugmentRecipe(lpDrained, ticksRequired, tierRequired, inputItems, baseEffect, 0, powerAugment); - } - - public static AlchemyTablePotionAugmentRecipe getLengthAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, EffectInstance baseEffect, double lengthAugment) { - return new AlchemyTablePotionAugmentRecipe(lpDrained, ticksRequired, tierRequired, inputItem, baseEffect, lengthAugment, 0); - } - - public static AlchemyTablePotionAugmentRecipe getPowerAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, EffectInstance baseEffect, int powerAugment) { - return new AlchemyTablePotionAugmentRecipe(lpDrained, ticksRequired, tierRequired, inputItem, baseEffect, 0, powerAugment); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java index cc29bc82..057c44c9 100644 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/potion/PotionBloodMagic.java @@ -1,56 +1,12 @@ -package WayofTime.bloodmagic.potion; +package wayoftime.bloodmagic.potion; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.LivingEntity; import net.minecraft.potion.Effect; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.potion.EffectType; -public class PotionBloodMagic extends Effect { - public static ResourceLocation texture = new ResourceLocation(BloodMagic.MODID, "textures/misc/potions.png"); - - public PotionBloodMagic(String name, boolean badEffect, int potionColor, int iconIndexX, int iconIndexY) { - super(badEffect, potionColor); - this.setPotionName(name); - this.setIconIndex(iconIndexX, iconIndexY); - } - - @Override - public boolean shouldRenderInvText(EffectInstance effect) { - return true; - } - - public EffectInstance apply(LivingEntity entity, int duration) { - return apply(entity, duration, 0); - } - - public EffectInstance apply(LivingEntity entity, int duration, int level) { - EffectInstance effect = new EffectInstance(this, duration, level, false, false); - entity.addPotionEffect(effect); - return effect; - } - - public int getLevel(LivingEntity entity) { - EffectInstance effect = entity.getActivePotionEffect(this); - if (effect != null) { - return effect.getAmplifier(); - } - return 0; - } - - @Override - public boolean shouldRender(EffectInstance effect) { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public int getStatusIconIndex() { - Minecraft.getInstance().renderEngine.bindTexture(texture); - - return super.getStatusIconIndex(); - } -} +public class PotionBloodMagic extends Effect +{ + public PotionBloodMagic(EffectType typeIn, int liquidColorIn) + { + super(typeIn, liquidColorIn); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java b/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java deleted file mode 100644 index a2ce2462..00000000 --- a/src/main/java/WayofTime/bloodmagic/potion/PotionEventHandlers.java +++ /dev/null @@ -1,192 +0,0 @@ -package WayofTime.bloodmagic.potion; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; -import com.google.common.collect.Lists; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.IProjectile; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.AbstractArrowEntity; -import net.minecraft.entity.projectile.ThrowableEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.living.*; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class PotionEventHandlers { - public static Map> flightListMap = new HashMap<>(); - public static Map> noGravityListMap = new HashMap<>(); - - @SubscribeEvent - public static void onLivingJumpEvent(LivingEvent.LivingJumpEvent event) { - LivingEntity eventEntityLiving = event.getEntityLiving(); - - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.BOOST)) { - int i = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); - eventEntityLiving.motionY += (0.1f) * (2 + i); - } - - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) - eventEntityLiving.motionY = 0; - } - - @SubscribeEvent - public static void onLivingFall(LivingFallEvent event) { - LivingEntity eventEntityLiving = event.getEntityLiving(); - - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.HEAVY_HEART)) { - int i = eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.HEAVY_HEART).getAmplifier() + 1; - event.setDamageMultiplier(event.getDamageMultiplier() + i); - event.setDistance(event.getDistance() + i); - } - } - - @SubscribeEvent - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { - LivingEntity eventEntityLiving = event.getEntityLiving(); - List flightList = flightListMap.getOrDefault(eventEntityLiving.getEntityWorld(), Lists.newArrayList()); - - if (eventEntityLiving instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) eventEntityLiving; - if (!player.world.isRemote) { - if (player.isPotionActive(RegistrarBloodMagic.FLIGHT)) { - if (!player.isSpectator() && !player.capabilities.allowFlying) { - player.capabilities.allowFlying = true; - player.sendPlayerAbilities(); - flightList.add(player); - } - } else { - if (flightList.contains(player)) { - player.capabilities.allowFlying = false; - player.capabilities.isFlying = false; - player.sendPlayerAbilities(); - flightList.remove(player); - } - } - } - } -// if (eventEntityLiving.isPotionActive(ModPotions.boost)) -// { -// int i = eventEntityLiving.getActivePotionEffect(ModPotions.boost).getAmplifier(); -// { -// float percentIncrease = (i + 1) * 0.05f; -// -// if (eventEntityLiving instanceof EntityPlayer) -// { -// EntityPlayer entityPlayer = (EntityPlayer) eventEntityLiving; -// -// if ((entityPlayer.onGround || entityPlayer.capabilities.isFlying) && entityPlayer.moveForward > 0F) -// entityPlayer.moveFlying(0F, 1F, entityPlayer.capabilities.isFlying ? (percentIncrease / 2.0f) : percentIncrease); -// } -// } -// } - List noGravityList = noGravityListMap.getOrDefault(event.getEntityLiving().getEntityWorld(), Lists.newArrayList()); - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.SUSPENDED) && !eventEntityLiving.hasNoGravity()) { - eventEntityLiving.setNoGravity(true); - noGravityList.add(eventEntityLiving); - } else if (noGravityList.contains(eventEntityLiving)) { - eventEntityLiving.setNoGravity(false); - noGravityList.remove(eventEntityLiving); - } - - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.GROUNDED)) - if (eventEntityLiving instanceof PlayerEntity && ((PlayerEntity) eventEntityLiving).capabilities.isFlying) - eventEntityLiving.motionY -= (0.05D * (double) (eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.GROUNDED).getAmplifier() + 1) - eventEntityLiving.motionY) * 0.2D; - else - eventEntityLiving.motionY -= (0.1D * (double) (eventEntityLiving.getActivePotionEffect(RegistrarBloodMagic.GROUNDED).getAmplifier() + 1) - eventEntityLiving.motionY) * 0.2D; - - if (eventEntityLiving.isPotionActive(RegistrarBloodMagic.WHIRLWIND)) { - int d0 = 3; - AxisAlignedBB axisAlignedBB = new AxisAlignedBB(eventEntityLiving.posX - 0.5, eventEntityLiving.posY - 0.5, eventEntityLiving.posZ - 0.5, eventEntityLiving.posX + 0.5, eventEntityLiving.posY + 0.5, eventEntityLiving.posZ + 0.5).expand(d0, d0, d0); - List entityList = eventEntityLiving.getEntityWorld().getEntitiesWithinAABB(Entity.class, axisAlignedBB); - - for (Entity projectile : entityList) { - if (projectile == null) - continue; - if (!(projectile instanceof IProjectile)) - continue; - - Entity throwingEntity = null; - - if (projectile instanceof AbstractArrowEntity) - throwingEntity = ((AbstractArrowEntity) projectile).shootingEntity; - else if (projectile instanceof ThrowableEntity) - throwingEntity = ((ThrowableEntity) projectile).getThrower(); - - if (throwingEntity != null && throwingEntity.equals(eventEntityLiving)) - continue; - - double delX = projectile.posX - eventEntityLiving.posX; - double delY = projectile.posY - eventEntityLiving.posY; - double delZ = projectile.posZ - eventEntityLiving.posZ; - - double angle = (delX * projectile.motionX + delY * projectile.motionY + delZ * projectile.motionZ) / (Math.sqrt(delX * delX + delY * delY + delZ * delZ) * Math.sqrt(projectile.motionX * projectile.motionX + projectile.motionY * projectile.motionY + projectile.motionZ * projectile.motionZ)); - - angle = Math.acos(angle); - - if (angle < 3 * (Math.PI / 4)) - continue; // angle is < 135 degrees - - if (throwingEntity != null) { - delX = -projectile.posX + throwingEntity.posX; - delY = -projectile.posY + (throwingEntity.posY + throwingEntity.getEyeHeight()); - delZ = -projectile.posZ + throwingEntity.posZ; - } - - double curVel = Math.sqrt(delX * delX + delY * delY + delZ * delZ); - - 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; - } - } - } - - @SubscribeEvent - public static void onPlayerRespawn(PlayerEvent.Clone event) { - if (event.isWasDeath()) - event.getEntityPlayer().addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, 400)); - } - - @SubscribeEvent - public static void onSacrificeKnifeUsed(SacrificeKnifeUsedEvent event) { - if (event.player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY)) - event.lpAdded = (int) (event.lpAdded * 0.1D); - } - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onPlayerDamageEvent(LivingAttackEvent event) { - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.WHIRLWIND) && event.isCancelable() && event.getSource().isProjectile()) - event.setCanceled(true); - } - - @SubscribeEvent - public static void onEndermanTeleportEvent(EnderTeleportEvent event) { - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.PLANAR_BINDING) && event.isCancelable()) { - event.setCanceled(true); - } - } - - @SubscribeEvent - public static void onEntityHurtEvent(LivingDamageEvent event) { - if (event.getSource() == DamageSource.FALL) - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.FEATHERED)) - event.setCanceled(true); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java deleted file mode 100644 index 4cd83fb9..00000000 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ /dev/null @@ -1,145 +0,0 @@ -package WayofTime.bloodmagic.proxy; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.client.helper.ShaderHelper; -import WayofTime.bloodmagic.client.hud.Elements; -import WayofTime.bloodmagic.client.key.KeyBindings; -import WayofTime.bloodmagic.client.render.LayerBloodElytra; -import WayofTime.bloodmagic.client.render.block.*; -import WayofTime.bloodmagic.client.render.entity.*; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.*; -import WayofTime.bloodmagic.entity.projectile.EntityBloodLight; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare; -import WayofTime.bloodmagic.item.types.AlchemicVialType; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.tile.*; -import WayofTime.bloodmagic.tile.routing.TileRoutingNode; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.Constants; - -import com.google.common.collect.ImmutableMap; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.client.renderer.entity.PlayerRenderer; -import net.minecraft.potion.PotionUtils; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.ModelLoaderRegistry; -import net.minecraftforge.client.model.animation.AnimationTESR; -import net.minecraftforge.client.model.obj.OBJLoader; -import net.minecraftforge.common.animation.Event; -import net.minecraftforge.common.animation.ITimeValue; -import net.minecraftforge.common.model.animation.IAnimationStateMachine; -import net.minecraftforge.fml.client.registry.ClientRegistry; -import net.minecraftforge.fml.client.registry.RenderingRegistry; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; - -import java.awt.Color; -import java.util.Map; - -public class ClientProxy extends CommonProxy { - public static DemonWillHolder currentAura = new DemonWillHolder(); - - @Override - public void preInit() { - super.preInit(); - - OBJLoader.INSTANCE.addDomain(BloodMagic.MODID); - - ClientRegistry.bindTileEntitySpecialRenderer(TileInversionPillar.class, new AnimationTESR() { - @Override - public void handleEvents(TileInversionPillar chest, float time, Iterable pastEvents) { - chest.handleEvents(time, pastEvents); - } - }); - - ClientRegistry.bindTileEntitySpecialRenderer(TileAlchemyArray.class, new RenderAlchemyArray()); - ClientRegistry.bindTileEntitySpecialRenderer(TileAltar.class, new RenderAltar()); - ClientRegistry.bindTileEntitySpecialRenderer(TileRoutingNode.class, new RenderItemRoutingNode()); - ClientRegistry.bindTileEntitySpecialRenderer(TileDemonCrucible.class, new RenderDemonCrucible()); - ClientRegistry.bindTileEntitySpecialRenderer(TileMimic.class, new RenderMimic()); - ClientRegistry.bindTileEntitySpecialRenderer(TileBloodTank.class, new RenderBloodTank()); - - // Initialize key-binds during startup so they load correctly - for (KeyBindings key : KeyBindings.values()) - key.getKey(); - } - - @Override - public void registerRenderers() { - RenderingRegistry.registerEntityRenderingHandler(EntitySoulSnare.class, new SoulSnareRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntitySentientArrow.class, new SentientArrowRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityBloodLight.class, new BloodLightRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityMeteor.class, new MeteorRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntitySentientSpecter.class, new SentientSpecterRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityMimic.class, new MimicRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityCorruptedZombie.class, new CorruptedZombieRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityCorruptedSheep.class, new CorruptedSheepRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityCorruptedChicken.class, new CorruptedChickenRenderFactory()); - RenderingRegistry.registerEntityRenderingHandler(EntityCorruptedSpider.class, new CorruptedSpiderRenderFactory()); - - ShaderHelper.init(); - } - - @Override - public void init() { - super.init(); - Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> - { - try { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.COLOR)) - if (tintIndex == 1) - return Color.decode(stack.getTagCompound().getString(Constants.NBT.COLOR)).getRGB(); - } catch (NumberFormatException e) { - return -1; - } - return -1; - }, RegistrarBloodMagicItems.SIGIL_HOLDING); - Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> - { - if (tintIndex != 0 && tintIndex != 2) - return -1; - - if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty")) - return -1; - - return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack)); - }, RegistrarBloodMagicItems.POTION_FLASK); - Minecraft.getInstance().getItemColors().registerItemColorHandler((stack, tintIndex) -> - { -// if (tintIndex != 0 && tintIndex != 2) -// return -1; - - int variant = stack.getMetadata(); - - return AlchemicVialType.getColourForLayer(variant, tintIndex); - }, RegistrarBloodMagicItems.ALCHEMIC_VIAL); - - addElytraLayer(); - } - - @Override - public void postInit() { - Elements.registerElements(); - } - - private void addElytraLayer() { - EntityRendererManager renderManager = Minecraft.getInstance().getRenderManager(); - try { - Map skinMap = ObfuscationReflectionHelper.getPrivateValue(EntityRendererManager.class, renderManager, "skinMap", "field_178636_l"); - skinMap.get("default").addLayer(new LayerBloodElytra(skinMap.get("default"))); - skinMap.get("slim").addLayer(new LayerBloodElytra(skinMap.get("slim"))); - BMLog.DEBUG.info("Elytra layer added"); - } catch (Exception e) { - BMLog.DEBUG.error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade: {}", e.getMessage()); - } - } - - @Override - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { - return ModelLoaderRegistry.loadASM(location, parameters); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java deleted file mode 100644 index d63dc5a5..00000000 --- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.proxy; - -import WayofTime.bloodmagic.ritual.CapabilityRuneType; -import WayofTime.bloodmagic.ritual.IRitualStone; -import WayofTime.bloodmagic.teleport.TeleportQueue; -import com.google.common.collect.ImmutableMap; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.animation.ITimeValue; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.model.animation.IAnimationStateMachine; - -public class CommonProxy { - public void preInit() { - MinecraftForge.EVENT_BUS.register(TeleportQueue.getInstance()); - registerRenderers(); - } - - public void init() { - CapabilityManager.INSTANCE.register(IRitualStone.Tile.class, new CapabilityRuneType.RuneTypeStorage(), new CapabilityRuneType.Factory()); - } - - public void postInit() { - - } - - public void registerRenderers() { - - } - - public Object beamCont(World worldObj, double xi, double yi, double zi, double tx, double ty, double tz, int type, int color, boolean reverse, float endmod, Object input, int impact) { - // TODO Auto-generated method stub - return null; - } - - public IAnimationStateMachine load(ResourceLocation location, ImmutableMap parameters) { - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java deleted file mode 100644 index 2a17628f..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/LivingArmourDowngradeRecipe.java +++ /dev/null @@ -1,151 +0,0 @@ -package WayofTime.bloodmagic.recipe; - -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import com.google.common.collect.ImmutableList; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class LivingArmourDowngradeRecipe { - protected LivingArmourUpgrade upgrade = null; - protected ItemStack keyStack = ItemStack.EMPTY; - protected List input = new ArrayList<>(); - - public LivingArmourDowngradeRecipe(LivingArmourUpgrade upgrade, ItemStack keyStack, Object... recipe) { - this.upgrade = upgrade; - this.keyStack = keyStack; - 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 { - StringBuilder ret = new StringBuilder("Invalid living armour downgrade recipe: "); - for (Object tmp : recipe) { - ret.append(tmp).append(", "); - } - ret.append(upgrade.toString()); - throw new RuntimeException(ret.toString()); - } - } - } - - /** - * Returns the size of the recipe area - */ - public int getRecipeSize() { - return input.size(); - } - - public LivingArmourUpgrade getRecipeOutput() { - return upgrade; - } - - /** - * Used to check if a recipe matches current crafting inventory. World and - * BlockPos are for future-proofing - */ - @SuppressWarnings("unchecked") - public boolean matches(ItemStack key, List checkedList, World world, BlockPos pos) { - if (!OreDictionary.itemMatches(keyStack, key, false)) { - return false; - } - - ArrayList required = new ArrayList<>(input); - - for (ItemStack slot : checkedList) { - if (slot != null) { - boolean inRecipe = false; - - for (Object aRequired : required) { - boolean match = false; - - Object next = aRequired; - - if (next instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) { - Iterator itr = ((List) 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(); - } - - /** - * 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 List getInput() { - return ImmutableList.copyOf(input); - } - - public ItemStack getKey() { - return this.keyStack; - } - - public void consumeInventory(IItemHandler inv) { - for (int i = 0; i < inv.getSlots(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - if (stack.getItem().hasContainerItem(stack)) { - inv.extractItem(i, stack.getCount(), false); - inv.insertItem(i, stack.getItem().getContainerItem(stack), false); - } else { - inv.extractItem(i, 1, false); - } - } - } - - protected ItemStack getContainerItem(ItemStack stack) { - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - ItemStack copyStack = stack.copy(); - - if (copyStack.getItem().hasContainerItem(stack)) { - return copyStack.getItem().getContainerItem(copyStack); - } - - copyStack.shrink(1); - if (copyStack.isEmpty()) { - return ItemStack.EMPTY; - } - - return copyStack; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java deleted file mode 100644 index 21f5936b..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/TartaricForgeRecipe.java +++ /dev/null @@ -1,160 +0,0 @@ -package WayofTime.bloodmagic.recipe; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class TartaricForgeRecipe { - protected ItemStack output = null; - protected List input = new ArrayList<>(); - protected double minimumSouls; - protected double soulsDrained; - - public TartaricForgeRecipe(Block result, double minSouls, double drain, Object... recipe) { - this(new ItemStack(result), minSouls, drain, recipe); - } - - public TartaricForgeRecipe(Item result, double minSouls, double drain, Object... recipe) { - this(new ItemStack(result), minSouls, drain, recipe); - } - - public TartaricForgeRecipe(ItemStack result, double minSouls, double drain, Object... recipe) { - output = result.copy(); - this.minimumSouls = minSouls; - this.soulsDrained = drain; - 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 { - StringBuilder ret = new StringBuilder("Invalid soul forge recipe: "); - for (Object tmp : recipe) { - ret.append(tmp).append(", "); - } - ret.append(output); - throw new RuntimeException(ret.toString()); - } - } - } - - /** - * Returns the size of the recipe area - */ - public int getRecipeSize() { - return input.size(); - } - - public ItemStack getRecipeOutput() { - return output.copy(); - } - - /** - * Used to check if a recipe matches current crafting inventory. World and - * BlockPos are for future-proofing - */ - @SuppressWarnings("unchecked") - public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList<>(input); - - for (ItemStack slot : checkedList) { - if (slot != null) { - boolean inRecipe = false; - - for (Object aRequired : required) { - boolean match = false; - - if (aRequired instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) aRequired, slot, false); - } else if (aRequired instanceof List) { - Iterator itr = ((List) aRequired).iterator(); - while (itr.hasNext() && !match) { - match = OreDictionary.itemMatches(itr.next(), slot, false); - } - } - - if (match) { - inRecipe = true; - required.remove(aRequired); - break; - } - } - - if (!inRecipe) { - return false; - } - } - } - - return required.isEmpty(); - } - - /** - * 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 List getInput() { - return this.input; - } - - public double getMinimumSouls() { - return minimumSouls; - } - - public double getSoulsDrained() { - return soulsDrained; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("output", output) - .append("input", input) - .append("minimumSouls", minimumSouls) - .append("soulsDrained", soulsDrained) - .append("recipeSize", getRecipeSize()) - .append("recipeOutput", getRecipeOutput()) - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TartaricForgeRecipe)) return false; - - TartaricForgeRecipe that = (TartaricForgeRecipe) o; - - if (Double.compare(that.minimumSouls, minimumSouls) != 0) return false; - if (Double.compare(that.soulsDrained, soulsDrained) != 0) return false; - if (output != null ? !output.equals(that.output) : that.output != null) return false; - return input != null ? input.equals(that.input) : that.input == null; - } - - @Override - public int hashCode() { - int result; - long temp; - result = output != null ? output.hashCode() : 0; - result = 31 * result + (input != null ? input.hashCode() : 0); - temp = Double.doubleToLongBits(minimumSouls); - result = 31 * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(soulsDrained); - result = 31 * result + (int) (temp ^ (temp >>> 32)); - return result; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java deleted file mode 100644 index 9e13b9aa..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableCustomRecipe.java +++ /dev/null @@ -1,44 +0,0 @@ -package WayofTime.bloodmagic.recipe.alchemyTable; - -import WayofTime.bloodmagic.iface.ICustomAlchemyConsumable; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -public class AlchemyTableCustomRecipe extends AlchemyTableRecipe { - public AlchemyTableCustomRecipe(Block result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); - } - - public AlchemyTableCustomRecipe(Item result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); - } - - public AlchemyTableCustomRecipe(ItemStack result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - super(result, lpDrained, ticksRequired, tierRequired, recipe); - } - - @Override - protected ItemStack getContainerItem(ItemStack stack) { - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - ItemStack copyStack = stack.copy(); - - if (copyStack.getItem() instanceof ICustomAlchemyConsumable) { - return ((ICustomAlchemyConsumable) copyStack.getItem()).drainUseOnAlchemyCraft(copyStack); - } - - if (copyStack.getItem().hasContainerItem(stack)) { - return copyStack.getItem().getContainerItem(copyStack); - } - - copyStack.shrink(1); - if (copyStack.isEmpty()) { - return ItemStack.EMPTY; - } - - return copyStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java deleted file mode 100644 index 0ea30ab0..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableDyeableRecipe.java +++ /dev/null @@ -1,116 +0,0 @@ -package WayofTime.bloodmagic.recipe.alchemyTable; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.*; -import net.minecraft.item.DyeColor; -import net.minecraft.item.BannerItem; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.List; - -public class AlchemyTableDyeableRecipe extends AlchemyTableRecipe { - private ItemStack inputItem; - - public AlchemyTableDyeableRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem) { - super(inputItem, lpDrained, ticksRequired, tierRequired); - - ArrayList validDyes = new ArrayList<>(); - validDyes.add(new ItemStack(Items.NAME_TAG)); - validDyes.add(new ItemStack(Items.DYE, 1, OreDictionary.WILDCARD_VALUE)); - - ArrayList recipe = new ArrayList<>(); - recipe.add(inputItem); - recipe.add(validDyes); - - this.input = recipe; - - this.inputItem = inputItem; - } - - @Override - public ItemStack getRecipeOutput(List inputList) { - int nameTagOrDyeLocation = -1; - int inputItemLocation = -1; - for (int x = 0; x < inputList.size(); x++) { - ItemStack slot = inputList.get(x); - - if (slot != null) { - boolean match = OreDictionary.itemMatches(inputItem, slot, false); - - if (match) { - inputItemLocation = x; - } else { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { - nameTagOrDyeLocation = x; - } - } - } - } - - if (nameTagOrDyeLocation != -1 && inputItemLocation != -1) { - ItemStack tagOrDyeStack = inputList.get(nameTagOrDyeLocation); - ItemStack inputStack = inputList.get(inputItemLocation); - - if (inputStack.isEmpty() || tagOrDyeStack.isEmpty()) { - return output.copy(); - } - - ItemStack outputStack = inputStack.copy(); - - if (tagOrDyeStack.getItem() == Items.NAME_TAG) { - if (!outputStack.hasTagCompound()) { - outputStack.setTagCompound(new CompoundNBT()); - } - - outputStack.getTagCompound().setString(Constants.NBT.COLOR, tagOrDyeStack.getDisplayName()); - - return outputStack; - } else { - DyeColor dyeColor = BannerItem.getBaseColor(tagOrDyeStack); - if (!outputStack.hasTagCompound()) { - outputStack.setTagCompound(new CompoundNBT()); - } - - outputStack.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); - - return outputStack; - } - } - - return output.copy(); - } - - @Override - public boolean matches(List checkedList, World world, BlockPos pos) { - boolean hasNameTagOrDye = false; - boolean hasInputItem = false; - - for (ItemStack slot : checkedList) { - if (!slot.isEmpty()) { - boolean match = OreDictionary.itemMatches(inputItem, slot, false); - - if (match && hasInputItem) { - return false; - } else if (match) { - hasInputItem = true; - } else { - if (slot.getItem() == Items.NAME_TAG || slot.getItem() == Items.DYE) { - if (hasNameTagOrDye) { - return false; - } else { - hasNameTagOrDye = true; - } - } - } - } - } - - return hasNameTagOrDye && hasInputItem; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java deleted file mode 100644 index 9d6c401d..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionAugmentRecipe.java +++ /dev/null @@ -1,97 +0,0 @@ -package WayofTime.bloodmagic.recipe.alchemyTable; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.potion.BMPotionUtils; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Effect; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.PotionUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class AlchemyTablePotionAugmentRecipe extends AlchemyTablePotionRecipe { - protected double lengthAugment = 0; - protected int powerAugment = 0; - protected Effect wantedPotion; - - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, EffectInstance baseEffect, double lengthAugment, int powerAugment) { - super(lpDrained, ticksRequired, tierRequired, inputItems, baseEffect); - - ArrayList recipe = new ArrayList<>(); - recipe.addAll(inputItems); - recipe.add(getAugmentedPotionFlask(baseEffect)); - - this.input = recipe; - - this.wantedPotion = baseEffect.getPotion(); - this.lengthAugment = lengthAugment; - this.powerAugment = powerAugment; - } - - public AlchemyTablePotionAugmentRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, EffectInstance baseEffect, double lengthAugment, int powerAugment) { - this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect, lengthAugment, powerAugment); - } - - @Override - public boolean isPotionFlaskValidInput(ItemStack stack) { - List effectList = PotionUtils.getEffectsFromStack(stack); - for (EffectInstance eff : effectList) { - if (eff.getPotion() == wantedPotion) { - double currentAugment = BMPotionUtils.getLengthAugment(stack, wantedPotion); - - return currentAugment < lengthAugment || eff.getAmplifier() < powerAugment; - } - } - - return false; - } - - @Override - public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { - if (inputStack.isEmpty()) { - ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - - List effectList = new ArrayList<>(); - int potionLength = wantedPotion.isInstant() ? 1 : BMPotionUtils.getAugmentedLength(baseEffect.getDuration(), lengthAugment, powerAugment - baseEffect.getAmplifier()); - effectList.add(new EffectInstance(wantedPotion, potionLength, powerAugment - baseEffect.getAmplifier())); - - BMPotionUtils.setEffects(outputStack, effectList); - - return outputStack; - } - - ItemStack outputStack = inputStack.copy(); - - List effectList = PotionUtils.getEffectsFromStack(outputStack); - List newEffectList = new ArrayList<>(); - - for (EffectInstance effect : effectList) { - if (effect.getPotion() == wantedPotion) { - double currentLengthAugment = Math.max(lengthAugment, BMPotionUtils.getLengthAugment(outputStack, wantedPotion)); - int currentPowerAugment = Math.max(powerAugment, effect.getAmplifier()); - int potionLength = wantedPotion.isInstant() ? 1 : BMPotionUtils.getAugmentedLength(baseEffect.getDuration(), currentLengthAugment, currentPowerAugment); - newEffectList.add(new EffectInstance(wantedPotion, potionLength, currentPowerAugment)); - BMPotionUtils.setLengthAugment(outputStack, wantedPotion, currentLengthAugment); - } else { - newEffectList.add(effect); - } - } - - BMPotionUtils.setEffects(outputStack, newEffectList); - - return outputStack; - } - - public static ItemStack getAugmentedPotionFlask(EffectInstance baseEffect) { - ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - - List effectList = new ArrayList<>(); - effectList.add(baseEffect); - - BMPotionUtils.setEffects(outputStack, effectList); - - return outputStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java deleted file mode 100644 index 6a7874d9..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTablePotionRecipe.java +++ /dev/null @@ -1,139 +0,0 @@ -package WayofTime.bloodmagic.recipe.alchemyTable; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.PotionUtils; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -public class AlchemyTablePotionRecipe extends AlchemyTableRecipe { - public static final ItemStack basePotionFlaskStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK, 1, OreDictionary.WILDCARD_VALUE); - public static final int temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember = 3; - protected EffectInstance baseEffect; - protected double baseAddedImpurity = 5; - - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, List inputItems, EffectInstance baseEffect) { - super(basePotionFlaskStack, lpDrained, ticksRequired, tierRequired); - - ArrayList recipe = new ArrayList<>(); - recipe.addAll(inputItems); - recipe.add(basePotionFlaskStack); - - this.input = recipe; - this.baseEffect = baseEffect; - } - - public AlchemyTablePotionRecipe(int lpDrained, int ticksRequired, int tierRequired, ItemStack inputItem, EffectInstance baseEffect) { - this(lpDrained, ticksRequired, tierRequired, Collections.singletonList(inputItem), baseEffect); - } - - @Override - public ItemStack getRecipeOutput(List inputList) { - int flaskLocation = -1; - for (int x = 0; x < inputList.size(); x++) { - ItemStack slot = inputList.get(x); - - if (slot != null) { - boolean match = slot.getItem() == RegistrarBloodMagicItems.POTION_FLASK; - - if (match) { - flaskLocation = x; - } - } - } - - if (flaskLocation != -1) { - return getModifiedFlaskForInput(inputList.get(flaskLocation)); - } - - return getModifiedFlaskForInput(ItemStack.EMPTY); - } - - @Override - public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList<>(input); - - for (ItemStack slot : checkedList) { - if (slot != null) { - boolean inRecipe = false; - - for (Object aRequired : required) { - boolean match = false; - - Object next = aRequired; - - if (next instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) next, slot, false); - } else if (next instanceof List) { - Iterator itr = ((List) next).iterator(); - while (itr.hasNext() && !match) { - match = OreDictionary.itemMatches(itr.next(), slot, false); - } - } - - if (match) { - if (next instanceof ItemStack && ((ItemStack) next).getItem() == RegistrarBloodMagicItems.POTION_FLASK) { - if (!isPotionFlaskValidInput(slot)) { - break; - } - } - - inRecipe = true; - required.remove(next); - break; - } - } - - if (!inRecipe) { - return false; - } - } - } - - return required.isEmpty(); - } - - public boolean isPotionFlaskValidInput(ItemStack stack) { - List effectList = PotionUtils.getEffectsFromStack(stack); - if (effectList.size() >= temporaryMaximumEffectsOnThePotionFlaskYesThisIsALongFieldItIsJustSoIRemember) { - return false; - } - - for (EffectInstance eff : effectList) { - if (eff.getPotion() == baseEffect.getPotion()) { - return false; - } - } - - return true; - } - - public ItemStack getModifiedFlaskForInput(ItemStack inputStack) { - if (inputStack.isEmpty()) { - ItemStack outputStack = new ItemStack(RegistrarBloodMagicItems.POTION_FLASK); - - List effectList = new ArrayList<>(); - effectList.add(baseEffect); - - PotionUtils.appendEffects(outputStack, effectList); - - return outputStack; - } - - ItemStack outputStack = inputStack.copy(); - - List effectList = PotionUtils.getEffectsFromStack(outputStack); - effectList.add(baseEffect); - - PotionUtils.appendEffects(outputStack, effectList); - - return outputStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java b/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java deleted file mode 100644 index a845963a..00000000 --- a/src/main/java/WayofTime/bloodmagic/recipe/alchemyTable/AlchemyTableRecipe.java +++ /dev/null @@ -1,201 +0,0 @@ -package WayofTime.bloodmagic.recipe.alchemyTable; - -import com.google.common.collect.ImmutableList; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class AlchemyTableRecipe { - protected ItemStack output = ItemStack.EMPTY; - protected ArrayList input = new ArrayList<>(); - protected int lpDrained; - protected int ticksRequired; - protected int tierRequired; - - public AlchemyTableRecipe(Block result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); - } - - public AlchemyTableRecipe(Item result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - this(new ItemStack(result), lpDrained, ticksRequired, tierRequired, recipe); - } - - public AlchemyTableRecipe(ItemStack result, int lpDrained, int ticksRequired, int tierRequired, Object... recipe) { - output = result.copy(); - this.lpDrained = lpDrained; - this.ticksRequired = ticksRequired; - this.tierRequired = tierRequired; - 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 { - StringBuilder ret = new StringBuilder("Invalid alchemy recipe: "); - for (Object tmp : recipe) { - ret.append(tmp).append(", "); - } - ret.append(output); - throw new RuntimeException(ret.toString()); - } - } - } - - /** - * Returns the size of the recipe area - */ - public int getRecipeSize() { - return input.size(); - } - - /** - * Returns the output of the recipe, sensitive to the input list provided. - * If the input list does not technically match, the recipe should return - * the default output. - * - * @param inputList - * @return - */ - public ItemStack getRecipeOutput(List inputList) { - return output.copy(); - } - - /** - * Used to check if a recipe matches current crafting inventory. World and - * BlockPos are for future-proofing - */ - @SuppressWarnings("unchecked") - public boolean matches(List checkedList, World world, BlockPos pos) { - ArrayList required = new ArrayList<>(input); - - for (ItemStack slot : checkedList) { - if (!slot.isEmpty()) { - boolean inRecipe = false; - - for (Object aRequired : required) { - boolean match = false; - - if (aRequired instanceof ItemStack) { - match = OreDictionary.itemMatches((ItemStack) aRequired, slot, false); - } else if (aRequired instanceof List) { - Iterator itr = ((List) aRequired).iterator(); - while (itr.hasNext() && !match) { - match = OreDictionary.itemMatches(itr.next(), slot, false); - } - } - - if (match) { - inRecipe = true; - required.remove(aRequired); - break; - } - } - - if (!inRecipe) { - return false; - } - } - } - - return required.isEmpty(); - } - - /** - * 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 List getInput() { - return ImmutableList.copyOf(input); - } - - public ItemStack[] getRemainingItems(ItemStack[] inventory) { - ItemStack[] ret = inventory.clone(); - for (int i = 0; i < ret.length; i++) { - ret[i] = getContainerItem(inventory[i]); - } - - return ret; - } - - protected ItemStack getContainerItem(ItemStack stack) { - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - ItemStack copyStack = stack.copy(); - - if (copyStack.getItem().hasContainerItem(stack)) { - return copyStack.getItem().getContainerItem(copyStack); - } - - copyStack.shrink(1); - if (copyStack.isEmpty()) { - return ItemStack.EMPTY; - } - - return copyStack; - } - - public int getLpDrained() { - return lpDrained; - } - - public int getTicksRequired() { - return ticksRequired; - } - - public int getTierRequired() { - return tierRequired; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("output", output) - .append("input", input) - .append("lpDrained", lpDrained) - .append("ticksRequired", ticksRequired) - .append("tierRequired", tierRequired) - .append("recipeSize", getRecipeSize()) - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof AlchemyTableRecipe)) return false; - - AlchemyTableRecipe that = (AlchemyTableRecipe) o; - - if (lpDrained != that.lpDrained) return false; - if (ticksRequired != that.ticksRequired) return false; - if (tierRequired != that.tierRequired) return false; - if (output != null ? !output.equals(that.output) : that.output != null) return false; - return input != null ? input.equals(that.input) : that.input == null; - } - - @Override - public int hashCode() { - int result = output != null ? output.hashCode() : 0; - result = 31 * result + (input != null ? input.hashCode() : 0); - result = 31 * result + lpDrained; - result = 31 * result + ticksRequired; - result = 31 * result + tierRequired; - return result; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java b/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java deleted file mode 100644 index 931169b8..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModArmourTrackers.java +++ /dev/null @@ -1,66 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.livingArmour.downgrade.*; -import WayofTime.bloodmagic.livingArmour.tracker.*; -import WayofTime.bloodmagic.livingArmour.upgrade.*; - -public class ModArmourTrackers { - public static void init() { - LivingArmourHandler.registerStatTracker(StatTrackerMovement.class); - LivingArmourHandler.registerStatTracker(StatTrackerDigging.class); - LivingArmourHandler.registerStatTracker(StatTrackerPoison.class); - LivingArmourHandler.registerStatTracker(StatTrackerSelfSacrifice.class); - LivingArmourHandler.registerStatTracker(StatTrackerFood.class); - LivingArmourHandler.registerStatTracker(StatTrackerPhysicalProtect.class); - LivingArmourHandler.registerStatTracker(StatTrackerHealthboost.class); - LivingArmourHandler.registerStatTracker(StatTrackerMeleeDamage.class); - LivingArmourHandler.registerStatTracker(StatTrackerArrowShot.class); - LivingArmourHandler.registerStatTracker(StatTrackerGrimReaperSprint.class); - LivingArmourHandler.registerStatTracker(StatTrackerSolarPowered.class); - LivingArmourHandler.registerStatTracker(StatTrackerExperience.class); - LivingArmourHandler.registerStatTracker(StatTrackerJump.class); - LivingArmourHandler.registerStatTracker(StatTrackerFallProtect.class); - LivingArmourHandler.registerStatTracker(StatTrackerGraveDigger.class); - LivingArmourHandler.registerStatTracker(StatTrackerStepAssist.class); - LivingArmourHandler.registerStatTracker(StatTrackerSprintAttack.class); - LivingArmourHandler.registerStatTracker(StatTrackerCriticalStrike.class); - LivingArmourHandler.registerStatTracker(StatTrackerFireResist.class); - LivingArmourHandler.registerStatTracker(StatTrackerNightSight.class); - LivingArmourHandler.registerStatTracker(StatTrackerRepairing.class); - - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSpeed(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeDigging(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradePoisonResist(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSelfSacrifice(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeKnockbackResist(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradePhysicalProtect(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeHealthboost(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeMeleeDamage(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeArrowShot(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeStepAssist(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeGrimReaperSprint(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSolarPowered(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeExperience(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeJump(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeFallProtect(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeGraveDigger(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSprintAttack(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeCriticalStrike(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeElytra(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeFireResist(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeNightSight(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeRepairing(0)); - - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSlowness(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeCrippledArm(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSlippery(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeBattleHungry(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeQuenched(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeMeleeDecrease(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeDisoriented(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeDigSlowdown(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeStormTrooper(0)); - LivingArmourHandler.registerArmourUpgrade(new LivingArmourUpgradeSlowHeal(0)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java deleted file mode 100644 index c18f6f11..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModCorruptionBlocks.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.inversion.CorruptionHandler; -import net.minecraft.block.Blocks; - -public class ModCorruptionBlocks { - public static void init() { - for (EnumDemonWillType type : EnumDemonWillType.values()) { - CorruptionHandler.registerBlockCorruption(type, Blocks.STONE, 0, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); - CorruptionHandler.registerBlockCorruption(type, Blocks.GRASS, 0, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); - CorruptionHandler.registerBlockCorruption(type, Blocks.DIRT, 0, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(type.ordinal())); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java deleted file mode 100644 index 0d7ee452..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java +++ /dev/null @@ -1,273 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import net.minecraft.block.Blocks; -import net.minecraft.item.Items; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.oredict.OreDictionary; - -import org.apache.commons.lang3.tuple.Pair; - -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectArrowTurret; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectAttractor; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBinding; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectBounce; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectFurnaceFuel; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectLaputa; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMobSacrifice; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectMovement; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSigil; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSkeletonTurret; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectSpike; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectTeleport; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectUpdraft; -import WayofTime.bloodmagic.client.render.alchemyArray.AttractorAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.BindingAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.DualAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.LowAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.LowStaticAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.MobSacrificeAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.SingleAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.StaticAlchemyCircleRenderer; -import WayofTime.bloodmagic.client.render.alchemyArray.TurretAlchemyCircleRenderer; -import WayofTime.bloodmagic.compress.AdvancedCompressionHandler; -import WayofTime.bloodmagic.compress.BaseCompressionHandler; -import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.compress.StorageBlockCraftingManager; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.iface.ISigil; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeBattleHungry; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeCrippledArm; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeDigSlowdown; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeDisoriented; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeMeleeDecrease; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeQuenched; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowHeal; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowness; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeStormTrooper; -import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableDyeableRecipe; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTablePotionRecipe; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.Utils; - -import com.google.common.base.Stopwatch; - -public class ModRecipes { - - static ItemStack mundaneLengtheningStack = ComponentTypes.CATALYST_LENGTH_1.getStack(); - static ItemStack mundanePowerStack = ComponentTypes.CATALYST_POWER_1.getStack(); - - public static void init() { - initOreDict(); - addFurnaceRecipes(); - addAltarRecipes(); - addAlchemyArrayRecipes(); - addAlchemyTableRecipes(); - addPotionRecipes(); - addLivingArmourDowngradeRecipes(); - addCompressionHandlers(); - } - - public static void initOreDict() { - OreDictionary.registerOre("dustIron", ComponentTypes.SAND_IRON.getStack()); - OreDictionary.registerOre("dustGold", ComponentTypes.SAND_GOLD.getStack()); - OreDictionary.registerOre("dustCoal", ComponentTypes.SAND_COAL.getStack()); - OreDictionary.registerOre("dustSulfur", ComponentTypes.SULFUR.getStack()); - OreDictionary.registerOre("dustSaltpeter", ComponentTypes.SALTPETER.getStack()); - } - - public static void addFurnaceRecipes() { - FurnaceRecipes.instance().addSmeltingRecipe(ComponentTypes.SAND_IRON.getStack(), new ItemStack(Items.IRON_INGOT), (float) 0.15); - FurnaceRecipes.instance().addSmeltingRecipe(ComponentTypes.SAND_GOLD.getStack(), new ItemStack(Items.GOLD_INGOT), (float) 0.15); - } - - public static void addAltarRecipes() { - - } - - public static void addAlchemyArrayRecipes() { - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_SWORD), new AlchemyArrayEffectBinding("boundSword", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SWORD))), new BindingAlchemyCircleRenderer()); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_AXE), new AlchemyArrayEffectBinding("boundAxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_AXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_PICKAXE), new AlchemyArrayEffectBinding("boundPickaxe", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_PICKAXE)))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.DIAMOND_SHOVEL), new AlchemyArrayEffectBinding("boundShovel", Utils.setUnbreakable(new ItemStack(RegistrarBloodMagicItems.BOUND_SHOVEL)))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.IRON_HELMET), new AlchemyArrayEffectBinding("livingHelmet", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.IRON_CHESTPLATE), new AlchemyArrayEffectBinding("livingChest", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_CHEST))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.IRON_LEGGINGS), new AlchemyArrayEffectBinding("livingLegs", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_LEGGINGS))); - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_BINDING.getStack(), new ItemStack(Items.IRON_BOOTS), new AlchemyArrayEffectBinding("livingBoots", new ItemStack(RegistrarBloodMagicItems.LIVING_ARMOUR_BOOTS))); - - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ROTTEN_FLESH), new ItemStack(Items.ROTTEN_FLESH), new AlchemyArrayEffectAttractor("attractor"), new AttractorAlchemyCircleRenderer()); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.FEATHER), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectMovement("movement"), new StaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/MovementArray.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.FEATHER), new ItemStack(Items.GLOWSTONE_DUST), new AlchemyArrayEffectUpdraft("updraft"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/UpdraftArray.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.SLIME_BALL), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectBounce("bounce"), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/BounceArray.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.COAL), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectFurnaceFuel("furnace"), new LowAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FurnaceArray.png"))); - - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ARROW), new ItemStack(Items.FEATHER), new AlchemyArrayEffectSkeletonTurret("skeletonTurret"), new DualAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png"))); - - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ENDER_PEARL), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectTeleport("teleport"), new StaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/teleportation.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.BOW), new ItemStack(Items.ARROW), new AlchemyArrayEffectArrowTurret("turret"), new TurretAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.REDSTONE), new ItemStack(Blocks.LAPIS_BLOCK), new AlchemyArrayEffectLaputa("laputa"), new AttractorAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/shardoflaputa.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Blocks.COBBLESTONE), new ItemStack(Items.IRON_INGOT), new AlchemyArrayEffectSpike("spike"), new LowStaticAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/spikearray.png"))); - AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Blocks.REDSTONE_BLOCK), new ItemStack(Items.REDSTONE), new AlchemyArrayEffectMobSacrifice("mobSacrifice"), new MobSacrificeAlchemyCircleRenderer()); - - AlchemyArrayRecipeRegistry.registerRecipe(ComponentTypes.REAGENT_FAST_MINER.getStack(), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) RegistrarBloodMagicItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png"))); - - } - - public static void addCompressionHandlers() { - Stopwatch stopwatch = Stopwatch.createStarted(); - StorageBlockCraftingManager.getInstance().addStorageBlockRecipes(); - - CompressionRegistry.registerHandler(new BaseCompressionHandler(new ItemStack(Items.GLOWSTONE_DUST, 4, 0), new ItemStack(Blocks.GLOWSTONE), 64)); - CompressionRegistry.registerHandler(new BaseCompressionHandler(new ItemStack(Items.SNOWBALL, 4, 0), new ItemStack(Blocks.SNOW), 8)); - CompressionRegistry.registerHandler(new AdvancedCompressionHandler()); - - stopwatch.stop(); - - BMLog.DEBUG.info("Added compression recipes in {}", stopwatch); - } - - public static void addAlchemyTableRecipes() { - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTableDyeableRecipe(0, 100, 0, new ItemStack(RegistrarBloodMagicItems.SIGIL_HOLDING))); - } - - public static void addPotionRecipes() { - addPotionRecipe(1000, 1, new ItemStack(Items.GHAST_TEAR), new EffectInstance(Effects.REGENERATION, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.GOLDEN_CARROT), new EffectInstance(Effects.NIGHT_VISION, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.MAGMA_CREAM), new EffectInstance(Effects.FIRE_RESISTANCE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.WATER_BUCKET), new EffectInstance(Effects.WATER_BREATHING, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.SUGAR), new EffectInstance(Effects.SPEED, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.SPECKLED_MELON), new EffectInstance(Effects.INSTANT_HEALTH, 1)); - addPotionRecipe(1000, 1, new ItemStack(Items.SPIDER_EYE), new EffectInstance(Effects.POISON, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.DYE, 1, 0), new EffectInstance(Effects.BLINDNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.FERMENTED_SPIDER_EYE), new EffectInstance(Effects.WEAKNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.BLAZE_POWDER), new EffectInstance(Effects.STRENGTH, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.FEATHER), new EffectInstance(Effects.JUMP_BOOST, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.CLAY_BALL), new EffectInstance(Effects.SLOWNESS, 450)); - addPotionRecipe(1000, 1, new ItemStack(Items.REDSTONE), new EffectInstance(Effects.HASTE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.GLASS_BOTTLE), new EffectInstance(Effects.INVISIBILITY, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.POISONOUS_POTATO), new EffectInstance(Effects.SATURATION, 1)); - addPotionRecipe(1000, 1, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0), new EffectInstance(Effects.HEALTH_BOOST, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Blocks.SLIME_BLOCK), new EffectInstance(RegistrarBloodMagic.BOUNCE, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.STRING), new EffectInstance(RegistrarBloodMagic.CLING, 2 * 60 * 20)); - addPotionRecipe(1000, 1, new ItemStack(Items.CAKE), new EffectInstance(RegistrarBloodMagic.FLIGHT, 2 * 60 * 20)); - - addPotionRecipe(1000, 1, new ItemStack(Items.BEETROOT), new EffectInstance(RegistrarBloodMagic.DEAFNESS, 450)); - } - - public static void addPotionRecipe(int lpDrained, int tier, ItemStack inputStack, EffectInstance baseEffect) { - AlchemyTableRecipeRegistry.registerRecipe(new AlchemyTablePotionRecipe(lpDrained, 100, tier, inputStack, baseEffect)); - - List lengtheningList = new ArrayList<>(); - lengtheningList.add(inputStack); - lengtheningList.add(mundaneLengtheningStack); - AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getLengthAugmentRecipe(lpDrained, 100, tier, lengtheningList, baseEffect, 1)); - - List powerList = new ArrayList<>(); - powerList.add(inputStack); - powerList.add(mundanePowerStack); - AlchemyTableRecipeRegistry.registerRecipe(BMPotionUtils.getPowerAugmentRecipe(lpDrained, 100, tier, powerList, baseEffect, 1)); - } - - public static void addLivingArmourDowngradeRecipes() { - String messageBase = "ritual.bloodmagic.downgradeRitual.dialogue."; - - ItemStack bowStack = new ItemStack(Items.BOW); - ItemStack bottleStack = new ItemStack(Items.POTIONITEM, 1, 0); - ItemStack swordStack = new ItemStack(Items.STONE_SWORD); - ItemStack goldenAppleStack = new ItemStack(Items.GOLDEN_APPLE); - ItemStack fleshStack = new ItemStack(Items.ROTTEN_FLESH); - ItemStack shieldStack = new ItemStack(Items.SHIELD); - ItemStack pickStack = new ItemStack(Items.STONE_PICKAXE); - ItemStack minecartStack = new ItemStack(Items.MINECART); - ItemStack stringStack = new ItemStack(Items.STRING); - - Map> dialogueMap = new HashMap<>(); - dialogueMap.put(bowStack, Pair.of("bow", new int[]{1, 100, 300, 500})); - dialogueMap.put(bottleStack, Pair.of("quenched", new int[]{1, 100, 300, 500})); - dialogueMap.put(swordStack, Pair.of("dulledBlade", new int[]{1, 100, 300, 500, 700})); - dialogueMap.put(goldenAppleStack, Pair.of("slowHeal", new int[]{1, 100, 300, 500, 700})); - - for (Entry> entry : dialogueMap.entrySet()) { - ItemStack keyStack = entry.getKey(); - String str = entry.getValue().getKey(); - Map> textMap = new HashMap<>(); - for (int tick : entry.getValue().getValue()) { - List textList = new ArrayList<>(); - textList.add(new TranslationTextComponent("\u00A74%s", new TranslationTextComponent(messageBase + str + "." + tick))); - textMap.put(tick, textList); - } - - LivingArmourDowngradeRecipeRegistry.registerDialog(keyStack, textMap); - } - - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(0), bowStack, Items.ARROW, "string", "ingotIron", "ingotIron"); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(1), bowStack, Items.SPECTRAL_ARROW, "ingotGold", "dustRedstone", "dustGlowstone", "gemLapis"); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(2), bowStack, "gemDiamond", Items.FIRE_CHARGE, Items.BLAZE_ROD, "feather"); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(3), bowStack, Items.PRISMARINE_SHARD, Items.BLAZE_ROD, "feather", "feather"); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeStormTrooper(4), bowStack, new ItemStack(Items.TIPPED_ARROW, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(Items.TIPPED_ARROW, 1, OreDictionary.WILDCARD_VALUE), new ItemStack(Items.TIPPED_ARROW, 1, OreDictionary.WILDCARD_VALUE)); -// LivingArmourDowngradeRecipeRegistry.registerDialog(bowStack, bowMap); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeQuenched(0), bottleStack, Items.DRAGON_BREATH); - LivingArmourDowngradeRecipeRegistry.registerRecipe(new LivingArmourUpgradeCrippledArm(0), shieldStack, "gemDiamond"); - - for (int i = 0; i < 10; i++) { - addRecipeForTieredDowngrade(new LivingArmourUpgradeMeleeDecrease(i), swordStack, i); - addRecipeForTieredDowngrade(new LivingArmourUpgradeSlowHeal(i), goldenAppleStack, i); - addRecipeForTieredDowngrade(new LivingArmourUpgradeBattleHungry(i), fleshStack, i); - addRecipeForTieredDowngrade(new LivingArmourUpgradeDigSlowdown(i), pickStack, i); - addRecipeForTieredDowngrade(new LivingArmourUpgradeDisoriented(i), minecartStack, i); - addRecipeForTieredDowngrade(new LivingArmourUpgradeSlowness(i), stringStack, i); - } - } - - public static void addRecipeForTieredDowngrade(LivingArmourUpgrade upgrade, ItemStack stack, int tier) { - switch (tier) { - case 0: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); - break; - case 1: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "dustRedstone", "dustRedstone", "ingotIron", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 0)); - break; - case 2: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, "ingotGold", "gemLapis", "gemLapis", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); - break; - case 3: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.VINE, "dyeRed", Items.GOLDEN_CARROT, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 1)); - break; - case 4: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.GOLDEN_APPLE, "treeSapling", "treeSapling", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - break; - case 5: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.REDSTONE_BLOCK, new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 2)); - break; - case 6: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.IRON_BLOCK, Blocks.GLOWSTONE, "ingotGold", "ingotGold", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); - break; - case 7: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Blocks.GOLD_BLOCK, Blocks.LAPIS_BLOCK, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 3)); - break; - case 8: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.DRAGON_BREATH, "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); - break; - case 9: - LivingArmourDowngradeRecipeRegistry.registerRecipe(upgrade, stack, Items.NETHER_STAR, "gemDiamond", "gemDiamond", new ItemStack(RegistrarBloodMagicItems.SLATE, 1, 4)); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java b/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java deleted file mode 100644 index 548b58b4..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModRituals.java +++ /dev/null @@ -1,28 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; -import WayofTime.bloodmagic.ritual.crushing.CrushingHandlerCuttingFluid; -import WayofTime.bloodmagic.ritual.crushing.CrushingRegistry; -import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; -import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable; -import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem; -import WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall; -import net.minecraft.block.Blocks; - -public class ModRituals { - // TODO Move elsewhere - public static void initHarvestHandlers() { - HarvestRegistry.registerRangeAmplifier(Blocks.DIAMOND_BLOCK.getDefaultState(), 15); - HarvestRegistry.registerRangeAmplifier(Blocks.GOLD_BLOCK.getDefaultState(), 10); - HarvestRegistry.registerRangeAmplifier(Blocks.IRON_BLOCK.getDefaultState(), 6); - - HarvestRegistry.registerHandler(new HarvestHandlerPlantable()); - HarvestRegistry.registerHandler(new HarvestHandlerTall()); - HarvestRegistry.registerHandler(new HarvestHandlerStem()); - } - - public static void initCuttingFluids() { - CrushingRegistry.registerCuttingFluid(new CrushingHandlerCuttingFluid(ItemCuttingFluid.FluidType.BASIC.getStack(), 250, 0.5)); - CrushingRegistry.registerCuttingFluid(new CrushingHandlerCuttingFluid(ItemCuttingFluid.FluidType.EXPLOSIVE.getStack(), 25, 0.05)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java deleted file mode 100644 index e8d5b9d3..00000000 --- a/src/main/java/WayofTime/bloodmagic/registry/ModTranquilityHandlers.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.registry; - -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.incense.EnumTranquilityType; -import WayofTime.bloodmagic.incense.IncenseTranquilityRegistry; -import WayofTime.bloodmagic.incense.TranquilityStack; -import net.minecraft.block.LeavesBlock; -import net.minecraft.block.LogBlock; -import net.minecraft.block.FireBlock; -import net.minecraft.block.GrassBlock; - -public class ModTranquilityHandlers { - - public static void init() { - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof LeavesBlock ? new TranquilityStack(EnumTranquilityType.PLANT, 1.0D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof FireBlock ? new TranquilityStack(EnumTranquilityType.FIRE, 1.0D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof GrassBlock ? new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof LogBlock ? new TranquilityStack(EnumTranquilityType.TREE, 1.0D) : null); - IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BloodMagicAPI.INSTANCE.getValueManager().getTranquility().get(state)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java b/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java deleted file mode 100644 index a4117e2f..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/AreaDescriptor.java +++ /dev/null @@ -1,549 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.gen.feature.template.PlacementSettings; -import net.minecraft.world.gen.feature.template.Template; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -public abstract class AreaDescriptor implements Iterator { - public List getContainedPositions(BlockPos pos) { - return new ArrayList<>(); - } - - public AxisAlignedBB getAABB(BlockPos pos) { - return null; - } - - public abstract void resetCache(); - - public abstract boolean isWithinArea(BlockPos pos); - - public abstract void resetIterator(); - - public void readFromNBT(CompoundNBT tag) { - - } - - public void writeToNBT(CompoundNBT tag) { - - } - - public abstract AreaDescriptor copy(); - - public abstract int getVolumeForOffsets(BlockPos offset1, BlockPos offset2); - - public abstract boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit); - - public abstract int getVolume(); - - public abstract int getHeight(); - - public abstract boolean isWithinRange(int verticalLimit, int horizontalLimit); - - /** - * This method changes the area descriptor so that its range matches the two - * blocks that are selected. When implementing this method, assume that - * these positions are the blocks that are clicked by the player. - * - * @param pos1 - * @param pos2 - */ - public abstract void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2); - - public abstract boolean intersects(AreaDescriptor descriptor); - - public abstract AreaDescriptor offset(BlockPos offset); - - public abstract AreaDescriptor rotateDescriptor(PlacementSettings settings); - - public static class Rectangle extends AreaDescriptor { - protected BlockPos minimumOffset; - protected BlockPos maximumOffset; // Non-inclusive maximum offset. - private BlockPos currentPosition; - - private ArrayList blockPosCache; - private BlockPos cachedPosition; - - private boolean cache = true; - - /** - * This constructor takes in the minimum and maximum BlockPos. The - * maximum offset is non-inclusive, meaning if you pass in (0,0,0) and - * (1,1,1), calling getContainedPositions() will only give (0,0,0). - * - * @param minimumOffset - - * @param maximumOffset - - */ - public Rectangle(BlockPos minimumOffset, BlockPos maximumOffset) { - setOffsets(minimumOffset, maximumOffset); - } - - public Rectangle(BlockPos minimumOffset, int sizeX, int sizeY, int sizeZ) { - this(minimumOffset, minimumOffset.add(sizeX, sizeY, sizeZ)); - } - - public Rectangle(BlockPos minimumOffset, int size) { - this(minimumOffset, size, size, size); - } - - public Rectangle(AreaDescriptor.Rectangle rectangle) { - this(rectangle.minimumOffset, rectangle.maximumOffset); - } - - public AreaDescriptor.Rectangle copy() { - return new AreaDescriptor.Rectangle(this); - } - - @Override - public List getContainedPositions(BlockPos pos) { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - ArrayList posList = new ArrayList<>(); - - for (int j = minimumOffset.getY(); j < maximumOffset.getY(); j++) { - for (int i = minimumOffset.getX(); i < maximumOffset.getX(); i++) { - for (int k = minimumOffset.getZ(); k < maximumOffset.getZ(); k++) { - posList.add(pos.add(i, j, k)); - } - } - } - - blockPosCache = posList; - cachedPosition = pos; - } - - return Collections.unmodifiableList(blockPosCache); - } - - @Override - public AxisAlignedBB getAABB(BlockPos pos) { - AxisAlignedBB tempAABB = new AxisAlignedBB(minimumOffset, maximumOffset); - return tempAABB.offset(pos.getX(), pos.getY(), pos.getZ()); - } - - @Override - public int getHeight() { - return this.maximumOffset.getY() - this.minimumOffset.getY(); - } - - public BlockPos getMinimumOffset() { - return minimumOffset; - } - - public BlockPos getMaximumOffset() { - return maximumOffset; - } - - /** - * Sets the offsets of the AreaDescriptor in a safe way that will make - * minimumOffset the lowest corner - * - * @param offset1 - - * @param offset2 - - */ - public void setOffsets(BlockPos offset1, BlockPos offset2) { - this.minimumOffset = new BlockPos(Math.min(offset1.getX(), offset2.getX()), Math.min(offset1.getY(), offset2.getY()), Math.min(offset1.getZ(), offset2.getZ())); - this.maximumOffset = new BlockPos(Math.max(offset1.getX(), offset2.getX()), Math.max(offset1.getY(), offset2.getY()), Math.max(offset1.getZ(), offset2.getZ())); - blockPosCache = new ArrayList<>(); - } - - @Override - public void resetCache() { - this.blockPosCache = new ArrayList<>(); - } - - @Override - public boolean isWithinArea(BlockPos pos) { - int x = pos.getX(); - int y = pos.getY(); - int z = pos.getZ(); - - return x >= minimumOffset.getX() && x < maximumOffset.getX() && y >= minimumOffset.getY() && y < maximumOffset.getY() && z >= minimumOffset.getZ() && z < maximumOffset.getZ(); - } - - @Override - public boolean hasNext() { - return currentPosition == null || !(currentPosition.getX() + 1 == maximumOffset.getX() && currentPosition.getY() + 1 == maximumOffset.getY() && currentPosition.getZ() + 1 == maximumOffset.getZ()); - } - - @Override - public BlockPos next() { - if (currentPosition != null) { - int nextX = currentPosition.getX() + 1 >= maximumOffset.getX() ? minimumOffset.getX() : currentPosition.getX() + 1; - int nextZ = nextX != minimumOffset.getX() ? currentPosition.getZ() : (currentPosition.getZ() + 1 >= maximumOffset.getZ() ? minimumOffset.getZ() : currentPosition.getZ() + 1); - int nextY = (nextZ != minimumOffset.getZ() || nextX != minimumOffset.getX()) ? currentPosition.getY() : (currentPosition.getY() + 1); - currentPosition = new BlockPos(nextX, nextY, nextZ); - } else { - currentPosition = minimumOffset; - } - - return currentPosition; - } - - @Override - public void remove() { - - } - - @Override - public void resetIterator() { - currentPosition = null; - } - - @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { - setOffsets(pos1, pos2); - maximumOffset = maximumOffset.add(1, 1, 1); - resetIterator(); - resetCache(); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - minimumOffset = new BlockPos(tag.getInt(Constants.NBT.X_COORD + "min"), tag.getInt(Constants.NBT.Y_COORD + "min"), tag.getInt(Constants.NBT.Z_COORD + "min")); - maximumOffset = new BlockPos(tag.getInt(Constants.NBT.X_COORD + "max"), tag.getInt(Constants.NBT.Y_COORD + "max"), tag.getInt(Constants.NBT.Z_COORD + "max")); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - tag.putInt(Constants.NBT.X_COORD + "min", minimumOffset.getX()); - tag.putInt(Constants.NBT.Y_COORD + "min", minimumOffset.getY()); - tag.putInt(Constants.NBT.Z_COORD + "min", minimumOffset.getZ()); - tag.putInt(Constants.NBT.X_COORD + "max", maximumOffset.getX()); - tag.putInt(Constants.NBT.Y_COORD + "max", maximumOffset.getY()); - tag.putInt(Constants.NBT.Z_COORD + "max", maximumOffset.getZ()); - } - - @Override - public int getVolumeForOffsets(BlockPos offset1, BlockPos offset2) { - BlockPos minPos = new BlockPos(Math.min(offset1.getX(), offset2.getX()), Math.min(offset1.getY(), offset2.getY()), Math.min(offset1.getZ(), offset2.getZ())); - BlockPos maxPos = new BlockPos(Math.max(offset1.getX(), offset2.getX()), Math.max(offset1.getY(), offset2.getY()), Math.max(offset1.getZ(), offset2.getZ())); - - maxPos = maxPos.add(1, 1, 1); - - return (maxPos.getX() - minPos.getX()) * (maxPos.getY() - minPos.getY()) * (maxPos.getZ() - minPos.getZ()); - } - - @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) { - BlockPos minPos = new BlockPos(Math.min(offset1.getX(), offset2.getX()), Math.min(offset1.getY(), offset2.getY()), Math.min(offset1.getZ(), offset2.getZ())); - BlockPos maxPos = new BlockPos(Math.max(offset1.getX(), offset2.getX()), Math.max(offset1.getY(), offset2.getY()), Math.max(offset1.getZ(), offset2.getZ())); - - return minPos.getY() >= -verticalLimit && maxPos.getY() <= verticalLimit && minPos.getX() >= -horizontalLimit && maxPos.getX() <= horizontalLimit && minPos.getZ() >= -horizontalLimit && maxPos.getZ() <= horizontalLimit; - } - - @Override - public int getVolume() { - return (maximumOffset.getX() - minimumOffset.getX()) * (maximumOffset.getY() - minimumOffset.getY()) * (maximumOffset.getZ() - minimumOffset.getZ()); - } - - @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) { - return minimumOffset.getY() >= -verticalLimit && maximumOffset.getY() <= verticalLimit + 1 && minimumOffset.getX() >= -horizontalLimit && maximumOffset.getX() <= horizontalLimit + 1 && minimumOffset.getZ() >= -horizontalLimit && maximumOffset.getZ() <= horizontalLimit + 1; - } - - @Override - public boolean intersects(AreaDescriptor descriptor) { - if (descriptor instanceof AreaDescriptor.Rectangle) { - AreaDescriptor.Rectangle rectangle = (AreaDescriptor.Rectangle) descriptor; - - return !(minimumOffset.getX() >= rectangle.maximumOffset.getX() || minimumOffset.getY() >= rectangle.maximumOffset.getY() || minimumOffset.getZ() >= rectangle.maximumOffset.getZ() || rectangle.minimumOffset.getX() >= maximumOffset.getX() || rectangle.minimumOffset.getY() >= maximumOffset.getY() || rectangle.minimumOffset.getZ() >= maximumOffset.getZ()); - } - - return false; - } - - @Override - public AreaDescriptor offset(BlockPos offset) { - return new AreaDescriptor.Rectangle(this.minimumOffset.add(offset), this.maximumOffset.add(offset)); - } - - @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) { - BlockPos rotatePos1 = Template.transformedBlockPos(settings, minimumOffset); - BlockPos rotatePos2 = Template.transformedBlockPos(settings, maximumOffset.add(-1, -1, -1)); //It works, shut up! - - AreaDescriptor.Rectangle rectangle = new AreaDescriptor.Rectangle(this.minimumOffset, 1); - rectangle.modifyAreaByBlockPositions(rotatePos1, rotatePos2); - - return rectangle; - } - } - - public static class HemiSphere extends AreaDescriptor { - private BlockPos minimumOffset; - private int radius; - - private ArrayList blockPosCache; - private BlockPos cachedPosition; - - private boolean cache = true; - - public HemiSphere(BlockPos minimumOffset, int radius) { - setRadius(minimumOffset, radius); - } - - public HemiSphere(AreaDescriptor.HemiSphere hemiSphere) { - this(hemiSphere.minimumOffset, hemiSphere.radius); - } - - public AreaDescriptor.HemiSphere copy() { - return new AreaDescriptor.HemiSphere(this); - } - - public void setRadius(BlockPos minimumOffset, int radius) { - this.minimumOffset = new BlockPos(Math.min(minimumOffset.getX(), minimumOffset.getX()), Math.min(minimumOffset.getY(), minimumOffset.getY()), Math.min(minimumOffset.getZ(), minimumOffset.getZ())); - this.radius = radius; - blockPosCache = new ArrayList<>(); - } - - - @Override - public int getHeight() { - return this.radius * 2; - } - - - @Override - public List getContainedPositions(BlockPos pos) { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - ArrayList posList = new ArrayList<>(); - - int i = -radius; - int j = minimumOffset.getY(); - int k = -radius; - - //TODO For some reason the bottom of the hemisphere is not going up with the minOffset - - while (i <= radius) { - while (j <= radius) { - while (k <= radius) { - if (i * i + j * j + k * k >= (radius + 0.5F) * (radius + 0.5F)) { - k++; - continue; - } - - posList.add(pos.add(i, j, k)); - k++; - } - - k = -radius; - j++; - } - - j = minimumOffset.getY(); - i++; - } - - blockPosCache = posList; - cachedPosition = pos; - } - - return Collections.unmodifiableList(blockPosCache); - } - - /** - * Since you can't make a box using a sphere, this returns null - */ - @Override - public AxisAlignedBB getAABB(BlockPos pos) { - return null; - } - - @Override - public void resetCache() { - this.blockPosCache = new ArrayList<>(); - } - - @Override - public boolean isWithinArea(BlockPos pos) { - return blockPosCache.contains(pos); - } - - @Override - public boolean hasNext() { - return false; - } - - @Override - public BlockPos next() { - return null; - } - - @Override - public void remove() { - - } - - @Override - public void resetIterator() { - - } - - @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { - - } - - @Override - public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) { - return 0; - } - - @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) { - return false; - } - - @Override - public int getVolume() { - return 0; - } - - @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) { - return false; - } - - @Override - public boolean intersects(AreaDescriptor descriptor) { - return false; - } - - @Override - public AreaDescriptor offset(BlockPos offset) { - return new AreaDescriptor.HemiSphere(minimumOffset.add(offset), radius); - } - - @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) { - return this; - } - } - - public static class Cross extends AreaDescriptor { - - private ArrayList blockPosCache; - private BlockPos cachedPosition; - - private BlockPos centerPos; - private int size; - - private boolean cache = true; - - public Cross(BlockPos center, int size) { - this.centerPos = center; - this.size = size; - this.blockPosCache = new ArrayList<>(); - } - - public Cross(AreaDescriptor.Cross cross) { - this(cross.centerPos, cross.size); - } - - public AreaDescriptor.Cross copy() { - return new AreaDescriptor.Cross(this); - } - - @Override - public int getHeight() { - return this.size * 2 + 1; - } - - - @Override - public List getContainedPositions(BlockPos pos) { - if (!cache || !pos.equals(cachedPosition) || blockPosCache.isEmpty()) { - resetCache(); - - blockPosCache.add(centerPos.add(pos)); - for (int i = 1; i <= size; i++) { - blockPosCache.add(centerPos.add(pos).add(i, 0, 0)); - blockPosCache.add(centerPos.add(pos).add(0, 0, i)); - blockPosCache.add(centerPos.add(pos).add(-i, 0, 0)); - blockPosCache.add(centerPos.add(pos).add(0, 0, -i)); - } - } - - cachedPosition = pos; - - return Collections.unmodifiableList(blockPosCache); - } - - @Override - public void resetCache() { - blockPosCache = new ArrayList<>(); - } - - @Override - public boolean isWithinArea(BlockPos pos) { - return blockPosCache.contains(pos); - } - - @Override - public boolean hasNext() { - return false; - } - - @Override - public BlockPos next() { - return null; - } - - @Override - public void remove() { - - } - - @Override - public void resetIterator() { - - } - - @Override - public void modifyAreaByBlockPositions(BlockPos pos1, BlockPos pos2) { - - } - - @Override - public int getVolumeForOffsets(BlockPos pos1, BlockPos pos2) { - return 0; - } - - @Override - public boolean isWithinRange(BlockPos offset1, BlockPos offset2, int verticalLimit, int horizontalLimit) { - return false; - } - - @Override - public int getVolume() { - return 0; - } - - @Override - public boolean isWithinRange(int verticalLimit, int horizontalLimit) { - return false; - } - - @Override - public boolean intersects(AreaDescriptor descriptor) { - return false; - } - - @Override - public AreaDescriptor offset(BlockPos offset) { - return new AreaDescriptor.Cross(centerPos.add(offset), size); - } - - @Override - public AreaDescriptor rotateDescriptor(PlacementSettings settings) { - return this; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java deleted file mode 100644 index 1b47776e..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/CapabilityRuneType.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import net.minecraft.nbt.ByteNBT; -import net.minecraft.nbt.INBT; -import net.minecraft.util.Direction; -import net.minecraftforge.common.capabilities.Capability; - -import java.util.concurrent.Callable; - -public final class CapabilityRuneType { - public static class RuneTypeStorage implements Capability.IStorage { - @Override - public INBT writeNBT(Capability capability, IRitualStone.Tile instance, Direction side) { - return new ByteNBT((byte) instance.getRuneType().ordinal()); - } - - @Override - public void readNBT(Capability capability, IRitualStone.Tile instance, Direction side, INBT nbt) { - instance.setRuneType(EnumRuneType.byMetadata(((ByteNBT) nbt).getByte())); - } - } - - public static class RuneTypeWrapper implements IRitualStone.Tile { - private EnumRuneType type = EnumRuneType.BLANK; - - @Override - public boolean isRuneType(EnumRuneType runeType) { - return type == runeType; - } - - @Override - public EnumRuneType getRuneType() { - return type; - } - - public void setRuneType(EnumRuneType runeType) { - type = runeType; - } - } - - public static class Factory implements Callable { - @Override - public IRitualStone.Tile call() throws Exception { - return new RuneTypeWrapper(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java deleted file mode 100644 index 0f69f17c..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumReaderBoundaries.java +++ /dev/null @@ -1,22 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import net.minecraft.util.IStringSerializable; - -import java.util.Locale; - -public enum EnumReaderBoundaries implements IStringSerializable { - SUCCESS, - VOLUME_TOO_LARGE, - NOT_WITHIN_BOUNDARIES; - - - @Override - public String toString() { - return name().toLowerCase(Locale.ROOT); - } - - @Override - public String getName() { - return toString(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java deleted file mode 100644 index 55694e32..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumRitualReaderState.java +++ /dev/null @@ -1,8 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -public enum EnumRitualReaderState { - SET_AREA, - INFORMATION, - SET_WILL_TYPES, - ; -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java b/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java deleted file mode 100644 index 585c1e33..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/EnumRuneType.java +++ /dev/null @@ -1,64 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.IStringSerializable; -import net.minecraft.util.text.TextFormatting; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public enum EnumRuneType implements IStringSerializable, ISubItem { - - BLANK(TextFormatting.GRAY), - WATER(TextFormatting.AQUA), - FIRE(TextFormatting.RED), - EARTH(TextFormatting.GREEN), - AIR(TextFormatting.WHITE), - DUSK(TextFormatting.DARK_GRAY), - DAWN(TextFormatting.GOLD); - - public final TextFormatting colorCode; - - EnumRuneType(TextFormatting colorCode) { - this.colorCode = colorCode; - } - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } - - @Nonnull - @Override - public String getInternalName() { - return name().toLowerCase(Locale.ROOT); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - ItemStack ret = new ItemStack(RegistrarBloodMagicItems.INSCRIPTION_TOOL, count, ordinal()); - CompoundNBT tag = new CompoundNBT(); - tag.putInt(Constants.NBT.USES, 10); - ret.setTagCompound(tag); - return ret; - } - - public static EnumRuneType byMetadata(int meta) { - if (meta < 0 || meta >= values().length) - meta = 0; - - return values()[meta]; - } - - -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java deleted file mode 100644 index 64e64175..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/IMasterRitualStone.java +++ /dev/null @@ -1,79 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * This interface is for internal implementation only. - *

- * It is provided via the API for easy obtaining of basic data. - */ -public interface IMasterRitualStone { - UUID getOwner(); - - SoulNetwork getOwnerNetwork(); - - boolean activateRitual(ItemStack activationCrystal, PlayerEntity activator, Ritual ritual); - - void performRitual(World world, BlockPos pos); - - void stopRitual(Ritual.BreakType breakType); - - int getCooldown(); - - void setCooldown(int cooldown); - - boolean isActive(); - - void setActive(boolean active); - - Direction getDirection(); - - boolean areTanksEmpty(); - - int getRunningTime(); - - World getWorldObj(); - - BlockPos getBlockPos(); - - String getNextBlockRange(String range); - - void provideInformationOfRitualToPlayer(PlayerEntity player); - - void provideInformationOfRangeToPlayer(PlayerEntity player, String range); - - void provideInformationOfWillConfigToPlayer(PlayerEntity player, List typeList); - - void setActiveWillConfig(PlayerEntity player, List typeList); - - EnumReaderBoundaries setBlockRangeByBounds(PlayerEntity player, String range, BlockPos offset1, BlockPos offset2); - - List getActiveWillConfig(); - - default SoulTicket ticket(int amount) { - return SoulTicket.block(getWorldObj(), getBlockPos(), amount); - } - - AreaDescriptor getBlockRange(String range); - - void addBlockRanges(Map blockRanges); - - void addBlockRange(String range, AreaDescriptor defaultRange); - - void setBlockRanges(Map blockRanges); - - void setBlockRange(String range, AreaDescriptor defaultRange); - - Ritual getCurrentRitual(); -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java deleted file mode 100644 index 73c0e471..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/IRitualStone.java +++ /dev/null @@ -1,23 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -/** - * This interface is for internal implementation only. - *

- * It is provided via the API for easy obtaining of basic data. - */ -public interface IRitualStone { - boolean isRuneType(World world, BlockPos pos, EnumRuneType runeType); - - void setRuneType(World world, BlockPos pos, EnumRuneType runeType); - - interface Tile { - boolean isRuneType(EnumRuneType runeType); - - EnumRuneType getRuneType(); - - void setRuneType(EnumRuneType runeType); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java b/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java deleted file mode 100644 index f4a1f8d4..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/Ritual.java +++ /dev/null @@ -1,371 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import org.apache.commons.lang3.builder.ToStringBuilder; - -import java.util.*; -import java.util.Map.Entry; -import java.util.function.Consumer; - -/** - * Abstract class for creating new rituals. Register your ritual by annotating it with {@link RitualRegister} - */ -public abstract class Ritual { - - protected final Map modableRangeMap = new HashMap<>(); - protected final Map volumeRangeMap = new HashMap<>(); - protected final Map horizontalRangeMap = new HashMap<>(); - protected final Map verticalRangeMap = new HashMap<>(); - private final String name; - private final int crystalLevel; - private final int activationCost; - private final RitualRenderer renderer; - private final String unlocalizedName; - - public Ritual(String name, int crystalLevel, int activationCost, RitualRenderer renderer, String unlocalizedName) { - this.name = name; - this.crystalLevel = crystalLevel; - this.activationCost = activationCost; - this.renderer = renderer; - this.unlocalizedName = unlocalizedName; - } - - /** - * @param name - The name of the ritual - * @param crystalLevel - Required Activation Crystal tier - * @param activationCost - Base LP cost for activating the ritual - */ - public Ritual(String name, int crystalLevel, int activationCost, String unlocalizedName) { - this(name, crystalLevel, activationCost, null, unlocalizedName); - } - - public void readFromNBT(CompoundNBT tag) { - ListNBT tags = tag.getList("areas", 10); - if (tags.isEmpty()) { - return; - } - - for (int i = 0; i < tags.size(); i++) { - CompoundNBT newTag = tags.getCompound(i); - String rangeKey = newTag.getString("key"); - - CompoundNBT storedTag = newTag.getCompound("area"); - AreaDescriptor desc = this.getBlockRange(rangeKey); - if (desc != null) { - desc.readFromNBT(storedTag); - } - } - } - - public void writeToNBT(CompoundNBT tag) { - ListNBT tags = new ListNBT(); - - for (Entry entry : modableRangeMap.entrySet()) { - CompoundNBT newTag = new CompoundNBT(); - newTag.putString("key", entry.getKey()); - CompoundNBT storedTag = new CompoundNBT(); - - entry.getValue().writeToNBT(storedTag); - - newTag.put("area", storedTag); - - tags.add(newTag); - } - - tag.put("areas", tags); - } - - /** - * Called when the player attempts to activate the ritual. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#activateRitual(ItemStack, PlayerEntity, Ritual)} - * - * @param masterRitualStone - The {@link IMasterRitualStone} that the ritual is bound to - * @param player - The activating player - * @param owner - Owner of the crystal activating this ritual, or the current - * owner of the ritual if being reactivated. - * @return - Whether activation was successful - */ - public boolean activateRitual(IMasterRitualStone masterRitualStone, PlayerEntity player, UUID owner) { - return true; - } - - /** - * Called every {@link #getRefreshTime()} ticks while active. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#performRitual(World, BlockPos)} - * - * @param masterRitualStone - The {@link IMasterRitualStone} that the ritual is bound to - */ - public abstract void performRitual(IMasterRitualStone masterRitualStone); - - /** - * Called when the ritual is stopped for a given {@link Ritual.BreakType}. - *

- * {@link WayofTime.bloodmagic.tile.TileMasterRitualStone#stopRitual(Ritual.BreakType)} - * - * @param masterRitualStone - The {@link IMasterRitualStone} that the ritual is bound to - * @param breakType - The type of break that caused the stoppage. - */ - public void stopRitual(IMasterRitualStone masterRitualStone, BreakType breakType) { - - } - - /** - * Used to set the amount of LP drained every {@link #getRefreshTime()} - * ticks. - * - * @return - The amount of LP drained per refresh - */ - public abstract int getRefreshCost(); - - /** - * Used to set the refresh rate of the ritual. (How often - * {@link #performRitual(IMasterRitualStone)} is called. - * - * @return - How often to perform the effect in ticks. - */ - public int getRefreshTime() { - return 20; - } - - public void addBlockRange(String range, AreaDescriptor defaultRange) { - modableRangeMap.put(range, defaultRange); - } - - /** - * Used to grab the range of a ritual for a given effect. - * - * @param range - Range that needs to be pulled. - * @return - - */ - public AreaDescriptor getBlockRange(String range) { - if (modableRangeMap.containsKey(range)) { - return modableRangeMap.get(range); - } - - return null; - } - - public List getListOfRanges() { - return new ArrayList<>(modableRangeMap.keySet()); - } - - public String getNextBlockRange(String range) { - List rangeList = getListOfRanges(); - - if (rangeList.isEmpty()) { - return ""; - } - - if (!rangeList.contains(range)) { - return rangeList.get(0); - } - - boolean hasMatch = false; - - for (String rangeCheck : rangeList) { - if (hasMatch) { - return rangeCheck; - } else if (rangeCheck.equals(range)) { - hasMatch = true; - } - } - - return rangeList.get(0); - } - - public EnumReaderBoundaries canBlockRangeBeModified(String range, AreaDescriptor descriptor, IMasterRitualStone master, BlockPos offset1, BlockPos offset2, DemonWillHolder holder) { - List willConfig = master.getActiveWillConfig(); - int maxVolume = getMaxVolumeForRange(range, willConfig, holder); - int maxVertical = getMaxVerticalRadiusForRange(range, willConfig, holder); - int maxHorizontal = getMaxHorizontalRadiusForRange(range, willConfig, holder); - - return (maxVolume <= 0 || descriptor.getVolumeForOffsets(offset1, offset2) <= maxVolume) ? descriptor.isWithinRange(offset1, offset2, maxVertical, maxHorizontal) ? EnumReaderBoundaries.SUCCESS : EnumReaderBoundaries.NOT_WITHIN_BOUNDARIES : EnumReaderBoundaries.VOLUME_TOO_LARGE; - } - - protected void setMaximumVolumeAndDistanceOfRange(String range, int volume, int horizontalRadius, int verticalRadius) { - volumeRangeMap.put(range, volume); - horizontalRangeMap.put(range, horizontalRadius); - verticalRangeMap.put(range, verticalRadius); - } - - protected boolean checkDescriptorIsWithinRange(AreaDescriptor descriptor, int maxVolume, int maxHorizontal, int maxVertical) { - return descriptor.getVolume() <= maxVolume && descriptor.isWithinRange(maxVertical, maxHorizontal); - } - - public int getMaxVolumeForRange(String range, List activeTypes, DemonWillHolder holder) { - return volumeRangeMap.get(range); - } - - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - return verticalRangeMap.get(range); - } - - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - return horizontalRangeMap.get(range); - } - - public ITextComponent getErrorForBlockRangeOnFail(PlayerEntity player, String range, IMasterRitualStone master, BlockPos offset1, BlockPos offset2) { - AreaDescriptor descriptor = this.getBlockRange(range); - if (descriptor == null) { - return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", "?"); - } - - List willConfig = master.getActiveWillConfig(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(master.getWorldObj(), master.getBlockPos()); - - int maxVolume = this.getMaxVolumeForRange(range, willConfig, holder); - int maxVertical = this.getMaxVerticalRadiusForRange(range, willConfig, holder); - int maxHorizontal = this.getMaxHorizontalRadiusForRange(range, willConfig, holder); - - if (maxVolume > 0 && descriptor.getVolumeForOffsets(offset1, offset2) > maxVolume) { - return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooBig", maxVolume); - } else { - return new TranslationTextComponent("ritual.bloodmagic.blockRange.tooFar", maxVertical, maxHorizontal); - } - } - - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info")}; - } - - public ITextComponent provideInformationOfRangeToPlayer(PlayerEntity player, String range) { - if (getListOfRanges().contains(range)) { - return new TranslationTextComponent(this.getTranslationKey() + "." + range + ".info"); - } else { - return new TranslationTextComponent("ritual.bloodmagic.blockRange.noRange"); - } - } - - public abstract void gatherComponents(Consumer components); - - protected final void addRune(Consumer components, int offset1, int y, int offset2, EnumRuneType rune) { - components.accept(new RitualComponent(new BlockPos(offset1, y, offset2), rune)); - } - - protected final void addOffsetRunes(Consumer components, int offset1, int offset2, int y, EnumRuneType rune) { - addRune(components, offset1, y, offset2, rune); - addRune(components, offset2, y, offset1, rune); - addRune(components, offset1, y, -offset2, rune); - addRune(components, -offset2, y, offset1, rune); - addRune(components, -offset1, y, offset2, rune); - addRune(components, offset2, y, -offset1, rune); - addRune(components, -offset1, y, -offset2, rune); - addRune(components, -offset2, y, -offset1, rune); - } - - protected final void addCornerRunes(Consumer components, int offset, int y, EnumRuneType rune) { - addRune(components, offset, y, offset, rune); - addRune(components, offset, y, -offset, rune); - addRune(components, -offset, y, -offset, rune); - addRune(components, -offset, y, offset, rune); - } - - protected final void addParallelRunes(Consumer components, int offset, int y, EnumRuneType rune) { - addRune(components, offset, y, 0, rune); - addRune(components, -offset, y, 0, rune); - addRune(components, 0, y, -offset, rune); - addRune(components, 0, y, offset, rune); - } - - public double getWillRespectingConfig(World world, BlockPos pos, EnumDemonWillType type, List willConfig) { - return willConfig.contains(type) ? WorldDemonWillHandler.getCurrentWill(world, pos, type) : 0; - } - - public abstract Ritual getNewCopy(); - - public String getName() { - return name; - } - - public int getCrystalLevel() { - return crystalLevel; - } - - public int getActivationCost() { - return activationCost; - } - - public RitualRenderer getRenderer() { - return renderer; - } - - public String getTranslationKey() { - return unlocalizedName; - } - - public Map getModableRangeMap() { - return modableRangeMap; - } - - public Map getVolumeRangeMap() { - return volumeRangeMap; - } - - public Map getHorizontalRangeMap() { - return horizontalRangeMap; - } - - public Map getVerticalRangeMap() { - return verticalRangeMap; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("name", name) - .append("crystalLevel", crystalLevel) - .append("activationCost", activationCost) - .append("renderer", renderer) - .append("unlocalizedName", unlocalizedName) - .append("modableRangeMap", modableRangeMap) - .append("volumeRangeMap", volumeRangeMap) - .append("horizontalRangeMap", horizontalRangeMap) - .append("verticalRangeMap", verticalRangeMap) - .append("refreshTime", getRefreshTime()) - .append("listOfRanges", getListOfRanges()) - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Ritual)) return false; - - Ritual ritual = (Ritual) o; - - if (crystalLevel != ritual.crystalLevel) return false; - if (activationCost != ritual.activationCost) return false; - if (name != null ? !name.equals(ritual.name) : ritual.name != null) return false; - return unlocalizedName != null ? unlocalizedName.equals(ritual.unlocalizedName) : ritual.unlocalizedName == null; - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + crystalLevel; - result = 31 * result + activationCost; - result = 31 * result + (unlocalizedName != null ? unlocalizedName.hashCode() : 0); - return result; - } - - public enum BreakType { - REDSTONE, - BREAK_MRS, - BREAK_STONE, - ACTIVATE, - DEACTIVATE, - EXPLOSION, - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java deleted file mode 100644 index 9af0c1ab..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualComponent.java +++ /dev/null @@ -1,60 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -/** - * Used to set a {@link EnumRuneType} type to a given {@link BlockPos} for usage - * in Ritual creation. - */ -public class RitualComponent { - private final BlockPos offset; - private final EnumRuneType runeType; - - public RitualComponent(BlockPos offset, EnumRuneType runeType) { - this.offset = offset; - this.runeType = runeType; - } - - public int getX(Direction direction) { - switch (direction) { - case EAST: - return -this.getOffset().getZ(); - case SOUTH: - return -this.getOffset().getX(); - case WEST: - return this.getOffset().getZ(); - default: - return this.getOffset().getX(); - } - } - - public int getY() { - return this.getOffset().getY(); - } - - public int getZ(Direction direction) { - switch (direction) { - case EAST: - return this.getOffset().getX(); - case SOUTH: - return -this.getOffset().getZ(); - case WEST: - return -this.getOffset().getX(); - default: - return this.getOffset().getZ(); - } - } - - public BlockPos getOffset(Direction direction) { - return new BlockPos(getX(direction), offset.getY(), getZ(direction)); - } - - public BlockPos getOffset() { - return offset; - } - - public EnumRuneType getRuneType() { - return runeType; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java deleted file mode 100644 index 70e5b951..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualManager.java +++ /dev/null @@ -1,154 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.util.BMLog; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; -import net.minecraft.util.DamageSource; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.fml.common.discovery.ASMDataTable; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class RitualManager { - public static final DamageSource RITUAL_DAMAGE = new DamageSource("ritual_damage").setDamageBypassesArmor(); - - private final Map rituals; - private final Map ritualsReverse; - private final List sortedRituals; - private final Map imperfectRituals; - private final Map imperfectRitualsReverse; - private final Configuration config; - - - public RitualManager(Configuration config) { - this.rituals = Maps.newTreeMap(); - this.ritualsReverse = Maps.newHashMap(); - this.sortedRituals = Lists.newArrayList(); - this.imperfectRituals = Maps.newTreeMap(); - this.imperfectRitualsReverse = Maps.newHashMap(); - this.config = config; - } - - public void discover(ASMDataTable dataTable) { - Set data = dataTable.getAll(RitualRegister.class.getName()); - for (ASMDataTable.ASMData found : data) { - try { - Class discoveredClass = Class.forName(found.getClassName()); - if (!Ritual.class.isAssignableFrom(discoveredClass)) - throw new BadRitualException("Annotated class " + found.getClassName() + " does not inherit from " + Ritual.class.getName()); - - Class ritualClass = discoveredClass.asSubclass(Ritual.class); - RitualRegister ritualRegister = ritualClass.getAnnotation(RitualRegister.class); - String id = ritualRegister.value(); - Ritual ritual = ritualRegister.factory().newInstance().apply(ritualClass); - if (ritual == null) { - BMLog.DEFAULT.error("Error creating ritual instance for {}.", id); - continue; - } - - rituals.put(id, ritual); - ritualsReverse.put(ritual, id); - BMLog.DEBUG.info("Registered ritual {}", id); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - Set imperfectData = dataTable.getAll(RitualRegister.Imperfect.class.getName()); - for (ASMDataTable.ASMData found : imperfectData) { - try { - Class discoveredClass = Class.forName(found.getClassName()); - if (!ImperfectRitual.class.isAssignableFrom(discoveredClass)) - throw new BadRitualException("Annotated class " + found.getClassName() + " does not inherit from " + ImperfectRitual.class.getName()); - - Class ritualClass = discoveredClass.asSubclass(ImperfectRitual.class); - RitualRegister.Imperfect ritualRegister = ritualClass.getAnnotation(RitualRegister.Imperfect.class); - String id = ritualRegister.value(); - ImperfectRitual ritual = ritualRegister.factory().newInstance().apply(ritualClass); - if (ritual == null) { - BMLog.DEFAULT.error("Error creating imperfect ritual instance for {}.", id); - continue; - } - - imperfectRituals.put(id, ritual); - imperfectRitualsReverse.put(ritual, id); - BMLog.DEBUG.info("Registered imperfect ritual {}", id); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - syncConfig(); - - // Sort rituals - sortedRituals.addAll(rituals.values()); - // Oh dear this is probably so slow - sortedRituals.sort((o1, o2) -> { - Set components = Sets.newHashSet(); - o1.gatherComponents(components::add); - int initialSize = components.size(); - components.clear(); - o2.gatherComponents(components::add); - return Integer.compare(initialSize, components.size()); - }); - } - - public Ritual getRitual(String id) { - return rituals.get(id); - } - - public String getId(Ritual ritual) { - return ritualsReverse.get(ritual); - } - - public ImperfectRitual getImperfectRitual(BlockState state) { - for (ImperfectRitual ritual : imperfectRituals.values()) - if (ritual.getBlockRequirement().test(state)) - return ritual; - - return null; - } - - public String getId(ImperfectRitual ritual) { - return imperfectRitualsReverse.get(ritual); - } - - public Collection getRituals() { - return rituals.values(); - } - - public Collection getImperfectRituals() { - return imperfectRituals.values(); - } - - public List getSortedRituals() { - return sortedRituals; - } - - public void syncConfig() { - config.addCustomCategoryComment("rituals", "Toggles for all rituals"); - rituals.forEach((k, v) -> config.getBoolean(k, "rituals", true, "Enable the " + k + " ritual.")); - imperfectRituals.forEach((k, v) -> config.getBoolean(k, "rituals.imperfect", true, "Enable the " + k + " imperfect ritual.")); - config.save(); - } - - public boolean enabled(String id, boolean imperfect) { - return id != null && config.getBoolean(id, "rituals" + (imperfect ? ".imperfect" : ""), true, ""); - } - - public Configuration getConfig() { - return config; - } - - public static class BadRitualException extends RuntimeException { - public BadRitualException(String message) { - super(message); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java deleted file mode 100644 index b077056f..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRegister.java +++ /dev/null @@ -1,49 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.function.Function; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface RitualRegister { - - String value(); - - Class, Ritual>> factory() default DefaultRitualFactory.class; - - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.TYPE) - @interface Imperfect { - - String value(); - - Class, ImperfectRitual>> factory() default DefaultImperfectRitualFactory.class; - } - - class DefaultRitualFactory implements Function, Ritual> { - @Override - public Ritual apply(Class aClass) { - try { - return aClass.newInstance(); - } catch (Exception e) { - return null; - } - } - } - - class DefaultImperfectRitualFactory implements Function, ImperfectRitual> { - @Override - public ImperfectRitual apply(Class aClass) { - try { - return aClass.newInstance(); - } catch (Exception e) { - return null; - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java deleted file mode 100644 index 2cd14840..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualRenderer.java +++ /dev/null @@ -1,12 +0,0 @@ -package WayofTime.bloodmagic.ritual; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.ResourceLocation; - -public abstract class RitualRenderer { - public abstract void renderAt(IMasterRitualStone masterRitualStone, double x, double y, double z); - - protected void bindTexture(ResourceLocation resourceLocation) { - Minecraft.getInstance().getTextureManager().bindTexture(resourceLocation); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java deleted file mode 100644 index 6263059c..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingHandlerCuttingFluid.java +++ /dev/null @@ -1,49 +0,0 @@ -package WayofTime.bloodmagic.ritual.crushing; - -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - -public class CrushingHandlerCuttingFluid implements ICrushingHandler { - - private int lpDrain; - - private double willDrain; - - private ItemStack cuttingStack; - - public CrushingHandlerCuttingFluid(ItemStack cuttingStack, int lpDrain, double willDrain) { - this.lpDrain = lpDrain; - this.willDrain = willDrain; - this.cuttingStack = cuttingStack; - } - - @Override - @Nonnull - public ItemStack getRecipeOutput(ItemStack inputStack, World world, BlockPos pos) { - List inputList = new ArrayList<>(); - inputList.add(cuttingStack); - inputList.add(inputStack.copy()); - RecipeAlchemyTable recipeAlchemyTable = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyTable(inputList); - - if (recipeAlchemyTable != null) { - return recipeAlchemyTable.getOutput().copy(); - } - - return ItemStack.EMPTY; - } - - public double getWillDrain() { - return willDrain; - } - - public int getLpDrain() { - return lpDrain; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java deleted file mode 100644 index 696663ea..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/crushing/CrushingRegistry.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.ritual.crushing; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.item.ItemStack; - - -public class CrushingRegistry { - - private static List crushingHandlerList = new ArrayList<>(); - - public static void registerCuttingFluid(ICrushingHandler handler) { - crushingHandlerList.add(handler); - } - - public static List getCrushingHandlerList() { - return crushingHandlerList; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java deleted file mode 100644 index 10d586cb..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/crushing/ICrushingHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.ritual.crushing; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nonnull; - -public interface ICrushingHandler { - @Nonnull - ItemStack getRecipeOutput(ItemStack input, World world, BlockPos pos); - - int getLpDrain(); - - double getWillDrain(); -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java deleted file mode 100644 index ca4ecf43..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerPlantable.java +++ /dev/null @@ -1,120 +0,0 @@ -package WayofTime.bloodmagic.ritual.harvest; - -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CropsBlock; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.List; - -/** - * Harvest handler for standard plantable crops such as Wheat, Potatoes, and - * Netherwart.
- * Register a new crop for this handler with {@link HarvestRegistry#registerStandardCrop(Block, int)} - */ -public class HarvestHandlerPlantable implements IHarvestHandler { - - public HarvestHandlerPlantable() { - HarvestRegistry.registerStandardCrop(Blocks.CARROTS, 7); - HarvestRegistry.registerStandardCrop(Blocks.WHEAT, 7); - HarvestRegistry.registerStandardCrop(Blocks.POTATOES, 7); - HarvestRegistry.registerStandardCrop(Blocks.BEETROOTS, 3); - HarvestRegistry.registerStandardCrop(Blocks.NETHER_WART, 3); - - addThirdPartyCrop("actuallyadditions", "blockFlax", 7); - addThirdPartyCrop("actuallyadditions", "blockCanola", 7); - addThirdPartyCrop("actuallyadditions", "blockRice", 7); - - addThirdPartyCrop("extrautils2", "redorchid", 6); - addThirdPartyCrop("extrautils2", "enderlily", 7); - - addThirdPartyCrop("roots", "moonglow", 7); - addThirdPartyCrop("roots", "terra_moss", 7); - addThirdPartyCrop("roots", "pereskia", 7); - addThirdPartyCrop("roots", "wildroot", 7); - addThirdPartyCrop("roots", "aubergine", 7); - addThirdPartyCrop("roots", "spirit_herb", 7); - - addPamCrops(); - } - - @Override - public boolean harvest(World world, BlockPos pos, BlockState state, List drops) { - NonNullList blockDrops = NonNullList.create(); - state.getBlock().getDrops(blockDrops, world, pos, state, 0); - boolean foundSeed = false; - - for (ItemStack stack : blockDrops) { - if (stack.isEmpty()) - continue; - - if (stack.getItem() instanceof IPlantable) { - stack.shrink(1); - foundSeed = true; - break; - } - } - - if (foundSeed) { - world.setBlockState(pos, state.getBlock().getDefaultState()); - world.playEvent(2001, pos, Block.getStateId(state)); - for (ItemStack stack : blockDrops) { - if (stack.isEmpty()) - continue; - - drops.add(stack); - } - - return true; - } - - return false; - } - - @Override - public boolean test(World world, BlockPos pos, BlockState state) { - return HarvestRegistry.getStandardCrops().containsKey(state.getBlock()) && state.getBlock().getMetaFromState(state) == HarvestRegistry.getStandardCrops().get(state.getBlock()); - } - - private static void addThirdPartyCrop(String modid, String regName, int matureMeta) { - if (!Loader.isModLoaded(modid)) - return; - - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(modid, regName)); - if (block != null && block != Blocks.AIR) - HarvestRegistry.registerStandardCrop(block, matureMeta); - } - - private static void addPamCrops() { - if (!Loader.isModLoaded("harvestcraft")) - return; - - try { - Class pamRegistry = Class.forName("com.pam.harvestcraft.blocks.CropRegistry"); - Field names = pamRegistry.getDeclaredField("cropNames"); - Method getCrop = pamRegistry.getMethod("getCrop", String.class); - for (String name : (String[]) names.get(null)) { - CropsBlock crop = (CropsBlock) getCrop.invoke(null, name); - HarvestRegistry.registerStandardCrop(crop, crop.getMaxAge()); - } - } catch (ClassNotFoundException e) { - BMLog.DEFAULT.error("HarvestCraft integration cancelled; unable to find registry class"); - } catch (NoSuchMethodException | NoSuchFieldException e) { - BMLog.DEFAULT.error("HarvestCraft integration cancelled; unable to find crop name mapper"); - } catch (IllegalAccessException | InvocationTargetException e) { - BMLog.DEFAULT.error("HarvestCraft integration cancelled; crop name lookup broke"); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java deleted file mode 100644 index 582b1dff..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerStem.java +++ /dev/null @@ -1,58 +0,0 @@ -package WayofTime.bloodmagic.ritual.harvest; - -import net.minecraft.block.Blocks; -import net.minecraft.block.PumpkinBlock; -import net.minecraft.block.StemBlock; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.Collection; -import java.util.List; - -/** - * Harvest handler for crops with stems such as Pumpkins and Melons. Rotation based crop blocks are a good reason - * to use this (see pumpkins).
- * Register a new crop for this handler with - * {@link HarvestRegistry#registerStemCrop(BlockState, BlockState)} - */ -public class HarvestHandlerStem implements IHarvestHandler { - - public HarvestHandlerStem() { - for (Direction facing : Direction.HORIZONTALS) - HarvestRegistry.registerStemCrop(Blocks.PUMPKIN.getDefaultState().withProperty(PumpkinBlock.FACING, facing), Blocks.PUMPKIN_STEM.getDefaultState().withProperty(StemBlock.AGE, 7)); - - HarvestRegistry.registerStemCrop(Blocks.MELON_BLOCK.getDefaultState(), Blocks.MELON_STEM.getDefaultState().withProperty(StemBlock.AGE, 7)); - } - - @Override - public boolean harvest(World world, BlockPos pos, BlockState state, List drops) { - Direction cropDir = state.getActualState(world, pos).getValue(StemBlock.FACING); - - if (cropDir != Direction.UP) { - BlockPos cropPos = pos.offset(cropDir); - BlockState probableCrop = world.getBlockState(cropPos); - Collection registeredCrops = HarvestRegistry.getStemCrops().get(state); - - for (BlockState registeredCrop : registeredCrops) { - if (registeredCrop == probableCrop) { - NonNullList blockDrops = NonNullList.create(); - probableCrop.getBlock().getDrops(blockDrops, world, cropPos, probableCrop, 0); - drops.addAll(blockDrops); - world.destroyBlock(cropPos, false); - return true; - } - } - } - - return false; - } - - @Override - public boolean test(World world, BlockPos pos, BlockState state) { - return HarvestRegistry.getStemCrops().containsKey(state); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java deleted file mode 100644 index 7f75934d..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestHandlerTall.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.ritual.harvest; - -import net.minecraft.block.CactusBlock; -import net.minecraft.block.SugarCaneBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; - -/** - * Harvest handler for crops that grow vertically such as Sugar Cane and Cactus.
- * Register a new crop for this handler with - * {@link HarvestRegistry#registerTallCrop(BlockState)} - */ -public class HarvestHandlerTall implements IHarvestHandler { - - public HarvestHandlerTall() { - for (int i = 0; i < 15; i++) { - HarvestRegistry.registerTallCrop(Blocks.REEDS.getDefaultState().withProperty(SugarCaneBlock.AGE, i)); - HarvestRegistry.registerTallCrop(Blocks.CACTUS.getDefaultState().withProperty(CactusBlock.AGE, i)); - } - } - - @Override - public boolean harvest(World world, BlockPos pos, BlockState state, List drops) { - BlockState up = world.getBlockState(pos.up()); - if (up.getBlock() == state.getBlock()) { - NonNullList blockDrops = NonNullList.create(); - up.getBlock().getDrops(blockDrops, world, pos.up(), up, 0); - drops.addAll(blockDrops); - world.destroyBlock(pos.up(), false); - return true; - } - - return false; - } - - @Override - public boolean test(World world, BlockPos pos, BlockState state) { - return HarvestRegistry.getTallCrops().contains(state); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java deleted file mode 100644 index 2338a34a..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/HarvestRegistry.java +++ /dev/null @@ -1,105 +0,0 @@ -package WayofTime.bloodmagic.ritual.harvest; - -import com.google.common.collect.*; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.StemBlock; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class HarvestRegistry { - - private static final List HARVEST_HANDLERS = Lists.newArrayList(); - private static final Map STANDARD_CROPS = Maps.newHashMap(); - private static final Set TALL_CROPS = Sets.newHashSet(); - private static final Multimap STEM_CROPS = ArrayListMultimap.create(); - private static final Map AMPLIFIERS = Maps.newHashMap(); - - /** - * Registers a handler for the Harvest Ritual to call. - * - * @param handler - The custom handler to register - */ - public static void registerHandler(IHarvestHandler handler) { - if (!HARVEST_HANDLERS.contains(handler)) - HARVEST_HANDLERS.add(handler); - } - - /** - * Registers a standard crop (IE: Wheat, Carrots, Potatoes, Netherwart, etc) - * for the - * {@link WayofTime.bloodmagic.ritual.harvest.HarvestHandlerPlantable} - * handler to handle. - * - * @param crop - The crop block to handle. - * @param matureMeta - The meta value at which the crop is considered mature and ready - * to be harvested. - */ - public static void registerStandardCrop(Block crop, int matureMeta) { - if (!STANDARD_CROPS.containsKey(crop)) - STANDARD_CROPS.put(crop, matureMeta); - } - - /** - * Registers a tall crop (Sugar Cane and Cactus) for the - * {@link WayofTime.bloodmagic.ritual.harvest.HarvestHandlerTall} handler to - * handle. - * - * @param crop - The crop block to handle. - */ - public static void registerTallCrop(BlockState crop) { - if (!TALL_CROPS.contains(crop)) - TALL_CROPS.add(crop); - } - - /** - * Registers a stem crop (Melon and Pumpkin) for the - * {@link WayofTime.bloodmagic.ritual.harvest.HarvestHandlerStem} handler to - * handle. - *

- * Use {@link net.minecraftforge.oredict.OreDictionary#WILDCARD_VALUE} to - * accept any meta for the crop block. - *

- * The Stem must be instanceof {@link StemBlock} - * - * @param crop - The crop block to handle. - * @param stem - The stem of the crop - */ - public static void registerStemCrop(BlockState crop, BlockState stem) { - if (!STEM_CROPS.containsKey(crop) && stem.getBlock() instanceof StemBlock) - STEM_CROPS.put(stem, crop); - } - - /** - * Registers a range amplifier for the Harvest Ritual. - * - * @param block - The block for the amplifier. - * @param range - The range the amplifier provides. - */ - public static void registerRangeAmplifier(BlockState block, int range) { - if (!AMPLIFIERS.containsKey(block)) - AMPLIFIERS.put(block, range); - } - - public static List getHarvestHandlers() { - return ImmutableList.copyOf(HARVEST_HANDLERS); - } - - public static Map getStandardCrops() { - return ImmutableMap.copyOf(STANDARD_CROPS); - } - - public static Set getTallCrops() { - return ImmutableSet.copyOf(TALL_CROPS); - } - - public static Multimap getStemCrops() { - return ImmutableMultimap.copyOf(STEM_CROPS); - } - - public static Map getAmplifiers() { - return ImmutableMap.copyOf(AMPLIFIERS); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java deleted file mode 100644 index e2e50824..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/harvest/IHarvestHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package WayofTime.bloodmagic.ritual.harvest; - -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; - -/** - * Used to define a HarvestHandler for the Harvest Ritual. - */ -public interface IHarvestHandler { - - /** - * Called whenever the Harvest Ritual attempts to harvest a block.
- * Use this to break the block and plant a new one.
- * Add the items to be dropped to the drops list.
- * - * @param world - The world - * @param pos - The position of the {@link BlockState} being checked - * @param state - The {@link BlockState} being checked - * @param drops - The items to be dropped - * @return If the block was successfully harvested. - */ - boolean harvest(World world, BlockPos pos, BlockState state, List drops); - - /** - * Tests to see if the block is valid for harvest. - * - * @param world The world - * @param pos The position in the world of the {@link BlockState} being checked - * @param state The {@link BlockState} being checked - * @return if this block is valid for harvest. - */ - boolean test(World world, BlockPos pos, BlockState state); -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java deleted file mode 100644 index e18477ed..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/IImperfectRitualStone.java +++ /dev/null @@ -1,19 +0,0 @@ -package WayofTime.bloodmagic.ritual.imperfect; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -/** - * This interface is for internal implementation only. - *

- * It is provided via the API for easy obtaining of basic data. - */ -public interface IImperfectRitualStone { - - boolean performRitual(World world, BlockPos pos, ImperfectRitual imperfectRitual, PlayerEntity player); - - World getRitualWorld(); - - BlockPos getRitualPos(); -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java deleted file mode 100644 index 5f2169a1..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/ImperfectRitual.java +++ /dev/null @@ -1,91 +0,0 @@ -package WayofTime.bloodmagic.ritual.imperfect; - -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; - -import java.util.function.Predicate; - -/** - * Abstract class for creating new imperfect rituals. To register, annotate your class with {@link WayofTime.bloodmagic.ritual.RitualRegister.Imperfect} - */ -public abstract class ImperfectRitual { - - private final String name; - private final Predicate blockRequirement; - private final int activationCost; - private final boolean lightShow; - private final String unlocalizedName; - - public ImperfectRitual(String name, Predicate blockRequirement, int activationCost, boolean lightShow, String unlocalizedName) { - this.name = name; - this.blockRequirement = blockRequirement; - this.activationCost = activationCost; - this.lightShow = lightShow; - this.unlocalizedName = unlocalizedName; - } - - /** - * @param name The name of the ritual - * @param blockRequirement The block required above the ImperfectRitualStone - * @param activationCost Base LP cost for activating the ritual - */ - public ImperfectRitual(String name, Predicate blockRequirement, int activationCost, String unlocalizedName) { - this(name, blockRequirement, activationCost, false, unlocalizedName); - } - - /** - * Called when the player activates the ritual - * {@link WayofTime.bloodmagic.tile.TileImperfectRitualStone#performRitual(World, net.minecraft.util.math.BlockPos, ImperfectRitual, PlayerEntity)} - * - * @param imperfectRitualStone - The {@link IImperfectRitualStone} that the ritual is bound to - * @param player - The player activating the ritual - * @return - Whether activation was successful - */ - public abstract boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player); - - public String getName() { - return name; - } - - public Predicate getBlockRequirement() { - return blockRequirement; - } - - public int getActivationCost() { - return activationCost; - } - - public boolean isLightShow() { - return lightShow; - } - - public String getTranslationKey() { - return unlocalizedName; - } - - @Override - public String toString() { - return getName() + "@" + getActivationCost(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof ImperfectRitual)) return false; - - ImperfectRitual that = (ImperfectRitual) o; - - if (activationCost != that.activationCost) return false; - if (name != null ? !name.equals(that.name) : that.name != null) return false; - return unlocalizedName != null ? unlocalizedName.equals(that.unlocalizedName) : that.unlocalizedName == null; - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + activationCost; - result = 31 * result + (unlocalizedName != null ? unlocalizedName.hashCode() : 0); - return result; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java b/src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java deleted file mode 100644 index 9b848792..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/imperfect/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -package WayofTime.bloodmagic.ritual.imperfect; - -import mcp.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java b/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java deleted file mode 100644 index bdcd9fdd..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/portal/LocationsHandler.java +++ /dev/null @@ -1,108 +0,0 @@ -package WayofTime.bloodmagic.ritual.portal; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.teleport.PortalLocation; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraftforge.common.DimensionManager; - -import java.io.*; -import java.util.ArrayList; -import java.util.HashMap; - -public class LocationsHandler implements Serializable { - - public static final long serialVersionUID = 10102001; - private static final String fileName = String.valueOf(DimensionManager.getCurrentSaveRootDirectory()) + "/" + BloodMagic.MODID + "/PortalLocations.dat"; - private static HashMap> portals; - private static LocationsHandler locationsHandler; - - private LocationsHandler() { - portals = new HashMap<>(); - } - - public boolean addLocation(String name, PortalLocation location) { - ArrayList portalLocations = portals.get(name); - if (portalLocations == null) { - portals.put(name, new ArrayList<>()); - updateFile(fileName, portals); - } - if (!portals.get(name).isEmpty() && portals.get(name).size() >= 2) { - BMLog.DEBUG.info("Location {} already exists.", name); - updateFile(fileName, portals); - return false; - } else { - portals.get(name).add(location); - BMLog.DEBUG.info("Adding {}", name); - updateFile(fileName, portals); - return true; - } - } - - public boolean removeLocation(String name, PortalLocation location) { - if (portals.get(name) != null && !portals.get(name).isEmpty()) { - if (portals.get(name).contains(location)) { - portals.get(name).remove(location); - BMLog.DEBUG.info("Removing {}", name); - updateFile(fileName, portals); - return true; - } else { - BMLog.DEBUG.info("No location matching {}", name); - updateFile(fileName, portals); - return false; - } - } - return false; - } - - public ArrayList getLinkedLocations(String name) { - return portals.get(name); - } - - public static LocationsHandler getLocationsHandler() { - if (locationsHandler == null || loadFile() == null) { - locationsHandler = new LocationsHandler(); - return locationsHandler; - } else { - portals = loadFile(); - return locationsHandler; - } - } - - private static HashMap> loadFile() { - HashMap> map; - File file = new File(fileName); - try { - if (!file.exists()) { - if (file.getParentFile().mkdir()) { - if (file.createNewFile()) { - BMLog.DEBUG.info("Creating {} in {}", fileName, DimensionManager.getCurrentSaveRootDirectory()); - } - } else if (file.createNewFile()) { - BMLog.DEBUG.info("Creating {} in {}", fileName, DimensionManager.getCurrentSaveRootDirectory()); - } - } - FileInputStream fileIn = new FileInputStream(file); - ObjectInputStream in = new ObjectInputStream(fileIn); - map = (HashMap>) in.readObject(); - in.close(); - fileIn.close(); - return map; - } catch (IOException e) { - return null; - } catch (ClassNotFoundException e) { - BMLog.DEFAULT.error("{} was not found in {}", file, DimensionManager.getCurrentSaveRootDirectory()); - return null; - } - } - - private static void updateFile(String file, HashMap> object) { - try { - FileOutputStream fos = new FileOutputStream(file); - ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(object); - oos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java deleted file mode 100644 index f28025da..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAltarBuilder.java +++ /dev/null @@ -1,261 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.BlockStack; -import WayofTime.bloodmagic.altar.AltarComponent; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.block.BlockBloodRune; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.function.Consumer; - -@RitualRegister("altar_builder") -public class RitualAltarBuilder extends Ritual { - private Iterator altarComponentsIterator = new ArrayList<>(AltarTier.values()[AltarTier.MAXTIERS - 1].getAltarComponents()).iterator(); - private boolean cycleDone = false; - - private AltarComponent currentComponent; - private BlockPos currentPos; - - public RitualAltarBuilder() { - super("ritualAltarBuilder", 0, 450, "ritual." + BloodMagic.MODID + ".altarBuilderRitual"); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); - BlockPos altarPos = masterRitualStone.getBlockPos().up(2); - - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - if (cycleDone) { - altarComponentsIterator = new ArrayList<>(AltarTier.values()[AltarTier.MAXTIERS - 1].getAltarComponents()).iterator(); - } - - if (world.getBlockState(altarPos).getBlock().isReplaceable(world, altarPos) && hasItem(tileEntity, Item.getItemFromBlock(RegistrarBloodMagicBlocks.ALTAR), 0, true)) { - world.setBlockState(altarPos, RegistrarBloodMagicBlocks.ALTAR.getDefaultState()); - lightning(world, altarPos); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - - if (altarComponentsIterator.hasNext()) { - currentComponent = altarComponentsIterator.next(); - currentPos = altarPos.add(currentComponent.getOffset()); - - if (world.getBlockState(currentPos).getBlock().isReplaceable(world, currentPos)) { - switch (currentComponent.getComponent()) { - case NOTAIR: { - BlockStack blockStack = getMundaneBlock(tileEntity); - if (blockStack != null) { - world.setBlockState(currentPos, blockStack.getState(), 3); - lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - break; - } - case BLOODRUNE: { - BlockStack blockStack = getBloodRune(tileEntity); - if (blockStack != null) { - world.setBlockState(currentPos, blockStack.getState(), 3); - lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - break; - } - default: { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(currentComponent.getComponent()), 0); - if (hasItem(tileEntity, Item.getItemFromBlock(blockStack.getBlock()), blockStack.getMeta(), true)) { - world.setBlockState(currentPos, blockStack.getState(), 3); - lightning(world, currentPos); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - break; - } - } - } - } else { - cycleDone = true; - } - } - - @Override - public int getRefreshCost() { - return 75; - } - - @Override - public int getRefreshTime() { - return 12; - } - - @Override - public void gatherComponents(Consumer components) { - for (int i = -12; i <= -8; i++) { - addRune(components, i, -6, 13, EnumRuneType.AIR); - addRune(components, i, -6, -13, EnumRuneType.FIRE); - - addRune(components, 13, -6, i, EnumRuneType.EARTH); - addRune(components, -13, -6, i, EnumRuneType.WATER); - - addRune(components, i, 5, 13, EnumRuneType.AIR); - addRune(components, i, 5, -13, EnumRuneType.FIRE); - - addRune(components, 13, 5, i, EnumRuneType.EARTH); - addRune(components, -13, 5, i, EnumRuneType.WATER); - } - - for (int i = 8; i <= 12; i++) { - addRune(components, i, -6, 13, EnumRuneType.AIR); - addRune(components, i, -6, -13, EnumRuneType.FIRE); - - addRune(components, 13, -6, i, EnumRuneType.EARTH); - addRune(components, -13, -6, i, EnumRuneType.WATER); - - addRune(components, i, 5, 13, EnumRuneType.AIR); - addRune(components, i, 5, -13, EnumRuneType.FIRE); - - addRune(components, 13, 5, i, EnumRuneType.EARTH); - addRune(components, -13, 5, i, EnumRuneType.WATER); - } - - for (int i = -6; i <= -4; i++) { - addCornerRunes(components, 13, i, EnumRuneType.DUSK); - } - - for (int i = 3; i <= 5; i++) { - addCornerRunes(components, 13, i, EnumRuneType.DUSK); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualAltarBuilder(); - } - - public void lightning(World world, BlockPos blockPos) { - world.addWeatherEffect(new LightningBoltEntity(world, blockPos.getX(), blockPos.getY(), blockPos.getZ(), true)); - } - - /* - * - * These methods are utilities for this ritual. They support both the old - * forge inventory system, and the new one. - */ - public boolean hasItem(TileEntity tileEntity, Item item, int damage, boolean consumeItem) { - if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - if (itemHandler.getSlots() <= 0) { - return false; - } - - for (int i = 0; i < itemHandler.getSlots(); i++) { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() == item && itemHandler.getStackInSlot(i).getItemDamage() == damage && !itemHandler.extractItem(i, 1, !consumeItem).isEmpty()) { - return true; - } - } - } else if (tileEntity instanceof IInventory) { - IInventory inv = (IInventory) tileEntity; - for (int i = 0; i < inv.getSizeInventory(); i++) { - if (!inv.getStackInSlot(0).isEmpty() && inv.getStackInSlot(i).getItem() == item && inv.getStackInSlot(i).getItemDamage() == damage) { - if (consumeItem) { - inv.decrStackSize(i, 1); - } - return true; - } - } - } - } - return false; - } - - public BlockStack getBloodRune(TileEntity tileEntity) { - if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - if (itemHandler.getSlots() <= 0) { - return null; - } - - for (int i = 0; i < itemHandler.getSlots(); i++) { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof BlockItem && Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune && itemHandler.extractItem(i, 1, true) != null) { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(ComponentType.BLOODRUNE), itemHandler.getStackInSlot(i).getItemDamage()); - itemHandler.extractItem(i, 1, false); - return blockStack; - } - } - } else if (tileEntity instanceof IInventory) { - IInventory inv = (IInventory) tileEntity; - for (int i = 0; i < inv.getSizeInventory(); i++) { - if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof BlockItem && Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune) { - BlockStack blockStack = new BlockStack(Utils.getBlockForComponent(ComponentType.BLOODRUNE), inv.getStackInSlot(i).getItemDamage()); - inv.decrStackSize(i, 1); - return blockStack; - } - } - } - } - return null; - } - - public BlockStack getMundaneBlock(TileEntity tileEntity) { - if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - if (itemHandler.getSlots() <= 0) { - return null; - } - - for (int i = 0; i < itemHandler.getSlots(); i++) { - if (!itemHandler.getStackInSlot(i).isEmpty() && itemHandler.getStackInSlot(i).getItem() instanceof BlockItem && !(Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()) instanceof BlockBloodRune) && !itemHandler.extractItem(i, 1, true).isEmpty()) { - Block block = Block.getBlockFromItem(itemHandler.getStackInSlot(i).getItem()); - if (block != Blocks.AIR && block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK) { - BlockStack blockStack = new BlockStack(block, itemHandler.getStackInSlot(i).getItemDamage()); - itemHandler.extractItem(i, 1, false); - return blockStack; - } - } - } - } else if (tileEntity instanceof IInventory) { - IInventory inv = (IInventory) tileEntity; - for (int i = 0; i < inv.getSizeInventory(); i++) { - if (!inv.getStackInSlot(i).isEmpty() && inv.getStackInSlot(i).getItem() instanceof BlockItem && !(Block.getBlockFromItem(inv.getStackInSlot(i).getItem()) instanceof BlockBloodRune)) { - Block block = Block.getBlockFromItem(inv.getStackInSlot(i).getItem()); - if (block != Blocks.GLOWSTONE && block != RegistrarBloodMagicBlocks.DECORATIVE_BRICK) { - BlockStack blockStack = new BlockStack(block, inv.getStackInSlot(i).getItemDamage()); - inv.decrStackSize(i, 1); - return blockStack; - } - } - } - } - } - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java deleted file mode 100644 index a6b61133..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualAnimalGrowth.java +++ /dev/null @@ -1,220 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("animal_growth") -public class RitualAnimalGrowth extends Ritual { - public static final double rawWillDrain = 0.05; - public static final double vengefulWillDrain = 0.02; - public static final double steadfastWillDrain = 0.1; - public static final double destructiveWillDrain = 1; - - public static final String GROWTH_RANGE = "growing"; - public static final String CHEST_RANGE = "chest"; - public static int defaultRefreshTime = 20; - public int refreshTime = 20; - - public RitualAnimalGrowth() { - super("ritualAnimalGrowth", 0, 10000, "ritual." + BloodMagic.MODID + ".animalGrowthRitual"); - addBlockRange(GROWTH_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-2, 1, -2), 5, 2, 5)); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(GROWTH_RANGE, 0, 7, 7); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxGrowths = currentEssence / getRefreshCost(); - int totalGrowths = 0; - BlockPos pos = masterRitualStone.getBlockPos(); - - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity chest = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - IItemHandler itemHandler = null; - if (chest != null) { - itemHandler = Utils.getInventory(chest, null); - } - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - refreshTime = getRefreshTimeForRawWill(rawWill); - - boolean consumeRawWill = rawWill >= rawWillDrain && refreshTime != defaultRefreshTime; - - double vengefulDrain = 0; - double steadfastDrain = 0; - double destructiveDrain = 0; - - boolean decreaseBreedTimer = vengefulWill >= vengefulWillDrain; - boolean breedAnimals = steadfastWill >= steadfastWillDrain && itemHandler != null; - boolean kamikaze = destructiveWill >= destructiveWillDrain; - - AreaDescriptor growingRange = masterRitualStone.getBlockRange(GROWTH_RANGE); - AxisAlignedBB axis = growingRange.getAABB(masterRitualStone.getBlockPos()); - List animalList = world.getEntitiesWithinAABB(AnimalEntity.class, axis); - - boolean performedEffect = false; - - for (AnimalEntity animal : animalList) { - if (animal.getGrowingAge() < 0) { - animal.addGrowth(5); - totalGrowths++; - performedEffect = true; - } else if (animal.getGrowingAge() > 0) { - if (decreaseBreedTimer) { - if (vengefulWill >= vengefulWillDrain) { - animal.setGrowingAge(Math.max(0, animal.getGrowingAge() - getBreedingDecreaseForWill(vengefulWill))); - vengefulDrain += vengefulWillDrain; - vengefulWill -= vengefulWillDrain; - performedEffect = true; - } else { - decreaseBreedTimer = false; - } - } - } else { - if (kamikaze) { - if (destructiveWill >= destructiveWillDrain) { - if (!animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { - animal.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SACRIFICIAL_LAMB, 1200)); - destructiveDrain += destructiveWillDrain; - destructiveWill -= destructiveWillDrain; - performedEffect = true; - } - } else { - kamikaze = false; - } - } - - if (breedAnimals) { - if (steadfastWill >= steadfastWillDrain) { - if (!animal.isInLove()) { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - ItemStack foodStack = itemHandler.getStackInSlot(slot); - if (foodStack != null && animal.isBreedingItem(foodStack) && itemHandler.extractItem(slot, 1, true) != null) { - animal.setInLove(null); - itemHandler.extractItem(slot, 1, false); - steadfastDrain += steadfastWillDrain; - steadfastWill -= steadfastWillDrain; - performedEffect = true; - break; - } - } - } - } else { - breedAnimals = false; - } - } - } - - if (totalGrowths >= maxGrowths) { - break; - } - } - - if (performedEffect && consumeRawWill) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); - } - - if (vengefulDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); - } - - if (steadfastDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrain, true); - } - - if (destructiveDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalGrowths * getRefreshCost())); - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - - addParallelRunes(components, 2, 0, EnumRuneType.DUSK); - addParallelRunes(components, 1, 0, EnumRuneType.WATER); - components.accept(new RitualComponent(new BlockPos(1, 0, 2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(1, 0, -2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-1, 0, 2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(-1, 0, -2), EnumRuneType.EARTH)); - components.accept(new RitualComponent(new BlockPos(2, 0, 1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(2, 0, -1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(-2, 0, 1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(-2, 0, -1), EnumRuneType.AIR)); - } - - @Override - public Ritual getNewCopy() { - return new RitualAnimalGrowth(); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{ - new TranslationTextComponent(this.getTranslationKey() + ".info"), - new TranslationTextComponent(this.getTranslationKey() + ".default.info"), - new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), - new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), - new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), - new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info") - }; - } - - public int getBreedingDecreaseForWill(double vengefulWill) { - return (int) (10 + vengefulWill / 5); - } - - public int getRefreshTimeForRawWill(double rawWill) { - if (rawWill >= rawWillDrain) { - return (int) Math.max(defaultRefreshTime - rawWill / 10, 1); - } - - return defaultRefreshTime; - } - - @Override - public int getRefreshTime() { - return refreshTime; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java deleted file mode 100644 index 482acf7c..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualArmourEvolve.java +++ /dev/null @@ -1,87 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.ritual.*; -import com.google.common.collect.Iterables; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("armour_evolve") -public class RitualArmourEvolve extends Ritual { - public static final String CHECK_RANGE = "fillRange"; - - public RitualArmourEvolve() { - super("ritualArmourEvolve", 2, 50000, "ritual." + BloodMagic.MODID + ".armourEvolveRitual"); - addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - - if (world.isRemote) { - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); - - List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, checkRange.getAABB(pos)); - - for (PlayerEntity player : playerList) { - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = Iterables.toArray(player.getArmorInventoryList(), ItemStack.class)[2]; - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (armour.maxUpgradePoints < 300) { - armour.maxUpgradePoints = 300; - ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); - - masterRitualStone.setActive(false); - - world.spawnEntity(new LightningBoltEntity(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); - } - } - } - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - addCornerRunes(components, 2, 0, EnumRuneType.FIRE); - addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); - addCornerRunes(components, 1, 1, EnumRuneType.DUSK); - addParallelRunes(components, 4, 0, EnumRuneType.EARTH); - addCornerRunes(components, 1, 3, EnumRuneType.DUSK); - addParallelRunes(components, 1, 4, EnumRuneType.EARTH); - - for (int i = 0; i < 4; i++) { - addCornerRunes(components, 3, i, EnumRuneType.EARTH); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualArmourEvolve(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java deleted file mode 100644 index 2e91a184..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCobblestone.java +++ /dev/null @@ -1,96 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileAlchemyArray; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("cobblestone") -public class RitualCobblestone extends Ritual { - - public static final String COBBLESTONE_RANGE = "cobblestoneRange"; - - public RitualCobblestone() { - super("ritualCobblestone", 0, 500, "ritual." + BloodMagic.MODID + ".cobblestoneRitual"); - addBlockRange(COBBLESTONE_RANGE, new AreaDescriptor.Cross(new BlockPos(0, 1, 0), 1)); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); - Block block = Blocks.COBBLESTONE; - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - AreaDescriptor cobblestoneRange = masterRitualStone.getBlockRange(COBBLESTONE_RANGE); - - if (tileEntity != null && tileEntity instanceof TileAlchemyArray) { - TileAlchemyArray alchemyArray = (TileAlchemyArray) tileEntity; - if (!alchemyArray.getStackInSlot(0).isEmpty() && alchemyArray.getStackInSlot(0).getItem() == RegistrarBloodMagicItems.COMPONENT) { - switch (alchemyArray.getStackInSlot(0).getItemDamage()) { - case 0: - block = Blocks.OBSIDIAN; - alchemyArray.decrStackSize(0, 1); - world.setBlockToAir(alchemyArray.getPos()); - break; - case 1: - block = Blocks.NETHERRACK; - alchemyArray.decrStackSize(0, 1); - world.setBlockToAir(alchemyArray.getPos()); - break; - /* - * case 4: block = Blocks.end_stone; - * alchemyArray.decrStackSize(0, 1); - * world.setBlockToAir(alchemyArray.getPos()); break; - */ - default: - break; - } - } - } - - for (BlockPos blockPos : cobblestoneRange.getContainedPositions(masterRitualStone.getBlockPos())) { - if (world.isAirBlock(blockPos)) { - world.setBlockState(blockPos, block.getDefaultState()); - totalEffects++; - } - - if (totalEffects >= maxEffects) { - break; - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshCost() { - return 25; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 1, EnumRuneType.FIRE); - addParallelRunes(components, 1, 0, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualCobblestone(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java deleted file mode 100644 index a126275b..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCondor.java +++ /dev/null @@ -1,89 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("condor") -public class RitualCondor extends Ritual { - public static final String FLIGHT_RANGE = "flightRange"; - - public RitualCondor() { - super("ritualCondor", 0, 1000000, "ritual." + BloodMagic.MODID + ".condorRitual"); - addBlockRange(FLIGHT_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, 0, -10), new BlockPos(10, 30, 10))); - setMaximumVolumeAndDistanceOfRange(FLIGHT_RANGE, 0, 100, 200); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - AxisAlignedBB aabb = masterRitualStone.getBlockRange(FLIGHT_RANGE).getAABB(masterRitualStone.getBlockPos()); - World world = masterRitualStone.getWorldObj(); - - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - List entityPlayers = world.getEntitiesWithinAABB(PlayerEntity.class, aabb); - int entityCount = entityPlayers.size(); - - if (currentEssence < getRefreshCost() * entityCount) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } else { - entityCount = 0; - for (PlayerEntity player : entityPlayers) { - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FLIGHT, 20, 0)); - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * entityCount)); - } - - @Override - public int getRefreshTime() { - return 10; - } - - @Override - public int getRefreshCost() { - return 5; - } - - @Override - public void gatherComponents(Consumer components) { - - addParallelRunes(components, 1, 0, EnumRuneType.DUSK); - addCornerRunes(components, 2, 0, EnumRuneType.AIR); - addOffsetRunes(components, 1, 3, 0, EnumRuneType.EARTH); - addParallelRunes(components, 3, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 3, 4, 0, EnumRuneType.WATER); - addParallelRunes(components, 1, 1, EnumRuneType.FIRE); - addParallelRunes(components, 2, 1, EnumRuneType.BLANK); - addParallelRunes(components, 4, 1, EnumRuneType.BLANK); - addParallelRunes(components, 5, 1, EnumRuneType.AIR); - addParallelRunes(components, 5, 0, EnumRuneType.DUSK); - - for (int i = 2; i <= 4; i++) { - addParallelRunes(components, i, 2, EnumRuneType.EARTH); - } - - addOffsetRunes(components, 2, 1, 4, EnumRuneType.FIRE); - addCornerRunes(components, 2, 4, EnumRuneType.AIR); - addCornerRunes(components, 4, 2, EnumRuneType.FIRE); - - for (int i = -1; i <= 1; i++) { - addOffsetRunes(components, 3, i, 4, EnumRuneType.EARTH); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualCondor(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java deleted file mode 100644 index d458bd29..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualContainment.java +++ /dev/null @@ -1,71 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("containment") -public class RitualContainment extends Ritual { - public static final String CONTAINMENT_RANGE = "containmentRange"; - - public RitualContainment() { - super("ritualContainment", 0, 2000, "ritual." + BloodMagic.MODID + ".containmentRitual"); - addBlockRange(CONTAINMENT_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 0, -3), 7)); - setMaximumVolumeAndDistanceOfRange(CONTAINMENT_RANGE, 0, 10, 10); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - AreaDescriptor containmentRange = masterRitualStone.getBlockRange(CONTAINMENT_RANGE); - - for (LivingEntity entity : world.getEntitiesWithinAABB(LivingEntity.class, containmentRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof PlayerEntity && (((PlayerEntity) entity).capabilities.isCreativeMode || ((PlayerEntity) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) - continue; - - double xDif = entity.posX - (masterRitualStone.getBlockPos().getX() + 0.5); - double yDif = entity.posY - (masterRitualStone.getBlockPos().getY() + 2.5); - double zDif = entity.posZ - (masterRitualStone.getBlockPos().getZ() + 0.5); - - entity.motionX = -0.05 * xDif; - entity.motionY = -0.05 * yDif; - entity.motionZ = -0.05 * zDif; - entity.fallDistance = 0; - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 1; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.EARTH); - addCornerRunes(components, 2, 0, EnumRuneType.EARTH); - addParallelRunes(components, 1, 5, EnumRuneType.EARTH); - addCornerRunes(components, 2, 5, EnumRuneType.EARTH); - } - - @Override - public Ritual getNewCopy() { - return new RitualContainment(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java deleted file mode 100644 index 99cc2548..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrushing.java +++ /dev/null @@ -1,282 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.compress.CompressionRegistry; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.ritual.crushing.CrushingRegistry; -import WayofTime.bloodmagic.ritual.crushing.ICrushingHandler; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -import com.mojang.authlib.GameProfile; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -@RitualRegister("crushing") -public class RitualCrushing extends Ritual { - public static final String CRUSHING_RANGE = "crushingRange"; - public static final String CHEST_RANGE = "chest"; - - public static double rawWillDrain = 0.05; - public static double steadfastWillDrain = 0.2; - public static double destructiveWillDrain = 0.2; - public static double vengefulWillDrain = 0.2; - - public static Map cuttingFluidLPMap = new HashMap<>(); - public static Map cuttingFluidWillMap = new HashMap<>(); - public static int defaultRefreshTime = 40; - private FakePlayer fakePlayer; - public int refreshTime = 40; - - public RitualCrushing() { - super("ritualCrushing", 0, 5000, "ritual." + BloodMagic.MODID + ".crushingRitual"); - addBlockRange(CRUSHING_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-1, -3, -1), 3)); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(CRUSHING_RANGE, 50, 10, 10); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - - if (tile != null && Utils.getNumberOfFreeSlots(tile, Direction.DOWN) < 1) { - return; - } - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - refreshTime = getRefreshTimeForRawWill(rawWill); - - boolean consumeRawWill = rawWill >= rawWillDrain && refreshTime != defaultRefreshTime; - - boolean isSilkTouch = steadfastWill >= steadfastWillDrain; - boolean useCuttingFluid = corrosiveWill > 0; - - int fortune = destructiveWill > 0 ? 3 : 0; - - AreaDescriptor crushingRange = masterRitualStone.getBlockRange(CRUSHING_RANGE); - boolean hasOperated = false; - - double rawDrain = 0; - - for (BlockPos newPos : crushingRange.getContainedPositions(pos)) { - if (world.isAirBlock(newPos)) { - continue; - } - - BlockState state = world.getBlockState(newPos); - Block block = state.getBlock(); - if (block.equals(RegistrarBloodMagicBlocks.RITUAL_CONTROLLER) || block.equals(RegistrarBloodMagicBlocks.RITUAL_STONE) || block.getBlockHardness(state, world, newPos) == -1.0F || Utils.isBlockLiquid(state)) { - continue; - } - - boolean isBlockClaimed = false; - if (useCuttingFluid) { - ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack.isEmpty()) { - continue; - } - - ItemStack copyStack = checkStack.copy(); - - for (ICrushingHandler handler : CrushingRegistry.getCrushingHandlerList()) { - int lpDrain = handler.getLpDrain(); - double willDrain = handler.getWillDrain(); - - if (corrosiveWill < willDrain || currentEssence < lpDrain + getRefreshCost()) { - continue; - } - - ItemStack result = handler.getRecipeOutput(copyStack, world, pos); - - if (result.isEmpty()) { - continue; - } - - if (tile != null) { - result = Utils.insertStackIntoTile(result, tile, Direction.DOWN); - if (!result.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, Direction.UP, result); - } - } else { - Utils.spawnStackAtBlock(world, pos, Direction.UP, result); - } - - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, willDrain, true); - corrosiveWill -= willDrain; - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(lpDrain)); - currentEssence -= lpDrain; - - isBlockClaimed = true; - } - - } - - if (!isBlockClaimed && isSilkTouch && block.canSilkHarvest(world, newPos, state, getFakePlayer((ServerWorld) world))) { - ItemStack checkStack = block.getItem(world, newPos, state); - if (checkStack.isEmpty()) { - continue; - } - - ItemStack copyStack = checkStack.copy(); - - if (steadfastWill >= steadfastWillDrain) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWillDrain, true); - steadfastWill -= steadfastWillDrain; - } else { - continue; - } - - if (tile != null) - copyStack = Utils.insertStackIntoTile(copyStack, tile, Direction.DOWN); - else - Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); - - if (!copyStack.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); - } - } else if (!isBlockClaimed) { - if (fortune > 0 && destructiveWill < destructiveWillDrain) { - fortune = 0; - } - - List stackList = block.getDrops(world, newPos, state, fortune); - - for (ItemStack item : stackList) { - ItemStack copyStack = item.copy(); - - if (tile != null) { - copyStack = Utils.insertStackIntoTile(copyStack, tile, Direction.DOWN); - } else { - Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); - continue; - } - if (!copyStack.isEmpty()) { - Utils.spawnStackAtBlock(world, pos, Direction.UP, copyStack); - } - } - - if (fortune > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveWillDrain, true); - destructiveWill -= destructiveWillDrain; - } - } - - world.destroyBlock(newPos, false); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - hasOperated = true; - - if (consumeRawWill) { - rawDrain += rawWillDrain; - rawWill -= rawWillDrain; - } - - break; - } - - if (hasOperated && tile != null && vengefulWill >= vengefulWillDrain) { - Pair pair = CompressionRegistry.compressInventory(tile, world); - if (pair.getRight()) { - ItemStack returned = pair.getLeft(); - if (returned != null) { - Utils.spawnStackAtBlock(world, pos, Direction.UP, returned); - } - - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulWillDrain, true); - } - } - - if (rawDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); - } - } - - public int getRefreshTimeForRawWill(double rawWill) { - if (rawWill >= rawWillDrain) { - return Math.max(1, (int) (40 - rawWill / 5)); - } - - return defaultRefreshTime; - } - - @Override - public int getRefreshTime() { - return refreshTime; - } - - @Override - public int getRefreshCost() { - return 7; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.EARTH); - addParallelRunes(components, 2, 0, EnumRuneType.FIRE); - addCornerRunes(components, 2, 0, EnumRuneType.DUSK); - addParallelRunes(components, 2, 1, EnumRuneType.AIR); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{ - new TranslationTextComponent(this.getTranslationKey() + ".info"), - new TranslationTextComponent(this.getTranslationKey() + ".default.info"), - new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), - new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), - new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), - new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info") - }; - } - - @Override - public Ritual getNewCopy() { - return new RitualCrushing(); - } - - public static void registerCuttingFluid(ItemStack stack, int lpDrain, double willDrain) { - cuttingFluidLPMap.put(stack, lpDrain); - cuttingFluidWillMap.put(stack, willDrain); - } - - private FakePlayer getFakePlayer(ServerWorld world) { - return fakePlayer == null ? fakePlayer = FakePlayerFactory.get(world, new GameProfile(null, BloodMagic.MODID + "_ritual_crushing")) : fakePlayer; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java deleted file mode 100644 index 2e66f058..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalHarvest.java +++ /dev/null @@ -1,87 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("crystal_harvest") -public class RitualCrystalHarvest extends Ritual { - public static final String CRYSTAL_RANGE = "crystal"; - - public RitualCrystalHarvest() { - super("ritualCrystalHarvest", 0, 40000, "ritual." + BloodMagic.MODID + ".crystalHarvestRitual"); - addBlockRange(CRYSTAL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 2, -3), 7, 5, 7)); - - setMaximumVolumeAndDistanceOfRange(CRYSTAL_RANGE, 250, 5, 7); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = 1; - int totalEffects = 0; - - AreaDescriptor crystalRange = masterRitualStone.getBlockRange(CRYSTAL_RANGE); - - crystalRange.resetIterator(); - while (crystalRange.hasNext()) { - BlockPos nextPos = crystalRange.next().add(pos); - TileEntity tile = world.getTileEntity(nextPos); - if (tile instanceof TileDemonCrystal) { - TileDemonCrystal demonCrystal = (TileDemonCrystal) tile; - if (demonCrystal.dropSingleCrystal()) { - BlockState state = world.getBlockState(nextPos); - world.notifyBlockUpdate(nextPos, state, state, 3); - totalEffects++; - if (totalEffects >= maxEffects) { - break; - } - } - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 25; - } - - @Override - public int getRefreshCost() { - return 50; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.AIR); - addParallelRunes(components, 1, 1, EnumRuneType.DUSK); - addParallelRunes(components, 1, -1, EnumRuneType.FIRE); - addParallelRunes(components, 2, -1, EnumRuneType.FIRE); - addParallelRunes(components, 3, -1, EnumRuneType.FIRE); - addOffsetRunes(components, 3, 1, -1, EnumRuneType.FIRE); - addCornerRunes(components, 3, -1, EnumRuneType.EARTH); - addCornerRunes(components, 3, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 3, 2, 0, EnumRuneType.DUSK); - } - - @Override - public Ritual getNewCopy() { - return new RitualCrystalHarvest(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java deleted file mode 100644 index 7a74317f..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualCrystalSplit.java +++ /dev/null @@ -1,162 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import java.util.function.Consumer; - -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.tile.TileDemonCrystal; - -@RitualRegister("crystal_split") -public class RitualCrystalSplit extends Ritual { - public RitualCrystalSplit() { - super("ritualCrystalSplit", 0, 20000, "ritual." + BloodMagic.MODID + ".crystalSplitRitual"); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - Direction direction = masterRitualStone.getDirection(); - BlockPos rawPos = pos.up(2); - - TileEntity tile = world.getTileEntity(rawPos); - if (!(tile instanceof TileDemonCrystal) || ((TileDemonCrystal) tile).getType() != EnumDemonWillType.DEFAULT) { - return; - } - - BlockState rawState = world.getBlockState(rawPos); - - TileDemonCrystal rawTile = (TileDemonCrystal) tile; - if (rawTile.crystalCount >= 5) { - BlockPos vengefulPos = pos.offset(rotateFacing(Direction.NORTH, direction)).up(); - BlockPos corrosivePos = pos.offset(rotateFacing(Direction.EAST, direction)).up(); - BlockPos steadfastPos = pos.offset(rotateFacing(Direction.SOUTH, direction)).up(); - BlockPos destructivePos = pos.offset(rotateFacing(Direction.WEST, direction)).up(); - - int vengefulCrystals = 0; - int corrosiveCrystals = 0; - int steadfastCrystals = 0; - int destructiveCrystals = 0; - - tile = world.getTileEntity(vengefulPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.VENGEFUL && ((TileDemonCrystal) tile).crystalCount < 7) { - vengefulCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(vengefulPos)) { - // #donothing, no point setting the crystal to 0 again - } else { - return; - } - - tile = world.getTileEntity(corrosivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.CORROSIVE && ((TileDemonCrystal) tile).crystalCount < 7) { - corrosiveCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(corrosivePos)) { - - } else { - return; - } - - tile = world.getTileEntity(steadfastPos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.STEADFAST && ((TileDemonCrystal) tile).crystalCount < 7) { - steadfastCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(steadfastPos)) { - - } else { - return; - } - - tile = world.getTileEntity(destructivePos); - if (tile instanceof TileDemonCrystal && ((TileDemonCrystal) tile).getType() == EnumDemonWillType.DESTRUCTIVE && ((TileDemonCrystal) tile).crystalCount < 7) { - destructiveCrystals = ((TileDemonCrystal) tile).crystalCount; - } else if (!(tile instanceof TileDemonCrystal) && world.isAirBlock(destructivePos)) { - - } else { - return; - } - - rawTile.crystalCount -= 4; - - growCrystal(world, vengefulPos, EnumDemonWillType.VENGEFUL, vengefulCrystals); - growCrystal(world, corrosivePos, EnumDemonWillType.CORROSIVE, corrosiveCrystals); - growCrystal(world, steadfastPos, EnumDemonWillType.STEADFAST, steadfastCrystals); - growCrystal(world, destructivePos, EnumDemonWillType.DESTRUCTIVE, destructiveCrystals); - rawTile.markDirty(); - world.notifyBlockUpdate(rawPos, rawState, rawState, 3); - } - } - - public Direction rotateFacing(Direction facing, Direction rotation) { - switch (rotation) { - case EAST: - return facing.rotateY(); - case SOUTH: - return facing.rotateY().rotateY(); - case WEST: - return facing.rotateYCCW(); - case NORTH: - default: - return facing; - } - } - - public void growCrystal(World world, BlockPos pos, EnumDemonWillType type, int currentCrystalCount) { - if (currentCrystalCount <= 0) { - world.setBlockState(pos, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal()), 3); - } else { - TileDemonCrystal tile = (TileDemonCrystal) world.getTileEntity(pos); - tile.crystalCount++; - tile.markDirty(); - BlockState state = world.getBlockState(pos); - world.notifyBlockUpdate(pos, state, state, 3); - } - } - - @Override - public int getRefreshTime() { - return 20; - } - - @Override - public int getRefreshCost() { - return 1000; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 0, 0, -1, EnumRuneType.FIRE); - addRune(components, 1, 0, 0, EnumRuneType.EARTH); - addRune(components, 0, 0, 1, EnumRuneType.WATER); - addRune(components, -1, 0, 0, EnumRuneType.AIR); - - this.addOffsetRunes(components, 1, 2, -1, EnumRuneType.DUSK); - this.addCornerRunes(components, 1, 0, EnumRuneType.BLANK); - this.addParallelRunes(components, 2, 0, EnumRuneType.DUSK); - } - - @Override - public Ritual getNewCopy() { - return new RitualCrystalSplit(); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info")}; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java deleted file mode 100644 index 9e6a33bd..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEllipsoid.java +++ /dev/null @@ -1,238 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -import java.util.function.Consumer; - -@RitualRegister("ellipsoid") -public class RitualEllipsoid extends Ritual { - public static final String SPHEROID_RANGE = "spheroidRange"; - public static final String CHEST_RANGE = "chest"; - - private boolean cached = false; - private BlockPos currentPos; //Offset - - public RitualEllipsoid() { - super("ritualEllipsoid", 0, 20000, "ritual." + BloodMagic.MODID + ".ellipseRitual"); - addBlockRange(SPHEROID_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -10, -10), new BlockPos(11, 11, 11))); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(SPHEROID_RANGE, 0, 32, 32); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - AreaDescriptor sphereRange = masterRitualStone.getBlockRange(SPHEROID_RANGE); - AxisAlignedBB sphereBB = sphereRange.getAABB(masterPos); - int minX = (int) (masterPos.getX() - sphereBB.minX); - int maxX = (int) (sphereBB.maxX - masterPos.getX()) - 1; - int minY = (int) (masterPos.getY() - sphereBB.minY); - int maxY = (int) (sphereBB.maxY - masterPos.getY()) - 1; - int minZ = (int) (masterPos.getZ() - sphereBB.minZ); - int maxZ = (int) (sphereBB.maxZ - masterPos.getZ()) - 1; - - if (tileInventory != null) { - if (tileInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { - IItemHandler itemHandler = tileInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - if (itemHandler.getSlots() <= 0) { - return; - } - - int blockSlot = -1; - for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { - ItemStack stack = itemHandler.extractItem(invSlot, 1, true); - if (stack.isEmpty() || !(stack.getItem() instanceof BlockItem)) - continue; - - blockSlot = invSlot; - break; - } - - if (blockSlot == -1) { - return; - } - - int xR = Math.max(maxX, minX); - int yR = Math.max(maxY, minY); - int zR = Math.max(maxZ, minZ); - - int j = -minX; - int i = -minY; - int k = -minZ; - - if (currentPos != null) { - j = currentPos.getY(); - i = Math.min(xR, Math.max(-minX, currentPos.getX())); - k = Math.min(zR, Math.max(-minZ, currentPos.getZ())); - } - int checks = 0; - int maxChecks = 100; - - while (j <= maxY) { - while (i <= maxX) { - while (k <= maxZ) { - checks++; - if (checks >= maxChecks) { - this.currentPos = new BlockPos(i, j, k); - return; - } - - if (checkIfEllipsoidShell(xR, yR, zR, i, j, k)) { - BlockPos newPos = masterPos.add(i, j, k); -// - if (!world.getBlockState(newPos).getBlock().isReplaceable(world, newPos)) { - k++; - continue; - } - - BlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(blockSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(blockSlot).getItemDamage()); - world.setBlockState(newPos, placeState); - - itemHandler.extractItem(blockSlot, 1, false); - tileInventory.markDirty(); - //TODO: - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - k++; - this.currentPos = new BlockPos(i, j, k); - return; - } - k++; - } - i++; - k = -minZ; - } - j++; - i = -minX; - this.currentPos = new BlockPos(i, j, k); - return; - } - - j = -minY; - this.currentPos = new BlockPos(i, j, k); - return; - } - } - } - - public boolean checkIfEllipsoidShell(int xR, int yR, int zR, int xOff, int yOff, int zOff) { - //Checking shell in the x-direction - if (!checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff)) { - return false; - } - - return !((checkIfEllipsoid(xR, yR, zR, xOff + 1, yOff, zOff) && checkIfEllipsoid(xR, yR, zR, xOff - 1, yOff, zOff)) && (checkIfEllipsoid(xR, yR, zR, xOff, yOff + 1, zOff) && checkIfEllipsoid(xR, yR, zR, xOff, yOff - 1, zOff)) && (checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff + 1) && checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff - 1))); -// if (xOff * xOff + yOff * yOff + zOff * zOff >= (xR - 0.5) * (xR - 0.5) && xOff * xOff + yOff * yOff + zOff * zOff <= (xR + 0.5) * (xR + 0.5)) -// if (checkIfEllipsoid(xR, yR, zR, xOff, yOff, zOff)) -// { -// if (xOff * xOff / ((xR - 0.5) * (xR - 0.5)) + yOff * yOff / ((yR - 0.5) * (yR - 0.5)) >= 1 - zOff * zOff / ((zR + possOffset) * (zR + possOffset))) -// { -// return true; -// } -// -// if (xOff * xOff / ((xR - 0.5) * (xR - 0.5)) + zOff * zOff / ((zR - 0.5) * (zR - 0.5)) >= 1 - yOff * yOff / ((yR + possOffset) * (yR + possOffset))) -// { -// return true; -// } -// -// if (zOff * zOff / ((zR - 0.5) * (zR - 0.5)) + yOff * yOff / ((yR - 0.5) * (yR - 0.5)) >= 1 - xOff * xOff / ((xR + possOffset) * (xR + possOffset))) -// { -// return true; -// } -// } -// return false; - } - - public boolean checkIfEllipsoid(float xR, float yR, float zR, float xOff, float yOff, float zOff) { - float possOffset = 0.5f; - return xOff * xOff / ((xR + possOffset) * (xR + possOffset)) + yOff * yOff / ((yR + possOffset) * (yR + possOffset)) + zOff * zOff / ((zR + possOffset) * (zR + possOffset)) <= 1; - } - - @Override - public int getRefreshCost() { - return 5; - } - - @Override - public int getRefreshTime() { - return 1; - } - -// @Override -// public void readFromNBT(NBTTagCompound tag) -// { -// super.readFromNBT(tag); -// tag -// } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - - addRune(components, 4, 0, 0, EnumRuneType.FIRE); - addRune(components, 5, 0, 0, EnumRuneType.FIRE); - addRune(components, 5, 0, -1, EnumRuneType.FIRE); - addRune(components, 5, 0, -2, EnumRuneType.FIRE); - addRune(components, -4, 0, 0, EnumRuneType.FIRE); - addRune(components, -5, 0, 0, EnumRuneType.FIRE); - addRune(components, -5, 0, 1, EnumRuneType.FIRE); - addRune(components, -5, 0, 2, EnumRuneType.FIRE); - - addRune(components, 0, 0, 4, EnumRuneType.AIR); - addRune(components, 0, 0, 5, EnumRuneType.AIR); - addRune(components, 1, 0, 5, EnumRuneType.AIR); - addRune(components, 2, 0, 5, EnumRuneType.AIR); - addRune(components, 0, 0, -4, EnumRuneType.AIR); - addRune(components, 0, 0, -5, EnumRuneType.AIR); - addRune(components, -1, 0, -5, EnumRuneType.AIR); - addRune(components, -2, 0, -5, EnumRuneType.AIR); - - addRune(components, 3, 0, 1, EnumRuneType.EARTH); - addRune(components, 3, 0, 2, EnumRuneType.EARTH); - addRune(components, 3, 0, 3, EnumRuneType.EARTH); - addRune(components, 2, 0, 3, EnumRuneType.EARTH); - addRune(components, -3, 0, -1, EnumRuneType.EARTH); - addRune(components, -3, 0, -2, EnumRuneType.EARTH); - addRune(components, -3, 0, -3, EnumRuneType.EARTH); - addRune(components, -2, 0, -3, EnumRuneType.EARTH); - - addRune(components, 1, 0, -3, EnumRuneType.WATER); - addRune(components, 2, 0, -3, EnumRuneType.WATER); - addRune(components, 3, 0, -3, EnumRuneType.WATER); - addRune(components, 3, 0, -2, EnumRuneType.WATER); - addRune(components, -1, 0, 3, EnumRuneType.WATER); - addRune(components, -2, 0, 3, EnumRuneType.WATER); - addRune(components, -3, 0, 3, EnumRuneType.WATER); - addRune(components, -3, 0, 2, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualEllipsoid(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java deleted file mode 100644 index 5c03479f..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualEternalSoul.java +++ /dev/null @@ -1,139 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileAltar; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; - -import java.util.List; -import java.util.UUID; -import java.util.function.Consumer; - -@RitualRegister("eternal_soul") -public class RitualEternalSoul extends Ritual { - public static final String ALTAR_RANGE = "altar"; - - private BlockPos altarOffsetPos = new BlockPos(0, 0, 0); - - public RitualEternalSoul() { - super("ritualEternalSoul", 2, 2000000, "ritual." + BloodMagic.MODID + ".eternalSoulRitual"); - addBlockRange(ALTAR_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-5, -10, -5), 11, 21, 11)); - - setMaximumVolumeAndDistanceOfRange(ALTAR_RANGE, 0, 10, 15); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - UUID owner = masterRitualStone.getOwner(); - int currentEssence = NetworkHelper.getSoulNetwork(owner).getCurrentEssence(); - World world = masterRitualStone.getWorldObj(); - BlockPos pos = masterRitualStone.getBlockPos(); - BlockPos altarPos = pos.add(altarOffsetPos); - - TileEntity tile = world.getTileEntity(altarPos); - AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); - - if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) { - for (BlockPos newPos : altarRange.getContainedPositions(pos)) { - TileEntity nextTile = world.getTileEntity(newPos); - if (nextTile instanceof TileAltar) { - tile = nextTile; - altarOffsetPos = newPos.subtract(pos); - - altarRange.resetCache(); - break; - } - } - } - - if (!(tile instanceof TileAltar)) { - return; - } - - BloodAltar altar = (BloodAltar) tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); - - int horizontalRange = 15; - int verticalRange = 20; - - List list = world.getEntitiesWithinAABB(PlayerEntity.class, - new AxisAlignedBB(pos.getX() - 0.5f, pos.getY() - 0.5f, pos.getZ() - 0.5f, - pos.getX() + 0.5f, pos.getY() + 0.5f, pos.getZ() + 0.5f) - .expand(horizontalRange, verticalRange, horizontalRange).expand(0, -verticalRange, 0)); - - PlayerEntity entityOwner = PlayerHelper.getPlayerFromUUID(owner); - - int fillAmount = Math.min(currentEssence / 2, altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), 10000), false)); - - altar.fill(new FluidStack(BlockLifeEssence.getLifeEssence(), fillAmount), true); - - if (entityOwner != null && list.contains(entityOwner) && entityOwner.getHealth() > 2.0f && fillAmount != 0) - entityOwner.setHealth(2.0f); - - for (PlayerEntity player : list) - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, 100)); - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(fillAmount * 2)); - - } - - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.FIRE); - - for (int i = 0; i < 4; i++) { - addCornerRunes(components, 2, i, EnumRuneType.AIR); - } - - addCornerRunes(components, 4, 1, EnumRuneType.EARTH); - - addOffsetRunes(components, 3, 4, 1, EnumRuneType.EARTH); - - - for (int i = 0; i < 2; i++) { - addCornerRunes(components, 4, i + 2, EnumRuneType.WATER); - } - - addCornerRunes(components, 4, 4, EnumRuneType.DUSK); - - addOffsetRunes(components, 6, 5, 0, EnumRuneType.FIRE); - - - for (int i = 0; i < 2; i++) { - addCornerRunes(components, 6, i, EnumRuneType.FIRE); - } - - for (int i = 0; i < 3; i++) { - addCornerRunes(components, 6, i + 2, EnumRuneType.BLANK); - } - - addCornerRunes(components, 6, 5, EnumRuneType.DUSK); - } - - @Override - public Ritual getNewCopy() { - return new RitualEternalSoul(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java deleted file mode 100644 index 0ec231d5..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualExpulsion.java +++ /dev/null @@ -1,237 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.Utils; -import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.living.EnderTeleportEvent; -import net.minecraftforge.items.IItemHandler; - -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.function.Consumer; - -@RitualRegister("expulsion") -public class RitualExpulsion extends Ritual { - public static final String EXPULSION_RANGE = "expulsionRange"; - - public RitualExpulsion() { - super("ritualExpulsion", 0, 10000, "ritual." + BloodMagic.MODID + ".expulsionRitual"); - addBlockRange(EXPULSION_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-12, 0, -12), 25)); - setMaximumVolumeAndDistanceOfRange(EXPULSION_RANGE, 0, 12, 12); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - if (masterRitualStone.getWorldObj().isRemote) - return; - - AreaDescriptor expulsionRange = masterRitualStone.getBlockRange(EXPULSION_RANGE); - - List whitelist = Lists.newArrayList(); - BlockPos masterPos = masterRitualStone.getBlockPos(); - TileEntity tile = world.getTileEntity(masterPos.up()); - - if (tile != null) { - IItemHandler handler = Utils.getInventory(tile, null); - if (handler != null) { - for (int i = 0; i < handler.getSlots(); i++) { - ItemStack itemStack = handler.getStackInSlot(i); - if (!itemStack.isEmpty() && itemStack.getItem() instanceof IBindable) { - Binding binding = ((IBindable) itemStack.getItem()).getBinding(itemStack); - if (binding != null && !whitelist.contains(binding.getOwnerId())) - whitelist.add(binding.getOwnerId()); - } - } - } - } - - final int teleportDistance = 100; - - for (PlayerEntity player : world.getEntitiesWithinAABB(PlayerEntity.class, expulsionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (player.capabilities.isCreativeMode || player.getGameProfile().getId().equals(masterRitualStone.getOwner()) || whitelist.contains(player.getGameProfile().getId())) - continue; - - if (teleportRandomly(player, teleportDistance)) - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * 1000)); - } - - whitelist.clear(); - } - - public boolean teleportRandomly(LivingEntity entityLiving, double distance) { - if (entityLiving instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entityLiving; - if (player.capabilities.isCreativeMode) - return false; - } - - double x = entityLiving.posX; - double y = entityLiving.posY; - double z = entityLiving.posZ; - Random rand = new Random(); - double randX = x + (rand.nextDouble() - 0.5D) * distance; - double randY = y + (rand.nextInt((int) distance) - (distance) / 2); - double randZ = z + (rand.nextDouble() - 0.5D) * distance; - int i = 0; - - while (!teleportTo(entityLiving, randX, randY, randZ, x, y, z) && i < 100) { - randX = x + (rand.nextDouble() - 0.5D) * distance; - randY = y + (rand.nextInt((int) distance) - (distance) / 2); - randZ = z + (rand.nextDouble() - 0.5D) * distance; - i++; - } - - return i >= 100; - } - - public boolean teleportTo(LivingEntity 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; - } - - moveEntityViaTeleport(entityLiving, event.getTargetX(), event.getTargetY(), event.getTargetZ()); - boolean flag = false; - int i = MathHelper.floor(entityLiving.posX); - int j = MathHelper.floor(entityLiving.posY); - int k = MathHelper.floor(entityLiving.posZ); - int l; - - if (!entityLiving.getEntityWorld().isAirBlock(new BlockPos(i, j, k))) { - boolean flag1 = false; - - while (!flag1 && j > 0) { - BlockState state = entityLiving.getEntityWorld().getBlockState(new BlockPos(i, j - 1, k)); - - if (state.getMaterial().blocksMovement()) { - flag1 = true; - } else { - --entityLiving.posY; - --j; - } - } - - if (flag1) { - moveEntityViaTeleport(entityLiving, entityLiving.posX, entityLiving.posY, entityLiving.posZ); - - if (!entityLiving.collided && !entityLiving.getEntityWorld().containsAnyLiquid(entityLiving.getEntityBoundingBox())) { - flag = true; - } - } - } - - if (!flag) { - moveEntityViaTeleport(entityLiving, lastX, lastY, lastZ); - return false; - } else { - for (l = 0; l < 128; ++l) { - double lengthVal = (double) l / ((double) 128 - 1.0D); - float randF1 = (entityLiving.getEntityWorld().rand.nextFloat() - 0.5F) * 0.2F; - float randF2 = (entityLiving.getEntityWorld().rand.nextFloat() - 0.5F) * 0.2F; - float randF3 = (entityLiving.getEntityWorld().rand.nextFloat() - 0.5F) * 0.2F; - double lengthValX = lastX + (entityLiving.posX - lastX) * lengthVal + (entityLiving.getEntityWorld().rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; - double lengthValY = lastY + (entityLiving.posY - lastY) * lengthVal + entityLiving.getEntityWorld().rand.nextDouble() * (double) entityLiving.height; - double lengthValZ = lastZ + (entityLiving.posZ - lastZ) * lengthVal + (entityLiving.getEntityWorld().rand.nextDouble() - 0.5D) * (double) entityLiving.width * 2.0D; - entityLiving.getEntityWorld().spawnParticle(EnumParticleTypes.PORTAL, lengthValX, lengthValY, lengthValZ, (double) randF1, (double) randF2, (double) randF3); - } - - return true; - } - } - - public void moveEntityViaTeleport(LivingEntity entityLiving, double x, double y, double z) { - if (entityLiving instanceof ServerPlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entityLiving; - - EnderTeleportEvent event = new EnderTeleportEvent(player, x, y, z, 5.0F); - - if (!MinecraftForge.EVENT_BUS.post(event)) { - if (entityLiving.isRiding()) - player.mountEntityAndWakeUp(); - - entityLiving.setPositionAndUpdate(event.getTargetX(), event.getTargetY(), event.getTargetZ()); - } - } else if (entityLiving != null) { - entityLiving.setPosition(x, y, z); - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 2, 0, EnumRuneType.EARTH); - addRune(components, 2, 0, 1, EnumRuneType.EARTH); - addRune(components, 1, 0, 2, EnumRuneType.EARTH); - addRune(components, 2, 0, -1, EnumRuneType.EARTH); - addRune(components, -1, 0, 2, EnumRuneType.EARTH); - addRune(components, -2, 0, 1, EnumRuneType.EARTH); - addRune(components, 1, 0, -2, EnumRuneType.EARTH); - addRune(components, -2, 0, -1, EnumRuneType.EARTH); - addRune(components, -1, 0, -2, EnumRuneType.EARTH); - addRune(components, 4, 0, 2, EnumRuneType.AIR); - addRune(components, 5, 0, 2, EnumRuneType.AIR); - addRune(components, 4, 0, -2, EnumRuneType.AIR); - addRune(components, 5, 0, -2, EnumRuneType.AIR); - addRune(components, -4, 0, 2, EnumRuneType.AIR); - addRune(components, -5, 0, 2, EnumRuneType.AIR); - addRune(components, -4, 0, -2, EnumRuneType.AIR); - addRune(components, -5, 0, -2, EnumRuneType.AIR); - addRune(components, 2, 0, 4, EnumRuneType.AIR); - addRune(components, 2, 0, 5, EnumRuneType.AIR); - addRune(components, -2, 0, 4, EnumRuneType.AIR); - addRune(components, -2, 0, 5, EnumRuneType.AIR); - addRune(components, 2, 0, -4, EnumRuneType.AIR); - addRune(components, 2, 0, -5, EnumRuneType.AIR); - addRune(components, -2, 0, -4, EnumRuneType.AIR); - addRune(components, -2, 0, -5, EnumRuneType.AIR); - addParallelRunes(components, 5, 0, EnumRuneType.DUSK); - addParallelRunes(components, 6, 0, EnumRuneType.EARTH); - addRune(components, -6, 0, 1, EnumRuneType.DUSK); - addRune(components, -6, 0, -1, EnumRuneType.DUSK); - addRune(components, 6, 0, 1, EnumRuneType.DUSK); - addRune(components, 6, 0, -1, EnumRuneType.DUSK); - addRune(components, 1, 0, 6, EnumRuneType.DUSK); - addRune(components, -1, 0, 6, EnumRuneType.DUSK); - addRune(components, 1, 0, -6, EnumRuneType.DUSK); - addRune(components, -1, 0, -6, EnumRuneType.DUSK); - addCornerRunes(components, 4, 0, EnumRuneType.FIRE); - } - - @Override - public Ritual getNewCopy() { - return new RitualExpulsion(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java deleted file mode 100644 index ea4d70e8..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredEarth.java +++ /dev/null @@ -1,93 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("feathered_earth") -public class RitualFeatheredEarth extends Ritual { - public static final String FALL_PROTECTION_RANGE = "fallProtRange"; - - public RitualFeatheredEarth() { - super("ritualFeatheredEarth", 0, 5000, "ritual." + BloodMagic.MODID + ".featheredEarthRitual"); - addBlockRange(FALL_PROTECTION_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-25, 0, -25), new BlockPos(25, 30, 25))); - setMaximumVolumeAndDistanceOfRange(FALL_PROTECTION_RANGE, 0, 200, 200); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - double x = pos.getX(); - double y = pos.getY(); - double z = pos.getZ(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - if (masterRitualStone.getCooldown() > 0) { - world.addWeatherEffect(new LightningBoltEntity(world, x + 4, y + 5, z + 4, false)); - world.addWeatherEffect(new LightningBoltEntity(world, x + 4, y + 5, z - 4, false)); - world.addWeatherEffect(new LightningBoltEntity(world, x - 4, y + 5, z - 4, false)); - world.addWeatherEffect(new LightningBoltEntity(world, x - 4, y + 5, z + 4, false)); - masterRitualStone.setCooldown(0); - } - - AreaDescriptor fallProtRange = masterRitualStone.getBlockRange(FALL_PROTECTION_RANGE); - AxisAlignedBB fallProtBB = fallProtRange.getAABB(masterRitualStone.getBlockPos()); - List entities = world.getEntitiesWithinAABB(LivingEntity.class, fallProtBB); - - for (LivingEntity entity : entities) { - if (totalEffects >= maxEffects) { - break; - } - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FEATHERED, 20, 0)); - totalEffects++; - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 10; - } - - @Override - public int getRefreshCost() { - return 5; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.DUSK); - addCornerRunes(components, 2, 0, EnumRuneType.AIR); - addOffsetRunes(components, 1, 3, 0, EnumRuneType.EARTH); - addParallelRunes(components, 3, 0, EnumRuneType.EARTH); - addCornerRunes(components, 4, 4, EnumRuneType.FIRE); - addOffsetRunes(components, 4, 5, 5, EnumRuneType.AIR); - addOffsetRunes(components, 3, 4, 5, EnumRuneType.AIR); - } - - - @Override - public Ritual getNewCopy() { - return new RitualFeatheredEarth(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java deleted file mode 100644 index 9fe7fa5a..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFeatheredKnife.java +++ /dev/null @@ -1,220 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.EffectInstance; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("feathered_knife") -public class RitualFeatheredKnife extends Ritual { - public static final String ALTAR_RANGE = "altar"; - public static final String DAMAGE_RANGE = "damage"; - - public static double rawWillDrain = 0.05; - public static double destructiveWillDrain = 0.05; - public static double corrosiveWillThreshold = 10; - public static double steadfastWillThreshold = 10; - public static double vengefulWillThreshold = 10; - public static int defaultRefreshTime = 20; - public int refreshTime = 20; - public BlockPos altarOffsetPos = new BlockPos(0, 0, 0); //TODO: Save! - - public RitualFeatheredKnife() { - super("ritualFeatheredKnife", 0, 25000, "ritual." + BloodMagic.MODID + ".featheredKnifeRitual"); - addBlockRange(ALTAR_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-5, -10, -5), 11, 21, 11)); - addBlockRange(DAMAGE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-15, -20, -15), 31, 41, 31)); - - setMaximumVolumeAndDistanceOfRange(ALTAR_RANGE, 0, 10, 15); - setMaximumVolumeAndDistanceOfRange(DAMAGE_RANGE, 0, 25, 15); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - refreshTime = getRefreshTimeForRawWill(rawWill); - - boolean consumeRawWill = rawWill >= rawWillDrain && refreshTime != defaultRefreshTime; - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - BlockPos altarPos = pos.add(altarOffsetPos); - - TileEntity tile = world.getTileEntity(altarPos); - - AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); - - if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof IBloodAltar)) { - for (BlockPos newPos : altarRange.getContainedPositions(pos)) { - TileEntity nextTile = world.getTileEntity(newPos); - if (nextTile instanceof IBloodAltar) { - tile = nextTile; - altarOffsetPos = newPos.subtract(pos); - - altarRange.resetCache(); - break; - } - } - } - - boolean useIncense = corrosiveWill >= corrosiveWillThreshold; - - if (tile instanceof IBloodAltar) { - IBloodAltar tileAltar = (IBloodAltar) tile; - - AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); - AxisAlignedBB range = damageRange.getAABB(pos); - - double destructiveDrain = 0; - - List entities = world.getEntitiesWithinAABB(PlayerEntity.class, range); - - for (PlayerEntity player : entities) { - float healthThreshold = steadfastWill >= steadfastWillThreshold ? 0.7f : 0.3f; - - if (vengefulWill >= vengefulWillThreshold && !player.getGameProfile().getId().equals(masterRitualStone.getOwner())) { - healthThreshold = 0.1f; - } - - float health = player.getHealth(); - float maxHealth = player.getMaxHealth(); - - float sacrificedHealth = 1; - double lpModifier = 1; - - if ((health / player.getMaxHealth() > healthThreshold) && (!useIncense || !player.isPotionActive(RegistrarBloodMagic.SOUL_FRAY))) { - if (useIncense) { - double incenseAmount = PlayerSacrificeHelper.getPlayerIncense(player); - - sacrificedHealth = health - maxHealth * healthThreshold; - lpModifier *= PlayerSacrificeHelper.getModifier(incenseAmount); - - PlayerSacrificeHelper.setPlayerIncense(player, 0); - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, PlayerSacrificeHelper.soulFrayDuration)); - } - - if (destructiveWill >= destructiveWillDrain * sacrificedHealth) { - lpModifier *= getLPModifierForWill(destructiveWill); - destructiveWill -= destructiveWillDrain * sacrificedHealth; - destructiveDrain += destructiveWillDrain * sacrificedHealth; - } - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { - double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); - - lpModifier *= (1 + modifier); - } - } - } - - player.setHealth(health - sacrificedHealth); - - tileAltar.sacrificialDaggerCall((int) (ConfigHandler.values.sacrificialDaggerConversion * lpModifier * sacrificedHealth), false); - - totalEffects++; - - if (totalEffects >= maxEffects) { - break; - } - - } - } - - if (destructiveDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, destructiveDrain, true); - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - if (totalEffects > 0 && consumeRawWill) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWillDrain, true); - } - } - - @Override - public int getRefreshTime() { - return refreshTime; - } - - @Override - public int getRefreshCost() { - return 20; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.DUSK); - addParallelRunes(components, 2, -1, EnumRuneType.WATER); - addCornerRunes(components, 1, -1, EnumRuneType.AIR); - addOffsetRunes(components, 2, 4, -1, EnumRuneType.FIRE); - addOffsetRunes(components, 2, 4, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 4, 3, 0, EnumRuneType.EARTH); - addCornerRunes(components, 3, 0, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualFeatheredKnife(); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info"), new TranslationTextComponent(this.getTranslationKey() + ".default.info"), new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info")}; - } - - public double getLPModifierForWill(double destructiveWill) { - return 1 + destructiveWill * 0.2 / 100; - } - - public int getRefreshTimeForRawWill(double rawWill) { - if (rawWill >= rawWillDrain) { - return 10; - } - - return defaultRefreshTime; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java deleted file mode 100644 index 78a31db5..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFelling.java +++ /dev/null @@ -1,110 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.function.Consumer; - -@RitualRegister("felling") -public class RitualFelling extends Ritual { - public static final String FELLING_RANGE = "fellingRange"; - public static final String CHEST_RANGE = "chest"; - - private ArrayList treePartsCache; - private Iterator blockPosIterator; - - private boolean cached = false; - private BlockPos currentPos; - - public RitualFelling() { - super("ritualFelling", 0, 20000, "ritual." + BloodMagic.MODID + ".fellingRitual"); - addBlockRange(FELLING_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -3, -10), new BlockPos(11, 27, 11))); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(FELLING_RANGE, 14000, 15, 30); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - - treePartsCache = new ArrayList<>(); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - if (!cached || treePartsCache.isEmpty()) { - for (BlockPos blockPos : masterRitualStone.getBlockRange(FELLING_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { - if (!treePartsCache.contains(blockPos)) - if (!world.isAirBlock(blockPos) && (world.getBlockState(blockPos).getBlock().isWood(world, blockPos) || world.getBlockState(blockPos).getBlock().isLeaves(world.getBlockState(blockPos), world, blockPos))) { - treePartsCache.add(blockPos); - } - } - - cached = true; - blockPosIterator = treePartsCache.iterator(); - } - - if (blockPosIterator.hasNext() && tileInventory != null) { - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - currentPos = blockPosIterator.next(); - IItemHandler inventory = Utils.getInventory(tileInventory, Direction.DOWN); - placeInInventory(world.getBlockState(currentPos), world, currentPos, inventory); - world.setBlockToAir(currentPos); - blockPosIterator.remove(); - } - } - - @Override - public int getRefreshCost() { - return 10; - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.EARTH); - addCornerRunes(components, 1, 1, EnumRuneType.EARTH); - } - - @Override - public Ritual getNewCopy() { - return new RitualFelling(); - } - - private void placeInInventory(BlockState choppedState, World world, BlockPos choppedPos, @Nullable IItemHandler inventory) { - if (inventory == null) - return; - - for (ItemStack stack : choppedState.getBlock().getDrops(world, choppedPos, world.getBlockState(choppedPos), 0)) { - ItemStack remainder = ItemHandlerHelper.insertItem(inventory, stack, false); - if (!remainder.isEmpty()) - world.spawnEntity(new ItemEntity(world, choppedPos.getX() + 0.4, choppedPos.getY() + 2, choppedPos.getZ() + 0.4, remainder)); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java deleted file mode 100644 index 30dbc856..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualForsakenSoul.java +++ /dev/null @@ -1,198 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileDemonCrystal; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityRegistry; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("forsaken_soul") -public class RitualForsakenSoul extends Ritual { - public static final String CRYSTAL_RANGE = "crystal"; - public static final String DAMAGE_RANGE = "damage"; - public static final int MAX_UNIQUENESS = 10; - - public static final int HEALTH_THRESHOLD = 20; - - public double willBuffer = 0; - public double crystalBuffer = 0; - - public List keyList = new ArrayList<>(); - - public RitualForsakenSoul() { - super("ritualForsakenSoul", 0, 40000, "ritual." + BloodMagic.MODID + ".forsakenSoulRitual"); - addBlockRange(CRYSTAL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 2, -3), 7, 5, 7)); - addBlockRange(DAMAGE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -10, -10), 21)); - - setMaximumVolumeAndDistanceOfRange(CRYSTAL_RANGE, 250, 5, 7); - setMaximumVolumeAndDistanceOfRange(DAMAGE_RANGE, 0, 10, 10); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - super.readFromNBT(tag); - - willBuffer = tag.getDouble("willBuffer"); - crystalBuffer = tag.getDouble("crystalBuffer"); - - keyList.clear(); - for (int i = 0; i < MAX_UNIQUENESS; i++) { - String key = "uniq" + i; - if (tag.hasKey(key)) { - keyList.add(tag.getInt(key)); - } - } - } - - @Override - public void writeToNBT(CompoundNBT tag) { - super.writeToNBT(tag); - - tag.putDouble("willBuffer", willBuffer); - tag.putDouble("crystalBuffer", crystalBuffer); - - for (int i = 0; i < Math.min(MAX_UNIQUENESS, keyList.size()); i++) { - String key = "uniq" + i; - tag.putInt(key, keyList.get(i)); - } - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = 100; - int totalEffects = 0; - - List crystalList = new ArrayList<>(); - - AreaDescriptor crystalRange = masterRitualStone.getBlockRange(CRYSTAL_RANGE); - - crystalRange.resetIterator(); - while (crystalRange.hasNext()) { - BlockPos nextPos = crystalRange.next().add(pos); - TileEntity tile = world.getTileEntity(nextPos); - if (tile instanceof TileDemonCrystal) { - crystalList.add((TileDemonCrystal) tile); - } - } - - AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); - AxisAlignedBB range = damageRange.getAABB(pos); - - List entities = world.getEntitiesWithinAABB(LivingEntity.class, range); - - for (LivingEntity entity : entities) { - EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); - - if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) - continue; - - if (entity.isEntityAlive() && !(entity instanceof PlayerEntity)) { - if (entity.attackEntityFrom(RitualManager.RITUAL_DAMAGE, 1)) { - if (!entity.isEntityAlive()) { - int uniqueness = calculateUniqueness(entity); - double modifier = 1; - if (entity instanceof AnimalEntity && !((AnimalEntity) entity).collided) { - modifier = 4; - } - - willBuffer += modifier * getWillForUniqueness(uniqueness) / HEALTH_THRESHOLD * entity.getMaxHealth(); - crystalBuffer += modifier * entity.getMaxHealth() / HEALTH_THRESHOLD; - - totalEffects++; - if (totalEffects >= maxEffects) { - break; - } - } - } - } - } - - if (crystalList.size() > 0 && crystalBuffer > 0) { - double growth = Math.min(crystalBuffer, 1); - double willSyphonAmount = growth * willBuffer / crystalBuffer; - TileDemonCrystal chosenCrystal = crystalList.get(world.rand.nextInt(crystalList.size())); - double percentageGrowth = chosenCrystal.growCrystalWithWillAmount(growth * willBuffer / crystalBuffer, growth); - if (percentageGrowth > 0) { - crystalBuffer -= percentageGrowth; - willBuffer -= percentageGrowth * willSyphonAmount; - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - /** - * @param mob - * @return The amount of uniqueness to the last 10 mobs killed - */ - public int calculateUniqueness(LivingEntity mob) { - int key = mob.getClass().hashCode(); - keyList.add(key); - if (keyList.size() > MAX_UNIQUENESS) { - keyList.remove(0); - } - - List uniquenessList = new ArrayList<>(); - for (int value : keyList) { - if (!uniquenessList.contains(value)) { - uniquenessList.add(value); - } - } - - return Math.min(uniquenessList.size(), MAX_UNIQUENESS); - } - - public double getWillForUniqueness(int uniqueness) { - return Math.max(50 - 15 * Math.sqrt(uniqueness), 0); - } - - @Override - public int getRefreshTime() { - return 25; - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.AIR); - addParallelRunes(components, 1, -1, EnumRuneType.DUSK); - addParallelRunes(components, 1, 1, EnumRuneType.FIRE); - addParallelRunes(components, 2, 1, EnumRuneType.FIRE); - addParallelRunes(components, 3, 1, EnumRuneType.FIRE); - addOffsetRunes(components, 3, 1, 1, EnumRuneType.FIRE); - addCornerRunes(components, 3, 1, EnumRuneType.EARTH); - addCornerRunes(components, 3, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 3, 2, 0, EnumRuneType.EARTH); - } - - @Override - public Ritual getNewCopy() { - return new RitualForsakenSoul(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java deleted file mode 100644 index 3a193e91..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualFullStomach.java +++ /dev/null @@ -1,109 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemFood; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.FoodStats; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("full_stomach") -public class RitualFullStomach extends Ritual { - public static final String FILL_RANGE = "fillRange"; - public static final String CHEST_RANGE = "chest"; - - public RitualFullStomach() { - super("ritualFullStomach", 0, 100000, "ritual." + BloodMagic.MODID + ".fullStomachRitual"); - addBlockRange(FILL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-25, -25, -25), 51)); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(FILL_RANGE, 0, 25, 25); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - BlockPos pos = masterRitualStone.getBlockPos(); - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - if (tile == null || !tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)) - return; - - IItemHandler inventory = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); - int lastSlot = 0; - AreaDescriptor fillingRange = masterRitualStone.getBlockRange(FILL_RANGE); - List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, fillingRange.getAABB(pos)); - - for (PlayerEntity player : playerList) { - FoodStats foodStats = player.getFoodStats(); - float satLevel = foodStats.getSaturationLevel(); - - for (int i = lastSlot; i < inventory.getSlots(); i++) { - ItemStack stack = inventory.extractItem(i, 1, true); - if (!stack.isEmpty() && stack.getItem() instanceof ItemFood) { - ItemFood foodItem = (ItemFood) stack.getItem(); - - int healAmount = foodItem.getHealAmount(stack); - float saturationAmount = foodItem.getSaturationModifier(stack) * healAmount * 2.0f; - - // Checks to make sure we're being efficient with the food and not wasting high value foods - // If the food provides more than the max saturation, we just accept it no matter what if the player is low - // Pam please stop being weird. Fix your mod. - if (saturationAmount + satLevel <= 20 || satLevel < 5) { - foodStats.addStats(foodItem, stack); - inventory.extractItem(i, 1, false); - totalEffects++; - lastSlot = i; - break; - } - } - } - - if (totalEffects >= maxEffects) { - masterRitualStone.getOwnerNetwork().causeNausea(); - break; - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 20; - } - - @Override - public int getRefreshCost() { - return 100; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 3, 0, EnumRuneType.FIRE); - addCornerRunes(components, 1, 0, EnumRuneType.AIR); - addOffsetRunes(components, 1, 2, 0, EnumRuneType.AIR); - addCornerRunes(components, 4, 0, EnumRuneType.WATER); - addOffsetRunes(components, 4, 3, 0, EnumRuneType.EARTH); - } - - @Override - public Ritual getNewCopy() { - return new RitualFullStomach(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java deleted file mode 100644 index f1ff9f71..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGreenGrove.java +++ /dev/null @@ -1,277 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.*; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Random; -import java.util.function.Consumer; - -@RitualRegister("green_grove") -public class RitualGreenGrove extends Ritual { - public static final String GROW_RANGE = "growing"; - public static final String LEECH_RANGE = "leech"; - public static final String HYDRATE_RANGE = "hydrate"; - - public static double corrosiveWillDrain = 0.2; - public static double rawWillDrain = 0.05; - public static double vengefulWillDrain = 0.05; - public static double steadfastWillDrain = 0.05; - public static int defaultRefreshTime = 20; - public static double defaultGrowthChance = 0.3; - public static BlockState farmlandState = Blocks.FARMLAND.getDefaultState().withProperty(FarmlandBlock.MOISTURE, 7); - public int refreshTime = 20; - - public RitualGreenGrove() { - super("ritualGreenGrove", 0, 5000, "ritual." + BloodMagic.MODID + ".greenGroveRitual"); - addBlockRange(GROW_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-1, 2, -1), 3, 1, 3)); - addBlockRange(LEECH_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 1)); - addBlockRange(HYDRATE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 1)); - setMaximumVolumeAndDistanceOfRange(GROW_RANGE, 81, 4, 4); - setMaximumVolumeAndDistanceOfRange(LEECH_RANGE, 0, 15, 15); - setMaximumVolumeAndDistanceOfRange(HYDRATE_RANGE, 0, 15, 15); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - BlockPos pos = masterRitualStone.getBlockPos(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxGrowths = currentEssence / getRefreshCost(); - int totalGrowths = 0; - - List willConfig = masterRitualStone.getActiveWillConfig(); - - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - refreshTime = getRefreshTimeForRawWill(rawWill); - double growthChance = getPlantGrowthChanceForWill(vengefulWill); - - boolean consumeRawWill = rawWill >= rawWillDrain && refreshTime != defaultRefreshTime; - boolean consumeVengefulWill = vengefulWill >= vengefulWillDrain && growthChance != defaultGrowthChance; - - double rawDrain = 0; - double vengefulDrain = 0; - - AreaDescriptor growingRange = masterRitualStone.getBlockRange(GROW_RANGE); - - int maxGrowthVolume = getMaxVolumeForRange(GROW_RANGE, willConfig, holder); - if (!growingRange.isWithinRange(getMaxVerticalRadiusForRange(GROW_RANGE, willConfig, holder), getMaxHorizontalRadiusForRange(GROW_RANGE, willConfig, holder)) || (maxGrowthVolume != 0 && growingRange.getVolume() > maxGrowthVolume)) { - return; - } - - for (BlockPos newPos : growingRange.getContainedPositions(pos)) { - BlockState state = world.getBlockState(newPos); - - if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) { - boolean flag = state.getBlock() instanceof IGrowable || state.getBlock() instanceof CactusBlock || state.getBlock() instanceof SugarCaneBlock; - if (flag) { - if (world.rand.nextDouble() < growthChance) { - state.getBlock().updateTick(world, newPos, state, new Random()); - BlockState newState = world.getBlockState(newPos); - if (!newState.equals(state)) { - world.playEvent(2005, newPos, 0); - totalGrowths++; - if (consumeRawWill) { - rawWill -= rawWillDrain; - rawDrain += rawWillDrain; - } - - if (consumeVengefulWill) { - vengefulWill -= vengefulWillDrain; - vengefulDrain += vengefulWillDrain; - } - } - } - } - } - - if (totalGrowths >= maxGrowths || (consumeRawWill && rawWill < rawWillDrain) || (consumeVengefulWill && vengefulWill < vengefulWillDrain)) { - break; - } - } - - if (rawDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); - } - - if (vengefulDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); - } - - AreaDescriptor hydrateRange = masterRitualStone.getBlockRange(HYDRATE_RANGE); - - double steadfastDrain = 0; - if (steadfastWill > steadfastWillDrain) { - AxisAlignedBB aabb = hydrateRange.getAABB(pos); - steadfastDrain += steadfastWillDrain * Utils.plantSeedsInArea(world, aabb, 2, 1); - steadfastWill -= steadfastDrain; - - for (BlockPos newPos : hydrateRange.getContainedPositions(pos)) { - if (steadfastWill < steadfastWillDrain) { - break; - } - - BlockState state = world.getBlockState(newPos); - Block block = state.getBlock(); - - boolean hydratedBlock = false; - if (block == Blocks.DIRT || block == Blocks.GRASS) { - world.setBlockState(newPos, farmlandState); - hydratedBlock = true; - } else if (block == Blocks.FARMLAND) { - int meta = block.getMetaFromState(state); - if (meta < 7) { - world.setBlockState(newPos, farmlandState); - hydratedBlock = true; - } - } - - if (hydratedBlock) { - steadfastWill -= steadfastWillDrain; - steadfastDrain += steadfastWillDrain; - } - } - } - - if (steadfastDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrain, true); - } - - double corrosiveDrain = 0; - if (corrosiveWill > corrosiveWillDrain) { - AreaDescriptor leechRange = masterRitualStone.getBlockRange(LEECH_RANGE); - AxisAlignedBB mobArea = leechRange.getAABB(pos); - List entityList = world.getEntitiesWithinAABB(LivingEntity.class, mobArea); - for (LivingEntity entityLiving : entityList) { - if (corrosiveWill < corrosiveWillDrain) { - break; - } - - if (entityLiving instanceof PlayerEntity) { - continue; - } - - if (entityLiving.isPotionActive(RegistrarBloodMagic.PLANT_LEECH) || !entityLiving.isPotionApplicable(new EffectInstance(RegistrarBloodMagic.PLANT_LEECH))) { - continue; - } - - entityLiving.addPotionEffect(new EffectInstance(RegistrarBloodMagic.PLANT_LEECH, 200, 0)); - - corrosiveWill -= corrosiveWillDrain; - corrosiveDrain += corrosiveWillDrain; - } - - if (corrosiveDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalGrowths * getRefreshCost())); - } - - public double getPlantGrowthChanceForWill(double will) { - if (will > 0) { - return 0.3 + will / 200; - } - - return defaultGrowthChance; - } - - public int getRefreshTimeForRawWill(double rawWill) { - if (rawWill > 0) { - return 10; - } - - return defaultRefreshTime; - } - - @Override - public int getRefreshTime() { - return refreshTime; - } - - @Override - public int getMaxVolumeForRange(String range, List activeTypes, DemonWillHolder holder) { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return 81 + (int) Math.pow(destructiveWill / 4, 1.5); - } - } - - return volumeRangeMap.get(range); - } - - @Override - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return (int) (4 + destructiveWill / 10d); - } - } - - return verticalRangeMap.get(range); - } - - @Override - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - if (GROW_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return (int) (4 + destructiveWill / 10d); - } - } - - return horizontalRangeMap.get(range); - } - - @Override - public int getRefreshCost() { - return 20; //TODO: Need to find a way to balance this - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.EARTH); - addParallelRunes(components, 1, 0, EnumRuneType.WATER); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info"), new TranslationTextComponent(this.getTranslationKey() + ".default.info"), new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info")}; - } - - @Override - public Ritual getNewCopy() { - return new RitualGreenGrove(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java deleted file mode 100644 index f3ee4078..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualGrounding.java +++ /dev/null @@ -1,199 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.MoverType; -import net.minecraft.entity.boss.dragon.EnderDragonEntity; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("grounding") -public class RitualGrounding extends Ritual { - - public static final int willRefreshTime = 20; - public static final String GROUNDING_RANGE = "groundingRange"; - public static final double willDrain = 0.5; - - public RitualGrounding() { - super("ritualGrounding", 0, 5000, "ritual." + BloodMagic.MODID + ".groundingRitual"); - addBlockRange(GROUNDING_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, 0, -10), 21, 30, 21)); - setMaximumVolumeAndDistanceOfRange(GROUNDING_RANGE, 0, 200, 200); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - /* Default Ritual Stuff */ - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - /* Default will augment stuff */ - List willConfig = masterRitualStone.getActiveWillConfig(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - double rawDrained = 0; - double corrosiveDrained = 0; - double destructiveDrained = 0; - double steadfastDrained = 0; - double vengefulDrained = 0; - - /* Actual ritual stuff begins here */ - AreaDescriptor groundingRange = masterRitualStone.getBlockRange(GROUNDING_RANGE); - List entities = world.getEntitiesWithinAABB(LivingEntity.class, groundingRange.getAABB(pos)); - for (LivingEntity entity : entities) { - if (totalEffects >= maxEffects) { - break; - } - - if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) - continue; - - totalEffects++; - - - if (entity instanceof PlayerEntity) { - /* Raw will effect: Affects players */ - if (world.getTotalWorldTime() % 10 == 0) { - if (rawWill >= willDrain) { - - rawDrained += willDrain; - - double[] drainagePlayer = sharedWillEffects(world, entity, corrosiveWill, destructiveWill, vengefulWill, corrosiveDrained, destructiveDrained, vengefulDrained); - - corrosiveDrained += drainagePlayer[0]; - destructiveDrained += drainagePlayer[1]; - vengefulDrained += drainagePlayer[2]; - } - } - } else if (entity.isNonBoss()) { - if (world.getTotalWorldTime() % 10 == 0) { - double[] drainageEntity = sharedWillEffects(world, entity, corrosiveWill, destructiveWill, vengefulWill, corrosiveDrained, destructiveDrained, vengefulDrained); - - corrosiveDrained += drainageEntity[0]; - destructiveDrained += drainageEntity[1]; - vengefulDrained += drainageEntity[2]; - } - } else if (!entity.isNonBoss()) { - /* Steadfast will effect: Affects bosses - (some bosses, like the wither, have a restriction to motion modification, - others, like the Ender Dragon, don't do potions) */ - if (steadfastWill >= willDrain) { - if (entity instanceof WitherEntity || entity instanceof EnderDragonEntity) - entity.move(MoverType.SELF, 0, -0.05, 0); // to work on Wither and EnderDragon without interfering with other mod author's decisions (looking at you, Vazkii) - - steadfastDrained += willDrain / 10f; - - double[] drainagePlayer = sharedWillEffects(world, entity, corrosiveWill, destructiveWill, vengefulWill, corrosiveDrained, destructiveDrained, vengefulDrained); - - corrosiveDrained += drainagePlayer[0]; - destructiveDrained += drainagePlayer[1]; - vengefulDrained += drainagePlayer[2]; - } - } - } - - - if (rawDrained > 0) - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrained, true); - if (corrosiveDrained > 0) - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrained, true); - if (destructiveDrained > 0) - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrained, true); - if (steadfastDrained > 0) - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrained, true); - if (vengefulDrained > 0) - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrained, true); - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return Math.max(1, getBlockRange(GROUNDING_RANGE).getVolume() / 10000); - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.DUSK); - addCornerRunes(components, 2, 2, EnumRuneType.EARTH); - addCornerRunes(components, 3, 3, EnumRuneType.EARTH); - } - - - @Override - public Ritual getNewCopy() { - return new RitualGrounding(); - } - - public double[] sharedWillEffects(World world, LivingEntity entity, double corrosiveWill, double destructiveWill, double vengefulWill, double corrosiveDrained, double destructiveDrained, double vengefulDrained) { - /* Combination of corrosive + vengeful will: Levitation */ - if (corrosiveWill >= willDrain && vengefulWill >= willDrain) { - - entity.addPotionEffect(new EffectInstance(Effects.LEVITATION, 20, 10)); - vengefulDrained += willDrain; - corrosiveDrained += willDrain; - - /* Corrosive will effect: Suspension */ - } else if (corrosiveWill >= willDrain) { - - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SUSPENDED, 20, 0)); - corrosiveDrained += willDrain; - - /* Vengeful will effect: Stronger effect */ - } else if (vengefulWill >= willDrain) { - - vengefulDrained += willDrain; - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.GROUNDED, 40, 20)); - - } else - - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.GROUNDED, 20, 10)); - - /* Destructive will effect: Increased fall damage */ - if (destructiveWill >= willDrain) { - destructiveDrained += willDrain; - - /* Combination of destructive + vengeful will: stronger destructive effect */ - if (vengefulWill >= willDrain + vengefulDrained) { - if (world.getTotalWorldTime() % 100 == 0) { - vengefulDrained += willDrain; - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.HEAVY_HEART, 200, 2)); - } - - } else if (world.getTotalWorldTime() % 50 == 0) - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.HEAVY_HEART, 100, 1)); - } - return new double[]{corrosiveDrained, destructiveDrained, vengefulDrained}; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java deleted file mode 100644 index 73cb2ed2..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualHarvest.java +++ /dev/null @@ -1,122 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.ritual.harvest.HarvestRegistry; -import WayofTime.bloodmagic.ritual.harvest.IHarvestHandler; -import com.google.common.collect.Lists; -import net.minecraft.block.BlockState; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; - -import java.util.List; -import java.util.function.Consumer; - -/** - * This ritual uses registered {@link IHarvestHandler}'s to harvest blocks. - *

- * To register a new Handler for this ritual use - * {@link HarvestRegistry#registerHandler(IHarvestHandler)} - *

- * This ritual includes a way to change the range based on what block is above - * the MasterRitualStone. You can use - * {@link HarvestRegistry#registerRangeAmplifier(BlockState, int)} to register a - * new amplifier. - */ -@RitualRegister("harvest") -public class RitualHarvest extends Ritual { - public static final String HARVEST_RANGE = "harvestRange"; - - public RitualHarvest() { - super("ritualHarvest", 0, 20000, "ritual." + BloodMagic.MODID + ".harvestRitual"); - addBlockRange(HARVEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-4, 1, -4), 9, 5, 9)); - setMaximumVolumeAndDistanceOfRange(HARVEST_RANGE, 0, 15, 15); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (masterRitualStone.getOwnerNetwork().getCurrentEssence() < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int harvested = 0; - - AreaDescriptor harvestArea = masterRitualStone.getBlockRange(HARVEST_RANGE); - - harvestArea.resetIterator(); - while (harvestArea.hasNext()) { - BlockPos nextPos = harvestArea.next().add(pos); - if (harvestBlock(world, nextPos, masterRitualStone.getBlockPos())) { - harvested++; - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * harvested)); - } - - @Override - public int getRefreshCost() { - return 20; - } - - @Override - public int getRefreshTime() { - return 5; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - addParallelRunes(components, 2, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 3, 1, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 3, 2, 0, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualHarvest(); - } - - public static boolean harvestBlock(World world, BlockPos cropPos, BlockPos controllerPos) { - BlockState harvestState = world.getBlockState(cropPos); - TileEntity potentialInventory = world.getTileEntity(controllerPos.up()); - IItemHandler itemHandler = null; - if (potentialInventory != null && potentialInventory.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) - itemHandler = potentialInventory.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - for (IHarvestHandler handler : HarvestRegistry.getHarvestHandlers()) { - if (handler.test(world, cropPos, harvestState)) { - List drops = Lists.newArrayList(); - if (handler.harvest(world, cropPos, harvestState, drops)) { - for (ItemStack stack : drops) { - if (stack.isEmpty()) - continue; - - // TODO I wrote this, but didn't actually think about whether it should be a thing. Remove the true if we want to keep it - if (itemHandler == null || true) - InventoryHelper.spawnItemStack(world, cropPos.getX(), cropPos.getY(), cropPos.getZ(), stack); - else { - ItemStack remainder = ItemHandlerHelper.insertItemStacked(itemHandler, stack, false); - if (!remainder.isEmpty()) - InventoryHelper.spawnItemStack(world, cropPos.getX(), cropPos.getY(), cropPos.getZ(), remainder); - } - } - return true; - } - } - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java deleted file mode 100644 index 56d3323b..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualInterdiction.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("interdiction") -public class RitualInterdiction extends Ritual { - public static final String INTERDICTION_RANGE = "interdictionRange"; - - public RitualInterdiction() { - super("ritualInterdiction", 0, 1000, "ritual." + BloodMagic.MODID + ".interdictionRitual"); - addBlockRange(INTERDICTION_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-2, 0, -2), 5)); - setMaximumVolumeAndDistanceOfRange(INTERDICTION_RANGE, 0, 10, 10); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - AreaDescriptor interdictionRange = masterRitualStone.getBlockRange(INTERDICTION_RANGE); - - for (LivingEntity entity : world.getEntitiesWithinAABB(LivingEntity.class, interdictionRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity instanceof PlayerEntity && (((PlayerEntity) entity).capabilities.isCreativeMode || ((PlayerEntity) entity).getGameProfile().getId().equals(masterRitualStone.getOwner()))) - continue; - - double xDif = entity.posX - (masterRitualStone.getBlockPos().getX() + 0.5); - double yDif = entity.posY - masterRitualStone.getBlockPos().getY() + 1; - double zDif = entity.posZ - (masterRitualStone.getBlockPos().getZ() + 0.5); - - entity.motionX = 0.1 * xDif; - entity.motionY = 0.1 * yDif; - entity.motionZ = 0.1 * zDif; - entity.fallDistance = 0; - - if (entity instanceof PlayerEntity) { - entity.velocityChanged = true; - } - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 1; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.AIR); - addParallelRunes(components, 1, 0, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualInterdiction(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java deleted file mode 100644 index bfc32dc2..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualJumping.java +++ /dev/null @@ -1,85 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("jumping") -public class RitualJumping extends Ritual { - public static final String JUMP_RANGE = "jumpRange"; - public static final String JUMP_POWER = "jumpPower"; - - public RitualJumping() { - super("ritualJump", 0, 5000, "ritual." + BloodMagic.MODID + ".jumpRitual"); - addBlockRange(JUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-1, 1, -1), 3, 1, 3)); - setMaximumVolumeAndDistanceOfRange(JUMP_RANGE, 0, 5, 5); - addBlockRange(JUMP_POWER, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 0, 5, 0)); - setMaximumVolumeAndDistanceOfRange(JUMP_POWER, 0, 0, 100); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - AreaDescriptor jumpRange = masterRitualStone.getBlockRange(JUMP_RANGE); - List entities = world.getEntitiesWithinAABB(LivingEntity.class, jumpRange.getAABB(masterRitualStone.getBlockPos())); - for (LivingEntity entity : entities) { - if (totalEffects >= maxEffects) { - break; - } - - double motionY = masterRitualStone.getBlockRange(JUMP_POWER).getHeight() * 0.3; - - entity.fallDistance = 0; - if (entity.isSneaking()) { - continue; - } - - entity.motionY = motionY; - totalEffects++; - - if (entity instanceof PlayerEntity) { - Utils.setPlayerSpeedFromServer((PlayerEntity) entity, entity.motionX, entity.motionY, entity.motionZ); - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return getBlockRange(JUMP_POWER).getHeight(); - } - - @Override - public void gatherComponents(Consumer components) { - for (int i = -1; i <= 1; i++) - addCornerRunes(components, 1, i, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualJumping(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java deleted file mode 100644 index 4c1f8d11..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLava.java +++ /dev/null @@ -1,297 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("lava") -public class RitualLava extends Ritual { - public static final String LAVA_RANGE = "lavaRange"; - public static final String FIRE_FUSE_RANGE = "fireFuse"; - public static final String FIRE_RESIST_RANGE = "fireResist"; - public static final String FIRE_DAMAGE_RANGE = "fireDamage"; - public static final String LAVA_TANK_RANGE = "lavaTank"; - - public static final double vengefulWillDrain = 1; - public static final double steadfastWillDrain = 0.5; - public static final double corrosiveWillDrain = 0.2; - public static final int corrosiveRefreshTime = 20; - public int timer = 0; - - public RitualLava() { - super("ritualLava", 0, 10000, "ritual." + BloodMagic.MODID + ".lavaRitual"); - addBlockRange(LAVA_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - addBlockRange(FIRE_FUSE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-2, -2, -2), 5)); - addBlockRange(FIRE_RESIST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 1)); - addBlockRange(FIRE_DAMAGE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 1)); - addBlockRange(LAVA_TANK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(LAVA_RANGE, 9, 3, 3); - setMaximumVolumeAndDistanceOfRange(FIRE_FUSE_RANGE, 0, 10, 10); - setMaximumVolumeAndDistanceOfRange(FIRE_RESIST_RANGE, 0, 10, 10); - setMaximumVolumeAndDistanceOfRange(FIRE_DAMAGE_RANGE, 0, 10, 10); - setMaximumVolumeAndDistanceOfRange(LAVA_TANK_RANGE, 1, 10, 10); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - timer++; - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - int lpDrain = 0; - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - List willConfig = masterRitualStone.getActiveWillConfig(); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double rawDrained = 0; - - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - AreaDescriptor lavaRange = masterRitualStone.getBlockRange(LAVA_RANGE); - - int maxLavaVolume = getMaxVolumeForRange(LAVA_RANGE, willConfig, holder); - if (!lavaRange.isWithinRange(getMaxVerticalRadiusForRange(LAVA_RANGE, willConfig, holder), getMaxHorizontalRadiusForRange(LAVA_RANGE, willConfig, holder)) || (maxLavaVolume != 0 && lavaRange.getVolume() > maxLavaVolume)) { - return; - } - - for (BlockPos newPos : lavaRange.getContainedPositions(pos)) { - BlockState state = world.getBlockState(newPos); - if (world.isAirBlock(newPos) || Utils.isFlowingLiquid(state)) { - int lpCost = getLPCostForRawWill(rawWill); - if (currentEssence < lpCost) { - break; - } - world.setBlockState(newPos, Blocks.FLOWING_LAVA.getDefaultState()); - currentEssence -= lpCost; - lpDrain += lpCost; - if (rawWill > 0) { - double drain = getWillCostForRawWill(rawWill); - rawWill -= drain; - rawDrained += drain; - } - } - } - - if (rawWill > 0) { - AreaDescriptor chestRange = masterRitualStone.getBlockRange(LAVA_TANK_RANGE); - TileEntity tile = world.getTileEntity(chestRange.getContainedPositions(pos).get(0)); - double drain = getWillCostForRawWill(rawWill); - int lpCost = getLPCostForRawWill(rawWill); - - if (rawWill >= drain && currentEssence >= lpCost) { - if (tile != null) { - if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); - double filled = handler.fill(new FluidStack(FluidRegistry.LAVA, 1000), true); - - double ratio = filled / 1000; - - rawWill -= drain * ratio; - rawDrained += drain * ratio; - - currentEssence -= Math.ceil(lpCost * ratio); - lpDrain += Math.ceil(lpCost * ratio); - } - } - } - } - - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - - if (vengefulWill >= vengefulWillDrain) { - double vengefulDrained = 0; - AreaDescriptor fuseRange = masterRitualStone.getBlockRange(FIRE_FUSE_RANGE); - - AxisAlignedBB fuseArea = fuseRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(LivingEntity.class, fuseArea); - - for (LivingEntity entity : entities) { - if (vengefulWill < vengefulWillDrain) { - break; - } - - if (entity instanceof PlayerEntity) { - continue; - } - - if (!entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) { - entity.addPotionEffect(new EffectInstance(RegistrarBloodMagic.FIRE_FUSE, 100, 0)); - - vengefulDrained += vengefulWillDrain; - vengefulWill -= vengefulWillDrain; - } - } - - if (vengefulDrained > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrained, true); - } - } - - if (steadfastWill >= steadfastWillDrain) { - double steadfastDrained = 0; - AreaDescriptor resistRange = masterRitualStone.getBlockRange(FIRE_RESIST_RANGE); - - int duration = getFireResistForWill(steadfastWill); - - AxisAlignedBB resistArea = resistRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(PlayerEntity.class, resistArea); - - for (PlayerEntity entity : entities) { - if (steadfastWill < steadfastWillDrain) { - break; - } - if (!entity.isPotionActive(Effects.FIRE_RESISTANCE) || (entity.getActivePotionEffect(Effects.FIRE_RESISTANCE).getDuration() < 2)) { - entity.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, 100, 0)); - - steadfastDrained += steadfastWillDrain; - steadfastWill -= steadfastWillDrain; - } - } - - if (steadfastDrained > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastDrained, true); - } - } - - if (timer % corrosiveRefreshTime == 0 && corrosiveWill >= corrosiveWillDrain) { - double corrosiveDrained = 0; - AreaDescriptor resistRange = masterRitualStone.getBlockRange(FIRE_DAMAGE_RANGE); - - float damage = getCorrosiveDamageForWill(corrosiveWill); - - AxisAlignedBB damageArea = resistRange.getAABB(pos); - List entities = world.getEntitiesWithinAABB(LivingEntity.class, damageArea); - - for (LivingEntity entity : entities) { - if (corrosiveWill < corrosiveWillDrain) { - break; - } - - if (!entity.isDead && entity.hurtTime <= 0 && Utils.isImmuneToFireDamage(entity)) { - if (entity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, damage)) { - corrosiveDrained += corrosiveWillDrain; - corrosiveWill -= corrosiveWillDrain; - } - } - } - - if (corrosiveDrained > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrained, true); - } - } - - if (rawDrained > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrained, true); - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(lpDrain)); - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 500; - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info"), new TranslationTextComponent(this.getTranslationKey() + ".default.info"), new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info")}; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 1, 0, EnumRuneType.FIRE); - } - - @Override - public Ritual getNewCopy() { - return new RitualLava(); - } - - @Override - public int getMaxVolumeForRange(String range, List activeTypes, DemonWillHolder holder) { - if (LAVA_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return 9 + (int) Math.pow(destructiveWill / 10, 1.5); - } - } - - return volumeRangeMap.get(range); - } - - @Override - public int getMaxVerticalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - if (LAVA_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return (int) (3 + destructiveWill / 10d); - } - } - - return verticalRangeMap.get(range); - } - - @Override - public int getMaxHorizontalRadiusForRange(String range, List activeTypes, DemonWillHolder holder) { - if (LAVA_RANGE.equals(range) && activeTypes.contains(EnumDemonWillType.DESTRUCTIVE)) { - double destructiveWill = holder.getWill(EnumDemonWillType.DESTRUCTIVE); - if (destructiveWill > 0) { - return (int) (3 + destructiveWill / 10d); - } - } - - return horizontalRangeMap.get(range); - } - - public int getFireResistForWill(double steadfastWill) { - return (int) (200 + steadfastWill * 3); - } - - public float getCorrosiveDamageForWill(double corrosiveWill) { - return (float) (1 + corrosiveWill * 0.05); - } - - public int getLPCostForRawWill(double raw) { - return Math.max((int) (500 - raw), 0); - } - - public double getWillCostForRawWill(double raw) { - return Math.min(1, raw / 500); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java deleted file mode 100644 index 4fa5220c..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualLivingArmourDowngrade.java +++ /dev/null @@ -1,208 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.registry.LivingArmourDowngradeRecipeRegistry; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.recipe.LivingArmourDowngradeRecipe; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.item.ItemFrameEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("armour_downgrade") -public class RitualLivingArmourDowngrade extends Ritual { - public static final String DOWNGRADE_RANGE = "containmentRange"; - private int internalTimer = 0; - - public RitualLivingArmourDowngrade() { - super("ritualDowngrade", 2, 10000, "ritual." + BloodMagic.MODID + ".downgradeRitual"); - addBlockRange(DOWNGRADE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-3, 0, -3), 7)); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos masterPos = masterRitualStone.getBlockPos(); - - AreaDescriptor downgradeRange = masterRitualStone.getBlockRange(DOWNGRADE_RANGE); - - boolean isActivatorPresent = false; - for (PlayerEntity player : world.getEntitiesWithinAABB(PlayerEntity.class, downgradeRange.getAABB(masterRitualStone.getBlockPos()))) { - if (player.getGameProfile().getId().equals(masterRitualStone.getOwner())) { - ItemStack keyStack = getStackFromItemFrame(world, masterPos, masterRitualStone.getDirection()); - if (keyStack.isEmpty()) { - return; - } - - List textList = LivingArmourDowngradeRecipeRegistry.getDialogForProcessTick(keyStack, internalTimer); - if (textList != null) { - ChatUtil.sendChat(player, textList.toArray(new ITextComponent[textList.size()])); - } - - internalTimer++; - - if (player.isSneaking()) { - double distance2 = masterPos.offset(Direction.UP).distanceSqToCenter(player.posX, player.posY, player.posZ); - if (distance2 > 1) { - return; - } - - BlockPos chestPos = masterPos.offset(masterRitualStone.getDirection(), 2).offset(Direction.UP); - TileEntity tile = world.getTileEntity(chestPos); - if (tile == null) { - return; - } - IItemHandler inv = Utils.getInventory(tile, null); - if (inv != null) { - List recipeList = new ArrayList<>(); - for (int i = 0; i < inv.getSlots(); i++) { - ItemStack invStack = inv.getStackInSlot(i); - if (!invStack.isEmpty()) { - recipeList.add(invStack); - } - } - - LivingArmourDowngradeRecipe recipe = LivingArmourDowngradeRecipeRegistry.getMatchingRecipe(keyStack, recipeList, world, masterPos); - if (recipe != null) { - LivingArmourUpgrade upgrade = recipe.getRecipeOutput(); - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (armour.canApplyUpgrade(player, upgrade)) { - if (armour.upgradeArmour(player, upgrade)) { - ItemLivingArmour.setLivingArmour(chestStack, armour); - - recipe.consumeInventory(inv); - - LightningBoltEntity lightning = new LightningBoltEntity(world, chestPos.getX(), chestPos.getY(), chestPos.getZ(), true); - world.spawnEntity(lightning); - - masterRitualStone.setActive(false); - } - } else { - //TODO: You are not able to receive my blessing... - //TODO: Need to add a timer that will stop it from working. - } - } - } - } - } - } - - return; - } - } - - if (!isActivatorPresent) { - internalTimer = 0; - } - } - - @Override - public void readFromNBT(CompoundNBT tag) { - super.readFromNBT(tag); - - this.internalTimer = tag.getInt("internalTimer"); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - super.writeToNBT(tag); - - tag.putInt("internalTimer", internalTimer); - } - - public ItemStack getStackFromItemFrame(World world, BlockPos masterPos, Direction direction) { - BlockPos offsetPos = new BlockPos(0, 3, 0); - offsetPos = offsetPos.offset(direction, 2); - - AxisAlignedBB bb = new AxisAlignedBB(masterPos.add(offsetPos)); - List frames = world.getEntitiesWithinAABB(ItemFrameEntity.class, bb); - for (ItemFrameEntity frame : frames) { - if (!frame.getDisplayedItem().isEmpty()) { - return frame.getDisplayedItem(); - } - } - - return ItemStack.EMPTY; - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 0, 0, -1, EnumRuneType.AIR); - addRune(components, 0, 0, -2, EnumRuneType.DUSK); - addRune(components, 0, 1, -3, EnumRuneType.DUSK); - addRune(components, 0, 2, -3, EnumRuneType.BLANK); - addRune(components, 0, 3, -3, EnumRuneType.BLANK); - addRune(components, 0, 1, -4, EnumRuneType.FIRE); - - for (int i = 1; i <= 3; i++) - addRune(components, 0, 0, i, EnumRuneType.AIR); - - for (int sgn = -1; sgn <= 1; sgn += 2) { - addRune(components, sgn, 0, 4, EnumRuneType.AIR); - addRune(components, sgn * 2, 0, 2, EnumRuneType.AIR); - addRune(components, sgn * 3, 0, 2, EnumRuneType.AIR); - addRune(components, sgn * 3, 0, 3, EnumRuneType.AIR); - addRune(components, sgn, 0, 0, EnumRuneType.EARTH); - addRune(components, sgn, 0, 1, EnumRuneType.EARTH); - addRune(components, sgn * 2, 0, -1, EnumRuneType.FIRE); - addRune(components, sgn * 2, 0, -2, EnumRuneType.FIRE); - addRune(components, sgn * 3, 0, -2, EnumRuneType.FIRE); - addRune(components, sgn * 3, 0, -3, EnumRuneType.FIRE); - addRune(components, sgn * 3, 0, -4, EnumRuneType.FIRE); - addRune(components, sgn, 1, -1, EnumRuneType.AIR); - addRune(components, sgn, 1, -2, EnumRuneType.AIR); - addRune(components, sgn, 1, -4, EnumRuneType.FIRE); - addRune(components, sgn * 2, 1, -4, EnumRuneType.FIRE); - addRune(components, sgn, 0, -3, EnumRuneType.EARTH); - addRune(components, sgn, 0, -4, EnumRuneType.EARTH); - addRune(components, sgn, 0, -5, EnumRuneType.EARTH); - addRune(components, sgn, 1, -5, EnumRuneType.EARTH); - addRune(components, sgn, 2, -5, EnumRuneType.EARTH); - addRune(components, sgn, 3, -5, EnumRuneType.EARTH); - addRune(components, sgn, 3, -4, EnumRuneType.EARTH); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualLivingArmourDowngrade(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java deleted file mode 100644 index 5be8d54a..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMagnetic.java +++ /dev/null @@ -1,164 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.Utils; -import com.mojang.authlib.GameProfile; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.common.util.FakePlayerFactory; - - -import java.util.function.Consumer; - -@RitualRegister("magnetism") -public class RitualMagnetic extends Ritual { - public static final String PLACEMENT_RANGE = "placementRange"; - // public static final String SEARCH_RANGE = "searchRange"; - public BlockPos lastPos; // An offset - private FakePlayer fakePlayer; - - public RitualMagnetic() { - super("ritualMagnetic", 0, 5000, "ritual." + BloodMagic.MODID + ".magneticRitual"); - addBlockRange(PLACEMENT_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-1, 1, -1), 3)); - setMaximumVolumeAndDistanceOfRange(PLACEMENT_RANGE, 50, 4, 4); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - Vec3d MRSpos = new Vec3d(masterRitualStone.getBlockPos()); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - AreaDescriptor placementRange = masterRitualStone.getBlockRange(PLACEMENT_RANGE); - - BlockPos replacement = pos; - boolean replace = false; - - for (BlockPos offset : placementRange.getContainedPositions(pos)) { - if (world.isAirBlock(offset)) { - replacement = offset; - replace = true; - break; - } - } - - BlockState downState = world.getBlockState(pos.down()); - int radius = getRadius(downState.getBlock()); - - if (replace) { - int j = -1; - int i = -radius; - int k = -radius; - - if (lastPos != null) { - j = lastPos.getY(); - i = Math.min(radius, Math.max(-radius, lastPos.getX())); - k = Math.min(radius, Math.max(-radius, lastPos.getZ())); - } - - if (j + pos.getY() >= 0) { - while (i <= radius) { - while (k <= radius) { - BlockPos newPos = pos.add(i, j, k); - Vec3d newPosVector = new Vec3d(newPos); - BlockState state = world.getBlockState(newPos); - RayTraceResult fakeRayTrace = world.rayTraceBlocks(MRSpos, newPosVector, false); - ItemStack checkStack = state.getBlock().getPickBlock(state, fakeRayTrace, world, newPos, getFakePlayer((ServerWorld) world)); - if (isBlockOre(checkStack)) { - Utils.swapLocations(world, newPos, world, replacement); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - k++; - this.lastPos = new BlockPos(i, j, k); - return; - } else { - k++; - } - } - i++; - k = -radius; - } - j--; - i = -radius; - this.lastPos = new BlockPos(i, j, k); - return; - } - - j = -1; - this.lastPos = new BlockPos(i, j, k); - } - - } - - public int getRadius(Block block) { - if (block == Blocks.IRON_BLOCK) { - return 7; - } - - if (block == Blocks.GOLD_BLOCK) { - return 15; - } - - if (block == Blocks.DIAMOND_BLOCK) { - return 31; - } - - return 3; - } - - @Override - public int getRefreshTime() { - return 40; - } - - @Override - public int getRefreshCost() { - return 50; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.EARTH); - addParallelRunes(components, 2, 1, EnumRuneType.EARTH); - addCornerRunes(components, 2, 1, EnumRuneType.AIR); - addParallelRunes(components, 2, 2, EnumRuneType.FIRE); - } - - @Override - public Ritual getNewCopy() { - return new RitualMagnetic(); - } - - private FakePlayer getFakePlayer(ServerWorld world) { - return fakePlayer == null ? fakePlayer = FakePlayerFactory.get(world, new GameProfile(null, BloodMagic.MODID + "_ritual_magnetic")) : fakePlayer; - } - - public static boolean isBlockOre(ItemStack stack) { - if (stack.isEmpty()) - return false; - - for (int id : OreDictionary.getOreIDs(stack)) { - String oreName = OreDictionary.getOreName(id); - if (oreName.contains("ore")) - return true; - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java deleted file mode 100644 index 38919ab6..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualMeteor.java +++ /dev/null @@ -1,155 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.projectile.EntityMeteor; -import WayofTime.bloodmagic.meteor.Meteor; -import WayofTime.bloodmagic.meteor.MeteorRegistry; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("meteor") -public class RitualMeteor extends Ritual { - public static final String ITEM_RANGE = "itemRange"; - public static final double destructiveWillDrain = 50; - - public RitualMeteor() { - super("ritualMeteor", 2, 0, "ritual." + BloodMagic.MODID + ".meteorRitual"); - - addBlockRange(ITEM_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - setMaximumVolumeAndDistanceOfRange(ITEM_RANGE, 0, 10, 10); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - BlockPos pos = masterRitualStone.getBlockPos(); - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - AreaDescriptor itemDetectionRange = masterRitualStone.getBlockRange(ITEM_RANGE); - List itemList = world.getEntitiesWithinAABB(ItemEntity.class, itemDetectionRange.getAABB(pos)); - - double radiusModifier = getRadiusModifier(rawWill); - double explosionModifier = getExplosionModifier(steadfastWill); - double fillerChance = getFillerChance(corrosiveWill); - - boolean successful = false; - - for (ItemEntity entityItem : itemList) { - ItemStack stack = entityItem.getItem(); - Meteor meteor = MeteorRegistry.getMeteorForItem(stack); - - if (meteor != null) { - SoulNetwork network = masterRitualStone.getOwnerNetwork(); - int cost = meteor.getCost(); - if (currentEssence < cost) { - network.causeNausea(); - break; - } else { - network.syphon(masterRitualStone.ticket(cost)); - EntityMeteor entityMeteor = new EntityMeteor(world, pos.getX(), 260, pos.getZ(), 0, -0.1, 0, radiusModifier, explosionModifier, fillerChance); - entityMeteor.setMeteorStack(stack.copy()); - world.spawnEntity(entityMeteor); - - entityItem.setDead(); - - } - - if (destructiveWill >= destructiveWillDrain && currentEssence >= 1000000000) { - network.syphon(masterRitualStone.ticket(cost / 10)); - } else { - masterRitualStone.setActive(false); - } - successful = true; - break; - } - } - - if (successful) { - if (rawWill > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawWill, true); - } - - if (corrosiveWill > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveWill, true); - } - - if (steadfastWill > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.STEADFAST, steadfastWill, true); - } - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 2, 0, EnumRuneType.FIRE); - addOffsetRunes(components, 3, 1, 0, EnumRuneType.AIR); - addOffsetRunes(components, 4, 2, 0, EnumRuneType.AIR); - addOffsetRunes(components, 5, 3, 0, EnumRuneType.DUSK); - addCornerRunes(components, 4, 0, EnumRuneType.DUSK); - - for (int i = 4; i <= 6; i++) { - addParallelRunes(components, 4, 0, EnumRuneType.EARTH); - } - - addParallelRunes(components, 8, 0, EnumRuneType.EARTH); - addParallelRunes(components, 8, 1, EnumRuneType.EARTH); - addParallelRunes(components, 7, 1, EnumRuneType.EARTH); - addParallelRunes(components, 7, 2, EnumRuneType.EARTH); - addParallelRunes(components, 6, 2, EnumRuneType.FIRE); - addParallelRunes(components, 6, 3, EnumRuneType.WATER); - addParallelRunes(components, 5, 3, EnumRuneType.WATER); - addParallelRunes(components, 5, 4, EnumRuneType.AIR); - - addOffsetRunes(components, 1, 4, 4, EnumRuneType.AIR); - addParallelRunes(components, 4, 4, EnumRuneType.AIR); - - addOffsetRunes(components, 2, 4, 4, EnumRuneType.WATER); - addOffsetRunes(components, 2, 3, 4, EnumRuneType.FIRE); - addCornerRunes(components, 3, 4, EnumRuneType.FIRE); - } - - @Override - public Ritual getNewCopy() { - return new RitualMeteor(); - } - - public double getRadiusModifier(double rawWill) { - return Math.pow(1 + rawWill / 100, 1 / 3); - } - - public double getFillerChance(double corrosiveWill) { - return corrosiveWill / 200; - } - - public double getExplosionModifier(double steadfastWill) { - return Math.max(Math.pow(0.4, steadfastWill / 100), 1); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java deleted file mode 100644 index a5173a28..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPlacer.java +++ /dev/null @@ -1,104 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; - -import java.util.function.Consumer; - -@RitualRegister("placer") -public class RitualPlacer extends Ritual { - public static final String PLACER_RANGE = "placerRange"; - public static final String CHEST_RANGE = "chest"; - - public RitualPlacer() { - super("ritualPlacer", 0, 5000, "ritual." + BloodMagic.MODID + ".placerRitual"); - addBlockRange(PLACER_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-2, 0, -2), 5, 1, 5)); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(PLACER_RANGE, 300, 7, 7); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tileEntity = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - AreaDescriptor areaDescriptor = masterRitualStone.getBlockRange(PLACER_RANGE); - - if (tileEntity != null) { - if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN)) { - IItemHandler itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.DOWN); - - if (itemHandler.getSlots() <= 0) { - return; - } - - posLoop: - for (BlockPos blockPos : areaDescriptor.getContainedPositions(masterRitualStone.getBlockPos())) { - if (!world.getBlockState(blockPos).getBlock().isReplaceable(world, blockPos)) - continue; - - for (int invSlot = 0; invSlot < itemHandler.getSlots(); invSlot++) { - ItemStack stack = itemHandler.extractItem(invSlot, 1, true); - if (stack.isEmpty() || !(stack.getItem() instanceof BlockItem)) - continue; - - BlockState placeState = Block.getBlockFromItem(itemHandler.getStackInSlot(invSlot).getItem()).getStateFromMeta(itemHandler.getStackInSlot(invSlot).getItemDamage()); - world.setBlockState(blockPos, placeState); - itemHandler.extractItem(invSlot, 1, false); - tileEntity.markDirty(); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - break posLoop; // Break instead of return in case we add things later - } - } - } - } - } - - @Override - public int getRefreshCost() { - return 50; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 3, 0, 3, EnumRuneType.EARTH); - addRune(components, 3, 0, -3, EnumRuneType.EARTH); - addRune(components, -3, 0, 3, EnumRuneType.EARTH); - addRune(components, -3, 0, -3, EnumRuneType.EARTH); - - addRune(components, 3, 0, 2, EnumRuneType.WATER); - addRune(components, 3, 0, -2, EnumRuneType.WATER); - addRune(components, 2, 0, 3, EnumRuneType.WATER); - addRune(components, 2, 0, -3, EnumRuneType.WATER); - addRune(components, -2, 0, 3, EnumRuneType.WATER); - addRune(components, -2, 0, -3, EnumRuneType.WATER); - addRune(components, -3, 0, 2, EnumRuneType.WATER); - addRune(components, -3, 0, -2, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualPlacer(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java deleted file mode 100644 index 1a85c233..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPortal.java +++ /dev/null @@ -1,230 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.teleport.PortalLocation; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.ritual.portal.LocationsHandler; -import WayofTime.bloodmagic.tile.TileDimensionalPortal; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -import java.util.UUID; -import java.util.function.Consumer; - -@RitualRegister("portal") -public class RitualPortal extends Ritual { - - public static final String PORTAL_NBT_TAG = "PortalRitualTag"; - public static final String PORTAL_ID_TAG = "PortalRitualID"; - private CompoundNBT portalRitualTag; - - public RitualPortal() { - super("ritualPortal", 0, 50000, "ritual." + BloodMagic.MODID + ".portalRitual"); - portalRitualTag = new CompoundNBT(); - } - - @Override - public boolean activateRitual(IMasterRitualStone masterRitualStone, PlayerEntity player, UUID owner) { - World world = masterRitualStone.getWorldObj(); - int x = masterRitualStone.getBlockPos().getX(); - int y = masterRitualStone.getBlockPos().getY(); - int z = masterRitualStone.getBlockPos().getZ(); - Direction direction = masterRitualStone.getDirection(); - - String name = owner.toString(); - BlockState blockState; - - if (!world.isRemote) { - portalRitualTag.removeTag(PORTAL_ID_TAG); - - if (direction == Direction.NORTH || direction == Direction.SOUTH) { - for (int i = x - 3; i <= x + 3; i++) { - for (int k = z - 2; k <= z + 2; k++) { - if (!world.isAirBlock(new BlockPos(i, y, k)) && !(getBlockState(world, i, y, k).getBlock() == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, i, y, k); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - } - for (int j = y + 1; j <= y + 5; j++) { - if (!world.isAirBlock(new BlockPos(x - 3, j, z)) && !(getBlockState(world, x - 3, j, z).getBlock() == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, x - 3, j, z); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - for (int j = y + 1; j <= y + 5; j++) { - if (!world.isAirBlock(new BlockPos(x + 3, j, z)) && !(getBlockState(world, x + 3, j, z) == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, x + 3, j, z); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - } else if (direction == Direction.EAST || direction == Direction.WEST) { - for (int k = z - 3; k <= z + 3; k++) { - for (int i = x - 2; i <= x + 2; i++) { - if (!world.isAirBlock(new BlockPos(i, y, k)) && !(getBlockState(world, i, y, k).getBlock() == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, i, y, k); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - } - for (int j = y + 1; j <= y + 5; j++) { - if (!world.isAirBlock(new BlockPos(x, j, z - 3)) && !(getBlockState(world, x, j, z - 3).getBlock() == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, x, j, z - 3); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - for (int j = y + 1; j <= y + 5; j++) { - if (!world.isAirBlock(new BlockPos(x, j, z + 3)) && !(getBlockState(world, x, j, z + 3).getBlock() == RegistrarBloodMagicBlocks.RITUAL_STONE)) { - blockState = getBlockState(world, x, j, z + 3); - name = addStringToEnd(name, ForgeRegistries.BLOCKS.getKey(blockState.getBlock()) + String.valueOf(blockState.getBlock().getMetaFromState(blockState))); - } - } - } - - if (LocationsHandler.getLocationsHandler().addLocation(name, new PortalLocation(x, y + 1, z, world.provider.getDimension()))) { - portalRitualTag.putString(PORTAL_ID_TAG, name); - return true; - } - } - return false; - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - if (world.isRemote) { - return; - } - - int x = masterRitualStone.getBlockPos().getX(); - int y = masterRitualStone.getBlockPos().getY(); - int z = masterRitualStone.getBlockPos().getZ(); - Direction direction = masterRitualStone.getDirection(); - - if (direction == Direction.NORTH || direction == Direction.SOUTH) { - for (int i = x - 1; i <= x + 1; i++) { - for (int j = y + 1; j <= y + 3; j++) { - BlockPos tempPos = new BlockPos(i, j, z); - - if (world.isAirBlock(tempPos)) { - BlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(0); - world.setBlockState(tempPos, blockState, 3); - - if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) { - TileDimensionalPortal tile = (TileDimensionalPortal) world.getTileEntity(tempPos); - tile.setMasterStonePos(masterRitualStone.getBlockPos()); - tile.portalID = portalRitualTag.getString(PORTAL_ID_TAG); - } - } - } - } - } else if (direction == Direction.EAST || direction == Direction.WEST) { - for (int k = z - 1; k <= z + 1; k++) { - for (int j = y + 1; j <= y + 3; j++) { - BlockPos tempPos = new BlockPos(x, j, k); - if (world.isAirBlock(tempPos)) { - BlockState blockState = RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL.getStateFromMeta(1); - world.setBlockState(tempPos, blockState, 3); - - if (world.getTileEntity(tempPos) != null && world.getTileEntity(tempPos) instanceof TileDimensionalPortal) { - TileDimensionalPortal tile = (TileDimensionalPortal) world.getTileEntity(tempPos); - tile.setMasterStonePos(masterRitualStone.getBlockPos()); - tile.portalID = portalRitualTag.getString(PORTAL_ID_TAG); - } - } - } - } - } - - } - - @Override - public void stopRitual(IMasterRitualStone masterRitualStone, BreakType breakType) { - World world = masterRitualStone.getWorldObj(); - int x = masterRitualStone.getBlockPos().getX(); - int y = masterRitualStone.getBlockPos().getY(); - int z = masterRitualStone.getBlockPos().getZ(); - Direction direction = masterRitualStone.getDirection(); - - LocationsHandler.getLocationsHandler().removeLocation(portalRitualTag.getString(PORTAL_ID_TAG), new PortalLocation(x, y + 1, z, world.provider.getDimension())); - - if (direction == Direction.NORTH || direction == Direction.SOUTH) { - for (int i = x - 2; i <= x + 2; i++) { - for (int j = y + 1; j <= y + 3; j++) { - if (getBlockState(world, i, j, z).getBlock() == RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL) { - world.setBlockToAir(new BlockPos(i, j, z)); - } - } - } - } else if (direction == Direction.EAST || direction == Direction.WEST) { - for (int k = z - 2; k <= z + 2; k++) { - for (int j = y + 1; j <= y + 3; j++) { - if (getBlockState(world, x, j, k).getBlock() == RegistrarBloodMagicBlocks.DIMENSIONAL_PORTAL) { - world.setBlockToAir(new BlockPos(x, j, k)); - } - } - } - } - - portalRitualTag.removeTag(PORTAL_ID_TAG); - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 1, 0, 0, EnumRuneType.AIR); - addRune(components, 2, 0, 0, EnumRuneType.WATER); - addRune(components, -1, 0, 0, EnumRuneType.FIRE); - addRune(components, -2, 0, 0, EnumRuneType.EARTH); - addRune(components, 2, 1, 0, EnumRuneType.DUSK); - - addRune(components, 2, 2, 0, EnumRuneType.AIR); - addRune(components, 2, 3, 0, EnumRuneType.WATER); - addRune(components, 2, 4, 0, EnumRuneType.FIRE); - addRune(components, 1, 4, 0, EnumRuneType.EARTH); - addRune(components, 0, 4, 0, EnumRuneType.DUSK); - - addRune(components, -1, 4, 0, EnumRuneType.AIR); - addRune(components, -2, 4, 0, EnumRuneType.WATER); - addRune(components, -2, 3, 0, EnumRuneType.FIRE); - addRune(components, -2, 2, 0, EnumRuneType.EARTH); - addRune(components, -2, 1, 0, EnumRuneType.DUSK); - } - - @Override - public Ritual getNewCopy() { - return new RitualPortal(); - } - - @Override - public void readFromNBT(CompoundNBT tag) { - super.readFromNBT(tag); - - portalRitualTag = tag.getCompound(PORTAL_NBT_TAG); - } - - @Override - public void writeToNBT(CompoundNBT tag) { - super.writeToNBT(tag); - - tag.put(PORTAL_NBT_TAG, portalRitualTag); - } - - public BlockState getBlockState(World world, int x, int y, int z) { - return world.getBlockState(new BlockPos(x, y, z)); - } - - public String addStringToEnd(String input, String toAdd) { - return input + toAdd; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java deleted file mode 100644 index c98e359d..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualPump.java +++ /dev/null @@ -1,109 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import com.google.common.collect.Lists; -import net.minecraft.block.BlockLiquid; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; -import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Iterator; -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("pump") -public class RitualPump extends Ritual { - public static final String PUMP_RANGE = "pumpRange"; - - private List> liquidsCache; - private Iterator> blockPosIterator; - - public RitualPump() { - super("ritualPump", 0, 500, "ritual." + BloodMagic.MODID + ".pumpRitual"); - addBlockRange(PUMP_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, -16, -16), new BlockPos(17, 17, 17))); - - setMaximumVolumeAndDistanceOfRange(PUMP_RANGE, 0, 16, 16); - liquidsCache = Lists.newArrayList(); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - TileEntity tileEntity = world.getTileEntity(masterRitualStone.getBlockPos().up()); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - if (tileEntity != null && tileEntity.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, Direction.DOWN)) { - IFluidHandler fluidHandler = tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, Direction.DOWN); - BlockState tankState = world.getBlockState(masterRitualStone.getBlockPos().up()); - int maxDrain = fluidHandler.getTankProperties()[0].getCapacity(); - - if (fluidHandler.getTankProperties()[0].getContents() != null && fluidHandler.getTankProperties()[0].getContents().amount >= maxDrain) - return; - - for (BlockPos pos : masterRitualStone.getBlockRange(PUMP_RANGE).getContainedPositions(masterRitualStone.getBlockPos())) { - BlockState state = world.getBlockState(pos); - IFluidHandler blockHandler = null; - if (state.getBlock() instanceof BlockLiquid) - blockHandler = new BlockLiquidWrapper((BlockLiquid) state.getBlock(), world, pos); - else if (state.getBlock() instanceof IFluidHandler) - blockHandler = new FluidBlockWrapper((IFluidBlock) state.getBlock(), world, pos); - - if (blockHandler != null) { - FluidStack blockDrain = blockHandler.drain(maxDrain, false); - if (blockDrain != null && fluidHandler.fill(blockDrain, false) == blockDrain.amount) { - Pair posInfo = Pair.of(pos, blockHandler.drain(maxDrain, false)); - if (!liquidsCache.contains(posInfo)) - liquidsCache.add(posInfo); - } - } - } - - blockPosIterator = liquidsCache.iterator(); - if (blockPosIterator.hasNext()) { - Pair posInfo = blockPosIterator.next(); - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - fluidHandler.fill(posInfo.getRight(), true); - world.setBlockState(posInfo.getLeft(), Blocks.STONE.getDefaultState()); - world.notifyBlockUpdate(posInfo.getLeft(), Blocks.STONE.getDefaultState(), Blocks.STONE.getDefaultState(), 3); - world.notifyBlockUpdate(tileEntity.getPos(), tankState, tankState, 3); - blockPosIterator.remove(); - } - } - } - - @Override - public int getRefreshCost() { - return 25; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 1, 0, 1, EnumRuneType.WATER); - addRune(components, 1, 0, -1, EnumRuneType.EARTH); - addRune(components, -1, 0, -1, EnumRuneType.AIR); - addRune(components, -1, 0, 1, EnumRuneType.FIRE); - - addCornerRunes(components, 1, 1, EnumRuneType.DUSK); - } - - @Override - public Ritual getNewCopy() { - return new RitualPump(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java deleted file mode 100644 index fcd279d0..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualRegeneration.java +++ /dev/null @@ -1,185 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.DamageSourceBloodMagic; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.Collections; -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("regeneration") -public class RitualRegeneration extends Ritual { - public static final String HEAL_RANGE = "heal"; - public static final String VAMPIRE_RANGE = "vampire"; - - public static final int SACRIFICE_AMOUNT = 100; - - public static final double corrosiveWillDrain = 0.04; - - public RitualRegeneration() { - super("ritualRegeneration", 0, 25000, "ritual." + BloodMagic.MODID + ".regenerationRitual"); - addBlockRange(HEAL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-15, -15, -15), 31)); - addBlockRange(VAMPIRE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-15, -15, -15), 31)); - - setMaximumVolumeAndDistanceOfRange(HEAL_RANGE, 0, 20, 20); - setMaximumVolumeAndDistanceOfRange(VAMPIRE_RANGE, 0, 20, 20); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - int totalCost = 0; - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - double vengefulDrain = 0; - double steadfastDrain = 0; - double destructiveDrain = 0; - double corrosiveDrain = 0; - - boolean syphonHealth = corrosiveWill >= corrosiveWillDrain; - boolean applyAbsorption = false; - float absorptionRate = 1; - int maxAbsorption = 20; - - AreaDescriptor healArea = masterRitualStone.getBlockRange(HEAL_RANGE); - AxisAlignedBB healRange = healArea.getAABB(pos); - - AreaDescriptor damageArea = masterRitualStone.getBlockRange(VAMPIRE_RANGE); - AxisAlignedBB damageRange = damageArea.getAABB(pos); - - List entities = world.getEntitiesWithinAABB(LivingEntity.class, healRange); - List players = world.getEntitiesWithinAABB(PlayerEntity.class, healRange); - List damagedEntities = world.getEntitiesWithinAABB(LivingEntity.class, damageRange); - - if (syphonHealth) { - for (PlayerEntity player : players) { - if (player.getHealth() <= player.getMaxHealth() - 1) { - float syphonedHealthAmount = getSyphonAmountForWill(corrosiveWill); - Collections.shuffle(damagedEntities); - for (LivingEntity damagedEntity : damagedEntities) { - if (damagedEntity instanceof PlayerEntity) { - continue; - } - - float currentHealth = damagedEntity.getHealth(); - - damagedEntity.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, Math.min(player.getMaxHealth() - player.getHealth(), syphonedHealthAmount)); - - float healthDifference = currentHealth - damagedEntity.getHealth(); - if (healthDifference > 0) { - corrosiveDrain += corrosiveWillDrain; - corrosiveWill -= corrosiveWillDrain; - player.heal(healthDifference); - } - - break; - } - } - } - } - - for (LivingEntity entity : entities) { - float health = entity.getHealth(); - if (health <= entity.getMaxHealth() - 1) { - if (entity.isPotionApplicable(new EffectInstance(Effects.REGENERATION))) { - if (entity instanceof PlayerEntity) { - totalCost += getRefreshCost(); - currentEssence -= getRefreshCost(); - } else { - totalCost += getRefreshCost() / 10; - currentEssence -= getRefreshCost() / 10; - } - - entity.addPotionEffect(new EffectInstance(Effects.REGENERATION, 50, 0, false, false)); - - totalEffects++; - - if (totalEffects >= maxEffects) { - break; - } - } - } - if (applyAbsorption && entity instanceof PlayerEntity) { - if (applyAbsorption) { - float added = Utils.addAbsorptionToMaximum(entity, absorptionRate, maxAbsorption, 1000); - } - } - } - - if (corrosiveDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.CORROSIVE, corrosiveDrain, true); - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(totalCost)); - } - - @Override - public int getRefreshTime() { - return 50; - } - - @Override - public int getRefreshCost() { - return SACRIFICE_AMOUNT; - } - - @Override - public void gatherComponents(Consumer components) { - components.accept(new RitualComponent(new BlockPos(4, 0, 0), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(5, 0, -1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(5, 0, 1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(-4, 0, 0), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(-5, 0, -1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(-5, 0, 1), EnumRuneType.AIR)); - components.accept(new RitualComponent(new BlockPos(0, 0, 4), EnumRuneType.FIRE)); - components.accept(new RitualComponent(new BlockPos(1, 0, 5), EnumRuneType.FIRE)); - components.accept(new RitualComponent(new BlockPos(-1, 0, 5), EnumRuneType.FIRE)); - components.accept(new RitualComponent(new BlockPos(0, 0, -4), EnumRuneType.FIRE)); - components.accept(new RitualComponent(new BlockPos(1, 0, -5), EnumRuneType.FIRE)); - components.accept(new RitualComponent(new BlockPos(-1, 0, -5), EnumRuneType.FIRE)); - addOffsetRunes(components, 3, 5, 0, EnumRuneType.WATER); - addCornerRunes(components, 3, 0, EnumRuneType.DUSK); - addOffsetRunes(components, 4, 5, 0, EnumRuneType.EARTH); - addOffsetRunes(components, 4, 5, -1, EnumRuneType.EARTH); - addCornerRunes(components, 5, 0, EnumRuneType.EARTH); - } - - @Override - public Ritual getNewCopy() { - return new RitualRegeneration(); - } - - public float getSyphonAmountForWill(double corrosiveWill) { - return 1; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java deleted file mode 100644 index 38ecde78..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSpeed.java +++ /dev/null @@ -1,184 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("speed") -public class RitualSpeed extends Ritual { - public static final String SPEED_RANGE = "sanicRange"; - - public static final double vengefulWillDrain = 0.05; - public static final double destructiveWillDrain = 0.05; - public static final double rawWillDrain = 0.1; - - public RitualSpeed() { - super("ritualSpeed", 0, 1000, "ritual." + BloodMagic.MODID + ".speedRitual"); - addBlockRange(SPEED_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-2, 1, -2), new BlockPos(2, 5, 2))); - setMaximumVolumeAndDistanceOfRange(SPEED_RANGE, 0, 2, 5); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - List willConfig = masterRitualStone.getActiveWillConfig(); - - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - AreaDescriptor speedRange = masterRitualStone.getBlockRange(SPEED_RANGE); - - double vengefulDrain = 0; - double destructiveDrain = 0; - double rawDrain = 0; - - if (rawWill < rawWillDrain) { - rawWill = 0; //Simplifies later calculations - } - - for (LivingEntity entity : world.getEntitiesWithinAABB(LivingEntity.class, speedRange.getAABB(masterRitualStone.getBlockPos()))) { - if (entity.isSneaking()) - continue; - - boolean transportChildren = destructiveWill < destructiveWillDrain; - boolean transportAdults = vengefulWill < vengefulWillDrain; - - if ((entity.isChild() && !transportChildren) || (!entity.isChild() && !transportAdults)) { - continue; - } - - if (entity instanceof PlayerEntity && (transportChildren ^ transportAdults)) { - continue; - } - - if (!transportChildren) { - destructiveWill -= destructiveWillDrain; - destructiveDrain += destructiveWillDrain; - } - - if (!transportAdults) { - vengefulWill -= vengefulWillDrain; - vengefulDrain += vengefulWillDrain; - } - - double motionY = getVerticalSpeedForWill(rawWill); - double speed = getHorizontalSpeedForWill(rawWill); - Direction direction = masterRitualStone.getDirection(); - - if (rawWill >= rawWillDrain) { - rawWill -= rawWillDrain; - rawDrain += rawWillDrain; - } - - entity.motionY = motionY; - entity.fallDistance = 0; - - switch (direction) { - case NORTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = -speed; - break; - - case SOUTH: - entity.motionX = 0; - entity.motionY = motionY; - entity.motionZ = speed; - break; - - case WEST: - entity.motionX = -speed; - entity.motionY = motionY; - entity.motionZ = 0; - break; - - case EAST: - entity.motionX = speed; - entity.motionY = motionY; - entity.motionZ = 0; - break; - default: - break; - } - - if (entity instanceof PlayerEntity) { - Utils.setPlayerSpeedFromServer((PlayerEntity) entity, entity.motionX, entity.motionY, entity.motionZ); - } - } - - if (rawDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DEFAULT, rawDrain, true); - } - - if (vengefulDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.VENGEFUL, vengefulDrain, true); - } - - if (destructiveDrain > 0) { - WorldDemonWillHandler.drainWill(world, pos, EnumDemonWillType.DESTRUCTIVE, destructiveDrain, true); - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 5; - } - - @Override - public void gatherComponents(Consumer components) { - addRune(components, 0, 0, -2, EnumRuneType.DUSK); - addRune(components, 1, 0, -1, EnumRuneType.AIR); - addRune(components, -1, 0, -1, EnumRuneType.AIR); - for (int i = 0; i < 3; i++) { - addRune(components, 2, 0, i, EnumRuneType.AIR); - addRune(components, -2, 0, i, EnumRuneType.AIR); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualSpeed(); - } - - @Override - public ITextComponent[] provideInformationOfRitualToPlayer(PlayerEntity player) { - return new ITextComponent[]{new TranslationTextComponent(this.getTranslationKey() + ".info"), new TranslationTextComponent(this.getTranslationKey() + ".default.info"), new TranslationTextComponent(this.getTranslationKey() + ".corrosive.info"), new TranslationTextComponent(this.getTranslationKey() + ".steadfast.info"), new TranslationTextComponent(this.getTranslationKey() + ".destructive.info"), new TranslationTextComponent(this.getTranslationKey() + ".vengeful.info")}; - } - - public double getVerticalSpeedForWill(double rawWill) { - return 1.2 + rawWill / 200; - } - - public double getHorizontalSpeedForWill(double rawWill) { - return 3 + rawWill / 40; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java deleted file mode 100644 index 157bd08d..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualSuppression.java +++ /dev/null @@ -1,76 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileSpectralBlock; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("suppression") -public class RitualSuppression extends Ritual { - public static final String SUPPRESSION_RANGE = "suppressionRange"; - - public RitualSuppression() { - super("ritualSuppression", 0, 10000, "ritual." + BloodMagic.MODID + ".suppressionRitual"); - addBlockRange(SUPPRESSION_RANGE, new AreaDescriptor.HemiSphere(new BlockPos(0, 0, 0), 10)); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - final int refresh = 100; - AreaDescriptor suppressionRange = masterRitualStone.getBlockRange(SUPPRESSION_RANGE); - - for (BlockPos blockPos : suppressionRange.getContainedPositions(masterRitualStone.getBlockPos())) { - BlockState state = world.getBlockState(blockPos); - - if (Utils.isBlockLiquid(state) && world.getTileEntity(blockPos) == null) - TileSpectralBlock.createSpectralBlock(world, blockPos, refresh); - else { - TileEntity tile = world.getTileEntity(blockPos); - if (tile instanceof TileSpectralBlock) - ((TileSpectralBlock) tile).resetDuration(refresh); - } - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 2, 0, EnumRuneType.WATER); - addRune(components, -2, 0, -1, EnumRuneType.AIR); - addRune(components, -1, 0, -2, EnumRuneType.AIR); - addRune(components, -2, 0, 1, EnumRuneType.AIR); - addRune(components, 1, 0, -2, EnumRuneType.AIR); - addRune(components, 2, 0, 1, EnumRuneType.AIR); - addRune(components, 1, 0, 2, EnumRuneType.AIR); - addRune(components, 2, 0, -1, EnumRuneType.AIR); - addRune(components, -1, 0, 2, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualSuppression(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java deleted file mode 100644 index e322fec6..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualUpgradeRemove.java +++ /dev/null @@ -1,125 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.StatTracker; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.helper.ItemHelper.LivingUpgrades; -import com.google.common.collect.Iterables; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; -import java.util.function.Consumer; - -@RitualRegister("upgrade_remove") -public class RitualUpgradeRemove extends Ritual { - public static final String CHECK_RANGE = "fillRange"; - - public RitualUpgradeRemove() { - super("ritualUpgradeRemove", 2, 25000, "ritual." + BloodMagic.MODID + ".upgradeRemoveRitual"); - addBlockRange(CHECK_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1, 2, 1)); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - - if (world.isRemote) { - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - AreaDescriptor checkRange = masterRitualStone.getBlockRange(CHECK_RANGE); - - List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, checkRange.getAABB(pos)); - - for (PlayerEntity player : playerList) { - if (LivingArmour.hasFullSet(player)) { - boolean removedUpgrade = false; - - ItemStack chestStack = Iterables.toArray(player.getArmorInventoryList(), ItemStack.class)[2]; - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - @SuppressWarnings("unchecked") - HashMap upgradeMap = (HashMap) armour.upgradeMap.clone(); - - for (Entry entry : upgradeMap.entrySet()) { - LivingArmourUpgrade upgrade = entry.getValue(); - String upgradeKey = entry.getKey(); - - ItemStack upgradeStack = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); - LivingUpgrades.setKey(upgradeStack, upgradeKey); - LivingUpgrades.setLevel(upgradeStack, upgrade.getUpgradeLevel()); - - boolean successful = armour.removeUpgrade(player, upgrade); - - if (successful) { - removedUpgrade = true; - world.spawnEntity(new ItemEntity(world, player.posX, player.posY, player.posZ, upgradeStack)); - for (Entry trackerEntry : armour.trackerMap.entrySet()) { - StatTracker tracker = trackerEntry.getValue(); - if (tracker != null) { - if (tracker.providesUpgrade(upgradeKey)) { - tracker.resetTracker(); //Resets the tracker if the upgrade corresponding to it was removed. - } - } - } - } - } - - if (removedUpgrade) { - ((ItemLivingArmour) chestStack.getItem()).setLivingArmour(chestStack, armour, true); - ItemLivingArmour.setLivingArmour(chestStack, armour); - armour.recalculateUpgradePoints(); - - masterRitualStone.setActive(false); - - world.spawnEntity(new LightningBoltEntity(world, pos.getX(), pos.getY() - 1, pos.getZ(), true)); - } - - } - } - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.DUSK); - addCornerRunes(components, 2, 0, EnumRuneType.FIRE); - addOffsetRunes(components, 1, 2, 0, EnumRuneType.FIRE); - addCornerRunes(components, 1, 1, EnumRuneType.WATER); - addParallelRunes(components, 4, 0, EnumRuneType.EARTH); - addCornerRunes(components, 1, 3, EnumRuneType.WATER); - addParallelRunes(components, 1, 4, EnumRuneType.AIR); - - for (int i = 0; i < 4; i++) { - addCornerRunes(components, 3, i, EnumRuneType.EARTH); - } - } - - @Override - public Ritual getNewCopy() { - return new RitualUpgradeRemove(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java deleted file mode 100644 index df962827..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualVeilOfEvil.java +++ /dev/null @@ -1,102 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.handler.event.GenericHandler; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -@RitualRegister("veil_of_evil") -public class RitualVeilOfEvil extends Ritual { - public static final String VEIL_RANGE = "veilRange"; - - public RitualVeilOfEvil() { - super("ritualVeilOfEvil", 0, 40000, "ritual." + BloodMagic.MODID + ".veilOfEvilRitual"); - addBlockRange(VEIL_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-16, 0, -16), 33)); - setMaximumVolumeAndDistanceOfRange(VEIL_RANGE, 0, 256, 256); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - /* Default Ritual Stuff */ - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - // int maxEffects = currentEssence / getRefreshCost(); - // int totalEffects = 0; - - /* Default will augment stuff */ - List willConfig = masterRitualStone.getActiveWillConfig(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - double rawDrained = 0; - double corrosiveDrained = 0; - double destructiveDrained = 0; - double steadfastDrained = 0; - double vengefulDrained = 0; - - /* Actual ritual stuff begins here */ - - if (GenericHandler.forceSpawnMap.containsKey(world)) { - Map forceSpawnMap = GenericHandler.forceSpawnMap.get(world); - if (forceSpawnMap != null) { - forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); - } else { - forceSpawnMap = new HashMap<>(); - forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); - GenericHandler.forceSpawnMap.put(world, forceSpawnMap); - } - } else { - HashMap forceSpawnMap = new HashMap<>(); - forceSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(VEIL_RANGE)); - GenericHandler.forceSpawnMap.put(world, forceSpawnMap); - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - - @Override - public int getRefreshCost() { - return 0; - } - - @Override - public void gatherComponents(Consumer components) { - - addOffsetRunes(components, 1, 0, 2, EnumRuneType.DUSK); - addCornerRunes(components, 3, 0, EnumRuneType.FIRE); - - for (int i = 0; i <= 1; i++) { - addParallelRunes(components, (4 + i), i, EnumRuneType.DUSK); - addOffsetRunes(components, (4 + i), i, -1, EnumRuneType.BLANK); - addOffsetRunes(components, 4, 5, i, EnumRuneType.EARTH); - } - - addCornerRunes(components, 5, 1, EnumRuneType.BLANK); - } - - @Override - public Ritual getNewCopy() { - return new RitualVeilOfEvil(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java deleted file mode 100644 index 8e631f4c..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWardOfSacrosanctity.java +++ /dev/null @@ -1,105 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.util.handler.event.GenericHandler; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -@RitualRegister("ward_of_sacrosanctity") -public class RitualWardOfSacrosanctity extends Ritual { - public static final String SPAWN_WARD = "spawnWard"; - - public RitualWardOfSacrosanctity() { - super("ritualWardOfSacrosanctity", 0, 40000, "ritual." + BloodMagic.MODID + ".wardOfSacrosanctityRitual"); - addBlockRange(SPAWN_WARD, new AreaDescriptor.Rectangle(new BlockPos(-16, -10, -16), 33)); - - setMaximumVolumeAndDistanceOfRange(SPAWN_WARD, 0, 256, 256); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - /* Default Ritual Stuff */ - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos pos = masterRitualStone.getBlockPos(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - // int maxEffects = currentEssence / getRefreshCost(); - // int totalEffects = 0; - - /* Default will augment stuff */ - List willConfig = masterRitualStone.getActiveWillConfig(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, pos); - - double rawWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DEFAULT, willConfig); - double corrosiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.CORROSIVE, willConfig); - double destructiveWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.DESTRUCTIVE, willConfig); - double steadfastWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.STEADFAST, willConfig); - double vengefulWill = this.getWillRespectingConfig(world, pos, EnumDemonWillType.VENGEFUL, willConfig); - - double rawDrained = 0; - double corrosiveDrained = 0; - double destructiveDrained = 0; - double steadfastDrained = 0; - double vengefulDrained = 0; - - /* Actual ritual stuff begins here */ - - if (GenericHandler.preventSpawnMap.containsKey(world)) { - Map preventSpawnMap = GenericHandler.preventSpawnMap.get(world); - if (preventSpawnMap != null) { - preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); - } else { - preventSpawnMap = new HashMap<>(); - preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); - GenericHandler.preventSpawnMap.put(world, preventSpawnMap); - } - } else { - HashMap preventSpawnMap = new HashMap<>(); - preventSpawnMap.put(masterRitualStone, masterRitualStone.getBlockRange(SPAWN_WARD)); - GenericHandler.preventSpawnMap.put(world, preventSpawnMap); - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost())); - } - - @Override - public int getRefreshTime() { - return 25; - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - for (int i = 2; i < 5; i++) { - if (i < 4) { - addParallelRunes(components, 1, 0, EnumRuneType.AIR); - } - addCornerRunes(components, i, 0, EnumRuneType.FIRE); - } - addParallelRunes(components, 5, 0, EnumRuneType.DUSK); - addOffsetRunes(components, 5, 6, 0, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualWardOfSacrosanctity(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java deleted file mode 100644 index a06bbfcb..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWater.java +++ /dev/null @@ -1,69 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.function.Consumer; - -@RitualRegister("water") -public class RitualWater extends Ritual { - public static final String WATER_RANGE = "waterRange"; - - public RitualWater() { - super("ritualWater", 0, 500, "ritual." + BloodMagic.MODID + ".waterRitual"); - addBlockRange(WATER_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - setMaximumVolumeAndDistanceOfRange(WATER_RANGE, 9, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - AreaDescriptor waterRange = masterRitualStone.getBlockRange(WATER_RANGE); - - for (BlockPos newPos : waterRange.getContainedPositions(masterRitualStone.getBlockPos())) { - if (world.isAirBlock(newPos)) { - world.setBlockState(newPos, Blocks.FLOWING_WATER.getDefaultState()); - totalEffects++; - } - - if (totalEffects >= maxEffects) { - break; - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 25; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.WATER); - } - - @Override - public Ritual getNewCopy() { - return new RitualWater(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java deleted file mode 100644 index 96637f32..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualWellOfSuffering.java +++ /dev/null @@ -1,135 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.tile.TileAltar; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityRegistry; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("well_of_suffering") -public class RitualWellOfSuffering extends Ritual { - public static final String ALTAR_RANGE = "altar"; - public static final String DAMAGE_RANGE = "damage"; - - public static final int SACRIFICE_AMOUNT = 25; - - public BlockPos altarOffsetPos = new BlockPos(0, 0, 0); //TODO: Save! - - public RitualWellOfSuffering() { - super("ritualWellOfSuffering", 0, 40000, "ritual." + BloodMagic.MODID + ".wellOfSufferingRitual"); - addBlockRange(ALTAR_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-5, -10, -5), 11, 21, 11)); - addBlockRange(DAMAGE_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-10, -10, -10), 21)); - - setMaximumVolumeAndDistanceOfRange(ALTAR_RANGE, 0, 10, 15); - setMaximumVolumeAndDistanceOfRange(DAMAGE_RANGE, 0, 15, 15); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - BlockPos pos = masterRitualStone.getBlockPos(); - - int maxEffects = currentEssence / getRefreshCost(); - int totalEffects = 0; - - BlockPos altarPos = pos.add(altarOffsetPos); - - TileEntity tile = world.getTileEntity(altarPos); - - AreaDescriptor altarRange = masterRitualStone.getBlockRange(ALTAR_RANGE); - - if (!altarRange.isWithinArea(altarOffsetPos) || !(tile instanceof TileAltar)) { - for (BlockPos newPos : altarRange.getContainedPositions(pos)) { - TileEntity nextTile = world.getTileEntity(newPos); - if (nextTile instanceof TileAltar) { - tile = nextTile; - altarOffsetPos = newPos.subtract(pos); - - altarRange.resetCache(); - break; - } - } - } - - if (tile instanceof TileAltar) { - TileAltar tileAltar = (TileAltar) tile; - - AreaDescriptor damageRange = masterRitualStone.getBlockRange(DAMAGE_RANGE); - AxisAlignedBB range = damageRange.getAABB(pos); - - List entities = world.getEntitiesWithinAABB(LivingEntity.class, range); - - for (LivingEntity entity : entities) { - EntityEntry entityEntry = EntityRegistry.getEntry(entity.getClass()); - - if (entityEntry == null || BloodMagicAPI.INSTANCE.getBlacklist().getSacrifice().contains(entityEntry.getRegistryName())) - continue; - - int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getValueManager().getSacrificial().getOrDefault(entityEntry.getRegistryName(), SACRIFICE_AMOUNT); - - if (lifeEssenceRatio <= 0) - continue; - - if (entity.isEntityAlive() && !(entity instanceof PlayerEntity)) { - if (entity.attackEntityFrom(RitualManager.RITUAL_DAMAGE, 1)) { - if (entity.isChild()) - lifeEssenceRatio *= 0.5F; - - tileAltar.sacrificialDaggerCall(lifeEssenceRatio, true); - - totalEffects++; - - if (totalEffects >= maxEffects) { - break; - } - } - } - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * totalEffects)); - } - - @Override - public int getRefreshTime() { - return 25; - } - - @Override - public int getRefreshCost() { - return 2; - } - - @Override - public void gatherComponents(Consumer components) { - addCornerRunes(components, 1, 0, EnumRuneType.FIRE); - addCornerRunes(components, 2, -1, EnumRuneType.FIRE); - addParallelRunes(components, 2, -1, EnumRuneType.EARTH); - addCornerRunes(components, -3, -1, EnumRuneType.DUSK); - addOffsetRunes(components, 2, 4, -1, EnumRuneType.WATER); - addOffsetRunes(components, 1, 4, 0, EnumRuneType.WATER); - addParallelRunes(components, 4, 1, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualWellOfSuffering(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java b/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java deleted file mode 100644 index 5ca867d6..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/RitualZephyr.java +++ /dev/null @@ -1,95 +0,0 @@ -package WayofTime.bloodmagic.ritual.types; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.*; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; -import java.util.function.Consumer; - -@RitualRegister("zephyr") -public class RitualZephyr extends Ritual { - public static final String ZEPHYR_RANGE = "zephyrRange"; - public static final String CHEST_RANGE = "chest"; - - public RitualZephyr() { - super("ritualZephyr", 0, 1000, "ritual." + BloodMagic.MODID + ".zephyrRitual"); - addBlockRange(ZEPHYR_RANGE, new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11)); - addBlockRange(CHEST_RANGE, new AreaDescriptor.Rectangle(new BlockPos(0, 1, 0), 1)); - - setMaximumVolumeAndDistanceOfRange(ZEPHYR_RANGE, 0, 10, 10); - setMaximumVolumeAndDistanceOfRange(CHEST_RANGE, 1, 3, 3); - } - - @Override - public void performRitual(IMasterRitualStone masterRitualStone) { - World world = masterRitualStone.getWorldObj(); - int currentEssence = masterRitualStone.getOwnerNetwork().getCurrentEssence(); - BlockPos masterPos = masterRitualStone.getBlockPos(); - AreaDescriptor chestRange = masterRitualStone.getBlockRange(CHEST_RANGE); - TileEntity tileInventory = world.getTileEntity(chestRange.getContainedPositions(masterPos).get(0)); - if (!masterRitualStone.getWorldObj().isRemote && tileInventory != null) { - if (currentEssence < getRefreshCost()) { - masterRitualStone.getOwnerNetwork().causeNausea(); - return; - } - - AreaDescriptor zephyrRange = masterRitualStone.getBlockRange(ZEPHYR_RANGE); - - List itemList = world.getEntitiesWithinAABB(ItemEntity.class, zephyrRange.getAABB(masterRitualStone.getBlockPos())); - int count = 0; - - for (ItemEntity entityItem : itemList) { - if (entityItem.isDead) { - continue; - } - - ItemStack copyStack = entityItem.getItem().copy(); - int originalAmount = copyStack.getCount(); - ItemStack newStack = Utils.insertStackIntoTile(copyStack, tileInventory, Direction.DOWN); - - if (!newStack.isEmpty() && newStack.getCount() < originalAmount) { - count++; - if (newStack.isEmpty()) - entityItem.setDead(); - - entityItem.getItem().setCount(newStack.getCount()); - } - - if (newStack.isEmpty()) { - entityItem.setDead(); - } - } - - masterRitualStone.getOwnerNetwork().syphon(masterRitualStone.ticket(getRefreshCost() * Math.min(count, 100))); - } - } - - @Override - public int getRefreshTime() { - return 1; - } - - @Override - public int getRefreshCost() { - return 1; - } - - @Override - public void gatherComponents(Consumer components) { - addParallelRunes(components, 2, 0, EnumRuneType.AIR); - addCornerRunes(components, 1, 1, EnumRuneType.AIR); - addParallelRunes(components, 1, -1, EnumRuneType.AIR); - } - - @Override - public Ritual getNewCopy() { - return new RitualZephyr(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java deleted file mode 100644 index 674232c4..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualDay.java +++ /dev/null @@ -1,23 +0,0 @@ -package WayofTime.bloodmagic.ritual.types.imperfect; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; - -//@RitualRegister.Imperfect("day") -public class ImperfectRitualDay extends ImperfectRitual { - public ImperfectRitualDay() { - super("day", s -> s.getBlock() == Blocks.GOLD_BLOCK, 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.day"); - } - - @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - - if (!imperfectRitualStone.getRitualWorld().isRemote) - imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000); - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java deleted file mode 100644 index 31fa5e29..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualNight.java +++ /dev/null @@ -1,24 +0,0 @@ -package WayofTime.bloodmagic.ritual.types.imperfect; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.RitualRegister; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; - -@RitualRegister.Imperfect("night") -public class ImperfectRitualNight extends ImperfectRitual { - public ImperfectRitualNight() { - super("night", s -> s.getBlock() == Blocks.LAPIS_BLOCK, 100, true, "ritual." + BloodMagic.MODID + ".imperfect.night"); - } - - @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - - if (!imperfectRitualStone.getRitualWorld().isRemote) - imperfectRitualStone.getRitualWorld().setWorldTime((imperfectRitualStone.getRitualWorld().getWorldTime() / 24000) * 24000 + 13800); - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java deleted file mode 100644 index 963a77f2..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualRain.java +++ /dev/null @@ -1,29 +0,0 @@ -package WayofTime.bloodmagic.ritual.types.imperfect; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.RitualRegister; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; - -@RitualRegister.Imperfect("rain") -public class ImperfectRitualRain extends ImperfectRitual { - public ImperfectRitualRain() { - super("rain", s -> s.getBlock() == Blocks.WATER, 5000, true, "ritual." + BloodMagic.MODID + ".imperfect.rain"); - } - - @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - if (!imperfectRitualStone.getRitualWorld().isRemote) { - imperfectRitualStone.getRitualWorld().getWorldInfo().setRaining(true); - } - - if (imperfectRitualStone.getRitualWorld().isRemote) { - imperfectRitualStone.getRitualWorld().setRainStrength(1.0F); - imperfectRitualStone.getRitualWorld().setThunderStrength(1.0F); - } - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java deleted file mode 100644 index 6ba7d951..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualResistance.java +++ /dev/null @@ -1,25 +0,0 @@ -package WayofTime.bloodmagic.ritual.types.imperfect; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.RitualRegister; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.potion.Effects; -import net.minecraft.potion.EffectInstance; - -@RitualRegister.Imperfect("resistance") -public class ImperfectRitualResistance extends ImperfectRitual { - public ImperfectRitualResistance() { - super("resistance", s -> s.getBlock() == Blocks.BEDROCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.resistance"); - } - - @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - - player.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, 1200, 1)); - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java b/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java deleted file mode 100644 index a0fc85ec..00000000 --- a/src/main/java/WayofTime/bloodmagic/ritual/types/imperfect/ImperfectRitualZombie.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.ritual.types.imperfect; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ritual.RitualRegister; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import net.minecraft.entity.monster.ZombieEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.block.Blocks; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.Effects; - -@RitualRegister.Imperfect("zombie") -public class ImperfectRitualZombie extends ImperfectRitual { - public ImperfectRitualZombie() { - super("zombie", s -> s.getBlock() == Blocks.COAL_BLOCK, 5000, "ritual." + BloodMagic.MODID + ".imperfect.zombie"); - } - - @Override - public boolean onActivate(IImperfectRitualStone imperfectRitualStone, PlayerEntity player) { - ZombieEntity zombie = new ZombieEntity(imperfectRitualStone.getRitualWorld()); - zombie.setPosition(imperfectRitualStone.getRitualPos().getX() + 0.5, imperfectRitualStone.getRitualPos().getY() + 2.1, imperfectRitualStone.getRitualPos().getZ() + 0.5); - zombie.addPotionEffect(new EffectInstance(Effects.FIRE_RESISTANCE, 2000)); - zombie.addPotionEffect(new EffectInstance(Effects.STRENGTH, 20000, 7)); - zombie.addPotionEffect(new EffectInstance(Effects.RESISTANCE, 20000, 3)); - - if (!imperfectRitualStone.getRitualWorld().isRemote) - imperfectRitualStone.getRitualWorld().spawnEntity(zombie); - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java deleted file mode 100644 index c33f19c9..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/DefaultItemFilter.java +++ /dev/null @@ -1,117 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; - -import java.util.List; - -/** - * This particular implementation of IItemFilter allows any item to be drained - * from or inputed to the connected inventory. Every stack is accepted here! - * We're basically Olive Gardens. - * - * @author WayofTime - */ -public class DefaultItemFilter implements IItemFilter { - protected TileEntity accessedTile; - protected IItemHandler itemHandler; - - /** - * Initializes the filter so that it knows what it wants to fulfill. - * - * @param filteredList - The list of ItemStacks that the filter is set to. - * @param itemHandler - The inventory that is being accessed. This inventory is either - * being pulled from or pushed to. - * @param isFilterOutput - Tells the filter what actions to expect. If true, it should be - * initialized as an output filter. If false, it should be - * initialized as an input filter. - */ - @Override - public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { - this.accessedTile = tile; - this.itemHandler = itemHandler; - } - - /** - * This method is only called when the output inventory this filter is - * managing receives an ItemStack. Should only really be called by the Input - * filter via it's transfer method. - * - * @param inputStack - The stack to transfer - * @return - The remainder of the stack after it has been absorbed into the - * inventory. - */ - @Override - public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) { - int allowedAmount = inputStack.getCount(); //This is done to make the migration to a maximum amount transfered a lot easier - - if (allowedAmount <= 0) { - return inputStack; - } - - ItemStack testStack = inputStack.copy(); - testStack.setCount(allowedAmount); - ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); - - int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - testStack = inputStack.copy(); - testStack.shrink(changeAmount); - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return testStack; - } - - /** - * This method is only called on an input filter to transfer ItemStacks from - * the input inventory to the output inventory. - */ - @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - ItemStack inputStack = itemHandler.getStackInSlot(slot); - if (inputStack.isEmpty() || itemHandler.extractItem(slot, inputStack.getCount(), true).isEmpty())//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) - { - continue; - } - - int allowedAmount = Math.min(itemHandler.extractItem(slot, inputStack.getCount(), true).getCount(), maxTransfer); - - ItemStack testStack = inputStack.copy(); - testStack.setCount(allowedAmount); - ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); - int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - - if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { - //Nothing has changed. Moving on! - continue; - } - - itemHandler.extractItem(slot, changeAmount, false); - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return changeAmount; - } - - return 0; - } - - @Override - public boolean doesStackMatchFilter(ItemStack testStack) { - return true; - } - - @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java deleted file mode 100644 index d4851334..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IFluidFilter.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - -import java.util.List; - -public interface IFluidFilter extends IRoutingFilter { - void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput); - - /** - * This method is only called when the output tank this filter is managing - * receives an ItemStack. Should only really be called by the Input filter - * via it's transfer method. - * - * @param fluidStack - The stack to filter - * @return - The remainder of the stack after it has been absorbed into the - * tank. - */ - FluidStack transferStackThroughOutputFilter(FluidStack fluidStack); - - /** - * This method is only called on an input filter to transfer FluidStacks - * from the input tank to the output tank. - */ - int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer); - - boolean doesStackMatchFilter(FluidStack testStack); - - boolean doStacksMatch(FluidStack filterStack, FluidStack testStack); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java deleted file mode 100644 index 0c795a44..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IFluidRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IFluidRoutingNode extends IRoutingNode { - boolean isTankConnectedToSide(Direction side); - - int getPriority(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java deleted file mode 100644 index 697df7dc..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputFluidRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IInputFluidRoutingNode extends IFluidRoutingNode { - boolean isFluidInput(Direction side); - - IFluidFilter getInputFluidFilterForSide(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java deleted file mode 100644 index 1d19cfa8..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IInputItemRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IInputItemRoutingNode extends IItemRoutingNode { - boolean isInput(Direction side); - - IItemFilter getInputFilterForSide(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java deleted file mode 100644 index 443b0d69..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemFilter.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.items.IItemHandler; - -import java.util.List; - -public interface IItemFilter extends IRoutingFilter { - void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput); - - /** - * This method is only called when the output inventory this filter is - * managing receives an ItemStack. Should only really be called by the Input - * filter via it's transfer method. - * - * @param inputStack - The stack to filter - * @return - The remainder of the stack after it has been absorbed into the - * inventory. - */ - ItemStack transferStackThroughOutputFilter(ItemStack inputStack); - - /** - * This method is only called on an input filter to transfer ItemStacks from - * the input inventory to the output inventory. - */ - int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer); - - boolean doesStackMatchFilter(ItemStack testStack); - - boolean doStacksMatch(ItemStack filterStack, ItemStack testStack); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java deleted file mode 100644 index 21dee0c6..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IItemRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IItemRoutingNode extends IRoutingNode { - boolean isInventoryConnectedToSide(Direction side); - - int getPriority(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java deleted file mode 100644 index dba8ba08..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java +++ /dev/null @@ -1,17 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.math.BlockPos; - -import java.util.List; - -public interface IMasterRoutingNode extends IRoutingNode { - boolean isConnected(List path, BlockPos nodePos); - - void addNodeToList(IRoutingNode node); - - void addConnections(BlockPos pos, List connectionList); - - void addConnection(BlockPos pos1, BlockPos pos2); - - void removeConnection(BlockPos pos1, BlockPos pos2); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java deleted file mode 100644 index 5ef76540..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputFluidRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IOutputFluidRoutingNode extends IFluidRoutingNode { - boolean isFluidOutput(Direction side); - - IFluidFilter getOutputFluidFilterForSide(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java deleted file mode 100644 index 8bf50ec4..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IOutputItemRoutingNode.java +++ /dev/null @@ -1,9 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.Direction; - -public interface IOutputItemRoutingNode extends IItemRoutingNode { - boolean isOutput(Direction side); - - IItemFilter getOutputFilterForSide(Direction side); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java deleted file mode 100644 index d7413770..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IRoutingFilter.java +++ /dev/null @@ -1,5 +0,0 @@ -package WayofTime.bloodmagic.routing; - -public interface IRoutingFilter { - -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java deleted file mode 100644 index 3498c570..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.List; - -public interface IRoutingNode { - void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master); - - BlockPos getBlockPos(); - - List getConnected(); - - BlockPos getMasterPos(); - - boolean isConnectionEnabled(BlockPos testPos); - - boolean isMaster(IMasterRoutingNode master); - - void addConnection(BlockPos pos1); - - void removeConnection(BlockPos pos1); - - void removeAllConnections(); -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java deleted file mode 100644 index b7ef367d..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/IgnoreNBTItemFilter.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.item.ItemStack; - -public class IgnoreNBTItemFilter extends TestItemFilter { - @Override - public boolean doesStackMatchFilter(ItemStack testStack) { - for (ItemStack filterStack : requestList) { - if (doStacksMatch(filterStack, testStack)) { - return true; - } - } - - return false; - } - - @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - return ItemStack.areItemsEqual(filterStack, testStack); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java deleted file mode 100644 index 36531585..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/ModIdItemFilter.java +++ /dev/null @@ -1,16 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.item.ItemStack; - -public class ModIdItemFilter extends TestItemFilter { - - @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - return getModID(filterStack).equalsIgnoreCase(getModID(testStack)); - } - - public String getModID(ItemStack stack) { - String modid = stack.getItem().getCreatorModId(stack); - return modid == null ? "" : modid; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java b/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java deleted file mode 100644 index bd9ff18a..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class NodeHelper { - public static boolean isNodeConnectionEnabled(World world, IRoutingNode node, BlockPos testPos) { - if (!node.isConnectionEnabled(testPos)) { - return false; - } - TileEntity tile = world.getTileEntity(testPos); - if (!(tile instanceof IRoutingNode)) { - return false; - } - - IRoutingNode testNode = (IRoutingNode) tile; - - return testNode.isConnectionEnabled(node.getBlockPos()); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java deleted file mode 100644 index aa209492..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/OreDictItemFilter.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.oredict.OreDictionary; - -public class OreDictItemFilter extends TestItemFilter { - @Override - public boolean doesStackMatchFilter(ItemStack testStack) { - for (ItemStack filterStack : requestList) { - if (doStacksMatch(filterStack, testStack)) { - return true; - } - } - - return false; - } - - @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - if (filterStack.isEmpty() || testStack.isEmpty()) - return false; - - int[] filterIds = OreDictionary.getOreIDs(filterStack); - int[] testIds = OreDictionary.getOreIDs(testStack); - - if (filterIds.length <= 0 || testIds.length <= 0) { - return false; - } - - for (int filterId : filterIds) { - for (int testId : testIds) { - if (filterId == testId) { - return true; - } - } - } - - return false; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java b/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java deleted file mode 100644 index 9f4b47a7..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/RoutingFluidFilter.java +++ /dev/null @@ -1,189 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.annotation.Nullable; - -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidTankProperties; - -public class RoutingFluidFilter implements IFluidFilter { - protected List requestList; - protected TileEntity accessedTile; - protected IFluidHandler fluidHandler; - - @Override - public void initializeFilter(List filteredList, TileEntity tile, IFluidHandler fluidHandler, boolean isFilterOutput) { - this.accessedTile = tile; - this.fluidHandler = fluidHandler; - if (isFilterOutput) { - //The requestList contains a list of how much can be extracted. - requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) { - FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) { - requestList.add(fluidFilterStack); - } - } - - IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - - for (IFluidTankProperties property : properties) { - FluidStack containedStack = property.getContents(); - if (containedStack != null) { - for (FluidStack fluidFilterStack : requestList) { - if (doStacksMatch(fluidFilterStack, containedStack)) { - fluidFilterStack.amount = Math.max(fluidFilterStack.amount - containedStack.amount, 0); - } - } - } - } - } else { - requestList = new ArrayList<>(); - for (ItemStack filterStack : filteredList) { - FluidStack fluidFilterStack = getFluidStackFromItemStack(filterStack); - if (fluidFilterStack != null) { - fluidFilterStack.amount *= -1; - requestList.add(fluidFilterStack); - } - } - - IFluidTankProperties[] properties = fluidHandler.getTankProperties(); - - for (IFluidTankProperties property : properties) { - FluidStack containedStack = property.getContents(); - if (containedStack != null) { - for (FluidStack fluidFilterStack : requestList) { - if (doStacksMatch(fluidFilterStack, containedStack)) { - fluidFilterStack.amount += containedStack.amount; - } - } - } - } - } - } - - /** - * Gives the remainder~ - */ - @Override - public FluidStack transferStackThroughOutputFilter(FluidStack fluidStack) { - int allowedAmount = 0; - for (FluidStack filterStack : requestList) { - if (doStacksMatch(filterStack, fluidStack)) { - allowedAmount = Math.min(filterStack.amount, fluidStack.amount); - break; - } - } - - if (allowedAmount <= 0) { - return fluidStack; - } - - FluidStack copyStack = fluidStack.copy(); - int filledAmount = fluidHandler.fill(fluidStack, true); - copyStack.amount = fluidStack.amount - filledAmount; - - Iterator itr = requestList.iterator(); - while (itr.hasNext()) { - FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) { - filterStack.amount -= filledAmount; - if (filterStack.amount <= 0) { - itr.remove(); - } - } - } - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return copyStack.amount <= 0 ? null : copyStack; - } - - @Override - public int transferThroughInputFilter(IFluidFilter outputFilter, int maxTransfer) { - for (FluidStack filterFluidStack : requestList) { - int allowedAmount = Math.min(filterFluidStack.amount, maxTransfer); - if (allowedAmount <= 0) { - continue; - } - - FluidStack copyStack = filterFluidStack.copy(); - copyStack.amount = allowedAmount; - FluidStack drainStack = fluidHandler.drain(copyStack, false); - if (drainStack != null) //Can't pull this liquid out for some reason if it fails this check - { - FluidStack remainderStack = outputFilter.transferStackThroughOutputFilter(drainStack); - int drained = remainderStack == null ? copyStack.amount : (copyStack.amount - remainderStack.amount); - - if (drained > 0) { - drainStack.amount = drained; - - fluidHandler.drain(drainStack, true); - maxTransfer -= drained; - } - - Iterator itr = requestList.iterator(); - while (itr.hasNext()) { - FluidStack filterStack = itr.next(); - if (doStacksMatch(filterStack, copyStack)) { - filterStack.amount -= drained; - if (filterStack.amount <= 0) { - itr.remove(); - } - } - } - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return maxTransfer; - } - } - - return 0; - } - - @Override - public boolean doesStackMatchFilter(FluidStack testStack) { - for (FluidStack filterStack : requestList) { - if (doStacksMatch(filterStack, testStack)) { - return true; - } - } - - return false; - } - - @Override - public boolean doStacksMatch(FluidStack filterStack, FluidStack testStack) { - return testStack != null && filterStack.getFluid() == testStack.getFluid(); - } - - @Nullable - public static FluidStack getFluidStackFromItemStack(ItemStack inputStack) { - boolean isEmpty = false; - if (inputStack.getCount() == 0) { - isEmpty = true; - inputStack.setCount(1); - } - - FluidStack fluidStack = FluidUtil.getFluidContained(inputStack); - if (fluidStack == null) - return null; - - fluidStack.amount = isEmpty ? 0 : inputStack.getCount(); - return fluidStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java b/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java deleted file mode 100644 index 2e45865d..00000000 --- a/src/main/java/WayofTime/bloodmagic/routing/TestItemFilter.java +++ /dev/null @@ -1,214 +0,0 @@ -package WayofTime.bloodmagic.routing; - -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.items.IItemHandler; - -import java.util.Iterator; -import java.util.List; - -/** - * This particular implementation of IItemFilter checks to make sure that a) as - * an output filter it will fill until the requested amount and b) as an input - * filter it will only syphon until the requested amount. - * - * @author WayofTime - */ -public class TestItemFilter implements IItemFilter { - /* - * This list acts as the way the filter keeps track of its contents. For the - * case of an output filter, it holds a list of ItemStacks that needs to be - * inserted in the inventory to finish its request. For the case of an input - * filter, it keeps track of how many can be removed. - */ - protected List requestList; - protected TileEntity accessedTile; - protected IItemHandler itemHandler; - - /** - * Initializes the filter so that it knows what it wants to fulfill. - * - * @param filteredList - The list of ItemStacks that the filter is set to. - * @param tile - The inventory that is being accessed. This inventory is either - * being pulled from or pushed to. - * @param itemHandler - The item handler - * @param isFilterOutput - Tells the filter what actions to expect. If true, it should be - * initialized as an output filter. If false, it should be - * initialized as an input filter. - */ - @Override - public void initializeFilter(List filteredList, TileEntity tile, IItemHandler itemHandler, boolean isFilterOutput) { - this.accessedTile = tile; - this.itemHandler = itemHandler; - if (isFilterOutput) { - requestList = filteredList; - - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - ItemStack checkedStack = itemHandler.getStackInSlot(slot); - if (checkedStack.isEmpty()) { - continue; - } - - int stackSize = checkedStack.getCount(); - - for (ItemStack filterStack : requestList) { - if (filterStack.getCount() == 0) { - continue; - } - - if (doStacksMatch(filterStack, checkedStack)) { - filterStack.setCount(Math.max(filterStack.getCount() - stackSize, 0)); - } - } - } - } else { - requestList = filteredList; - for (ItemStack filterStack : requestList) { - filterStack.setCount(filterStack.getCount() * -1); //Invert the stack size so that - } - - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - ItemStack checkedStack = itemHandler.getStackInSlot(slot); - if (checkedStack.isEmpty()) { - continue; - } - - int stackSize = checkedStack.getCount(); - - for (ItemStack filterStack : filteredList) { - if (doStacksMatch(filterStack, checkedStack)) { - filterStack.grow(stackSize); - } - } - } - } - - requestList.removeIf(ItemStack::isEmpty); - } - - /** - * This method is only called when the output inventory this filter is - * managing receives an ItemStack. Should only really be called by the Input - * filter via it's transfer method. - * - * @param inputStack - The stack to transfer - * @return - The remainder of the stack after it has been absorbed into the - * inventory. - */ - @Override - public ItemStack transferStackThroughOutputFilter(ItemStack inputStack) { - int allowedAmount = 0; - for (ItemStack filterStack : requestList) { - if (doStacksMatch(filterStack, inputStack)) { - allowedAmount = Math.min(filterStack.getCount(), inputStack.getCount()); - break; - } - } - - if (allowedAmount <= 0) { - return inputStack; - } - - ItemStack testStack = inputStack.copy(); - testStack.setCount(allowedAmount); - ItemStack remainderStack = Utils.insertStackIntoTile(testStack, itemHandler); - - int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - testStack = inputStack.copy(); - testStack.shrink(changeAmount); - - Iterator itr = requestList.iterator(); - while (itr.hasNext()) { - ItemStack filterStack = itr.next(); - if (doStacksMatch(filterStack, inputStack)) { - filterStack.shrink(changeAmount); - if (filterStack.isEmpty()) { - itr.remove(); - } - } - } - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return testStack; - } - - /** - * This method is only called on an input filter to transfer ItemStacks from - * the input inventory to the output inventory. - */ - @Override - public int transferThroughInputFilter(IItemFilter outputFilter, int maxTransfer) { - for (int slot = 0; slot < itemHandler.getSlots(); slot++) { - ItemStack inputStack = itemHandler.getStackInSlot(slot); - if (inputStack.isEmpty() || itemHandler.extractItem(slot, inputStack.getCount(), true).isEmpty())//(accessedInventory instanceof ISidedInventory && !((ISidedInventory) accessedInventory).canExtractItem(slot, inputStack, accessedSide))) - { - continue; - } - - int allowedAmount = 0; - for (ItemStack filterStack : requestList) { - if (doStacksMatch(filterStack, inputStack)) { - allowedAmount = Math.min(maxTransfer, Math.min(filterStack.getCount(), itemHandler.extractItem(slot, inputStack.getCount(), true).getCount())); - break; - } - } - - if (allowedAmount <= 0) { - continue; - } - - ItemStack testStack = inputStack.copy(); - testStack.setCount(allowedAmount); - ItemStack remainderStack = outputFilter.transferStackThroughOutputFilter(testStack); - int changeAmount = allowedAmount - (remainderStack.isEmpty() ? 0 : remainderStack.getCount()); - - if (!remainderStack.isEmpty() && remainderStack.getCount() == allowedAmount) { - //Nothing has changed. Moving on! - continue; - } - - itemHandler.extractItem(slot, changeAmount, false); - - Iterator itr = requestList.iterator(); - while (itr.hasNext()) { - ItemStack filterStack = itr.next(); - if (doStacksMatch(filterStack, inputStack)) { - filterStack.shrink(changeAmount); - if (filterStack.isEmpty()) { - itr.remove(); - } - } - } - - World world = accessedTile.getWorld(); - BlockPos pos = accessedTile.getPos(); - world.notifyBlockUpdate(pos, world.getBlockState(pos), world.getBlockState(pos), 3); - - return changeAmount; - } - - return 0; - } - - @Override - public boolean doesStackMatchFilter(ItemStack testStack) { - for (ItemStack filterStack : requestList) { - if (doStacksMatch(filterStack, testStack)) { - return true; - } - } - - return false; - } - - @Override - public boolean doStacksMatch(ItemStack filterStack, ItemStack testStack) { - return Utils.canCombine(filterStack, testStack); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java b/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java deleted file mode 100644 index 884431b0..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/DemonWillHolder.java +++ /dev/null @@ -1,81 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.nbt.CompoundNBT; - -import java.util.HashMap; -import java.util.Map.Entry; - -public class DemonWillHolder { - public HashMap willMap = new HashMap<>(); - - public double addWill(EnumDemonWillType type, double amount, double max) { - double current = 0; - if (willMap.containsKey(type)) { - current = willMap.get(type); - } - - double added = Math.min(max - current, amount); - addWill(type, amount); - - return added; - } - - public void addWill(EnumDemonWillType type, double amount) { - if (willMap.containsKey(type)) { - willMap.put(type, amount + willMap.get(type)); - } else { - willMap.put(type, amount); - } - } - - public double drainWill(EnumDemonWillType type, double amount) { - if (willMap.containsKey(type)) { - double current = willMap.get(type); - double reduced = Math.min(current, amount); - - if (reduced >= current) { - willMap.remove(type); - } else { - willMap.put(type, current - reduced); - } - - return reduced; - } - - return 0; - } - - public double getWill(EnumDemonWillType type) { - if (willMap.containsKey(type)) { - return willMap.get(type); - } - - return 0; - } - - public void readFromNBT(CompoundNBT tag, String key) { - CompoundNBT willTag = tag.getCompound(key); - - willMap.clear(); - - for (EnumDemonWillType type : EnumDemonWillType.values()) { - double amount = willTag.getDouble("EnumWill" + type.getName()); - if (amount > 0) { - willMap.put(type, amount); - } - } - } - - public void writeToNBT(CompoundNBT tag, String key) { - CompoundNBT willTag = new CompoundNBT(); - for (Entry entry : willMap.entrySet()) { - willTag.putDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); - } - - tag.put(key, willTag); - } - - public void clearWill() { - willMap.clear(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java b/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java deleted file mode 100644 index 86f5898f..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/EnumDemonWillType.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.types.ISubItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IStringSerializable; - -import javax.annotation.Nonnull; -import java.util.Locale; - -public enum EnumDemonWillType implements IStringSerializable, ISubItem { - DEFAULT("default"), - CORROSIVE("corrosive"), - DESTRUCTIVE("destructive"), - VENGEFUL("vengeful"), - STEADFAST("steadfast"); - - public final String name; - - EnumDemonWillType(String name) { - this.name = name; - } - - @Override - public String toString() { - return name().toLowerCase(Locale.ENGLISH); - } - - @Override - public String getName() { - return this.toString(); - } - - - @Nonnull - @Override - public String getInternalName() { - return getName(); - } - - @Nonnull - @Override - public ItemStack getStack(int count) { - return new ItemStack(RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL, count); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java deleted file mode 100644 index cb83bc1d..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/IDemonWill.java +++ /dev/null @@ -1,52 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.item.ItemStack; - -public interface IDemonWill { - /** - * Obtains the amount of Will an ItemStack contains. - * - * @param willStack - The stack to retrieve the Will from - * @return - The amount of Will an ItemStack contains - */ - double getWill(EnumDemonWillType type, ItemStack willStack); - - @Deprecated - double getWill(ItemStack willStack); - - /** - * Sets the amount of Will in a given ItemStack. - * - * @param willStack - The ItemStack of the Will - * @param will - The amount of will to set the stack to - */ - void setWill(EnumDemonWillType type, ItemStack willStack, double will); - - @Deprecated - void setWill(ItemStack willStack, double will); - - /** - * Drains the demonic will from the willStack. If all of the will is - * drained, the willStack will be removed. - * - * @param willStack - The ItemStack of the will - * @param drainAmount - The amount of Will to drain - * @return The amount of will drained. - */ - double drainWill(EnumDemonWillType type, ItemStack willStack, double drainAmount); - - @Deprecated - double drainWill(ItemStack willStack, double drainAmount); - - /** - * Creates a new ItemStack with the specified number of will. Implementation - * should respect the number requested. - * - * @param meta - The meta of the ItemStack to create - * @param number - The amount of Will to create the Stack with. - * @return - An ItemStack with the set amount of Will - */ - ItemStack createWill(int meta, double number); - - EnumDemonWillType getType(ItemStack stack); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java deleted file mode 100644 index 0d5027ae..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillConduit.java +++ /dev/null @@ -1,18 +0,0 @@ -package WayofTime.bloodmagic.soul; - -/** - * Implement this interface on a block that can accept and store Demonic Will. - */ -public interface IDemonWillConduit { - int getWeight(); - - double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill); - - double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain); - - boolean canFill(EnumDemonWillType type); - - boolean canDrain(EnumDemonWillType type); - - double getCurrentWill(EnumDemonWillType type); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java deleted file mode 100644 index 78c64544..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillGem.java +++ /dev/null @@ -1,27 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.item.ItemStack; - -public interface IDemonWillGem { - /** - * @param willGemStack - The ItemStack for this demon will gem. - * @param willStack - The ItemStack for the will. Item should extend IDemonWill - * @return - The remainder willStack after the will has been absorbed into - * the gem. Return null if there is no will left in the stack. - */ - ItemStack fillDemonWillGem(ItemStack willGemStack, ItemStack willStack); - - /** - * Returns the number of souls that are left in the soul gem. Returns a - * double because souls can be fractionally drained. - */ - double getWill(EnumDemonWillType type, ItemStack willGemStack); - - void setWill(EnumDemonWillType type, ItemStack willGemStack, double amount); - - int getMaxWill(EnumDemonWillType type, ItemStack willGemStack); - - double drainWill(EnumDemonWillType type, ItemStack stack, double drainAmount, boolean doDrain); - - double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java b/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java deleted file mode 100644 index 3a56b4c4..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/IDemonWillWeapon.java +++ /dev/null @@ -1,10 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; - -import java.util.List; - -public interface IDemonWillWeapon { - List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java b/src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java deleted file mode 100644 index 9709817a..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/IDiscreteDemonWill.java +++ /dev/null @@ -1,40 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.item.ItemStack; - -public interface IDiscreteDemonWill { - /** - * Obtains the amount of Will an ItemStack contains. - * - * @param soulStack - The stack to retrieve the Will from - * @return - The amount of Will an ItemStack contains - */ - double getWill(ItemStack soulStack); - - /** - * Drains the demonic will from the willStack. If all of the will is - * drained, the willStack will be removed. Will only drain in discrete - * amounts, determined by getDiscretization. - * - * @param willStack - The ItemStack of the will - * @param drainAmount - The amount of Will to drain - * @return The amount of will drained. - */ - double drainWill(ItemStack willStack, double drainAmount); - - /** - * Gets the discrete number for this demonic will. - * - * @param willStack - The ItemStack of the will - * @return - The discrete number for the given stack. - */ - double getDiscretization(ItemStack willStack); - - /** - * Obtains the type of will this is. - * - * @param willStack - The ItemStack of the will - * @return - The type of will this is. - */ - EnumDemonWillType getType(ItemStack willStack); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java b/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java deleted file mode 100644 index da0f4d07..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/ISoulBreathContainer.java +++ /dev/null @@ -1,15 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import net.minecraft.item.ItemStack; - -public interface ISoulBreathContainer { - double getBreath(ItemStack stack); - - void setBreath(ItemStack stack, double amount); - - int getMaxBreath(ItemStack stack); - - double drainBreath(ItemStack stack, double drainAmount, boolean doDrain); - - double fillBreath(ItemStack stack, double fillAmount, boolean doFill); -} diff --git a/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java deleted file mode 100644 index 51f080d8..00000000 --- a/src/main/java/WayofTime/bloodmagic/soul/PlayerDemonWillHandler.java +++ /dev/null @@ -1,176 +0,0 @@ -package WayofTime.bloodmagic.soul; - -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.NonNullList; - -/** - * This class provides several helper methods in order to handle soul - * consumption and use for a player. This refers to the Soul System, meaning - * Monster Souls and Soul Gems, etc. The Soul Network's helper methods are found - * in {@link NetworkHelper} - */ -public class PlayerDemonWillHandler { - /** - * Gets the total amount of Will a player contains in their inventory - * - * @param type - The type of Will to check for - * @param player - The player to check the will of - * @return - The amount of will the player contains - */ - public static double getTotalDemonWill(EnumDemonWillType type, PlayerEntity player) { - NonNullList inventory = player.inventory.mainInventory; - double souls = 0; - - for (ItemStack stack : inventory) { - if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) { - souls += ((IDemonWill) stack.getItem()).getWill(type, stack); - } else if (stack.getItem() instanceof IDemonWillGem) { - souls += ((IDemonWillGem) stack.getItem()).getWill(type, stack); - } - } - - return souls; - } - - public static EnumDemonWillType getLargestWillType(PlayerEntity player) { - EnumDemonWillType type = EnumDemonWillType.DEFAULT; - double max = getTotalDemonWill(type, player); - - for (EnumDemonWillType testType : EnumDemonWillType.values()) { - double value = getTotalDemonWill(testType, player); - if (value > max) { - type = testType; - } - } - - return type; - } - - /** - * Checks if the player's Tartaric gems are completely full. - * - * @param type - The type of Will to check for - * @param player - The player to check the Will of - * @return - True if all Will containers are full, false if not. - */ - public static boolean isDemonWillFull(EnumDemonWillType type, PlayerEntity player) { - NonNullList inventory = player.inventory.mainInventory; - - boolean hasGem = false; - for (ItemStack stack : inventory) { - if (stack.getItem() instanceof IDemonWillGem) { - hasGem = true; - if (((IDemonWillGem) stack.getItem()).getWill(type, stack) < ((IDemonWillGem) stack.getItem()).getMaxWill(type, stack)) - return false; - } - } - - return hasGem; - } - - /** - * Consumes Will from the inventory of a given player - * - * @param player - The player to consume the will of - * @param amount - The amount of will to consume - * @return - The amount of will consumed. - */ - public static double consumeDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) { - double consumed = 0; - - NonNullList inventory = player.inventory.mainInventory; - - for (int i = 0; i < inventory.size(); i++) { - if (consumed >= amount) - return consumed; - - ItemStack stack = inventory.get(i); - if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) { - consumed += ((IDemonWill) stack.getItem()).drainWill(type, stack, amount - consumed); - if (((IDemonWill) stack.getItem()).getWill(type, stack) <= 0) - inventory.set(i, ItemStack.EMPTY); - } else if (stack.getItem() instanceof IDemonWillGem) { - consumed += ((IDemonWillGem) stack.getItem()).drainWill(type, stack, amount - consumed, true); - } - } - - return consumed; - } - - /** - * Adds an IDemonWill contained in an ItemStack to one of the Soul Gems in - * the player's inventory. - * - * @param player - The player to add will to - * @param willStack - ItemStack that contains an IDemonWill to be added - * @return - The modified willStack - */ - public static ItemStack addDemonWill(PlayerEntity player, ItemStack willStack) { - if (willStack.isEmpty()) - return ItemStack.EMPTY; - - NonNullList inventory = player.inventory.mainInventory; - - for (ItemStack stack : inventory) { - if (stack.getItem() instanceof IDemonWillGem) { - ItemStack newStack = ((IDemonWillGem) stack.getItem()).fillDemonWillGem(stack, willStack); - if (newStack.isEmpty()) - return ItemStack.EMPTY; - } - } - - return willStack; - } - - /** - * Adds an IDiscreteDemonWill contained in an ItemStack to one of the Soul - * Gems in the player's inventory. - * - * @param type - The type of Will to add - * @param player - The player to check the Will of - * @param amount - The amount of will to add - * @return - The amount of will added - */ - public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) { - NonNullList inventory = player.inventory.mainInventory; - double remaining = amount; - - for (ItemStack stack : inventory) { - if (stack.getItem() instanceof IDemonWillGem) { - remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); - if (remaining <= 0) - break; - } - } - - return amount - remaining; - } - - /** - * Adds an IDiscreteDemonWill contained in an ItemStack to one of the Soul - * Gems in the player's inventory while ignoring a specified stack. - * - * @param type - The type of Will to add - * @param player - The player to check the Will of - * @param amount - The amount of will to add - * @param ignored - A stack to ignore - * @return - The amount of will added - */ - public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount, ItemStack ignored) { - NonNullList inventory = player.inventory.mainInventory; - double remaining = amount; - - for (ItemStack stack : inventory) { - if (!stack.equals(ignored) && stack.getItem() instanceof IDemonWillGem) { - remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); - - if (remaining <= 0) - break; - } - } - - return amount - remaining; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java b/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java deleted file mode 100644 index a9897ce0..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/BuildTestStructure.java +++ /dev/null @@ -1,56 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; -import net.minecraft.world.gen.feature.template.PlacementSettings; -import net.minecraft.world.gen.feature.template.Template; -import net.minecraft.world.gen.feature.template.TemplateManager; - -import java.util.Random; - -public class BuildTestStructure { - public boolean placeStructureAtPosition(Random rand, Rotation baseRotation, ServerWorld world, BlockPos pos, int iteration) { - if (pos == null) - return false; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = world.getStructureTemplateManager(); - - ResourceLocation resource = new ResourceLocation(BloodMagic.MODID, "Corridor1"); - Template template = templatemanager.getTemplate(minecraftserver, resource); - - if (template == null) { - BMLog.DEBUG.warn("Invalid template for location: " + resource); - return false; - } - - PlacementSettings settings = new PlacementSettings(); - settings.setMirror(Mirror.NONE); - - Rotation rot; - - rot = baseRotation; - if (rot == null) - rot = Rotation.NONE; - - settings.setRotation(rot); - settings.setIgnoreEntities(true); - settings.setChunk(null); - settings.setReplacedBlock(null); - settings.setIgnoreStructureBlock(false); - -// settings.func_189946_a(MathHelper.clamp_float(schema.integrity, 0.0F, 1.0F)); - - BlockPos offset = Template.transformedBlockPos(settings, new BlockPos(0, 0, 0)); - BlockPos finalPos = pos.add(offset); - template.addBlocksToWorldChunk(world, finalPos, settings); - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java b/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java deleted file mode 100644 index 0575197a..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/Dungeon.java +++ /dev/null @@ -1,152 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.util.Direction; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; -import net.minecraft.world.gen.feature.template.PlacementSettings; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.*; -import java.util.Map.Entry; - -public class Dungeon { - public static boolean placeStructureAtPosition(Random rand, ServerWorld world, BlockPos pos) { - long startTime = System.nanoTime(); - - Map> availableDoorMap = new HashMap<>(); //Map of doors. The EnumFacing indicates what way this door faces. - List descriptorList = new ArrayList<>(); - Map> roomMap = new HashMap<>(); // Placement positions in terms of actual positions - - PlacementSettings settings = new PlacementSettings(); - Mirror mir = Mirror.NONE; - - settings.setMirror(mir); - - Rotation rot = Rotation.NONE; - - settings.setRotation(rot); - settings.setIgnoreEntities(true); - settings.setChunk(null); - settings.setReplacedBlock(null); - settings.setIgnoreStructureBlock(false); - - DungeonRoom room = getRandomRoom(rand); - roomMap.put(pos, Pair.of(room, settings.copy())); - descriptorList.addAll(room.getAreaDescriptors(settings, pos)); - for (Direction facing : Direction.VALUES) { - if (availableDoorMap.containsKey(facing)) { - List doorList = availableDoorMap.get(facing); - doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, pos)); - } else { - List doorList = room.getDoorOffsetsForFacing(settings, facing, pos); - availableDoorMap.put(facing, doorList); - } - } - - //Initial AreaDescriptors and door positions are initialized. Time for fun! - for (int i = 0; i < 100; i++) { - List facingList = new ArrayList<>(); - for (Entry> entry : availableDoorMap.entrySet()) { - if (entry.getValue() != null && !entry.getValue().isEmpty()) { - facingList.add(entry.getKey()); - } - } - - Collections.shuffle(facingList); //Shuffle the list so that it is random what is chosen - - Pair removedDoor1 = null; - Pair removedDoor2 = null; - BlockPos roomLocation = null; - - for (Direction doorFacing : facingList) { - Direction oppositeDoorFacing = doorFacing.getOpposite(); - List availableDoorList = availableDoorMap.get(doorFacing); //May need to copy here - Collections.shuffle(availableDoorList); - - settings.setRotation(Rotation.values()[rand.nextInt(Rotation.values().length)]); //Same for the Mirror - DungeonRoom testingRoom = getRandomRoom(rand); - - List otherDoorList = testingRoom.getDoorOffsetsForFacing(settings, oppositeDoorFacing, BlockPos.ORIGIN); - if (otherDoorList != null && !otherDoorList.isEmpty()) { - //See if one of these doors works. - Collections.shuffle(otherDoorList); - BlockPos testDoor = otherDoorList.get(0); - testDoor: - for (BlockPos availableDoor : availableDoorList) { - //TODO: Test if it fits, then add the doors to the list. - roomLocation = availableDoor.subtract(testDoor).add(doorFacing.getDirectionVec()); - - List descriptors = testingRoom.getAreaDescriptors(settings, roomLocation); - for (AreaDescriptor testDesc : descriptors) { - for (AreaDescriptor currentDesc : descriptorList) { - if (testDesc.intersects(currentDesc)) { - break testDoor; - } - } - } - - roomMap.put(roomLocation, Pair.of(testingRoom, settings.copy())); - descriptorList.addAll(descriptors); - removedDoor1 = Pair.of(doorFacing, availableDoor); - removedDoor2 = Pair.of(oppositeDoorFacing, testDoor.add(roomLocation)); - - room = testingRoom; - - } - - break; - } - -// Collections.shuffle(otherDoorList); - } - - if (removedDoor1 != null) { - for (Direction facing : Direction.VALUES) { - if (availableDoorMap.containsKey(facing)) { - List doorList = availableDoorMap.get(facing); - doorList.addAll(room.getDoorOffsetsForFacing(settings, facing, roomLocation)); - } else { - List doorList = room.getDoorOffsetsForFacing(settings, facing, roomLocation); - availableDoorMap.put(facing, doorList); - } - } - - Direction face = removedDoor1.getKey(); - if (availableDoorMap.containsKey(face)) { - availableDoorMap.get(face).remove(removedDoor1.getRight()); - } - } - - if (removedDoor2 != null) { - Direction face = removedDoor2.getKey(); - if (availableDoorMap.containsKey(face)) { - availableDoorMap.get(face).remove(removedDoor2.getRight()); - } - } - } - - long endTime = System.nanoTime(); - - long duration = (endTime - startTime); //divide by 1000000 to get milliseconds. - BMLog.DEBUG.info("Duration: " + duration + "(ns), " + duration / 1000000 + "(ms)"); - - //Building what I've got - for (Entry> entry : roomMap.entrySet()) { - BlockPos placementPos = entry.getKey(); - DungeonRoom placedRoom = entry.getValue().getKey(); - PlacementSettings placementSettings = entry.getValue().getValue(); - - placedRoom.placeStructureAtPosition(rand, placementSettings, world, placementPos); - } - - return false; - } - - public static DungeonRoom getRandomRoom(Random rand) { - return DungeonRoomRegistry.getRandomDungeonRoom(rand); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java deleted file mode 100644 index 76b242bd..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoom.java +++ /dev/null @@ -1,62 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; -import net.minecraft.world.gen.feature.template.PlacementSettings; -import net.minecraft.world.gen.feature.template.Template; - -import java.util.*; -import java.util.Map.Entry; - -public class DungeonRoom { - public int dungeonWeight = 1; - public Map structureMap = new HashMap<>(); - - public Map> doorMap = new HashMap<>(); //Map of doors. The EnumFacing indicates what way this door faces. - public List descriptorList = new ArrayList<>(); - - public DungeonRoom(Map structureMap, Map> doorMap, List descriptorList) { - this.structureMap = structureMap; - this.doorMap = doorMap; - this.descriptorList = descriptorList; - } - - public List getAreaDescriptors(PlacementSettings settings, BlockPos offset) { - List newList = new ArrayList<>(); - - for (AreaDescriptor desc : descriptorList) { - newList.add(desc.rotateDescriptor(settings).offset(offset)); - } - - return newList; - } - - public List getDoorOffsetsForFacing(PlacementSettings settings, Direction facing, BlockPos offset) { - List offsetList = new ArrayList<>(); - - Direction originalFacing = DungeonUtil.reverseRotate(settings.getMirror(), settings.getRotation(), facing); - if (doorMap.containsKey(originalFacing)) { - List doorList = doorMap.get(originalFacing); - for (BlockPos doorPos : doorList) { - offsetList.add(Template.transformedBlockPos(settings, doorPos).add(offset)); - } - } - - return offsetList; - } - - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, ServerWorld world, BlockPos pos) { - for (Entry entry : structureMap.entrySet()) { - ResourceLocation location = new ResourceLocation(entry.getKey()); - DungeonStructure structure = new DungeonStructure(location); - BlockPos offsetPos = Template.transformedBlockPos(settings, entry.getValue()); - - structure.placeStructureAtPosition(rand, settings, world, pos.add(offsetPos)); - } - - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java deleted file mode 100644 index 2b712a20..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomLoader.java +++ /dev/null @@ -1,75 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.gson.Serializers; -import com.google.common.base.Charsets; -import com.google.common.io.Resources; -import com.google.common.reflect.TypeToken; -import net.minecraft.util.ResourceLocation; -import org.apache.commons.io.IOUtils; - -import java.io.*; -import java.net.URL; -import java.util.List; -import java.util.Random; - -public class DungeonRoomLoader { - public static void saveDungeons() { - for (DungeonRoom room : DungeonRoomRegistry.dungeonWeightMap.keySet()) { - saveSingleDungeon(room); - } - } - - public static void saveSingleDungeon(DungeonRoom room) { - String json = Serializers.GSON.toJson(room); - - Writer writer; - try { - File file = new File("config/BloodMagic/schematics"); - file.mkdirs(); - - writer = new FileWriter("config/BloodMagic/schematics/" + new Random().nextInt() + ".json"); - writer.write(json); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void loadDungeons() { - try { - URL schematicURL = DungeonRoomLoader.class.getResource(resLocToResourcePath(new ResourceLocation("bloodmagic:schematics"))); - List schematics = Serializers.GSON.fromJson(Resources.toString(schematicURL, Charsets.UTF_8), new TypeToken>() { - }.getType()); - for (String schematicKey : schematics) { - ResourceLocation schematic = new ResourceLocation(schematicKey); - URL dungeonURL = DungeonRoomLoader.class.getResource(resLocToResourcePath(schematic)); - DungeonRoom dungeonRoom = Serializers.GSON.fromJson(Resources.toString(dungeonURL, Charsets.UTF_8), DungeonRoom.class); - DungeonRoomRegistry.registerDungeonRoom(dungeonRoom, Math.max(1, dungeonRoom.dungeonWeight)); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void test() { - ResourceLocation id = new ResourceLocation(BloodMagic.MODID, "testGson"); - String s = id.getNamespace(); - String s1 = id.getPath(); - InputStream inputstream = null; - - try { - inputstream = DungeonRoomLoader.class.getResourceAsStream("/assets/" + s + "/schematics/" + s1 + ".nbt"); -// this.readTemplateFromStream(s1, inputstream); - return; - } catch (Throwable var10) { - - } finally { - IOUtils.closeQuietly(inputstream); - } - } - - public static String resLocToResourcePath(ResourceLocation resourceLocation) { - return "/assets/" + resourceLocation.getNamespace() + "/schematics/" + resourceLocation.getPath() + ".json"; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java deleted file mode 100644 index 5dd80e81..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonRoomRegistry.java +++ /dev/null @@ -1,28 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Random; - -public class DungeonRoomRegistry { - public static Map dungeonWeightMap = new HashMap<>(); - private static int totalWeight = 0; - - public static void registerDungeonRoom(DungeonRoom room, int weight) { - dungeonWeightMap.put(room, weight); - totalWeight += weight; - } - - public static DungeonRoom getRandomDungeonRoom(Random rand) { - int wantedWeight = rand.nextInt(totalWeight); - for (Entry entry : dungeonWeightMap.entrySet()) { - wantedWeight -= entry.getValue(); - if (wantedWeight < 0) { - return entry.getKey(); - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java deleted file mode 100644 index 7f5b8705..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonStructure.java +++ /dev/null @@ -1,47 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import WayofTime.bloodmagic.util.BMLog; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; -import net.minecraft.world.gen.feature.template.PlacementSettings; -import net.minecraft.world.gen.feature.template.Template; -import net.minecraft.world.gen.feature.template.TemplateManager; - -import java.util.Random; - -public class DungeonStructure { - public ResourceLocation resource; - - public DungeonStructure(ResourceLocation resource) { - this.resource = resource; - } - - public boolean placeStructureAtPosition(Random rand, PlacementSettings settings, ServerWorld world, BlockPos pos) { - if (pos == null) - return false; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = world.getStructureTemplateManager(); - - Template template = templatemanager.getTemplate(minecraftserver, resource); - - if (template == null) { - BMLog.DEBUG.warn("Invalid template for location: " + resource); - return false; - } - -// settings.func_189946_a(MathHelper.clamp_float(schema.integrity, 0.0F, 1.0F)); - - BlockPos offset = Template.transformedBlockPos(settings, new BlockPos(0, 0, 0)); - BlockPos finalPos = pos.add(offset); - template.addBlocksToWorldChunk(world, finalPos, settings); - - return true; - } - - public DungeonStructure copy() { - return new DungeonStructure(resource); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java deleted file mode 100644 index 68483ead..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonTester.java +++ /dev/null @@ -1,82 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; - -import java.util.Random; - -public class DungeonTester { - public static void testDungeonGeneration(ServerWorld world, BlockPos pos) { - - } - - public static void testDungeonElementWithOutput(ServerWorld world, BlockPos pos) { - Dungeon.placeStructureAtPosition(new Random(), world, pos); -// ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "Corridor1"); -// -// DungeonStructure structure = new DungeonStructure(resource); -// Map structureMap = new HashMap(); -// structureMap.put(structure, new BlockPos(0, 0, 0)); -// -// Map> doorMap = new HashMap>(); -// List descriptorList = new ArrayList(); -// descriptorList.add(new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 5, 3, 7)); -// -// DungeonUtil.addRoom(doorMap, EnumFacing.NORTH, new BlockPos(3, 0, 0)); -// DungeonUtil.addRoom(doorMap, EnumFacing.SOUTH, new BlockPos(3, 0, 6)); -// DungeonUtil.addRoom(doorMap, EnumFacing.WEST, new BlockPos(0, 0, 3)); -// -// DungeonRoom room = new DungeonRoom(structureMap, doorMap, descriptorList); -// -// PlacementSettings settings = new PlacementSettings(); -// -// Mirror mir = Mirror.NONE; -// settings.setMirror(mir); -// -// Rotation rot = Rotation.NONE; -// settings.setRotation(rot); -// -// settings.setIgnoreEntities(true); -// settings.setChunk((ChunkPos) null); -// settings.setReplacedBlock((Block) null); -// settings.setIgnoreStructureBlock(false); -// -// int i = 0; -// -// for (Mirror mirror : Mirror.values()) -// { -// System.out.print("Mirror: " + mirror + '\n'); -// int j = 0; -// for (Rotation rotation : Rotation.values()) -// { -// System.out.print("Rotation: " + rot + '\n'); -// settings.setRotation(rotation); -// settings.setMirror(mirror); -// -// BlockPos offsetPos = pos.add(i * 16, 0, j * 16); -// room.placeStructureAtPosition(new Random(), settings, world, offsetPos); -// -//// List descriptors = structure.getAreaDescriptors(settings, offsetPos); -//// for (AreaDescriptor desc : descriptors) -//// { -//// List posList = desc.getContainedPositions(new BlockPos(0, 0, 0)); -//// for (BlockPos placePos : posList) -//// { -//// world.setBlockState(placePos, Blocks.REDSTONE_BLOCK.getDefaultState()); -//// } -//// } -// -//// for (EnumFacing facing : EnumFacing.HORIZONTALS) -//// { -//// List doorList = structure.getDoorOffsetsForFacing(settings, facing); -//// for (BlockPos doorPos : doorList) -//// { -//// System.out.print("Door at " + doorPos + " facing " + facing + '\n'); -//// } -//// } -// j++; -// } -// i++; -// } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java b/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java deleted file mode 100644 index 31cbbb1c..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/DungeonUtil.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.structures; - -import net.minecraft.util.Direction; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.gen.feature.template.PlacementSettings; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class DungeonUtil { - public static Direction rotate(Mirror mirror, Rotation rotation, Direction original) { - return rotation.rotate(mirror.mirror(original)); - } - - public static Direction reverseRotate(Mirror mirror, Rotation rotation, Direction original) { - return mirror.mirror(getOppositeRotation(rotation).rotate(original)); - } - - public static Direction getFacingForSettings(PlacementSettings settings, Direction original) { - return rotate(settings.getMirror(), settings.getRotation(), original); - } - - public static Rotation getOppositeRotation(Rotation rotation) { - switch (rotation) { - case CLOCKWISE_90: - return Rotation.COUNTERCLOCKWISE_90; - case COUNTERCLOCKWISE_90: - return Rotation.CLOCKWISE_90; - default: - return rotation; - } - } - - public static void addRoom(Map> doorMap, Direction facing, BlockPos offsetPos) { - if (doorMap.containsKey(facing)) { - doorMap.get(facing).add(offsetPos); - } else { - List doorList = new ArrayList<>(); - doorList.add(offsetPos); - doorMap.put(facing, doorList); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java b/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java deleted file mode 100644 index 469e3abe..00000000 --- a/src/main/java/WayofTime/bloodmagic/structures/ModDungeons.java +++ /dev/null @@ -1,26 +0,0 @@ -package WayofTime.bloodmagic.structures; - -public class ModDungeons { - public static void init() { -// ResourceLocation resource = new ResourceLocation(Constants.Mod.MODID, "HallChest1"); -// -// Map structureMap = new HashMap(); -// structureMap.put(resource.toString(), new BlockPos(0, 0, 0)); -// -// Map> doorMap = new HashMap>(); -// List descriptorList = new ArrayList(); -// descriptorList.add(new AreaDescriptor.Rectangle(new BlockPos(0, 0, 0), 12, 5, 9)); -// -// DungeonUtil.addRoom(doorMap, EnumFacing.EAST, new BlockPos(11, 0, 4)); -// DungeonUtil.addRoom(doorMap, EnumFacing.WEST, new BlockPos(0, 0, 4)); -// -// DungeonRoom room = new DungeonRoom(structureMap, doorMap, descriptorList); -// DungeonRoomLoader.saveSingleDungeon(room); -// -// DungeonRoomRegistry.registerDungeonRoom(room, 1); -// -// DungeonRoomLoader.saveDungeons(); - - DungeonRoomLoader.loadDungeons(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java b/src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java deleted file mode 100644 index 1f9242f4..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/ITeleport.java +++ /dev/null @@ -1,7 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -public interface ITeleport { - void teleport(); - - int getTeleportCost(); -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java b/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java deleted file mode 100644 index 91e41cac..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/PortalLocation.java +++ /dev/null @@ -1,90 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; - -import java.io.Serializable; - -public class PortalLocation implements Serializable { - private int x; - private int y; - private int z; - private int dimension; - - public PortalLocation(int x, int y, int z, int dimension) { - this.x = x; - this.y = y; - this.z = z; - this.dimension = dimension; - } - - public PortalLocation(BlockPos blockPos, int dimension) { - this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), dimension); - } - - public CompoundNBT writeToNBT(CompoundNBT tag) { - CompoundNBT locationTag = new CompoundNBT(); - - locationTag.putInt(Constants.NBT.X_COORD, x); - locationTag.putInt(Constants.NBT.Y_COORD, y); - locationTag.putInt(Constants.NBT.Z_COORD, z); - locationTag.putInt(Constants.NBT.DIMENSION_ID, dimension); - tag.put(Constants.NBT.PORTAL_LOCATION, locationTag); - - return tag; - } - - public BlockPos getBlockPos() { - return new BlockPos(x, y, z); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - PortalLocation that = (PortalLocation) o; - - if (x != that.x) - return false; - if (y != that.y) - return false; - return z == that.z; - - } - - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - result = 31 * result + z; - return result; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - public int getDimension() { - return dimension; - } - - public static PortalLocation readFromNBT(CompoundNBT tag) { - if (tag.hasKey(Constants.NBT.PORTAL_LOCATION)) { - CompoundNBT locationTag = tag.getCompound(Constants.NBT.PORTAL_LOCATION); - return new PortalLocation(locationTag.getInt(Constants.NBT.X_COORD), locationTag.getInt(Constants.NBT.Y_COORD), locationTag.getInt(Constants.NBT.Z_COORD), locationTag.getInt(Constants.NBT.DIMENSION_ID)); - } - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java deleted file mode 100644 index 742b4000..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/Teleport.java +++ /dev/null @@ -1,70 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -import net.minecraft.entity.Entity; -import net.minecraft.util.math.BlockPos; - -import java.util.UUID; - -public abstract class Teleport implements ITeleport { - protected int x; - protected int y; - protected int z; - protected Entity entity; - protected UUID networkOwner; - - public Teleport(int x, int y, int z, Entity entity, UUID networkOwner) { - this.x = x; - this.y = y; - this.z = z; - this.entity = entity; - this.networkOwner = networkOwner; - } - - public Teleport(BlockPos blockPos, Entity entity, UUID networkOwner) { - this(blockPos.getX(), blockPos.getY(), blockPos.getZ(), entity, networkOwner); - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - public Entity getEntity() { - return entity; - } - - public UUID getNetworkOwner() { - return networkOwner; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Teleport)) return false; - - Teleport teleport = (Teleport) o; - - if (x != teleport.x) return false; - if (y != teleport.y) return false; - if (z != teleport.z) return false; - if (entity != null ? !entity.equals(teleport.entity) : teleport.entity != null) return false; - return networkOwner != null ? networkOwner.equals(teleport.networkOwner) : teleport.networkOwner == null; - } - - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - result = 31 * result + z; - result = 31 * result + (entity != null ? entity.hashCode() : 0); - result = 31 * result + (networkOwner != null ? networkOwner.hashCode() : 0); - return result; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java deleted file mode 100644 index 1f7463f5..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/TeleportQueue.java +++ /dev/null @@ -1,37 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; - -import java.util.ArrayList; -import java.util.List; - -public class TeleportQueue { - private static TeleportQueue INSTANCE = new TeleportQueue(); - private static List queue; - - private TeleportQueue() { - queue = new ArrayList<>(); - } - - public void addITeleport(ITeleport iTeleport) { - queue.add(iTeleport); - } - - @SubscribeEvent - public void serverTick(TickEvent.ServerTickEvent event) { - if (event.phase != TickEvent.Phase.END) { - return; - } - - for (ITeleport iTeleport : queue) { - iTeleport.teleport(); - } - - queue.clear(); - } - - public static TeleportQueue getInstance() { - return INSTANCE; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java b/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java deleted file mode 100644 index 8ff084ce..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/TeleporterBloodMagic.java +++ /dev/null @@ -1,32 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.Teleporter; -import net.minecraft.world.ServerWorld; - -public class TeleporterBloodMagic extends Teleporter { - public TeleporterBloodMagic(ServerWorld worldServer) { - super(worldServer); - } - - @Override - public boolean makePortal(Entity entity) { - return true; - } - - @Override - public void removeStalePortalLocations(long worldTime) { - - } - - @Override - public boolean placeInExistingPortal(Entity entityIn, float rotationYaw) { - return true; - } - - @Override - public void placeInPortal(Entity entity, float rotationYaw) { - entity.setLocationAndAngles(MathHelper.floor(entity.posX), MathHelper.floor(entity.posY) + 2, MathHelper.floor(entity.posZ), entity.rotationYaw, entity.rotationPitch); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java b/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java deleted file mode 100644 index e5ff2b56..00000000 --- a/src/main/java/WayofTime/bloodmagic/teleport/Teleports.java +++ /dev/null @@ -1,248 +0,0 @@ -package WayofTime.bloodmagic.teleport; - -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityList; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.network.play.server.*; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.SoundEvents; -import net.minecraft.network.play.server.SPlayEntityEffectPacket; -import net.minecraft.network.play.server.SUpdateHealthPacket; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.management.PlayerList; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; -import net.minecraft.world.ServerWorld; -import net.minecraftforge.common.ForgeChunkManager; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.FMLCommonHandler; - -import java.util.UUID; - -public class Teleports { - - public static class TeleportSameDim extends Teleport { - private final boolean teleposer; - - public TeleportSameDim(int x, int y, int z, Entity entity, UUID networkOwner, boolean teleposer) { - this(new BlockPos(x, y, z), entity, networkOwner, teleposer); - } - - public TeleportSameDim(BlockPos blockPos, Entity entity, UUID networkOwner, boolean teleposer) { - super(blockPos, entity, networkOwner); - this.teleposer = teleposer; - } - - @Override - public void teleport() { - if (entity != null) { - BlockPos targetTeleposer = new BlockPos(x, y, z); - if (entity.timeUntilPortal <= 0) { - entity.timeUntilPortal = 10; - if (entity instanceof PlayerEntity) { - - SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); - if (network.getCurrentEssence() < getTeleportCost()) - return; - - if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) - return; - - ServerPlayerEntity player = (ServerPlayerEntity) entity; - - network.syphon(ticket(entity.world, player, getTeleportCost())); - - player.setPositionAndUpdate(x + 0.5, y + 0.5, z + 0.5); - player.getEntityWorld().updateEntityWithOptionalForce(player, false); - player.connection.sendPacket(new SUpdateHealthPacket(player.getHealth(), player.getFoodStats().getFoodLevel(), player.getFoodStats().getSaturationLevel())); - - player.getEntityWorld().playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer)); - } else { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); - if (network.getCurrentEssence() < (getTeleportCost() / 10)) - return; - - if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer))) - return; - - ServerWorld world = (ServerWorld) entity.getEntityWorld(); - - network.syphon(ticket(world, entity, getTeleportCost() / 10)); - - entity.setPosition(x + 0.5, y + 0.5, z + 0.5); - world.resetUpdateEntityTick(); - - entity.getEntityWorld().playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), entity.getEntityWorld(), targetTeleposer)); - } - } else { - entity.timeUntilPortal = 10; - } - } - } - - @Override - public int getTeleportCost() { - return 1000; - } - } - - public static class TeleportToDim extends Teleport { - private World oldWorld; - private int newWorldID; - private boolean teleposer; - - public TeleportToDim(int x, int y, int z, Entity entity, UUID networkOwner, World oldWorld, int newWorld, boolean teleposer) { - this(new BlockPos(x, y, z), entity, networkOwner, oldWorld, newWorld, teleposer); - } - - public TeleportToDim(BlockPos blockPos, Entity entity, UUID networkOwner, World oldWorld, int newWorldID, boolean teleposer) { - super(blockPos, entity, networkOwner); - this.oldWorld = oldWorld; - this.newWorldID = newWorldID; - this.teleposer = teleposer; - } - - @Override - public void teleport() { - if (entity != null) { - if (entity.timeUntilPortal <= 0) { - entity.timeUntilPortal = 10; - MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); - ServerWorld oldWorldServer = server.getWorld(entity.dimension); - ServerWorld newWorldServer = server.getWorld(newWorldID); - BlockPos targetTeleposer = new BlockPos(x, y, z); - ChunkPos teleposerChunk = new ChunkPos(targetTeleposer); - ForgeChunkManager.Ticket chunkTicket = ForgeChunkManager.requestTicket("bloodmagic", newWorldServer, ForgeChunkManager.Type.NORMAL); - ForgeChunkManager.forceChunk(chunkTicket, teleposerChunk); - - if (entity instanceof PlayerEntity) { - ServerPlayerEntity player = (ServerPlayerEntity) entity; - - - if (!player.getEntityWorld().isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); - if (network.getCurrentEssence() < getTeleportCost()) { - ForgeChunkManager.releaseTicket(chunkTicket); - return; - } - - if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer))) { - ForgeChunkManager.releaseTicket(chunkTicket); - return; - } - - network.syphon(ticket(oldWorld, player, getTeleportCost())); - - /* begin brandon3055 "BrandonsCore" interdimensional teleportation code */ - - PlayerList playerList = server.getPlayerList(); - - player.dimension = newWorldID; - player.connection.sendPacket(new SRespawnPacket(player.dimension, newWorldServer.getDifficulty(), newWorldServer.getWorldInfo().getTerrainType(), player.interactionManager.getGameType())); - playerList.updatePermissionLevel(player); - oldWorldServer.removeEntityDangerously(player); - player.isDead = false; - - //region Transfer to world - - player.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, player.rotationYaw, player.rotationPitch); - player.connection.setPlayerLocation(x + 0.5, y + 0.5, z + 0.5, player.rotationYaw, player.rotationPitch); - newWorldServer.spawnEntity(player); - newWorldServer.updateEntityWithOptionalForce(player, false); - player.setWorld(newWorldServer); - - //endregion - - playerList.preparePlayer(player, oldWorldServer); - player.connection.setPlayerLocation(x + 0.5, y + 0.5, z + 0.5, player.rotationYaw, player.rotationPitch); - player.interactionManager.setWorld(newWorldServer); - player.connection.sendPacket(new SPlayerAbilitiesPacket(player.capabilities)); - - playerList.updateTimeAndWeatherForPlayer(player, newWorldServer); - playerList.syncPlayerInventory(player); - - for (EffectInstance potioneffect : player.getActivePotionEffects()) { - player.connection.sendPacket(new SPlayEntityEffectPacket(player.getEntityId(), potioneffect)); - } - FMLCommonHandler.instance().firePlayerChangedDimensionEvent(player, entity.dimension, newWorldID); - player.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, player.rotationYaw, player.rotationPitch); - - /* end brandon3055 teleportation code */ - - if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer)); - } - - } else if (!entity.getEntityWorld().isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(networkOwner); - if (network.getCurrentEssence() < (getTeleportCost() / 10)) - return; - - if (teleposer && MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer))) - return; - - network.syphon(ticket(oldWorld, entity, getTeleportCost() / 10)); - - CompoundNBT tag = new CompoundNBT(); - - entity.writeToNBTOptional(tag); - entity.setDead(); - oldWorld.playSound(entity.posX, entity.posY, entity.posZ, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - - Entity teleportedEntity = EntityList.createEntityFromNBT(tag, newWorldServer); - if (teleportedEntity != null) { - teleportedEntity.setLocationAndAngles(x + 0.5, y + 0.5, z + 0.5, entity.rotationYaw, entity.rotationPitch); - teleportedEntity.forceSpawn = true; - newWorldServer.spawnEntity(teleportedEntity); - teleportedEntity.setWorld(newWorldServer); - } - - oldWorldServer.resetUpdateEntityTick(); - newWorldServer.resetUpdateEntityTick(); - if (teleposer) - MinecraftForge.EVENT_BUS.post(new TeleposeEvent.Ent.Post(entity, entity.getEntityWorld(), entity.getPosition(), newWorldServer, targetTeleposer)); - } - newWorldServer.playSound(x, y, z, SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - - ForgeChunkManager.releaseTicket(chunkTicket); - } else { - entity.timeUntilPortal = 10; - } - } - } - - @Override - public int getTeleportCost() { - return 10000; - } - - public World getOldWorld() { - return oldWorld; - } - - public int getNewWorldID() { - return newWorldID; - } - - public boolean isTeleposer() { - return teleposer; - } - } - - public static SoulTicket ticket(World world, Entity entity, int amount) { - return new SoulTicket(new StringTextComponent("teleport|" + world.provider.getDimension() + "|" + entity.getName() + "|" + entity.getPosition().toLong()), amount); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java index b4d528b1..2d97c292 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyArray.java @@ -1,175 +1,152 @@ -package WayofTime.bloodmagic.tile; +package wayoftime.bloodmagic.tile; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffect; -import WayofTime.bloodmagic.alchemyArray.AlchemyArrayEffectCraftingNew; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; -import WayofTime.bloodmagic.core.registry.AlchemyArrayRecipeRegistry; -import WayofTime.bloodmagic.iface.IAlchemyArray; -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.common.alchemyarray.AlchemyArrayEffect; +import wayoftime.bloodmagic.core.registry.AlchemyArrayRegistry; +import wayoftime.bloodmagic.util.Constants; -public class TileAlchemyArray extends TileInventory implements ITickable, IAlchemyArray { - public boolean isActive = false; - public int activeCounter = 0; - public Direction rotation = Direction.HORIZONTALS[0]; - public int rotateCooldown = 0; +public class TileAlchemyArray extends TileInventory implements ITickableTileEntity +{ + @ObjectHolder("bloodmagic:alchemyarray") + public static TileEntityType TYPE; - private String key = "empty"; - public AlchemyArrayEffect arrayEffect; - private boolean doDropIngredients = true; + public boolean isActive = false; + public int activeCounter = 0; + public Direction rotation = Direction.byHorizontalIndex(0); + public int rotateCooldown = 0; - public TileAlchemyArray() { - super(2, "alchemyArray"); - } + private String key = ""; + public AlchemyArrayEffect arrayEffect; + private boolean doDropIngredients = true; - public void onEntityCollidedWithBlock(BlockState state, Entity entity) { - if (arrayEffect != null) { - arrayEffect.onEntityCollidedWithBlock(this, getWorld(), pos, state, entity); - } - } + public TileAlchemyArray(TileEntityType type) + { + super(type, 2, "alchemyarray"); +// this.bloodAltar = new BloodAltar(this); + } - @Override - public void deserialize(CompoundNBT tagCompound) { - super.deserialize(tagCompound); - this.isActive = tagCompound.getBoolean("isActive"); - this.activeCounter = tagCompound.getInt("activeCounter"); - this.key = tagCompound.getString("key"); - if (!tagCompound.hasKey("doDropIngredients")) //Check if the array is old - { - this.doDropIngredients = true; - } else { - this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); - } - this.rotation = Direction.HORIZONTALS[tagCompound.getInt(Constants.NBT.DIRECTION)]; + public TileAlchemyArray() + { + this(TYPE); + } - CompoundNBT arrayTag = tagCompound.getCompoundTag("arrayTag"); - arrayEffect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(key); - if (arrayEffect != null) { - arrayEffect.readFromNBT(arrayTag); - } - } + @Override + public void deserialize(CompoundNBT tagCompound) + { + super.deserialize(tagCompound); + this.isActive = tagCompound.getBoolean("isActive"); + this.activeCounter = tagCompound.getInt("activeCounter"); + this.key = tagCompound.getString("stringKey"); + if (!tagCompound.contains("doDropIngredients")) // Check if the array is old + { + this.doDropIngredients = true; + } else + { + this.doDropIngredients = tagCompound.getBoolean("doDropIngredients"); + } + this.rotation = Direction.byHorizontalIndex(tagCompound.getInt(Constants.NBT.DIRECTION)); - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - super.serialize(tagCompound); - tagCompound.putBoolean("isActive", isActive); - tagCompound.putInt("activeCounter", activeCounter); - tagCompound.putString("key", "".equals(key) ? "empty" : key); - tagCompound.putBoolean("doDropIngredients", doDropIngredients); - tagCompound.putInt(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); + CompoundNBT arrayTag = tagCompound.getCompound("arrayTag"); +// arrayEffect = AlchemyArrayRegistry.getEffect(world, this.getStackInSlot(0), this.getStackInSlot(1)); + if (arrayEffect != null) + { + arrayEffect.readFromNBT(arrayTag); + } + } - CompoundNBT arrayTag = new CompoundNBT(); - if (arrayEffect != null) { - arrayEffect.writeToNBT(arrayTag); - } - tagCompound.putTag("arrayTag", arrayTag); + @Override + public CompoundNBT serialize(CompoundNBT tagCompound) + { + super.serialize(tagCompound); + tagCompound.putBoolean("isActive", isActive); + tagCompound.putInt("activeCounter", activeCounter); + tagCompound.putString("stringKey", "".equals(key) ? "empty" : key.toString()); + tagCompound.putBoolean("doDropIngredients", doDropIngredients); + tagCompound.putInt(Constants.NBT.DIRECTION, rotation.getHorizontalIndex()); - return tagCompound; - } + CompoundNBT arrayTag = new CompoundNBT(); + if (arrayEffect != null) + { + arrayEffect.writeToNBT(arrayTag); + } + tagCompound.put("arrayTag", arrayTag); - @Override - public int getInventoryStackLimit() { - return 1; - } + return tagCompound; + } - //Use this to prevent the Array from dropping items - useful for arrays that need to "consume" ingredients well before the effect. - public void setItemDrop(boolean dropItems) { - this.doDropIngredients = dropItems; - } + @Override + public void tick() + { +// System.out.println("Active counter: " + this.activeCounter); + if (isActive && attemptCraft()) + { + activeCounter++; + } else + { + isActive = false; + doDropIngredients = true; + activeCounter = 0; + arrayEffect = null; + key = "empty"; + } + if (rotateCooldown > 0) + rotateCooldown--; + } - @Override - public void update() { - if (isActive && attemptCraft()) { - activeCounter++; - } else { - isActive = false; - doDropIngredients = true; - activeCounter = 0; - arrayEffect = null; - key = "empty"; - } - if (rotateCooldown > 0) - rotateCooldown--; - } + public boolean attemptCraft() + { + if (arrayEffect != null) + { + isActive = true; - /** - * This occurs when the block is destroyed. - */ - @Override - public void dropItems() { - if (arrayEffect == null || doDropIngredients) { - super.dropItems(); - } - } + } else + { + AlchemyArrayEffect effect = AlchemyArrayRegistry.getEffect(world, this.getStackInSlot(0), this.getStackInSlot(1)); + if (effect == null) + { +// key = effect.i + return false; + } else + { + arrayEffect = effect; + } + } - public boolean attemptCraft() { - AlchemyArrayEffect effect = AlchemyArrayRecipeRegistry.getAlchemyArrayEffect(this.getStackInSlot(0), this.getStackInSlot(1)); - if (effect != null) { - if (arrayEffect == null) { - arrayEffect = effect; - key = effect.getKey(); - } else { - String effectKey = effect.getKey(); - if (effectKey.equals(key)) { - //Good! Moving on. - } else { - //Something has changed, therefore we have to move our stuffs. - //TODO: Add an AlchemyArrayEffect.onBreak(); ? - arrayEffect = effect; - key = effect.getKey(); - } - } - } else { - RecipeAlchemyArray recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(getStackInSlot(0), getStackInSlot(1)); - if (recipe == null) - return false; + if (arrayEffect != null) + { + isActive = true; + if (arrayEffect.update(this, this.activeCounter)) + { + this.decrStackSize(0, 1); + this.decrStackSize(1, 1); + this.getWorld().setBlockState(getPos(), Blocks.AIR.getDefaultState()); + } - AlchemyArrayEffect newEffect = new AlchemyArrayEffectCraftingNew(recipe); - if (arrayEffect == null) { - arrayEffect = newEffect; - key = newEffect.key; - } else if (!newEffect.key.equals(key)) { - arrayEffect = newEffect; - key = newEffect.key; - } - } + return true; + } + return false; + } - if (arrayEffect != null) { - isActive = true; +// @Override + public Direction getRotation() + { + return rotation; + } - if (arrayEffect.update(this, this.activeCounter)) { - this.decrStackSize(0, 1); - this.decrStackSize(1, 1); - this.getWorld().setBlockToAir(getPos()); - } + public void setRotation(Direction rotation) + { + this.rotation = rotation; + } - return true; - } - - return false; - } - - @Override - public Direction getRotation() { - return rotation; - } - - public void setRotation(Direction rotation) { - this.rotation = rotation; - } - - @Override - @SideOnly(Side.CLIENT) - public AxisAlignedBB getRenderBoundingBox() { - return Block.FULL_BLOCK_AABB.offset(getPos()); - } + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + return slot == 0 || slot == 1; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java deleted file mode 100644 index fb5a286c..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAlchemyTable.java +++ /dev/null @@ -1,432 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeAlchemyTable; -import WayofTime.bloodmagic.core.data.*; -import WayofTime.bloodmagic.core.registry.AlchemyTableRecipeRegistry; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.iface.ICustomAlchemyConsumable; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.recipe.alchemyTable.AlchemyTableRecipe; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.block.BlockState; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.BlockPos; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; -import org.apache.commons.lang3.ArrayUtils; - -import java.util.ArrayList; -import java.util.List; - -public class TileAlchemyTable extends TileInventory implements ISidedInventory, ITickable { - public static final int orbSlot = 6; - public static final int toolSlot = 7; - public static final int outputSlot = 8; - - public Direction direction = Direction.NORTH; - public boolean isSlave = false; - public int burnTime = 0; - public int ticksRequired = 1; - - public BlockPos connectedPos = BlockPos.ORIGIN; - public boolean[] blockedSlots = new boolean[]{false, false, false, false, false, false}; - - public TileAlchemyTable() { - super(9, "alchemyTable"); - } - - public void setInitialTableParameters(Direction direction, boolean isSlave, BlockPos connectedPos) { - this.isSlave = isSlave; - this.connectedPos = connectedPos; - - if (!isSlave) { - this.direction = direction; - } - } - - public boolean isInvisible() { - return isSlave(); - } - - public boolean isInputSlotAccessible(int slot) { - return !(slot < 6 && slot >= 0) || !blockedSlots[slot]; - } - - public void toggleInputSlotAccessible(int slot) { - if (slot < 6 && slot >= 0) - blockedSlots[slot] = !blockedSlots[slot]; - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - - isSlave = tag.getBoolean("isSlave"); - direction = Direction.byIndex(tag.getInt(Constants.NBT.DIRECTION)); - connectedPos = new BlockPos(tag.getInt(Constants.NBT.X_COORD), tag.getInt(Constants.NBT.Y_COORD), tag.getInt(Constants.NBT.Z_COORD)); - - burnTime = tag.getInt("burnTime"); - ticksRequired = tag.getInt("ticksRequired"); - - byte[] array = tag.getByteArray("blockedSlots"); - for (int i = 0; i < array.length; i++) - blockedSlots[i] = array[i] != 0; - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - - tag.putBoolean("isSlave", isSlave); - tag.putInt(Constants.NBT.DIRECTION, direction.getIndex()); - tag.putInt(Constants.NBT.X_COORD, connectedPos.getX()); - tag.putInt(Constants.NBT.Y_COORD, connectedPos.getY()); - tag.putInt(Constants.NBT.Z_COORD, connectedPos.getZ()); - - tag.putInt("burnTime", burnTime); - tag.putInt("ticksRequired", ticksRequired); - - byte[] blockedSlotArray = new byte[blockedSlots.length]; - for (int i = 0; i < blockedSlots.length; i++) - blockedSlotArray[i] = (byte) (blockedSlots[i] ? 1 : 0); - - tag.putByteArray("blockedSlots", blockedSlotArray); - return tag; - } - - @SuppressWarnings("unchecked") - @Override - public T getCapability(Capability capability, Direction facing) { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - if (this.isSlave()) { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { - return (T) tile.getCapability(capability, facing); - } - } else { - return super.getCapability(capability, facing); - } - } - - return super.getCapability(capability, facing); - } - - @Override - public int[] getSlotsForFace(Direction side) { - switch (side) { - case DOWN: - return new int[]{outputSlot}; - case UP: - return new int[]{orbSlot, toolSlot}; - default: - return new int[]{0, 1, 2, 3, 4, 5}; - } - } - - @Override - public boolean canInsertItem(int index, ItemStack stack, Direction direction) { - switch (direction) { - case DOWN: - return index != outputSlot && index != orbSlot && index != toolSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { - return true; - } else if (index == toolSlot) { - return false; //TODO: - } else { - return true; - } - default: - if (this.isSlave) { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { - return ((TileAlchemyTable) tile).canInsertItem(index, stack, direction); - } - } - return getAccessibleInputSlots(direction).contains(index); - } - } - - @Override - public boolean canExtractItem(int index, ItemStack stack, Direction direction) { - switch (direction) { - case DOWN: - return index == outputSlot; - case UP: - if (index == orbSlot && !stack.isEmpty() && stack.getItem() instanceof IBloodOrb) { - return true; - } else if (index == toolSlot) { - return true; //TODO: - } else { - return true; - } - default: - if (this.isSlave) { - TileEntity tile = getWorld().getTileEntity(connectedPos); - if (tile instanceof TileAlchemyTable && !((TileAlchemyTable) tile).isSlave) { - return ((TileAlchemyTable) tile).canExtractItem(index, stack, direction); - } - } - return getAccessibleInputSlots(direction).contains(index); - } - } - - public List getAccessibleInputSlots(Direction direction) { - List list = new ArrayList<>(); - - for (int i = 0; i < 6; i++) { - if (isInputSlotAccessible(i)) { - list.add(i); - } - } - - return list; - } - - @Override - public void update() { - if (isSlave()) { - return; - } - - List inputList = new ArrayList<>(); - - for (int i = 0; i < 6; i++) { - if (!getStackInSlot(i).isEmpty()) { - inputList.add(getStackInSlot(i)); - } - } - - int tier = getTierOfOrb(); - - // special recipes like dying - AlchemyTableRecipe recipe = AlchemyTableRecipeRegistry.getMatchingRecipe(inputList, getWorld(), getPos()); - if (recipe != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipe.getTierRequired() && this.getContainedLp() >= recipe.getLpDrained()))) { - if (burnTime == 1) - notifyUpdate(); - - if (canCraft(recipe.getRecipeOutput(inputList))) { - ticksRequired = recipe.getTicksRequired(); - burnTime++; - - if (burnTime == ticksRequired) { - if (!getWorld().isRemote) { - int requiredLp = recipe.getLpDrained(); - if (requiredLp > 0) { - if (!getWorld().isRemote) { - consumeLp(requiredLp); - } - } - - if (!getWorld().isRemote) { - craftItem(inputList, recipe); - } - } - - burnTime = 0; - - BlockState state = getWorld().getBlockState(pos); - getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } else if (burnTime > ticksRequired + 10) { - burnTime = 0; - } - } else { - burnTime = 0; - } - } else { // Simple recipes - RecipeAlchemyTable recipeAlchemyTable = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyTable(inputList); - if (recipeAlchemyTable != null && (burnTime > 0 || (!getWorld().isRemote && tier >= recipeAlchemyTable.getMinimumTier() && getContainedLp() >= recipeAlchemyTable.getSyphon()))) { - if (burnTime == 1) - notifyUpdate(); - - if (canCraft(recipeAlchemyTable.getOutput())) { - ticksRequired = recipeAlchemyTable.getTicks(); - burnTime++; - if (burnTime >= ticksRequired) { - if (!getWorld().isRemote) { - if (recipeAlchemyTable.getSyphon() > 0) { - if (consumeLp(recipeAlchemyTable.getSyphon()) < recipeAlchemyTable.getSyphon()) { - //There was not enough LP to craft or there was no orb - burnTime = 0; - notifyUpdate(); - return; - } - } - - ItemStack[] inputs = new ItemStack[0]; - for (ItemStack stack : inputList) - ArrayUtils.add(inputs, stack.copy()); - - BloodMagicCraftedEvent.AlchemyTable event = new BloodMagicCraftedEvent.AlchemyTable(recipeAlchemyTable.getOutput().copy(), inputs); - MinecraftForge.EVENT_BUS.post(event); - - ItemStack outputSlotStack = getStackInSlot(outputSlot); - if (outputSlotStack.isEmpty()) - setInventorySlotContents(outputSlot, event.getOutput()); - else - outputSlotStack.grow(event.getOutput().getCount()); - - for (int i = 0; i < 6; i++) { - ItemStack currentStack = getStackInSlot(i); - if (currentStack.getItem().hasContainerItem(currentStack)) - setInventorySlotContents(i, currentStack.getItem().getContainerItem(currentStack)); - else if (currentStack.getItem() instanceof ICustomAlchemyConsumable) - setInventorySlotContents(i, ((ICustomAlchemyConsumable) currentStack.getItem()).drainUseOnAlchemyCraft(currentStack)); - else - currentStack.shrink(1); - } - - burnTime = 0; - notifyUpdate(); - } - } - } - } else { - burnTime = 0; - } - } - } - - public double getProgressForGui() { - return ((double) burnTime) / ticksRequired; - } - - private boolean canCraft(ItemStack output) { - ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (output.isEmpty()) - return false; - if (currentOutputStack.isEmpty()) - return true; - if (!ItemHandlerHelper.canItemStacksStack(output, currentOutputStack)) - return false; - int result = currentOutputStack.getCount() + output.getCount(); - return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); - } - - public int getTierOfOrb() { - ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { - BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); - return orb == null ? 0 : orb.getTier(); - } - } - - return 0; - } - - public int getContainedLp() { - ItemStack orbStack = getStackInSlot(orbSlot); - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { - Binding binding = ((IBindable) orbStack.getItem()).getBinding(orbStack); - if (binding == null) { - return 0; - } - - SoulNetwork network = NetworkHelper.getSoulNetwork(binding); - - return network.getCurrentEssence(); - } - } - - return 0; - } - - public void craftItem(List inputList, AlchemyTableRecipe recipe) { - ItemStack outputStack = recipe.getRecipeOutput(inputList); - if (this.canCraft(outputStack)) { - ItemStack currentOutputStack = getStackInSlot(outputSlot); - - ItemStack[] inputs = new ItemStack[0]; - for (ItemStack stack : inputList) - ArrayUtils.add(inputs, stack.copy()); - - BloodMagicCraftedEvent.AlchemyTable event = new BloodMagicCraftedEvent.AlchemyTable(outputStack.copy(), inputs); - MinecraftForge.EVENT_BUS.post(event); - outputStack = event.getOutput(); - - if (currentOutputStack.isEmpty()) { - setInventorySlotContents(outputSlot, outputStack); - } else if (ItemHandlerHelper.canItemStacksStack(outputStack, currentOutputStack)) { - currentOutputStack.grow(outputStack.getCount()); - } - - consumeInventory(recipe); - } - } - - public int consumeLp(int requested) { - ItemStack orbStack = getStackInSlot(orbSlot); - - if (!orbStack.isEmpty()) { - if (orbStack.getItem() instanceof IBloodOrb) { - if (NetworkHelper.syphonFromContainer(orbStack, SoulTicket.item(orbStack, world, pos, requested))) { - return requested; - } - } - } - - return 0; - } - - public void consumeInventory(AlchemyTableRecipe recipe) { - ItemStack[] input = new ItemStack[6]; - - for (int i = 0; i < 6; i++) { - input[i] = getStackInSlot(i); - } - - ItemStack[] result = recipe.getRemainingItems(input); - for (int i = 0; i < 6; i++) { - setInventorySlotContents(i, result[i]); - } - } - - public Direction getDirection() { - return direction; - } - - public boolean isSlave() { - return isSlave; - } - - public int getBurnTime() { - return burnTime; - } - - public int getTicksRequired() { - return ticksRequired; - } - - public BlockPos getConnectedPos() { - return connectedPos; - } - - public boolean[] getBlockedSlots() { - return blockedSlots; - } - - public static int getOrbSlot() { - return orbSlot; - } - - public static int getToolSlot() { - return toolSlot; - } - - public static int getOutputSlot() { - return outputSlot; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java index eb8eb4be..02786ee6 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileAltar.java @@ -1,190 +1,227 @@ -package WayofTime.bloodmagic.tile; +package wayoftime.bloodmagic.tile; -import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.altar.AltarTier; -import WayofTime.bloodmagic.altar.IBloodAltar; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.altar.AltarTier; +import wayoftime.bloodmagic.altar.BloodAltar; +import wayoftime.bloodmagic.altar.IBloodAltar; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +public class TileAltar extends TileInventory implements IBloodAltar, ITickableTileEntity +{ + @ObjectHolder("bloodmagic:altar") + public static TileEntityType TYPE; + private BloodAltar bloodAltar; -public class TileAltar extends TileInventory implements IBloodAltar, ITickable { - private BloodAltar bloodAltar; + public TileAltar(TileEntityType type) + { + super(type, 1, "altar"); + this.bloodAltar = new BloodAltar(this); + } - public TileAltar() { - super(1, "altar"); - this.bloodAltar = new BloodAltar(this); - } + public TileAltar() + { + this(TYPE); + } - @Override - public void deserialize(CompoundNBT tagCompound) { - super.deserialize(tagCompound); + @Override + public void deserialize(CompoundNBT tagCompound) + { + super.deserialize(tagCompound); - CompoundNBT altarTag = tagCompound.getCompoundTag("bloodAltar"); + CompoundNBT altarTag = tagCompound.getCompound("bloodAltar"); - this.bloodAltar.readFromNBT(altarTag); - } + this.bloodAltar.readFromNBT(altarTag); + } - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - super.serialize(tagCompound); + @Override + public CompoundNBT serialize(CompoundNBT tagCompound) + { + super.serialize(tagCompound); - CompoundNBT altarTag = new CompoundNBT(); - this.bloodAltar.writeToNBT(altarTag); + CompoundNBT altarTag = new CompoundNBT(); + this.bloodAltar.writeToNBT(altarTag); - tagCompound.putTag("bloodAltar", altarTag); - return tagCompound; - } + tagCompound.put("bloodAltar", altarTag); + return tagCompound; + } - @Override - public void update() { - bloodAltar.update(); - } + @Override + public void tick() + { + bloodAltar.update(); + } - @Override - public void sacrificialDaggerCall(int amount, boolean isSacrifice) { - bloodAltar.sacrificialDaggerCall(amount, isSacrifice); - } + @Override + public void sacrificialDaggerCall(int amount, boolean isSacrifice) + { + bloodAltar.sacrificialDaggerCall(amount, isSacrifice); + } - @Override - public boolean isItemValidForSlot(int slot, ItemStack itemstack) { - return slot == 0; - } + @Override + public boolean isItemValidForSlot(int slot, ItemStack itemstack) + { + return slot == 0; + } - @Override - public int getCapacity() { - return bloodAltar.getCapacity(); - } + @Override + public int getCapacity() + { + return bloodAltar.getCapacity(); + } - @Override - public int getCurrentBlood() { - return bloodAltar.getCurrentBlood(); - } + @Override + public int getCurrentBlood() + { + return bloodAltar.getCurrentBlood(); + } - @Override - public AltarTier getTier() { - return bloodAltar.getTier(); - } + @Override + public AltarTier getTier() + { + return bloodAltar.getTier(); + } - @Override - public int getProgress() { - return bloodAltar.getProgress(); - } + @Override + public int getProgress() + { + return bloodAltar.getProgress(); + } - @Override - public float getSacrificeMultiplier() { - return bloodAltar.getSacrificeMultiplier(); - } + @Override + public float getSacrificeMultiplier() + { + return bloodAltar.getSacrificeMultiplier(); + } - @Override - public float getSelfSacrificeMultiplier() { - return bloodAltar.getSelfSacrificeMultiplier(); - } + @Override + public float getSelfSacrificeMultiplier() + { + return bloodAltar.getSelfSacrificeMultiplier(); + } - @Override - public float getOrbMultiplier() { - return bloodAltar.getOrbMultiplier(); - } + @Override + public float getOrbMultiplier() + { + return bloodAltar.getOrbMultiplier(); + } - @Override - public float getDislocationMultiplier() { - return bloodAltar.getDislocationMultiplier(); - } + @Override + public float getDislocationMultiplier() + { + return bloodAltar.getDislocationMultiplier(); + } - @Override - public float getConsumptionMultiplier() { - return bloodAltar.getConsumptionMultiplier(); - } + @Override + public float getConsumptionMultiplier() + { + return bloodAltar.getConsumptionMultiplier(); + } - @Override - public float getConsumptionRate() { - return bloodAltar.getConsumptionRate(); - } + @Override + public float getConsumptionRate() + { + return bloodAltar.getConsumptionRate(); + } - @Override - public int getLiquidRequired() { - return bloodAltar.getLiquidRequired(); - } + @Override + public int getLiquidRequired() + { + return bloodAltar.getLiquidRequired(); + } - @Override - public int getBufferCapacity() { - return bloodAltar.getBufferCapacity(); - } + @Override + public int getBufferCapacity() + { + return bloodAltar.getBufferCapacity(); + } - @Override - public void startCycle() { - bloodAltar.startCycle(); - } + @Override + public void startCycle() + { + bloodAltar.startCycle(); + } - @Override - public void checkTier() { - bloodAltar.checkTier(); - } + @Override + public void checkTier() + { + bloodAltar.checkTier(); + } - @Override - public void requestPauseAfterCrafting(int cooldown) { - bloodAltar.requestPauseAfterCrafting(cooldown); - } + @Override + public void requestPauseAfterCrafting(int cooldown) + { + bloodAltar.requestPauseAfterCrafting(cooldown); + } - @Override - public boolean isActive() { - return bloodAltar.isActive(); - } + @Override + public boolean isActive() + { + return bloodAltar.isActive(); + } - @Override - public int fillMainTank(int amount) { - return bloodAltar.fillMainTank(amount); - } + @Override + public int fillMainTank(int amount) + { + return bloodAltar.fillMainTank(amount); + } - @Override - public void setActive() { - bloodAltar.setActive(); - } + @Override + public void setActive() + { + bloodAltar.setActive(); + } - @Override - public int getChargingRate() { - return bloodAltar.getChargingRate(); - } + @Override + public int getChargingRate() + { + return bloodAltar.getChargingRate(); + } - @Override - public int getTotalCharge() { - return bloodAltar.getTotalCharge(); - } + @Override + public int getTotalCharge() + { + return bloodAltar.getTotalCharge(); + } - @Override - public int getChargingFrequency() { - return bloodAltar.getChargingFrequency(); - } + @Override + public int getChargingFrequency() + { + return bloodAltar.getChargingFrequency(); + } - public AltarTier getCurrentTierDisplayed() { - return bloodAltar.getCurrentTierDisplayed(); - } + public AltarTier getCurrentTierDisplayed() + { + return bloodAltar.getCurrentTierDisplayed(); + } - public boolean setCurrentTierDisplayed(AltarTier altarTier) { - return bloodAltar.setCurrentTierDisplayed(altarTier); - } + public boolean setCurrentTierDisplayed(AltarTier altarTier) + { + return bloodAltar.setCurrentTierDisplayed(altarTier); + } - @Override - public boolean hasCapability(@Nonnull Capability capability, @Nullable Direction facing) { - if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - return true; - } - - return super.hasCapability(capability, facing); - } - - @SuppressWarnings("unchecked") - @Override - public T getCapability(@Nonnull Capability capability, @Nullable Direction facing) { - if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - return (T) bloodAltar; - } - - return super.getCapability(capability, facing); - } -} \ No newline at end of file +// @Override +// public boolean hasCapability(@Nonnull Capability capability, @Nullable Direction facing) +// { +// if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) +// { +// return true; +// } +// +// return super.hasCapability(capability, facing); +// } +// +// @SuppressWarnings("unchecked") +// @Override +// public LazyOptional getCapability(@Nonnull Capability capability, @Nullable Direction facing) +// { +// if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) +// { +// return (T) bloodAltar; +// } +// +// return super.getCapability(capability, facing); +// } +} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java b/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java deleted file mode 100644 index a1ccbbeb..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileBloodTank.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.tile.base.TileBase; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; - -public class TileBloodTank extends TileBase { - public static final int[] CAPACITIES = {16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65336, 131072, 262144, 524288}; - public int capacity; - protected FluidTank tank; - - public TileBloodTank(int meta) { - capacity = CAPACITIES[meta] * Fluid.BUCKET_VOLUME; - tank = new FluidTank(capacity); - } - - public TileBloodTank() { - capacity = CAPACITIES[0] * Fluid.BUCKET_VOLUME; - tank = new FluidTank(capacity); - } - - @Override - public void deserialize(CompoundNBT tagCompound) { - super.deserialize(tagCompound); - tank.readFromNBT(tagCompound.getCompoundTag(Constants.NBT.TANK)); - capacity = tagCompound.getInt(Constants.NBT.ALTAR_CAPACITY); - tank.setCapacity(capacity); - } - - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - super.serialize(tagCompound); - if (tank.getFluidAmount() != 0) - tagCompound.putTag(Constants.NBT.TANK, tank.writeToNBT(new CompoundNBT())); - tagCompound.putInt(Constants.NBT.ALTAR_CAPACITY, capacity); - return tagCompound; - } - - public int getCapacity() { - return capacity; - } - - public FluidTank getTank() { - return tank; - } - - public Fluid getClientRenderFluid() { - if (tank != null && tank.getFluid() != null) - return tank.getFluid().getFluid(); - return null; - } - - public float getRenderHeight() { - if (tank != null && tank.getFluidAmount() > 0) - return (float) tank.getFluidAmount() / (float) getCapacity(); - return 0F; - } - - public int getComparatorOutput() { - return tank.getFluidAmount() > 0 ? (int) (1 + ((double) tank.getFluidAmount() / (double) tank.getCapacity()) * 14) : 0; - } - - @Override - public boolean hasCapability(Capability capability, Direction facing) { - return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || super.hasCapability(capability, facing); - } - - @SuppressWarnings("unchecked") - @Override - public T getCapability(Capability capability, Direction facing) { - if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) - return (T) tank; - return super.getCapability(capability, facing); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java deleted file mode 100644 index 92c8721b..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ /dev/null @@ -1,214 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWillConduit; -import WayofTime.bloodmagic.soul.IDemonWillGem; -import WayofTime.bloodmagic.soul.IDiscreteDemonWill; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; - -import java.util.HashMap; -import java.util.Map.Entry; - -public class TileDemonCrucible extends TileInventory implements ITickable, IDemonWillConduit, ISidedInventory { - public final int maxWill = 100; - public final double gemDrainRate = 10; - public HashMap willMap = new HashMap<>(); //TODO: Change to DemonWillHolder - public int internalCounter = 0; - - public TileDemonCrucible() { - super(1, "demonCrucible"); - } - - @Override - public void update() { - if (getWorld().isRemote) { - return; - } - - internalCounter++; - - if (getWorld().isBlockPowered(getPos())) { - //TODO: Fill the contained gem if it is there. - ItemStack stack = this.getStackInSlot(0); - if (stack.getItem() instanceof IDemonWillGem) { - IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (willMap.containsKey(type)) { - double current = willMap.get(type); - double fillAmount = Math.min(gemDrainRate, current); - if (fillAmount > 0) { - fillAmount = gemItem.fillWill(type, stack, fillAmount, true); - if (willMap.get(type) - fillAmount <= 0) { - willMap.remove(type); - } else { - willMap.put(type, willMap.get(type) - fillAmount); - } - } - } - } - } - } else { - ItemStack stack = this.getStackInSlot(0); - if (!stack.isEmpty()) { - if (stack.getItem() instanceof IDemonWillGem) { - IDemonWillGem gemItem = (IDemonWillGem) stack.getItem(); - for (EnumDemonWillType type : EnumDemonWillType.values()) { - double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - double drainAmount = Math.min(maxWill - currentAmount, gemDrainRate); - double filled = WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, drainAmount, maxWill, false); - filled = gemItem.drainWill(type, stack, filled, false); - if (filled > 0) { - filled = gemItem.drainWill(type, stack, filled, true); - WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, filled, maxWill, true); - } - } - } else if (stack.getItem() instanceof IDiscreteDemonWill) //TODO: Limit the speed of this process - { - IDiscreteDemonWill willItem = (IDiscreteDemonWill) stack.getItem(); - EnumDemonWillType type = willItem.getType(stack); - double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - double needed = maxWill - currentAmount; - double discreteAmount = willItem.getDiscretization(stack); - if (needed >= discreteAmount) { - double filled = willItem.drainWill(stack, discreteAmount); - if (filled > 0) { - WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, filled, maxWill, true); - if (stack.getCount() <= 0) { - this.setInventorySlotContents(0, ItemStack.EMPTY); - } - } - } - } - } - } - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - - willMap.clear(); - - for (EnumDemonWillType type : EnumDemonWillType.values()) { - double amount = tag.getDouble("EnumWill" + type.getName()); - if (amount > 0) { - willMap.put(type, amount); - } - } - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - - for (Entry entry : willMap.entrySet()) { - tag.putDouble("EnumWill" + entry.getKey().getName(), entry.getValue()); - } - return tag; - } - - // IDemonWillConduit - - @Override - public int getWeight() { - return 10; - } - - @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { - if (amount <= 0) { - return 0; - } - - if (!canFill(type)) { - return 0; - } - - if (!doFill) { - if (!willMap.containsKey(type)) { - return Math.min(maxWill, amount); - } - - return Math.min(maxWill - willMap.get(type), amount); - } - - if (!willMap.containsKey(type)) { - double max = Math.min(maxWill, amount); - - willMap.put(type, max); - - return max; - } - - double current = willMap.get(type); - double filled = maxWill - current; - - if (amount < filled) { - willMap.put(type, current + amount); - filled = amount; - } else { - willMap.put(type, (double) maxWill); - } - - return filled; - } - - @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { - if (!willMap.containsKey(type)) { - return 0; - } - - double drained = amount; - double current = willMap.get(type); - if (current < drained) { - drained = current; - } - - if (doDrain) { - current -= drained; - if (current <= 0) { - willMap.remove(type); - } else { - willMap.put(type, current); - } - } - - return drained; - } - - @Override - public boolean canFill(EnumDemonWillType type) { - return true; - } - - @Override - public boolean canDrain(EnumDemonWillType type) { - return true; - } - - @Override - public double getCurrentWill(EnumDemonWillType type) { - return willMap.containsKey(type) ? willMap.get(type) : 0; - } - - @Override - public int[] getSlotsForFace(Direction side) { - return new int[]{0}; - } - - @Override - public boolean canInsertItem(int index, ItemStack stack, Direction direction) { - return !stack.isEmpty() && inventory.get(0).isEmpty() && (stack.getItem() instanceof IDemonWillGem || stack.getItem() instanceof IDiscreteDemonWill); - } - - @Override - public boolean canExtractItem(int index, ItemStack stack, Direction direction) { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java deleted file mode 100644 index 22037b11..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystal.java +++ /dev/null @@ -1,185 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.block.BlockDemonCrystal; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.tile.base.TileTicking; -import net.minecraft.block.BlockState; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.MathHelper; - -public class TileDemonCrystal extends TileTicking { - public static final double sameWillConversionRate = 50; - public static final double defaultWillConversionRate = 100; - public static final double timeDelayForWrongWill = 0.6; - public final int maxWill = 100; - public final double drainRate = 1; - public DemonWillHolder holder = new DemonWillHolder(); - public double progressToNextCrystal = 0; - public int internalCounter = 0; - public int crystalCount = 1; - public Direction placement = Direction.UP; //Side that this crystal is placed on. - - public TileDemonCrystal() { - this.crystalCount = 1; - } - - @Override - public void onUpdate() { - if (getWorld().isRemote) { - return; - } - - internalCounter++; - - if (internalCounter % 20 == 0 && crystalCount < 7) { - EnumDemonWillType type = getType(); - - double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (type != EnumDemonWillType.DEFAULT) { - if (value >= 0.5) { - double nextProgress = getCrystalGrowthPerSecond(value); - progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } else { - value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT); - if (value > 0.5) { - double nextProgress = getCrystalGrowthPerSecond(value) * timeDelayForWrongWill; - progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), EnumDemonWillType.DEFAULT, nextProgress * defaultWillConversionRate, true) / defaultWillConversionRate; - } - } - } else { - if (value > 0.5) { - - double nextProgress = getCrystalGrowthPerSecond(value); - progressToNextCrystal += WorldDemonWillHandler.drainWill(getWorld(), getPos(), type, nextProgress * sameWillConversionRate, true) / sameWillConversionRate; - } - } - - checkAndGrowCrystal(); - } - -// if (getWorld().getWorldTime() % 200 == 0) -// { -// crystalCount = Math.min(crystalCount + 1, 7); -// getWorld().markBlockForUpdate(pos); -// } - } - - /** - * Encourages the crystal to grow by a large percentage by telling it to - * drain will from the aura. - * - * @param willDrain The amount of drain that is needed for the crystal to grow - * successfully for the desired amount. Can be more than the base - * amount. - * @param progressPercentage - * @return percentage actually grown. - */ - public double growCrystalWithWillAmount(double willDrain, double progressPercentage) { - if (crystalCount >= 7) { - return 0; - } - - BlockState state = getWorld().getBlockState(pos); - int meta = this.getBlockType().getMetaFromState(state); - EnumDemonWillType type = EnumDemonWillType.values()[meta]; - - double value = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - double percentDrain = willDrain <= 0 ? 1 : Math.min(1, value / willDrain); - if (percentDrain <= 0) { - return 0; - } - - // Verification that you can actually drain the will from this chunk, for future proofing. - WorldDemonWillHandler.drainWill(getWorld(), pos, type, percentDrain * willDrain, true); - progressToNextCrystal += percentDrain * progressPercentage; - - checkAndGrowCrystal(); - - return percentDrain * progressPercentage; - } - - public EnumDemonWillType getType() { - return EnumDemonWillType.values()[this.getBlockMetadata()]; - } - - public void checkAndGrowCrystal() { - if (progressToNextCrystal >= 1 && internalCounter % 100 == 0) { - progressToNextCrystal--; - crystalCount++; - markDirty(); - notifyUpdate(); - } - } - - public double getMaxWillForCrystal() { - return 50; - } - - public boolean dropSingleCrystal() { - if (!getWorld().isRemote && crystalCount > 1) { - BlockState state = getWorld().getBlockState(pos); - EnumDemonWillType type = state.getValue(BlockDemonCrystal.TYPE); - ItemStack stack = BlockDemonCrystal.getItemStackDropped(type, 1); - if (!stack.isEmpty()) { - crystalCount--; - InventoryHelper.spawnItemStack(getWorld(), pos.getX(), pos.getY(), pos.getZ(), stack); - notifyUpdate(); - return true; - } - } - - return false; - } - - public double getCrystalGrowthPerSecond(double will) { - return 1.0 / 200 * Math.sqrt(will / 200); - } - - public int getCrystalCountForRender() { - return MathHelper.clamp(crystalCount - 1, 0, 6); - } - - @Override - public void deserialize(CompoundNBT tag) { - holder.readFromNBT(tag, "Will"); - crystalCount = tag.getInt("crystalCount"); - placement = Direction.byIndex(tag.getInt("placement")); - progressToNextCrystal = tag.getDouble("progress"); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - holder.writeToNBT(tag, "Will"); - tag.putInt("crystalCount", crystalCount); - tag.putInt("placement", placement.getIndex()); - tag.putDouble("progress", progressToNextCrystal); - return tag; - } - - public int getCrystalCount() { - return crystalCount; - } - - public void setCrystalCount(int crystalCount) { - this.crystalCount = crystalCount; - } - - public Direction getPlacement() { - return placement; - } - - public void setPlacement(Direction placement) { - this.placement = placement; - } - - @Override - protected void onDataPacketClientReceived() { - super.onDataPacketClientReceived(); - notifyUpdate(); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java deleted file mode 100644 index 00e80f0b..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrystallizer.java +++ /dev/null @@ -1,133 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWillConduit; -import WayofTime.bloodmagic.tile.base.TileTicking; - -public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit { - public static final int maxWill = 100; - public static final double drainRate = 1; - public static final double willToFormCrystal = 99; - public static final double totalFormationTime = 1000; - //The whole purpose of this block is to grow a crystal initially. The acceleration and crystal growing is up to the crystal itself afterwards. - public DemonWillHolder holder = new DemonWillHolder(); - public double internalCounter = 0; - - public TileDemonCrystallizer() { - - } - - @Override - public void onUpdate() { - if (getWorld().isRemote) { - return; - } - - BlockPos offsetPos = pos.offset(Direction.UP); - if (getWorld().isAirBlock(offsetPos)) //Room for a crystal to grow - { - EnumDemonWillType highestType = WorldDemonWillHandler.getHighestDemonWillType(getWorld(), pos); - double amount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, highestType); - if (amount >= willToFormCrystal) { - internalCounter += getCrystalFormationRate(amount); - if (internalCounter >= totalFormationTime) { - if (WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, false) >= willToFormCrystal) { - if (formCrystal(highestType, offsetPos)) { - WorldDemonWillHandler.drainWill(getWorld(), getPos(), highestType, willToFormCrystal, true); - internalCounter = 0; - } - } - } - } - } - } - - public boolean formCrystal(EnumDemonWillType type, BlockPos position) { - getWorld().setBlockState(position, RegistrarBloodMagicBlocks.DEMON_CRYSTAL.getStateFromMeta(type.ordinal())); - TileEntity tile = getWorld().getTileEntity(position); - if (tile instanceof TileDemonCrystal) { - ((TileDemonCrystal) tile).setPlacement(Direction.UP); - return true; - } - - return false; - } - - public double getCrystalFormationRate(double currentWill) { - return 1; - } - - @Override - public void deserialize(CompoundNBT tag) { - holder.readFromNBT(tag, "Will"); - internalCounter = tag.getDouble("internalCounter"); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - holder.writeToNBT(tag, "Will"); - tag.putDouble("internalCounter", internalCounter); - return tag; - } - - // IDemonWillConduit - - @Override - public int getWeight() { - return 10; - } - - @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { - if (amount <= 0) { - return 0; - } - - if (!canFill(type)) { - return 0; - } - - if (!doFill) { - return Math.min(maxWill - holder.getWill(type), amount); - } - - return holder.addWill(type, amount, maxWill); - } - - @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { - double drained = amount; - double current = holder.getWill(type); - if (current < drained) { - drained = current; - } - - if (doDrain) { - return holder.drainWill(type, amount); - } - - return drained; - } - - @Override - public boolean canFill(EnumDemonWillType type) { - return true; - } - - @Override - public boolean canDrain(EnumDemonWillType type) { - return true; - } - - @Override - public double getCurrentWill(EnumDemonWillType type) { - return holder.getWill(type); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java deleted file mode 100644 index dc4c7def..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonPylon.java +++ /dev/null @@ -1,106 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWillConduit; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.tile.base.TileTicking; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - -public class TileDemonPylon extends TileTicking implements IDemonWillConduit { - public final int maxWill = 100; - public final double drainRate = 1; - public DemonWillHolder holder = new DemonWillHolder(); - - public TileDemonPylon() { - - } - - @Override - public void onUpdate() { - if (getWorld().isRemote) { - return; - } - - for (EnumDemonWillType type : EnumDemonWillType.values()) { - double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - - for (Direction side : Direction.HORIZONTALS) { - BlockPos offsetPos = pos.offset(side, 16); - double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); - if (sideAmount > currentAmount) { - double drainAmount = Math.min((sideAmount - currentAmount) / 2, drainRate); - double drain = WorldDemonWillHandler.drainWill(getWorld(), offsetPos, type, drainAmount, true); - WorldDemonWillHandler.fillWill(getWorld(), pos, type, drain, true); - } - } - } - } - - @Override - public void deserialize(CompoundNBT tag) { - holder.readFromNBT(tag, "Will"); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - holder.writeToNBT(tag, "Will"); - return tag; - } - - // IDemonWillConduit - - @Override - public int getWeight() { - return 10; - } - - @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { - if (amount <= 0) { - return 0; - } - - if (!canFill(type)) { - return 0; - } - - if (!doFill) { - return Math.min(maxWill - holder.getWill(type), amount); - } - - return holder.addWill(type, amount, maxWill); - } - - @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { - double drained = amount; - double current = holder.getWill(type); - if (current < drained) { - drained = current; - } - - if (doDrain) { - return holder.drainWill(type, amount); - } - - return drained; - } - - @Override - public boolean canFill(EnumDemonWillType type) { - return true; - } - - @Override - public boolean canDrain(EnumDemonWillType type) { - return true; - } - - @Override - public double getCurrentWill(EnumDemonWillType type) { - return holder.getWill(type); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java b/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java deleted file mode 100644 index f450095d..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDimensionalPortal.java +++ /dev/null @@ -1,41 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.ritual.types.RitualPortal; -import WayofTime.bloodmagic.tile.base.TileBase; -import com.google.common.base.Strings; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; - -public class TileDimensionalPortal extends TileBase { - public String portalID = ""; - public int masterStoneX; - public int masterStoneY; - public int masterStoneZ; - - public void deserialize(CompoundNBT tagCompound) { - portalID = tagCompound.getString(RitualPortal.PORTAL_ID_TAG); - - masterStoneX = tagCompound.getInt("masterStoneX"); - masterStoneY = tagCompound.getInt("masterStoneY"); - masterStoneZ = tagCompound.getInt("masterStoneZ"); - } - - public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.putString(RitualPortal.PORTAL_ID_TAG, Strings.isNullOrEmpty(portalID) ? "" : portalID); - - tagCompound.putInt("masterStoneX", masterStoneX); - tagCompound.putInt("masterStoneY", masterStoneY); - tagCompound.putInt("masterStoneZ", masterStoneZ); - return tagCompound; - } - - public BlockPos getMasterStonePos() { - return new BlockPos(masterStoneX, masterStoneY, masterStoneZ); - } - - public void setMasterStonePos(BlockPos blockPos) { - this.masterStoneX = blockPos.getX(); - this.masterStoneY = blockPos.getY(); - this.masterStoneZ = blockPos.getZ(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java deleted file mode 100644 index 222dce55..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileImperfectRitualStone.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.ritual.imperfect.IImperfectRitualStone; -import WayofTime.bloodmagic.ritual.imperfect.ImperfectRitual; -import WayofTime.bloodmagic.tile.base.TileBase; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.entity.effect.LightningBoltEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import javax.annotation.Nullable; - -public class TileImperfectRitualStone extends TileBase implements IImperfectRitualStone { - - @Override - public boolean performRitual(World world, BlockPos pos, @Nullable ImperfectRitual imperfectRitual, PlayerEntity player) { - if (imperfectRitual != null && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(imperfectRitual), true)) { - if (!PlayerHelper.isFakePlayer(player) && !world.isRemote) { - NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.block(getWorld(), getPos(), imperfectRitual.getActivationCost())); - if (imperfectRitual.onActivate(this, player)) { - if (imperfectRitual.isLightShow()) - getWorld().addWeatherEffect(new LightningBoltEntity(getWorld(), getPos().getX(), getPos().getY() + 2, getPos().getZ(), true)); - return true; - } - } - - return true; - } - - return false; - } - - @Override - public World getRitualWorld() { - return getWorld(); - } - - @Override - public BlockPos getRitualPos() { - return getPos(); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java deleted file mode 100644 index 6a417023..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileIncenseAltar.java +++ /dev/null @@ -1,160 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.util.helper.PlayerSacrificeHelper; -import WayofTime.bloodmagic.incense.*; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class TileIncenseAltar extends TileInventory implements ITickable { - public static int maxCheckRange = 5; - public AreaDescriptor incenseArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); - public Map tranquilityMap = new HashMap<>(); - - public double incenseAddition = 0; //Self-sacrifice is multiplied by 1 plus this value. - public double tranquility = 0; - public int roadDistance = 0; //Number of road blocks laid down - - public TileIncenseAltar() { - super(1, "incenseAltar"); - } - - @Override - public void update() { - AxisAlignedBB aabb = incenseArea.getAABB(getPos()); - List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, aabb); - if (playerList.isEmpty()) { - return; - } - - if (getWorld().getTotalWorldTime() % 100 == 0) { - recheckConstruction(); - } - - boolean hasPerformed = false; - - for (PlayerEntity player : playerList) { - if (PlayerSacrificeHelper.incrementIncense(player, 0, incenseAddition, incenseAddition / 100)) { - hasPerformed = true; - } - } - - if (hasPerformed) { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof ServerWorld) { - ServerWorld server = (ServerWorld) getWorld(); - server.spawnParticle(EnumParticleTypes.FLAME, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, 1, 0.02, 0.03, 0.02, 0); - } - } - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - tranquility = tag.getDouble("tranquility"); - incenseAddition = tag.getDouble("incenseAddition"); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - tag.putDouble("tranquility", tranquility); - tag.putDouble("incenseAddition", incenseAddition); - return tag; - } - - public void recheckConstruction() { - //TODO: Check the physical construction of the incense altar to determine the maximum length. - int maxLength = 11; //Max length of the path. The path starts two blocks away from the center block. - int yOffset = 0; - - Map tranquilityMap = new HashMap<>(); - - for (int currentDistance = 2; currentDistance < currentDistance + maxLength; currentDistance++) { - boolean canFormRoad = false; - - for (int i = -maxCheckRange + yOffset; i <= maxCheckRange + yOffset; i++) { - BlockPos verticalPos = pos.add(0, i, 0); - - canFormRoad = true; - level: - for (Direction horizontalFacing : Direction.HORIZONTALS) { - BlockPos facingOffsetPos = verticalPos.offset(horizontalFacing, currentDistance); - for (int j = -1; j <= 1; j++) { - BlockPos offsetPos = facingOffsetPos.offset(horizontalFacing.rotateY(), j); - BlockState state = getWorld().getBlockState(offsetPos); - Block block = state.getBlock(); - if (!(block instanceof IIncensePath && ((IIncensePath) block).getLevelOfPath(getWorld(), offsetPos, state) >= currentDistance - 2)) { - canFormRoad = false; - break level; - } - } - } - - if (canFormRoad) { - yOffset = i; - break; - } - } - - if (canFormRoad) { - for (int i = -currentDistance; i <= currentDistance; i++) { - for (int j = -currentDistance; j <= currentDistance; j++) { - if (Math.abs(i) != currentDistance && Math.abs(j) != currentDistance) { - continue; //TODO: Can make this just set j to currentDistance to speed it up. - } - - for (int y = yOffset; y <= 2 + yOffset; y++) { - BlockPos offsetPos = pos.add(i, y, j); - BlockState state = getWorld().getBlockState(offsetPos); - Block block = state.getBlock(); - TranquilityStack stack = IncenseTranquilityRegistry.getTranquilityOfBlock(getWorld(), offsetPos, block, state); - if (stack != null) { - if (!tranquilityMap.containsKey(stack.type)) { - tranquilityMap.put(stack.type, stack.value); - } else { - tranquilityMap.put(stack.type, tranquilityMap.get(stack.type) + stack.value); - } - } - } - } - } - } else { - roadDistance = currentDistance - 2; - break; - } - } - - this.tranquilityMap = tranquilityMap; - - double totalTranquility = 0; - for (Entry entry : tranquilityMap.entrySet()) { - totalTranquility += entry.getValue(); - } - - if (totalTranquility < 0) { - return; - } - - double appliedTranquility = 0; - for (Entry entry : tranquilityMap.entrySet()) { - appliedTranquility += Math.sqrt(entry.getValue()); - } - - double bonus = IncenseAltarHandler.getIncenseBonusFromComponents(getWorld(), pos, appliedTranquility, roadDistance); - incenseAddition = bonus; - this.tranquility = appliedTranquility; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java index dc3ae9da..a737e704 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileInventory.java @@ -1,261 +1,317 @@ -package WayofTime.bloodmagic.tile; +package wayoftime.bloodmagic.tile; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; -import WayofTime.bloodmagic.tile.base.TileBase; -import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.inventory.InventoryHelper; +import net.minecraft.inventory.ItemStackHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.NonNullList; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.InvWrapper; import net.minecraftforge.items.wrapper.SidedInvWrapper; +import wayoftime.bloodmagic.tile.base.TileBase; -public class TileInventory extends TileBase implements IInventory { - protected int[] syncedSlots = new int[0]; - protected NonNullList inventory; - IItemHandler handlerDown; - IItemHandler handlerUp; - IItemHandler handlerNorth; - IItemHandler handlerSouth; - IItemHandler handlerWest; - IItemHandler handlerEast; - private int size; +public class TileInventory extends TileBase implements IInventory +{ + protected int[] syncedSlots = new int[0]; + protected NonNullList inventory; + LazyOptional handlerDown; + LazyOptional handlerUp; + LazyOptional handlerNorth; + LazyOptional handlerSouth; + LazyOptional handlerWest; + LazyOptional handlerEast; + private int size; - // IInventory - private String name; + // IInventory + private String name; - public TileInventory(int size, String name) { - this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); - this.size = size; - this.name = name; - initializeItemHandlers(); - } + public TileInventory(TileEntityType type, int size, String name) + { + super(type); + this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); + this.size = size; + this.name = name; + initializeItemHandlers(); + } - protected boolean isSyncedSlot(int slot) { - for (int s : this.syncedSlots) { - if (s == slot) { - return true; - } - } - return false; - } + protected boolean isSyncedSlot(int slot) + { + for (int s : this.syncedSlots) + { + if (s == slot) + { + return true; + } + } + return false; + } - @Override - public void deserialize(CompoundNBT tagCompound) { - super.deserialize(tagCompound); - ListNBT tags = tagCompound.getTagList("Items", 10); - inventory = NonNullList.withSize(size, ItemStack.EMPTY); + @Override + public void deserialize(CompoundNBT tagCompound) + { + super.deserialize(tagCompound); - for (int i = 0; i < tags.tagCount(); i++) { - if (!isSyncedSlot(i)) { - CompoundNBT data = tags.getCompound(i); - byte j = data.getByte("Slot"); + this.inventory = NonNullList.withSize(this.getSizeInventory(), ItemStack.EMPTY); - if (j >= 0 && j < inventory.size()) { - inventory.set(j, new ItemStack(data)); // No matter how much an i looks like a j, it is not one. They are drastically different characters and cause drastically different things to happen. Apparently I didn't know this at one point. - TehNut - } - } - } - } + ItemStackHelper.loadAllItems(tagCompound, this.inventory); - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - super.serialize(tagCompound); - ListNBT tags = new ListNBT(); +// ListNBT tags = tagCompound.getList("Items", 10); +// inventory = NonNullList.withSize(size, ItemStack.EMPTY); +// +// +// +// for (int i = 0; i < tags.size(); i++) +// { +// if (!isSyncedSlot(i)) +// { +// CompoundNBT data = tags.getCompoundTagAt(i); +// byte j = data.getByte("Slot"); +// +// if (j >= 0 && j < inventory.size()) +// { +// inventory.set(j, new ItemStack(data)); // No matter how much an i looks like a j, it is not one. +// // They are drastically different characters and cause +// // drastically different things to happen. Apparently I +// // didn't know this at one point. - TehNut +// } +// } +// } + } - for (int i = 0; i < inventory.size(); i++) { - if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) { - CompoundNBT data = new CompoundNBT(); - data.setByte("Slot", (byte) i); - inventory.get(i).writeToNBT(data); - tags.appendTag(data); - } - } + @Override + public CompoundNBT serialize(CompoundNBT tagCompound) + { + super.serialize(tagCompound); - tagCompound.putTag("Items", tags); - return tagCompound; - } + ItemStackHelper.saveAllItems(tagCompound, this.inventory); +// NBTTagList tags = new NBTTagList(); +// +// for (int i = 0; i < inventory.size(); i++) +// { +// if ((!inventory.get(i).isEmpty()) && !isSyncedSlot(i)) +// { +// CompoundNBT data = new CompoundNBT(); +// data.putByte("Slot", (byte) i); +// inventory.get(i).write(data); +// tags.appendTag(data); +// } +// } +// +// tagCompound.setTag("Items", tags); + return tagCompound; + } - public void dropItems() { - InventoryHelper.dropInventoryItems(getWorld(), getPos(), this); - } + public void dropItems() + { + InventoryHelper.dropInventoryItems(getWorld(), getPos(), this); + } - @Override - public int getSizeInventory() { - return size; - } + @Override + public int getSizeInventory() + { + return size; + } - @Override - public ItemStack getStackInSlot(int index) { - return inventory.get(index); - } + @Override + public ItemStack getStackInSlot(int index) + { + return inventory.get(index); + } - @Override - public ItemStack decrStackSize(int index, int count) { - if (!getStackInSlot(index).isEmpty()) { - if (!getWorld().isRemote) - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); + @Override + public ItemStack decrStackSize(int index, int count) + { + if (!getStackInSlot(index).isEmpty()) + { + if (!getWorld().isRemote) + getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - if (getStackInSlot(index).getCount() <= count) { - ItemStack itemStack = inventory.get(index); - inventory.set(index, ItemStack.EMPTY); - markDirty(); - return itemStack; - } + if (getStackInSlot(index).getCount() <= count) + { + ItemStack itemStack = inventory.get(index); + inventory.set(index, ItemStack.EMPTY); + markDirty(); + return itemStack; + } - ItemStack itemStack = inventory.get(index).splitStack(count); - markDirty(); - return itemStack; - } + ItemStack itemStack = inventory.get(index).split(count); + markDirty(); + return itemStack; + } - return ItemStack.EMPTY; - } + return ItemStack.EMPTY; + } - @Override - public ItemStack removeStackFromSlot(int slot) { - if (!inventory.get(slot).isEmpty()) { - ItemStack itemStack = inventory.get(slot); - setInventorySlotContents(slot, ItemStack.EMPTY); - return itemStack; - } - return ItemStack.EMPTY; - } + @Override + public ItemStack removeStackFromSlot(int slot) + { + if (!inventory.get(slot).isEmpty()) + { + ItemStack itemStack = inventory.get(slot); + setInventorySlotContents(slot, ItemStack.EMPTY); + return itemStack; + } + return ItemStack.EMPTY; + } - @Override - public void setInventorySlotContents(int slot, ItemStack stack) { - inventory.set(slot, stack); - if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit()) - stack.setCount(getInventoryStackLimit()); - markDirty(); - if (!getWorld().isRemote) - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - } + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + inventory.set(slot, stack); + if (!stack.isEmpty() && stack.getCount() > getInventoryStackLimit()) + stack.setCount(getInventoryStackLimit()); + markDirty(); + if (!getWorld().isRemote) + getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); + } - @Override - public int getInventoryStackLimit() { - return 64; - } + @Override + public int getInventoryStackLimit() + { + return 64; + } - @Override - public void openInventory(PlayerEntity player) { + @Override + public void openInventory(PlayerEntity player) + { - } + } - @Override - public void closeInventory(PlayerEntity player) { + @Override + public void closeInventory(PlayerEntity player) + { - } + } - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return true; + } - // IWorldNameable + // IWorldNameable - @Override - public int getField(int id) { - return 0; - } +// @Override +// public int getField(int id) +// { +// return 0; +// } +// +// @Override +// public void setField(int id, int value) +// { +// +// } +// +// @Override +// public int getFieldCount() +// { +// return 0; +// } - @Override - public void setField(int id, int value) { + @Override + public void clear() + { + this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); + } - } + @Override + public boolean isEmpty() + { + for (ItemStack stack : inventory) if (!stack.isEmpty()) + return false; - @Override - public int getFieldCount() { - return 0; - } + return true; + } - @Override - public void clear() { - this.inventory = NonNullList.withSize(size, ItemStack.EMPTY); - } + @Override + public boolean isUsableByPlayer(PlayerEntity player) + { + return true; + } - @Override - public boolean isEmpty() { - for (ItemStack stack : inventory) - if (!stack.isEmpty()) - return false; +// @Override +// public String getName() +// { +// return TextHelper.localize("tile.bloodmagic." + name + ".name"); +// } +// +// @Override +// public boolean hasCustomName() +// { +// return true; +// } +// +// @Override +// public ITextComponent getDisplayName() +// { +// return new TextComponentString(getName()); +// } - return true; - } + protected void initializeItemHandlers() + { + if (this instanceof ISidedInventory) + { + handlerDown = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + handlerUp = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + handlerNorth = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + handlerSouth = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + handlerWest = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + handlerEast = LazyOptional.of(() -> new SidedInvWrapper((ISidedInventory) this, Direction.DOWN)); + } else + { + handlerDown = LazyOptional.of(() -> new InvWrapper(this)); + handlerUp = handlerDown; + handlerNorth = handlerDown; + handlerSouth = handlerDown; + handlerWest = handlerDown; + handlerEast = handlerDown; + } + } - @Override - public boolean isUsableByPlayer(PlayerEntity player) { - return true; - } + @SuppressWarnings("unchecked") + @Override + public LazyOptional getCapability(@Nonnull Capability capability, @Nullable Direction facing) + { + if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + switch (facing) + { + case DOWN: + return handlerDown.cast(); + case EAST: + return handlerEast.cast(); + case NORTH: + return handlerNorth.cast(); + case SOUTH: + return handlerSouth.cast(); + case UP: + return handlerUp.cast(); + case WEST: + return handlerWest.cast(); + } + } else if (facing == null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + { + return handlerDown.cast(); + } - @Override - public String getName() { - return TextHelper.localize("tile.bloodmagic." + name + ".name"); - } + return super.getCapability(capability, facing); + } - @Override - public boolean hasCustomName() { - return true; - } - - @Override - public ITextComponent getDisplayName() { - return new StringTextComponent(getName()); - } - - protected void initializeItemHandlers() { - if (this instanceof ISidedInventory) { - handlerDown = new SidedInvWrapper((ISidedInventory) this, Direction.DOWN); - handlerUp = new SidedInvWrapper((ISidedInventory) this, Direction.UP); - handlerNorth = new SidedInvWrapper((ISidedInventory) this, Direction.NORTH); - handlerSouth = new SidedInvWrapper((ISidedInventory) this, Direction.SOUTH); - handlerWest = new SidedInvWrapper((ISidedInventory) this, Direction.WEST); - handlerEast = new SidedInvWrapper((ISidedInventory) this, Direction.EAST); - } else { - handlerDown = new InvWrapper(this); - handlerUp = handlerDown; - handlerNorth = handlerDown; - handlerSouth = handlerDown; - handlerWest = handlerDown; - handlerEast = handlerDown; - } - } - - @SuppressWarnings("unchecked") - @Override - public T getCapability(Capability capability, Direction facing) { - if (facing != null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - switch (facing) { - case DOWN: - return (T) handlerDown; - case EAST: - return (T) handlerEast; - case NORTH: - return (T) handlerNorth; - case SOUTH: - return (T) handlerSouth; - case UP: - return (T) handlerUp; - case WEST: - return (T) handlerWest; - } - } else if (facing == null && capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - return (T) handlerDown; - } - - return super.getCapability(capability, facing); - } - - @Override - public boolean hasCapability(Capability capability, Direction facing) { - return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); - } -} +// @Override +// public boolean hasCapability(Capability capability, Direction facing) +// { +// return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); +// } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java b/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java deleted file mode 100644 index 491a7cb6..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileInversionPillar.java +++ /dev/null @@ -1,532 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.inversion.InversionPillarHandler; -import WayofTime.bloodmagic.tile.base.TileTicking; -import com.google.common.collect.ImmutableMap; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraftforge.common.animation.Event; -import net.minecraftforge.common.animation.TimeValues.VariableValue; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.model.animation.CapabilityAnimation; -import net.minecraftforge.common.model.animation.IAnimationStateMachine; - -import java.util.Collections; -import java.util.List; -import java.util.Locale; - -public class TileInversionPillar extends TileTicking { - public static final double maxWillForChunk = 1000; - public static double willPerOperation = 0.5; - public static double inversionPerOperation = 4; - public static double addedInversionPerFailedCheck = 1; - public static double inversionToIncreaseRadius = 100; - public static double inversionToAddPillar = 200; - public static double operationThreshold = 20; - public static double inversionToSpreadWill = 200; - public static double willPushRate = 1; - public static double inversionCostPerWillSpread = 4; - public static double minimumWillForChunkWhenSpreading = 100; - private final IAnimationStateMachine asm; - private final VariableValue animationOffset = new VariableValue(0); - private final VariableValue cycleLength = new VariableValue(4); - - public EnumDemonWillType type; - public double currentInversion = 0; - public int consecutiveFailedChecks = 0; //If you fail enough checks, increase the radius. - public int consecutiveFailedAirChecks = 0; - public int currentInfectionRadius = 1; - -// public int dormantCounter = 0; //Time that the pillar will - - public int counter = 0; - - public boolean isRegistered = false; - private float animationOffsetValue = 0; - - public TileInversionPillar() { - this(EnumDemonWillType.DEFAULT); - } - - public TileInversionPillar(EnumDemonWillType type) { - this.type = type; - asm = BloodMagic.proxy.load(new ResourceLocation(BloodMagic.MODID.toLowerCase(), "asms/block/inversion_pillar.json"), ImmutableMap.of("offset", animationOffset, "cycle_length", cycleLength)); - animationOffsetValue = -1; - } - - @Override - public void onUpdate() { - if (animationOffsetValue < 0) { - animationOffsetValue = getWorld().getTotalWorldTime() * getWorld().rand.nextFloat(); - animationOffset.setValue(animationOffsetValue); - } - - if (getWorld().isRemote) { - return; - } - - if (!isRegistered) { - isRegistered = InversionPillarHandler.addPillarToMap(getWorld(), getType(), getPos()); - } - - counter++; - - double currentWill = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (counter % 1 == 0) { - List pillarList = getNearbyPillarsExcludingThis(); -// if (type == EnumDemonWillType.VENGEFUL) -// { -// System.out.println(pillarList.size() + " nearby pillars"); -// } - generateWillForNearbyPillars(currentWill, pillarList); - generateInversionForNearbyPillars(currentWill, pillarList); - int pollute = polluteNearbyBlocks(currentWill); - if (pollute == 1) { - currentInversion += addedInversionPerFailedCheck; - consecutiveFailedChecks++; - } else if (pollute == 3) { - currentInversion += addedInversionPerFailedCheck; - consecutiveFailedAirChecks++; - } else if (pollute == 0) { - //We successfully found a block to replace! - consecutiveFailedChecks = 0; - consecutiveFailedAirChecks = 0; - } - - if (consecutiveFailedAirChecks > 100) { - createObstructionsInAir(); - } - - if (currentInversion >= inversionToSpreadWill) { - spreadWillToSurroundingChunks(); - } - - if (consecutiveFailedChecks > 5 * currentInfectionRadius && currentInversion >= inversionToIncreaseRadius) { - currentInfectionRadius++; - consecutiveFailedChecks = 0; - currentInversion -= inversionToIncreaseRadius; - BMLog.DEBUG.info("Increasing radius!"); - } else if (consecutiveFailedAirChecks > 25 * currentInfectionRadius) //Change this to require a number of "creations" with the orbs in the air. - { - currentInfectionRadius++; - consecutiveFailedChecks = 0; - currentInversion -= inversionToIncreaseRadius; - BMLog.DEBUG.info("Increasing radius due to being in the air!"); - } - - if (currentInfectionRadius >= 8 && currentInversion >= inversionToAddPillar) { - //TODO: Improve algorithm - List allConnectedPos = InversionPillarHandler.getAllConnectedPillars(getWorld(), type, pos); - BlockPos candidatePos = findCandidatePositionForPillar(getWorld(), type, pos, allConnectedPos, 5, 10); - if (!candidatePos.equals(BlockPos.ORIGIN)) { - currentInversion = 0; - BlockState pillarState = RegistrarBloodMagicBlocks.INVERSION_PILLAR.getStateFromMeta(type.ordinal()); - BlockState bottomState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2); - BlockState topState = RegistrarBloodMagicBlocks.INVERSION_PILLAR_END.getStateFromMeta(type.ordinal() * 2 + 1); - getWorld().setBlockState(candidatePos, pillarState); - getWorld().setBlockState(candidatePos.down(), bottomState); - getWorld().setBlockState(candidatePos.up(), topState); - } - } - } - } - -// public static int getDormantTimeForConnectedPillarsOnSpawn() -// { -// return 0; -// } - - public void createObstructionsInAir() { - if (currentInversion > 1000) { - Vec3d vec = new Vec3d(getWorld().rand.nextDouble() * 2 - 1, getWorld().rand.nextDouble() * 2 - 1, getWorld().rand.nextDouble() * 2 - 1).normalize().scale(2 * currentInfectionRadius); - - BlockPos centralPos = pos.add(vec.x, vec.y, vec.z); - - getWorld().setBlockState(centralPos, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(0)); - currentInversion -= 1000; - } - } - - public void spreadWillToSurroundingChunks() { - double currentAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - if (currentAmount <= minimumWillForChunkWhenSpreading) { - return; - } - - for (Direction side : Direction.HORIZONTALS) { - BlockPos offsetPos = pos.offset(side, 16); - double sideAmount = WorldDemonWillHandler.getCurrentWill(getWorld(), offsetPos, type); - if (currentAmount > sideAmount) { - double drainAmount = Math.min((currentAmount - sideAmount) / 2, willPushRate); - if (drainAmount < willPushRate / 2) { - continue; - } - - double drain = WorldDemonWillHandler.drainWill(getWorld(), pos, type, drainAmount, true); - drain = WorldDemonWillHandler.fillWillToMaximum(getWorld(), offsetPos, type, drain, maxWillForChunk, true); - - currentInversion -= drain * inversionCostPerWillSpread; - } - } - } - - public void removePillarFromMap() { - if (!getWorld().isRemote) { - InversionPillarHandler.removePillarFromMap(getWorld(), type, pos); - } - } - - public List getNearbyPillarsExcludingThis() { - return InversionPillarHandler.getNearbyPillars(getWorld(), type, pos); - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - - if (!tag.hasKey(Constants.NBT.WILL_TYPE)) { - type = EnumDemonWillType.DEFAULT; - } - - type = EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); - currentInversion = tag.getDouble("currentInversion"); - currentInfectionRadius = tag.getInt("currentInfectionRadius"); - consecutiveFailedChecks = tag.getInt("consecutiveFailedChecks"); - - animationOffsetValue = tag.getFloat("animationOffset"); - animationOffset.setValue(animationOffsetValue); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - - tag.putString(Constants.NBT.WILL_TYPE, type.toString()); - tag.putDouble("currentInversion", currentInversion); - tag.putInt("currentInfectionRadius", currentInfectionRadius); - tag.putInt("consecutiveFailedChecks", consecutiveFailedChecks); - tag.putFloat("animationOffset", animationOffsetValue); - - return tag; - } - - public void generateWillForNearbyPillars(double currentWillInChunk, List offsetPositions) { - double totalGeneratedWill = 0; - double willFactor = currentWillInChunk / 1000; - - for (BlockPos offsetPos : offsetPositions) { - double distanceSquared = offsetPos.distanceSq(pos); - - totalGeneratedWill += willFactor * 343 / (343 + Math.pow(distanceSquared, 3 / 2)); - } - - if (totalGeneratedWill > 0) { - WorldDemonWillHandler.fillWillToMaximum(getWorld(), pos, type, totalGeneratedWill, maxWillForChunk, true); - } - } - - public void generateInversionForNearbyPillars(double currentWillInChunk, List offsetPositions) { - double willFactor = currentWillInChunk / 400; - double totalGeneratedInversion = willFactor; - - for (BlockPos offsetPos : offsetPositions) { - double distanceSquared = offsetPos.distanceSq(pos); - - totalGeneratedInversion += 3125 / (3125 + Math.pow(distanceSquared, 5 / 2)); - } - - currentInversion = Math.max(0, currentInversion + totalGeneratedInversion); - } - - /** - * @param currentWillInChunk - * @return 0 if the block is successfully placed, 1 if the block is not - * placed due to the selected place being invalid, 2 if the block is - * not placed due to there not being enough Will or Inversion, 3 if - * the block is not placed due to the selected block being air. - */ - public int polluteNearbyBlocks(double currentWillInChunk) { -// System.out.println("Hai! :D Current Inversion: " + currentInversion + ", Current Will: " + currentWillInChunk); - if (currentWillInChunk < operationThreshold || currentInversion < inversionPerOperation) { - return 2; //Not enough Will or Inversion available - } - - for (int i = 0; i < currentInfectionRadius; i++) { - double xOff = (getWorld().rand.nextBoolean() ? 1 : -1) * (getWorld().rand.nextGaussian() + 1) * (currentInfectionRadius); - double yOff = (getWorld().rand.nextBoolean() ? 1 : -1) * (getWorld().rand.nextGaussian() + 1) * (currentInfectionRadius); - double zOff = (getWorld().rand.nextBoolean() ? 1 : -1) * (getWorld().rand.nextGaussian() + 1) * (currentInfectionRadius); - double r2 = xOff * xOff + yOff * yOff + zOff * zOff; - int maxInfectionRadius2 = (9 * currentInfectionRadius * currentInfectionRadius); - if (r2 > maxInfectionRadius2) { - double factor = Math.sqrt(maxInfectionRadius2 / r2); - xOff *= factor; - yOff *= factor; - zOff *= factor; - } - - BlockPos offsetPos = pos.add(xOff + 0.5, yOff + 0.5, zOff + 0.5); - if (offsetPos.equals(pos)) { - return 1; //Invalid block (itself!) - } - - BlockState state = getWorld().getBlockState(offsetPos); - if (!state.getBlock().isAir(state, getWorld(), offsetPos)) { - //Consume Will and set this block - Block block = state.getBlock(); - if (block == Blocks.DIRT || block == Blocks.STONE || block == Blocks.GRASS) { - if (getWorld().setBlockState(offsetPos, RegistrarBloodMagicBlocks.DEMON_EXTRAS.getStateFromMeta(0))) { - WorldDemonWillHandler.drainWill(getWorld(), pos, type, willPerOperation, true); - currentInversion -= inversionPerOperation; - - return 0; //Successfully placed - } - } - - return 1; //Invalid block - } - } - - return 3; //The block was air - } - - public void handleEvents(float time, Iterable pastEvents) { - for (Event event : pastEvents) { - BMLog.DEBUG.info("Event: " + event.event() + " " + event.offset() + " " + getPos() + " " + time); - } - } - - @Override - public boolean hasFastRenderer() { - return true; - } - - @Override - public boolean hasCapability(Capability capability, Direction side) { - if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) { - return true; - } - return super.hasCapability(capability, side); - } - - @Override - public T getCapability(Capability capability, Direction side) { - if (capability == CapabilityAnimation.ANIMATION_CAPABILITY) { - return CapabilityAnimation.ANIMATION_CAPABILITY.cast(asm); - } - return super.getCapability(capability, side); - } - - public IAnimationStateMachine getAsm() { - return asm; - } - - public float getAnimationOffsetValue() { - return animationOffsetValue; - } - - public void setAnimationOffsetValue(float animationOffsetValue) { - this.animationOffsetValue = animationOffsetValue; - } - - public VariableValue getAnimationOffset() { - return animationOffset; - } - - public VariableValue getCycleLength() { - return cycleLength; - } - - public EnumDemonWillType getType() { - return type; - } - - public void setType(EnumDemonWillType type) { - this.type = type; - } - - public double getCurrentInversion() { - return currentInversion; - } - - public void setCurrentInversion(double currentInversion) { - this.currentInversion = currentInversion; - } - - public int getConsecutiveFailedChecks() { - return consecutiveFailedChecks; - } - - public void setConsecutiveFailedChecks(int consecutiveFailedChecks) { - this.consecutiveFailedChecks = consecutiveFailedChecks; - } - - public int getConsecutiveFailedAirChecks() { - return consecutiveFailedAirChecks; - } - - public void setConsecutiveFailedAirChecks(int consecutiveFailedAirChecks) { - this.consecutiveFailedAirChecks = consecutiveFailedAirChecks; - } - - public int getCurrentInfectionRadius() { - return currentInfectionRadius; - } - - public void setCurrentInfectionRadius(int currentInfectionRadius) { - this.currentInfectionRadius = currentInfectionRadius; - } - - public int getCounter() { - return counter; - } - - public void setCounter(int counter) { - this.counter = counter; - } - - public boolean isRegistered() { - return isRegistered; - } - - public void setRegistered(boolean registered) { - isRegistered = registered; - } - - public static BlockPos findCandidatePositionForPillar(World world, EnumDemonWillType type, BlockPos pos, List posList, double tooCloseDistance, double wantedAverageDistance) { - int maxIterations = 100; - int heightCheckRange = 3; - - for (int i = 0; i < maxIterations; i++) { - Collections.shuffle(posList); - BlockPos pillarPos = posList.get(0); - - Vec3d vec = new Vec3d(world.rand.nextDouble() * 2 - 1, world.rand.nextDouble() * 2 - 1, world.rand.nextDouble() * 2 - 1).normalize().scale(wantedAverageDistance); - - BlockPos centralPos = pillarPos.add(vec.x, vec.y, vec.z); - BlockPos testPos = null; - candidateTest: - for (int h = 0; h <= heightCheckRange; h++) { - for (int sig = -1; sig <= 1; sig += (h > 0 ? 2 : 3)) { - BlockPos candidatePos = centralPos.add(0, sig * h, 0); - if (world.isAirBlock(candidatePos) && world.isAirBlock(candidatePos.up()) && world.isAirBlock(candidatePos.down()) && !world.isAirBlock(candidatePos.down(2))) { - testPos = candidatePos; - break candidateTest; - } - } - } - - if (testPos != null) { - boolean isValid = true; - for (BlockPos pillarTestPos : posList) { - if (pillarTestPos.distanceSq(testPos) <= tooCloseDistance * tooCloseDistance) { - isValid = false; - break; - } - } - - if (isValid) { - return testPos; - } - } - } - - return BlockPos.ORIGIN; - } - - public static double getWillPerOperation() { - return willPerOperation; - } - - public static void setWillPerOperation(double willPerOperation) { - TileInversionPillar.willPerOperation = willPerOperation; - } - - public static double getInversionPerOperation() { - return inversionPerOperation; - } - - public static void setInversionPerOperation(double inversionPerOperation) { - TileInversionPillar.inversionPerOperation = inversionPerOperation; - } - - public static double getAddedInversionPerFailedCheck() { - return addedInversionPerFailedCheck; - } - - public static void setAddedInversionPerFailedCheck(double addedInversionPerFailedCheck) { - TileInversionPillar.addedInversionPerFailedCheck = addedInversionPerFailedCheck; - } - - public static double getInversionToIncreaseRadius() { - return inversionToIncreaseRadius; - } - - public static void setInversionToIncreaseRadius(double inversionToIncreaseRadius) { - TileInversionPillar.inversionToIncreaseRadius = inversionToIncreaseRadius; - } - - public static double getInversionToAddPillar() { - return inversionToAddPillar; - } - - public static void setInversionToAddPillar(double inversionToAddPillar) { - TileInversionPillar.inversionToAddPillar = inversionToAddPillar; - } - - public static double getOperationThreshold() { - return operationThreshold; - } - - public static void setOperationThreshold(double operationThreshold) { - TileInversionPillar.operationThreshold = operationThreshold; - } - - public static double getInversionToSpreadWill() { - return inversionToSpreadWill; - } - - public static void setInversionToSpreadWill(double inversionToSpreadWill) { - TileInversionPillar.inversionToSpreadWill = inversionToSpreadWill; - } - - public static double getWillPushRate() { - return willPushRate; - } - - public static void setWillPushRate(double willPushRate) { - TileInversionPillar.willPushRate = willPushRate; - } - - public static double getInversionCostPerWillSpread() { - return inversionCostPerWillSpread; - } - - public static void setInversionCostPerWillSpread(double inversionCostPerWillSpread) { - TileInversionPillar.inversionCostPerWillSpread = inversionCostPerWillSpread; - } - - public static double getMinimumWillForChunkWhenSpreading() { - return minimumWillForChunkWhenSpreading; - } - - public static void setMinimumWillForChunkWhenSpreading(double minimumWillForChunkWhenSpreading) { - TileInversionPillar.minimumWillForChunkWhenSpreading = minimumWillForChunkWhenSpreading; - } - - public static double getMaxWillForChunk() { - return maxWillForChunk; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java deleted file mode 100644 index ce5a84c0..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMasterRitualStone.java +++ /dev/null @@ -1,459 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.event.RitualEvent; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.item.ItemActivationCrystal; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.ritual.EnumReaderBoundaries; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.tile.base.TileTicking; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.helper.*; -import com.google.common.base.Strings; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; - -import javax.annotation.Nullable; -import java.util.*; - -public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone { - protected final Map modableRangeMap = new HashMap<>(); - private UUID owner; - private SoulNetwork cachedNetwork; - private boolean active; - private boolean redstoned; - private int activeTime; - private int cooldown; - private Ritual currentRitual; - private Direction direction = Direction.NORTH; - private boolean inverted; - private List currentActiveWillConfig = new ArrayList<>(); - - @Override - public void onUpdate() { - if (getWorld().isRemote) - return; - - if (isPowered() && isActive()) { - active = false; - redstoned = true; - stopRitual(Ritual.BreakType.REDSTONE); - return; - } - - if (!isActive() && !isPowered() && isRedstoned() && getCurrentRitual() != null) { - active = true; - ItemStack crystalStack = NBTHelper.checkNBT(new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL, 1, getCurrentRitual().getCrystalLevel())); - BindableHelper.applyBinding(crystalStack, new Binding(owner, PlayerHelper.getUsernameFromUUID(owner))); - activateRitual(crystalStack, null, getCurrentRitual()); - redstoned = false; - } - - if (getCurrentRitual() != null && isActive()) { - if (activeTime % getCurrentRitual().getRefreshTime() == 0) - performRitual(getWorld(), getPos()); - - activeTime++; - } - } - - @Override - public void deserialize(CompoundNBT tag) { - owner = tag.hasUniqueId("owner") ? tag.getUniqueId("owner") : null; - if (owner != null) - cachedNetwork = NetworkHelper.getSoulNetwork(owner); - currentRitual = BloodMagic.RITUAL_MANAGER.getRitual(tag.getString(Constants.NBT.CURRENT_RITUAL)); - if (currentRitual != null) { - CompoundNBT ritualTag = tag.getCompound(Constants.NBT.CURRENT_RITUAL_TAG); - if (!ritualTag.isEmpty()) { - currentRitual.readFromNBT(ritualTag); - } - } - active = tag.getBoolean(Constants.NBT.IS_RUNNING); - activeTime = tag.getInt(Constants.NBT.RUNTIME); - direction = Direction.VALUES[tag.getInt(Constants.NBT.DIRECTION)]; - redstoned = tag.getBoolean(Constants.NBT.IS_REDSTONED); - - for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (tag.getBoolean("EnumWill" + type)) { - currentActiveWillConfig.add(type); - } - } - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - String ritualId = BloodMagic.RITUAL_MANAGER.getId(getCurrentRitual()); - if (owner != null) - tag.putUniqueId("owner", owner); - tag.putString(Constants.NBT.CURRENT_RITUAL, Strings.isNullOrEmpty(ritualId) ? "" : ritualId); - if (currentRitual != null) { - CompoundNBT ritualTag = new CompoundNBT(); - currentRitual.writeToNBT(ritualTag); - tag.put(Constants.NBT.CURRENT_RITUAL_TAG, ritualTag); - } - tag.putBoolean(Constants.NBT.IS_RUNNING, isActive()); - tag.putInt(Constants.NBT.RUNTIME, getActiveTime()); - tag.putInt(Constants.NBT.DIRECTION, direction.getIndex()); - tag.putBoolean(Constants.NBT.IS_REDSTONED, redstoned); - - for (EnumDemonWillType type : currentActiveWillConfig) { - tag.putBoolean("EnumWill" + type, true); - } - - return tag; - } - - @Override - public boolean activateRitual(ItemStack activationCrystal, @Nullable PlayerEntity activator, Ritual ritual) { - if (PlayerHelper.isFakePlayer(activator)) - return false; - - Binding binding = ((IBindable) activationCrystal.getItem()).getBinding(activationCrystal); - if (binding != null && ritual != null) { - if (activationCrystal.getItem() instanceof ItemActivationCrystal) { - int crystalLevel = ((ItemActivationCrystal) activationCrystal.getItem()).getCrystalLevel(activationCrystal); - if (RitualHelper.canCrystalActivate(ritual, crystalLevel)) { - if (!getWorld().isRemote) { - SoulNetwork network = NetworkHelper.getSoulNetwork(binding); - - if (!isRedstoned() && network.getCurrentEssence() < ritual.getActivationCost() && (activator != null && !activator.capabilities.isCreativeMode)) { - activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.weak"), true); - return false; - } - - if (currentRitual != null) - currentRitual.stopRitual(this, Ritual.BreakType.ACTIVATE); - - RitualEvent.RitualActivatedEvent event = new RitualEvent.RitualActivatedEvent(this, binding.getOwnerId(), ritual, activator, activationCrystal, crystalLevel); - - if (MinecraftForge.EVENT_BUS.post(event)) { - if (activator != null) - activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.prevent"), true); - return false; - } - - if (ritual.activateRitual(this, activator, binding.getOwnerId())) { - if (!isRedstoned() && (activator != null && !activator.capabilities.isCreativeMode)) - network.syphon(ticket(ritual.getActivationCost())); - - if (activator != null) - activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.activate"), true); - - this.active = true; - this.owner = binding.getOwnerId(); - this.cachedNetwork = network; - this.currentRitual = ritual; - - if (!checkBlockRanges(ritual.getModableRangeMap())) - addBlockRanges(ritual.getModableRangeMap()); - - notifyUpdate(); - return true; - } - } - - notifyUpdate(); - return true; - } - } - } else { - if (activator != null) - activator.sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.ritual.notValid"), true); - } - - return false; - } - - @Override - public void performRitual(World world, BlockPos pos) { - if (!world.isRemote && getCurrentRitual() != null && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(currentRitual), false)) { - if (RitualHelper.checkValidRitual(getWorld(), getPos(), currentRitual, getDirection())) { - Ritual ritual = getCurrentRitual(); - RitualEvent.RitualRunEvent event = new RitualEvent.RitualRunEvent(this, getOwner(), ritual); - - if (MinecraftForge.EVENT_BUS.post(event)) - return; - - if (!checkBlockRanges(getCurrentRitual().getModableRangeMap())) - addBlockRanges(getCurrentRitual().getModableRangeMap()); - - getCurrentRitual().performRitual(this); - } else { - stopRitual(Ritual.BreakType.BREAK_STONE); - } - } - } - - @Override - public void stopRitual(Ritual.BreakType breakType) { - if (!getWorld().isRemote && getCurrentRitual() != null) { - RitualEvent.RitualStopEvent event = new RitualEvent.RitualStopEvent(this, getOwner(), getCurrentRitual(), breakType); - - if (MinecraftForge.EVENT_BUS.post(event)) - return; - - getCurrentRitual().stopRitual(this, breakType); - if (breakType != Ritual.BreakType.REDSTONE) { - this.currentRitual = null; - this.active = false; - this.activeTime = 0; - } - notifyUpdate(); - } - } - - @Override - public int getCooldown() { - return cooldown; - } - - @Override - public void setCooldown(int cooldown) { - this.cooldown = cooldown; - } - - @Override - public Direction getDirection() { - return direction; - } - - public void setDirection(Direction direction) { - this.direction = direction; - } - - @Override - public boolean areTanksEmpty() { - return false; - } - - @Override - public int getRunningTime() { - return activeTime; - } - - @Override - public UUID getOwner() { - return owner; - } - - public void setOwner(UUID owner) { - this.owner = owner; - } - - @Override - public SoulNetwork getOwnerNetwork() { - return cachedNetwork; - } - - @Override - public World getWorld() { - return super.getWorld(); - } - - @Override - public BlockPos getPos() { - return super.getPos(); - } - - @Override - public World getWorldObj() { - return getWorld(); - } - - @Override - public BlockPos getBlockPos() { - return getPos(); - } - - @Override - public String getNextBlockRange(String range) { - if (this.currentRitual != null) { - return this.currentRitual.getNextBlockRange(range); - } - - return ""; - } - - @Override - public void provideInformationOfRitualToPlayer(PlayerEntity player) { - if (this.currentRitual != null) { - ChatUtil.sendNoSpam(player, this.currentRitual.provideInformationOfRitualToPlayer(player)); - } - } - - @Override - public void provideInformationOfRangeToPlayer(PlayerEntity player, String range) { - if (this.currentRitual != null && this.currentRitual.getListOfRanges().contains(range)) { - ChatUtil.sendNoSpam(player, this.currentRitual.provideInformationOfRangeToPlayer(player, range)); - } - } - - @Override - public void setActiveWillConfig(PlayerEntity player, List typeList) { - this.currentActiveWillConfig = typeList; - } - - @Override - public EnumReaderBoundaries setBlockRangeByBounds(PlayerEntity player, String range, BlockPos offset1, BlockPos offset2) { - AreaDescriptor descriptor = this.getBlockRange(range); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(world, getBlockPos()); - - EnumReaderBoundaries modificationType = currentRitual.canBlockRangeBeModified(range, descriptor, this, offset1, offset2, holder); - if (modificationType == EnumReaderBoundaries.SUCCESS) - descriptor.modifyAreaByBlockPositions(offset1, offset2); - - return modificationType; - } - - @Override - public List getActiveWillConfig() { - return new ArrayList<>(currentActiveWillConfig); - } - - @Override - public void provideInformationOfWillConfigToPlayer(PlayerEntity player, List typeList) { - //There is probably an easier way to make expanded chat messages - if (typeList.size() >= 1) { - Object[] translations = new TranslationTextComponent[typeList.size()]; - StringBuilder constructedString = new StringBuilder("%s"); - - for (int i = 1; i < typeList.size(); i++) { - constructedString.append(", %s"); - } - - for (int i = 0; i < typeList.size(); i++) { - translations[i] = new TranslationTextComponent("tooltip.bloodmagic.currentBaseType." + typeList.get(i).name.toLowerCase()); - } - - ChatUtil.sendNoSpam(player, new TranslationTextComponent("ritual.bloodmagic.willConfig.set", new TranslationTextComponent(constructedString.toString(), translations))); - } else { - ChatUtil.sendNoSpam(player, new TranslationTextComponent("ritual.bloodmagic.willConfig.void")); - } - } - - public boolean isPowered() { - if (inverted) - return !getWorld().isBlockPowered(getPos()); - - return getWorld().isBlockPowered(getPos()); - } - - public SoulNetwork getCachedNetwork() { - return cachedNetwork; - } - - public void setCachedNetwork(SoulNetwork cachedNetwork) { - this.cachedNetwork = cachedNetwork; - } - - public boolean isActive() { - return active; - } - - @Override - public void setActive(boolean active) { - this.active = active; - } - - public boolean isRedstoned() { - return redstoned; - } - - public void setRedstoned(boolean redstoned) { - this.redstoned = redstoned; - } - - public int getActiveTime() { - return activeTime; - } - - public void setActiveTime(int activeTime) { - this.activeTime = activeTime; - } - - public Ritual getCurrentRitual() { - return currentRitual; - } - - public void setCurrentRitual(Ritual currentRitual) { - this.currentRitual = currentRitual; - } - - public boolean isInverted() { - return inverted; - } - - public void setInverted(boolean inverted) { - this.inverted = inverted; - } - - public List getCurrentActiveWillConfig() { - return currentActiveWillConfig; - } - - public void setCurrentActiveWillConfig(List currentActiveWillConfig) { - this.currentActiveWillConfig = currentActiveWillConfig; - } - - /** - * Used to grab the range of a ritual for a given effect. - * - * @param range - Range that needs to be pulled. - * @return - - */ - public AreaDescriptor getBlockRange(String range) { - if (modableRangeMap.containsKey(range)) { - return modableRangeMap.get(range); - } - - return null; - } - - @Override - public void addBlockRange(String range, AreaDescriptor defaultRange) { - modableRangeMap.putIfAbsent(range, defaultRange.copy()); - } - - @Override - public void addBlockRanges(Map blockRanges) { - for (Map.Entry entry : blockRanges.entrySet()) { - modableRangeMap.putIfAbsent(entry.getKey(), entry.getValue().copy()); - } - } - - @Override - public void setBlockRange(String range, AreaDescriptor defaultRange) { - modableRangeMap.put(range, defaultRange.copy()); - } - - @Override - public void setBlockRanges(Map blockRanges) { - for (Map.Entry entry : blockRanges.entrySet()) { - modableRangeMap.put(entry.getKey(), entry.getValue().copy()); - } - } - - public boolean checkBlockRanges(Map blockRanges) { - for (Map.Entry entry : blockRanges.entrySet()) { - if (modableRangeMap.get(entry.getKey()) == null) - return false; - } - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java b/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java deleted file mode 100644 index 6e5fd68a..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileMimic.java +++ /dev/null @@ -1,369 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.block.BlockMimic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.entity.mob.EntityMimic; -import WayofTime.bloodmagic.util.ChatUtil; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.StateUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.PotionEntity; -import net.minecraft.block.Blocks; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Items; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.potion.PotionUtils; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.Hand; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.Difficulty; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.ReflectionHelper; - -import javax.annotation.Nullable; -import java.lang.reflect.Field; -import java.util.List; - -public class TileMimic extends TileInventory implements ITickable { - private static Field _blockMetadata = ReflectionHelper.findField(TileEntity.class, "blockMetadata", "field_145847_g"); - - public boolean dropItemsOnBreak = true; - public CompoundNBT tileTag = new CompoundNBT(); - public TileEntity mimicedTile = null; - BlockState stateOfReplacedBlock = Blocks.AIR.getDefaultState(); - - public int playerCheckRadius = 5; - public int potionSpawnRadius = 5; - public int potionSpawnInterval = 40; - - private int internalCounter = 0; - - public TileMimic() { - super(2, "mimic"); - } - - @Override - public void update() { - if (getWorld().isRemote) { - return; - } - - internalCounter++; - if (internalCounter % potionSpawnInterval == 0 && this.getBlockMetadata() == BlockMimic.sentientMimicMeta) { - ItemStack potionStack = this.getStackInSlot(1); - if (!potionStack.isEmpty()) { - AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); - List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, bb); - - for (PlayerEntity player : playerList) { - if (!player.capabilities.isCreativeMode) { - double posX = this.pos.getX() + 0.5 + (2 * getWorld().rand.nextDouble() - 1) * potionSpawnRadius; - double posY = this.pos.getY() + 0.5 + (2 * getWorld().rand.nextDouble() - 1) * potionSpawnRadius; - double posZ = this.pos.getZ() + 0.5 + (2 * getWorld().rand.nextDouble() - 1) * potionSpawnRadius; - - ItemStack newStack = new ItemStack(potionStack.getItem() == RegistrarBloodMagicItems.POTION_FLASK ? Items.SPLASH_POTION : potionStack.getItem()); - newStack.setTagCompound(potionStack.getTagCompound()); - - PotionEntity potionEntity = new PotionEntity(getWorld(), posX, posY, posZ, newStack); - - getWorld().spawnEntity(potionEntity); - break; - } - } - } - } - - if (this.getBlockMetadata() == BlockMimic.sentientMimicMeta && getWorld().getDifficulty() != Difficulty.PEACEFUL && !(mimicedTile instanceof IInventory)) { - AxisAlignedBB bb = new AxisAlignedBB(this.getPos()).expand(playerCheckRadius, playerCheckRadius, playerCheckRadius); - List playerList = getWorld().getEntitiesWithinAABB(PlayerEntity.class, bb); - - for (PlayerEntity player : playerList) { - if (!player.capabilities.isCreativeMode && Utils.canEntitySeeBlock(getWorld(), player, getPos())) { - spawnMimicEntity(player); - break; - } - } - } - - } - - public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, Hand hand, ItemStack heldItem, Direction side) { - if (!heldItem.isEmpty() && player.capabilities.isCreativeMode) { - List list = PotionUtils.getEffectsFromStack(heldItem); - if (!list.isEmpty()) { - if (!world.isRemote) { - setInventorySlotContents(1, heldItem.copy()); - world.notifyBlockUpdate(pos, state, state, 3); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionSet")); - } - return true; - } else if (heldItem.getItem() == RegistrarBloodMagicItems.POTION_FLASK) { - //The potion flask is empty, therefore we have to reset the stored potion. - if (!world.isRemote) { - setInventorySlotContents(1, ItemStack.EMPTY); - world.notifyBlockUpdate(pos, state, state, 3); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionRemove")); - } - return true; - } - } - - if (performSpecialAbility(player, side)) { - return true; - } - - if (player.isSneaking()) - return false; - - if (!player.getHeldItem(hand).isEmpty() && player.getHeldItem(hand).getItem() == new ItemStack(RegistrarBloodMagicBlocks.MIMIC).getItem()) - return false; - - if (!getStackInSlot(0).isEmpty() && !player.getHeldItem(hand).isEmpty()) - return false; - - if (!dropItemsOnBreak && !player.capabilities.isCreativeMode) - return false; - - Utils.insertItemToTile(this, player, 0); - ItemStack stack = getStackInSlot(0); - if (stateOfReplacedBlock == Blocks.AIR.getDefaultState()) { - if (!stack.isEmpty() && stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - stateOfReplacedBlock = block.getDefaultState(); - } - } - this.refreshTileEntity(); - - if (player.capabilities.isCreativeMode) { - dropItemsOnBreak = getStackInSlot(0).isEmpty(); - } - - world.notifyBlockUpdate(pos, state, state, 3); - return true; - } - - public boolean performSpecialAbility(PlayerEntity player, Direction sideHit) { - switch (this.getBlockMetadata()) { - case BlockMimic.sentientMimicMeta: - if (player.capabilities.isCreativeMode) { - if (player.isSneaking()) { - playerCheckRadius = Math.max(playerCheckRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); - } else { - playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); - } - - return false; - } - - return spawnMimicEntity(player); - default: - if (!player.capabilities.isCreativeMode) { - return false; - } - - if (player.getActiveItemStack().isEmpty() && !getStackInSlot(1).isEmpty()) { - switch (sideHit) { - case EAST: //When the block is clicked on the EAST or WEST side, potionSpawnRadius is edited. - case WEST: - if (player.isSneaking()) { - potionSpawnRadius = Math.max(potionSpawnRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionSpawnRadius.down", potionSpawnRadius)); - } else { - potionSpawnRadius++; - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionSpawnRadius.up", potionSpawnRadius)); - } - break; - case NORTH: //When the block is clicked on the NORTH or SOUTH side, detectRadius is edited. - case SOUTH: - if (player.isSneaking()) { - playerCheckRadius = Math.max(playerCheckRadius - 1, 0); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.down", playerCheckRadius)); - } else { - playerCheckRadius++; - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.detectRadius.up", playerCheckRadius)); - } - break; - case UP: //When the block is clicked on the UP or DOWN side, potionSpawnInterval is edited. - case DOWN: - if (player.isSneaking()) { - potionSpawnInterval = Math.max(potionSpawnInterval - 1, 1); - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionInterval.down", potionSpawnInterval)); - } else { - potionSpawnInterval++; - ChatUtil.sendNoSpam(player, new TranslationTextComponent("chat.bloodmagic.mimic.potionInterval.up", potionSpawnInterval)); - } - break; - default: - break; - - } - - return true; - } - } - return false; - } - - public boolean spawnMimicEntity(PlayerEntity target) { - if (this.getWorld().getDifficulty() == Difficulty.PEACEFUL) { - return false; - } - - if (this.getStackInSlot(0).isEmpty() || getWorld().isRemote) { - return false; - } - - EntityMimic mimicEntity = new EntityMimic(getWorld()); - mimicEntity.setPosition(pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5); - - mimicEntity.initializeMimic(getStackInSlot(0), tileTag, dropItemsOnBreak, stateOfReplacedBlock, playerCheckRadius, pos); - tileTag = null; - mimicedTile = null; - this.setInventorySlotContents(0, ItemStack.EMPTY); - - getWorld().spawnEntity(mimicEntity); - if (target != null) { - mimicEntity.setAttackTarget(target); - } - - getWorld().setBlockToAir(pos); - - return true; - } - - public void refreshTileEntity() { - if (mimicedTile != null) { - dropMimicedTileInventory(); - } - mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, stateOfReplacedBlock); - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - - dropItemsOnBreak = tag.getBoolean("dropItemsOnBreak"); - tileTag = tag.getCompound("tileTag"); - stateOfReplacedBlock = StateUtil.parseState(tag.getString("stateOfReplacedBlock")); - mimicedTile = getTileFromStackWithTag(getWorld(), pos, getStackInSlot(0), tileTag, stateOfReplacedBlock); - playerCheckRadius = tag.getInt("playerCheckRadius"); - potionSpawnRadius = tag.getInt("potionSpawnRadius"); - potionSpawnInterval = Math.max(1, tag.getInt("potionSpawnInterval")); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - - tag.putBoolean("dropItemsOnBreak", dropItemsOnBreak); - tag.put("tileTag", tileTag); - tag.putInt("playerCheckRadius", playerCheckRadius); - tag.putInt("potionSpawnRadius", potionSpawnRadius); - tag.putInt("potionSpawnInterval", potionSpawnInterval); - tag.putString("stateOfReplacedBlock", stateOfReplacedBlock.toString()); - - return tag; - } - - @Override - public void dropItems() { - if (dropItemsOnBreak) { - InventoryHelper.dropInventoryItems(getWorld(), getPos(), this); - } - - dropMimicedTileInventory(); - } - - public void dropMimicedTileInventory() { - if (!getWorld().isRemote && mimicedTile instanceof IInventory) { - InventoryHelper.dropInventoryItems(getWorld(), getPos(), (IInventory) mimicedTile); - } - } - - public BlockState getReplacedState() { - return stateOfReplacedBlock; - } - - public void setReplacedState(BlockState state) { - stateOfReplacedBlock = state; - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack itemstack) { - return slot == 0 && dropItemsOnBreak; - } - - public static void replaceMimicWithBlockActual(TileMimic mimic) { - World world = mimic.getWorld(); - BlockPos pos = mimic.getPos(); - - replaceMimicWithBlockActual(world, pos, mimic.getStackInSlot(0), mimic.tileTag, mimic.stateOfReplacedBlock); - } - - public static boolean replaceMimicWithBlockActual(World world, BlockPos pos, ItemStack stack, CompoundNBT tileTag, BlockState replacementState) { - if (!stack.isEmpty() && stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - BlockState state = replacementState; - if (world.setBlockState(pos, state, 3)) { - TileEntity tile = world.getTileEntity(pos); - if (tile != null) { - tileTag.putInt("x", pos.getX()); - tileTag.putInt("y", pos.getY()); - tileTag.putInt("z", pos.getZ()); - tile.readFromNBT(tileTag); - } - - return true; - } - } - - return false; - } - - @Nullable - public static TileEntity getTileFromStackWithTag(World world, BlockPos pos, ItemStack stack, @Nullable CompoundNBT tag, BlockState replacementState) { - if (!stack.isEmpty() && stack.getItem() instanceof BlockItem) { - Block block = ((BlockItem) stack.getItem()).getBlock(); - BlockState state = replacementState; - if (block.hasTileEntity(state)) { - TileEntity tile = block.createTileEntity(world, state); - - if (tile == null) - return null; - - if (tag != null) { - CompoundNBT copyTag = tag.copy(); - copyTag.putInt("x", pos.getX()); - copyTag.putInt("y", pos.getY()); - copyTag.putInt("z", pos.getZ()); - tile.readFromNBT(copyTag); - } - - tile.setWorld(world); - - try { - _blockMetadata.setInt(tile, block.getMetaFromState(replacementState)); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - - return tile; - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java deleted file mode 100644 index 553fc9bf..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePhantomBlock.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.item.sigil.ItemSigilPhantomBridge; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.tile.base.TileTicking; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.CompoundNBT; - -public class TilePhantomBlock extends TileTicking { - private int ticksRemaining = 10; - - public TilePhantomBlock() { - } - - public TilePhantomBlock(int ticksRemaining) { - this.ticksRemaining = ticksRemaining; - } - - @Override - public void deserialize(CompoundNBT tagCompound) { - this.ticksRemaining = tagCompound.getInt(Constants.NBT.TICKS_REMAINING); - } - - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.putInt(Constants.NBT.TICKS_REMAINING, ticksRemaining); - return tagCompound; - } - - @Override - public void onUpdate() { - if (!world.isRemote) { - PlayerEntity player = world.getClosestPlayer(getPos().getX(), getPos().getY(), getPos().getZ(), 10.0D, ItemSigilPhantomBridge.IS_PHANTOM_ACTIVE); - if (player != null && !player.isSneaking()) - return; - ticksRemaining--; - } - - - if (ticksRemaining <= 0) { - world.setBlockToAir(getPos()); - world.removeTileEntity(getPos()); - } - - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java b/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java deleted file mode 100644 index 6710da46..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TilePurificationAltar.java +++ /dev/null @@ -1,83 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.iface.IPurificationAsh; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.util.helper.PurificationHelper; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; - -import java.util.List; - -public class TilePurificationAltar extends TileInventory implements ITickable { - public AreaDescriptor purityArea = new AreaDescriptor.Rectangle(new BlockPos(-5, -5, -5), 11); - - public double totalPurity = 0; - public double maxPurity = 0; - public double purityRate = 0; - - public TilePurificationAltar() { - super(1, "purificationAltar"); - } - - @Override - public void update() { - if (totalPurity <= 0) { - ItemStack stack = this.getStackInSlot(0); - if (!stack.isEmpty() && stack.getItem() instanceof IPurificationAsh) { - totalPurity = ((IPurificationAsh) stack.getItem()).getTotalPurity(stack); - maxPurity = ((IPurificationAsh) stack.getItem()).getMaxPurity(stack); - purityRate = ((IPurificationAsh) stack.getItem()).getPurityRate(stack); - } - } else { - return; - } - - AxisAlignedBB aabb = purityArea.getAABB(getPos()); - List animalList = getWorld().getEntitiesWithinAABB(AnimalEntity.class, aabb); - if (animalList.isEmpty()) { - return; - } - - boolean hasPerformed = false; - - for (AnimalEntity animal : animalList) { - double added = PurificationHelper.addPurity(animal, Math.min(purityRate, totalPurity), maxPurity); - if (added > 0) { - totalPurity -= purityRate; - hasPerformed = true; - } - } - - if (hasPerformed) { - if (getWorld().rand.nextInt(4) == 0 && getWorld() instanceof ServerWorld) { - ServerWorld server = (ServerWorld) getWorld(); - server.spawnParticle(EnumParticleTypes.FLAME, pos.getX() + 0.5, pos.getY() + 1.2, pos.getZ() + 0.5, 1, 0.02, 0.03, 0.02, 0); - } - } - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - totalPurity = tag.getDouble("totalPurity"); - maxPurity = tag.getDouble("maxPurity"); - purityRate = tag.getDouble("purityRate"); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - - tag.putDouble("totalPurity", totalPurity); - tag.putDouble("maxPurity", maxPurity); - tag.putDouble("purityRate", purityRate); - - return tag; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java index 8d1b7807..0dcdcc12 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java @@ -1,284 +1,421 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.api.event.BloodMagicCraftedEvent; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.recipe.RecipeTartaricForge; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillConduit; -import WayofTime.bloodmagic.soul.IDemonWillGem; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ITickable; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.items.ItemHandlerHelper; +package wayoftime.bloodmagic.tile; import java.util.ArrayList; import java.util.List; -public class TileSoulForge extends TileInventory implements ITickable, IDemonWillConduit { - public static final int ticksRequired = 100; - public static final double worldWillTransferRate = 1; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.ITickableTileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.IIntArray; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.registries.ObjectHolder; +import wayoftime.bloodmagic.api.event.BloodMagicCraftedEvent; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.will.EnumDemonWillType; +import wayoftime.bloodmagic.will.IDemonWill; +import wayoftime.bloodmagic.will.IDemonWillConduit; +import wayoftime.bloodmagic.will.IDemonWillGem; - public static final int soulSlot = 4; - public static final int outputSlot = 5; +public class TileSoulForge extends TileInventory + implements ITickableTileEntity, INamedContainerProvider, IDemonWillConduit +{ + @ObjectHolder("bloodmagic:soulforge") + public static TileEntityType TYPE; - //Input slots are from 0 to 3. + public static final int ticksRequired = 100; + public static final double worldWillTransferRate = 1; - public int burnTime = 0; + public static final int soulSlot = 4; + public static final int outputSlot = 5; - public TileSoulForge() { - super(6, "soulForge"); - } + // Input slots are from 0 to 3. - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); + public int burnTime = 0; - burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); - } + public TileSoulForge(TileEntityType type) + { + super(type, 6, "soulforge"); + } - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); + public TileSoulForge() + { + this(TYPE); + } - tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); - return tag; - } + @Override + public void deserialize(CompoundNBT tag) + { + super.deserialize(tag); - @Override - public void update() { - if (!getWorld().isRemote) { - for (EnumDemonWillType type : EnumDemonWillType.values()) { - double willInWorld = WorldDemonWillHandler.getCurrentWill(getWorld(), pos, type); - double filled = Math.min(willInWorld, worldWillTransferRate); + burnTime = tag.getInt(Constants.NBT.SOUL_FORGE_BURN); + } - if (filled > 0) { - filled = this.fillDemonWill(type, filled, false); - filled = WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, false); + @Override + public CompoundNBT serialize(CompoundNBT tag) + { + super.serialize(tag); - if (filled > 0) { - this.fillDemonWill(type, filled, true); - WorldDemonWillHandler.drainWill(getWorld(), pos, type, filled, true); - } - } - } - } + tag.putInt(Constants.NBT.SOUL_FORGE_BURN, burnTime); + return tag; + } - if (!hasSoulGemOrSoul()) { - burnTime = 0; - return; - } + public final IIntArray TileData = new IIntArray() + { + @Override + public int get(int index) + { + switch (index) + { + case 0: + return burnTime; + case 1: + return ticksRequired; + case 2: + return 0; + default: + throw new IllegalArgumentException("Invalid index: " + index); + } + } - double soulsInGem = getWill(EnumDemonWillType.DEFAULT); + @Override + public void set(int index, int value) + { + throw new IllegalStateException("Cannot set values through IIntArray"); + } - List inputList = new ArrayList<>(); + @Override + public int size() + { + return 3; + } + }; - for (int i = 0; i < 4; i++) - if (!getStackInSlot(i).isEmpty()) - inputList.add(getStackInSlot(i)); + @Override + public void tick() + { + if (!hasSoulGemOrSoul()) + { + burnTime = 0; + return; + } - RecipeTartaricForge recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForge(inputList); - if (recipe != null && (soulsInGem >= recipe.getMinimumSouls() || burnTime > 0)) { - if (canCraft(recipe)) { - burnTime++; + double soulsInGem = getWill(EnumDemonWillType.DEFAULT); - if (burnTime == ticksRequired) { - if (!getWorld().isRemote) { - double requiredSouls = recipe.getSoulDrain(); - if (requiredSouls > 0) { - if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) { - consumeSouls(EnumDemonWillType.DEFAULT, requiredSouls); - } - } + List inputList = new ArrayList<>(); - if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) - craftItem(recipe); - } + for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) + inputList.add(getStackInSlot(i)); - burnTime = 0; - } else if (burnTime > ticksRequired + 10) { - burnTime = 0; - } - } else { - burnTime = 0; - } - } else { - burnTime = 0; - } - } + RecipeTartaricForge recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getTartaricForge(world, inputList); + if (recipe != null && (soulsInGem >= recipe.getMinimumSouls() || burnTime > 0)) + { + if (canCraft(recipe)) + { + burnTime++; - public double getProgressForGui() { - return ((double) burnTime) / ticksRequired; - } + if (burnTime == ticksRequired) + { + if (!getWorld().isRemote) + { + double requiredSouls = recipe.getSoulDrain(); + if (requiredSouls > 0) + { + if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) + { + consumeSouls(EnumDemonWillType.DEFAULT, requiredSouls); + } + } - private boolean canCraft(RecipeTartaricForge recipe) { - if (recipe == null) - return false; + if (!getWorld().isRemote && soulsInGem >= recipe.getMinimumSouls()) + craftItem(recipe); + } - ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (recipe.getOutput().isEmpty()) - return false; - if (currentOutputStack.isEmpty()) - return true; - if (!currentOutputStack.isItemEqual(recipe.getOutput())) - return false; - int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); - return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); + burnTime = 0; + } else if (burnTime > ticksRequired + 10) + { + burnTime = 0; + } + } else + { + burnTime = 0; + } + } else + { + burnTime = 0; + } + } - } + private boolean canCraft(RecipeTartaricForge recipe) + { + if (recipe == null) + return false; - public void craftItem(RecipeTartaricForge recipe) { - if (this.canCraft(recipe)) { - ItemStack currentOutputStack = getStackInSlot(outputSlot); + ItemStack currentOutputStack = getStackInSlot(outputSlot); + if (recipe.getOutput().isEmpty()) + return false; + if (currentOutputStack.isEmpty()) + return true; + if (!currentOutputStack.isItemEqual(recipe.getOutput())) + return false; + int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); + return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); - List inputList = new ArrayList<>(); - for (int i = 0; i < 4; i++) - if (!getStackInSlot(i).isEmpty()) - inputList.add(getStackInSlot(i).copy()); + } - BloodMagicCraftedEvent.SoulForge event = new BloodMagicCraftedEvent.SoulForge(recipe.getOutput().copy(), inputList.toArray(new ItemStack[0])); - MinecraftForge.EVENT_BUS.post(event); + public void craftItem(RecipeTartaricForge recipe) + { + if (this.canCraft(recipe)) + { + ItemStack currentOutputStack = getStackInSlot(outputSlot); - if (currentOutputStack.isEmpty()) { - setInventorySlotContents(outputSlot, event.getOutput()); - } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) { - currentOutputStack.grow(event.getOutput().getCount()); - } + List inputList = new ArrayList<>(); + for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) + inputList.add(getStackInSlot(i).copy()); - consumeInventory(); - } - } + BloodMagicCraftedEvent.SoulForge event = new BloodMagicCraftedEvent.SoulForge(recipe.getOutput().copy(), inputList.toArray(new ItemStack[0])); + MinecraftForge.EVENT_BUS.post(event); - public boolean hasSoulGemOrSoul() { - ItemStack soulStack = getStackInSlot(soulSlot); + if (currentOutputStack.isEmpty()) + { + setInventorySlotContents(outputSlot, event.getOutput()); + } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) + { + currentOutputStack.grow(event.getOutput().getCount()); + } - if (!soulStack.isEmpty()) { - if (soulStack.getItem() instanceof IDemonWill || soulStack.getItem() instanceof IDemonWillGem) { - return true; - } - } + consumeInventory(); + } + } - return false; - } + @Override + public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) + { + assert world != null; + return new ContainerSoulForge(this, TileData, p_createMenu_1_, p_createMenu_2_); + } - public double getWill(EnumDemonWillType type) { - ItemStack soulStack = getStackInSlot(soulSlot); + @Override + public ITextComponent getDisplayName() + { + return new StringTextComponent("Hellfire Forge"); + } - if (soulStack != null) { - if (soulStack.getItem() instanceof IDemonWill && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) { - IDemonWill soul = (IDemonWill) soulStack.getItem(); - return soul.getWill(type, soulStack); - } + public boolean hasSoulGemOrSoul() + { + ItemStack soulStack = getStackInSlot(soulSlot); - if (soulStack.getItem() instanceof IDemonWillGem) { - IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); - return soul.getWill(type, soulStack); - } - } + if (!soulStack.isEmpty()) + { + if (soulStack.getItem() instanceof IDemonWill || soulStack.getItem() instanceof IDemonWillGem) + { + return true; + } + } - return 0; - } + return false; + } - public double consumeSouls(EnumDemonWillType type, double requested) { - ItemStack soulStack = getStackInSlot(soulSlot); + public double getProgressForGui() + { + return ((double) burnTime) / ticksRequired; + } - if (soulStack != null) { - if (soulStack.getItem() instanceof IDemonWill && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) { - IDemonWill soul = (IDemonWill) soulStack.getItem(); - double souls = soul.drainWill(type, soulStack, requested); - if (soul.getWill(type, soulStack) <= 0) { - setInventorySlotContents(soulSlot, ItemStack.EMPTY); - } - return souls; - } +// private boolean canCraft(RecipeTartaricForge recipe) +// { +// if (recipe == null) +// return false; +// +// ItemStack currentOutputStack = getStackInSlot(outputSlot); +// if (recipe.getOutput().isEmpty()) +// return false; +// if (currentOutputStack.isEmpty()) +// return true; +// if (!currentOutputStack.isItemEqual(recipe.getOutput())) +// return false; +// int result = currentOutputStack.getCount() + recipe.getOutput().getCount(); +// return result <= getInventoryStackLimit() && result <= currentOutputStack.getMaxStackSize(); +// +// } +// +// public void craftItem(RecipeTartaricForge recipe) +// { +// if (this.canCraft(recipe)) +// { +// ItemStack currentOutputStack = getStackInSlot(outputSlot); +// +// List inputList = new ArrayList<>(); +// for (int i = 0; i < 4; i++) if (!getStackInSlot(i).isEmpty()) +// inputList.add(getStackInSlot(i).copy()); +// +// BloodMagicCraftedEvent.SoulForge event = new BloodMagicCraftedEvent.SoulForge(recipe.getOutput().copy(), inputList.toArray(new ItemStack[0])); +// MinecraftForge.EVENT_BUS.post(event); +// +// if (currentOutputStack.isEmpty()) +// { +// setInventorySlotContents(outputSlot, event.getOutput()); +// } else if (ItemHandlerHelper.canItemStacksStack(currentOutputStack, event.getOutput())) +// { +// currentOutputStack.grow(event.getOutput().getCount()); +// } +// +// consumeInventory(); +// } +// } - if (soulStack.getItem() instanceof IDemonWillGem) { - IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); - return soul.drainWill(type, soulStack, requested, true); - } - } + public double getWill(EnumDemonWillType type) + { + ItemStack soulStack = getStackInSlot(soulSlot); - return 0; - } + if (soulStack != null) + { + if (soulStack.getItem() instanceof IDemonWill + && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) + { + IDemonWill soul = (IDemonWill) soulStack.getItem(); + return soul.getWill(type, soulStack); + } - public void consumeInventory() { - for (int i = 0; i < 4; i++) { - ItemStack inputStack = getStackInSlot(i); - if (!inputStack.isEmpty()) { - if (inputStack.getItem().hasContainerItem(inputStack)) { - setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); - continue; - } + if (soulStack.getItem() instanceof IDemonWillGem) + { + IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); + return soul.getWill(type, soulStack); + } + } - inputStack.shrink(1); - if (inputStack.isEmpty()) { - setInventorySlotContents(i, ItemStack.EMPTY); - } - } - } - } + return 0; + } - @Override - public int getWeight() { - return 50; - } + public double consumeSouls(EnumDemonWillType type, double requested) + { + ItemStack soulStack = getStackInSlot(soulSlot); - @Override - public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) { - if (amount <= 0) { - return 0; - } + if (soulStack != null) + { + if (soulStack.getItem() instanceof IDemonWill + && ((IDemonWill) soulStack.getItem()).getType(soulStack) == type) + { + IDemonWill soul = (IDemonWill) soulStack.getItem(); + double souls = soul.drainWill(type, soulStack, requested); + if (soul.getWill(type, soulStack) <= 0) + { + setInventorySlotContents(soulSlot, ItemStack.EMPTY); + } + return souls; + } - if (!canFill(type)) { - return 0; - } + if (soulStack.getItem() instanceof IDemonWillGem) + { + IDemonWillGem soul = (IDemonWillGem) soulStack.getItem(); + return soul.drainWill(type, soulStack, requested, true); + } + } - ItemStack stack = this.getStackInSlot(soulSlot); - if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { - return 0; - } + return 0; + } - IDemonWillGem willGem = (IDemonWillGem) stack.getItem(); - return willGem.fillWill(type, stack, amount, doFill); - } + public void consumeInventory() + { + for (int i = 0; i < 4; i++) + { + ItemStack inputStack = getStackInSlot(i); + if (!inputStack.isEmpty()) + { + if (inputStack.getItem().hasContainerItem(inputStack)) + { + setInventorySlotContents(i, inputStack.getItem().getContainerItem(inputStack)); + continue; + } - @Override - public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) { - ItemStack stack = this.getStackInSlot(soulSlot); - if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) { - return 0; - } + inputStack.shrink(1); + if (inputStack.isEmpty()) + { + setInventorySlotContents(i, ItemStack.EMPTY); + } + } + } + } - IDemonWillGem willGem = (IDemonWillGem) stack.getItem(); + @Override + public int getWeight() + { + return 50; + } - double drained = amount; - double current = willGem.getWill(type, stack); - if (current < drained) { - drained = current; - } + @Override + public double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill) + { + if (amount <= 0) + { + return 0; + } - if (doDrain) { - drained = willGem.drainWill(type, stack, drained, true); - } + if (!canFill(type)) + { + return 0; + } - return drained; - } + ItemStack stack = this.getStackInSlot(soulSlot); + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) + { + return 0; + } - @Override - public boolean canFill(EnumDemonWillType type) { - return true; - } + IDemonWillGem willGem = (IDemonWillGem) stack.getItem(); + return willGem.fillWill(type, stack, amount, doFill); + } - @Override - public boolean canDrain(EnumDemonWillType type) { - return true; - } + @Override + public double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain) + { + ItemStack stack = this.getStackInSlot(soulSlot); + if (stack.isEmpty() || !(stack.getItem() instanceof IDemonWillGem)) + { + return 0; + } - @Override - public double getCurrentWill(EnumDemonWillType type) { - return 0; - } + IDemonWillGem willGem = (IDemonWillGem) stack.getItem(); + + double drained = amount; + double current = willGem.getWill(type, stack); + if (current < drained) + { + drained = current; + } + + if (doDrain) + { + drained = willGem.drainWill(type, stack, drained, true); + } + + return drained; + } + + @Override + public boolean canFill(EnumDemonWillType type) + { + return true; + } + + @Override + public boolean canDrain(EnumDemonWillType type) + { + return true; + } + + @Override + public double getCurrentWill(EnumDemonWillType type) + { + return 0; + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java b/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java deleted file mode 100644 index 4d5d1eef..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileSpectralBlock.java +++ /dev/null @@ -1,84 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.tile.base.TileTicking; -import com.google.common.base.Strings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -public class TileSpectralBlock extends TileTicking { - private int ticksRemaining; - private String containedBlockName; - private int containedBlockMeta; - - public TileSpectralBlock() { - } - - @Override - public void deserialize(CompoundNBT tagCompound) { - ticksRemaining = tagCompound.getInt(Constants.NBT.TICKS_REMAINING); - containedBlockName = tagCompound.getString(Constants.NBT.CONTAINED_BLOCK_NAME); - containedBlockMeta = tagCompound.getInt(Constants.NBT.CONTAINED_BLOCK_META); - } - - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - tagCompound.putInt(Constants.NBT.TICKS_REMAINING, ticksRemaining); - tagCompound.putString(Constants.NBT.CONTAINED_BLOCK_NAME, Strings.isNullOrEmpty(containedBlockName) ? "" : containedBlockName); - tagCompound.putInt(Constants.NBT.CONTAINED_BLOCK_META, containedBlockMeta); - return tagCompound; - } - - @Override - public void onUpdate() { - if (getWorld().isRemote) { - return; - } - - ticksRemaining--; - - if (ticksRemaining <= 0) { - returnContainedBlock(); - } - } - - private void setContainedBlockInfo(BlockState blockState) { - containedBlockName = blockState.getBlock().getRegistryName().toString(); - containedBlockMeta = blockState.getBlock().getMetaFromState(blockState); - } - - private void setDuration(int duration) { - ticksRemaining = duration; - } - - public void resetDuration(int reset) { - if (ticksRemaining < reset) - ticksRemaining = reset; - } - - public void returnContainedBlock() { - Block block = null; - - if (!Strings.isNullOrEmpty(containedBlockName)) - block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(containedBlockName)); - - if (block != null && getWorld().setBlockState(pos, block.getStateFromMeta(containedBlockMeta))) - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - } - - public static void createSpectralBlock(World world, BlockPos blockPos, int duration) { - if (world.isAirBlock(blockPos)) - return; - BlockState cachedState = world.getBlockState(blockPos); - world.setBlockState(blockPos, RegistrarBloodMagicBlocks.SPECTRAL.getDefaultState()); - TileSpectralBlock tile = (TileSpectralBlock) world.getTileEntity(blockPos); - tile.setContainedBlockInfo(cachedState); - tile.setDuration(duration); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java deleted file mode 100644 index a6d19da3..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/TileTeleposer.java +++ /dev/null @@ -1,149 +0,0 @@ -package WayofTime.bloodmagic.tile; - -import WayofTime.bloodmagic.block.BlockTeleposer; -import WayofTime.bloodmagic.command.sub.SubCommandTeleposer; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import WayofTime.bloodmagic.teleport.TeleportQueue; -import WayofTime.bloodmagic.teleport.Teleports; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; - -import java.util.List; -import java.util.UUID; - -public class TileTeleposer extends TileInventory implements ITickable { - //TODO FUTURE: Make AreaDescriptor for Teleposer perhaps? - public static final String TELEPOSER_RANGE = "teleposerRange"; - - private int previousInput; - - public TileTeleposer() { - super(1, "teleposer"); - } - - @Override - public void deserialize(CompoundNBT tagCompound) { - super.deserialize(tagCompound); - previousInput = tagCompound.getInt(Constants.NBT.PREVIOUS_INPUT); - } - - @Override - public CompoundNBT serialize(CompoundNBT tagCompound) { - super.serialize(tagCompound); - tagCompound.putInt(Constants.NBT.PREVIOUS_INPUT, previousInput); - return tagCompound; - } - - @Override - public void update() { - if (!getWorld().isRemote && canInitiateTeleport()) { - int currentInput = getWorld().getStrongPower(pos); - - if (previousInput == 0 && currentInput != 0) { - initiateTeleport(); - } - - previousInput = currentInput; - - if (world.getTotalWorldTime() % 100 == 0) { - ItemStack focusStack = getStackInSlot(0); - if (!focusStack.isEmpty()) { - if (((ItemTelepositionFocus) focusStack.getItem()).getBinding(focusStack) != null) - SubCommandTeleposer.teleposerSet.add(this); - else - SubCommandTeleposer.teleposerSet.remove(this); - } else - SubCommandTeleposer.teleposerSet.remove(this); - } - } - } - - public void initiateTeleport() { - if (!getWorld().isRemote && canInitiateTeleport() && getBlockType() instanceof BlockTeleposer) { - ItemStack focusStack = getStackInSlot(0); - ItemTelepositionFocus focus = (ItemTelepositionFocus) focusStack.getItem(); - Binding binding = focus.getBinding(focusStack); - if (binding == null) - return; - BlockPos focusPos = focus.getBlockPos(focusStack); - World focusWorld = focus.getWorld(focusStack); - if (focusWorld == null) - return; - - TileEntity boundTile = focusWorld.getTileEntity(focusPos); - if (boundTile instanceof TileTeleposer && boundTile != this) { - final int focusLevel = (focusStack.getItemDamage() + 1); - final int lpToBeDrained = (int) (0.5F * Math.sqrt((pos.getX() - focusPos.getX()) * (pos.getX() - focusPos.getX()) + (pos.getY() - focusPos.getY() + 1) * (pos.getY() - focusPos.getY() + 1) + (pos.getZ() - focusPos.getZ()) * (pos.getZ() - focusPos.getZ()))); - - if (NetworkHelper.syphonFromContainer(focusStack, SoulTicket.block(world, pos, lpToBeDrained * (focusLevel * 2 - 1) * (focusLevel * 2 - 1) * (focusLevel * 2 - 1)))) { - int blocksTransported = 0; - - for (int i = -(focusLevel - 1); i <= (focusLevel - 1); i++) { - for (int j = 0; j <= (focusLevel * 2 - 2); j++) { - for (int k = -(focusLevel - 1); k <= (focusLevel - 1); k++) { - TeleposeEvent event = new TeleposeEvent(getWorld(), pos.add(i, 1 + j, k), focusWorld, focusPos.add(i, 1 + j, k)); - if (!MinecraftForge.EVENT_BUS.post(event) && Utils.swapLocations(event.initalWorld, event.initialBlockPos, event.finalWorld, event.finalBlockPos)) { - blocksTransported++; - } - } - } - } - - NetworkHelper.syphonFromContainer(focusStack, SoulTicket.item(focusStack, world, pos, lpToBeDrained * blocksTransported)); - - List originalWorldEntities; - List focusWorldEntities; - AxisAlignedBB originalArea = new AxisAlignedBB(pos.getX(), pos.getY() + 1, pos.getZ(), pos.getX() + 1, Math.min(focusWorld.getHeight(), pos.getY() + 2 * focusLevel), pos.getZ() + 1).expand(focusLevel - 1, 0, focusLevel - 1); - originalWorldEntities = getWorld().getEntitiesWithinAABB(Entity.class, originalArea); - AxisAlignedBB focusArea = new AxisAlignedBB(focusPos.getX(), focusPos.getY() + 1, focusPos.getZ(), focusPos.getX() + 1, Math.min(focusWorld.getHeight(), focusPos.getY() + 2 * focusLevel), focusPos.getZ() + 1).expand(focusLevel - 1, 0, focusLevel - 1); - focusWorldEntities = focusWorld.getEntitiesWithinAABB(Entity.class, focusArea); - UUID bindingOwnerID = binding.getOwnerId(); - if (focusWorld.equals(getWorld())) { - if (!originalWorldEntities.isEmpty()) { - for (Entity entity : originalWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, true)); - } - } - - if (!focusWorldEntities.isEmpty()) { - for (Entity entity : focusWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, true)); - } - } - - } else { - if (!originalWorldEntities.isEmpty()) { - for (Entity entity : originalWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, getWorld(), focusWorld.provider.getDimension(), true)); - } - } - - if (!focusWorldEntities.isEmpty()) { - for (Entity entity : focusWorldEntities) { - TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(new BlockPos(entity.posX - pos.getX() + focusPos.getX(), entity.posY - pos.getY() + focusPos.getY(), entity.posZ - pos.getZ() + focusPos.getZ()), entity, bindingOwnerID, focusWorld, getWorld().provider.getDimension(), true)); - } - } - } - } - } - } - } - - private boolean canInitiateTeleport() { - ItemStack focusStack = getStackInSlot(0); - return !focusStack.isEmpty() && focusStack.getItem() instanceof ItemTelepositionFocus && ((ItemTelepositionFocus) focusStack.getItem()).getBinding(focusStack) != null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java index 257b1487..fe9bf3b4 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java +++ b/src/main/java/WayofTime/bloodmagic/tile/base/TileBase.java @@ -1,120 +1,138 @@ -package WayofTime.bloodmagic.tile.base; +package wayoftime.bloodmagic.tile.base; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; /** * Base tile class. *

* Handles data syncing and core data writing/reading. */ -public class TileBase extends TileEntity { +public abstract class TileBase extends TileEntity +{ + public TileBase(TileEntityType type) + { + super(type); + } - @Override - public final void deserializeNBT(CompoundNBT nbt) { - super.deserializeNBT(nbt); - deserializeBase(nbt); - deserialize(nbt); - } + /** + * read method + */ + @Override + public final void read(BlockState state, CompoundNBT compound) + { + super.read(state, compound); + deserializeBase(compound); + deserialize(compound); + } - @Override - public final CompoundNBT serializeNBT() { - CompoundNBT tag = super.serializeNBT(); - serializeBase(tag); - return serialize(tag); - } + @Override + public final CompoundNBT write(CompoundNBT compound) + { + super.write(compound); + serializeBase(compound); + return serialize(compound); + } - /** - * Called by {@link #deserializeNBT(CompoundNBT)} - *

- * Internal data (such as coordinates) are handled for you. Just read the data you need. - * - * @param tagCompound - The tag compound to read from - */ - public void deserialize(CompoundNBT tagCompound) { + /** + * Called by {@link #func_230337_a_(BlockState, CompoundNBT)} + *

+ * Internal data (such as coordinates) are handled for you. Just read the data + * you need. + * + * @param tagCompound - The tag compound to read from + */ + public void deserialize(CompoundNBT tagCompound) + { - } + } - /** - * Package private method for reading base data from the tag compound. - * - * @param tagCompound - The tag compound to read from - * @see TileTicking - */ - void deserializeBase(CompoundNBT tagCompound) { + /** + * Package private method for reading base data from the tag compound. + * + * @param tagCompound - The tag compound to read from + * @see TileTicking + */ + void deserializeBase(CompoundNBT tagCompound) + { - } + } - /** - * Called by {@link #serializeNBT()} - *

- * Internal data (such as coordinates) are handled for you. Just read the data you need. - * - * @param tagCompound - The tag compound to write to. - * @return the modified tag compound - */ - public CompoundNBT serialize(CompoundNBT tagCompound) { - return tagCompound; - } + /** + * Called by {@link #writeToNBT(CompoundNBT)} + *

+ * Internal data (such as coordinates) are handled for you. Just read the data + * you need. + * + * @param tagCompound - The tag compound to write to. + * @return the modified tag compound + */ + public CompoundNBT serialize(CompoundNBT tagCompound) + { + return tagCompound; + } + /** + * Package private method for writing base data to the tag compound. + * + * @param tagCompound - The tag compound to write to. + * @return the modified tag compound + * @see TileTicking + */ + CompoundNBT serializeBase(CompoundNBT tagCompound) + { + return tagCompound; + } - /** - * Package private method for writing base data to the tag compound. - * - * @param tagCompound - The tag compound to write to. - * @return the modified tag compound - * @see TileTicking - */ - CompoundNBT serializeBase(CompoundNBT tagCompound) { - return tagCompound; - } + public void notifyUpdate() + { + BlockState state = getWorld().getBlockState(getPos()); + getWorld().notifyBlockUpdate(getPos(), state, state, 3); + } - public void notifyUpdate() { - BlockState state = getWorld().getBlockState(getPos()); - getWorld().notifyBlockUpdate(getPos(), state, state, 3); - } +// // Data syncing +// +// @Override +// public boolean shouldRefresh(World world, BlockPos pos, BlockState oldState, BlockState newState) +// { +// return oldState.getBlock() != newState.getBlock(); +// } - // Data syncing + @Override + public final SUpdateTileEntityPacket getUpdatePacket() + { + return new SUpdateTileEntityPacket(getPos(), -999, getUpdateTag()); + } - @Override - public boolean shouldRefresh(World world, BlockPos pos, BlockState oldState, BlockState newState) { - return oldState.getBlock() != newState.getBlock(); - } +// @Override +// public void handleUpdateTag(BlockState state, CompoundNBT tag) +// { +// read(state, tag); +// } - @Override - public final SUpdateTileEntityPacket getUpdatePacket() { - return new SUpdateTileEntityPacket(getPos(), -999, serializeNBT()); - } + @Override + @OnlyIn(Dist.CLIENT) + public final void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) + { + super.onDataPacket(net, pkt); + handleUpdateTag(getBlockState(), pkt.getNbtCompound()); + } - @Override - @SideOnly(Side.CLIENT) - public final void onDataPacket(NetworkManager net, SUpdateTileEntityPacket pkt) { - super.onDataPacket(net, pkt); - deserialize(pkt.getNbtCompound()); - onDataPacketClientReceived(); - } + @Override + public final CompoundNBT getUpdateTag() + { + return write(new CompoundNBT()); + } - /** - * Hook for performing client side updates after data packets are received and processed - */ - protected void onDataPacketClientReceived() { - // noop - } - - @Override - public final CompoundNBT getUpdateTag() { - return serializeNBT(); - } - - @Override - public final void handleUpdateTag(CompoundNBT tag) { - deserializeNBT(tag); - } -} + @Override + public final void handleUpdateTag(BlockState state, CompoundNBT tag) + { + read(state, tag); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java b/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java deleted file mode 100644 index 85e3154d..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/base/TileTicking.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.tile.base; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.ITickableTileEntity; - -/** - * Base class for tiles that tick. Allows disabling the ticking programmatically. - */ -// TODO - Move implementations that depend on existed ticks to new methods from here. -public abstract class TileTicking extends TileBase implements ITickableTileEntity { - private int ticksExisted; - private boolean shouldTick = true; - - @Override - public final void tick() { - if (shouldTick()) { - ticksExisted++; - onUpdate(); - } - } - - @Override - void deserializeBase(CompoundNBT tagCompound) { - this.ticksExisted = tagCompound.getInt("ticksExisted"); - this.shouldTick = tagCompound.getBoolean("shouldTick"); - } - - @Override - CompoundNBT serializeBase(CompoundNBT tagCompound) { - tagCompound.putInt("ticksExisted", getTicksExisted()); - tagCompound.putBoolean("shouldTick", shouldTick()); - return tagCompound; - } - - /** - * Called every tick that {@link #shouldTick()} is true. - */ - public abstract void onUpdate(); - - public int getTicksExisted() { - return ticksExisted; - } - - public void resetLifetime() { - ticksExisted = 0; - } - - public boolean shouldTick() { - return shouldTick; - } - - public void setShouldTick(boolean shouldTick) { - this.shouldTick = shouldTick; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java deleted file mode 100644 index 5c3f2801..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerAlchemyTable.java +++ /dev/null @@ -1,123 +0,0 @@ -package WayofTime.bloodmagic.tile.container; - -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.tile.TileAlchemyTable; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.ClickType; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerAlchemyTable extends Container { - private final IInventory tileTable; - - public ContainerAlchemyTable(PlayerInventory inventoryPlayer, IInventory tileTable) { - this.tileTable = tileTable; - this.addSlotToContainer(new Slot(tileTable, 0, 62, 15)); - this.addSlotToContainer(new Slot(tileTable, 1, 80, 51)); - this.addSlotToContainer(new Slot(tileTable, 2, 62, 87)); - this.addSlotToContainer(new Slot(tileTable, 3, 26, 87)); - this.addSlotToContainer(new Slot(tileTable, 4, 8, 51)); - this.addSlotToContainer(new Slot(tileTable, 5, 26, 15)); - this.addSlotToContainer(new Slot(tileTable, TileAlchemyTable.toolSlot, 152, 33)); - this.addSlotToContainer(new SlotOrb(tileTable, TileAlchemyTable.orbSlot, 152, 69)); - this.addSlotToContainer(new SlotOutput(tileTable, TileAlchemyTable.outputSlot, 44, 51)); - - 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, 123 + i * 18)); - } - } - - for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 181)); - } - } - - @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { - PlayerInventory inventoryPlayer = player.inventory; - - if (slotId < 6 && slotId >= 0) { - Slot slot = this.getSlot(slotId); - if (!slot.getHasStack() && inventoryPlayer.getItemStack().isEmpty()) { - ((TileAlchemyTable) tileTable).toggleInputSlotAccessible(slotId); - } - } - - return super.slotClick(slotId, dragType, clickTypeIn, player); - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { - ItemStack itemstack = ItemStack.EMPTY; - Slot slot = this.inventorySlots.get(index); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (index == 8) { - if (!this.mergeItemStack(itemstack1, 9, 9 + 36, true)) { - return ItemStack.EMPTY; - } - - slot.onSlotChange(itemstack1, itemstack); - } else if (index > 8) { - if (itemstack1.getItem() instanceof IBloodOrb) { - if (!this.mergeItemStack(itemstack1, 7, 8, false)) //TODO: Add alchemy tools to list - { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemstack1, 0, 6, false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemstack1, 9, 9 + 36, false)) { - return ItemStack.EMPTY; - } - - if (itemstack1.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.getCount() == itemstack.getCount()) { - return ItemStack.EMPTY; - } - - slot.onTake(playerIn, itemstack1); - } - - return itemstack; - } - - @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return this.tileTable.isUsableByPlayer(playerIn); - } - - private class SlotOrb extends Slot { - public SlotOrb(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IBloodOrb; - } - } - - private class SlotOutput extends Slot { - public SlotOutput(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack stack) { - return false; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java deleted file mode 100644 index d8441416..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java +++ /dev/null @@ -1,235 +0,0 @@ -package WayofTime.bloodmagic.tile.container; - -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.item.routing.IRoutingFilterProvider; -import WayofTime.bloodmagic.tile.routing.TileFilteredRoutingNode; -import WayofTime.bloodmagic.util.GhostItemHelper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.ClickType; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -import javax.annotation.Nullable; - -public class ContainerItemRoutingNode extends Container { - private final IInventory tileItemRoutingNode; - private final TileFilteredRoutingNode inventory; - public int lastGhostSlotClicked = -1; - // private final ItemInventory itemInventory; - private int slotsOccupied; - - public ContainerItemRoutingNode(PlayerInventory inventoryPlayer, IInventory tileItemRoutingNode) { - this.tileItemRoutingNode = tileItemRoutingNode; - inventory = (TileFilteredRoutingNode) tileItemRoutingNode; - - this.addSlotToContainer(new SlotItemFilter(this, tileItemRoutingNode, 0, 8, 33)); - ItemInventory itemInventory = inventory.itemInventory; - - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - addSlotToContainer(new SlotGhostItem(itemInventory, j + i * 3, 26 + j * 18, 15 + i * 18)); - } - } - - slotsOccupied = 10; - - 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, 87 + i * 18)); - } - } - - for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 145)); - } - } - - public void resetItemInventory(ItemStack masterStack) { - inventory.itemInventory.initializeInventory(masterStack); - } - - /** - * Overridden in order to handle ghost item slots. - */ - @Override - public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { - PlayerInventory inventoryPlayer = player.inventory; -// if (!player.worldObj.isRemote) - { - if (slotId >= 0) { - Slot slot = this.inventorySlots.get(slotId); - - if (slot instanceof SlotGhostItem) //TODO: make the slot clicking work! - { - lastGhostSlotClicked = slot.getSlotIndex(); - - if ((dragType == 0 || dragType == 1)) { - ItemStack slotStack = slot.getStack(); - ItemStack heldStack = inventoryPlayer.getItemStack(); - - if (dragType == 0) //Left mouse click-eth - { - { - if (heldStack.isEmpty() && !slotStack.isEmpty()) { - //I clicked on the slot with an empty hand. Selecting! - } else if (!heldStack.isEmpty() && slotStack.isEmpty()) { - if (!((SlotGhostItem) slot).canBeAccessed()) { - return super.slotClick(slotId, dragType, clickTypeIn, player); - } - - ItemStack copyStack = heldStack.copy(); - GhostItemHelper.setItemGhostAmount(copyStack, 0); - copyStack.setCount(1); - slot.putStack(copyStack); - - ItemStack filterStack = this.inventorySlots.get(0).getStack(); - if (filterStack.getItem() instanceof IRoutingFilterProvider) { - ItemStack filterCopy = ((IRoutingFilterProvider) filterStack.getItem()).getContainedStackForItem(filterStack, heldStack); - slot.putStack(filterCopy); - } - } - } - } else - //Right mouse click-eth away - { - slot.putStack(ItemStack.EMPTY); - } - } - } - } - } - - return super.slotClick(slotId, dragType, clickTypeIn, player); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { - ItemStack itemstack = ItemStack.EMPTY; - Slot slot = this.inventorySlots.get(index); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (index == 0) { - if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) { - return null; - } - - slot.onSlotChange(itemstack1, itemstack); - } else if (index > 0) { -// return null; - if (itemstack1.getItem() instanceof IRoutingFilterProvider) // Change to check item is a filter - { - if (!this.mergeItemStack(itemstack1, 0, 1, false)) { - return ItemStack.EMPTY; - } - } - } else if (!this.mergeItemStack(itemstack1, slotsOccupied, 36 + slotsOccupied, false)) { - return ItemStack.EMPTY; - } - - if (itemstack1.isEmpty()) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.getCount() == itemstack.getCount()) { - return ItemStack.EMPTY; - } - - slot.onTake(playerIn, itemstack1); - } - - return itemstack; - } - - @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return this.tileItemRoutingNode.isUsableByPlayer(playerIn); - } - - private class SlotItemFilter extends Slot { - public ContainerItemRoutingNode container; - public TileFilteredRoutingNode inventory; - - public SlotItemFilter(ContainerItemRoutingNode container, IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - this.container = container; - this.inventory = (TileFilteredRoutingNode) inventory; - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IRoutingFilterProvider; //TODO: Create a new Item that holds the filter. - } - - @Override - public void onSlotChanged() { - super.onSlotChanged(); - container.resetItemInventory(getStack()); - for (int i = 1; i <= 9; i++) { - Slot slot = container.getSlot(i); - slot.onSlotChanged(); - } - } - - @Override - public ItemStack getStack() { - return this.inventory.getStackInSlot(getActiveSlot()); - } - - @Override - public void putStack(@Nullable ItemStack stack) { - this.inventory.setInventorySlotContents(getActiveSlot(), stack); - this.onSlotChanged(); - } - - @Override - public ItemStack decrStackSize(int amount) { - return this.inventory.decrStackSize(getActiveSlot(), amount); - } - - public int getActiveSlot() { - return inventory.currentActiveSlot; - } - } - - private class SlotGhostItem extends Slot { - private ItemInventory itemInv; - - public SlotGhostItem(ItemInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - itemInv = inventory; - } - - @Override - public boolean isItemValid(ItemStack stack) { - return false; - } - - @Override - public boolean canTakeStack(PlayerEntity playerIn) { - return false; - } - -// @Override -// public boolean isHere(IInventory inv, int slotIn) -// { -// return itemInv.canInventoryBeManipulated() && super.isHere(inv, slotIn); -// } - - public boolean canBeAccessed() { - return itemInv.canInventoryBeManipulated(); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java deleted file mode 100644 index 806f657e..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerMasterRoutingNode.java +++ /dev/null @@ -1,20 +0,0 @@ -package WayofTime.bloodmagic.tile.container; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; - -public class ContainerMasterRoutingNode extends Container { - private final IInventory tileMasterRoutingNode; - - public ContainerMasterRoutingNode(PlayerInventory inventoryPlayer, IInventory tileMasterRoutingNode) { - this.tileMasterRoutingNode = tileMasterRoutingNode; - - } - - @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return this.tileMasterRoutingNode.isUsableByPlayer(playerIn); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java deleted file mode 100644 index 457cb101..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java +++ /dev/null @@ -1,105 +0,0 @@ -package WayofTime.bloodmagic.tile.container; - -import WayofTime.bloodmagic.soul.IDemonWill; -import WayofTime.bloodmagic.soul.IDemonWillGem; -import WayofTime.bloodmagic.tile.TileSoulForge; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerSoulForge extends Container { - private final IInventory tileForge; - - public ContainerSoulForge(PlayerInventory inventoryPlayer, IInventory tileForge) { - this.tileForge = tileForge; - this.addSlotToContainer(new Slot(tileForge, 0, 8, 15)); - this.addSlotToContainer(new Slot(tileForge, 1, 80, 15)); - this.addSlotToContainer(new Slot(tileForge, 2, 8, 87)); - this.addSlotToContainer(new Slot(tileForge, 3, 80, 87)); - this.addSlotToContainer(new SlotSoul(tileForge, TileSoulForge.soulSlot, 152, 51)); - this.addSlotToContainer(new SlotOutput(tileForge, TileSoulForge.outputSlot, 44, 51)); - - 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, 123 + i * 18)); - } - } - - for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 181)); - } - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { - ItemStack itemstack = ItemStack.EMPTY; - Slot slot = this.inventorySlots.get(index); - - if (slot != null && slot.getHasStack()) { - ItemStack itemstack1 = slot.getStack(); - itemstack = itemstack1.copy(); - - if (index == 5) { - if (!this.mergeItemStack(itemstack1, 6, 6 + 36, true)) { - return ItemStack.EMPTY; - } - - slot.onSlotChange(itemstack1, itemstack); - } else if (index > 5) { - if (itemstack1.getItem() instanceof IDemonWill || itemstack1.getItem() instanceof IDemonWillGem) { - if (!this.mergeItemStack(itemstack1, 4, 5, false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemstack1, 0, 4, false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(itemstack1, 6, 42, false)) { - return ItemStack.EMPTY; - } - - if (itemstack1.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - - if (itemstack1.getCount() == itemstack.getCount()) { - return ItemStack.EMPTY; - } - - slot.onTake(playerIn, itemstack1); - } - - return itemstack; - } - - @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return this.tileForge.isUsableByPlayer(playerIn); - } - - private class SlotSoul extends Slot { - public SlotSoul(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof IDemonWillGem || itemStack.getItem() instanceof IDemonWill; - } - } - - private class SlotOutput extends Slot { - public SlotOutput(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack stack) { - return false; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java deleted file mode 100644 index 7852a260..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerTeleposer.java +++ /dev/null @@ -1,80 +0,0 @@ -package WayofTime.bloodmagic.tile.container; - -import WayofTime.bloodmagic.item.ItemTelepositionFocus; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.container.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.container.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerTeleposer extends Container { - private final IInventory tileTeleposer; - - public ContainerTeleposer(PlayerInventory inventoryPlayer, IInventory tileTeleposer) { - this.tileTeleposer = tileTeleposer; - this.addSlotToContainer(new SlotTeleposer(tileTeleposer, 0, 80, 33)); - - 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, 57 + i * 18)); - } - } - - for (int i = 0; i < 9; i++) { - addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 115)); - } - } - - @Override - public ItemStack transferStackInSlot(PlayerEntity player, int slot) { - ItemStack stack = ItemStack.EMPTY; - Slot slotObject = inventorySlots.get(slot); - int slots = inventorySlots.size(); - - if (slotObject != null && slotObject.getHasStack()) { - ItemStack stackInSlot = slotObject.getStack(); - stack = stackInSlot.copy(); - - if (stack.getItem() instanceof ItemTelepositionFocus) { - if (slot <= slots) { - if (!this.mergeItemStack(stackInSlot, 0, slots, false)) { - return ItemStack.EMPTY; - } - } else if (!this.mergeItemStack(stackInSlot, slots, 36 + slots, false)) { - return ItemStack.EMPTY; - } - } - - if (stackInSlot.getCount() == 0) { - slotObject.putStack(ItemStack.EMPTY); - } else { - slotObject.onSlotChanged(); - } - - if (stackInSlot.getCount() == stack.getCount()) { - return ItemStack.EMPTY; - } - - slotObject.onTake(player, stackInSlot); - } - - return stack; - } - - @Override - public boolean canInteractWith(PlayerEntity playerIn) { - return this.tileTeleposer.isUsableByPlayer(playerIn); - } - - private class SlotTeleposer extends Slot { - public SlotTeleposer(IInventory inventory, int slotIndex, int x, int y) { - super(inventory, slotIndex, x, y); - } - - @Override - public boolean isItemValid(ItemStack itemStack) { - return itemStack.getItem() instanceof ItemTelepositionFocus; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java deleted file mode 100644 index b22c997f..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileFilteredRoutingNode.java +++ /dev/null @@ -1,119 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.item.inventory.ItemInventory; -import WayofTime.bloodmagic.util.GhostItemHelper; -import net.minecraft.block.BlockState; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.Direction; -import net.minecraft.util.NonNullList; - -public class TileFilteredRoutingNode extends TileRoutingNode implements ISidedInventory { - public int currentActiveSlot = 0; - public int[] priorities = new int[6]; - - public ItemInventory itemInventory = new ItemInventory(ItemStack.EMPTY, 9, ""); - - public TileFilteredRoutingNode(int size, String name) { - super(size, name); - } - - public ItemStack getFilterStack(Direction side) { - int index = side.getIndex(); - - return getStackInSlot(index); - } - - public void setGhostItemAmount(int ghostItemSlot, int amount) { - ItemStack stack = itemInventory.getStackInSlot(ghostItemSlot); - if (!stack.isEmpty()) { - GhostItemHelper.setItemGhostAmount(stack, amount); - } - - this.markDirty(); - } - - @Override - public boolean isInventoryConnectedToSide(Direction side) { - return true; - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - currentActiveSlot = tag.getInt("currentSlot"); - priorities = tag.getIntArray(Constants.NBT.ROUTING_PRIORITY); - if (priorities.length != 6) { - priorities = new int[6]; - } - - if (!tag.getBoolean("updated")) { - ListNBT tags = tag.getList("Items", 10); - inventory = NonNullList.withSize(getSizeInventory(), ItemStack.EMPTY); - for (int i = 0; i < tags.tagCount(); i++) { - if (!isSyncedSlot(i)) { - CompoundNBT data = tags.getCompound(i); - byte j = data.getByte("Slot"); - - if (j == 0) { - inventory.set(i, new ItemStack(data)); - } else if (j >= 1 && j < inventory.size() + 1) { - inventory.set(j - 1, new ItemStack(data)); - } - } - } - } - - itemInventory = new ItemInventory(getStackInSlot(currentActiveSlot), 9, ""); - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - tag.putInt("currentSlot", currentActiveSlot); - tag.putIntArray(Constants.NBT.ROUTING_PRIORITY, priorities); - tag.putBoolean("updated", true); - return tag; - } - - public void swapFilters(int requestedSlot) { - currentActiveSlot = requestedSlot; - itemInventory.initializeInventory(getStackInSlot(currentActiveSlot)); - this.markDirty(); - } - - @Override - public int[] getSlotsForFace(Direction side) { - return new int[0]; - } - - @Override - public boolean canInsertItem(int index, ItemStack itemStackIn, Direction direction) { - return false; - } - - @Override - public boolean canExtractItem(int index, ItemStack stack, Direction direction) { - return false; - } - - @Override - public int getPriority(Direction side) { - return priorities[side.getIndex()]; - } - - public void incrementCurrentPriotiryToMaximum(int max) { - priorities[currentActiveSlot] = Math.min(priorities[currentActiveSlot] + 1, max); - BlockState state = getWorld().getBlockState(pos); - getWorld().notifyBlockUpdate(pos, state, state, 3); - } - - public void decrementCurrentPriority() { - priorities[currentActiveSlot] = Math.max(priorities[currentActiveSlot] - 1, 0); - BlockState state = getWorld().getBlockState(pos); - getWorld().notifyBlockUpdate(pos, state, state, 3); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java deleted file mode 100644 index bdc0c21c..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; -import WayofTime.bloodmagic.routing.*; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; - -public class TileInputRoutingNode extends TileFilteredRoutingNode implements IInputItemRoutingNode, IInputFluidRoutingNode { - public TileInputRoutingNode() { - super(6, "inputNode"); - } - - @Override - public boolean isInput(Direction side) { - return true; - } - - @Override - public IItemFilter getInputFilterForSide(Direction side) { - TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null) { - IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) { - ItemStack filterStack = this.getFilterStack(side); - - if (filterStack.isEmpty()) { - IItemFilter filter = new DefaultItemFilter(); - filter.initializeFilter(null, tile, handler, false); - return filter; - } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) { - return null; - } - - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - return filter.getInputItemFilter(filterStack, tile, handler); - } - } - - return null; - } - - @Override - public boolean isFluidInput(Direction side) { - return true; - } - - @Override - public IFluidFilter getInputFluidFilterForSide(Direction side) { - TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - ItemStack filterStack = this.getFilterStack(side); - if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) { - return null; - } - - return ((IFluidFilterProvider) filterStack.getItem()).getInputFluidFilter(filterStack, tile, handler); - } - - return null; - } - - @Override - public boolean isTankConnectedToSide(Direction side) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java deleted file mode 100644 index 6c598390..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileItemRoutingNode.java +++ /dev/null @@ -1,7 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -public class TileItemRoutingNode extends TileRoutingNode { - public TileItemRoutingNode() { - super(0, "itemNode"); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java deleted file mode 100644 index 5391ee41..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileMasterRoutingNode.java +++ /dev/null @@ -1,405 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.soul.EnumDemonWillType; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.routing.*; -import WayofTime.bloodmagic.tile.TileInventory; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.*; -import java.util.Map.Entry; - -public class TileMasterRoutingNode extends TileInventory implements IMasterRoutingNode, ITickable { - public static final int tickRate = 20; - private int currentInput; - // A list of connections - private TreeMap> connectionMap = new TreeMap<>(); - private List generalNodeList = new LinkedList<>(); - private List outputNodeList = new LinkedList<>(); - private List inputNodeList = new LinkedList<>(); - - public TileMasterRoutingNode() { - super(0, "masterRoutingNode"); - } - - @Override - public void update() { - if (!getWorld().isRemote) { -// currentInput = getWorld().isBlockIndirectlyGettingPowered(pos); - currentInput = getWorld().getStrongPower(pos); - -// System.out.println(currentInput); - } - - if (getWorld().isRemote || getWorld().getTotalWorldTime() % tickRate != 0) //Temporary tick rate solver - { - return; - } - - Map> outputMap = new TreeMap<>(); - Map> outputFluidMap = new TreeMap<>(); - - for (BlockPos outputPos : outputNodeList) { - TileEntity outputTile = getWorld().getTileEntity(outputPos); - if (this.isConnected(new LinkedList<>(), outputPos)) { - if (outputTile instanceof IOutputItemRoutingNode) { - IOutputItemRoutingNode outputNode = (IOutputItemRoutingNode) outputTile; - - for (Direction facing : Direction.VALUES) { - if (!outputNode.isInventoryConnectedToSide(facing) || !outputNode.isOutput(facing)) { - continue; - } - - IItemFilter filter = outputNode.getOutputFilterForSide(facing); - if (filter != null) { - int priority = outputNode.getPriority(facing); - if (outputMap.containsKey(priority)) { - outputMap.get(priority).add(filter); - } else { - List filterList = new LinkedList<>(); - filterList.add(filter); - outputMap.put(priority, filterList); - } - } - } - } - - if (outputTile instanceof IOutputFluidRoutingNode) { - IOutputFluidRoutingNode outputNode = (IOutputFluidRoutingNode) outputTile; - - for (Direction facing : Direction.VALUES) { - if (!outputNode.isTankConnectedToSide(facing) || !outputNode.isFluidOutput(facing)) { - continue; - } - - IFluidFilter filter = outputNode.getOutputFluidFilterForSide(facing); - if (filter != null) { - int priority = outputNode.getPriority(facing); - if (outputFluidMap.containsKey(priority)) { - outputFluidMap.get(priority).add(filter); - } else { - List filterList = new LinkedList<>(); - filterList.add(filter); - outputFluidMap.put(priority, filterList); - } - } - } - } - } - } - - Map> inputMap = new TreeMap<>(); - Map> inputFluidMap = new TreeMap<>(); - - for (BlockPos inputPos : inputNodeList) { - TileEntity inputTile = getWorld().getTileEntity(inputPos); - if (this.isConnected(new LinkedList<>(), inputPos)) { - if (inputTile instanceof IInputItemRoutingNode) { - IInputItemRoutingNode inputNode = (IInputItemRoutingNode) inputTile; - - for (Direction facing : Direction.VALUES) { - if (!inputNode.isInventoryConnectedToSide(facing) || !inputNode.isInput(facing)) { - continue; - } - - IItemFilter filter = inputNode.getInputFilterForSide(facing); - if (filter != null) { - int priority = inputNode.getPriority(facing); - if (inputMap.containsKey(priority)) { - inputMap.get(priority).add(filter); - } else { - List filterList = new LinkedList<>(); - filterList.add(filter); - inputMap.put(priority, filterList); - } - } - } - } - - if (inputTile instanceof IInputFluidRoutingNode) { - IInputFluidRoutingNode inputNode = (IInputFluidRoutingNode) inputTile; - - for (Direction facing : Direction.VALUES) { - if (!inputNode.isTankConnectedToSide(facing) || !inputNode.isFluidInput(facing)) { - continue; - } - - IFluidFilter filter = inputNode.getInputFluidFilterForSide(facing); - if (filter != null) { - int priority = inputNode.getPriority(facing); - if (inputFluidMap.containsKey(priority)) { - inputFluidMap.get(priority).add(filter); - } else { - List filterList = new LinkedList<>(); - filterList.add(filter); - inputFluidMap.put(priority, filterList); - } - } - } - } - } - } - - int maxTransfer = this.getMaxTransferForDemonWill(WorldDemonWillHandler.getCurrentWill(getWorld(), pos, EnumDemonWillType.DEFAULT)); - int maxFluidTransfer = 1000; - - for (Entry> outputEntry : outputMap.entrySet()) { - List outputList = outputEntry.getValue(); - for (IItemFilter outputFilter : outputList) { - for (Entry> inputEntry : inputMap.entrySet()) { - List inputList = inputEntry.getValue(); - for (IItemFilter inputFilter : inputList) { - maxTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxTransfer); - if (maxTransfer <= 0) { - return; - } - } - } - } - } - - for (Entry> outputEntry : outputFluidMap.entrySet()) { - List outputList = outputEntry.getValue(); - for (IFluidFilter outputFilter : outputList) { - for (Entry> inputEntry : inputFluidMap.entrySet()) { - List inputList = inputEntry.getValue(); - for (IFluidFilter inputFilter : inputList) { - maxFluidTransfer -= inputFilter.transferThroughInputFilter(outputFilter, maxFluidTransfer); - if (maxFluidTransfer <= 0) { - return; - } - } - } - } - } - } - - public int getMaxTransferForDemonWill(double will) { - return 64; - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - ListNBT tags = new ListNBT(); - for (BlockPos pos : generalNodeList) { - CompoundNBT posTag = new CompoundNBT(); - posTag.putInt(Constants.NBT.X_COORD, pos.getX()); - posTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - posTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - tags.appendTag(posTag); - } - tag.put(Constants.NBT.ROUTING_MASTER_GENERAL, tags); - - tags = new ListNBT(); - for (BlockPos pos : inputNodeList) { - CompoundNBT posTag = new CompoundNBT(); - posTag.putInt(Constants.NBT.X_COORD, pos.getX()); - posTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - posTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - tags.appendTag(posTag); - } - tag.put(Constants.NBT.ROUTING_MASTER_INPUT, tags); - - tags = new ListNBT(); - for (BlockPos pos : outputNodeList) { - CompoundNBT posTag = new CompoundNBT(); - posTag.putInt(Constants.NBT.X_COORD, pos.getX()); - posTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - posTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - tags.appendTag(posTag); - } - tag.put(Constants.NBT.ROUTING_MASTER_OUTPUT, tags); - return tag; - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - - ListNBT tags = tag.getList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); - for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompound(i); - BlockPos newPos = new BlockPos(blockTag.getInt(Constants.NBT.X_COORD), blockTag.getInt(Constants.NBT.Y_COORD), blockTag.getInt(Constants.NBT.Z_COORD)); - generalNodeList.add(newPos); - } - - tags = tag.getList(Constants.NBT.ROUTING_MASTER_INPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompound(i); - BlockPos newPos = new BlockPos(blockTag.getInt(Constants.NBT.X_COORD), blockTag.getInt(Constants.NBT.Y_COORD), blockTag.getInt(Constants.NBT.Z_COORD)); - inputNodeList.add(newPos); - } - - tags = tag.getList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); - for (int i = 0; i < tags.tagCount(); i++) { - CompoundNBT blockTag = tags.getCompound(i); - BlockPos newPos = new BlockPos(blockTag.getInt(Constants.NBT.X_COORD), blockTag.getInt(Constants.NBT.Y_COORD), blockTag.getInt(Constants.NBT.Z_COORD)); - outputNodeList.add(newPos); - } - } - - @Override - public boolean isConnected(List path, BlockPos nodePos) { - //TODO: Figure out how to make it so the path is obtained -// if (!connectionMap.containsKey(nodePos)) -// { -// return false; -// } - TileEntity tile = getWorld().getTileEntity(nodePos); - if (!(tile instanceof IRoutingNode)) { -// connectionMap.remove(nodePos); - return false; - } - - IRoutingNode node = (IRoutingNode) tile; - List connectionList = node.getConnected(); -// List testPath = path.subList(0, path.size()); - path.add(nodePos); - for (BlockPos testPos : connectionList) { - if (path.contains(testPos)) { - continue; - } - - if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) { -// path.clear(); -// path.addAll(testPath); - return true; - } else if (NodeHelper.isNodeConnectionEnabled(getWorld(), node, testPos)) { - if (isConnected(path, testPos)) { -// path.clear(); -// path.addAll(testPath); - return true; - } - } - } - - return false; - } - - @Override - public boolean isConnectionEnabled(BlockPos testPos) { - return currentInput <= 0; - } - - @Override - public void addNodeToList(IRoutingNode node) { - BlockPos newPos = node.getBlockPos(); - if (!generalNodeList.contains(newPos)) { - generalNodeList.add(newPos); - } - if (node instanceof IInputItemRoutingNode && !inputNodeList.contains(newPos)) { - inputNodeList.add(newPos); - } - if (node instanceof IOutputItemRoutingNode && !outputNodeList.contains(newPos)) { - outputNodeList.add(newPos); - } - } - - @Override - public void addConnections(BlockPos pos, List connectionList) { - for (BlockPos testPos : connectionList) { - addConnection(pos, testPos); - } - } - - @Override - public void addConnection(BlockPos pos1, BlockPos pos2) { - if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) { - connectionMap.get(pos1).add(pos2); - } else { - List list = new LinkedList<>(); - list.add(pos2); - connectionMap.put(pos1, list); - } - - if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) { - connectionMap.get(pos2).add(pos1); - } else { - List list = new LinkedList<>(); - list.add(pos1); - connectionMap.put(pos2, list); - } - } - - @Override - public void removeConnection(BlockPos pos1, BlockPos pos2) { - if (connectionMap.containsKey(pos1)) { - List posList = connectionMap.get(pos1); - posList.remove(pos2); - if (posList.isEmpty()) { - connectionMap.remove(pos1); - } - } - - if (connectionMap.containsKey(pos2)) { - List posList = connectionMap.get(pos2); - posList.remove(pos1); - if (posList.isEmpty()) { - connectionMap.remove(pos2); - } - } - } - - @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { - return; - } - - @Override - public BlockPos getBlockPos() { - return this.getPos(); - } - - @Override - public List getConnected() { - return new LinkedList<>(); - } - - @Override - public BlockPos getMasterPos() { - return this.getPos(); - } - - @Override - public boolean isMaster(IMasterRoutingNode master) { - return false; - } - - @Override - public void addConnection(BlockPos pos1) { - // Empty - } - - @Override - public void removeConnection(BlockPos pos1) { - generalNodeList.remove(pos1); - inputNodeList.remove(pos1); - outputNodeList.remove(pos1); - } - - @Override - public void removeAllConnections() { - List list = generalNodeList.subList(0, generalNodeList.size()); - Iterator itr = list.iterator(); - while (itr.hasNext()) { - BlockPos testPos = itr.next(); - TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) { - ((IRoutingNode) tile).removeConnection(pos); - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); - } - - itr.remove(); - inputNodeList.remove(testPos); - outputNodeList.remove(testPos); - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java deleted file mode 100644 index e52757bd..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ /dev/null @@ -1,73 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -import WayofTime.bloodmagic.item.routing.IFluidFilterProvider; -import WayofTime.bloodmagic.item.routing.IItemFilterProvider; -import WayofTime.bloodmagic.routing.*; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.items.IItemHandler; - -public class TileOutputRoutingNode extends TileFilteredRoutingNode implements IOutputItemRoutingNode, IOutputFluidRoutingNode { - public TileOutputRoutingNode() { - super(6, "outputNode"); - } - - @Override - public boolean isOutput(Direction side) { - return true; - } - - @Override - public IItemFilter getOutputFilterForSide(Direction side) { - TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null) { - IItemHandler handler = Utils.getInventory(tile, side.getOpposite()); - if (handler != null) { - ItemStack filterStack = this.getFilterStack(side); - - if (filterStack.isEmpty()) { - IItemFilter filter = new DefaultItemFilter(); - filter.initializeFilter(null, tile, handler, true); - return filter; - } else if (!(filterStack.getItem() instanceof IItemFilterProvider)) { - return null; - } - - IItemFilterProvider filter = (IItemFilterProvider) filterStack.getItem(); - return filter.getOutputItemFilter(filterStack, tile, handler); - } - } - - return null; - } - - @Override - public boolean isFluidOutput(Direction side) { - return true; - } - - @Override - public IFluidFilter getOutputFluidFilterForSide(Direction side) { - TileEntity tile = getWorld().getTileEntity(pos.offset(side)); - if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) { - IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side); - ItemStack filterStack = this.getFilterStack(side); - if (filterStack == null || !(filterStack.getItem() instanceof IFluidFilterProvider)) { - return null; - } - - return ((IFluidFilterProvider) filterStack.getItem()).getOutputFluidFilter(filterStack, tile, handler); - } - - return null; - } - - @Override - public boolean isTankConnectedToSide(Direction side) { - return true; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java deleted file mode 100644 index 3fa08545..00000000 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ /dev/null @@ -1,176 +0,0 @@ -package WayofTime.bloodmagic.tile.routing; - -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.routing.IItemRoutingNode; -import WayofTime.bloodmagic.routing.IMasterRoutingNode; -import WayofTime.bloodmagic.routing.IRoutingNode; -import WayofTime.bloodmagic.tile.TileInventory; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ITickable; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.LinkedList; -import java.util.List; - -public class TileRoutingNode extends TileInventory implements IRoutingNode, IItemRoutingNode, ITickable { - private int currentInput; - private BlockPos masterPos = BlockPos.ORIGIN; - private List connectionList = new LinkedList<>(); - - public TileRoutingNode(int size, String name) { - super(size, name); - } - - @Override - public void update() { - if (!getWorld().isRemote) { - currentInput = getWorld().getRedstonePowerFromNeighbors(pos); -// currentInput = getWorld().getStrongPower(pos); - } - } - - @Override - public CompoundNBT serialize(CompoundNBT tag) { - super.serialize(tag); - CompoundNBT masterTag = new CompoundNBT(); - masterTag.putInt(Constants.NBT.X_COORD, masterPos.getX()); - masterTag.putInt(Constants.NBT.Y_COORD, masterPos.getY()); - masterTag.putInt(Constants.NBT.Z_COORD, masterPos.getZ()); - tag.put(Constants.NBT.ROUTING_MASTER, masterTag); - - ListNBT tags = new ListNBT(); - for (BlockPos pos : connectionList) { - CompoundNBT posTag = new CompoundNBT(); - posTag.putInt(Constants.NBT.X_COORD, pos.getX()); - posTag.putInt(Constants.NBT.Y_COORD, pos.getY()); - posTag.putInt(Constants.NBT.Z_COORD, pos.getZ()); - tags.add(posTag); - } - tag.put(Constants.NBT.ROUTING_CONNECTION, tags); - return tag; - } - - @Override - public void deserialize(CompoundNBT tag) { - super.deserialize(tag); - connectionList.clear(); - CompoundNBT masterTag = tag.getCompound(Constants.NBT.ROUTING_MASTER); - masterPos = new BlockPos(masterTag.getInt(Constants.NBT.X_COORD), masterTag.getInt(Constants.NBT.Y_COORD), masterTag.getInt(Constants.NBT.Z_COORD)); - - ListNBT tags = tag.getList(Constants.NBT.ROUTING_CONNECTION, 10); - for (int i = 0; i < tags.size(); i++) { - CompoundNBT blockTag = tags.getCompound(i); - BlockPos newPos = new BlockPos(blockTag.getInt(Constants.NBT.X_COORD), blockTag.getInt(Constants.NBT.Y_COORD), blockTag.getInt(Constants.NBT.Z_COORD)); - connectionList.add(newPos); - } - } - - @Override - public void removeAllConnections() { - TileEntity testTile = getWorld().getTileEntity(getMasterPos()); - if (testTile instanceof IMasterRoutingNode) { - ((IMasterRoutingNode) testTile).removeConnection(pos); // Remove this node from the master - } - for (BlockPos testPos : connectionList) { - TileEntity tile = getWorld().getTileEntity(testPos); - if (tile instanceof IRoutingNode) { - ((IRoutingNode) tile).removeConnection(pos); - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(testPos), getWorld().getBlockState(testPos), 3); - } - } - - connectionList.clear(); - } - - @Override - public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { - this.masterPos = master.getBlockPos(); - List connectedList = this.getConnected(); - for (BlockPos testPos : connectedList) { - if (alreadyChecked.contains(testPos)) { - continue; - } - alreadyChecked.add(testPos); - TileEntity tile = world.getTileEntity(testPos); - if (!(tile instanceof IRoutingNode)) { - continue; - } - IRoutingNode node = (IRoutingNode) tile; - if (node.getMasterPos().equals(BlockPos.ORIGIN)) //If getMasterPos() returns the origin, the node is not connected to any master. - { - master.addNodeToList(node); - node.connectMasterToRemainingNode(world, alreadyChecked, master); - } - } - - master.addConnections(this.getBlockPos(), connectedList); - } - - @Override - public BlockPos getBlockPos() { - return this.getPos(); - } - - @Override - public List getConnected() { - return connectionList; - } - - @Override - public BlockPos getMasterPos() { - return masterPos; - } - - @Override - public boolean isMaster(IMasterRoutingNode master) { - BlockPos checkPos = master.getBlockPos(); - return checkPos.equals(getMasterPos()); - } - - @Override - public boolean isConnectionEnabled(BlockPos testPos) { - return currentInput <= 0; - } - - @Override - public void addConnection(BlockPos pos1) { - if (!connectionList.contains(pos1)) { - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - connectionList.add(pos1); - } - } - - @Override - public void removeConnection(BlockPos pos1) { - if (connectionList.contains(pos1)) { - connectionList.remove(pos1); - getWorld().notifyBlockUpdate(getPos(), getWorld().getBlockState(getPos()), getWorld().getBlockState(getPos()), 3); - } - - if (pos1.equals(masterPos)) { - this.masterPos = BlockPos.ORIGIN; - } - } - - @Override - public boolean isInventoryConnectedToSide(Direction side) { - return false; - } - - @Override - public int getPriority(Direction side) { - return 0; - } - - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() { - return 10000; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/BMLog.java b/src/main/java/WayofTime/bloodmagic/util/BMLog.java index c6e75232..c3b164a5 100644 --- a/src/main/java/WayofTime/bloodmagic/util/BMLog.java +++ b/src/main/java/WayofTime/bloodmagic/util/BMLog.java @@ -1,63 +1,79 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; import org.apache.commons.lang3.text.WordUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -public enum BMLog { +import wayoftime.bloodmagic.BloodMagic; - DEFAULT(BloodMagic.MODID) { - @Override - boolean enabled() { - return true; - } - }, - DEBUG() { - @Override - boolean enabled() { - return ConfigHandler.general.enableDebugLogging; - } - }, - API() { - @Override - boolean enabled() { - return ConfigHandler.general.enableAPILogging; - } - }, - API_VERBOSE() { - @Override - boolean enabled() { - return ConfigHandler.general.enableVerboseAPILogging; - } - }, - ; +public enum BMLog +{ - private final Logger logger; + DEFAULT(BloodMagic.MODID) + { + @Override + boolean enabled() + { + return true; + } + }, + DEBUG() + { + @Override + boolean enabled() + { + return false; +// return ConfigHandler.general.enableDebugLogging; + } + }, + API() + { + @Override + boolean enabled() + { + return false; +// return ConfigHandler.general.enableAPILogging; + } + }, + API_VERBOSE() + { + @Override + boolean enabled() + { + return false; +// return ConfigHandler.general.enableVerboseAPILogging; + } + },; - BMLog(String logName) { - logger = LogManager.getLogger(logName); - } + private final Logger logger; - BMLog() { - logger = LogManager.getLogger(BloodMagic.MODID + "|" + WordUtils.capitalizeFully(name().replace("_", " "))); - } + BMLog(String logName) + { + logger = LogManager.getLogger(logName); + } - abstract boolean enabled(); + BMLog() + { + logger = LogManager.getLogger(BloodMagic.MODID + "|" + WordUtils.capitalizeFully(name().replace("_", " "))); + } - public void info(String input, Object... args) { - if (enabled()) - logger.info(input, args); - } + abstract boolean enabled(); - public void error(String input, Object... args) { - if (enabled()) - logger.error(input, args); - } + public void info(String input, Object... args) + { + if (enabled()) + logger.info(input, args); + } - public void warn(String input, Object... args) { - if (enabled()) - logger.warn(input, args); - } -} + public void error(String input, Object... args) + { + if (enabled()) + logger.error(input, args); + } + + public void warn(String input, Object... args) + { + if (enabled()) + logger.warn(input, args); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/BlockStack.java b/src/main/java/WayofTime/bloodmagic/util/BlockStack.java deleted file mode 100644 index 426b43fd..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/BlockStack.java +++ /dev/null @@ -1,68 +0,0 @@ -package WayofTime.bloodmagic.util; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -@Deprecated -public class BlockStack { - private final Block block; - private final int meta; - private final BlockState state; - - public BlockStack(Block block, int meta) { - this.block = block; - this.meta = meta; - this.state = block.getStateFromMeta(meta); - } - - public BlockStack(Block block) { - this(block, 0); - } - - public ItemStack getItemStack() { - return new ItemStack(block, 1, meta); - } - - public Block getBlock() { - return block; - } - - public int getMeta() { - return meta; - } - - public BlockState getState() { - return state; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof BlockStack)) return false; - - BlockStack that = (BlockStack) o; - - if (meta != that.meta) return false; - return block != null ? block.equals(that.block) : that.block == null; - } - - @Override - public int hashCode() { - int result = block != null ? block.hashCode() : 0; - result = 31 * result + meta; - return result; - } - - @Override - public String toString() { - return getBlock().getRegistryName() + ":" + getMeta(); - } - - public static BlockStack getStackFromPos(World world, BlockPos pos) { - BlockState state = world.getBlockState(pos); - return new BlockStack(state.getBlock(), state.getBlock().getMetaFromState(state)); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java b/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java index c4cb571f..1bba4aa6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java +++ b/src/main/java/WayofTime/bloodmagic/util/BooleanResult.java @@ -1,24 +1,28 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; -public class BooleanResult { +public class BooleanResult +{ + private final boolean result; + private final T value; - private final boolean result; - private final T value; + private BooleanResult(boolean result, T value) + { + this.result = result; + this.value = value; + } - private BooleanResult(boolean result, T value) { - this.result = result; - this.value = value; - } + public boolean isSuccess() + { + return result; + } - public boolean isSuccess() { - return result; - } + public T getValue() + { + return value; + } - public T getValue() { - return value; - } - - public static BooleanResult newResult(boolean success, T value) { - return new BooleanResult<>(success, value); - } -} + public static BooleanResult newResult(boolean success, T value) + { + return new BooleanResult<>(success, value); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java index 8a792f99..1bc22f5b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java +++ b/src/main/java/WayofTime/bloodmagic/util/ChatUtil.java @@ -1,227 +1,270 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; + +import java.text.DecimalFormat; +import java.util.function.Supplier; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.util.helper.TextHelper; -import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.NewChatGui; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.Util; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TranslationTextComponent; -import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.common.network.simpleimpl.IMessage; -import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; -import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.network.NetworkEvent.Context; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.util.helper.TextHelper; -public class ChatUtil { - private static final int DELETION_ID = 2525277; - private static int lastAdded; +public class ChatUtil +{ + private static final int DELETION_ID = 2525277; + private static int lastAdded; + public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("###,###.##"); - private static void sendNoSpamMessages(ITextComponent[] messages) { - NewChatGui chat = Minecraft.getInstance().ingameGUI.getChatGUI(); - for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) { - chat.deleteChatLine(i); - } - for (int i = 0; i < messages.length; i++) { - chat.printChatMessageWithOptionalDeletion(messages[i], DELETION_ID + i); - } - lastAdded = DELETION_ID + messages.length - 1; - } + private static void sendNoSpamMessages(ITextComponent[] messages) + { + NewChatGui chat = Minecraft.getInstance().ingameGUI.getChatGUI(); +// Minecraft.getMinecraft().ingameGUI.getChatGUI(); +// for (int i = DELETION_ID + messages.length - 1; i <= lastAdded; i++) +// { +// chat. +//// chat.deleteChatLine(i); +// } + for (int i = 0; i < messages.length; i++) + { + chat.printChatMessage(messages[i]); +// chat.printChatMessageWithOptionalDeletion(messages[i], DELETION_ID + i); + } + lastAdded = DELETION_ID + messages.length - 1; + } - /** - * Returns a standard {@link StringTextComponent} for the given - * {@link String} . - * - * @param s The string to wrap. - * @return An {@link ITextComponent} containing the string. - */ - public static ITextComponent wrap(String s) { - return new StringTextComponent(s); - } + /** + * Returns a standard {@link TextComponentString} for the given {@link String} . + * + * @param s The string to wrap. + * @return An {@link ITextComponent} containing the string. + */ + public static ITextComponent wrap(String s) + { + return new StringTextComponent(s); + } - /** - * @see #wrap(String) - */ - public static ITextComponent[] wrap(String... s) { - ITextComponent[] ret = new ITextComponent[s.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = wrap(s[i]); - } - return ret; - } + /** + * @see #wrap(String) + */ + public static ITextComponent[] wrap(String... s) + { + ITextComponent[] ret = new ITextComponent[s.length]; + for (int i = 0; i < ret.length; i++) + { + ret[i] = wrap(s[i]); + } + return ret; + } - /** - * Returns a translatable chat component for the given string and format - * args. - * - * @param s The string to format - * @param args The args to apply to the format - */ - public static ITextComponent wrapFormatted(String s, Object... args) { - return new TranslationTextComponent(s, args); - } + /** + * Returns a translatable chat component for the given string and format args. + * + * @param s The string to format + * @param args The args to apply to the format + */ + public static ITextComponent wrapFormatted(String s, Object... args) + { + return new TranslationTextComponent(s, args); + } - /** - * Simply sends the passed lines to the player in a chat message. - * - * @param player The player to send the chat to - * @param lines The lines to send - */ - public static void sendChat(PlayerEntity player, String... lines) { - sendChat(player, wrap(lines)); - } + /** + * Simply sends the passed lines to the player in a chat message. + * + * @param player The player to send the chat to + * @param lines The lines to send + */ + public static void sendChat(PlayerEntity player, String... lines) + { + sendChat(player, wrap(lines)); + } - /** - * Localizes the lines before sending them. - * - * @see #sendChat(PlayerEntity, String...) - */ - public static void sendChatUnloc(PlayerEntity player, String... unlocLines) { - sendChat(player, TextHelper.localizeAll(unlocLines)); - } + /** + * Localizes the lines before sending them. + * + * @see #sendChat(EntityPlayer, String...) + */ + public static void sendChatUnloc(PlayerEntity player, String... unlocLines) + { + sendChat(player, TextHelper.localizeAll(unlocLines)); + } - /** - * Sends all passed chat components to the player. - * - * @param player The player to send the chat lines to. - * @param lines The {@link ITextComponent chat components} to send.yes - */ - public static void sendChat(PlayerEntity player, ITextComponent... lines) { - for (ITextComponent c : lines) { - player.sendMessage(c); - } - } + /** + * Sends all passed chat components to the player. + * + * @param player The player to send the chat lines to. + * @param lines The {@link ITextComponent chat components} to send.yes + */ + public static void sendChat(PlayerEntity player, ITextComponent... lines) + { + for (ITextComponent c : lines) + { +// BloodMagic.packetHandler.send + player.sendMessage(c, Util.DUMMY_UUID); +// player.sendMessage(c); + } + } - /** - * Localizes the strings before sending them. - * - * @see #sendNoSpamClient(String...) - */ - public static void sendNoSpamClientUnloc(String... unlocLines) { - sendNoSpamClient(TextHelper.localizeAll(unlocLines)); - } + /** + * Localizes the strings before sending them. + * + * @see #sendNoSpamClient(String...) + */ + public static void sendNoSpamClientUnloc(String... unlocLines) + { + sendNoSpamClient(TextHelper.localizeAll(unlocLines)); + } - /** - * Same as {@link #sendNoSpamClient(ITextComponent...)}, but wraps the - * Strings automatically. - * - * @param lines The chat lines to send - * @see #wrap(String) - */ - public static void sendNoSpamClient(String... lines) { - sendNoSpamClient(wrap(lines)); - } + /** + * Same as {@link #sendNoSpamClient(ITextComponent...)}, but wraps the Strings + * automatically. + * + * @param lines The chat lines to send + * @see #wrap(String) + */ + public static void sendNoSpamClient(String... lines) + { + sendNoSpamClient(wrap(lines)); + } - /** - * Skips the packet sending, unsafe to call on servers. - * - * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) - */ - public static void sendNoSpamClient(ITextComponent... lines) { - sendNoSpamMessages(lines); - } + /** + * Skips the packet sending, unsafe to call on servers. + * + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) + */ + public static void sendNoSpamClient(ITextComponent... lines) + { + sendNoSpamMessages(lines); + } - /** - * Localizes the strings before sending them. - * - * @see #sendNoSpam(PlayerEntity, String...) - */ - public static void sendNoSpamUnloc(PlayerEntity player, String... unlocLines) { - sendNoSpam(player, TextHelper.localizeAll(unlocLines)); - } + /** + * Localizes the strings before sending them. + * + * @see #sendNoSpam(EntityPlayer, String...) + */ + public static void sendNoSpamUnloc(PlayerEntity player, String... unlocLines) + { + sendNoSpam(player, TextHelper.localizeAll(unlocLines)); + } - /** - * @see #wrap(String) - * @see #sendNoSpam(PlayerEntity, ITextComponent...) - */ - public static void sendNoSpam(PlayerEntity player, String... lines) { - sendNoSpam(player, wrap(lines)); - } + /** + * @see #wrap(String) + * @see #sendNoSpam(EntityPlayer, ITextComponent...) + */ + public static void sendNoSpam(PlayerEntity player, String... lines) + { + sendNoSpam(player, wrap(lines)); + } - /** - * First checks if the player is instanceof {@link ServerPlayerEntity} before - * casting. - * - * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) - */ - public static void sendNoSpam(PlayerEntity player, ITextComponent... lines) { - if (player instanceof ServerPlayerEntity) { - sendNoSpam((ServerPlayerEntity) player, lines); - } - } + /** + * First checks if the player is instanceof {@link ServerPlayerEntity} before + * casting. + * + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) + */ + public static void sendNoSpam(PlayerEntity player, ITextComponent... lines) + { + if (player instanceof ServerPlayerEntity) + { + sendNoSpam((ServerPlayerEntity) player, lines); + } + } - /** - * Localizes the strings before sending them. - * - * @see #sendNoSpam(ServerPlayerEntity, String...) - */ - public static void sendNoSpamUnloc(ServerPlayerEntity player, String... unlocLines) { - sendNoSpam(player, TextHelper.localizeAll(unlocLines)); - } + /** + * Localizes the strings before sending them. + * + * @see #sendNoSpam(ServerPlayerEntity, String...) + */ + public static void sendNoSpamUnloc(ServerPlayerEntity player, String... unlocLines) + { + sendNoSpam(player, TextHelper.localizeAll(unlocLines)); + } - /** - * @see #wrap(String) - * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) - */ - public static void sendNoSpam(ServerPlayerEntity player, String... lines) { - sendNoSpam(player, wrap(lines)); - } + /** + * @see #wrap(String) + * @see #sendNoSpam(ServerPlayerEntity, ITextComponent...) + */ + public static void sendNoSpam(ServerPlayerEntity player, String... lines) + { + sendNoSpam(player, wrap(lines)); + } - /** - * Sends a chat message to the client, deleting past messages also sent via - * this method. - *

- * Credit to RWTema for the idea - * - * @param player The player to send the chat message to - * @param lines The chat lines to send. - */ - public static void sendNoSpam(ServerPlayerEntity player, ITextComponent... lines) { - if (lines.length > 0) - BloodMagicPacketHandler.INSTANCE.sendTo(new PacketNoSpamChat(lines), player); - } + /** + * Sends a chat message to the client, deleting past messages also sent via this + * method. + *

+ * Credit to RWTema for the idea + * + * @param player The player to send the chat message to + * @param lines The chat lines to send. + */ + public static void sendNoSpam(ServerPlayerEntity player, ITextComponent... lines) + { + if (lines.length > 0) + BloodMagic.packetHandler.sendTo(new PacketNoSpamChat(lines), player); + } - /** - * @author tterrag1098 - *

- * Ripped from EnderCore (and slightly altered) - */ - public static class PacketNoSpamChat implements IMessage { - private ITextComponent[] chatLines; + /** + * @author tterrag1098 + *

+ * Ripped from EnderCore (and slightly altered) + */ + public static class PacketNoSpamChat + { + private ITextComponent[] chatLines; - public PacketNoSpamChat() { - chatLines = new ITextComponent[0]; - } + public PacketNoSpamChat() + { + chatLines = new ITextComponent[0]; + } - private PacketNoSpamChat(ITextComponent... lines) { - // this is guaranteed to be >1 length by accessing methods - this.chatLines = lines; - } + private PacketNoSpamChat(ITextComponent... lines) + { + // this is guaranteed to be >1 length by accessing methods + this.chatLines = lines; + } - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(chatLines.length); - for (ITextComponent c : chatLines) { - ByteBufUtils.writeUTF8String(buf, ITextComponent.Serializer.componentToJson(c)); - } - } + public static void encode(PacketNoSpamChat pkt, PacketBuffer buf) + { + buf.writeInt(pkt.chatLines.length); + for (ITextComponent c : pkt.chatLines) + { +// ByteBufUtils.writeUTF8String(buf, ITextComponent.Serializer.componentToJson(c)); + buf.writeString(ITextComponent.Serializer.toJson(c)); + } + } - @Override - public void fromBytes(ByteBuf buf) { - chatLines = new ITextComponent[buf.readInt()]; - for (int i = 0; i < chatLines.length; i++) { - chatLines[i] = ITextComponent.Serializer.jsonToComponent(ByteBufUtils.readUTF8String(buf)); - } - } + public static PacketNoSpamChat decode(PacketBuffer buf) + { + PacketNoSpamChat pkt = new PacketNoSpamChat(new ITextComponent[buf.readInt()]); + for (int i = 0; i < pkt.chatLines.length; i++) + { +// pkt.chatLines[i] = ITextComponent.Serializer.jsonToComponent(ByteBufUtils.readUTF8String(buf)); + pkt.chatLines[i] = ITextComponent.Serializer.getComponentFromJsonLenient(buf.readString()); + } + return pkt; + } - public static class Handler implements IMessageHandler { - @Override - public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) { - Minecraft.getInstance().addScheduledTask(() -> sendNoSpamMessages(message.chatLines)); - return null; - } - } - } -} + public static void handle(PacketNoSpamChat message, Supplier context) + { + context.get().enqueueWork(() -> sendNoSpamMessages(message.chatLines)); + context.get().setPacketHandled(true); + } + +// public static class Handler implements IMessageHandler +// { +// @Override +// public IMessage onMessage(final PacketNoSpamChat message, MessageContext ctx) +// { +// Minecraft.getMinecraft().addScheduledTask(() -> sendNoSpamMessages(message.chatLines)); +// return null; +// } +// } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/Constants.java b/src/main/java/WayofTime/bloodmagic/util/Constants.java index 7e5eb83f..7821f745 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/util/Constants.java @@ -1,170 +1,170 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; -import WayofTime.bloodmagic.BloodMagic; -import net.minecraft.item.Item; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import wayoftime.bloodmagic.BloodMagic; -import java.util.Locale; +public class Constants +{ + public static final String SPEED_RUNE = "speed_rune"; -public class Constants { - public static class NBT { - public static final String OWNER_UUID = "ownerUUID"; - public static final String OWNER_NAME = "ownerNAME"; - public static final String USES = "uses"; - public static final String ACTIVATED = "activated"; - public static final String UNUSABLE = "unusable"; - public static final String SACRIFICE = "sacrifice"; - public static final String DIMENSION_ID = "dimensionId"; - public static final String X_COORD = "xCoord"; - public static final String Y_COORD = "yCoord"; - public static final String Z_COORD = "zCoord"; - public static final String PORTAL_LOCATION = "portalLocation"; - public static final String ORB_TIER = "orbTier"; - public static final String CURRENT_ESSENCE = "currentEssence"; - public static final String CURRENT_RITUAL = "currentRitual"; - public static final String CURRENT_RITUAL_TAG = "currentRitualTag"; - public static final String IS_RUNNING = "isRunning"; - public static final String IS_REDSTONED = "isStoned"; - public static final String RUNTIME = "runtime"; - public static final String DIRECTION = "direction"; - public static final String REAGENT_TANKS = "reagentTanks"; - public static final String CURRENT_INCENSE = "BM:CurrentIncense"; - public static final String MAX_INCENSE = "BM:MaxIncenseFromLastAltar"; - public static final String HAS_MAX_INCENSE = "BM:CurrentIsMaxIncense"; - public static final String CURRENT_PURITY = "BM:CurrentPurity"; - public static final String EMPTY = "Empty"; - public static final String OUTPUT_AMOUNT = "outputAmount"; - public static final String INPUT_AMOUNT = "inputAmount"; - public static final String STORED_LP = "storedLP"; - public static final String RITUAL_READER = "ritualReaderState"; - public static final String ITEMS = "Items"; - public static final String SLOT = "Slot"; + public static class NBT + { + public static final String OWNER_UUID = "ownerUUID"; + public static final String OWNER_NAME = "ownerNAME"; + public static final String USES = "uses"; + public static final String ACTIVATED = "activated"; + public static final String UNUSABLE = "unusable"; + public static final String SACRIFICE = "sacrifice"; + public static final String DIMENSION_ID = "dimensionId"; + public static final String X_COORD = "xCoord"; + public static final String Y_COORD = "yCoord"; + public static final String Z_COORD = "zCoord"; + public static final String PORTAL_LOCATION = "portalLocation"; + public static final String ORB_TIER = "orbTier"; + public static final String CURRENT_ESSENCE = "currentEssence"; + public static final String CURRENT_RITUAL = "currentRitual"; + public static final String CURRENT_RITUAL_TAG = "currentRitualTag"; + public static final String IS_RUNNING = "isRunning"; + public static final String IS_REDSTONED = "isStoned"; + public static final String RUNTIME = "runtime"; + public static final String DIRECTION = "direction"; + public static final String REAGENT_TANKS = "reagentTanks"; + public static final String CURRENT_INCENSE = "BM:CurrentIncense"; + public static final String MAX_INCENSE = "BM:MaxIncenseFromLastAltar"; + public static final String HAS_MAX_INCENSE = "BM:CurrentIsMaxIncense"; + public static final String CURRENT_PURITY = "BM:CurrentPurity"; + public static final String EMPTY = "Empty"; + public static final String OUTPUT_AMOUNT = "outputAmount"; + public static final String INPUT_AMOUNT = "inputAmount"; + public static final String STORED_LP = "storedLP"; + public static final String RITUAL_READER = "ritualReaderState"; + public static final String ITEMS = "Items"; + public static final String SLOT = "Slot"; - public static final String ALTAR = "bloodAltar"; - public static final String ALTAR_TIER = "upgradeLevel"; - public static final String ALTAR_ACTIVE = "isActive"; - public static final String ALTAR_LIQUID_REQ = "liquidRequired"; - public static final String ALTAR_FILLABLE = "fillable"; - public static final String ALTAR_UPGRADED = "isUpgraded"; - public static final String ALTAR_CONSUMPTION_RATE = "consumptionRate"; - public static final String ALTAR_DRAIN_RATE = "drainRate"; - public static final String ALTAR_CONSUMPTION_MULTIPLIER = "consumptionMultiplier"; - public static final String ALTAR_EFFICIENCY_MULTIPLIER = "efficiencyMultiplier"; - public static final String ALTAR_SELF_SACRIFICE_MULTIPLIER = "selfSacrificeMultiplier"; - public static final String ALTAR_SACRIFICE_MULTIPLIER = "sacrificeMultiplier"; - public static final String ALTAR_CAPACITY_MULTIPLIER = "capacityMultiplier"; - public static final String ALTAR_ORB_CAPACITY_MULTIPLIER = "orbCapacityMultiplier"; - public static final String ALTAR_DISLOCATION_MULTIPLIER = "dislocationMultiplier"; - public static final String ALTAR_CAPACITY = "capacity"; - public static final String ALTAR_BUFFER_CAPACITY = "bufferCapacity"; - public static final String ALTAR_PROGRESS = "progress"; - public static final String ALTAR_IS_RESULT_BLOCK = "isResultBlock"; - public static final String ALTAR_LOCKDOWN_DURATION = "lockdownDuration"; - public static final String ALTAR_ACCELERATION_UPGRADES = "accelerationUpgrades"; - public static final String ALTAR_DEMON_BLOOD_DURATION = "demonBloodDuration"; - public static final String ALTAR_COOLDOWN_AFTER_CRAFTING = "cooldownAfterCrafting"; - public static final String ALTAR_TOTAL_CHARGE = "totalCharge"; - public static final String ALTAR_MAX_CHARGE = "maxCharge"; - public static final String ALTAR_CHARGE_RATE = "chargeRate"; - public static final String ALTAR_CHARGE_FREQUENCY = "chargeFrequency"; - public static final String ALTAR_CURRENT_TIER_DISPLAYED = "currentTierDisplayed"; + public static final String ALTAR = "bloodAltar"; + public static final String ALTAR_TIER = "upgradeLevel"; + public static final String ALTAR_ACTIVE = "isActive"; + public static final String ALTAR_LIQUID_REQ = "liquidRequired"; + public static final String ALTAR_FILLABLE = "fillable"; + public static final String ALTAR_UPGRADED = "isUpgraded"; + public static final String ALTAR_CONSUMPTION_RATE = "consumptionRate"; + public static final String ALTAR_DRAIN_RATE = "drainRate"; + public static final String ALTAR_CONSUMPTION_MULTIPLIER = "consumptionMultiplier"; + public static final String ALTAR_EFFICIENCY_MULTIPLIER = "efficiencyMultiplier"; + public static final String ALTAR_SELF_SACRIFICE_MULTIPLIER = "selfSacrificeMultiplier"; + public static final String ALTAR_SACRIFICE_MULTIPLIER = "sacrificeMultiplier"; + public static final String ALTAR_CAPACITY_MULTIPLIER = "capacityMultiplier"; + public static final String ALTAR_ORB_CAPACITY_MULTIPLIER = "orbCapacityMultiplier"; + public static final String ALTAR_DISLOCATION_MULTIPLIER = "dislocationMultiplier"; + public static final String ALTAR_CAPACITY = "capacity"; + public static final String ALTAR_BUFFER_CAPACITY = "bufferCapacity"; + public static final String ALTAR_PROGRESS = "progress"; + public static final String ALTAR_IS_RESULT_BLOCK = "isResultBlock"; + public static final String ALTAR_LOCKDOWN_DURATION = "lockdownDuration"; + public static final String ALTAR_ACCELERATION_UPGRADES = "accelerationUpgrades"; + public static final String ALTAR_DEMON_BLOOD_DURATION = "demonBloodDuration"; + public static final String ALTAR_COOLDOWN_AFTER_CRAFTING = "cooldownAfterCrafting"; + public static final String ALTAR_TOTAL_CHARGE = "totalCharge"; + public static final String ALTAR_MAX_CHARGE = "maxCharge"; + public static final String ALTAR_CHARGE_RATE = "chargeRate"; + public static final String ALTAR_CHARGE_FREQUENCY = "chargeFrequency"; + public static final String ALTAR_CURRENT_TIER_DISPLAYED = "currentTierDisplayed"; - public static final String ALTARMAKER_CURRENT_TIER = "currentTier"; + public static final String ALTARMAKER_CURRENT_TIER = "currentTier"; - public static final String PROJECTILE_TICKS_IN_AIR = "projectileTicksInAir"; - public static final String PROJECTILE_MAX_TICKS_IN_AIR = "projectileMaxTicksInAir"; + public static final String PROJECTILE_TICKS_IN_AIR = "projectileTicksInAir"; + public static final String PROJECTILE_MAX_TICKS_IN_AIR = "projectileMaxTicksInAir"; - public static final String TICKS_REMAINING = "ticksRemaining"; - public static final String CONTAINED_BLOCK_NAME = "containedBlockName"; - public static final String CONTAINED_BLOCK_META = "containedBlockMeta"; - public static final String CONTAINED_TILE_ENTITY = "containedTileEntity"; + public static final String TICKS_REMAINING = "ticksRemaining"; + public static final String CONTAINED_BLOCK_NAME = "containedBlockName"; + public static final String CONTAINED_BLOCK_META = "containedBlockMeta"; + public static final String CONTAINED_TILE_ENTITY = "containedTileEntity"; - public static final String PREVIOUS_INPUT = "previousInput"; + public static final String PREVIOUS_INPUT = "previousInput"; - public static final String LIVING_ARMOUR = "livingArmour"; + public static final String LIVING_ARMOUR = "livingArmour"; - public static final String CHARGE_TIME = "chargeTime"; - public static final String HELD_DOWN = "heldDown"; + public static final String CHARGE_TIME = "chargeTime"; + public static final String HELD_DOWN = "heldDown"; - public static final String UPGRADE_POISON_TIMER = "poisonTimer"; - public static final String UPGRADE_FIRE_TIMER = "fireTimer"; + public static final String UPGRADE_POISON_TIMER = "poisonTimer"; + public static final String UPGRADE_FIRE_TIMER = "fireTimer"; - public static final String SOULS = "souls"; - public static final String SOUL_SWORD_DAMAGE = "soulSwordDamage"; - public static final String SOUL_SWORD_ACTIVE_DRAIN = "soulSwordActiveDrain"; - public static final String SOUL_SWORD_DROP = "soulSwordDrop"; - public static final String SOUL_SWORD_STATIC_DROP = "soulSwordStaticDrop"; - public static final String SOUL_SWORD_HEALTH = "soulSwordHealth"; - public static final String SOUL_SWORD_ATTACK_SPEED = "soulSwordAttackSpeed"; - public static final String SOUL_SWORD_SPEED = "soulSwordSpeed"; - public static final String SOUL_SWORD_DIG_SPEED = "soulSwordDigSpeed"; - public static final String WILL_TYPE = "demonWillType"; + public static final String SOULS = "souls"; + public static final String SOUL_SWORD_DAMAGE = "soulSwordDamage"; + public static final String SOUL_SWORD_ACTIVE_DRAIN = "soulSwordActiveDrain"; + public static final String SOUL_SWORD_DROP = "soulSwordDrop"; + public static final String SOUL_SWORD_STATIC_DROP = "soulSwordStaticDrop"; + public static final String SOUL_SWORD_HEALTH = "soulSwordHealth"; + public static final String SOUL_SWORD_ATTACK_SPEED = "soulSwordAttackSpeed"; + public static final String SOUL_SWORD_SPEED = "soulSwordSpeed"; + public static final String SOUL_SWORD_DIG_SPEED = "soulSwordDigSpeed"; + public static final String WILL_TYPE = "demonWillType"; - public static final String SOUL_FORGE_BURN = "burnTime"; - public static final String SOUL_FORGE_CONSUMED = "consumedSouls"; + public static final String SOUL_FORGE_BURN = "burnTime"; + public static final String SOUL_FORGE_CONSUMED = "consumedSouls"; - public static final String ROUTING_MASTER = "master"; - public static final String ROUTING_CONNECTION = "connections"; - public static final String ROUTING_PRIORITY = "prioritiesPeople"; - public static final String ROUTING_MASTER_GENERAL = "generalList"; - public static final String ROUTING_MASTER_INPUT = "inputList"; - public static final String ROUTING_MASTER_OUTPUT = "outputList"; + public static final String ROUTING_MASTER = "master"; + public static final String ROUTING_CONNECTION = "connections"; + public static final String ROUTING_PRIORITY = "prioritiesPeople"; + public static final String ROUTING_MASTER_GENERAL = "generalList"; + public static final String ROUTING_MASTER_INPUT = "inputList"; + public static final String ROUTING_MASTER_OUTPUT = "outputList"; - public static final String GHOST_STACK_SIZE = "stackSize"; + public static final String GHOST_STACK_SIZE = "stackSize"; - public static final String ITEM_INVENTORY = "itemInventory"; + public static final String ITEM_INVENTORY = "itemInventory"; - public static final String BLOCKPOS_CONNECTION = "connections"; + public static final String BLOCKPOS_CONNECTION = "connections"; - public static final String CURRENT_SIGIL = "currentSigil"; - public static final String MOST_SIG = "mostSig"; - public static final String LEAST_SIG = "leastSig"; - public static final String COLOR = "color"; + public static final String CURRENT_SIGIL = "currentSigil"; + public static final String MOST_SIG = "mostSig"; + public static final String LEAST_SIG = "leastSig"; + public static final String COLOR = "color"; - public static final String POTION_AUGMENT_LENGHT = "length:"; - public static final String POTION_AUGMENT_STRENGTH = "strength:"; - public static final String POTION_IMPURITY = "impurity"; + public static final String POTION_AUGMENT_LENGHT = "length:"; + public static final String POTION_AUGMENT_STRENGTH = "strength:"; + public static final String POTION_IMPURITY = "impurity"; - public static final String TANK = "tank"; + public static final String TANK = "tank"; - public static final String BREATH = "breath"; - } + public static final String BREATH = "breath"; + } - public static class Mod { - public static final String DOMAIN = BloodMagic.MODID.toLowerCase(Locale.ENGLISH) + ":"; - } + public static class JSON + { + public static final String INPUT = "input"; + public static final String BASEINPUT = "baseinput"; + public static final String ADDEDINPUT = "addedinput"; + public static final String OUTPUT = "output"; + public static final String ITEM = "item"; + public static final String COUNT = "count"; + public static final String NBT = "nbt"; + public static final String TYPE = "type"; + public static final String TEXTURE = "texture"; + public static final String CONDITIONS = "conditions"; - public static final class Gui { - public static final int TELEPOSER_GUI = 0; - public static final int SOUL_FORGE_GUI = 1; - public static final int ROUTING_NODE_GUI = 2; - public static final int MASTER_ROUTING_NODE_GUI = 3; - public static final int ALCHEMY_TABLE_GUI = 4; - public static final int SIGIL_HOLDING_GUI = 5; - } + public static final String ALTAR_TIER = Constants.NBT.ALTAR_TIER; + public static final String ALTAR_SYPHON = "altarSyphon"; + public static final String ALTAR_CONSUMPTION_RATE = Constants.NBT.ALTAR_CONSUMPTION_RATE; + public static final String ALTAR_DRAIN_RATE = Constants.NBT.ALTAR_DRAIN_RATE; - public static class Compat { - public static final String JEI_CATEGORY_ALTAR = BloodMagic.MODID + ":altar"; - public static final String JEI_CATEGORY_BINDING = BloodMagic.MODID + ":binding"; - public static final String JEI_CATEGORY_ALCHEMYARRAY = BloodMagic.MODID + ":alchemyArray"; - public static final String JEI_CATEGORY_SOULFORGE = BloodMagic.MODID + ":soulForge"; - public static final String JEI_CATEGORY_ALCHEMYTABLE = BloodMagic.MODID + ":salchemyTable"; - public static final String JEI_CATEGORY_ARMOURDOWNGRADE = BloodMagic.MODID + ":armourDowngrade"; + public static final String TARTARIC_DRAIN = "drain"; + public static final String TARTARIC_MINIMUM = "minimumDrain"; + } - public static final String WAILA_CONFIG_ALTAR = BloodMagic.MODID + ".bloodAltar"; - public static final String WAILA_CONFIG_TELEPOSER = BloodMagic.MODID + ".teleposer"; - public static final String WAILA_CONFIG_RITUAL = BloodMagic.MODID + ".ritualController"; - public static final String WAILA_CONFIG_ARRAY = BloodMagic.MODID + ".array"; - public static final String WAILA_CONFIG_BLOOD_TANK = BloodMagic.MODID + ".bloodTank"; + public static class Compat + { + public static final String JEI_CATEGORY_ALTAR = "altar"; + public static final String JEI_CATEGORY_BINDING = "binding"; + public static final String JEI_CATEGORY_ALCHEMYARRAY = "alchemyarray"; + public static final String JEI_CATEGORY_SOULFORGE = "soulforge"; + public static final String JEI_CATEGORY_ALCHEMYTABLE = "alchemytable"; + public static final String JEI_CATEGORY_ARMOURDOWNGRADE = "armourdowngrade"; - public static final Item THAUMCRAFT_GOGGLES = ForgeRegistries.ITEMS.getValue(new ResourceLocation("Thaumcraft", "goggles")); - } - - public static class Misc { - public static final int POTION_ARRAY_SIZE = 256; - public static final float ALTERED_STEP_HEIGHT = 1.00314159f; - public static final int NIGHT_VISION_CONSTANT_BEGIN = 30020; - public static final int NIGHT_VISION_CONSTANT_END = 30000; - } + public static final String WAILA_CONFIG_ALTAR = BloodMagic.MODID + ".bloodaltar"; + public static final String WAILA_CONFIG_TELEPOSER = BloodMagic.MODID + ".teleposer"; + public static final String WAILA_CONFIG_RITUAL = BloodMagic.MODID + ".ritualController"; + public static final String WAILA_CONFIG_ARRAY = BloodMagic.MODID + ".array"; + public static final String WAILA_CONFIG_BLOOD_TANK = BloodMagic.MODID + ".bloodTank"; + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java index 3025075b..82d69ee7 100644 --- a/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/util/DamageSourceBloodMagic.java @@ -1,24 +1,26 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; -import WayofTime.bloodmagic.util.helper.TextHelper; import net.minecraft.entity.LivingEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; +import wayoftime.bloodmagic.util.helper.TextHelper; -public class DamageSourceBloodMagic extends DamageSource { +public class DamageSourceBloodMagic extends DamageSource +{ + public static final DamageSourceBloodMagic INSTANCE = new DamageSourceBloodMagic(); - public static final DamageSourceBloodMagic INSTANCE = new DamageSourceBloodMagic(); + public DamageSourceBloodMagic() + { + super("bloodMagic"); - public DamageSourceBloodMagic() { - super("bloodMagic"); + setDamageBypassesArmor(); + setDamageIsAbsolute(); + } - setDamageBypassesArmor(); - setDamageIsAbsolute(); - } - - @Override - public ITextComponent getDeathMessage(LivingEntity livingBase) { - return new StringTextComponent(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); - } -} + @Override + public ITextComponent getDeathMessage(LivingEntity livingBase) + { + return new StringTextComponent(TextHelper.localizeEffect("chat.bloodmagic.damageSource", livingBase.getName())); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java deleted file mode 100644 index 5621e3f0..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java +++ /dev/null @@ -1,56 +0,0 @@ -package WayofTime.bloodmagic.util; - -import WayofTime.bloodmagic.util.helper.NBTHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -public class GhostItemHelper { - public static void setItemGhostAmount(ItemStack stack, int amount) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - tag.putInt(Constants.NBT.GHOST_STACK_SIZE, amount); - } - - public static int getItemGhostAmount(ItemStack stack) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getInt(Constants.NBT.GHOST_STACK_SIZE); - } - - public static boolean hasGhostAmount(ItemStack stack) { - if (!stack.hasTagCompound()) { - return false; - } - - CompoundNBT tag = stack.getTagCompound(); - return tag.hasKey(Constants.NBT.GHOST_STACK_SIZE); - } - - public static void incrementGhostAmout(ItemStack stack, int value) { - int amount = getItemGhostAmount(stack); - amount += value; - setItemGhostAmount(stack, amount); - } - - public static void decrementGhostAmount(ItemStack stack, int value) { - int amount = getItemGhostAmount(stack); - amount -= value; - setItemGhostAmount(stack, amount); - } - - public static ItemStack getStackFromGhost(ItemStack ghostStack) { - ItemStack newStack = ghostStack.copy(); - NBTHelper.checkNBT(newStack); - CompoundNBT tag = newStack.getTagCompound(); - int amount = getItemGhostAmount(ghostStack); - tag.removeTag(Constants.NBT.GHOST_STACK_SIZE); - if (tag.isEmpty()) { - newStack.setTagCompound(null); - } - newStack.setCount(amount); - - return newStack; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java b/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java deleted file mode 100644 index f035728e..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/ISigilFluidItem.java +++ /dev/null @@ -1,14 +0,0 @@ -package WayofTime.bloodmagic.util; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -public interface ISigilFluidItem { - FluidStack getFluid(ItemStack sigil); - - int getCapacity(ItemStack sigil); - - int fill(ItemStack sigil, FluidStack resource, boolean doFill); - - FluidStack drain(ItemStack sigil, int maxDrain, boolean doDrain); -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java b/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java deleted file mode 100644 index 771492c2..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/ItemStackWrapper.java +++ /dev/null @@ -1,113 +0,0 @@ -package WayofTime.bloodmagic.util; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - -@Deprecated -public class ItemStackWrapper { - public final Item item; - public final int stackSize; - public final int meta; - public CompoundNBT nbtTag; - - public ItemStackWrapper(Item item, int stackSize, int meta) { - this.item = item; - this.stackSize = stackSize; - this.meta = meta; - } - - public ItemStackWrapper(Item item, int stackSize) { - this(item, stackSize, 0); - } - - public ItemStackWrapper(Item item) { - this(item, 1, 0); - } - - public ItemStackWrapper(Block block, int stackSize, int meta) { - this(Item.getItemFromBlock(block), stackSize, meta); - } - - public ItemStackWrapper(Block block, int stackSize) { - this(block, stackSize, 0); - } - - public ItemStackWrapper(Block block) { - this(block, 1, 0); - } - - public ItemStackWrapper(BlockStack blockStack) { - this(blockStack.getBlock(), 1, blockStack.getMeta()); - } - - public ItemStack toStack() { - return new ItemStack(item, stackSize, meta); - } - - public String getDisplayName() { - return toStack().getDisplayName(); - } - - @Override - public String toString() { - return stackSize + "x" + item.getTranslationKey() + "@" + this.meta; - } - - public ItemStack toStack(int count) { - ItemStack result = new ItemStack(item, count, meta); - result.setTagCompound(nbtTag); - return result; - } - - public Item getItem() { - return item; - } - - public int getStackSize() { - return stackSize; - } - - public int getMeta() { - return meta; - } - - public CompoundNBT getNbtTag() { - return nbtTag; - } - - public void setNbtTag(CompoundNBT nbtTag) { - this.nbtTag = nbtTag; - } - - @Nullable - public static ItemStackWrapper getHolder(ItemStack stack) { - if (stack.isEmpty()) - return null; - - ItemStackWrapper wrapper = new ItemStackWrapper(stack.getItem(), stack.getCount(), stack.getItemDamage()); - wrapper.setNbtTag(stack.getTagCompound()); - return wrapper; - } - - public static List toWrapperList(List itemStackList) { - List wrapperList = new ArrayList<>(); - for (ItemStack stack : itemStackList) - wrapperList.add(ItemStackWrapper.getHolder(stack)); - - return wrapperList; - } - - public static List toStackList(List wrapperList) { - List stackList = new ArrayList<>(); - for (ItemStackWrapper wrapper : wrapperList) - stackList.add(wrapper.toStack()); - - return stackList; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java b/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java deleted file mode 100644 index 1297d964..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/PluginUtil.java +++ /dev/null @@ -1,136 +0,0 @@ -package WayofTime.bloodmagic.util; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.api.BloodMagicPlugin; -import WayofTime.bloodmagic.api.IBloodMagicAPI; -import WayofTime.bloodmagic.api.IBloodMagicPlugin; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.api.impl.BloodMagicCorePlugin; -import com.google.common.base.Stopwatch; -import com.google.common.collect.Lists; -import net.minecraftforge.common.util.EnumHelper; -import net.minecraftforge.fml.common.discovery.ASMDataTable; -import org.apache.commons.lang3.tuple.Pair; - -import javax.annotation.Nonnull; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; - -public class PluginUtil { - - @SuppressWarnings("unchecked") - @Nonnull - public static List> gatherPlugins(ASMDataTable dataTable) { - Stopwatch stopwatch = Stopwatch.createStarted(); - List> discoveredAnnotations = Lists.newArrayList(); - Set discoveredPlugins = dataTable.getAll(BloodMagicPlugin.class.getName()); - - for (ASMDataTable.ASMData data : discoveredPlugins) { - try { - Class asmClass = Class.forName(data.getClassName()); - Class pluginClass = asmClass.asSubclass(IBloodMagicPlugin.class); - - IBloodMagicPlugin instance = pluginClass.newInstance(); - - BMLog.API.info("Discovered plugin at {}", data.getClassName()); - discoveredAnnotations.add(Pair.of(instance, pluginClass.getAnnotation(BloodMagicPlugin.class))); - } catch (Exception e) { - e.printStackTrace(); - } - } - - // Bring core plugin up to top - discoveredAnnotations.sort((o1, o2) -> { - if (o1.getLeft().getClass() == BloodMagicCorePlugin.class) - return -1; - - return o1.getClass().getCanonicalName().compareToIgnoreCase(o2.getClass().getCanonicalName()); - }); - BMLog.API.info("Discovered {} potential plugin(s) in {}", discoveredAnnotations.size(), stopwatch.stop()); - return discoveredAnnotations; - } - - @Nonnull - public static List gatherInjections(ASMDataTable dataTable) { - Stopwatch stopwatch = Stopwatch.createStarted(); - List injectees = Lists.newArrayList(); - Set discoveredInjectees = dataTable.getAll(BloodMagicPlugin.Inject.class.getName()); - - for (ASMDataTable.ASMData data : discoveredInjectees) { - try { - Class asmClass = Class.forName(data.getClassName()); - Field toInject = asmClass.getDeclaredField(data.getObjectName()); - if (toInject.getType() != IBloodMagicAPI.class) { - BMLog.API.error("Mod requested API injection on field {}.{} which is an invalid type.", data.getClassName(), data.getObjectName()); - continue; - } - - BMLog.API.info("Discovered injection request at {}.{}", data.getClassName(), data.getObjectName()); - injectees.add(toInject); - } catch (Exception e) { - e.printStackTrace(); - } - } - - BMLog.API.info("Discovered {} potential API injection(s) in {}", injectees.size(), stopwatch.stop()); - return injectees; - } - - public static void handlePluginStep(RegistrationStep step) { - Stopwatch total = Stopwatch.createStarted(); - int errors = 0; - for (Pair plugin : BloodMagic.PLUGINS) { - Stopwatch per = Stopwatch.createStarted(); - try { - step.getConsumer().accept(plugin); - } catch (Exception e) { - errors++; - BMLog.DEFAULT.error("Error handling plugin step {} at {}: {}: {}", step, plugin.getLeft().getClass(), e.getClass().getSimpleName(), e.getMessage()); - } - BMLog.API.info("Handled plugin step {} at {} in {}", step, plugin.getLeft().getClass(), per.stop()); - } - - BMLog.API.info("Handled {} plugin(s) at step {} with {} errors in {}", BloodMagic.PLUGINS.size() - errors, step, errors, total.stop()); - } - - public static void injectAPIInstances(List injectees) { - Stopwatch total = Stopwatch.createStarted(); - int errors = 0; - - for (Field injectee : injectees) { - Stopwatch per = Stopwatch.createStarted(); - if (!Modifier.isStatic(injectee.getModifiers())) - continue; - - try { - EnumHelper.setFailsafeFieldValue(injectee, null, BloodMagicAPI.INSTANCE); - } catch (Exception e) { - errors++; - BMLog.DEFAULT.error("Error injecting API instance at {}.{}", injectee.getDeclaringClass().getCanonicalName(), injectee.getName()); - } - BMLog.API.info("Injected API instance at {}.{} in {}", injectee.getDeclaringClass().getCanonicalName(), injectee.getName(), per.stop()); - } - - BMLog.API.info("Injected API {} times with {} errors in {}", injectees.size() - errors, errors, total.stop()); - } - - public enum RegistrationStep { - - PLUGIN_REGISTER(p -> p.getLeft().register(BloodMagicAPI.INSTANCE)), - RECIPE_REGISTER(p -> p.getLeft().registerRecipes(BloodMagicAPI.INSTANCE.getRecipeRegistrar())); - - private final Consumer> consumer; - - RegistrationStep(Consumer> consumer) { - this.consumer = consumer; - } - - @Nonnull - public Consumer> getConsumer() { - return consumer; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java b/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java deleted file mode 100644 index fb2342a5..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/SigilFluidWrapper.java +++ /dev/null @@ -1,81 +0,0 @@ -package WayofTime.bloodmagic.util; - -import WayofTime.bloodmagic.item.sigil.ItemSigilFluidBase; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.FluidTankProperties; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import net.minecraftforge.fluids.capability.IFluidTankProperties; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class SigilFluidWrapper implements ICapabilityProvider { - - final ItemStack stack; - final ItemSigilFluidBase sigil; - final boolean canFill; - final boolean canDrain; - - public SigilFluidWrapper(ItemStack stackIn, ItemSigilFluidBase fluidSigil) { - stack = stackIn; - sigil = fluidSigil; - canFill = true; - canDrain = true; - } - - public SigilFluidWrapper(ItemStack stackIn, ItemSigilFluidBase fluidSigil, boolean canFillIn, boolean canDrainIn) { - stack = stackIn; - sigil = fluidSigil; - canFill = canFillIn; - canDrain = canDrainIn; - } - - @Override - public boolean hasCapability(Capability capability, Direction from) { - return capability == CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY; - } - - @Override - public T getCapability(Capability capability, final Direction from) { - if (!hasCapability(capability, from)) { - return null; - } - return CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY.cast(new IFluidHandlerItem() { - - @Override - public IFluidTankProperties[] getTankProperties() { - return new IFluidTankProperties[]{new FluidTankProperties(sigil.getFluid(stack), sigil.getCapacity(stack), canFill, canDrain)}; - } - - @Override - public int fill(FluidStack resource, boolean doFill) { - return 0; - } - - @Nullable - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - return sigil.drain(stack, resource.amount, doDrain); - } - - @Nullable - @Override - public FluidStack drain(int maxDrain, boolean doDrain) { - return sigil.drain(stack, maxDrain, doDrain); - } - - @Nonnull - @Override - public ItemStack getContainer() { - return stack; - } - - }); - } - -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java b/src/main/java/WayofTime/bloodmagic/util/StateUtil.java deleted file mode 100644 index ba653735..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/StateUtil.java +++ /dev/null @@ -1,38 +0,0 @@ -package WayofTime.bloodmagic.util; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.state.BlockStateContainer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -public class StateUtil { - public static BlockState parseState(String state) { - if (state.contains("[")) { - String[] split = state.split("\\["); - split[1] = split[1].substring(0, split[1].lastIndexOf("]")); // Make sure brackets are removed from state - - Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(split[0])); - if (block == Blocks.AIR) - return block.getDefaultState(); - - BlockStateContainer blockState = block.getBlockState(); - BlockState returnState = blockState.getBaseState(); - - // Force our values into the state - String[] stateValues = split[1].split(","); // Splits up each value - for (String value : stateValues) { - String[] valueSplit = value.split("="); - IProperty property = blockState.getProperty(valueSplit[0]); - if (property != null) - returnState = returnState.withProperty(property, (Comparable) property.parseValue(valueSplit[1]).get()); - } - - return returnState; - } else { - return ForgeRegistries.BLOCKS.getValue(new ResourceLocation(state)).getDefaultState(); - } - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index c78454d9..4c78886f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -1,970 +1,51 @@ -package WayofTime.bloodmagic.util; +package wayoftime.bloodmagic.util; -import WayofTime.bloodmagic.altar.ComponentType; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.iface.IDemonWillViewer; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.PlayerVelocityPacketProcessor; -import WayofTime.bloodmagic.tile.TileInventory; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.NetherPortalBlock; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.item.*; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.Effects; -import net.minecraft.util.*; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.DyeColor; -import net.minecraft.item.ArmorItem; -import net.minecraft.potion.Effect; -import net.minecraft.potion.EffectInstance; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.*; -import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; -import net.minecraftforge.common.ISpecialArmor; -import net.minecraftforge.common.ISpecialArmor.ArmorProperties; -import net.minecraftforge.fluids.IFluidBlock; -import net.minecraftforge.fml.common.ObfuscationReflectionHelper; -import net.minecraftforge.items.CapabilityItemHandler; -import net.minecraftforge.items.IItemHandler; +import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.wrapper.InvWrapper; -import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; -import net.minecraftforge.items.wrapper.SidedInvWrapper; - -import javax.annotation.Nullable; -import java.lang.reflect.Field; -import java.util.*; - -public class Utils { - - public static final EnumMap DYE_COLOR_VALUES = Maps.newEnumMap(DyeColor.class); - - static { - try { - Field colorValue = ObfuscationReflectionHelper.findField(DyeColor.class, "field_193351_w"); - colorValue.setAccessible(true); - for (DyeColor color : DyeColor.values()) { - DYE_COLOR_VALUES.put(color, (int) colorValue.get(color)); - } - } catch (IllegalAccessException e) { - BMLog.DEFAULT.error("Error grabbing color values: {}", e.getMessage()); - } - } - - public static float addAbsorptionToMaximum(LivingEntity entity, float added, int maximum, int duration) { - float currentAmount = entity.getAbsorptionAmount(); - added = Math.min(maximum - currentAmount, added); - - if (added <= 0) { - return 0; - } - - if (duration > 0) { - int potionLevel = (int) ((currentAmount + added) / 4); - entity.addPotionEffect(new EffectInstance(Effects.ABSORPTION, duration, potionLevel, true, false)); - } - - entity.setAbsorptionAmount(currentAmount + added); - - return added; - } - - public static boolean isImmuneToFireDamage(LivingEntity entity) { - return entity.isImmuneToFire() || entity.isPotionActive(Effects.FIRE_RESISTANCE); - } - - public static boolean isPlayerBesideSolidBlockFace(PlayerEntity player) { - World world = player.getEntityWorld(); - double minimumDistanceFromAxis = 0.7; - BlockPos centralPos = player.getPosition(); - for (Direction facing : Direction.HORIZONTALS) { - BlockPos offsetPos = centralPos.offset(facing); - double distance = Math.min(offsetPos.getX() + 0.5 - player.posX, offsetPos.getZ() + 0.5 - player.posZ); - if (distance > minimumDistanceFromAxis) { - continue; - } - BlockState state = world.getBlockState(offsetPos); - if (state.isSideSolid(world, offsetPos, facing.getOpposite())) { - return true; - } - } - - return false; - } - - public static boolean canPlayerSeeDemonWill(PlayerEntity player) { - IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - - for (int i = 0; i < inventory.getSlots(); i++) { - ItemStack stack = inventory.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { - return true; - } - } - - return false; - } - - public static boolean canEntitySeeBlock(World world, Entity entity, BlockPos pos) { - Vec3d relativePosition = new Vec3d(entity.posX - pos.getX() - 0.5, entity.posY + (double) entity.getEyeHeight() - pos.getY() - 0.5, entity.posZ - pos.getZ() - 0.5); - Direction dir = Direction.getFacingFromVector((float) relativePosition.x, (float) relativePosition.y, (float) relativePosition.z); - RayTraceResult result = world.rayTraceBlocks(new Vec3d(entity.posX, entity.posY + (double) entity.getEyeHeight(), entity.posZ), new Vec3d(pos.getX() + 0.5 + dir.getXOffset() * 0.4, pos.getY() + 0.5 + dir.getYOffset() * 0.4, pos.getZ() + 0.5 + dir.getZOffset() * 0.4), false, true, true); - return result == null || pos.equals(result.getBlockPos()); - } - - public static int plantSeedsInArea(World world, AxisAlignedBB aabb, int horizontalRadius, int verticalRadius) { - int placedBlocks = 0; - List itemEntities = world.getEntitiesWithinAABB(ItemEntity.class, aabb); - - for (ItemEntity itemEntity : itemEntities) { - placedBlocks += plantEntityItem(itemEntity, horizontalRadius, verticalRadius); - } - - return placedBlocks; - } - - public static int plantItemStack(World world, BlockPos centralPos, ItemStack stack, int horizontalRadius, int verticalRadius) { - if (stack.isEmpty()) { - return 0; - } - - Item item = stack.getItem(); - if (!(item instanceof IPlantable)) { - return 0; - } - - int planted = 0; - - for (int hR = 0; hR <= horizontalRadius; hR++) { - for (int vR = 0; vR <= verticalRadius; vR++) { - for (int i = -hR; i <= hR; i++) { - for (int k = -hR; k <= hR; k++) { - for (int j = -vR; j <= vR; j += 2 * vR + (vR > 0 ? 0 : 1)) { - if (!(Math.abs(i) == hR || Math.abs(k) == hR)) { - continue; - } - - BlockPos newPos = centralPos.add(i, j, k); - if (world.isAirBlock(newPos)) { - BlockPos offsetPos = newPos.offset(Direction.DOWN); - BlockState state = world.getBlockState(offsetPos); - if (state.getBlock().canSustainPlant(state, world, offsetPos, Direction.UP, (IPlantable) item)) { - BlockState plantState = ((IPlantable) item).getPlant(world, newPos); - world.setBlockState(newPos, plantState, 3); - world.playEvent(2001, newPos, Block.getIdFromBlock(plantState.getBlock()) + (plantState.getBlock().getMetaFromState(plantState) << 12)); - stack.shrink(1); - planted++; - if (stack.isEmpty() || stack.getCount() <= 0) { - return planted; - } - } - } - } - } - } - } - } - - return planted; - } - - public static int plantEntityItem(ItemEntity itemEntity, int horizontalRadius, int verticalRadius) { - if (itemEntity == null || itemEntity.isDead) { - return 0; - } - - World world = itemEntity.getEntityWorld(); - BlockPos pos = itemEntity.getPosition(); - ItemStack stack = itemEntity.getItem(); - - int planted = plantItemStack(world, pos, stack, horizontalRadius, verticalRadius); - - if (stack.isEmpty()) { - itemEntity.setDead(); - } - - return planted; - } - - public static int getDemonWillResolution(PlayerEntity player) { - IItemHandler inventory = new PlayerMainInvWrapper(player.inventory); - - for (int i = 0; i < inventory.getSlots(); i++) { - ItemStack stack = inventory.getStackInSlot(i); - if (stack.isEmpty()) { - continue; - } - - if (stack.getItem() instanceof IDemonWillViewer && ((IDemonWillViewer) stack.getItem()).canSeeDemonWillAura(player.getEntityWorld(), stack, player)) { - return ((IDemonWillViewer) stack.getItem()).getDemonWillAuraResolution(player.getEntityWorld(), stack, player); - } - } - - return 1; - } - - public static CompoundNBT getPersistentDataTag(PlayerEntity player) { - CompoundNBT forgeData = player.getEntityData().getCompoundTag(PlayerEntity.PERSISTED_NBT_TAG); - CompoundNBT beaconData = forgeData.getCompoundTag("BloodMagic"); - - //Creates/sets the tags if they don't exist - if (!forgeData.hasKey("BloodMagic")) - forgeData.setTag("BloodMagic", beaconData); - if (!player.getEntityData().hasKey(PlayerEntity.PERSISTED_NBT_TAG)) - player.getEntityData().setTag(PlayerEntity.PERSISTED_NBT_TAG, forgeData); - - return beaconData; - } - - public static void setPlayerSpeedFromServer(PlayerEntity player, double motionX, double motionY, double motionZ) { - if (!player.getEntityWorld().isRemote && player instanceof ServerPlayerEntity) { - BloodMagicPacketHandler.sendTo(new PlayerVelocityPacketProcessor(motionX, motionY, motionZ), (ServerPlayerEntity) player); - } - } - - public static boolean isInteger(String integer) { - try { - Integer.parseInt(integer); - } catch (NumberFormatException | NullPointerException e) { - return false; - } - // only got here if we didn't return false - return true; - } - - public static String toFancyCasing(String input) { - return String.valueOf(input.charAt(0)).toUpperCase(Locale.ENGLISH) + input.substring(1); - } - - public static String prettifyBlockPosString(BlockPos pos) { - return "[" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + "]"; - } - - /** - * @param tile - The {@link TileInventory} to input the item to - * @param player - The player to take the item from. - * @return {@code true} if the ItemStack is inserted, {@code false} - * otherwise - * @see #insertItemToTile(TileInventory, PlayerEntity, int) - */ - public static boolean insertItemToTile(TileInventory tile, PlayerEntity player) { - return insertItemToTile(tile, player, 0); - } - - /** - * Used for inserting an ItemStack with a stacksize of 1 to a tile's - * inventory at slot 0 - *

- * EG: Block Altar - * - * @param tile - The {@link TileInventory} to input the item to - * @param player - The player to take the item from. - * @param slot - The slot to attempt to insert to - * @return {@code true} if the ItemStack is inserted, {@code false} - * otherwise - */ - public static boolean insertItemToTile(TileInventory tile, PlayerEntity player, int slot) { - ItemStack slotStack = tile.getStackInSlot(slot); - if (slotStack.isEmpty() && !player.getHeldItemMainhand().isEmpty()) { - ItemStack input = player.getHeldItemMainhand().copy(); - input.setCount(1); - player.getHeldItemMainhand().shrink(1); - tile.setInventorySlotContents(slot, input); - return true; - } else if (!slotStack.isEmpty() && player.getHeldItemMainhand().isEmpty()) { - ItemHandlerHelper.giveItemToPlayer(player, slotStack); - tile.clear(); - return false; - } - - return false; - } - - public static double calculateStandardProgress(Number currentValue, int[] requiredValues, int currentLevel) { - int nextLevel = currentLevel + 1; - if (nextLevel >= requiredValues.length) - return 1.0D; - - int required = requiredValues[nextLevel]; - return Double.parseDouble("" + currentValue) / (double) required; - } - - @Nullable - public static IItemHandler getInventory(TileEntity tile, @Nullable Direction facing) { - if (facing == null) - facing = Direction.DOWN; - - IItemHandler itemHandler = null; - - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing)) - itemHandler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing); - else if (tile instanceof ISidedInventory) - itemHandler = ((ISidedInventory) tile).getSlotsForFace(facing).length != 0 ? new SidedInvWrapper((ISidedInventory) tile, facing) : null; - else if (tile instanceof IInventory) - itemHandler = new InvWrapper((IInventory) tile); - - return itemHandler; - } - - public static ItemStack setUnbreakable(ItemStack stack) { - NBTHelper.checkNBT(stack); - stack.getTagCompound().setBoolean("Unbreakable", true); - return stack; - } - - /** - * Gets a default block for each type of {@link ComponentType} - * - * @param component - The Component to provide a block for. - * @return The default Block for the EnumAltarComponent - */ - public static Block getBlockForComponent(ComponentType component) { - switch (component) { - case GLOWSTONE: - return Blocks.GLOWSTONE; - case BLOODSTONE: - return RegistrarBloodMagicBlocks.DECORATIVE_BRICK; - case BEACON: - return Blocks.BEACON; - case BLOODRUNE: - return RegistrarBloodMagicBlocks.BLOOD_RUNE; - case CRYSTAL: - return RegistrarBloodMagicBlocks.BLOOD_RUNE; - case NOTAIR: - return Blocks.STONEBRICK; - default: - return Blocks.AIR; - } - } - - public static float getModifiedDamage(LivingEntity attackedEntity, DamageSource source, float amount) { - if (!attackedEntity.isEntityInvulnerable(source)) { - if (amount <= 0) - return 0; - - amount = applyArmor(attackedEntity, Iterables.toArray(attackedEntity.getEquipmentAndArmor(), ItemStack.class), source, amount); - if (amount <= 0) - return 0; - amount = applyPotionDamageCalculations(attackedEntity, source, amount); - - return amount; - } - - return 0; - } - - public static float applyArmor(LivingEntity entity, ItemStack[] inventory, DamageSource source, double damage) { - damage *= 25; - ArrayList dmgVals = new ArrayList<>(); - for (int x = 0; x < inventory.length; x++) { - ItemStack stack = inventory[x]; - if (stack.isEmpty()) { - continue; - } - ArmorProperties prop = null; - if (stack.getItem() instanceof ISpecialArmor) { - ISpecialArmor armor = (ISpecialArmor) stack.getItem(); - prop = armor.getProperties(entity, stack, source, damage / 25D, x).copy(); - } else if (stack.getItem() instanceof ArmorItem && !source.isUnblockable()) { - ArmorItem armor = (ArmorItem) stack.getItem(); - prop = new ArmorProperties(0, armor.damageReduceAmount / 25D, Integer.MAX_VALUE); - } - if (prop != null) { - prop.Slot = x; - dmgVals.add(prop); - } - } - if (dmgVals.size() > 0) { - ArmorProperties[] props = dmgVals.toArray(new ArmorProperties[dmgVals.size()]); - int level = props[0].Priority; - double ratio = 0; - for (ArmorProperties prop : props) { - if (level != prop.Priority) { - damage -= (damage * ratio); - ratio = 0; - level = prop.Priority; - } - ratio += prop.AbsorbRatio; - - } - damage -= (damage * ratio); - } - - return (float) (damage / 25.0F); - } - - public static float applyPotionDamageCalculations(LivingEntity attackedEntity, DamageSource source, float damage) { - Effect resistance = Effects.RESISTANCE; - - if (source.isDamageAbsolute()) { - return damage; - } else { - if (attackedEntity.isPotionActive(resistance) && source != DamageSource.OUT_OF_WORLD) { - int i = (attackedEntity.getActivePotionEffect(resistance).getAmplifier() + 1) * 5; - int j = 25 - i; - float f = damage * (float) j; - damage = f / 25.0F; - } - - if (damage <= 0.0F) { - return 0.0F; - } else { - int k = EnchantmentHelper.getEnchantmentModifierDamage(attackedEntity.getArmorInventoryList(), source); - - if (k > 20) { - k = 20; - } - - if (k > 0 && k <= 20) { - int l = 25 - k; - float f1 = damage * (float) l; - damage = f1 / 25.0F; - } - - return damage; - } - } - } - - /** - * Used to determine if stack1 can be placed into stack2. If stack2 is is empty - * and stack1 isn't empty, returns true. Ignores stack size - * - * @param stack1 Stack that is placed into a slot - * @param stack2 Slot content that stack1 is placed into - * @return True if they can be combined - * @deprecated use {@link ItemHandlerHelper#canItemStacksStack(ItemStack, ItemStack)} - */ - @Deprecated - public static boolean canCombine(ItemStack stack1, ItemStack stack2) { - return stack1.isEmpty() && !stack2.isEmpty() || ItemHandlerHelper.canItemStacksStack(stack1, stack2); - } - - /** - * @param stack1 Stack that is placed into a slot - * @param stack2 Slot content that stack1 is placed into - * @return Stacks after stacking - */ - public static ItemStack[] combineStacks(ItemStack stack1, ItemStack stack2, int transferMax) { - ItemStack[] returned = new ItemStack[2]; - - if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) { - int transferedAmount = Math.min(transferMax, stack2.isEmpty() ? stack1.getCount() : Math.min(stack2.getMaxStackSize() - stack2.getCount(), stack1.getCount())); - if (transferedAmount > 0) { - ItemStack copyStack = stack1.splitStack(transferedAmount); - if (stack2.isEmpty()) { - stack2 = copyStack; - } else { - stack2.grow(transferedAmount); - } - } - } - - returned[0] = stack1; - returned[1] = stack2; - - return returned; - } - - /** - * @param stack1 Stack that is placed into a slot - * @param stack2 Slot content that stack1 is placed into - * @return Stacks after stacking - */ - public static ItemStack[] combineStacks(ItemStack stack1, ItemStack stack2) { - ItemStack[] returned = new ItemStack[2]; - - if (ItemHandlerHelper.canItemStacksStack(stack1, stack2)) { - int transferedAmount = stack2.isEmpty() ? stack1.getCount() : Math.min(stack2.getMaxStackSize() - stack2.getCount(), stack1.getCount()); - if (transferedAmount > 0) { - ItemStack copyStack = stack1.splitStack(transferedAmount); - if (stack2.isEmpty()) { - stack2 = copyStack; - } else { - stack2.grow(transferedAmount); - } - } - } - - returned[0] = stack1; - returned[1] = stack2; - - return returned; - } - - public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, Direction dir) { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { - IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); - - return insertStackIntoTile(stack, handler); - } else if (tile instanceof IInventory) { - return insertStackIntoInventory(stack, (IInventory) tile, dir); - } - - return stack; - } - - public static int getNumberOfFreeSlots(TileEntity tile, Direction dir) { - int slots = 0; - - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { - IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); - - for (int i = 0; i < handler.getSlots(); i++) { - if (handler.getStackInSlot(i).isEmpty()) { - slots++; - } - } - } else if (tile instanceof IInventory) { - for (int i = 0; i < ((IInventory) tile).getSizeInventory(); i++) { - if (((IInventory) tile).getStackInSlot(i).isEmpty()) { - slots++; - } - } - } - - return slots; - } - - public static ItemStack insertStackIntoTile(ItemStack stack, IItemHandler handler) { - int numberOfSlots = handler.getSlots(); - - ItemStack copyStack = stack.copy(); - - for (int slot = 0; slot < numberOfSlots; slot++) { - copyStack = handler.insertItem(slot, copyStack, false); - if (copyStack.isEmpty()) { - return ItemStack.EMPTY; - } - } - - return copyStack; - } - - /** - * Inserts the desired stack into the tile up to a limit for the tile. - * Respects capabilities. - * - * @param stack - * @param tile - * @param dir - * @param limit - * @return - */ - public static ItemStack insertStackIntoTile(ItemStack stack, TileEntity tile, Direction dir, int limit) { - if (tile.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir)) { - IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, dir); - int numberOfSlots = handler.getSlots(); - - ItemStack copyStack = stack.copy(); - - int numberMatching = 0; - - for (int slot = 0; slot < numberOfSlots; slot++) { - ItemStack invStack = handler.getStackInSlot(slot); - - if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { - numberMatching += invStack.getCount(); - } - } - - if (numberMatching >= limit) { - return stack; - } - - int newLimit = limit - numberMatching; - - for (int slot = 0; slot < numberOfSlots; slot++) { - ItemStack newCopyStack = copyStack.copy(); - newCopyStack.setCount(Math.min(copyStack.getCount(), newLimit)); - - newCopyStack = handler.insertItem(slot, newCopyStack, false); - - if (newCopyStack.isEmpty()) { - return ItemStack.EMPTY; - } - - newLimit -= (copyStack.getCount() - newCopyStack.getCount()); - - if (newLimit <= 0) { - return ItemStack.EMPTY; //TODO - } - - copyStack.shrink(copyStack.getCount() - newCopyStack.getCount()); - } - - return copyStack; - } else if (tile instanceof IInventory) { - return insertStackIntoInventory(stack, (IInventory) tile, dir, limit); - } - - return stack; - } - - public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, Direction dir) { - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - - if (inventory instanceof ISidedInventory) { - int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) { - canBeInserted[in] = inventory.isItemValidForSlot(in, stack) && ((ISidedInventory) inventory).canInsertItem(in, stack, dir); - } - } else { - for (int i = 0; i < canBeInserted.length; i++) { - canBeInserted[i] = inventory.isItemValidForSlot(i, stack); - } - } - - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!canBeInserted[i]) { - continue; - } - - ItemStack[] combinedStacks = combineStacks(stack, inventory.getStackInSlot(i)); - stack = combinedStacks[0]; - inventory.setInventorySlotContents(i, combinedStacks[1]); - - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - } - - return stack; - } - - public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, Direction dir) { - return canInsertStackFullyIntoInventory(stack, inventory, dir, false, 0); - } - - public static boolean canInsertStackFullyIntoInventory(ItemStack stack, IInventory inventory, Direction dir, boolean fillToLimit, int limit) { - if (stack.isEmpty()) { - return true; - } - - int itemsLeft = stack.getCount(); - - boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - - if (inventory instanceof ISidedInventory) { - int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) { - canBeInserted[in] = inventory.isItemValidForSlot(in, stack) && ((ISidedInventory) inventory).canInsertItem(in, stack, dir); - } - } else { - for (int i = 0; i < canBeInserted.length; i++) { - canBeInserted[i] = inventory.isItemValidForSlot(i, stack); - } - } - - int numberMatching = 0; - - if (fillToLimit) { - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!canBeInserted[i]) { - continue; - } - - ItemStack invStack = inventory.getStackInSlot(i); - - if (!invStack.isEmpty() && ItemHandlerHelper.canItemStacksStack(stack, invStack)) { - numberMatching += invStack.getCount(); - } - } - } - - if (fillToLimit && limit < stack.getCount() + numberMatching) { - return false; - } - - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!canBeInserted[i]) { - continue; - } - - ItemStack invStack = inventory.getStackInSlot(i); - boolean canCombine = canCombine(stack, invStack); - if (canCombine) { - if (invStack.isEmpty()) { - itemsLeft = 0; - } else { - itemsLeft -= (invStack.getMaxStackSize() - invStack.getCount()); - } - } - - if (itemsLeft <= 0) { - return true; - } - } - - return false; - } - - /** - * Inserts the desired stack into the inventory up to a limit for the - * inventory. - * - * @param stack - * @param inventory - * @param dir - * @param limit - * @return - */ - public static ItemStack insertStackIntoInventory(ItemStack stack, IInventory inventory, Direction dir, int limit) { - if (stack.isEmpty()) { - return ItemStack.EMPTY; - } - - boolean[] canBeInserted = new boolean[inventory.getSizeInventory()]; - - if (inventory instanceof ISidedInventory) { - int[] array = ((ISidedInventory) inventory).getSlotsForFace(dir); - for (int in : array) { - canBeInserted[in] = ((ISidedInventory) inventory).canInsertItem(in, stack, dir); - } - } else { - for (int i = 0; i < canBeInserted.length; i++) { - canBeInserted[i] = true; - } - } - - int numberMatching = 0; - - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!canBeInserted[i]) { - continue; - } - - ItemStack invStack = inventory.getStackInSlot(i); - - if (!invStack.isEmpty() && canCombine(stack, invStack)) { - numberMatching += invStack.getCount(); - } - } - - if (numberMatching >= limit) { - return stack; - } - - int newLimit = limit - numberMatching; - - for (int i = 0; i < inventory.getSizeInventory(); i++) { - if (!canBeInserted[i]) { - continue; - } - - int prevStackSize = stack.getCount(); - - ItemStack[] combinedStacks = combineStacks(stack, inventory.getStackInSlot(i), newLimit); - stack = combinedStacks[0]; - inventory.setInventorySlotContents(i, combinedStacks[1]); //TODO - - newLimit -= (prevStackSize - stack.getCount()); - - if (newLimit <= 0 || stack.isEmpty()) { - return stack; - } - } - - return stack; - } - - public static boolean isBlockLiquid(BlockState state) { - return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); - } - - public static boolean isFlowingLiquid(BlockState state) { - Block block = state.getBlock(); - return isBlockLiquid(state) && !(state == block.getDefaultState()); - } - - public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable Direction pushDirection, ItemStack stack) { - ItemEntity entityItem = new ItemEntity(world); - BlockPos spawnPos = new BlockPos(pos); - double velocity = 0.15D; - if (pushDirection != null) { - spawnPos.offset(pushDirection); - - switch (pushDirection) { - case DOWN: { - entityItem.motionY = -velocity; - entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() - 1.0D, spawnPos.getZ() + 0.5D); - break; - } - case UP: { - entityItem.motionY = velocity; - entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 1.0D, spawnPos.getZ() + 0.5D); - break; - } - case NORTH: { - entityItem.motionZ = -velocity; - entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 0.5D, spawnPos.getZ() - 1.0D); - break; - } - case SOUTH: { - entityItem.motionZ = velocity; - entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 1.0D); - break; - } - case WEST: { - entityItem.motionX = -velocity; - entityItem.setPosition(spawnPos.getX() - 1.0D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 0.5D); - break; - } - case EAST: { - entityItem.motionX = velocity; - entityItem.setPosition(spawnPos.getX() + 1.0D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 0.5D); - break; - } - } - } - - entityItem.setItem(stack); - return world.spawnEntity(entityItem); - } - - public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos) { - return swapLocations(initialWorld, initialPos, finalWorld, finalPos, true); - } - - public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos, boolean playSound) { - TileEntity initialTile = initialWorld.getTileEntity(initialPos); - TileEntity finalTile = finalWorld.getTileEntity(finalPos); - CompoundNBT initialTag = new CompoundNBT(); - CompoundNBT finalTag = new CompoundNBT(); - if (initialTile != null) - initialTile.writeToNBT(initialTag); - if (finalTile != null) - finalTile.writeToNBT(finalTag); - - BlockState initialState = initialWorld.getBlockState(initialPos); - BlockState finalState = finalWorld.getBlockState(finalPos); - - if ((initialState.getBlock().equals(Blocks.AIR) && finalState.getBlock().equals(Blocks.AIR)) || initialState.getBlock() instanceof NetherPortalBlock || finalState.getBlock() instanceof NetherPortalBlock) - return false; - - if (playSound) { - initialWorld.playSound(initialPos.getX(), initialPos.getY(), initialPos.getZ(), SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - finalWorld.playSound(finalPos.getX(), finalPos.getY(), finalPos.getZ(), SoundEvents.ENTITY_ENDERMEN_TELEPORT, SoundCategory.AMBIENT, 1.0F, 1.0F, false); - } - - //Finally, we get to do something! (CLEARING TILES) - if (finalState.getBlock().hasTileEntity(finalState)) - finalWorld.removeTileEntity(finalPos); - if (initialState.getBlock().hasTileEntity(initialState)) - initialWorld.removeTileEntity(initialPos); - - //TILES CLEARED - BlockState initialBlockState = initialWorld.getBlockState(initialPos); - BlockState finalBlockState = finalWorld.getBlockState(finalPos); - finalWorld.setBlockState(finalPos, initialBlockState, 3); - - if (initialTile != null) { - TileEntity newTileInitial = TileEntity.create(finalWorld, initialTag); - - - finalWorld.setTileEntity(finalPos, newTileInitial); - newTileInitial.setPos(finalPos); - newTileInitial.setWorld(finalWorld); - } - - initialWorld.setBlockState(initialPos, finalBlockState, 3); - - if (finalTile != null) { - TileEntity newTileFinal = TileEntity.create(initialWorld, finalTag); - - initialWorld.setTileEntity(initialPos, newTileFinal); - newTileFinal.setPos(initialPos); - newTileFinal.setWorld(initialWorld); - } - - initialWorld.notifyNeighborsOfStateChange(initialPos, finalState.getBlock(), true); - finalWorld.notifyNeighborsOfStateChange(finalPos, initialState.getBlock(), true); - - return true; - } - - //Shamelessly ripped off of CoFH Lib - public static ItemStack consumeItem(ItemStack stack) { - Item item = stack.getItem(); - boolean largerStack = stack.getCount() > 1; - if (largerStack) { - stack.shrink(1); - } - if (item.hasContainerItem(stack)) { - ItemStack ret = item.getContainerItem(stack); - if (ret.isEmpty()) { - return ItemStack.EMPTY; - } - if (ret.isItemStackDamageable() && ret.getItemDamage() > ret.getMaxDamage()) { - ret = ItemStack.EMPTY; - } - return ret; - } - return largerStack ? stack : ItemStack.EMPTY; - } - - public static boolean hasUUID(ItemStack stack) { - return stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.MOST_SIG) && stack.getTagCompound().hasKey(Constants.NBT.LEAST_SIG); - } - - public static UUID getUUID(ItemStack stack) { - if (!hasUUID(stack)) { - return null; - } - - return new UUID(stack.getTagCompound().getLong(Constants.NBT.MOST_SIG), stack.getTagCompound().getLong(Constants.NBT.LEAST_SIG)); - } - - public static void setUUID(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - - if (!stack.getTagCompound().hasKey(Constants.NBT.MOST_SIG) && !stack.getTagCompound().hasKey(Constants.NBT.LEAST_SIG)) { - UUID itemUUID = UUID.randomUUID(); - stack.getTagCompound().setLong(Constants.NBT.MOST_SIG, itemUUID.getMostSignificantBits()); - stack.getTagCompound().setLong(Constants.NBT.LEAST_SIG, itemUUID.getLeastSignificantBits()); - } - } - - public static RayTraceResult rayTrace(PlayerEntity player, boolean useLiquids) { - float pitch = player.rotationPitch; - float yaw = player.rotationYaw; - Vec3d eyePosition = new Vec3d(player.posX, player.posY + (double) player.getEyeHeight(), player.posZ); - - float f2 = MathHelper.cos(-yaw * 0.017453292F - (float) Math.PI); - float f3 = MathHelper.sin(-yaw * 0.017453292F - (float) Math.PI); - float f4 = -MathHelper.cos(-pitch * 0.017453292F); - float f5 = MathHelper.sin(-pitch * 0.017453292F); - float f6 = f3 * f4; - float f7 = f2 * f4; - - double reachDistance = 5.0D; - if (player instanceof ServerPlayerEntity) - reachDistance = ((ServerPlayerEntity) player).interactionManager.getBlockReachDistance(); - - Vec3d reachPosition = eyePosition.add((double) f6 * reachDistance, (double) f5 * reachDistance, (double) f7 * reachDistance); - return player.getEntityWorld().rayTraceBlocks(eyePosition, reachPosition, useLiquids, !useLiquids, false); - } +import wayoftime.bloodmagic.tile.TileInventory; + +public class Utils +{ + /** + * @param tile - The {@link TileInventory} to input the item to + * @param player - The player to take the item from. + * @return {@code true} if the ItemStack is inserted, {@code false} otherwise + * @see #insertItemToTile(TileInventory, PlayerEntity, int) + */ + public static boolean insertItemToTile(TileInventory tile, PlayerEntity player) + { + return insertItemToTile(tile, player, 0); + } + + /** + * Used for inserting an ItemStack with a stacksize of 1 to a tile's inventory + * at slot 0 + *

+ * EG: Block Altar + * + * @param tile - The {@link TileInventory} to input the item to + * @param player - The player to take the item from. + * @param slot - The slot to attempt to insert to + * @return {@code true} if the ItemStack is inserted, {@code false} otherwise + */ + public static boolean insertItemToTile(TileInventory tile, PlayerEntity player, int slot) + { + ItemStack slotStack = tile.getStackInSlot(slot); + if (slotStack.isEmpty() && !player.getHeldItemMainhand().isEmpty()) + { + ItemStack input = player.getHeldItemMainhand().copy(); + input.setCount(1); + player.getHeldItemMainhand().shrink(1); + tile.setInventorySlotContents(slot, input); + return true; + } else if (!slotStack.isEmpty() && player.getHeldItemMainhand().isEmpty()) + { + ItemHandlerHelper.giveItemToPlayer(player, slotStack); + tile.clear(); + return false; + } + + return false; + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java deleted file mode 100644 index 251a0a1b..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/IMCHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -package WayofTime.bloodmagic.util.handler; - -import net.minecraftforge.fml.common.event.FMLInterModComms; - -public class IMCHandler { - - public static void handleIMC(FMLInterModComms.IMCEvent event) { - // TODO -// for (FMLInterModComms.IMCMessage message : event.getMessages()) -// { -// if (message.key.equals("teleposerBlacklist") && message.isItemStackMessage()) -// { -// ItemStack stack = message.getItemStackValue(); -// if (stack.getItem() instanceof ItemBlock) -// { -// Block block = Block.getBlockFromItem(stack.getItem()); -// BloodMagicAPI.addToTeleposerBlacklist(block, stack.getItemDamage()); -// } -// } -// -// if (message.key.equals("transpositionBlacklist") && message.isItemStackMessage()) -// { -// ItemStack stack = message.getItemStackValue(); -// if (stack.getItem() instanceof ItemBlock) -// { -// Block block = Block.getBlockFromItem(stack.getItem()); -// BloodMagicAPI.addToTranspositionBlacklist(block, stack.getItemDamage()); -// } -// } -// -// if (message.key.equals("sacrificeValue") && message.isStringMessage()) -// { -// String[] splitInfo = message.getStringValue().split(";"); -// if (splitInfo.length == 2 && Utils.isInteger(splitInfo[1])) -// BloodMagicAPI.setEntitySacrificeValue(splitInfo[0], Integer.parseInt(splitInfo[1])); -// } -// -// if (message.key.equals("greenGroveBlacklist") && message.isStringMessage()) -// { -// String[] splitInfo = message.getStringValue().split(":"); -// if (splitInfo.length == 2) -// { -// Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(splitInfo[0], splitInfo[1])); -// if (block != null) -// BloodMagicAPI.blacklistFromGreenGrove(block); -// } -// } -// -// if (message.key.equals("altarComponent") && message.isStringMessage()) -// { -// String[] splitInfo = message.getStringValue().split(":"); -// if (splitInfo.length == 4) -// { -// Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(splitInfo[0], splitInfo[1])); -// if (block != null) -// BloodMagicAPI.addAltarComponent(block.getStateFromMeta(Integer.parseInt(splitInfo[2])), EnumAltarComponent.valueOf(splitInfo[3])); -// } -// } -// } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java deleted file mode 100644 index 06fd87a4..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/ClientHandler.java +++ /dev/null @@ -1,398 +0,0 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.util.BMLog; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.client.key.KeyBindings; -import WayofTime.bloodmagic.client.render.block.RenderFakeBlocks; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.item.ItemRitualDiviner; -import WayofTime.bloodmagic.item.sigil.ItemSigilHolding; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.SigilHoldingPacketProcessor; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import WayofTime.bloodmagic.util.GhostItemHelper; -import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Stopwatch; -import com.google.common.collect.Lists; -import com.google.common.collect.SetMultimap; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.player.ClientPlayerEntity; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.model.ModelResourceLocation; -import net.minecraft.client.renderer.texture.AtlasTexture; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.world.World; -import net.minecraftforge.client.event.*; -import net.minecraftforge.client.event.sound.PlaySoundEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.fml.client.FMLClientHandler; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.InputEvent; -import net.minecraftforge.fml.relauncher.ReflectionHelper; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import org.lwjgl.opengl.GL11; - -import java.util.*; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID, value = Side.CLIENT) -@SideOnly(Side.CLIENT) -public class ClientHandler { - // Quick toggle for error suppression. Set to false if you wish to hide model errors. - public static final boolean SUPPRESS_ASSET_ERRORS = true; - public static TextureAtlasSprite ritualStoneBlank; - public static TextureAtlasSprite ritualStoneWater; - public static TextureAtlasSprite ritualStoneFire; - public static TextureAtlasSprite ritualStoneEarth; - public static TextureAtlasSprite ritualStoneAir; - public static TextureAtlasSprite ritualStoneDawn; - public static TextureAtlasSprite ritualStoneDusk; - public static TextureAtlasSprite blankBloodRune; - public static TextureAtlasSprite stoneBrick; - public static TextureAtlasSprite glowstone; - public static TextureAtlasSprite bloodStoneBrick; - public static TextureAtlasSprite beacon; - public static TextureAtlasSprite crystalCluster; - public static Minecraft minecraft = Minecraft.getInstance(); - private static TileMasterRitualStone mrsHoloTile; - private static Ritual mrsHoloRitual; - private static Direction mrsHoloDirection; - private static boolean mrsHoloDisplay; - - @SubscribeEvent - public static void onTooltipEvent(ItemTooltipEvent event) { - ItemStack stack = event.getItemStack(); - if (stack.isEmpty()) { - return; - } - - if (GhostItemHelper.hasGhostAmount(stack)) { - int amount = GhostItemHelper.getItemGhostAmount(stack); - if (amount == 0) { - event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.everything")); - } else { - event.getToolTip().add(TextHelper.localize("tooltip.bloodmagic.ghost.amount", amount)); - } - } - } - - @SubscribeEvent - public static void onSoundEvent(PlaySoundEvent event) { - PlayerEntity player = Minecraft.getInstance().player; - if (player != null && player.isPotionActive(RegistrarBloodMagic.DEAFNESS)) { - event.setResultSound(null); - } - } - - @SubscribeEvent - public static void onTextureStitch(TextureStitchEvent.Pre event) { - final String BLOCKS = "blocks"; - - ritualStoneBlank = forName(event.getMap(), "RitualStone", BLOCKS); - ritualStoneWater = forName(event.getMap(), "WaterRitualStone", BLOCKS); - ritualStoneFire = forName(event.getMap(), "FireRitualStone", BLOCKS); - ritualStoneEarth = forName(event.getMap(), "EarthRitualStone", BLOCKS); - ritualStoneAir = forName(event.getMap(), "AirRitualStone", BLOCKS); - ritualStoneDawn = forName(event.getMap(), "LightRitualStone", BLOCKS); - ritualStoneDusk = forName(event.getMap(), "DuskRitualStone", BLOCKS); - - blankBloodRune = forName(event.getMap(), "BlankRune", BLOCKS); - stoneBrick = event.getMap().registerSprite(new ResourceLocation("minecraft:blocks/stonebrick")); - glowstone = event.getMap().registerSprite(new ResourceLocation("minecraft:blocks/glowstone")); - bloodStoneBrick = forName(event.getMap(), "BloodStoneBrick", BLOCKS); - beacon = event.getMap().registerSprite(new ResourceLocation("minecraft:blocks/beacon")); - crystalCluster = forName(event.getMap(), "ShardCluster", BLOCKS); - } - - @SubscribeEvent - public static void render(RenderWorldLastEvent event) { - ClientPlayerEntity player = minecraft.player; - World world = player.getEntityWorld(); - - if (mrsHoloTile != null) { - if (world.getTileEntity(mrsHoloTile.getPos()) instanceof TileMasterRitualStone) { - if (mrsHoloDisplay) - renderRitualStones(mrsHoloTile, event.getPartialTicks()); - else - ClientHandler.setRitualHoloToNull(); - } else { - ClientHandler.setRitualHoloToNull(); - } - } - - if (minecraft.objectMouseOver == null || minecraft.objectMouseOver.typeOfHit != RayTraceResult.Type.BLOCK) - return; - - TileEntity tileEntity = world.getTileEntity(minecraft.objectMouseOver.getBlockPos()); - - if (tileEntity instanceof TileMasterRitualStone && !player.getHeldItemMainhand().isEmpty() && player.getHeldItemMainhand().getItem() instanceof ItemRitualDiviner) - renderRitualStones(player, event.getPartialTicks()); - } - - @SubscribeEvent - public static void onMouseEvent(MouseEvent event) { - ClientPlayerEntity player = Minecraft.getInstance().player; - - if (event.getDwheel() != 0 && player != null && player.isSneaking()) { - ItemStack stack = player.getHeldItemMainhand(); - - if (!stack.isEmpty()) { - Item item = stack.getItem(); - - if (item instanceof ItemSigilHolding) { - cycleSigil(stack, player, event.getDwheel()); - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - public static void onKey(InputEvent event) { - if (!minecraft.inGameHasFocus) - return; - - for (KeyBindings keyBinding : KeyBindings.values()) - if (keyBinding.getKey().isPressed()) - keyBinding.handleKeybind(); - } - - // Stolen from Chisel - @SubscribeEvent - public static void onModelBake(ModelBakeEvent event) { - if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) - return; - - Stopwatch stopwatch = Stopwatch.createStarted(); - Map modelErrors = ReflectionHelper.getPrivateValue(ModelLoader.class, event.getModelLoader(), "loadingExceptions"); - Set missingVariants = ReflectionHelper.getPrivateValue(ModelLoader.class, event.getModelLoader(), "missingVariants"); - - // Collect all Blood Magic model errors - List errored = new ArrayList<>(); - for (ResourceLocation modelError : modelErrors.keySet()) - if (modelError.getNamespace().equalsIgnoreCase(BloodMagic.MODID)) - errored.add(modelError); - - // Collect all Blood Magic variant errors - List missing = new ArrayList<>(); - for (ModelResourceLocation missingVariant : missingVariants) - if (missingVariant.getNamespace().equalsIgnoreCase(BloodMagic.MODID)) - missing.add(missingVariant); - - // Remove discovered model errors - for (ResourceLocation modelError : errored) - modelErrors.remove(modelError); - - // Remove discovered variant errors - missingVariants.removeAll(missing); - - if (errored.size() > 0) - BMLog.DEBUG.info("Suppressed {} model errors from Blood Magic.", errored.size()); - if (missing.size() > 0) - BMLog.DEBUG.info("Suppressed {} variant errors from Blood Magic.", missing.size()); - BMLog.DEBUG.info("Suppressed discovered model/variant errors in {}", stopwatch.stop()); - } - - // For some reason, we need some bad textures to be listed in the Crystal and Node models. This will hide that from the end user. - @SubscribeEvent - public static void onTextureStitch(TextureStitchEvent.Post event) { - if (BloodMagic.IS_DEV && SUPPRESS_ASSET_ERRORS) - return; - - Stopwatch stopwatch = Stopwatch.createStarted(); - SetMultimap missingTextures = ReflectionHelper.getPrivateValue(FMLClientHandler.class, FMLClientHandler.instance(), "missingTextures"); - Set badTextureDomains = ReflectionHelper.getPrivateValue(FMLClientHandler.class, FMLClientHandler.instance(), "badTextureDomains"); - - String mc = "minecraft"; - String format = "textures/%s.png"; - Set toRemove = new HashSet<>(); - - // Find our missing textures and mark them for removal. Cannot directly remove as it would cause a CME - if (missingTextures.containsKey(mc)) { - Set missingMCTextures = missingTextures.get(mc); - for (ResourceLocation texture : missingMCTextures) - if (texture.getPath().equalsIgnoreCase(String.format(format, "node")) || texture.getPath().equalsIgnoreCase(String.format(format, "crystal"))) - toRemove.add(texture); - } - - // Remove all our found errors - missingTextures.get(mc).removeAll(toRemove); - - // Make sure to only remove the bad MC domain if no other textures are missing - if (missingTextures.get(mc).isEmpty()) { - missingTextures.keySet().remove(mc); - badTextureDomains.remove(mc); - } - BMLog.DEBUG.info("Suppressed required texture errors in {}", stopwatch.stop()); - } - - private static void renderRitualStones(ClientPlayerEntity player, float partialTicks) { - World world = player.getEntityWorld(); - ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); - Direction direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); - Ritual ritual = BloodMagic.RITUAL_MANAGER.getRitual(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); - - if (ritual == null) - return; - - GlStateManager.pushMatrix(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GlStateManager.color(1F, 1F, 1F, 0.6125F); - - BlockPos vec3, vX; - vec3 = minecraft.objectMouseOver.getBlockPos(); - double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; - double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; - double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - for (RitualComponent ritualComponent : components) { - vX = vec3.add(ritualComponent.getOffset(direction)); - double minX = vX.getX() - posX; - double minY = vX.getY() - posY; - double minZ = vX.getZ() - posZ; - - if (!world.getBlockState(vX).isOpaqueCube()) { - TextureAtlasSprite texture = null; - - switch (ritualComponent.getRuneType()) { - case BLANK: - texture = ritualStoneBlank; - break; - case WATER: - texture = ritualStoneWater; - break; - case FIRE: - texture = ritualStoneFire; - break; - case EARTH: - texture = ritualStoneEarth; - break; - case AIR: - texture = ritualStoneAir; - break; - case DAWN: - texture = ritualStoneDawn; - break; - case DUSK: - texture = ritualStoneDusk; - break; - } - - RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); - } - } - - GlStateManager.popMatrix(); - } - - public static void cycleSigil(ItemStack stack, PlayerEntity player, int dWheel) { - int mode = dWheel; - if (!ConfigHandler.client.sigilHoldingSkipsEmptySlots) { - mode = ItemSigilHolding.getCurrentItemOrdinal(stack); - mode = dWheel < 0 ? ItemSigilHolding.next(mode) : ItemSigilHolding.prev(mode); - } - - ItemSigilHolding.cycleToNextSigil(stack, mode); - BloodMagicPacketHandler.INSTANCE.sendToServer(new SigilHoldingPacketProcessor(player.inventory.currentItem, mode)); - ItemStack newStack = ItemSigilHolding.getItemStackInSlot(stack, ItemSigilHolding.getCurrentItemOrdinal(stack)); - player.sendStatusMessage(newStack.isEmpty() ? new StringTextComponent("") : newStack.getTextComponent(), true); - } - - private static TextureAtlasSprite forName(AtlasTexture textureMap, String name, String dir) { - return textureMap.registerSprite(new ResourceLocation(Constants.Mod.DOMAIN + dir + "/" + name)); - } - - public static void renderRitualStones(TileMasterRitualStone masterRitualStone, float partialTicks) { - ClientPlayerEntity player = minecraft.player; - World world = player.getEntityWorld(); - Direction direction = mrsHoloDirection; - Ritual ritual = mrsHoloRitual; - - if (ritual == null) - return; - - GlStateManager.pushMatrix(); - GlStateManager.enableBlend(); - GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GlStateManager.color(1F, 1F, 1F, 0.5F); - - BlockPos vec3, vX; - vec3 = masterRitualStone.getPos(); - double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks; - double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks; - double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks; - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - for (RitualComponent ritualComponent : components) { - vX = vec3.add(ritualComponent.getOffset(direction)); - double minX = vX.getX() - posX; - double minY = vX.getY() - posY; - double minZ = vX.getZ() - posZ; - - if (!world.getBlockState(vX).isOpaqueCube()) { - TextureAtlasSprite texture = null; - - switch (ritualComponent.getRuneType()) { - case BLANK: - texture = ritualStoneBlank; - break; - case WATER: - texture = ritualStoneWater; - break; - case FIRE: - texture = ritualStoneFire; - break; - case EARTH: - texture = ritualStoneEarth; - break; - case AIR: - texture = ritualStoneAir; - break; - case DAWN: - texture = ritualStoneDawn; - break; - case DUSK: - texture = ritualStoneDusk; - break; - } - - RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ); - } - } - - GlStateManager.popMatrix(); - } - - public static void setRitualHolo(TileMasterRitualStone masterRitualStone, Ritual ritual, Direction direction, boolean displayed) { - mrsHoloDisplay = displayed; - mrsHoloTile = masterRitualStone; - mrsHoloRitual = ritual; - mrsHoloDirection = direction; - } - - public static void setRitualHoloToNull() { - mrsHoloDisplay = false; - mrsHoloTile = null; - mrsHoloRitual = null; - mrsHoloDirection = Direction.NORTH; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java deleted file mode 100644 index 72f4cec8..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/CraftingHandler.java +++ /dev/null @@ -1,149 +0,0 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.item.types.ComponentTypes; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.event.AltarCraftedEvent; -import WayofTime.bloodmagic.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.ItemHelper; -import WayofTime.bloodmagic.util.helper.NBTHelper; -import WayofTime.bloodmagic.block.BlockLifeEssence; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.item.ItemInscriptionTool; -import net.minecraft.item.*; -import net.minecraft.item.BannerItem; -import net.minecraft.item.Items; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.FurnaceTileEntity; -import net.minecraftforge.common.ForgeModContainer; -import net.minecraftforge.event.AnvilUpdateEvent; -import net.minecraftforge.event.furnace.FurnaceFuelBurnTimeEvent; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import java.util.ArrayList; -import java.util.List; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class CraftingHandler { - - // Sets the uses of crafted Inscription Tools to 10 - @SubscribeEvent - public static void onAltarCrafted(AltarCraftedEvent event) { - if (event.getOutput() == null) { - return; - } - - if (event.getOutput().getItem() instanceof ItemInscriptionTool) { - NBTHelper.checkNBT(event.getOutput()); - event.getOutput().getTagCompound().setInteger(Constants.NBT.USES, 10); - } - - if (event.getOutput().getItem() == ForgeModContainer.getInstance().universalBucket && event.getAltarRecipe().getSyphon() == 1000) { - CompoundNBT bucketTags = FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)).getTagCompound(); - event.getOutput().setTagCompound(bucketTags); - } - } - - // Handles crafting of: Revealing Upgrade Tome, Elytra Upgrade Tome, Combining Upgrade Tomes, Setting Upgrade for Trainer - @SubscribeEvent - public static void onAnvil(AnvilUpdateEvent event) { - // TODO - Azanor come back :( -// if (ConfigHandler.thaumcraftGogglesUpgrade) { -// if (event.getLeft().getItem() == RegistrarBloodMagicItems.LIVING_ARMOUR_HELMET && event.getRight().getItem() == Constants.Compat.THAUMCRAFT_GOGGLES && !event.getRight().isItemDamaged()) { -// ItemStack output = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); -// output = NBTHelper.checkNBT(output); -// ItemHelper.LivingUpgrades.setKey(output, BloodMagic.MODID + ".upgrade.revealing"); -// ItemHelper.LivingUpgrades.setLevel(output, 1); -// event.setCost(1); -// -// event.setOutput(output); -// -// return; -// } -// } - - if (event.getLeft().getItem() == RegistrarBloodMagicItems.SIGIL_HOLDING) { - if (event.getRight().getItem() == Items.NAME_TAG) { - ItemStack output = event.getLeft().copy(); - if (!output.hasTagCompound()) - output.setTagCompound(new CompoundNBT()); - output.getTagCompound().setString(Constants.NBT.COLOR, event.getRight().getDisplayName()); - event.setCost(1); - - event.setOutput(output); - - return; - } - - if (event.getRight().getItem() == Items.DYE) { - DyeColor dyeColor = BannerItem.getBaseColor(event.getRight()); - ItemStack output = event.getLeft().copy(); - if (!output.hasTagCompound()) - output.setTagCompound(new CompoundNBT()); - output.getTagCompound().setString(Constants.NBT.COLOR, String.valueOf(Utils.DYE_COLOR_VALUES.getOrDefault(dyeColor, 0))); - event.setCost(1); - - event.setOutput(output); - - return; - } - } - - if (event.getLeft().getItem() == Items.BOOK && event.getRight().getItem() == Items.ELYTRA && !event.getRight().isItemDamaged()) { - ItemStack output = new ItemStack(RegistrarBloodMagicItems.UPGRADE_TOME); - output = NBTHelper.checkNBT(output); - ItemHelper.LivingUpgrades.setKey(output, BloodMagic.MODID + ".upgrade.elytra"); - ItemHelper.LivingUpgrades.setLevel(output, 1); - event.setCost(30); - - event.setOutput(output); - - return; - } - - if (event.getLeft().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) { - LivingArmourUpgrade leftUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getLeft()); - if (leftUpgrade != null && !leftUpgrade.isDowngrade() && ItemHelper.LivingUpgrades.getKey(event.getLeft()).equals(ItemHelper.LivingUpgrades.getKey(event.getRight()))) { - int leftLevel = ItemHelper.LivingUpgrades.getLevel(event.getLeft()); - int rightLevel = ItemHelper.LivingUpgrades.getLevel(event.getRight()); - - if (leftLevel == rightLevel && leftLevel < leftUpgrade.getMaxTier() - 1) { - ItemStack outputStack = event.getLeft().copy(); - ItemHelper.LivingUpgrades.setLevel(outputStack, leftLevel + 1); - event.setCost(leftLevel + 2); - - event.setOutput(outputStack); - - return; - } - } - } - - if (event.getLeft().getItem() instanceof IUpgradeTrainer && event.getRight().getItem() == RegistrarBloodMagicItems.UPGRADE_TOME) { - LivingArmourUpgrade rightUpgrade = ItemHelper.LivingUpgrades.getUpgrade(event.getRight()); - if (rightUpgrade != null) { - String key = ItemHelper.LivingUpgrades.getKey(event.getRight()); - ItemStack outputStack = event.getLeft().copy(); - List keyList = new ArrayList<>(); - keyList.add(key); - if (((IUpgradeTrainer) event.getLeft().getItem()).setTrainedUpgrades(outputStack, keyList)) { - event.setCost(1); - - event.setOutput(outputStack); - } - } - } - } - - @SubscribeEvent - public static void handleFuelLevel(FurnaceFuelBurnTimeEvent event) { - if (ItemStack.areItemsEqual(event.getItemStack(), ComponentTypes.SAND_COAL.getStack())) - event.setBurnTime(FurnaceTileEntity.getItemBurnTime(new ItemStack(Items.COAL))); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java index 23165c69..78d5db9f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -1,565 +1,73 @@ -package WayofTime.bloodmagic.util.handler.event; +package wayoftime.bloodmagic.util.handler.event; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.impl.BloodMagicAPI; -import WayofTime.bloodmagic.block.BlockAltar; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter; -import WayofTime.bloodmagic.event.ItemBindEvent; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; -import WayofTime.bloodmagic.event.TeleposeEvent; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.iface.ISentientTool; -import WayofTime.bloodmagic.item.ItemAltarMaker; -import WayofTime.bloodmagic.item.ItemExperienceBook; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeBattleHungry; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSelfSacrifice; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; -import WayofTime.bloodmagic.network.BloodMagicPacketHandler; -import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.potion.BMPotionUtils; -import WayofTime.bloodmagic.potion.PotionEventHandlers; -import WayofTime.bloodmagic.ritual.AreaDescriptor; -import WayofTime.bloodmagic.ritual.IMasterRitualStone; -import WayofTime.bloodmagic.ritual.RitualManager; -import WayofTime.bloodmagic.ritual.types.RitualVeilOfEvil; -import WayofTime.bloodmagic.ritual.types.RitualWardOfSacrosanctity; -import WayofTime.bloodmagic.soul.DemonWillHolder; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.util.Utils; -import WayofTime.bloodmagic.util.helper.BindableHelper; -import WayofTime.bloodmagic.util.helper.ItemHelper; -import WayofTime.bloodmagic.util.helper.NetworkHelper; -import WayofTime.bloodmagic.util.helper.PlayerHelper; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.goal.NearestAttackableTargetGoal; -import net.minecraft.entity.ai.goal.TargetGoal; -import net.minecraft.entity.ai.goal.MeleeAttackGoal; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.ServerPlayerEntity; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.potion.Effects; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Hand; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.TranslationTextComponent; -import net.minecraft.world.Explosion; -import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.item.ItemTossEvent; -import net.minecraftforge.event.entity.living.LivingDropsEvent; -import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; -import net.minecraftforge.event.entity.living.LivingFallEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.living.LivingSpawnEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; -import net.minecraftforge.event.world.ExplosionEvent; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.Event.Result; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import net.minecraftforge.fml.common.registry.EntityEntry; -import net.minecraftforge.fml.common.registry.EntityRegistry; - -import java.util.*; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class GenericHandler { - public static Map> bounceMapMap = new HashMap<>(); - public static Map> filledHandMapMap = new HashMap<>(); - private static Map> targetTaskMapMap = new HashMap<>(); - private static Map> attackTaskMapMap = new HashMap<>(); - public static Map> preventSpawnMap = new HashMap<>(); - public static Map> forceSpawnMap = new HashMap<>(); - public static Set featherRitualSet; - - @SubscribeEvent - public static void onEntityFall(LivingFallEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - if (player.isPotionActive(RegistrarBloodMagic.BOUNCE) && !player.isSneaking() && event.getDistance() > 2) { - event.setDamageMultiplier(0); - - if (player.getEntityWorld().isRemote) { - player.motionY *= -0.9; - player.fallDistance = 0; - bounceMapMap.get(player.getEntityWorld()).put(player, player.motionY); - } else { - player.fallDistance = 0; - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - public static void playerTickPost(TickEvent.PlayerTickEvent event) { - World world = event.player.getEntityWorld(); - Map bounceMap = bounceMapMap.get(world); - if (event.phase == TickEvent.Phase.END && bounceMap.containsKey(event.player)) { - event.player.motionY = bounceMap.remove(event.player); - } - - Map filledHandMap = filledHandMapMap.get(world); - if (event.phase == TickEvent.Phase.END) { - if (filledHandMap.containsKey(event.player)) { - int value = filledHandMap.get(event.player) - 1; - if (value <= 0) { - filledHandMap.remove(event.player); - } else { - filledHandMap.put(event.player, value); - } - } - } - } - - @SubscribeEvent - public static void onPlayerClick(PlayerInteractEvent event) { - if (event.isCancelable() && event.getEntityPlayer().isPotionActive(RegistrarBloodMagic.CONSTRICT)) { - PlayerEntity player = event.getEntityPlayer(); - int level = player.getActivePotionEffect(RegistrarBloodMagic.CONSTRICT).getAmplifier(); - if (event.getHand() == Hand.OFF_HAND || level > 1) { - event.setCanceled(true); - } - } - } - - @SubscribeEvent - public static void onPlayerDropItem(ItemTossEvent event) { - ItemEntity itemEntity = event.getEntityItem(); - if (itemEntity != null) { - ItemStack stack = itemEntity.getItem(); - Item item = stack.getItem(); - if (stack.hasTagCompound() && item instanceof ISentientTool) { - if (((ISentientTool) item).spawnSentientEntityOnDrop(stack, event.getPlayer())) { - event.setCanceled(true); - } - } - } - } - - @SubscribeEvent - public static void onExplosion(ExplosionEvent.Start event) { - World world = event.getWorld(); - Explosion exp = event.getExplosion(); - Vec3d position = exp.getPosition(); - double radius = 3; - - AxisAlignedBB bb = new AxisAlignedBB(position.x - radius, position.y - radius, position.z - radius, position.x + radius, position.y + radius, position.z + radius); - List specterList = world.getEntitiesWithinAABB(EntitySentientSpecter.class, bb); - if (!specterList.isEmpty()) { - for (EntitySentientSpecter specter : specterList) { - if (specter.absorbExplosion(exp)) { - event.setCanceled(true); - return; - } - } - } - } - - @SubscribeEvent - public static void onEntityHurt(LivingHurtEvent event) { - if (event.getEntity().getEntityWorld().isRemote) - return; - - if (event.getSource().getTrueSource() instanceof PlayerEntity && !PlayerHelper.isFakePlayer((PlayerEntity) event.getSource().getTrueSource())) { - PlayerEntity player = (PlayerEntity) event.getSource().getTrueSource(); - - if (!player.getItemStackFromSlot(EquipmentSlotType.CHEST).isEmpty() && player.getItemStackFromSlot(EquipmentSlotType.CHEST).getItem() instanceof ItemPackSacrifice) { - ItemPackSacrifice pack = (ItemPackSacrifice) player.getItemStackFromSlot(EquipmentSlotType.CHEST).getItem(); - - boolean shouldSyphon = pack.getStoredLP(player.getItemStackFromSlot(EquipmentSlotType.CHEST)) < pack.CAPACITY; - float damageDone = event.getEntityLiving().getHealth() < event.getAmount() ? event.getAmount() - event.getEntityLiving().getHealth() : event.getAmount(); - int totalLP = Math.round(damageDone * ConfigHandler.values.coatOfArmsConversion); - - if (shouldSyphon) - ItemHelper.LPContainer.addLPToItem(player.getItemStackFromSlot(EquipmentSlotType.CHEST), totalLP, pack.CAPACITY); - } - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.battleHunger", chestStack); - if (upgrade instanceof LivingArmourUpgradeBattleHungry) { - ((LivingArmourUpgradeBattleHungry) upgrade).resetTimer(); - } - } - } - } - } - - // Handles sending the client the Demon Will Aura updates - @SubscribeEvent - public static void onLivingUpdate(LivingUpdateEvent event) { - if (!event.getEntityLiving().getEntityWorld().isRemote) { - LivingEntity entity = event.getEntityLiving(); - if (entity instanceof PlayerEntity && entity.ticksExisted % 50 == 0) //TODO: Change to an incremental counter - { - sendPlayerDemonWillAura((PlayerEntity) entity); - } - - World world = entity.getEntityWorld(); - Map targetTaskMap = targetTaskMapMap.get(world); - Map attackTaskMap = attackTaskMapMap.get(world); - if (event.getEntityLiving() instanceof AnimalEntity) { - AnimalEntity animal = (AnimalEntity) event.getEntityLiving(); - if (animal.isPotionActive(RegistrarBloodMagic.SACRIFICIAL_LAMB)) { - if (!targetTaskMap.containsKey(animal)) { - TargetGoal task = new NearestAttackableTargetGoal<>(animal, MonsterEntity.class, false); - Goal attackTask = new MeleeAttackGoal(animal, 1.0D, false); - animal.targetTasks.addTask(1, task); - animal.tasks.addTask(1, attackTask); - targetTaskMap.put(animal, task); - attackTaskMap.put(animal, attackTask); - } - - if (animal.getAttackTarget() != null && animal.getDistanceSq(animal.getAttackTarget()) < 4) { - animal.getEntityWorld().createExplosion(null, animal.posX, animal.posY + (double) (animal.height / 16.0F), animal.posZ, 2 + animal.getActivePotionEffect(RegistrarBloodMagic.SACRIFICIAL_LAMB).getAmplifier() * 1.5f, false); - targetTaskMap.remove(animal); - attackTaskMap.remove(animal); - } - } else if (targetTaskMap.containsKey(animal)) { - targetTaskMap.remove(animal); - attackTaskMap.remove(animal); - } - } - } - - LivingEntity entity = event.getEntityLiving(); - - if (entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - if (player.isSneaking() && player.isPotionActive(RegistrarBloodMagic.CLING) && Utils.isPlayerBesideSolidBlockFace(player) && !player.onGround) { - if (player.getEntityWorld().isRemote) { - player.motionY = 0; - player.motionX *= 0.8; - player.motionZ *= 0.8; - } else { - player.fallDistance = 0; - } - } - } - - if (entity.isPotionActive(Effects.NIGHT_VISION)) { - int duration = entity.getActivePotionEffect(Effects.NIGHT_VISION).getDuration(); - if (duration == Constants.Misc.NIGHT_VISION_CONSTANT_END) { - entity.removePotionEffect(Effects.NIGHT_VISION); - } - } - - if (entity.isPotionActive(RegistrarBloodMagic.FIRE_FUSE)) { - Random random = entity.getEntityWorld().rand; - entity.getEntityWorld().spawnParticle(EnumParticleTypes.FLAME, entity.posX + random.nextDouble() * 0.3, entity.posY + random.nextDouble() * 0.3, entity.posZ + random.nextDouble() * 0.3, 0, 0.06d, 0); - - int r = entity.getActivePotionEffect(RegistrarBloodMagic.FIRE_FUSE).getAmplifier(); - int radius = r + 1; - - if (entity.getActivePotionEffect(RegistrarBloodMagic.FIRE_FUSE).getDuration() <= 3) { - entity.getEntityWorld().createExplosion(null, entity.posX, entity.posY, entity.posZ, radius, false); - } - } - - if (entity.isPotionActive(RegistrarBloodMagic.PLANT_LEECH)) { - int amplifier = entity.getActivePotionEffect(RegistrarBloodMagic.PLANT_LEECH).getAmplifier(); - int timeRemaining = entity.getActivePotionEffect(RegistrarBloodMagic.PLANT_LEECH).getDuration(); - if (timeRemaining % 10 == 0) { - BMPotionUtils.damageMobAndGrowSurroundingPlants(entity, 2 + amplifier, 1, 0.5 * 3 / (amplifier + 3), 25 * (1 + amplifier)); - } - } - } - - // @SideOnly(Side.SERVER) - public static void sendPlayerDemonWillAura(PlayerEntity player) { - if (player instanceof ServerPlayerEntity) { - BlockPos pos = player.getPosition(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.getEntityWorld().provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); - if (holder != null) { - BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(holder), (ServerPlayerEntity) player); - } else { - BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(new DemonWillHolder()), (ServerPlayerEntity) player); - } - } - } - - // Handles destroying altar - @SubscribeEvent - public static void harvestEvent(PlayerEvent.HarvestCheck event) { - BlockState state = event.getTargetBlock(); - Block block = state.getBlock(); - if (block instanceof BlockAltar && event.getEntityPlayer() != null && event.getEntityPlayer() instanceof ServerPlayerEntity && !event.getEntityPlayer().getHeldItemMainhand().isEmpty() && event.getEntityPlayer().getHeldItemMainhand().getItem() instanceof ItemAltarMaker) { - ItemAltarMaker altarMaker = (ItemAltarMaker) event.getEntityPlayer().getHeldItemMainhand().getItem(); - event.getEntityPlayer().sendStatusMessage(new TranslationTextComponent("chat.bloodmagic.altarMaker.destroy", altarMaker.destroyAltar(event.getEntityPlayer())), true); - } - } - - // Handle Teleposer block blacklist - @SubscribeEvent - public static void onTelepose(TeleposeEvent event) { - if (BloodMagicAPI.INSTANCE.getBlacklist().getTeleposer().contains(event.initialState) || BloodMagicAPI.INSTANCE.getBlacklist().getTeleposer().contains(event.finalState)) - event.setCanceled(true); - } - - // Handle Teleposer entity blacklist - @SubscribeEvent - public static void onTeleposeEntity(TeleposeEvent.Ent event) { - EntityEntry entry = EntityRegistry.getEntry(event.entity.getClass()); - if (entry != null && BloodMagicAPI.INSTANCE.getBlacklist().getTeleposerEntities().contains(entry.getRegistryName())) - event.setCanceled(true); - } - - // Sets teleport cooldown for Teleposed entities to 5 ticks (1/4 second) instead of 150 (7.5 seconds) - @SubscribeEvent - public static void onTeleposeEntityPost(TeleposeEvent.Ent.Post event) { - event.entity.timeUntilPortal = 5; - } - - // Handles binding of IBindable's as well as setting a player's highest orb tier - @SubscribeEvent - public static void onInteract(PlayerInteractEvent.RightClickItem event) { - if (event.getWorld().isRemote) - return; - - PlayerEntity player = event.getEntityPlayer(); - - if (PlayerHelper.isFakePlayer(player)) - return; - - ItemStack held = event.getItemStack(); - if (!held.isEmpty() && held.getItem() instanceof IBindable) { // Make sure it's bindable - IBindable bindable = (IBindable) held.getItem(); - Binding binding = bindable.getBinding(held); - if (binding == null) { // If the binding is null, let's create one - if (bindable.onBind(player, held)) { - ItemBindEvent toPost = new ItemBindEvent(player, held); - if (MinecraftForge.EVENT_BUS.post(toPost)) // Allow cancellation of binding - return; - - BindableHelper.applyBinding(held, player); // Bind item to the player - } - // If the binding exists, we'll check if the player's name has changed since they last used it and update that if so. - } else if (binding.getOwnerId().equals(player.getGameProfile().getId()) && !binding.getOwnerName().equals(player.getGameProfile().getName())) { - binding.setOwnerName(player.getGameProfile().getName()); - BindableHelper.applyBinding(held, binding); - } - } - - if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) { - IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); - SoulNetwork network = NetworkHelper.getSoulNetwork(player); - - BloodOrb orb = bloodOrb.getOrb(held); - if (orb == null) - return; - - if (orb.getTier() > network.getOrbTier()) - network.setOrbTier(orb.getTier()); - } - } - - @SubscribeEvent - public static void selfSacrificeEvent(SacrificeKnifeUsedEvent event) { - PlayerEntity player = event.player; - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerSelfSacrifice.incrementCounter(armour, event.healthDrained / 2); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.selfSacrifice", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSelfSacrifice) { - double modifier = ((LivingArmourUpgradeSelfSacrifice) upgrade).getSacrificeModifier(); - - event.lpAdded = (int) (event.lpAdded * (1 + modifier)); - } - } - } - } - - // Drop Blood Shards - @SubscribeEvent - public static void onLivingDrops(LivingDropsEvent event) { - LivingEntity attackedEntity = event.getEntityLiving(); - DamageSource source = event.getSource(); - Entity entity = source.getTrueSource(); - - if (entity != null && entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - ItemStack heldStack = player.getHeldItemMainhand(); - - if (!heldStack.isEmpty() && heldStack.getItem() == RegistrarBloodMagicItems.BOUND_SWORD && !(attackedEntity instanceof AnimalEntity)) - for (int i = 0; i <= EnchantmentHelper.getLootingModifier(player); i++) - if (attackedEntity.getEntityWorld().rand.nextDouble() < 0.2) - event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD, 1, 0))); - } - } - - @SubscribeEvent - public static void onRitualDeath(LivingDropsEvent event) { - if (!ConfigHandler.values.wellOfSufferingDrops) { - if (event.getSource().equals(RitualManager.RITUAL_DAMAGE)) { - event.getDrops().clear(); - } - } - } - - // Experience Tome - @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onExperiencePickup(PlayerPickupXpEvent event) { - PlayerEntity player = event.getEntityPlayer(); - ItemStack itemstack = EnchantmentHelper.getEnchantedItem(Enchantments.MENDING, player); - - if (!Loader.isModLoaded("unmending")) { - if (!itemstack.isEmpty() && itemstack.isItemDamaged()) { - int i = Math.min(xpToDurability(event.getOrb().xpValue), itemstack.getItemDamage()); - event.getOrb().xpValue -= durabilityToXp(i); - itemstack.setItemDamage(itemstack.getItemDamage() - i); - } - } - - if (!player.getEntityWorld().isRemote) { - for (ItemStack stack : player.inventory.mainInventory) { - if (stack.getItem() instanceof ItemExperienceBook) { - ItemExperienceBook.addExperience(stack, event.getOrb().xpValue); - event.getOrb().xpValue = 0; - break; - } - } - } - } - - private static int xpToDurability(int xp) { - return xp * 2; - } - - private static int durabilityToXp(int durability) { - return durability / 2; - } - - // VeilOfEvil, WardOfSacrosanctity - @SubscribeEvent - public static void onLivingSpawnEvent(LivingSpawnEvent.CheckSpawn event) { - World world = event.getWorld(); - - if (!(event.getEntityLiving() instanceof MonsterEntity)) { - return; - } - - /* WardOfSacrosanctity */ - - if (preventSpawnMap.containsKey(world)) { - Map pMap = preventSpawnMap.get(world); - - if (pMap != null) { - for (Map.Entry entry : pMap.entrySet()) { - IMasterRitualStone masterRitualStone = entry.getKey(); - AreaDescriptor blockRange = entry.getValue(); - - if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualWardOfSacrosanctity) { - if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { - switch (event.getResult()) { - case ALLOW: - event.setResult(Result.DEFAULT); - break; - case DEFAULT: - event.setResult(Result.DENY); - break; - default: - break; - } - break; - } - } else { - pMap.remove(masterRitualStone); - } - } - } - } - - /* VeilOfEvil */ - - if (forceSpawnMap.containsKey(world)) { - Map fMap = forceSpawnMap.get(world); - - if (fMap != null) { - for (Map.Entry entry : fMap.entrySet()) { - IMasterRitualStone masterRitualStone = entry.getKey(); - AreaDescriptor blockRange = entry.getValue(); - - if (masterRitualStone != null && masterRitualStone.isActive() && masterRitualStone.getCurrentRitual() instanceof RitualVeilOfEvil) { - if (blockRange.offset(masterRitualStone.getBlockPos()).isWithinArea(new BlockPos(event.getX(), event.getY(), event.getZ()))) { - switch (event.getResult()) { - case DEFAULT: - event.setResult(Result.ALLOW); - break; - case DENY: - event.setResult(Result.DEFAULT); - default: - break; - } - break; - } - } else { - fMap.remove(masterRitualStone); - } - } - } - } - } - - @SubscribeEvent - public static void onWorldLoad(WorldEvent.Load event) { - World world = event.getWorld(); - bounceMapMap.computeIfAbsent(world, k -> new HashMap<>()); - filledHandMapMap.computeIfAbsent(world, k -> new HashMap<>()); - attackTaskMapMap.computeIfAbsent(world, k -> new HashMap<>()); - targetTaskMapMap.computeIfAbsent(world, k -> new HashMap<>()); - forceSpawnMap.computeIfAbsent(world, k -> new HashMap<>()); - preventSpawnMap.computeIfAbsent(world, k -> new HashMap<>()); - PotionEventHandlers.flightListMap.computeIfAbsent(world, k -> new ArrayList<>()); - PotionEventHandlers.noGravityListMap.computeIfAbsent(world, k -> new ArrayList<>()); - } - - @SubscribeEvent - public static void onWorldUnload(WorldEvent.Unload event) { - World world = event.getWorld(); - bounceMapMap.remove(world); - filledHandMapMap.remove(world); - attackTaskMapMap.remove(world); - targetTaskMapMap.remove(world); - PotionEventHandlers.flightListMap.remove(world); - PotionEventHandlers.noGravityListMap.remove(world); - } +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.event.ItemBindEvent; +import wayoftime.bloodmagic.iface.IBindable; +import wayoftime.bloodmagic.orb.BloodOrb; +import wayoftime.bloodmagic.orb.IBloodOrb; +import wayoftime.bloodmagic.util.helper.BindableHelper; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +@Mod.EventBusSubscriber(modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class GenericHandler +{ + // Handles binding of IBindable's as well as setting a player's highest orb tier + @SubscribeEvent + public void onInteract(PlayerInteractEvent.RightClickItem event) + { + if (event.getWorld().isRemote) + return; + + PlayerEntity player = event.getPlayer(); + + if (PlayerHelper.isFakePlayer(player)) + return; + + ItemStack held = event.getItemStack(); + if (!held.isEmpty() && held.getItem() instanceof IBindable) + { // Make sure it's bindable + IBindable bindable = (IBindable) held.getItem(); + Binding binding = bindable.getBinding(held); + if (binding == null) + { // If the binding is null, let's create one + if (bindable.onBind(player, held)) + { + ItemBindEvent toPost = new ItemBindEvent(player, held); + if (MinecraftForge.EVENT_BUS.post(toPost)) // Allow cancellation of binding + return; + + BindableHelper.applyBinding(held, player); // Bind item to the player + } + // If the binding exists, we'll check if the player's name has changed since + // they last used it and update that if so. + } else if (binding.getOwnerId().equals(player.getGameProfile().getId()) + && !binding.getOwnerName().equals(player.getGameProfile().getName())) + { + binding.setOwnerName(player.getGameProfile().getName()); + BindableHelper.applyBinding(held, binding); + } + } + + if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) + { + IBloodOrb bloodOrb = (IBloodOrb) held.getItem(); + SoulNetwork network = NetworkHelper.getSoulNetwork(player); + + BloodOrb orb = bloodOrb.getOrb(held); + if (orb == null) + return; + + if (orb.getTier() > network.getOrbTier()) + network.setOrbTier(orb.getTier()); + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java deleted file mode 100644 index 5c65682b..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/LivingArmourHandler.java +++ /dev/null @@ -1,372 +0,0 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.soul.ItemSentientBow; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeCrippledArm; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeQuenched; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeSlowHeal; -import WayofTime.bloodmagic.livingArmour.downgrade.LivingArmourUpgradeStormTrooper; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerArrowShot; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerFallProtect; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerGrimReaperSprint; -import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerJump; -import WayofTime.bloodmagic.livingArmour.upgrade.*; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.AbstractArrowEntity; -import net.minecraft.entity.projectile.ThrowableEntity; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.*; -import net.minecraft.item.ArrowItem; -import net.minecraft.item.SplashPotionItem; -import net.minecraft.item.Items; -import net.minecraft.item.UseAction; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -import net.minecraftforge.event.entity.EntityJoinWorldEvent; -import net.minecraftforge.event.entity.ProjectileImpactEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.event.entity.living.LivingFallEvent; -import net.minecraftforge.event.entity.living.LivingHealEvent; -import net.minecraftforge.event.entity.player.ArrowLooseEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class LivingArmourHandler { - - @SubscribeEvent - public static void onEntityHealed(LivingHealEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntity(); - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - double modifier = 1; - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.slowHeal", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSlowHeal) { - modifier *= ((LivingArmourUpgradeSlowHeal) upgrade).getHealingModifier(); - } - - if (modifier != 1) { - event.setAmount((float) (event.getAmount() * modifier)); - } - } - } - } - } - - @SubscribeEvent - public static void onMiningSpeedCheck(PlayerEvent.BreakSpeed event) { - PlayerEntity player = event.getEntityPlayer(); - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - double modifier = 1; - for (LivingArmourUpgrade upgrade : armour.upgradeMap.values()) { - modifier *= upgrade.getMiningSpeedModifier(player); - } - - if (modifier != 1) { - event.setNewSpeed((float) (event.getOriginalSpeed() * modifier)); - } - } - } - } - - // Applies: Storm Trooper - @SubscribeEvent - public static void onEntityJoinedWorld(EntityJoinWorldEvent event) { - Entity owner = null; - if (event.getEntity() instanceof AbstractArrowEntity) { - owner = ((AbstractArrowEntity) event.getEntity()).shootingEntity; - } else if (event.getEntity() instanceof ThrowableEntity) { - owner = ((ThrowableEntity) event.getEntity()).getThrower(); - } - - if (owner instanceof PlayerEntity) { - Entity projectile = event.getEntity(); - PlayerEntity player = (PlayerEntity) owner; - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stormTrooper", chestStack); - - if (upgrade instanceof LivingArmourUpgradeStormTrooper) { - float velocityModifier = (float) (((LivingArmourUpgradeStormTrooper) upgrade).getArrowJiggle(player) * Math.sqrt(projectile.motionX * projectile.motionX + projectile.motionY * projectile.motionY + projectile.motionZ * projectile.motionZ)); - - projectile.motionX += 2 * (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - projectile.motionY += 2 * (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - projectile.motionZ += 2 * (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - } - } - } - } - } - - @SubscribeEvent - public static void onPlayerClick(PlayerInteractEvent event) { - if (event.isCancelable()) { - PlayerEntity player = event.getEntityPlayer(); - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (event.getHand() == Hand.OFF_HAND) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.crippledArm", chestStack); - - if (upgrade instanceof LivingArmourUpgradeCrippledArm) { - event.setCanceled(true); - } - } - - if (event.getItemStack().getItemUseAction() == UseAction.DRINK) { - ItemStack drinkStack = event.getItemStack(); - if (!(drinkStack.getItem() instanceof SplashPotionItem)) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.quenched", chestStack); - - if (upgrade instanceof LivingArmourUpgradeQuenched) { - event.setCanceled(true); - } - } - } - } - } - } - } - - // Applies: Grim Reaper - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityDeath(LivingDeathEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerGrimReaperSprint.incrementCounter(armour); - - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.grimReaper", chestStack); - - if (upgrade instanceof LivingArmourUpgradeGrimReaperSprint && ((LivingArmourUpgradeGrimReaperSprint) upgrade).canSavePlayer(player)) { - ((LivingArmourUpgradeGrimReaperSprint) upgrade).applyEffectOnRebirth(player); - event.setCanceled(true); - event.setResult(Event.Result.DENY); - } - - armour.writeDirtyToNBT(ItemLivingArmour.getArmourTag(chestStack)); - } - } - } - } - - // Applies: Jump - @SubscribeEvent - public static void onJumpEvent(LivingEvent.LivingJumpEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerJump.incrementCounter(armour); - - if (!player.isSneaking()) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.jump", chestStack); - - if (upgrade instanceof LivingArmourUpgradeJump) { - player.motionY += ((LivingArmourUpgradeJump) upgrade).getJumpModifier(); - } - } - } - } - } - } - - // Applies: Step Assist, Speed Boost - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onEntityUpdate(LivingEvent.LivingUpdateEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - boolean hasAssist = false; - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { - hasAssist = true; - player.stepHeight = Constants.Misc.ALTERED_STEP_HEIGHT; - } else { - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.stepAssist", chestStack); - - if (upgrade instanceof LivingArmourUpgradeStepAssist) { - if (!player.isSneaking()) { - player.stepHeight = ((LivingArmourUpgradeStepAssist) upgrade).getStepAssist(); - hasAssist = true; - } else { - player.stepHeight = 0.6F; - } - } - } - } - } - - if (!hasAssist && player.stepHeight == Constants.Misc.ALTERED_STEP_HEIGHT) - player.stepHeight = 0.6f; - - float percentIncrease = 0; - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmourFromStack(chestStack); - if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgradeFromNBT(BloodMagic.MODID + ".upgrade.movement", chestStack); - - if (upgrade instanceof LivingArmourUpgradeSpeed) { - percentIncrease += ((LivingArmourUpgradeSpeed) upgrade).getSpeedModifier(); - } - } - } - - if (event.getEntityLiving().isPotionActive(RegistrarBloodMagic.BOOST)) { - int i = event.getEntityLiving().getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); - { - percentIncrease += (i + 1) * 0.5f; - } - } - - if (percentIncrease > 0 && (player.onGround || player.capabilities.isFlying) && (Math.abs(player.moveForward) > 0 || Math.abs(player.moveStrafing) > 0)) { - player.travel(player.moveStrafing * percentIncrease, 0, player.moveForward * percentIncrease); - } - } - } - - // Applies: Arrow Shot - // Tracks: Arrow Shot - @SubscribeEvent - public static void onArrowFire(ArrowLooseEvent event) { - World world = event.getEntityPlayer().getEntityWorld(); - ItemStack stack = event.getBow(); - PlayerEntity player = event.getEntityPlayer(); - boolean sentientShot = false; - - if (world.isRemote) - return; - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerArrowShot.incrementCounter(armour); - - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.arrowShot", chestStack); - if (upgrade instanceof LivingArmourUpgradeArrowShot) { - int charge = event.getCharge(); - float velocity = (float) charge / 20.0F; - velocity = (velocity * velocity + velocity * 2.0F) / 3.0F; - - if ((double) velocity < 0.1D) - return; - - if (velocity > 1.0F) - velocity = 1.0F; - if (event.getBow().getItem() instanceof ItemSentientBow) { - sentientShot = true; - } - int extraArrows = ((LivingArmourUpgradeArrowShot) upgrade).getExtraArrows(); - for (int n = 0; n < extraArrows; n++) { - ItemStack arrowStack = new ItemStack(Items.ARROW); - ArrowItem itemarrow = (ArrowItem) ((stack.getItem() instanceof ArrowItem ? arrowStack.getItem() : Items.ARROW)); - AbstractArrowEntity entityarrow; - if (sentientShot) { // if the arrow was fired from a sentient bow - ItemSentientBow sentientBow = (ItemSentientBow) stack.getItem(); - entityarrow = sentientBow.getDuplicateArrow(stack, world, player, 1 / extraArrows); - } else { - entityarrow = itemarrow.createArrow(world, arrowStack, player); - } - entityarrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0F, velocity * 3.0F, 1.0F); - entityarrow.addTag("arrow_shot"); - float velocityModifier = 0.6f * velocity; - - entityarrow.motionX += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - entityarrow.motionY += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - entityarrow.motionZ += (event.getWorld().rand.nextDouble() - 0.5) * velocityModifier; - - if (velocity == 1.0F) - entityarrow.setIsCritical(true); - - int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.POWER, stack); - - if (powerLevel > 0) - entityarrow.setDamage(entityarrow.getDamage() + (double) powerLevel * 0.5D + 0.5D); - - int punchLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.PUNCH, stack); - - if (punchLevel > 0) - entityarrow.setKnockbackStrength(punchLevel); - - if (EnchantmentHelper.getEnchantmentLevel(Enchantments.FLAME, stack) > 0) - entityarrow.setFire(100); - - entityarrow.pickupStatus = AbstractArrowEntity.PickupStatus.CREATIVE_ONLY; - - world.spawnEntity(entityarrow); - } - } - } - } - } - - // Applies: Softfall - @SubscribeEvent - public static void onPlayerFall(LivingFallEvent event) { - if (event.getEntityLiving() instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) event.getEntityLiving(); - - if (LivingArmour.hasFullSet(player)) { - - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerFallProtect.incrementCounter(armour, event.getDamageMultiplier() * (event.getDistance() - 3)); - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.fallProtect", chestStack); - if (upgrade instanceof LivingArmourUpgradeFallProtect) { - LivingArmourUpgradeFallProtect fallUpgrade = (LivingArmourUpgradeFallProtect) upgrade; - event.setDamageMultiplier(event.getDamageMultiplier() * fallUpgrade.getDamageMultiplier()); - } - } - } - } - } - - // Applies: Arrow Shot - @SubscribeEvent - public static void onProjectileImpact(ProjectileImpactEvent.Arrow event) { - if (event.getArrow().removeTag("arrow_shot")) { - Entity entity = event.getRayTraceResult().entityHit; - - if (entity != null) { - entity.hurtResistantTime = 0; - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java deleted file mode 100644 index 163e3ef9..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/StatTrackerHandler.java +++ /dev/null @@ -1,175 +0,0 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.item.armour.ItemLivingArmour; -import WayofTime.bloodmagic.item.armour.ItemSentientArmour; -import WayofTime.bloodmagic.livingArmour.LivingArmour; -import WayofTime.bloodmagic.livingArmour.tracker.*; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeDigging; -import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeExperience; -import WayofTime.bloodmagic.util.Utils; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.EquipmentSlotType; -import net.minecraft.item.ShovelItem; -import net.minecraft.potion.Effects; -import net.minecraft.item.ItemStack; -import net.minecraft.util.DamageSource; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.event.entity.living.LivingHealEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.EventPriority; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class StatTrackerHandler { - - private static float lastPlayerSwingStrength = 0; - - // Tracks: Digging, DigSlowdown - @SubscribeEvent - public static void blockBreakEvent(BlockEvent.BreakEvent event) { - PlayerEntity player = event.getPlayer(); - if (player != null) { - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - if (chestStack.getItem() instanceof ItemLivingArmour) { - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - - if (armour != null) { - StatTrackerDigging.incrementCounter(armour); - LivingArmourUpgradeDigging.hasDug(armour); - } - } - } - } - } - - // Tracks: Health Boost - @SubscribeEvent - public static void onEntityHealed(LivingHealEvent event) { - LivingEntity healedEntity = event.getEntityLiving(); - if (!(healedEntity instanceof PlayerEntity)) { - return; - } - - PlayerEntity player = (PlayerEntity) healedEntity; - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - StatTrackerHealthboost.incrementCounter(armour, event.getAmount()); - if (player.getEntityWorld().canSeeSky(player.getPosition()) && player.getEntityWorld().provider.isDaytime()) { - StatTrackerSolarPowered.incrementCounter(armour, event.getAmount()); - } - } - } - } - - @SubscribeEvent - public static void onLivingAttack(AttackEntityEvent event) { - lastPlayerSwingStrength = event.getEntityPlayer().getCooledAttackStrength(0); - } - - // Tracks: Fall Protect, Arrow Protect, Physical Protect, Grave Digger, Sprint Attack, Critical Strike, Nocturnal Prowess - @SubscribeEvent - public static void entityHurt(LivingHurtEvent event) { - DamageSource source = event.getSource(); - Entity sourceEntity = event.getSource().getTrueSource(); - LivingEntity attackedEntity = event.getEntityLiving(); - - if (attackedEntity instanceof PlayerEntity) { - PlayerEntity attackedPlayer = (PlayerEntity) attackedEntity; - - // Living Armor Handling - if (LivingArmour.hasFullSet(attackedPlayer)) { - float amount = Math.min(Utils.getModifiedDamage(attackedPlayer, event.getSource(), event.getAmount()), attackedPlayer.getHealth()); - ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - if (sourceEntity != null && !source.isMagicDamage() && !source.isProjectile()) - StatTrackerPhysicalProtect.incrementCounter(armour, amount); - - if (source.equals(DamageSource.FALL)) - StatTrackerFallProtect.incrementCounter(armour, amount); - - if (source.isProjectile()) - StatTrackerArrowProtect.incrementCounter(armour, amount); - } - } else { - ItemStack chestStack = attackedPlayer.getItemStackFromSlot(EquipmentSlotType.CHEST); - if (chestStack.getItem() instanceof ItemSentientArmour) { - ItemSentientArmour armour = (ItemSentientArmour) chestStack.getItem(); - armour.onPlayerAttacked(chestStack, source, attackedPlayer); - } - } - } - - if (sourceEntity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) sourceEntity; - - // Living Armor Handling - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - ItemStack mainWeapon = player.getItemStackFromSlot(EquipmentSlotType.MAINHAND); - - event.setAmount((float) (event.getAmount() + lastPlayerSwingStrength * armour.getAdditionalDamageOnHit(event.getAmount(), player, attackedEntity, mainWeapon))); - - float amount = Math.min(Utils.getModifiedDamage(attackedEntity, event.getSource(), event.getAmount()), attackedEntity.getHealth()); - - if (!source.isProjectile()) { - StatTrackerMeleeDamage.incrementCounter(armour, amount); - - if (player.getEntityWorld().getLight(player.getPosition()) <= 9) - StatTrackerNightSight.incrementCounter(armour, amount); - - if (mainWeapon.getItem() instanceof ShovelItem) - StatTrackerGraveDigger.incrementCounter(armour, amount); - - if (player.isSprinting()) - StatTrackerSprintAttack.incrementCounter(armour, amount); - - boolean isCritical = lastPlayerSwingStrength > 0.9 && player.fallDistance > 0.0F && !player.onGround && !player.isOnLadder() && !player.isInWater() && !player.isPotionActive(Effects.BLINDNESS) && !player.isRiding() && !player.isSprinting(); - if (isCritical) - StatTrackerCriticalStrike.incrementCounter(armour, amount); - - double kb = armour.getKnockbackOnHit(player, attackedEntity, mainWeapon); - if (kb > 0) - attackedEntity.knockBack(player, (float) kb * 0.5F, (double) MathHelper.sin(player.rotationYaw * 0.017453292F), (double) (-MathHelper.cos(player.rotationYaw * 0.017453292F))); - } - } - } - } - } - - // Tracks: Experienced - @SubscribeEvent(priority = EventPriority.LOW) - public static void onExperiencePickup(PlayerPickupXpEvent event) { - PlayerEntity player = event.getEntityPlayer(); - - if (LivingArmour.hasFullSet(player)) { - ItemStack chestStack = player.getItemStackFromSlot(EquipmentSlotType.CHEST); - LivingArmour armour = ItemLivingArmour.getLivingArmour(chestStack); - if (armour != null) { - LivingArmourUpgrade upgrade = ItemLivingArmour.getUpgrade(BloodMagic.MODID + ".upgrade.experienced", chestStack); - if (upgrade instanceof LivingArmourUpgradeExperience) { - double modifier = ((LivingArmourUpgradeExperience) upgrade).getExperienceModifier(); - double exp = event.getOrb().xpValue * (1 + modifier); - - event.getOrb().xpValue = (int) Math.floor(exp) + (Math.random() < exp % 1 ? 1 : 0); - } - - StatTrackerExperience.incrementCounter(armour, event.getOrb().xpValue); - } - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java index 0380cf30..6f01c0e6 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/WillHandler.java @@ -1,166 +1,115 @@ -package WayofTime.bloodmagic.util.handler.event; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.soul.*; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicItems; -import WayofTime.bloodmagic.demonAura.PosXY; -import WayofTime.bloodmagic.demonAura.WillChunk; -import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; -import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.item.ItemEntity; -import net.minecraft.entity.monster.MonsterEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.potion.EffectInstance; -import net.minecraft.util.DamageSource; -import net.minecraft.util.IndirectEntityDamageSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.Difficulty; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingDropsEvent; -import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.world.ChunkDataEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.eventhandler.Event; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; +package wayoftime.bloodmagic.util.handler.event; import java.util.HashMap; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -@Mod.EventBusSubscriber(modid = BloodMagic.MODID) -public class WillHandler { +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.EffectInstance; +import net.minecraft.util.DamageSource; +import net.minecraft.world.Difficulty; +import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.potion.BloodMagicPotions; +import wayoftime.bloodmagic.will.EnumDemonWillType; +import wayoftime.bloodmagic.will.IDemonWill; +import wayoftime.bloodmagic.will.IDemonWillWeapon; +import wayoftime.bloodmagic.will.PlayerDemonWillHandler; - private static final HashMap SERVER_TICKS = new HashMap<>(); +@Mod.EventBusSubscriber(modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class WillHandler +{ + private static final HashMap SERVER_TICKS = new HashMap<>(); - // Adds Will to player - @SubscribeEvent - public static void onItemPickup(EntityItemPickupEvent event) { - ItemStack stack = event.getItem().getItem(); - if (stack.getItem() instanceof IDemonWill) { - PlayerEntity player = event.getEntityPlayer(); - EnumDemonWillType pickupType = ((IDemonWill) stack.getItem()).getType(stack); - ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack); + // Adds Will to player + @SubscribeEvent + public void onItemPickup(EntityItemPickupEvent event) + { + ItemStack stack = event.getItem().getItem(); + if (stack.getItem() instanceof IDemonWill) + { + PlayerEntity player = event.getPlayer(); + EnumDemonWillType pickupType = ((IDemonWill) stack.getItem()).getType(stack); + ItemStack remainder = PlayerDemonWillHandler.addDemonWill(player, stack); - if (remainder == null || ((IDemonWill) stack.getItem()).getWill(pickupType, stack) < 0.0001 || PlayerDemonWillHandler.isDemonWillFull(pickupType, player)) { - stack.setCount(0); - event.setResult(Event.Result.ALLOW); - } - } - } + if (remainder == null || ((IDemonWill) stack.getItem()).getWill(pickupType, stack) < 0.0001 + || PlayerDemonWillHandler.isDemonWillFull(pickupType, player)) + { + stack.setCount(0); + event.setResult(Event.Result.ALLOW); + } + } + } - @SubscribeEvent - public static void onEntityAttacked(LivingDeathEvent event) { - if (event.getSource() instanceof IndirectEntityDamageSource) { - Entity sourceEntity = event.getSource().getImmediateSource(); +// @SubscribeEvent +// public static void onEntityAttacked(LivingDeathEvent event) +// { +// if (event.getSource() instanceof EntityDamageSourceIndirect) +// { +// Entity sourceEntity = event.getSource().getImmediateSource(); +// +// if (sourceEntity instanceof EntitySentientArrow) +// { +// ((EntitySentientArrow) sourceEntity).reimbursePlayer(event.getEntityLiving(), event.getEntityLiving().getMaxHealth()); +// } +// } +// } - if (sourceEntity instanceof EntitySentientArrow) { - ((EntitySentientArrow) sourceEntity).reimbursePlayer(event.getEntityLiving(), event.getEntityLiving().getMaxHealth()); - } - } - } + // Add/Drop Demon Will for Player + @SubscribeEvent + public void onLivingDrops(LivingDropsEvent event) + { + LivingEntity attackedEntity = event.getEntityLiving(); + DamageSource source = event.getSource(); + Entity entity = source.getTrueSource(); - // Add/Drop Demon Will for Player - @SubscribeEvent - public static void onLivingDrops(LivingDropsEvent event) { - LivingEntity attackedEntity = event.getEntityLiving(); - DamageSource source = event.getSource(); - Entity entity = source.getTrueSource(); + if (attackedEntity.isPotionActive(BloodMagicPotions.soulSnare) && (attackedEntity instanceof MobEntity + || attackedEntity.getEntityWorld().getDifficulty() == Difficulty.PEACEFUL)) + { + EffectInstance eff = attackedEntity.getActivePotionEffect(BloodMagicPotions.soulSnare); + int lvl = eff.getAmplifier(); - if (attackedEntity.isPotionActive(RegistrarBloodMagic.SOUL_SNARE) && (attackedEntity instanceof MonsterEntity || attackedEntity.getEntityWorld().getDifficulty() == Difficulty.PEACEFUL)) { - EffectInstance eff = attackedEntity.getActivePotionEffect(RegistrarBloodMagic.SOUL_SNARE); - int lvl = eff.getAmplifier(); + double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 4 + 1; + ItemStack soulStack = ((IDemonWill) BloodMagicItems.MONSTER_SOUL_RAW.get()).createWill(amountOfSouls); + event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.getPosX(), attackedEntity.getPosY(), attackedEntity.getPosZ(), soulStack)); + } - double amountOfSouls = attackedEntity.getEntityWorld().rand.nextDouble() * (lvl + 1) * (lvl + 1) * 5; - ItemStack soulStack = ((IDemonWill) RegistrarBloodMagicItems.MONSTER_SOUL).createWill(0, amountOfSouls); - event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, soulStack)); - } + if (entity != null && entity instanceof PlayerEntity) + { + PlayerEntity player = (PlayerEntity) entity; + ItemStack heldStack = player.getHeldItemMainhand(); + if (heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) + { + IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); + List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); + if (!droppedSouls.isEmpty()) + { + ItemStack remainder; + for (ItemStack willStack : droppedSouls) + { + remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); - if (entity != null && entity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) entity; - ItemStack heldStack = player.getHeldItemMainhand(); - if (heldStack.getItem() instanceof IDemonWillWeapon && !player.getEntityWorld().isRemote) { - IDemonWillWeapon demonWillWeapon = (IDemonWillWeapon) heldStack.getItem(); - List droppedSouls = demonWillWeapon.getRandomDemonWillDrop(attackedEntity, player, heldStack, event.getLootingLevel()); - if (!droppedSouls.isEmpty()) { - ItemStack remainder; - for (ItemStack willStack : droppedSouls) { - remainder = PlayerDemonWillHandler.addDemonWill(player, willStack); - - if (!remainder.isEmpty()) { - EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); - if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) { - event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.posX, attackedEntity.posY, attackedEntity.posZ, remainder)); - } - } - } - player.inventoryContainer.detectAndSendChanges(); - } - } - } - } - - @SubscribeEvent - public static void onServerWorldTick(TickEvent.WorldTickEvent event) { - if (event.world.isRemote) - return; - - int dim = event.world.provider.getDimension(); - if (event.phase == TickEvent.Phase.END) { - if (!SERVER_TICKS.containsKey(dim)) - SERVER_TICKS.put(dim, 0); - - int ticks = (SERVER_TICKS.get(dim)); - - if (ticks % 20 == 0) { - CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(dim); - if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) { - for (PosXY pos : dirtyChunks) - event.world.markChunkDirty(new BlockPos(pos.x * 16, 5, pos.y * 16), null); - - dirtyChunks.clear(); - } - } - - SERVER_TICKS.put(dim, ticks + 1); - } - - } - - @SubscribeEvent - public static void chunkSave(ChunkDataEvent.Save event) { - int dim = event.getWorld().provider.getDimension(); - ChunkPos loc = event.getChunk().getPos(); - - CompoundNBT nbt = new CompoundNBT(); - event.getData().setTag("BloodMagic", nbt); - - WillChunk ac = WorldDemonWillHandler.getWillChunk(dim, loc.x, loc.z); - if (ac != null) { - nbt.putShort("base", ac.getBase()); - ac.getCurrentWill().writeToNBT(nbt, "current"); - if (!event.getChunk().isLoaded()) - WorldDemonWillHandler.removeWillChunk(dim, loc.x, loc.z); - } - } - - @SubscribeEvent - public static void chunkLoad(ChunkDataEvent.Load event) { - int dim = event.getWorld().provider.getDimension(); - if (event.getData().getCompoundTag("BloodMagic").hasKey("base")) { - CompoundNBT nbt = event.getData().getCompoundTag("BloodMagic"); - short base = nbt.getShort("base"); - DemonWillHolder current = new DemonWillHolder(); - current.readFromNBT(nbt, "current"); - WorldDemonWillHandler.addWillChunk(dim, event.getChunk(), base, current); - } else { - WorldDemonWillHandler.generateWill(event.getChunk()); - } - } + if (!remainder.isEmpty()) + { + EnumDemonWillType pickupType = ((IDemonWill) remainder.getItem()).getType(remainder); + if (((IDemonWill) remainder.getItem()).getWill(pickupType, remainder) >= 0.0001) + { + event.getDrops().add(new ItemEntity(attackedEntity.getEntityWorld(), attackedEntity.getPosX(), attackedEntity.getPosY(), attackedEntity.getPosZ(), remainder)); + } + } + } + player.container.detectAndSendChanges(); + } + } + } + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java index 63b7dc3b..061e6c6a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/BindableHelper.java @@ -1,49 +1,54 @@ -package WayofTime.bloodmagic.util.helper; +package wayoftime.bloodmagic.util.helper; -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.util.Constants; -import WayofTime.bloodmagic.event.ItemBindEvent; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.event.ItemBindEvent; +import wayoftime.bloodmagic.util.Constants; -public class BindableHelper { +public class BindableHelper +{ - public static void applyBinding(ItemStack stack, PlayerEntity player) { - Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); - applyBinding(stack, binding); - } + public static void applyBinding(ItemStack stack, PlayerEntity player) + { + Binding binding = new Binding(player.getGameProfile().getId(), player.getGameProfile().getName()); + applyBinding(stack, binding); + } - public static void applyBinding(ItemStack stack, Binding binding) { - if (!stack.hasTagCompound()) - stack.setTagCompound(new CompoundNBT()); + public static void applyBinding(ItemStack stack, Binding binding) + { + if (!stack.hasTag()) + stack.setTag(new CompoundNBT()); - stack.getTagCompound().setTag("binding", binding.serializeNBT()); - } + stack.getTag().put("binding", binding.serializeNBT()); + } - /** - * Sets the Owner Name of the item without checking if it is already bound. - * Also bypasses {@link ItemBindEvent}. - * - * @param stack - The ItemStack to bind - * @param ownerName - The username to bind the ItemStack to - */ - public static void setItemOwnerName(ItemStack stack, String ownerName) { - stack = NBTHelper.checkNBT(stack); + /** + * Sets the Owner Name of the item without checking if it is already bound. Also + * bypasses {@link ItemBindEvent}. + * + * @param stack - The ItemStack to bind + * @param ownerName - The username to bind the ItemStack to + */ + public static void setItemOwnerName(ItemStack stack, String ownerName) + { + stack = NBTHelper.checkNBT(stack); - stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, ownerName); - } + stack.getTag().putString(Constants.NBT.OWNER_NAME, ownerName); + } - /** - * Sets the Owner UUID of the item without checking if it is already bound. - * Also bypasses {@link ItemBindEvent}. - * - * @param stack - The ItemStack to bind - * @param ownerUUID - The UUID to bind the ItemStack to - */ - public static void setItemOwnerUUID(ItemStack stack, String ownerUUID) { - stack = NBTHelper.checkNBT(stack); + /** + * Sets the Owner UUID of the item without checking if it is already bound. Also + * bypasses {@link ItemBindEvent}. + * + * @param stack - The ItemStack to bind + * @param ownerUUID - The UUID to bind the ItemStack to + */ + public static void setItemOwnerUUID(ItemStack stack, String ownerUUID) + { + stack = NBTHelper.checkNBT(stack); - stack.getTagCompound().setString(Constants.NBT.OWNER_UUID, ownerUUID); - } -} + stack.getTag().putString(Constants.NBT.OWNER_UUID, ownerUUID); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java deleted file mode 100644 index 9e5796f5..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/IncenseHelper.java +++ /dev/null @@ -1,46 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; - -public class IncenseHelper { - - public static double getCurrentIncense(PlayerEntity player) { - CompoundNBT data = player.getEntityData(); - if (data.hasKey(Constants.NBT.CURRENT_INCENSE)) { - return data.getDouble(Constants.NBT.CURRENT_INCENSE); - } - - return 0; - } - - public static void setCurrentIncense(PlayerEntity player, double amount) { - CompoundNBT data = player.getEntityData(); - data.setDouble(Constants.NBT.CURRENT_INCENSE, amount); - } - - public static void setMaxIncense(PlayerEntity player, double amount) { - CompoundNBT data = player.getEntityData(); - data.setDouble(Constants.NBT.MAX_INCENSE, amount); - } - - public static double getMaxIncense(PlayerEntity player) { - CompoundNBT data = player.getEntityData(); - if (data.hasKey(Constants.NBT.MAX_INCENSE)) { - return data.getDouble(Constants.NBT.MAX_INCENSE); - } - return 0; - } - - public static void setHasMaxIncense(ItemStack stack, PlayerEntity player, boolean isMax) { - stack = NBTHelper.checkNBT(stack); - stack.getTagCompound().setBoolean(Constants.NBT.HAS_MAX_INCENSE, isMax); - } - - public static boolean getHasMaxIncense(ItemStack stack) { - stack = NBTHelper.checkNBT(stack); - return stack.getTagCompound().getBoolean(Constants.NBT.HAS_MAX_INCENSE); - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java deleted file mode 100644 index a0e53917..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/ItemHelper.java +++ /dev/null @@ -1,131 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.iface.IItemLPContainer; -import WayofTime.bloodmagic.iface.IUpgradeTrainer; -import WayofTime.bloodmagic.livingArmour.LivingArmourHandler; -import WayofTime.bloodmagic.livingArmour.LivingArmourUpgrade; -import WayofTime.bloodmagic.item.ItemUpgradeTome; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class ItemHelper { - // IItemLPContainer - public static class LPContainer { - /** - * Attempts to fill an altar with the contained LP - * - * @param altar - The altar in question - * @param itemStack - The {@link IItemLPContainer} ItemStack filling the altar - * @param world - The world - * @param altarPos - The position of the altar - * @return Whether or not the altar was filled (or at least attempted) - */ - public static boolean tryAndFillAltar(IBloodAltar altar, ItemStack itemStack, World world, BlockPos altarPos) { - if (itemStack.getItem() instanceof IItemLPContainer) { - if (!altar.isActive()) { - IItemLPContainer fillable = (IItemLPContainer) itemStack.getItem(); - int amount = fillable.getStoredLP(itemStack); - - if (amount > 0) { - int filledAmount = altar.fillMainTank(amount); - amount -= filledAmount; - fillable.setStoredLP(itemStack, amount); - world.notifyBlockUpdate(altarPos, world.getBlockState(altarPos), world.getBlockState(altarPos), 3); - return true; - } - } - } - - return false; - } - - /** - * Adds the given LP into the {@link IItemLPContainer}'s storage - * - * @param stack - The item in question - * @param toAdd - How much LP should be added to the item - * @param maxCapacity - The item's maximum holding capacity - * @return Whether or not LP was added to the item - */ - public static boolean addLPToItem(ItemStack stack, int toAdd, int maxCapacity) { - if (stack.getItem() instanceof IItemLPContainer) { - IItemLPContainer fillable = (IItemLPContainer) stack.getItem(); - stack = NBTHelper.checkNBT(stack); - - if (toAdd < 0) - toAdd = 0; - - if (toAdd > maxCapacity) - toAdd = maxCapacity; - - fillable.setStoredLP(stack, Math.min(fillable.getStoredLP(stack) + toAdd, maxCapacity)); - return true; - } - - return false; - } - } - - public static class LivingUpgrades { - public static LivingArmourUpgrade getUpgrade(ItemStack stack) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - String key = getKey(stack); - int level = getLevel(stack); - - return LivingArmourHandler.generateUpgradeFromKey(key, level); - } - - return null; - } - - public static void setUpgrade(ItemStack stack, LivingArmourUpgrade upgrade) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - setKey(stack, upgrade.getUniqueIdentifier()); - setLevel(stack, upgrade.getUpgradeLevel()); - } - } - - public static void setKey(ItemStack stack, String key) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - tag.putString("key", key); - } - } - - public static String getKey(ItemStack stack) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getString("key"); - } - - return ""; - } - - public static void setLevel(ItemStack stack, int level) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - tag.putInt("level", level); - } - } - - public static int getLevel(ItemStack stack) { - if (stack.getItem() instanceof ItemUpgradeTome || stack.getItem() instanceof IUpgradeTrainer) { - NBTHelper.checkNBT(stack); - CompoundNBT tag = stack.getTagCompound(); - - return tag.getInt("level"); - } - - return 0; - } - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java index 691fb556..f7fdaa52 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NBTHelper.java @@ -1,13 +1,15 @@ -package WayofTime.bloodmagic.util.helper; +package wayoftime.bloodmagic.util.helper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -public class NBTHelper { - public static ItemStack checkNBT(ItemStack stack) { - if (stack.getTagCompound() == null) - stack.setTagCompound(new CompoundNBT()); +public class NBTHelper +{ + public static ItemStack checkNBT(ItemStack stack) + { + if (stack.getTag() == null) + stack.setTag(new CompoundNBT()); - return stack; - } -} + return stack; + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java index b16d47b2..1eca73c4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NetworkHelper.java @@ -1,107 +1,117 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.core.data.Binding; -import WayofTime.bloodmagic.core.data.SoulTicket; -import WayofTime.bloodmagic.event.SoulNetworkEvent; -import WayofTime.bloodmagic.iface.IBindable; -import WayofTime.bloodmagic.orb.BloodOrb; -import WayofTime.bloodmagic.orb.IBloodOrb; -import WayofTime.bloodmagic.core.registry.OrbRegistry; -import WayofTime.bloodmagic.core.data.BMWorldSavedData; -import WayofTime.bloodmagic.core.data.SoulNetwork; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.MinecraftForge; +package wayoftime.bloodmagic.util.helper; import java.util.UUID; -public class NetworkHelper { - // Get +import javax.annotation.Nullable; - /** - * Gets the SoulNetwork for the player. - * - * @param uuid - The UUID of the SoulNetwork owner - this is UUID.toString(). - * @return - The SoulNetwork for the given name. - */ - public static SoulNetwork getSoulNetwork(String uuid) { - World world = DimensionManager.getWorld(0); - if (world == null || world.getMapStorage() == null) //Hack-ish way to fix the lava crystal. - return new BMWorldSavedData().getNetwork(UUID.fromString(uuid)); +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.storage.DimensionSavedDataManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.server.ServerLifecycleHooks; +import wayoftime.bloodmagic.core.data.BMWorldSavedData; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.core.registry.OrbRegistry; +import wayoftime.bloodmagic.event.SoulNetworkEvent; +import wayoftime.bloodmagic.iface.IBindable; +import wayoftime.bloodmagic.orb.BloodOrb; +import wayoftime.bloodmagic.orb.IBloodOrb; - BMWorldSavedData saveData = (BMWorldSavedData) world.getMapStorage().getOrLoadData(BMWorldSavedData.class, BMWorldSavedData.ID); +public class NetworkHelper +{ + @Nullable + private static BMWorldSavedData dataHandler; - if (saveData == null) { - saveData = new BMWorldSavedData(); - world.getMapStorage().setData(BMWorldSavedData.ID, saveData); - } + /** + * Gets the SoulNetwork for the player. + * + * @param uuid - The UUID of the SoulNetwork owner - this is UUID.toString(). + * @return - The SoulNetwork for the given name. + */ + public static SoulNetwork getSoulNetwork(String uuid) + { + if (dataHandler == null) + { + if (ServerLifecycleHooks.getCurrentServer() == null) + return null; - return saveData.getNetwork(UUID.fromString(uuid)); - } + DimensionSavedDataManager savedData = ServerLifecycleHooks.getCurrentServer().func_241755_D_().getSavedData(); + dataHandler = savedData.getOrCreate(() -> new BMWorldSavedData(), BMWorldSavedData.ID); + } - /** - * @param uuid - The Player's Mojang UUID - * @see NetworkHelper#getSoulNetwork(String) - */ - public static SoulNetwork getSoulNetwork(UUID uuid) { - return getSoulNetwork(uuid.toString()); - } + return dataHandler.getNetwork(UUID.fromString(uuid)); + } - /** - * @param player - The Player - * @see NetworkHelper#getSoulNetwork(String) - */ - public static SoulNetwork getSoulNetwork(PlayerEntity player) { - return getSoulNetwork(PlayerHelper.getUUIDFromPlayer(player)); - } + /** + * @param uuid - The Player's Mojang UUID + * @see NetworkHelper#getSoulNetwork(String) + */ + public static SoulNetwork getSoulNetwork(UUID uuid) + { + return getSoulNetwork(uuid.toString()); + } - public static SoulNetwork getSoulNetwork(Binding binding) { - return getSoulNetwork(binding.getOwnerId()); - } + /** + * @param player - The Player + * @see NetworkHelper#getSoulNetwork(String) + */ + public static SoulNetwork getSoulNetwork(PlayerEntity player) + { + return getSoulNetwork(PlayerHelper.getUUIDFromPlayer(player)); + } - /** - * Gets the current orb tier of the SoulNetwork. - * - * @param soulNetwork - SoulNetwork to get the tier of. - * @return - The Orb tier of the given SoulNetwork - */ - public static int getCurrentMaxOrb(SoulNetwork soulNetwork) { - return soulNetwork.getOrbTier(); - } + public static SoulNetwork getSoulNetwork(Binding binding) + { + return getSoulNetwork(binding.getOwnerId()); + } - public static int getMaximumForTier(int tier) { - int ret = 0; + /** + * Gets the current orb tier of the SoulNetwork. + * + * @param soulNetwork - SoulNetwork to get the tier of. + * @return - The Orb tier of the given SoulNetwork + */ + public static int getCurrentMaxOrb(SoulNetwork soulNetwork) + { + return soulNetwork.getOrbTier(); + } - if (tier > OrbRegistry.getTierMap().size() || tier < 0) - return ret; + public static int getMaximumForTier(int tier) + { + int ret = 0; - for (ItemStack orbStack : OrbRegistry.getOrbsForTier(tier)) { - BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); - if (orb.getCapacity() > ret) - ret = orb.getCapacity(); - } + if (tier > OrbRegistry.getTierMap().size() || tier < 0) + return ret; - return ret; - } + for (ItemStack orbStack : OrbRegistry.getOrbsForTier(tier)) + { + BloodOrb orb = ((IBloodOrb) orbStack.getItem()).getOrb(orbStack); + if (orb.getCapacity() > ret) + ret = orb.getCapacity(); + } - // Syphon + return ret; + } - /** - * Syphons from the player and damages them if there was not enough stored - * LP. - *

- * Handles null-checking the player for you. - * - * @param soulNetwork - SoulNetwork to syphon from - * @param user - User of the item. - * @param toSyphon - Amount of LP to syphon - * @return - Whether the action should be performed. - * @deprecated Use {@link #getSoulNetwork(PlayerEntity)} and {@link SoulNetwork#syphonAndDamage$(PlayerEntity, SoulTicket)} - */ - @Deprecated - public static boolean syphonAndDamage(SoulNetwork soulNetwork, PlayerEntity user, int toSyphon) { + // Syphon + + /** + * Syphons from the player and damages them if there was not enough stored LP. + *

+ * Handles null-checking the player for you. + * + * @param soulNetwork - SoulNetwork to syphon from + * @param user - User of the item. + * @param toSyphon - Amount of LP to syphon + * @return - Whether the action should be performed. + * @deprecated Use {@link #getSoulNetwork(PlayerEntity)} and + * {@link SoulNetwork#syphonAndDamage$(PlayerEntity, SoulTicket)} + */ + @Deprecated + public static boolean syphonAndDamage(SoulNetwork soulNetwork, PlayerEntity user, int toSyphon) + { // if (soulNetwork.getNewOwner() == null) // { @@ -109,59 +119,62 @@ public class NetworkHelper { // return true; // } - return soulNetwork.syphonAndDamage(user, toSyphon); - } + return soulNetwork.syphonAndDamage(user, toSyphon); + } - /** - * Syphons a player from within a container. - * - * @param stack - ItemStack in the Container. - * @param ticket - SoulTicket to syphon - * @return - If the syphon was successful. - */ - public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) { - if (!(stack.getItem() instanceof IBindable)) - return false; + /** + * Syphons a player from within a container. + * + * @param stack - ItemStack in the Container. + * @param ticket - SoulTicket to syphon + * @return - If the syphon was successful. + */ + public static boolean syphonFromContainer(ItemStack stack, SoulTicket ticket) + { + if (!(stack.getItem() instanceof IBindable)) + return false; - Binding binding = ((IBindable) stack.getItem()).getBinding(stack); - if (binding == null) - return false; + Binding binding = ((IBindable) stack.getItem()).getBinding(stack); + if (binding == null) + return false; - SoulNetwork network = getSoulNetwork(binding); - SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, ticket, stack); + SoulNetwork network = getSoulNetwork(binding); + SoulNetworkEvent.Syphon.Item event = new SoulNetworkEvent.Syphon.Item(network, ticket, stack); - return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(), true) >= ticket.getAmount(); - } + return !MinecraftForge.EVENT_BUS.post(event) && network.syphon(event.getTicket(), true) >= ticket.getAmount(); + } - /** - * Checks if the ItemStack has a user to be syphoned from. - * - * @param stack - ItemStack to check - * @param toSyphon - Amount of LP to syphon - * @return - If syphoning is possible - */ - public static boolean canSyphonFromContainer(ItemStack stack, int toSyphon) { - if (!(stack.getItem() instanceof IBindable)) - return false; + /** + * Checks if the ItemStack has a user to be syphoned from. + * + * @param stack - ItemStack to check + * @param toSyphon - Amount of LP to syphon + * @return - If syphoning is possible + */ + public static boolean canSyphonFromContainer(ItemStack stack, int toSyphon) + { + if (!(stack.getItem() instanceof IBindable)) + return false; - Binding binding = ((IBindable) stack.getItem()).getBinding(stack); - if (binding == null) - return false; + Binding binding = ((IBindable) stack.getItem()).getBinding(stack); + if (binding == null) + return false; - SoulNetwork network = getSoulNetwork(binding); - return network.getCurrentEssence() >= toSyphon; - } + SoulNetwork network = getSoulNetwork(binding); + return network.getCurrentEssence() >= toSyphon; + } - // Set + // Set - /** - * Sets the orb tier of the SoulNetwork to the given orb. Will not set if - * the given tier is lower than the current tier. - * - * @param soulNetwork - SoulNetwork to set the orb tier of - * @param maxOrb - Tier of orb to set to - */ - public static void setMaxOrb(SoulNetwork soulNetwork, int maxOrb) { - soulNetwork.setOrbTier(Math.max(maxOrb, soulNetwork.getOrbTier())); - } -} + /** + * Sets the orb tier of the SoulNetwork to the given orb. Will not set if the + * given tier is lower than the current tier. + * + * @param soulNetwork - SoulNetwork to set the orb tier of + * @param maxOrb - Tier of orb to set to + */ + public static void setMaxOrb(SoulNetwork soulNetwork, int maxOrb) + { + soulNetwork.setOrbTier(Math.max(maxOrb, soulNetwork.getOrbTier())); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java index e98cccfb..f2c5d320 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/NumeralHelper.java @@ -1,32 +1,35 @@ -package WayofTime.bloodmagic.util.helper; +package wayoftime.bloodmagic.util.helper; import java.util.TreeMap; -public class NumeralHelper { +public class NumeralHelper +{ - private static final TreeMap romanNumerals = new TreeMap<>(); + private static final TreeMap romanNumerals = new TreeMap(); - static { - romanNumerals.put(1000, "M"); - romanNumerals.put(900, "CM"); - romanNumerals.put(500, "D"); - romanNumerals.put(400, "CD"); - romanNumerals.put(100, "C"); - romanNumerals.put(90, "XC"); - romanNumerals.put(50, "L"); - romanNumerals.put(40, "XL"); - romanNumerals.put(10, "X"); - romanNumerals.put(9, "IX"); - romanNumerals.put(5, "V"); - romanNumerals.put(4, "IV"); - romanNumerals.put(1, "I"); - } + static + { + romanNumerals.put(1000, "M"); + romanNumerals.put(900, "CM"); + romanNumerals.put(500, "D"); + romanNumerals.put(400, "CD"); + romanNumerals.put(100, "C"); + romanNumerals.put(90, "XC"); + romanNumerals.put(50, "L"); + romanNumerals.put(40, "XL"); + romanNumerals.put(10, "X"); + romanNumerals.put(9, "IX"); + romanNumerals.put(5, "V"); + romanNumerals.put(4, "IV"); + romanNumerals.put(1, "I"); + } - public static String toRoman(int arabic) { - int convert = romanNumerals.floorKey(arabic); - if (arabic == convert) - return romanNumerals.get(convert); + public static String toRoman(int arabic) + { + int convert = romanNumerals.floorKey(arabic); + if (arabic == convert) + return romanNumerals.get(convert); - return romanNumerals.get(convert) + toRoman(arabic - convert); - } + return romanNumerals.get(convert) + toRoman(arabic - convert); + } } diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java index 505ffbee..715b0f3a 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerHelper.java @@ -1,49 +1,64 @@ -package WayofTime.bloodmagic.util.helper; - -import com.google.common.collect.Lists; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraftforge.common.UsernameCache; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.relauncher.Side; +package wayoftime.bloodmagic.util.helper; import java.util.ArrayList; import java.util.UUID; -public class PlayerHelper { - /** - * A list of all known fake players that do not extend FakePlayer. - *

- * Will be added to as needed. - */ - private static final ArrayList knownFakePlayers = Lists.newArrayList(); +import com.google.common.collect.Lists; - public static PlayerEntity getPlayerFromId(UUID uuid) { - if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) - return null; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraftforge.common.UsernameCache; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.fml.server.ServerLifecycleHooks; - return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUUID(uuid); - } +public class PlayerHelper +{ + /** + * A list of all known fake players that do not extend FakePlayer. + *

+ * Will be added to as needed. + */ + private static final ArrayList knownFakePlayers = Lists.newArrayList(); - public static PlayerEntity getPlayerFromUUID(UUID uuid) { - return getPlayerFromId(uuid); - } + public static PlayerEntity getPlayerFromId(UUID uuid) + { + // TODO: Need to find a reliable way to get whether the side is Client or Server +// if (FMLCommonHandler.instance().) +// return null; +// +// World w; +// Dist d; +// +// if(ServerLifecycleHooks.getCurrentServer().get) - public static UUID getUUIDFromPlayer(PlayerEntity player) { - return player.getGameProfile().getId(); - } + return ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayerByUUID(uuid); - public static String getUsernameFromUUID(UUID uuid) { - return UsernameCache.getLastKnownUsername(uuid); - } +// return FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayerByUUID(uuid); + } - /** - * Checks whether or not the given player is an "actual" player - * - * @param player - The player in question - * @return If the player is fake or not - */ - public static boolean isFakePlayer(PlayerEntity player) { - return player instanceof FakePlayer || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); - } -} + public static PlayerEntity getPlayerFromUUID(UUID uuid) + { + return getPlayerFromId(uuid); + } + + public static UUID getUUIDFromPlayer(PlayerEntity player) + { + return player.getGameProfile().getId(); + } + + public static String getUsernameFromUUID(UUID uuid) + { + return UsernameCache.getLastKnownUsername(uuid); + } + + /** + * Checks whether or not the given player is an "actual" player + * + * @param player - The player in question + * @return If the player is fake or not + */ + public static boolean isFakePlayer(PlayerEntity player) + { + return player instanceof FakePlayer + || (player != null && knownFakePlayers.contains(player.getClass().getCanonicalName())); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java index da4312d2..54a0c5b2 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/PlayerSacrificeHelper.java @@ -1,142 +1,160 @@ -package WayofTime.bloodmagic.util.helper; +package wayoftime.bloodmagic.util.helper; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.altar.IBloodAltar; -import WayofTime.bloodmagic.core.RegistrarBloodMagic; -import WayofTime.bloodmagic.event.SacrificeKnifeUsedEvent; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.potion.Effect; -import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Potion; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; +import wayoftime.bloodmagic.ConfigHandler; +import wayoftime.bloodmagic.altar.IBloodAltar; +import wayoftime.bloodmagic.event.SacrificeKnifeUsedEvent; -public class PlayerSacrificeHelper { - public static float scalingOfSacrifice = 1f; - public static int soulFrayDuration = 400; - public static Effect soulFrayId; +public class PlayerSacrificeHelper +{ + public static float scalingOfSacrifice = 1f; + public static int soulFrayDuration = 400; + public static Potion soulFrayId; - public static double getPlayerIncense(PlayerEntity player) { - return IncenseHelper.getCurrentIncense(player); - } + public static double getPlayerIncense(PlayerEntity player) + { + return 0; +// return IncenseHelper.getCurrentIncense(player); + } - public static void setPlayerIncense(PlayerEntity player, double amount) { - IncenseHelper.setCurrentIncense(player, amount); - } + public static void setPlayerIncense(PlayerEntity player, double amount) + { +// IncenseHelper.setCurrentIncense(player, amount); + } - public static boolean incrementIncense(PlayerEntity player, double min, double incenseAddition, double increment) { - double amount = getPlayerIncense(player); - if (amount < min || amount >= incenseAddition) { - return false; - } + public static boolean incrementIncense(PlayerEntity player, double min, double incenseAddition, double increment) + { + return true; +// double amount = getPlayerIncense(player); +// if (amount < min || amount >= incenseAddition) +// { +// return false; +// } +// +// amount = amount + Math.min(increment, incenseAddition - amount); +// setPlayerIncense(player, amount); +// +// if (amount == incenseAddition) +// { +// IncenseHelper.setMaxIncense(player, incenseAddition); +// } +// // System.out.println("Amount of incense: " + amount + ", Increment: " + +// // increment); +// +// return true; + } - amount = amount + Math.min(increment, incenseAddition - amount); - setPlayerIncense(player, amount); + /** + * Sacrifices a player's health while the player is under the influence of + * incense + * + * @param player - The player sacrificing + * @return Whether or not the health sacrificing succeeded + */ + public static boolean sacrificePlayerHealth(PlayerEntity player) + { +// if (player.isPotionActive(soulFrayId)) +// { +// return false; +// } - if (amount == incenseAddition) { - IncenseHelper.setMaxIncense(player, incenseAddition); - } - // System.out.println("Amount of incense: " + amount + ", Increment: " + - // increment); + double amount = getPlayerIncense(player); - return true; - } + if (amount >= 0) + { + float health = player.getHealth(); + float maxHealth = player.getMaxHealth(); - /** - * Sacrifices a player's health while the player is under the influence of - * incense - * - * @param player - The player sacrificing - * @return Whether or not the health sacrificing succeeded - */ - public static boolean sacrificePlayerHealth(PlayerEntity player) { - if (player.isPotionActive(soulFrayId)) { - return false; - } + if (health > maxHealth / 10.0) + { + float sacrificedHealth = health - maxHealth / 10.0f; + int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion + * getModifier(amount)); - double amount = getPlayerIncense(player); + IBloodAltar altar = getAltar(player.getEntityWorld(), player.getPosition()); + if (altar != null) + { + SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); + if (MinecraftForge.EVENT_BUS.post(evt)) + return false; - if (amount >= 0) { - float health = player.getHealth(); - float maxHealth = player.getMaxHealth(); + altar.sacrificialDaggerCall(evt.lpAdded, false); + altar.startCycle(); - if (health > maxHealth / 10.0) { - float sacrificedHealth = health - maxHealth / 10.0f; - int lpAdded = (int) (sacrificedHealth * ConfigHandler.values.sacrificialDaggerConversion * getModifier(amount)); + player.setHealth(maxHealth / 10.0f); + setPlayerIncense(player, 0); +// player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); - IBloodAltar altar = getAltar(player.getEntityWorld(), player.getPosition()); - if (altar != null) { - SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, (int) sacrificedHealth, lpAdded); - if (MinecraftForge.EVENT_BUS.post(evt)) - return false; + return true; + } + } + } - altar.sacrificialDaggerCall(evt.lpAdded, false); - altar.startCycle(); + return false; + } - player.setHealth(maxHealth / 10.0f); - setPlayerIncense(player, 0); - player.addPotionEffect(new EffectInstance(RegistrarBloodMagic.SOUL_FRAY, soulFrayDuration)); + public static double getModifier(double amount) + { + return 1 + amount * scalingOfSacrifice; + } - return true; - } - } - } + /** + * Finds the nearest {@link IBloodAltar} and attempts to fill it + * + * @param world - The world + * @param sacrificingEntity - The entity having the sacrifice done on (can be + * {@link PlayerEntity} for self-sacrifice) + * @param amount - The amount of which the altar should be filled + * @param isSacrifice - Whether this is a Sacrifice or a Self-Sacrifice + * @return Whether the altar is found and (attempted) filled + */ + public static boolean findAndFillAltar(World world, LivingEntity sacrificingEntity, int amount, boolean isSacrifice) + { + IBloodAltar altarEntity = getAltar(world, sacrificingEntity.getPosition()); - return false; - } + if (altarEntity == null) + return false; - public static double getModifier(double amount) { - return 1 + amount * scalingOfSacrifice; - } + altarEntity.sacrificialDaggerCall(amount, isSacrifice); + altarEntity.startCycle(); - /** - * Finds the nearest {@link IBloodAltar} and attempts to fill it - * - * @param world - The world - * @param sacrificingEntity - The entity having the sacrifice done on (can be - * {@link PlayerEntity} for self-sacrifice) - * @param amount - The amount of which the altar should be filled - * @param isSacrifice - Whether this is a Sacrifice or a Self-Sacrifice - * @return Whether the altar is found and (attempted) filled - */ - public static boolean findAndFillAltar(World world, LivingEntity sacrificingEntity, int amount, boolean isSacrifice) { - IBloodAltar altarEntity = getAltar(world, sacrificingEntity.getPosition()); + return true; + } - if (altarEntity == null) - return false; + /** + * Gets the nearest {@link IBloodAltar} + * + * @param world - The world + * @param blockPos - The position of where the check should be in (in a 2 block + * radius from this) + * @return The nearest altar, if no altar is found, then this will return null + */ + public static IBloodAltar getAltar(World world, BlockPos blockPos) + { + TileEntity tileEntity; - altarEntity.sacrificialDaggerCall(amount, isSacrifice); - altarEntity.startCycle(); + for (int x = -2; x <= 2; x++) + { + for (int y = -2; y <= 1; y++) + { + for (int z = -2; z <= 2; z++) + { + tileEntity = world.getTileEntity(blockPos.add(x, y, z)); - return true; - } + if (tileEntity instanceof IBloodAltar) + { + return (IBloodAltar) tileEntity; + } + } + } + } - /** - * Gets the nearest {@link IBloodAltar} - * - * @param world - The world - * @param blockPos - The position of where the check should be in (in a 2 block - * radius from this) - * @return The nearest altar, if no altar is found, then this will return - * null - */ - public static IBloodAltar getAltar(World world, BlockPos blockPos) { - TileEntity tileEntity; - - for (int x = -2; x <= 2; x++) { - for (int y = -2; y <= 1; y++) { - for (int z = -2; z <= 2; z++) { - tileEntity = world.getTileEntity(blockPos.add(x, y, z)); - - if (tileEntity instanceof IBloodAltar) { - return (IBloodAltar) tileEntity; - } - } - } - } - - return null; - } -} \ No newline at end of file + return null; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java deleted file mode 100644 index 40695916..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/PurificationHelper.java +++ /dev/null @@ -1,33 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.util.Constants; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.nbt.CompoundNBT; - -public class PurificationHelper { - public static double getCurrentPurity(AnimalEntity animal) { - CompoundNBT data = animal.getEntityData(); - if (data.hasKey(Constants.NBT.CURRENT_PURITY)) { - return data.getDouble(Constants.NBT.CURRENT_PURITY); - } - - return 0; - } - - public static void setCurrentPurity(AnimalEntity animal, double amount) { - CompoundNBT data = animal.getEntityData(); - data.setDouble(Constants.NBT.CURRENT_PURITY, amount); - } - - public static double addPurity(AnimalEntity animal, double added, double max) { - double currentPurity = getCurrentPurity(animal); - double newAmount = Math.min(max, currentPurity + added); - - if (newAmount < max) { - setCurrentPurity(animal, newAmount); - return newAmount - currentPurity; - } - - return 0; - } -} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java deleted file mode 100644 index 97b4853a..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RecipeHelper.java +++ /dev/null @@ -1,55 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.recipe.TartaricForgeRecipe; -import WayofTime.bloodmagic.core.registry.AltarRecipeRegistry; -import WayofTime.bloodmagic.core.registry.TartaricForgeRecipeRegistry; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.fml.common.registry.ForgeRegistries; - -public class RecipeHelper { - public static IRecipe getRecipeForOutput(ItemStack stack) { - for (IRecipe recipe : ForgeRegistries.RECIPES.getValues()) { - if (recipe != null) { - ItemStack resultStack = recipe.getRecipeOutput(); - if (!resultStack.isEmpty()) { - if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { - return recipe; - } - } - } - } - - return null; - } - - public static AltarRecipeRegistry.AltarRecipe getAltarRecipeForOutput(ItemStack stack) { - for (AltarRecipeRegistry.AltarRecipe recipe : AltarRecipeRegistry.getRecipes().values()) { - if (recipe != null && !recipe.isFillable()) { - ItemStack resultStack = recipe.getOutput(); - if (!resultStack.isEmpty()) { - if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { - return recipe; - } - } - } - } - - return null; - } - - public static TartaricForgeRecipe getForgeRecipeForOutput(ItemStack stack) { - for (TartaricForgeRecipe recipe : TartaricForgeRecipeRegistry.getRecipeList()) { - if (recipe != null) { - ItemStack resultStack = recipe.getRecipeOutput(); - if (!resultStack.isEmpty()) { - if (resultStack.getItem() == stack.getItem() && resultStack.getItemDamage() == stack.getItemDamage()) { - return recipe; - } - } - } - } - - return null; - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java deleted file mode 100644 index ef5e7bfe..00000000 --- a/src/main/java/WayofTime/bloodmagic/util/helper/RitualHelper.java +++ /dev/null @@ -1,211 +0,0 @@ -package WayofTime.bloodmagic.util.helper; - -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks; -import WayofTime.bloodmagic.ritual.EnumRuneType; -import WayofTime.bloodmagic.ritual.IRitualStone; -import WayofTime.bloodmagic.ritual.Ritual; -import WayofTime.bloodmagic.ritual.RitualComponent; -import WayofTime.bloodmagic.tile.TileMasterRitualStone; -import com.google.common.collect.Lists; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityInject; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.List; - -public class RitualHelper { - @CapabilityInject(IRitualStone.Tile.class) - static Capability RUNE_CAPABILITY = null; - - public static boolean canCrystalActivate(Ritual ritual, int crystalLevel) { - return ritual.getCrystalLevel() <= crystalLevel && BloodMagic.RITUAL_MANAGER.enabled(BloodMagic.RITUAL_MANAGER.getId(ritual), false); - } - - /** - * Checks the RitualRegistry to see if the configuration of the ritual - * stones in the world is valid for the given EnumFacing. - * - * @param world - The world - * @param pos - Location of the MasterRitualStone - * @return The ID of the valid ritual - */ - public static String getValidRitual(World world, BlockPos pos) { - for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { - for (Direction direction : Direction.HORIZONTALS) { - if (checkValidRitual(world, pos, ritual, direction)) - return BloodMagic.RITUAL_MANAGER.getId(ritual); - } - } - - return ""; - } - - public static Direction getDirectionOfRitual(World world, BlockPos pos, Ritual ritual) { - for (Direction direction : Direction.HORIZONTALS) { - if (checkValidRitual(world, pos, ritual, direction)) - return direction; - } - - return null; - } - - public static boolean checkValidRitual(World world, BlockPos pos, Ritual ritual, Direction direction) { - if (ritual == null) { - return false; - } - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - - for (RitualComponent component : components) { - BlockPos newPos = pos.add(component.getOffset(direction)); - if (!isRuneType(world, newPos, component.getRuneType())) - return false; - } - - return true; - } - - public static boolean isRuneType(World world, BlockPos pos, EnumRuneType type) { - if (world == null) - return false; - Block block = world.getBlockState(pos).getBlock(); - TileEntity tile = world.getTileEntity(pos); - - if (block instanceof IRitualStone) - return ((IRitualStone) block).isRuneType(world, pos, type); - else if (tile instanceof IRitualStone.Tile) - return ((IRitualStone.Tile) tile).isRuneType(type); - else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) - return tile.getCapability(RUNE_CAPABILITY, null).isRuneType(type); - - return false; - } - - public static boolean isRune(World world, BlockPos pos) { - if (world == null) - return false; - Block block = world.getBlockState(pos).getBlock(); - TileEntity tile = world.getTileEntity(pos); - - if (block instanceof IRitualStone) - return true; - else if (tile instanceof IRitualStone.Tile) - return true; - else return tile != null && tile.hasCapability(RUNE_CAPABILITY, null); - - } - - public static void setRuneType(World world, BlockPos pos, EnumRuneType type) { - if (world == null) - return; - BlockState state = world.getBlockState(pos); - TileEntity tile = world.getTileEntity(pos); - - if (state.getBlock() instanceof IRitualStone) - ((IRitualStone) state.getBlock()).setRuneType(world, pos, type); - else if (tile instanceof IRitualStone.Tile) - ((IRitualStone.Tile) tile).setRuneType(type); - else if (tile != null && tile.hasCapability(RUNE_CAPABILITY, null)) { - tile.getCapability(RUNE_CAPABILITY, null).setRuneType(type); - world.notifyBlockUpdate(pos, state, state, 3); - } - } - - public static boolean createRitual(World world, BlockPos pos, Direction direction, Ritual ritual, boolean safe) { - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - - if (abortConstruction(world, pos, direction, safe, components)) return false; - - BlockState mrs = RegistrarBloodMagicBlocks.RITUAL_CONTROLLER.getDefaultState(); - world.setBlockState(pos, mrs); - - setRitualStones(direction, world, pos, components); - return true; - } - - public static boolean abortConstruction(World world, BlockPos pos, Direction direction, boolean safe, List components) { - //TODO: can be optimized to check only for the first and last component if every ritual has those at the highest and lowest y-level respectivly. - for (RitualComponent component : components) { - BlockPos offset = component.getOffset(direction); - BlockPos newPos = pos.add(offset); - if (world.isOutsideBuildHeight(newPos) || (safe && !world.isAirBlock(newPos))) - return true; - } - return false; - } - - public static boolean repairRitualFromRuins(TileMasterRitualStone tile, boolean safe) { - Ritual ritual = tile.getCurrentRitual(); - Direction direction; - Pair pair; - if (ritual == null) { - pair = getRitualFromRuins(tile); - ritual = pair.getKey(); - direction = pair.getValue(); - } else - direction = tile.getDirection(); - - World world = tile.getWorld(); - BlockPos pos = tile.getPos(); - - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - - if (abortConstruction(world, pos, direction, safe, components)) return false; - - setRitualStones(direction, world, pos, components); - return true; - } - - public static void setRitualStones(Direction direction, World world, BlockPos pos, List gatheredComponents) { - for (RitualComponent component : gatheredComponents) { - BlockPos offset = component.getOffset(direction); - BlockPos newPos = pos.add(offset); - int meta = component.getRuneType().ordinal(); - BlockState newState = RegistrarBloodMagicBlocks.RITUAL_STONE.getStateFromMeta(meta); - world.setBlockState(newPos, newState); - } - } - - - public static Pair getRitualFromRuins(TileMasterRitualStone tile) { - BlockPos pos = tile.getPos(); - World world = tile.getWorld(); - Ritual possibleRitual = tile.getCurrentRitual(); - Direction possibleDirection = tile.getDirection(); - int highestCount = 0; - - if (possibleRitual == null || possibleDirection == null) - for (Ritual ritual : BloodMagic.RITUAL_MANAGER.getRituals()) { - for (Direction direction : Direction.HORIZONTALS) { - List components = Lists.newArrayList(); - ritual.gatherComponents(components::add); - int currentCount = 0; - - for (RitualComponent component : components) { - BlockPos newPos = pos.add(component.getOffset(direction)); - if (isRuneType(world, newPos, component.getRuneType())) - currentCount += 1; - } - if (currentCount > highestCount) { - highestCount = currentCount; - possibleRitual = ritual; - possibleDirection = direction; - } - - } - - } - return Pair.of(possibleRitual, possibleDirection); - } -} diff --git a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java index 8b9c3e35..34d1da08 100644 --- a/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java +++ b/src/main/java/WayofTime/bloodmagic/util/helper/TextHelper.java @@ -1,65 +1,77 @@ -package WayofTime.bloodmagic.util.helper; - -import net.minecraft.util.text.translation.I18n; -import org.apache.commons.lang3.text.WordUtils; +package wayoftime.bloodmagic.util.helper; import java.util.ArrayList; import java.util.List; -public class TextHelper { - public static String getFormattedText(String string) { - return string.replaceAll("&", "\u00A7"); - } +import org.apache.commons.lang3.text.WordUtils; - public static String localize(String input, Object... format) { - return I18n.translateToLocalFormatted(input, format); - } +import net.minecraft.client.resources.I18n; - public static String localizeEffect(String input, Object... format) { - return getFormattedText(localize(input, format)); - } +public class TextHelper +{ + public static String getFormattedText(String string) + { + return string.replaceAll("&", "\u00A7"); + } - public static String[] localizeAll(String[] input) { - String[] ret = new String[input.length]; - for (int i = 0; i < input.length; i++) - ret[i] = localize(input[i]); + public static String localize(String input, Object... format) + { + return I18n.format(input, format); + } - return ret; - } + public static String localizeEffect(String input, Object... format) + { + return getFormattedText(localize(input, format)); + } - public static String[] localizeAllEffect(String[] input) { - String[] ret = new String[input.length]; - for (int i = 0; i < input.length; i++) - ret[i] = localizeEffect(input[i]); + public static String[] localizeAll(String[] input) + { + String[] ret = new String[input.length]; + for (int i = 0; i < input.length; i++) + ret[i] = localize(input[i]); - return ret; - } + return ret; + } - public static ArrayList localizeAll(List input) { - ArrayList ret = new ArrayList<>(input.size()); - for (int i = 0; i < input.size(); i++) - ret.add(i, localize(input.get(i))); + public static String[] localizeAllEffect(String[] input) + { + String[] ret = new String[input.length]; + for (int i = 0; i < input.length; i++) + ret[i] = localizeEffect(input[i]); - return ret; - } + return ret; + } - public static ArrayList localizeAllEffect(List input) { - ArrayList ret = new ArrayList<>(input.size()); - for (int i = 0; i < input.size(); i++) - ret.add(i, localizeEffect(input.get(i))); + public static ArrayList localizeAll(List input) + { + ArrayList ret = new ArrayList<>(input.size()); + for (int i = 0; i < input.size(); i++) + ret.add(i, localize(input.get(i))); - return ret; - } + return ret; + } - public static String[] cutLongString(String string, int characters) { - return WordUtils.wrap(string, characters, "/cut", false).split("/cut"); - } + public static ArrayList localizeAllEffect(List input) + { + ArrayList ret = new ArrayList<>(input.size()); + for (int i = 0; i < input.size(); i++) + ret.add(i, localizeEffect(input.get(i))); - public static String[] cutLongString(String string) { - return cutLongString(string, 30); - } + return ret; + } - public static boolean canTranslate(String key) { - return I18n.canTranslate(key); - } -} + public static String[] cutLongString(String string, int characters) + { + return WordUtils.wrap(string, characters, "/cut", false).split("/cut"); + } + + public static String[] cutLongString(String string) + { + return cutLongString(string, 30); + } + + public static boolean canTranslate(String key) + { + return I18n.hasKey(key); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java new file mode 100644 index 00000000..fb347b0e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java @@ -0,0 +1,80 @@ +package wayoftime.bloodmagic.api; + +import javax.annotation.Nonnull; + +import net.minecraft.block.BlockState; + +/** + * The main interface between a plugin and Blood Magic's internals. + * + * This API is intended for compatibility between other mods and Blood + * Magic. More advanced integration is out of the scope of this API and are + * considered "addons". + * + * To get an instance of this without actually creating an + * {@link IBloodMagicPlugin}, use {@link BloodMagicPlugin.Inject}. + */ +public interface IBloodMagicAPI +{ + +// /** +// * Retrieves the instance of the blacklist. +// * +// * @return the active {@link IBloodMagicBlacklist} instance +// */ +// @Nonnull +// IBloodMagicBlacklist getBlacklist(); + + /** + * Retrieves the instance of the recipe registrar. + * + * @return the active {@link IBloodMagicRecipeRegistrar} instance + */ + @Nonnull + IBloodMagicRecipeRegistrar getRecipeRegistrar(); +// +// /** +// * Retrieves the instance of the value manager. +// * +// * @return the active {@link IBloodMagicValueManager} instance +// */ +// @Nonnull +// IBloodMagicValueManager getValueManager(); + + /** + * Registers an {@link IBlockState} as a given component for the Blood Altar. + *

+ * Valid component types: + *

    + *
  • GLOWSTONE
  • + *
  • BLOODSTONE
  • + *
  • BEACON
  • + *
  • BLOODRUNE
  • + *
  • CRYSTAL
  • + *
  • NOTAIR
  • + *
+ * + * @param state The state to register + * @param componentType The type of Blood Altar component to register as. + */ + void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType); + + /** + * Removes an {@link IBlockState} from the component mappings + *

+ * Valid component types: + *

    + *
  • GLOWSTONE
  • + *
  • BLOODSTONE
  • + *
  • BEACON
  • + *
  • BLOODRUNE
  • + *
  • CRYSTAL
  • + *
  • NOTAIR
  • + *
+ * + * @param state The state to unregister + * @param componentType The type of Blood Altar component to unregister from. + */ + void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType); + +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java new file mode 100644 index 00000000..46b8bd80 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java @@ -0,0 +1,100 @@ +package wayoftime.bloodmagic.api; + +/** + * Allows recipe addition and removal. + */ +public interface IBloodMagicRecipeRegistrar +{ + +// /** +// * Adds a new recipe to the Blood Altar. +// * +// * @param input An input {@link Ingredient}. +// * @param output An output {@link ItemStack}. +// * @param minimumTier The minimum Blood Altar tier required for this recipe. +// * @param syphon The amount of Life Essence to syphon from the Blood Altar +// * over the course of the craft. +// * @param consumeRate How quickly the Life Essence is syphoned. +// * @param drainRate How quickly progress is lost if the Blood Altar runs out +// * of Life Essence during the craft. +// */ +// void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier, +// @Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate); +// +// /** +// * Removes a Blood Altar recipe based on an input {@link ItemStack}. +// * +// * @param input The input item to remove the recipe of. +// * @return Whether or not a recipe was removed. +// */ +// boolean removeBloodAltar(@Nonnull ItemStack input); +// +// /** +// * Adds a new recipe to the Alchemy Table. +// * +// * @param output An output {@link ItemStack}. +// * @param syphon The amount of Life Essence to syphon from the Blood Orb's +// * bound network over the course of the craft. +// * @param ticks The amount of ticks it takes to complete the craft. +// * @param minimumTier The minimum Blood Orb tier required for this recipe. +// * @param input An array of {@link Ingredient}s to accept as inputs. +// */ +// void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks, +// @Nonnegative int minimumTier, @Nonnull Ingredient... input); +// +// /** +// * Removes an Alchemy Table recipe based on an input {@link ItemStack} array. +// * +// * @param input The input items to remove the recipe of. +// * @return Whether or not a recipe was removed. +// */ +// boolean removeAlchemyTable(@Nonnull ItemStack... input); +// +// /** +// * Adds a new recipe to the Soul/Tartaric Forge. +// * +// * @param output An output {@link ItemStack}. +// * @param minimumSouls The minimum number of souls that must be contained in the +// * Soul Gem. +// * @param soulDrain The number of souls to drain from the Soul Gem. +// * @param input An array of {@link Ingredient}s to accept as inputs. +// */ +// void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain, +// @Nonnull Ingredient... input); +// +// /** +// * Removes a Soul/Tartaric Forge recipe based on an input {@link ItemStack} +// * array. +// * +// * @param input The input items to remove the recipe of. +// * @return Whether or not a recipe was removed. +// */ +// boolean removeTartaricForge(@Nonnull ItemStack... input); +// +// /** +// * Adds a new recipe to the Alchemy Array. +// * +// * @param input An input {@link Ingredient}. First item put into the +// * Alchemy Array. +// * @param catalyst A catalyst {@link Ingredient}. Second item put into the +// * Alchemy Array. +// * @param output An output {@link ItemStack}. +// * @param circleTexture The texture to render for the Alchemy Array circle. +// */ +// void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output, +// @Nullable ResourceLocation circleTexture); +// +// /** +// * Removes an Alchemy Array recipe based on an input {@link ItemStack} and it's +// * catalyst {@link ItemStack}. +// * +// * @param input The input item to remove the recipe of. +// * @param catalyst The catalyst item to remove the recipe of. +// * @return Whether or not a recipe was removed. +// */ +// boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst); +// +// void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input); +// +// boolean removeSacrificeCraft(@Nonnull ItemStack... input); +} diff --git a/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java b/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java new file mode 100644 index 00000000..c2840718 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java @@ -0,0 +1,60 @@ +package wayoftime.bloodmagic.api; + +import javax.annotation.Nonnull; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.util.JSONUtils; +import wayoftime.bloodmagic.util.Constants; + +/** + * Copied liberally from Mekanism. Thanks, pupnewfster! + * + */ +public class SerializerHelper +{ + private SerializerHelper() + { + } + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + + private static void validateKey(@Nonnull JsonObject json, @Nonnull String key) + { + if (!json.has(key)) + { + throw new JsonSyntaxException("Missing '" + key + "', expected to find an object"); + } + if (!json.get(key).isJsonObject()) + { + throw new JsonSyntaxException("Expected '" + key + "' to be an object"); + } + } + + public static ItemStack getItemStack(@Nonnull JsonObject json, @Nonnull String key) + { + validateKey(json, key); + return ShapedRecipe.deserializeItem(JSONUtils.getJsonObject(json, key)); + } + + public static JsonElement serializeItemStack(@Nonnull ItemStack stack) + { + JsonObject json = new JsonObject(); + json.addProperty(Constants.JSON.ITEM, stack.getItem().getRegistryName().toString()); + if (stack.getCount() > 1) + { + json.addProperty(Constants.JSON.COUNT, stack.getCount()); + } + if (stack.hasTag()) + { + json.addProperty(Constants.JSON.NBT, stack.getTag().toString()); + } + return json; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/api/event/BloodMagicCraftedEvent.java b/src/main/java/wayoftime/bloodmagic/api/event/BloodMagicCraftedEvent.java new file mode 100644 index 00000000..335abe96 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/event/BloodMagicCraftedEvent.java @@ -0,0 +1,84 @@ +package wayoftime.bloodmagic.api.event; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.eventbus.api.Event; + +public class BloodMagicCraftedEvent extends Event +{ + + private final boolean modifiable; + private final ItemStack[] inputs; + private ItemStack output; + + public BloodMagicCraftedEvent(ItemStack output, ItemStack[] inputs, boolean modifiable) + { + this.modifiable = modifiable; + this.inputs = inputs; + this.output = output; + } + + public boolean isModifiable() + { + return modifiable; + } + + public ItemStack[] getInputs() + { + return inputs; + } + + public ItemStack getOutput() + { + return output; + } + + public void setOutput(ItemStack output) + { + if (isModifiable()) + this.output = output; + } + + /** + * Fired whenever a craft is completed in a Blood Altar. + * + * It is not cancelable, however you can modify the output stack. + */ + public static class Altar extends BloodMagicCraftedEvent + { + + public Altar(ItemStack output, ItemStack input) + { + super(output, new ItemStack[] + { input }, true); + } + } + + /** + * Fired whenever a craft is completed in a Soul Forge. + * + * It is not cancelable, however you can modify the output stack. + */ + public static class SoulForge extends BloodMagicCraftedEvent + { + + public SoulForge(ItemStack output, ItemStack[] inputs) + { + super(output, inputs, true); + } + } + + /** + * Fired whenever a craft is completed in an Alchemy Table. + * + * It is not cancelable, however you can modify the output stack. + */ + public static class AlchemyTable extends BloodMagicCraftedEvent + { + + public AlchemyTable(ItemStack output, ItemStack[] inputs) + { + super(output, inputs, true); + } + } + +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/impl/recipe/BloodMagicRecipe.java b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/BloodMagicRecipe.java new file mode 100644 index 00000000..aae4c134 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/impl/recipe/BloodMagicRecipe.java @@ -0,0 +1,69 @@ +package wayoftime.bloodmagic.api.impl.recipe; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import wayoftime.bloodmagic.api.inventory.IgnoredIInventory; + +public abstract class BloodMagicRecipe implements IRecipe +{ + private final ResourceLocation id; + + protected BloodMagicRecipe(ResourceLocation id) + { + this.id = id; + } + + /** + * Writes this recipe to a PacketBuffer. + * + * @param buffer The buffer to write to. + */ + public abstract void write(PacketBuffer buffer); + + @Nonnull + @Override + public ResourceLocation getId() + { + return id; + } + + @Override + public boolean matches(@Nonnull IgnoredIInventory inv, @Nonnull World world) + { + return true; + } + + @Override + public boolean isDynamic() + { + // Note: If we make this non dynamic, we can make it show in vanilla's crafting + // book and also then obey the recipe locking. + // For now none of that works/makes sense in our concept so don't lock it + return true; + } + + @Nonnull + @Override + public ItemStack getCraftingResult(@Nonnull IgnoredIInventory inv) + { + return ItemStack.EMPTY; + } + + @Override + public boolean canFit(int width, int height) + { + return true; + } + + @Nonnull + @Override + public ItemStack getRecipeOutput() + { + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java b/src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java new file mode 100644 index 00000000..757fa7a5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java @@ -0,0 +1,67 @@ +package wayoftime.bloodmagic.api.inventory; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public final class IgnoredIInventory implements IInventory +{ + public static final IgnoredIInventory INSTANCE = new IgnoredIInventory(); + + private IgnoredIInventory() + { + } + + @Override + public int getSizeInventory() + { + return 0; + } + + @Override + public boolean isEmpty() + { + return true; + } + + @Override + public ItemStack getStackInSlot(int index) + { + return ItemStack.EMPTY; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + return ItemStack.EMPTY; + } + + @Override + public ItemStack removeStackFromSlot(int index) + { + return ItemStack.EMPTY; + } + + @Override + public void setInventorySlotContents(int index, @Nonnull ItemStack stack) + { + } + + @Override + public void markDirty() + { + } + + @Override + public boolean isUsableByPlayer(@Nonnull PlayerEntity player) + { + return false; + } + + @Override + public void clear() + { + } +} diff --git a/src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java b/src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java new file mode 100644 index 00000000..e59271db --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java @@ -0,0 +1,23 @@ +package wayoftime.bloodmagic.api.providers; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.api.text.IHasTextComponent; +import wayoftime.bloodmagic.api.text.IHasTranslationKey; + +public interface IBaseProvider extends IHasTextComponent, IHasTranslationKey +{ + ResourceLocation getRegistryName(); + + default String getName() + { + return getRegistryName().getPath(); + } + + @Override + default ITextComponent getTextComponent() + { + return new TranslationTextComponent(getTranslationKey()); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java b/src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java new file mode 100644 index 00000000..db92683c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java @@ -0,0 +1,32 @@ +package wayoftime.bloodmagic.api.providers; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.EntityType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; + +public interface IEntityTypeProvider extends IBaseProvider +{ + + @Nonnull + EntityType getEntityType(); + + @Override + default ResourceLocation getRegistryName() + { + return getEntityType().getRegistryName(); + } + + @Override + default ITextComponent getTextComponent() + { + return getEntityType().getName(); + } + + @Override + default String getTranslationKey() + { + return getEntityType().getTranslationKey(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java b/src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java new file mode 100644 index 00000000..d0b25951 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java @@ -0,0 +1,8 @@ +package wayoftime.bloodmagic.api.text; + +import net.minecraft.util.text.ITextComponent; + +public interface IHasTextComponent +{ + ITextComponent getTextComponent(); +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java b/src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java new file mode 100644 index 00000000..63be3d74 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java @@ -0,0 +1,6 @@ +package wayoftime.bloodmagic.api.text; + +public interface IHasTranslationKey +{ + String getTranslationKey(); +} diff --git a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java new file mode 100644 index 00000000..8d3b6065 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java @@ -0,0 +1,98 @@ +package wayoftime.bloodmagic.client; + +import net.minecraft.client.gui.ScreenManager; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.IItemPropertyGetter; +import net.minecraft.item.Item; +import net.minecraft.item.ItemModelsProperties; +import net.minecraft.item.ItemStack; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.client.render.block.RenderAlchemyArray; +import wayoftime.bloodmagic.client.render.block.RenderAltar; +import wayoftime.bloodmagic.client.screens.ScreenSoulForge; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilToggleable; +import wayoftime.bloodmagic.common.item.soul.ItemSentientSword; +import wayoftime.bloodmagic.iface.IMultiWillTool; +import wayoftime.bloodmagic.tile.TileAlchemyArray; +import wayoftime.bloodmagic.tile.TileAltar; + +@Mod.EventBusSubscriber(value = Dist.CLIENT, modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class ClientEvents +{ + @SubscribeEvent + public static void registerModels(ModelRegistryEvent event) + { + ClientRegistry.bindTileEntityRenderer(TileAltar.TYPE, RenderAltar::new); + ClientRegistry.bindTileEntityRenderer(TileAlchemyArray.TYPE, RenderAlchemyArray::new); +// ClientRegistry.bindTileEntityRenderer(TileSoulForge.TYPE, RenderAlchemyArray::new); + } + + public static void registerContainerScreens() + { + ScreenManager.registerFactory(BloodMagicBlocks.SOUL_FORGE_CONTAINER.get(), ScreenSoulForge::new); + } + + public static void registerItemModelProperties(FMLClientSetupEvent event) + { + registerToggleableProperties(BloodMagicItems.GREEN_GROVE_SIGIL.get()); + registerToggleableProperties(BloodMagicItems.FAST_MINER_SIGIL.get()); + registerToggleableProperties(BloodMagicItems.MAGNETISM_SIGIL.get()); + registerToggleableProperties(BloodMagicItems.ICE_SIGIL.get()); + registerMultiWillTool(BloodMagicItems.SENTIENT_SWORD.get()); + registerMultiWillTool(BloodMagicItems.PETTY_GEM.get()); + registerMultiWillTool(BloodMagicItems.LESSER_GEM.get()); + registerMultiWillTool(BloodMagicItems.COMMON_GEM.get()); + + ItemModelsProperties.registerProperty(BloodMagicItems.SENTIENT_SWORD.get(), BloodMagic.rl("active"), new IItemPropertyGetter() + { + @Override + public float call(ItemStack stack, ClientWorld world, LivingEntity entity) + { + return ((ItemSentientSword) stack.getItem()).getActivated(stack) ? 1 : 0; + } + }); + } + + public static void registerToggleableProperties(Item item) + { + ItemModelsProperties.registerProperty(item, BloodMagic.rl("active"), new IItemPropertyGetter() + { + @Override + public float call(ItemStack stack, ClientWorld world, LivingEntity entity) + { + Item item = stack.getItem(); + if (item instanceof ItemSigilToggleable) + { + return ((ItemSigilToggleable) item).getActivated(stack) ? 1 : 0; + } + return 0; + } + }); + } + + public static void registerMultiWillTool(Item item) + { + ItemModelsProperties.registerProperty(item, BloodMagic.rl("type"), new IItemPropertyGetter() + { + @Override + public float call(ItemStack stack, ClientWorld world, LivingEntity entity) + { + Item item = stack.getItem(); + if (item instanceof IMultiWillTool) + { + return ((IMultiWillTool) item).getCurrentType(stack).ordinal(); + } + return 0; + } + }); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/render/BloodMagicRenderer.java b/src/main/java/wayoftime/bloodmagic/client/render/BloodMagicRenderer.java new file mode 100644 index 00000000..2948f554 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/BloodMagicRenderer.java @@ -0,0 +1,104 @@ +package wayoftime.bloodmagic.client.render; + +import java.util.Arrays; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; + +public class BloodMagicRenderer +{ + public static float getRed(int color) + { + return (color >> 16 & 0xFF) / 255.0F; + } + + public static float getGreen(int color) + { + return (color >> 8 & 0xFF) / 255.0F; + } + + public static float getBlue(int color) + { + return (color & 0xFF) / 255.0F; + } + + public static float getAlpha(int color) + { + return (color >> 24 & 0xFF) / 255.0F; + } + + public static class Model3D + { + public double minX, minY, minZ; + public double maxX, maxY, maxZ; + + public final TextureAtlasSprite[] textures = new TextureAtlasSprite[6]; + + public final boolean[] renderSides = new boolean[] + { true, true, true, true, true, true, false }; + + public double sizeX() + { + return maxX - minX; + } + + public double sizeY() + { + return maxY - minY; + } + + public double sizeZ() + { + return maxZ - minZ; + } + + public void setSideRender(Direction side, boolean value) + { + renderSides[side.ordinal()] = value; + } + + public boolean shouldSideRender(Direction side) + { + return renderSides[side.ordinal()]; + } + + public void setTexture(TextureAtlasSprite tex) + { + Arrays.fill(textures, tex); + } + + public void setTextures(TextureAtlasSprite down, TextureAtlasSprite up, TextureAtlasSprite north, TextureAtlasSprite south, TextureAtlasSprite west, TextureAtlasSprite east) + { + textures[0] = down; + textures[1] = up; + textures[2] = north; + textures[3] = south; + textures[4] = west; + textures[5] = east; + } + } + + public static class Model2D + { + public double minX, minY; + public double maxX, maxY; + + public ResourceLocation resource; + + public double sizeX() + { + return maxX - minX; + } + + public double sizeY() + { + return maxY - minY; + } + + public void setTexture(ResourceLocation resource) + { + this.resource = resource; + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableCuboid.java b/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableCuboid.java new file mode 100644 index 00000000..4049d4cc --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableCuboid.java @@ -0,0 +1,168 @@ +package wayoftime.bloodmagic.client.render; + +import java.util.Arrays; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.vector.Matrix3f; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.util.math.vector.Vector3i; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D; + +/** + * Adapted from BuildCraft + */ +public class RenderResizableCuboid +{ + public static final RenderResizableCuboid INSTANCE = new RenderResizableCuboid(); + private static final Vector3f VEC_ZERO = new Vector3f(0, 0, 0); + private static final int U_MIN = 0; + private static final int U_MAX = 1; + private static final int V_MIN = 2; + private static final int V_MAX = 3; + + protected EntityRendererManager manager = Minecraft.getInstance().getRenderManager(); + + private static Vector3f withValue(Vector3f vector, Axis axis, float value) + { + if (axis == Axis.X) + { + return new Vector3f(value, vector.getY(), vector.getZ()); + } else if (axis == Axis.Y) + { + return new Vector3f(vector.getX(), value, vector.getZ()); + } else if (axis == Axis.Z) + { + return new Vector3f(vector.getX(), vector.getY(), value); + } + throw new RuntimeException("Was given a null axis! That was probably not intentional, consider this a bug! (Vector = " + + vector + ")"); + } + + public static double getValue(Vector3d vector, Axis axis) + { + if (axis == Axis.X) + { + return vector.x; + } else if (axis == Axis.Y) + { + return vector.y; + } else if (axis == Axis.Z) + { + return vector.z; + } + throw new RuntimeException("Was given a null axis! That was probably not intentional, consider this a bug! (Vector = " + + vector + ")"); + } + + public void renderCube(Model3D cube, MatrixStack matrix, IVertexBuilder buffer, int argb, int light, int overlay) + { + float red = BloodMagicRenderer.getRed(argb); + float green = BloodMagicRenderer.getGreen(argb); + float blue = BloodMagicRenderer.getBlue(argb); + float alpha = BloodMagicRenderer.getAlpha(argb); + Vector3d size = new Vector3d(cube.sizeX(), cube.sizeY(), cube.sizeZ()); + matrix.push(); + matrix.translate(cube.minX, cube.minY, cube.minZ); + MatrixStack.Entry lastMatrix = matrix.getLast(); + Matrix4f matrix4f = lastMatrix.getMatrix(); + Matrix3f normal = lastMatrix.getNormal(); + for (Direction face : Direction.values()) + { + if (cube.shouldSideRender(face)) + { + int ordinal = face.ordinal(); + TextureAtlasSprite sprite = cube.textures[ordinal]; + if (sprite != null) + { + Axis u = face.getAxis() == Axis.X ? Axis.Z : Axis.X; + Axis v = face.getAxis() == Axis.Y ? Axis.Z : Axis.Y; + float other = face.getAxisDirection() == AxisDirection.POSITIVE + ? (float) getValue(size, face.getAxis()) + : 0; + + // Swap the face if this is positive: the renderer returns indexes that ALWAYS + // are for the negative face, so light it properly this way + face = face.getAxisDirection() == AxisDirection.NEGATIVE ? face : face.getOpposite(); + Direction opposite = face.getOpposite(); + + float minU = sprite.getMinU(); + float maxU = sprite.getMaxU(); + // Flip the v + float minV = sprite.getMaxV(); + float maxV = sprite.getMinV(); + double sizeU = getValue(size, u); + double sizeV = getValue(size, v); + // TODO: Look into this more, as it makes tiling of multiple objects not render + // properly if they don't fit the full texture. + // Example: Mechanical pipes rendering water or lava, makes it relatively easy + // to see the texture artifacts + for (int uIndex = 0; uIndex < sizeU; uIndex++) + { + float[] baseUV = new float[] + { minU, maxU, minV, maxV }; + double addU = 1; + // If the size of the texture is greater than the cuboid goes on for then make + // sure the texture positions are lowered + if (uIndex + addU > sizeU) + { + addU = sizeU - uIndex; + baseUV[U_MAX] = baseUV[U_MIN] + (baseUV[U_MAX] - baseUV[U_MIN]) * (float) addU; + } + for (int vIndex = 0; vIndex < sizeV; vIndex++) + { + float[] uv = Arrays.copyOf(baseUV, 4); + double addV = 1; + if (vIndex + addV > sizeV) + { + addV = sizeV - vIndex; + uv[V_MAX] = uv[V_MIN] + (uv[V_MAX] - uv[V_MIN]) * (float) addV; + } + float[] xyz = new float[] + { uIndex, (float) (uIndex + addU), vIndex, (float) (vIndex + addV) }; + + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, true, false, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, true, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, false, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, false, false, red, green, blue, alpha, light, overlay); + + renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, false, false, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, false, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, true, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, true, false, red, green, blue, alpha, light, overlay); + } + } + } + } + } + matrix.pop(); + } + + private void renderPoint(Matrix4f matrix4f, Matrix3f normal, IVertexBuilder buffer, Direction face, Axis u, Axis v, + float other, float[] uv, float[] xyz, boolean minU, boolean minV, float red, float green, float blue, + float alpha, int light, int overlay) + { + int U_ARRAY = minU ? U_MIN : U_MAX; + int V_ARRAY = minV ? V_MIN : V_MAX; + Vector3f vertex = withValue(VEC_ZERO, u, xyz[U_ARRAY]); + vertex = withValue(vertex, v, xyz[V_ARRAY]); + vertex = withValue(vertex, face.getAxis(), other); + Vector3i normalForFace = face.getDirectionVec(); + // TODO: Figure out how and why this works, it gives about the same brightness + // as we used to have but I don't understand why/how + float adjustment = 2.5F; + Vector3f norm = new Vector3f(normalForFace.getX() + adjustment, normalForFace.getY() + + adjustment, normalForFace.getZ() + adjustment); + norm.normalize(); + buffer.pos(matrix4f, vertex.getX(), vertex.getY(), vertex.getZ()).color(red, green, blue, alpha).tex(uv[U_ARRAY], uv[V_ARRAY]).overlay(overlay).lightmap(light).normal(normal, norm.getX(), norm.getY(), norm.getZ()).endVertex(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableQuadrilateral.java b/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableQuadrilateral.java new file mode 100644 index 00000000..006b7f4f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/RenderResizableQuadrilateral.java @@ -0,0 +1,167 @@ +package wayoftime.bloodmagic.client.render; + +import java.util.Arrays; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.Matrix3f; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.util.math.vector.Vector3i; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model2D; + +public class RenderResizableQuadrilateral +{ + public static final RenderResizableQuadrilateral INSTANCE = new RenderResizableQuadrilateral(); + private static final Vector3f VEC_ZERO = new Vector3f(0, 0, 0); + private static final int U_MIN = 0; + private static final int U_MAX = 1; + private static final int V_MIN = 2; + private static final int V_MAX = 3; + + protected EntityRendererManager manager = Minecraft.getInstance().getRenderManager(); + + private static Vector3f withValue(Vector3f vector, Axis axis, float value) + { + if (axis == Axis.X) + { + return new Vector3f(value, vector.getY(), vector.getZ()); + } else if (axis == Axis.Y) + { + return new Vector3f(vector.getX(), value, vector.getZ()); + } else if (axis == Axis.Z) + { + return new Vector3f(vector.getX(), vector.getY(), value); + } + throw new RuntimeException("Was given a null axis! That was probably not intentional, consider this a bug! (Vector = " + + vector + ")"); + } + + public static double getValue(Vector3d vector, Axis axis) + { + if (axis == Axis.X) + { + return vector.x; + } else if (axis == Axis.Y) + { + return vector.y; + } else if (axis == Axis.Z) + { + return vector.z; + } + throw new RuntimeException("Was given a null axis! That was probably not intentional, consider this a bug! (Vector = " + + vector + ")"); + } + + public void renderSquare(Model2D square, MatrixStack matrix, IVertexBuilder buffer, int argb, int light, int overlay) + { + float red = BloodMagicRenderer.getRed(argb); + float green = BloodMagicRenderer.getGreen(argb); + float blue = BloodMagicRenderer.getBlue(argb); + float alpha = BloodMagicRenderer.getAlpha(argb); + Vector3d size = new Vector3d(square.sizeX(), 0, square.sizeY()); + matrix.push(); + matrix.translate(square.minX, 0, square.minY); + MatrixStack.Entry lastMatrix = matrix.getLast(); + Matrix4f matrix4f = lastMatrix.getMatrix(); + Matrix3f normal = lastMatrix.getNormal(); + Direction face = Direction.UP; +// for (Direction face : Direction.values()) + + int ordinal = face.ordinal(); +// TextureAtlasSprite sprite = cube.textures[ordinal]; + ResourceLocation rl = square.resource; + if (rl != null) + { +// Minecraft.getInstance().textureManager.bindTexture(rl); + Axis u = face.getAxis() == Axis.X ? Axis.Z : Axis.X; + Axis v = face.getAxis() == Axis.Y ? Axis.Z : Axis.Y; + float other = face.getAxisDirection() == AxisDirection.POSITIVE ? (float) getValue(size, face.getAxis()) + : 0; + + // Swap the face if this is positive: the renderer returns indexes that ALWAYS + // are for the negative face, so light it properly this way + face = face.getAxisDirection() == AxisDirection.NEGATIVE ? face : face.getOpposite(); +// Direction opposite = face.getOpposite(); + + float minU = 0; + float maxU = 1; + // Flip the v + float minV = 1; + float maxV = 0; +// float minU = sprite.getMinU(); +// float maxU = sprite.getMaxU(); +// // Flip the v +// float minV = sprite.getMaxV(); +// float maxV = sprite.getMinV(); + double sizeU = getValue(size, u); + double sizeV = getValue(size, v); + // TODO: Look into this more, as it makes tiling of multiple objects not render + // properly if they don't fit the full texture. + // Example: Mechanical pipes rendering water or lava, makes it relatively easy + // to see the texture artifacts + for (int uIndex = 0; uIndex < sizeU; uIndex++) + { + float[] baseUV = new float[] + { minU, maxU, minV, maxV }; + double addU = 1; + // If the size of the texture is greater than the cuboid goes on for then make + // sure the texture positions are lowered + if (uIndex + addU > sizeU) + { +// addU = sizeU - uIndex; + baseUV[U_MAX] = baseUV[U_MIN] + (baseUV[U_MAX] - baseUV[U_MIN]) * (float) addU; + } + for (int vIndex = 0; vIndex < sizeV; vIndex++) + { + float[] uv = Arrays.copyOf(baseUV, 4); + double addV = 1; + if (vIndex + addV > sizeV) + { +// addV = sizeV - vIndex; + uv[V_MAX] = uv[V_MIN] + (uv[V_MAX] - uv[V_MIN]) * (float) addV; + } + float[] xyz = new float[] + { uIndex, (float) (uIndex + addU), vIndex, (float) (vIndex + addV) }; + + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, true, false, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, true, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, false, true, red, green, blue, alpha, light, overlay); + renderPoint(matrix4f, normal, buffer, face, u, v, other, uv, xyz, false, false, red, green, blue, alpha, light, overlay); + +// renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, false, false, red, green, blue, alpha, light, overlay); +// renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, false, true, red, green, blue, alpha, light, overlay); +// renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, true, true, red, green, blue, alpha, light, overlay); +// renderPoint(matrix4f, normal, buffer, opposite, u, v, other, uv, xyz, true, false, red, green, blue, alpha, light, overlay); + } + + } + } + matrix.pop(); + } + + private void renderPoint(Matrix4f matrix4f, Matrix3f normal, IVertexBuilder buffer, Direction face, Axis u, Axis v, float other, float[] uv, float[] xyz, boolean minU, boolean minV, float red, float green, float blue, float alpha, int light, int overlay) + { + int U_ARRAY = minU ? U_MIN : U_MAX; + int V_ARRAY = minV ? V_MIN : V_MAX; + Vector3f vertex = withValue(VEC_ZERO, u, xyz[U_ARRAY]); + vertex = withValue(vertex, v, xyz[V_ARRAY]); + vertex = withValue(vertex, face.getAxis(), other); + Vector3i normalForFace = face.getDirectionVec(); + // TODO: Figure out how and why this works, it gives about the same brightness + // as we used to have but I don't understand why/how + float adjustment = 2.5F; + Vector3f norm = new Vector3f(normalForFace.getX() + adjustment, normalForFace.getY() + + adjustment, normalForFace.getZ() + adjustment); + norm.normalize(); + buffer.pos(matrix4f, vertex.getX(), vertex.getY(), vertex.getZ()).color(red, green, blue, alpha).tex(uv[U_ARRAY], uv[V_ARRAY]).overlay(overlay).lightmap(light).normal(normal, norm.getX(), norm.getY(), norm.getZ()).endVertex(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/render/alchemyarray/AlchemyArrayRenderer.java b/src/main/java/wayoftime/bloodmagic/client/render/alchemyarray/AlchemyArrayRenderer.java new file mode 100644 index 00000000..510e51af --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/alchemyarray/AlchemyArrayRenderer.java @@ -0,0 +1,114 @@ +package wayoftime.bloodmagic.client.render.alchemyarray; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.Quaternion; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer; +import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model2D; +import wayoftime.bloodmagic.client.render.RenderResizableQuadrilateral; +import wayoftime.bloodmagic.tile.TileAlchemyArray; + +public class AlchemyArrayRenderer +{ + public final ResourceLocation arrayResource; + + public AlchemyArrayRenderer() + { + this(new ResourceLocation("bloodmagic", "textures/models/alchemyarrays/sightsigil.png")); + } + + public AlchemyArrayRenderer(ResourceLocation arrayResource) + { + this.arrayResource = arrayResource; + } + + public float getRotation(float craftTime) + { + float offset = 2; + if (craftTime >= offset) + { + float modifier = (float) Math.pow(craftTime - offset, 1.5); + return modifier * 1f; + } + return 0; + } + + public float getSecondaryRotation(float craftTime) + { + float offset = 50; + if (craftTime >= offset) + { + float modifier = (float) Math.pow(craftTime - offset, 1.7); + return modifier * 0.5f; + } + return 0; + } + + public float getSizeModifier(float craftTime) + { + if (craftTime >= 150 && craftTime <= 250) + { + return (200 - craftTime) / 50f; + } + return 1.0f; + } + + public float getVerticalOffset(float craftTime) + { + if (craftTime >= 5) + { + if (craftTime <= 40) + { + return (float) (-0.4 + (0.4) * Math.pow((craftTime - 5) / 35f, 3)); + } else + { + return 0; + } + } + return -0.4f; + } + + public void renderAt(TileAlchemyArray tileArray, double x, double y, double z, float craftTime, MatrixStack matrixStack, IRenderTypeBuffer renderer, int combinedLightIn, int combinedOverlayIn) + { + matrixStack.push(); + + matrixStack.translate(0.5, 0.5, 0.5); + + float rot = getRotation(craftTime); + float secondaryRot = getSecondaryRotation(craftTime); + + float size = 1.0F * getSizeModifier(craftTime); + Direction rotation = tileArray.getRotation(); + + matrixStack.push(); + matrixStack.translate(0, getVerticalOffset(craftTime), 0); + matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true)); + + matrixStack.push(); + + matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), rot, true)); + matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), secondaryRot, true)); + matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true)); + + IVertexBuilder twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(arrayResource)); + Model2D arrayModel = new BloodMagicRenderer.Model2D(); + arrayModel.minX = -0.5; + arrayModel.maxX = +0.5; + arrayModel.minY = -0.5; + arrayModel.maxY = +0.5; + arrayModel.resource = arrayResource; + + matrixStack.scale(size, size, size); + + RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, 0xFFFFFFFF, combinedLightIn, combinedOverlayIn); + + matrixStack.pop(); + matrixStack.pop(); + matrixStack.pop(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/client/render/entity/BloodLightRenderer.java b/src/main/java/wayoftime/bloodmagic/client/render/entity/BloodLightRenderer.java new file mode 100644 index 00000000..23609445 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/entity/BloodLightRenderer.java @@ -0,0 +1,24 @@ +package wayoftime.bloodmagic.client.render.entity; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.entity.SpriteRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IRendersAsItem; + +public class BloodLightRenderer extends SpriteRenderer +{ + public BloodLightRenderer(EntityRendererManager renderManagerIn) + { + super(renderManagerIn, Minecraft.getInstance().getItemRenderer()); + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) + { + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/render/entity/SoulSnareRenderer.java b/src/main/java/wayoftime/bloodmagic/client/render/entity/SoulSnareRenderer.java new file mode 100644 index 00000000..f2084b34 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/render/entity/SoulSnareRenderer.java @@ -0,0 +1,24 @@ +package wayoftime.bloodmagic.client.render.entity; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.client.renderer.entity.SpriteRenderer; +import net.minecraft.entity.Entity; +import net.minecraft.entity.IRendersAsItem; + +public class SoulSnareRenderer extends SpriteRenderer +{ + public SoulSnareRenderer(EntityRendererManager renderManagerIn) + { + super(renderManagerIn, Minecraft.getInstance().getItemRenderer()); + } + + @Override + public void render(T entityIn, float entityYaw, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int packedLightIn) + { + super.render(entityIn, entityYaw, partialTicks, matrixStackIn, bufferIn, packedLightIn); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenBase.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenBase.java new file mode 100644 index 00000000..c1d8091a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenBase.java @@ -0,0 +1,68 @@ +package wayoftime.bloodmagic.client.screens; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; + +public abstract class ScreenBase extends ContainerScreen +{ + private static final ResourceLocation background = new ResourceLocation(BloodMagic.MODID, "textures/gui/soulforge.png"); + + protected final T container; + + public ScreenBase(T container, PlayerInventory playerInventory, ITextComponent title) + { + super(container, playerInventory, title); + this.container = container; + } + + public ResourceLocation getBackground() + { + return background; + } + + @Override + public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) + { + this.renderBackground(stack); + super.render(stack, mouseX, mouseY, partialTicks); + + this.renderHoveredTooltip(stack, mouseX, mouseY); // @mcp: func_230459_a_ = renderHoveredToolTip +// if (mouseX > (guiLeft + 7) && mouseX < (guiLeft + 7) + 18 && mouseY > (guiTop + 7) +// && mouseY < (guiTop + 7) + 73) +// this.renderTooltip(stack, LanguageMap.getInstance().func_244260_a(Arrays.asList(new TranslationTextComponent("screen.diregoo.energy", MagicHelpers.withSuffix(this.container.getEnergy()), MagicHelpers.withSuffix(this.container.getMaxPower())))), mouseX, mouseY); + } + + @Override + public void init() + { + super.init(); + } + + @Override + protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int mouseX, int mouseY) + { +// RenderSystem.color4f(1, 1, 1, 1); +// getMinecraft().getTextureManager().bindTexture(getBackground()); +// this.blit(stack, guiLeft, guiTop, 0, 0, xSize, ySize); + +// int maxEnergy = this.container.getMaxPower(), height = 70; +// if (maxEnergy > 0) +// { +// int remaining = (this.container.getEnergy() * height) / maxEnergy; +// this.blit(stack, guiLeft + 8, guiTop + 78 - remaining, 176, 84 - remaining, 16, remaining + 1); +// } + } + +// + protected static TranslationTextComponent getTrans(String key, Object... args) + { + return new TranslationTextComponent(BloodMagic.MODID + "." + key, args); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/client/screens/ScreenSoulForge.java b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenSoulForge.java new file mode 100644 index 00000000..4fa2c9ce --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/screens/ScreenSoulForge.java @@ -0,0 +1,85 @@ +package wayoftime.bloodmagic.client.screens; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.tile.TileSoulForge; +import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; + +public class ScreenSoulForge extends ScreenBase +{ + private static final ResourceLocation background = new ResourceLocation(BloodMagic.MODID, "textures/gui/soulforge.png"); + public IInventory tileSoulForge; + + public ScreenSoulForge(ContainerSoulForge container, PlayerInventory playerInventory, ITextComponent title) + { + super(container, playerInventory, title); + tileSoulForge = container.tileForge; + this.xSize = 176; + this.ySize = 205; + } + + @Override + public ResourceLocation getBackground() + { + return background; + } + +// public + +// public ScreenSoulForge(InventoryPlayer playerInventory, IInventory tileSoulForge) +// { +// super(new ContainerSoulForge(playerInventory, tileSoulForge)); +// this.tileSoulForge = tileSoulForge; +// this.xSize = 176; +// this.ySize = 205; +// } +// +// @Override +// public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) +// { +// this.drawDefaultBackground(); +// super.drawScreen(mouseX, mouseY, partialTicks); +// this.renderHoveredToolTip(mouseX, mouseY); +// } +// + @Override + protected void drawGuiContainerForegroundLayer(MatrixStack stack, int mouseX, int mouseY) + { + this.font.func_243248_b(stack, new TranslationTextComponent("tile.bloodmagic.soulforge.name"), 8, 5, 4210752); + this.font.func_243248_b(stack, new TranslationTextComponent("container.inventory"), 8, 111, 4210752); + } + +// + @Override + protected void drawGuiContainerBackgroundLayer(MatrixStack stack, float partialTicks, int mouseX, int mouseY) + { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + getMinecraft().getTextureManager().bindTexture(background); + int i = (this.width - this.xSize) / 2; + int j = (this.height - this.ySize) / 2; + this.blit(stack, i, j, 0, 0, this.xSize, this.ySize); + + int l = this.getCookProgressScaled(90); + this.blit(stack, i + 115, j + 14 + 90 - l, 176, 90 - l, 18, l); + } + +// + public int getCookProgressScaled(int scale) + { + double progress = ((TileSoulForge) tileSoulForge).getProgressForGui(); +// if (tileSoulForge != null) +// { +// System.out.println("Tile is NOT null"); +// } +// double progress = ((float) this.container.data.get(0)) / ((float) this.container.data.get(1)); +// System.out.println(this.container.data.get(0)); + return (int) (progress * scale); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffect.java b/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffect.java new file mode 100644 index 00000000..36c6d12e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffect.java @@ -0,0 +1,15 @@ +package wayoftime.bloodmagic.common.alchemyarray; + +import net.minecraft.nbt.CompoundNBT; +import wayoftime.bloodmagic.tile.TileAlchemyArray; + +public abstract class AlchemyArrayEffect +{ + public abstract AlchemyArrayEffect getNewCopy(); + + public abstract void readFromNBT(CompoundNBT compound); + + public abstract void writeToNBT(CompoundNBT compound); + + public abstract boolean update(TileAlchemyArray array, int activeCounter); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffectCrafting.java b/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffectCrafting.java new file mode 100644 index 00000000..eebde533 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/alchemyarray/AlchemyArrayEffectCrafting.java @@ -0,0 +1,69 @@ +package wayoftime.bloodmagic.common.alchemyarray; + +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.BlockPos; +import wayoftime.bloodmagic.tile.TileAlchemyArray; + +public class AlchemyArrayEffectCrafting extends AlchemyArrayEffect +{ + public final ItemStack outputStack; + public int tickLimit; + + public AlchemyArrayEffectCrafting(ItemStack outputStack) + { + this(outputStack, 200); + } + + public AlchemyArrayEffectCrafting(ItemStack outputStack, int tickLimit) + { + this.outputStack = outputStack; + this.tickLimit = tickLimit; + } + + @Override + public boolean update(TileAlchemyArray tile, int ticksActive) + { + // TODO: Add recipe rechecking to verify nothing screwy is going on. + if (tile.getWorld().isRemote) + { + return false; + } + + if (ticksActive >= tickLimit) + { + BlockPos pos = tile.getPos(); + + ItemStack output = outputStack.copy(); + + ItemEntity outputEntity = new ItemEntity(tile.getWorld(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + + 0.5, output); + + tile.getWorld().addEntity(outputEntity); +// tile.getWorld().spawnEntity(outputEntity); + + return true; + } + + return false; + } + + @Override + public void writeToNBT(CompoundNBT tag) + { + + } + + @Override + public void readFromNBT(CompoundNBT tag) + { + + } + + @Override + public AlchemyArrayEffect getNewCopy() + { + return new AlchemyArrayEffectCrafting(outputStack, tickLimit); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemyArray.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemyArray.java new file mode 100644 index 00000000..f4202567 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockAlchemyArray.java @@ -0,0 +1,112 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import wayoftime.bloodmagic.tile.TileAlchemyArray; +import wayoftime.bloodmagic.util.Utils; + +public class BlockAlchemyArray extends Block +{ + protected static final VoxelShape BODY = Block.makeCuboidShape(1, 0, 1, 15, 1, 15); + + public BlockAlchemyArray() + { + super(Properties.create(Material.WOOL).hardnessAndResistance(1.0F, 0).doesNotBlockMovement()); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) + { + return BODY; + } + + @Override + public boolean hasTileEntity(BlockState state) + { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) + { + return new TileAlchemyArray(); + } + + @Override + public BlockRenderType getRenderType(BlockState state) + { + return BlockRenderType.ENTITYBLOCK_ANIMATED; + } + + @Override + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) + { + TileAlchemyArray array = (TileAlchemyArray) world.getTileEntity(pos); + + if (array == null || player.isSneaking()) + return ActionResultType.FAIL; + + ItemStack playerItem = player.getHeldItem(hand); + + if (!playerItem.isEmpty()) + { + if (array.getStackInSlot(0).isEmpty()) + { + Utils.insertItemToTile(array, player, 0); + world.notifyBlockUpdate(pos, state, state, 3); + } else if (!array.getStackInSlot(0).isEmpty()) + { + Utils.insertItemToTile(array, player, 1); + array.attemptCraft(); + world.notifyBlockUpdate(pos, state, state, 3); + } else + { + return ActionResultType.SUCCESS; + } + } + + world.notifyBlockUpdate(pos, state, state, 3); + return ActionResultType.SUCCESS; + } + + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileAlchemyArray alchemyArray = (TileAlchemyArray) world.getTileEntity(blockPos); + if (alchemyArray != null) + alchemyArray.dropItems(); + + super.onPlayerDestroy(world, blockPos, blockState); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) + { + if (!state.isIn(newState.getBlock())) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof TileAlchemyArray) + { + ((TileAlchemyArray) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java new file mode 100644 index 00000000..0332d2ff --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java @@ -0,0 +1,100 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import wayoftime.bloodmagic.iface.IAltarReader; +import wayoftime.bloodmagic.tile.TileAltar; +import wayoftime.bloodmagic.util.Utils; + +public class BlockAltar extends Block +{ + protected static final VoxelShape BODY = Block.makeCuboidShape(0, 0, 0, 16, 12, 16); + + public BlockAltar() + { + super(Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(1)); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) + { + return BODY; + } + + @Override + public boolean hasTileEntity(BlockState state) + { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) + { + return new TileAltar(); + } + + @Override + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) + { + TileAltar altar = (TileAltar) world.getTileEntity(pos); + + if (altar == null || player.isSneaking()) + return ActionResultType.FAIL; + + ItemStack playerItem = player.getHeldItem(hand); + + if (playerItem.getItem() instanceof IAltarReader)// || playerItem.getItem() instanceof IAltarManipulator) + { + playerItem.getItem().onItemRightClick(world, player, hand); + return ActionResultType.SUCCESS; + } + + if (Utils.insertItemToTile(altar, player)) + altar.startCycle(); + else + altar.setActive(); + + world.notifyBlockUpdate(pos, state, state, 3); + return ActionResultType.SUCCESS; + } + + @Override + public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) + { + TileAltar altar = (TileAltar) world.getTileEntity(blockPos); + if (altar != null) + altar.dropItems(); + + super.onPlayerDestroy(world, blockPos, blockState); + } + + @Override + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) + { + if (!state.isIn(newState.getBlock())) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + if (tileentity instanceof TileAltar) + { + ((TileAltar) tileentity).dropItems(); + worldIn.updateComparatorOutputLevel(pos, this); + } + + super.onReplaced(state, worldIn, pos, newState, isMoving); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodLight.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodLight.java new file mode 100644 index 00000000..4f3ad3f0 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodLight.java @@ -0,0 +1,64 @@ +package wayoftime.bloodmagic.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class BlockBloodLight extends Block +{ + protected static final VoxelShape BODY = Block.makeCuboidShape(7, 7, 7, 9, 9, 9); + + public BlockBloodLight() + { + super(Properties.create(Material.WOOL).doesNotBlockMovement().setLightLevel((state) -> { + return 15; + })); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) + { + return BODY; + } + + @Override + public BlockRenderType getRenderType(BlockState state) + { + return BlockRenderType.ENTITYBLOCK_ANIMATED; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void animateTick(BlockState stateIn, World world, BlockPos pos, Random rand) + { + ClientPlayerEntity player = Minecraft.getInstance().player; + + if (rand.nextInt(3) != 0) + { + world.addParticle(RedstoneParticleData.REDSTONE_DUST, pos.getX() + 0.5D + + rand.nextGaussian() / 8, pos.getY() + 0.5D, pos.getZ() + 0.5D + rand.nextGaussian() / 8, 0, 0, 0); + ItemStack heldItem = player.getHeldItem(Hand.MAIN_HAND); + +// if (heldItem.isEmpty() || heldItem.getItem() != RegistrarBloodMagicItems.SIGIL_BLOOD_LIGHT) +// return; +// +// for (int i = 0; i < 8; i++) world.addParticle(RedstoneParticleData.REDSTONE_DUST, pos.getX() + 0.5D +// + rand.nextGaussian() / 8, pos.getY() + 0.5D, pos.getZ() + 0.5D + rand.nextGaussian() / 8, 0, 0, 0); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java new file mode 100644 index 00000000..0d993c0c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java @@ -0,0 +1,45 @@ +package wayoftime.bloodmagic.common.block; + +import java.util.List; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import wayoftime.bloodmagic.block.enums.BloodRuneType; +import wayoftime.bloodmagic.iface.IBloodRune; + +public class BlockBloodRune extends Block implements IBloodRune +{ + private final BloodRuneType type; + + public BlockBloodRune(BloodRuneType type) + { + super(Properties.create(Material.ROCK).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(2).sound(SoundType.STONE)); + this.type = type; + } + + @Nullable + @Override + public BloodRuneType getBloodRune(World world, BlockPos pos) + { + return type; + } + + @Override + public void addInformation(ItemStack stack, @Nullable IBlockReader world, List tooltip, + ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.decoration.safe")); + super.addInformation(stack, world, tooltip, flag); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java new file mode 100644 index 00000000..27f7b461 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockSoulForge.java @@ -0,0 +1,95 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.fml.network.NetworkHooks; +import wayoftime.bloodmagic.tile.TileSoulForge; + +public class BlockSoulForge extends Block// implements IBMBlock +{ + protected static final VoxelShape BODY = Block.makeCuboidShape(1, 0, 1, 15, 12, 15); + + public BlockSoulForge() + { + super(Properties.create(Material.IRON).hardnessAndResistance(2.0F, 5.0F).harvestTool(ToolType.PICKAXE).harvestLevel(1)); + +// setTranslationKey(BloodMagic.MODID + ".soulForge"); +// setHardness(2.0F); +// setResistance(5.0F); +// setSoundType(SoundType.METAL); +// setHarvestLevel("pickaxe", 1); +// setCreativeTab(BloodMagic.TAB_BM); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) + { + return BODY; + } + + @Override + public boolean hasTileEntity(BlockState state) + { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) + { + return new TileSoulForge(); + } + + @Override + public BlockRenderType getRenderType(BlockState state) + { + return BlockRenderType.MODEL; + } + + @Override + public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult blockRayTraceResult) + { + if (world.isRemote) + return ActionResultType.SUCCESS; + + TileEntity tile = world.getTileEntity(pos); + if (!(tile instanceof TileSoulForge)) + return ActionResultType.FAIL; + + NetworkHooks.openGui((ServerPlayerEntity) player, (INamedContainerProvider) tile, pos); +// player.openGui(BloodMagic.instance, Constants.Gui.SOUL_FORGE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); + + return ActionResultType.SUCCESS; + } + +// @Override +// public void onPlayerDestroy(IWorld world, BlockPos blockPos, BlockState blockState) +// { +// TileSoulForge tileSoulForge = (TileSoulForge) world.getTileEntity(blockPos); +// if (tileSoulForge != null) +// tileSoulForge.dropItems(); +// +// super.breakBlock(world, blockPos, blockState); +// } + +// +// @Override +// public BlockItem getItem() +// { +// return new BlockItem(this); +// } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java new file mode 100644 index 00000000..955b36b8 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java @@ -0,0 +1,88 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.fluid.FlowingFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.item.BucketItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.extensions.IForgeContainerType; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.block.enums.BloodRuneType; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.tile.contailer.ContainerSoulForge; + +public class BloodMagicBlocks +{ + public static final ResourceLocation FLUID_STILL = new ResourceLocation("bloodmagic:block/lifeessencestill"); + public static final ResourceLocation FLUID_FLOWING = new ResourceLocation("bloodmagic:block/lifeessenceflowing"); + + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, BloodMagic.MODID); + public static final DeferredRegister BASICBLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, BloodMagic.MODID); + public static final DeferredRegister ITEMS = BloodMagicItems.ITEMS; + public static final DeferredRegister FLUIDS = DeferredRegister.create(ForgeRegistries.FLUIDS, BloodMagic.MODID); + public static final DeferredRegister> CONTAINERS = DeferredRegister.create(ForgeRegistries.CONTAINERS, BloodMagic.MODID); + +// public static final RegistryObject BLOODSTONE = BASICBLOCKS.register("ruby_block", BloodstoneBlock::new); + public static final RegistryObject SOUL_FORGE = BLOCKS.register("soulforge", BlockSoulForge::new); + public static final RegistryObject ALCHEMY_ARRAY = BLOCKS.register("alchemyarray", BlockAlchemyArray::new); + public static final RegistryObject BLANK_RUNE = BASICBLOCKS.register("blankrune", () -> new BlockBloodRune(BloodRuneType.BLANK)); + public static final RegistryObject SPEED_RUNE = BASICBLOCKS.register("speedrune", () -> new BlockBloodRune(BloodRuneType.SPEED)); + public static final RegistryObject SACRIFICE_RUNE = BASICBLOCKS.register("sacrificerune", () -> new BlockBloodRune(BloodRuneType.SACRIFICE)); + public static final RegistryObject SELF_SACRIFICE_RUNE = BASICBLOCKS.register("selfsacrificerune", () -> new BlockBloodRune(BloodRuneType.SELF_SACRIFICE)); + public static final RegistryObject DISPLACEMENT_RUNE = BASICBLOCKS.register("dislocationrune", () -> new BlockBloodRune(BloodRuneType.DISPLACEMENT)); + public static final RegistryObject CAPACITY_RUNE = BASICBLOCKS.register("altarcapacityrune", () -> new BlockBloodRune(BloodRuneType.CAPACITY)); + public static final RegistryObject AUGMENTED_CAPACITY_RUNE = BASICBLOCKS.register("bettercapacityrune", () -> new BlockBloodRune(BloodRuneType.AUGMENTED_CAPACITY)); + public static final RegistryObject ORB_RUNE = BASICBLOCKS.register("orbcapacityrune", () -> new BlockBloodRune(BloodRuneType.ORB)); + public static final RegistryObject ACCELERATION_RUNE = BASICBLOCKS.register("accelerationrune", () -> new BlockBloodRune(BloodRuneType.ACCELERATION)); + public static final RegistryObject CHARGING_RUNE = BASICBLOCKS.register("chargingrune", () -> new BlockBloodRune(BloodRuneType.CHARGING)); + + public static final RegistryObject BLOOD_ALTAR = BLOCKS.register("altar", () -> new BlockAltar()); + public static final RegistryObject BLOOD_LIGHT = BLOCKS.register("bloodlight", () -> new BlockBloodLight()); + + private static ForgeFlowingFluid.Properties makeProperties() + { + return new ForgeFlowingFluid.Properties(LIFE_ESSENCE_FLUID, LIFE_ESSENCE_FLUID_FLOWING, FluidAttributes.builder(FLUID_STILL, FLUID_FLOWING)).bucket(LIFE_ESSENCE_BUCKET).block(LIFE_ESSENCE_BLOCK); + } + + public static RegistryObject LIFE_ESSENCE_FLUID = FLUIDS.register("life_essence_fluid", () -> new ForgeFlowingFluid.Source(makeProperties())); + public static RegistryObject LIFE_ESSENCE_FLUID_FLOWING = FLUIDS.register("life_essence_fluid_flowing", () -> new ForgeFlowingFluid.Flowing(makeProperties())); + + public static RegistryObject LIFE_ESSENCE_BLOCK = BLOCKS.register("life_essence_block", () -> new FlowingFluidBlock(LIFE_ESSENCE_FLUID, Block.Properties.create(net.minecraft.block.material.Material.WATER).doesNotBlockMovement().hardnessAndResistance(100.0F).noDrops())); + public static RegistryObject LIFE_ESSENCE_BUCKET = ITEMS.register("life_essence_bucket", () -> new BucketItem(LIFE_ESSENCE_FLUID, new Item.Properties().containerItem(Items.BUCKET).maxStackSize(1).group(BloodMagic.TAB))); + + public static final RegistryObject> SOUL_FORGE_CONTAINER = CONTAINERS.register("soul_forge_container", () -> IForgeContainerType.create(ContainerSoulForge::new)); +// public static final RegistryObject BLOOD_STONE = registerNoItem("blood_stone", () -> new BloodstoneBlock()); +// +//// private static RegistryObject register(String name, Supplier sup, Function, Supplier> itemCreator) +//// { +//// RegistryObject ret = registerNoItem(name, sup); +//// ITEMS.register(name, itemCreator.apply(ret)); +//// return ret; +//// } +// +// private static RegistryObject register(String name, Supplier sup, Function, Supplier> itemCreator) +// { +// RegistryObject ret = registerNoItem(name, sup); +// ITEMS.register(name, itemCreator.apply(ret)); +// return ret; +// } +// +// private static RegistryObject registerNoItem(String name, Supplier sup) +// { +// return BLOCKS.register(name, sup); +// } + +// private static Supplier item(final RegistryObject block, final Supplier> renderMethod) +// { +// return () -> new BlockItem(block.get(), new Item.Properties().group(IronChests.IRONCHESTS_ITEM_GROUP).setISTER(renderMethod)); +// } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodstoneBlock.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodstoneBlock.java new file mode 100644 index 00000000..ad4a9a4e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodstoneBlock.java @@ -0,0 +1,13 @@ +package wayoftime.bloodmagic.common.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; + +public class BloodstoneBlock extends Block +{ + public BloodstoneBlock() + { + super(Properties.create(Material.ROCK)); + // TODO Auto-generated constructor stub + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java new file mode 100644 index 00000000..60f56a5f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBaseRecipes.java @@ -0,0 +1,51 @@ +package wayoftime.bloodmagic.common.data; + +import java.util.function.Consumer; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.data.ShapedRecipeBuilder; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import net.minecraftforge.common.Tags; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.data.recipe.BaseRecipeProvider; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.core.recipe.IngredientBloodOrb; + +public class GeneratorBaseRecipes extends BaseRecipeProvider +{ + public GeneratorBaseRecipes(DataGenerator gen) + { + super(gen, BloodMagic.MODID); + } + + @Override + protected void registerRecipes(Consumer consumer) + { + addVanillaRecipes(consumer); + addBloodOrbRecipes(consumer); + } + + private void addVanillaRecipes(Consumer consumer) + { + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.SACRIFICIAL_DAGGER.get()).key('g', Tags.Items.GLASS).key('G', Tags.Items.INGOTS_GOLD).key('i', Tags.Items.INGOTS_IRON).patternLine("ggg").patternLine(" Gg").patternLine("i g").addCriterion("has_glass", hasItem(Items.GLASS)).build(consumer, BloodMagic.rl("sacrificial_dagger")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLOOD_ALTAR.get()).key('a', Tags.Items.STONE).key('b', Items.FURNACE).key('c', Tags.Items.INGOTS_GOLD).key('d', BloodMagicItems.MONSTER_SOUL_RAW.get()).patternLine("a a").patternLine("aba").patternLine("cdc").addCriterion("has_will", hasItem(BloodMagicItems.MONSTER_SOUL_RAW.get())).build(consumer, BloodMagic.rl("blood_altar")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SOUL_FORGE.get()).key('s', Tags.Items.STONE).key('g', Tags.Items.INGOTS_GOLD).key('i', Tags.Items.INGOTS_IRON).key('o', Tags.Items.STORAGE_BLOCKS_IRON).patternLine("i i").patternLine("sgs").patternLine("sos").addCriterion("has_gold", hasItem(Items.GOLD_INGOT)).build(consumer, BloodMagic.rl("soul_forge")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.SOUL_SNARE.get(), 4).key('r', Tags.Items.DUSTS_REDSTONE).key('s', Tags.Items.STRING).key('i', Tags.Items.INGOTS_IRON).patternLine("sis").patternLine("iri").patternLine("sis").addCriterion("has_redstone", hasItem(Items.REDSTONE)).build(consumer, BloodMagic.rl("soul_snare")); + } + + private void addBloodOrbRecipes(Consumer consumer) + { + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.BLANK_RUNE.get()).key('a', Tags.Items.STONE).key('s', Ingredient.fromItems(BloodMagicItems.SLATE.get())).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("aaa").patternLine("sos").patternLine("aaa").addCriterion("has_weak_orb", hasItem(BloodMagicItems.WEAK_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_blank")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('a', Tags.Items.STONE).key('b', Ingredient.fromItems(BloodMagicItems.SLATE.get())).key('c', Ingredient.fromItems(Items.SUGAR)).key('d', BloodMagicBlocks.BLANK_RUNE.get()).patternLine("aba").patternLine("cdc").patternLine("aba").addCriterion("has_blank_rune", hasItem(BloodMagicItems.BLANK_RUNE_ITEM.get())).build(consumer, BloodMagic.rl("blood_rune_speed")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SACRIFICE_RUNE.get()).key('a', Tags.Items.STONE).key('b', BloodMagicItems.REINFORCED_SLATE.get()).key('c', Tags.Items.INGOTS_GOLD).key('d', BloodMagicBlocks.BLANK_RUNE.get()).key('e', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("cdc").patternLine("aea").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_sacrifice")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SELF_SACRIFICE_RUNE.get()).key('a', Tags.Items.STONE).key('b', Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get())).key('c', Ingredient.fromItems(Items.GLOWSTONE_DUST)).key('d', Ingredient.fromItems(BloodMagicItems.BLANK_RUNE_ITEM.get())).key('e', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_APPRENTICE.get())).patternLine("aba").patternLine("cdc").patternLine("aea").addCriterion("has_apprentice_orb", hasItem(BloodMagicItems.APPRENTICE_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_self_sacrifice")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.CAPACITY_RUNE.get()).key('a', Tags.Items.STONE).key('b', Items.BUCKET).key('c', BloodMagicBlocks.BLANK_RUNE.get()).key('d', BloodMagicItems.IMBUED_SLATE.get()).patternLine("aba").patternLine("bcb").patternLine("ada").addCriterion("has_imbued_slate", hasItem(BloodMagicItems.IMBUED_SLATE.get())).build(consumer, BloodMagic.rl("blood_rune_capacity")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.ORB_RUNE.get()).key('a', Tags.Items.STONE).key('b', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).key('c', BloodMagicBlocks.BLANK_RUNE.get()).key('d', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MASTER.get())).patternLine("aba").patternLine("cdc").patternLine("aba").addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_orb")); + ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.CHARGING_RUNE.get()).key('R', Tags.Items.DUSTS_REDSTONE).key('r', BloodMagicBlocks.BLANK_RUNE.get()).key('s', BloodMagicItems.DEMONIC_SLATE.get()).key('e', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MASTER.get())).key('G', Tags.Items.DUSTS_GLOWSTONE).patternLine("RsR").patternLine("GrG").patternLine("ReR").addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("blood_rune_charging")); +// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', Ingredient.fromItems(Items.DIAMOND)).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_standard")); +// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_orb")); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java new file mode 100644 index 00000000..cbb374ea --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorBlockStates.java @@ -0,0 +1,38 @@ +package wayoftime.bloodmagic.common.data; + +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.fml.RegistryObject; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; + +public class GeneratorBlockStates extends BlockStateProvider +{ + public GeneratorBlockStates(DataGenerator gen, ExistingFileHelper exFileHelper) + { + super(gen, BloodMagic.MODID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() + { +// buildCubeAll(BloodMagicBlocks.TARTARICFORGE.get()); +// buildCubeAll(BloodMagicBlocks.SPEED_RUNE.get()); + + for (RegistryObject block : BloodMagicBlocks.BASICBLOCKS.getEntries()) + { + buildCubeAll(block.get()); + } + + buildCubeAll(BloodMagicBlocks.BLOOD_LIGHT.get()); + } + + private void buildCubeAll(Block block) + { + getVariantBuilder(block).forAllStates(state -> ConfiguredModel.builder().modelFile(cubeAll(block)).build()); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java new file mode 100644 index 00000000..06c2f49c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java @@ -0,0 +1,105 @@ +package wayoftime.bloodmagic.common.data; + +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraft.item.Item; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ItemModelProvider; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.fml.RegistryObject; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +public class GeneratorItemModels extends ItemModelProvider +{ + public GeneratorItemModels(DataGenerator generator, ExistingFileHelper existingFileHelper) + { + super(generator, BloodMagic.MODID, existingFileHelper); + } + + @Override + protected void registerModels() + { +// registerBlockModel(BloodMagicBlocks.TARTARICFORGE.get()); +// registerBlockModel(BloodMagicBlocks.SPEED_RUNE.get()); + + for (RegistryObject item : BloodMagicItems.BASICITEMS.getEntries()) + { + registerBasicItem(item.get()); + } + + for (RegistryObject block : BloodMagicBlocks.BASICBLOCKS.getEntries()) + { + registerBlockModel(block.get()); + } + + registerToggleableItem(BloodMagicItems.GREEN_GROVE_SIGIL.get()); + registerToggleableItem(BloodMagicItems.FAST_MINER_SIGIL.get()); + registerToggleableItem(BloodMagicItems.MAGNETISM_SIGIL.get()); + registerToggleableItem(BloodMagicItems.ICE_SIGIL.get()); + registerDemonWillVariantItem(BloodMagicItems.PETTY_GEM.get()); + registerDemonWillVariantItem(BloodMagicItems.LESSER_GEM.get()); + registerDemonWillVariantItem(BloodMagicItems.COMMON_GEM.get()); + registerDemonSword(BloodMagicItems.SENTIENT_SWORD.get()); + } + + private void registerBlockModel(Block block) + { + String path = block.getRegistryName().getPath(); + getBuilder(path).parent(new ModelFile.UncheckedModelFile(modLoc("block/" + path))); + } + + private void registerBasicItem(Item item) + { + String path = item.getRegistryName().getPath(); + singleTexture(path, mcLoc("item/handheld"), "layer0", modLoc("item/" + path)); + } + + private void registerToggleableItem(Item item) + { + String path = item.getRegistryName().getPath(); + ModelFile activatedFile = singleTexture("item/variants/" + path + "_activated", mcLoc("item/handheld"), "layer0", modLoc("item/" + path + "_activated")); + ModelFile deactivatedFile = singleTexture("item/variants/" + path + "_deactivated", mcLoc("item/handheld"), "layer0", modLoc("item/" + path + "_deactivated")); + getBuilder(path).override().predicate(BloodMagic.rl("active"), 0).model(deactivatedFile).end().override().predicate(BloodMagic.rl("active"), 1).model(activatedFile).end(); + } + + private void registerDemonWillVariantItem(Item item) + { + String path = item.getRegistryName().getPath(); + ItemModelBuilder builder = getBuilder(path); + + for (EnumDemonWillType type : EnumDemonWillType.values()) + { + String name = ""; + if (type.ordinal() != 0) + { + name = "_" + type.name().toLowerCase(); + } + ModelFile willFile = singleTexture("item/variants/" + path + name, mcLoc("item/handheld"), "layer0", modLoc("item/" + path + name)); + builder = builder.override().predicate(BloodMagic.rl("type"), type.ordinal()).model(willFile).end(); + } + } + + private void registerDemonSword(Item item) + { + String path = item.getRegistryName().getPath(); + ItemModelBuilder builder = getBuilder(path); + + for (int i = 0; i <= 1; i++) + { + for (EnumDemonWillType type : EnumDemonWillType.values()) + { + String name = i == 0 ? "_deactivated" : "_activated"; + if (type.ordinal() != 0) + { + name = "_" + type.name().toLowerCase() + name; + } + ModelFile willFile = singleTexture("item/variants/" + path + name, mcLoc("item/handheld"), "layer0", modLoc("item/" + path + name)); + builder = builder.override().predicate(BloodMagic.rl("type"), type.ordinal()).predicate(BloodMagic.rl("active"), i).model(willFile).end(); + } + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java new file mode 100644 index 00000000..e72dabd6 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLanguage.java @@ -0,0 +1,161 @@ +package wayoftime.bloodmagic.common.data; + +import net.minecraft.data.DataGenerator; +import net.minecraftforge.common.data.LanguageProvider; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.BloodMagicItems; + +public class GeneratorLanguage extends LanguageProvider +{ + public GeneratorLanguage(DataGenerator gen) + { + super(gen, BloodMagic.MODID, "en_us"); + } + + @Override + protected void addTranslations() + { + // Creative Tab + add("itemGroup.bloodmagic.creativeTab", "Blood Magic"); + + // Tile Entitites + add("tile.bloodmagic.soulforge.name", "Hellfire Forge"); + + // Blood Orb tooltips + add("tooltip.bloodmagic.extraInfo", "&9-Hold shift for more info-"); + add("tooltip.bloodmagic.orb.desc", "Stores raw Life Essence"); + add("tooltip.bloodmagic.orb.owner", "Added by: %s"); + add("tooltip.bloodmagic.currentOwner", "Current owner: %s"); + add("tooltip.bloodmagic.currentTier", "Current tier: %d"); + add("tooltip.bloodmagic.config.disabled", "Currently disabled in the Config"); + add("tooltip.bloodmagic.tier", "Tier %d"); + + // Sigil tooltips + add("tooltip.bloodmagic.sigil.divination.desc", "Peer into the soul"); + add("tooltip.bloodmagic.sigil.divination.otherNetwork", "Peering into the soul of %s"); + add("tooltip.bloodmagic.sigil.divination.currentAltarTier", "Current Tier: %d"); + add("tooltip.bloodmagic.sigil.divination.currentEssence", "Current Essence: %d LP"); + add("tooltip.bloodmagic.sigil.divination.currentAltarCapacity", "Current Capacity: %d LP"); + add("tooltip.bloodmagic.sigil.divination.currentTranquility", "Current Tranquility: %d"); +// add("tooltip.bloodmagic.sigil.divination.currentInversion", "Current Inversion: %d"); + add("tooltip.bloodmagic.sigil.divination.currentBonus", "Current Bonus: +%d%%"); + + add("tooltip.bloodmagic.decoration.safe", "Safe for decoration"); + add("tooltip.bloodmagic.decoration.notSafe", "Dangerous for decoration"); + + // General Tooltips + add("tooltip.bloodmagic.arcaneAshes", "Ashes used to draw an alchemy circle"); + add("tooltip.bloodmagic.will", "Will Quality: %s"); + add("tooltip.bloodmagic.sentientSword.desc", "Uses demon will to unleash its full potential."); + add("tooltip.bloodmagic.sentientAxe.desc", "Uses demon will to unleash its full potential."); + add("tooltip.bloodmagic.sentientPickaxe.desc", "Uses demon will to unleash its full potential."); + add("tooltip.bloodmagic.sentientShovel.desc", "Uses demon will to unleash its full potential."); + add("tooltip.bloodmagic.soulGem.petty", "A gem used to contain a little will"); + add("tooltip.bloodmagic.soulGem.lesser", "A gem used to contain some will"); + add("tooltip.bloodmagic.soulGem.common", "A gem used to contain more will"); + add("tooltip.bloodmagic.soulGem.greater", "A gem used to contain a greater amount of will"); + add("tooltip.bloodmagic.soulGem.grand", "A gem used to contain a large amount of will"); + add("tooltip.bloodmagic.soulSnare.desc", "Throw at a monster and then kill them to obtain their demonic will"); + + add("tooltip.bloodmagic.currentType.default", "Contains: Raw Will"); + add("tooltip.bloodmagic.currentType.corrosive", "Contains: Corrosive Will"); + add("tooltip.bloodmagic.currentType.destructive", "Contains: Destructive Will"); + add("tooltip.bloodmagic.currentType.vengeful", "Contains: Vengeful Will"); + add("tooltip.bloodmagic.currentType.steadfast", "Contains: Steadfast Will"); + + add("tooltip.bloodmagic.currentBaseType.default", "Raw"); + add("tooltip.bloodmagic.currentBaseType.corrosive", "Corrosive"); + add("tooltip.bloodmagic.currentBaseType.destructive", "Destructive"); + add("tooltip.bloodmagic.currentBaseType.vengeful", "Vengeful"); + add("tooltip.bloodmagic.currentBaseType.steadfast", "Steadfast"); + add("tooltip.bloodmagic.sacrificialdagger.desc", "Just a prick of the finger will suffice..."); + add("tooltip.bloodmagic.slate.desc", "Infused stone inside of a Blood Altar"); + + add("tooltip.bloodmagic.sigil.water.desc", "Infinite water, anyone?"); + add("tooltip.bloodmagic.sigil.lava.desc", "HOT! DO NOT EAT"); + add("tooltip.bloodmagic.sigil.void.desc", "Better than a Swiffer®!"); + add("tooltip.bloodmagic.sigil.greengrove.desc", "Environmentally friendly"); + add("tooltip.bloodmagic.sigil.magnetism.desc", "I have a very magnetic personality"); + add("tooltip.bloodmagic.sigil.fastminer.desc", "Keep mining, and mining..."); + add("tooltip.bloodmagic.sigil.air.desc", "I feel lighter already..."); + add("tooltip.bloodmagic.sigil.bloodlight.desc", "I see a light!"); + + add("itemGroup.bloodmagictab", "Blood Magic"); + + // Block names + addBlock(BloodMagicBlocks.BLANK_RUNE, "Blank Rune"); + addBlock(BloodMagicBlocks.SPEED_RUNE, "Speed Rune"); + addBlock(BloodMagicBlocks.SACRIFICE_RUNE, "Rune of Sacrifice"); + addBlock(BloodMagicBlocks.SELF_SACRIFICE_RUNE, "Rune of Self Sacrifice"); + addBlock(BloodMagicBlocks.DISPLACEMENT_RUNE, "DisplacementRune"); + addBlock(BloodMagicBlocks.CAPACITY_RUNE, "Rune of Capacity"); + addBlock(BloodMagicBlocks.AUGMENTED_CAPACITY_RUNE, "Rune of Augmented Capacity"); + addBlock(BloodMagicBlocks.ORB_RUNE, "Rune of the Orb"); + addBlock(BloodMagicBlocks.ACCELERATION_RUNE, "Acceleration Rune"); + addBlock(BloodMagicBlocks.CHARGING_RUNE, "Charging Rune"); + addBlock(BloodMagicBlocks.BLOOD_ALTAR, "Blood Altar"); + addBlock(BloodMagicBlocks.SOUL_FORGE, "Hellfire Forge"); + + // Item names + addItem(BloodMagicItems.WEAK_BLOOD_ORB, "Weak Blood Orb"); + addItem(BloodMagicItems.APPRENTICE_BLOOD_ORB, "Apprentice Blood Orb"); + addItem(BloodMagicItems.MAGICIAN_BLOOD_ORB, "Magician Blood Orb"); + addItem(BloodMagicItems.MASTER_BLOOD_ORB, "Master Blood Orb"); + addItem(BloodMagicItems.DIVINATION_SIGIL, "Divination Sigil"); + addItem(BloodMagicItems.WATER_SIGIL, "Water Sigil"); + addItem(BloodMagicItems.LAVA_SIGIL, "Lava Sigil"); + addItem(BloodMagicItems.VOID_SIGIL, "Void Sigil"); + addItem(BloodMagicItems.GREEN_GROVE_SIGIL, "Sigil of the Green Grove"); + addItem(BloodMagicItems.FAST_MINER_SIGIL, "Sigil of the Fast Miner"); + addItem(BloodMagicItems.MAGNETISM_SIGIL, "Sigil of Magnetism"); + addItem(BloodMagicItems.ICE_SIGIL, "Sigil of the Frozen Lake"); + addItem(BloodMagicItems.AIR_SIGIL, "Air Sigil"); + addItem(BloodMagicItems.BLOOD_LIGHT_SIGIL, "Sigil of the Blood Lamp"); + + addItem(BloodMagicBlocks.LIFE_ESSENCE_BUCKET, "Bucket of Life"); + addItem(BloodMagicItems.ARCANE_ASHES, "Arcane Ashes"); + addItem(BloodMagicItems.SLATE, "Blank Slate"); + addItem(BloodMagicItems.REINFORCED_SLATE, "Reinforced Slate"); + addItem(BloodMagicItems.IMBUED_SLATE, "Imbued Slate"); + addItem(BloodMagicItems.DEMONIC_SLATE, "Demonic Slate"); + addItem(BloodMagicItems.ETHEREAL_SLATE, "Ethereal Slate"); + + addItem(BloodMagicItems.DAGGER_OF_SACRIFICE, "Dagger of Sacrifice"); + addItem(BloodMagicItems.SACRIFICIAL_DAGGER, "Sacrificial Knife"); + + addItem(BloodMagicItems.REAGENT_WATER, "Water Reagent"); + addItem(BloodMagicItems.REAGENT_LAVA, "Lava Reagent"); + addItem(BloodMagicItems.REAGENT_FAST_MINER, "Mining Reagent"); + addItem(BloodMagicItems.REAGENT_GROWTH, "Growth Reagent"); + addItem(BloodMagicItems.REAGENT_VOID, "Void Reagent"); + addItem(BloodMagicItems.REAGENT_MAGNETISM, "Magnetism Reagent"); + addItem(BloodMagicItems.REAGENT_AIR, "Air Reagent"); + addItem(BloodMagicItems.REAGENT_BLOOD_LIGHT, "Blood Lamp Reagent"); + + addItem(BloodMagicItems.PETTY_GEM, "Petty Tartaric Gem"); + addItem(BloodMagicItems.LESSER_GEM, "Lesser Tartaric Gem"); + addItem(BloodMagicItems.COMMON_GEM, "Common Tartaric Gem"); + addItem(BloodMagicItems.MONSTER_SOUL_RAW, "Demon Will"); + addItem(BloodMagicItems.MONSTER_SOUL_CORROSIVE, "Demon Will"); + addItem(BloodMagicItems.MONSTER_SOUL_DESTRUCTIVE, "Demon Will"); + addItem(BloodMagicItems.MONSTER_SOUL_STEADFAST, "Demon Will"); + addItem(BloodMagicItems.MONSTER_SOUL_VENGEFUL, "Demon Will"); + addItem(BloodMagicItems.SOUL_SNARE, "Soul Snare"); + addItem(BloodMagicItems.SENTIENT_SWORD, "Sentient Sword"); + +// addItem(BloodMagicItems , ""); + + // JEI + add("jei.bloodmagic.recipe.minimumsouls", "Minimum: %s Will"); + add("jei.bloodmagic.recipe.soulsdrained", "Drained: %s Will"); + add("jei.bloodmagic.recipe.requiredlp", "LP: %d"); + add("jei.bloodmagic.recipe.requiredtier", "Tier: %d"); + add("jei.bloodmagic.recipe.consumptionrate", "Consumption: %s LP/t"); + add("jei.bloodmagic.recipe.drainrate", "Drain: %s LP/t"); + + add("jei.bloodmagic.recipe.altar", "Blood Altar"); + add("jei.bloodmagic.recipe.soulforge", "Hellfire Forge"); + add("jei.bloodmagic.recipe.alchemyarraycrafting", "Alchemy Array"); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java new file mode 100644 index 00000000..5c4092c7 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorLootTable.java @@ -0,0 +1,99 @@ +package wayoftime.bloodmagic.common.data; + +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import com.google.common.collect.ImmutableList; +import com.mojang.datafixers.util.Pair; + +import net.minecraft.block.Block; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.LootTableProvider; +import net.minecraft.data.loot.BlockLootTables; +import net.minecraft.loot.LootParameterSet; +import net.minecraft.loot.LootParameterSets; +import net.minecraft.loot.LootPool; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.LootTableManager; +import net.minecraft.loot.ValidationTracker; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; + +public class GeneratorLootTable extends LootTableProvider +{ + public GeneratorLootTable(DataGenerator dataGeneratorIn) + { + super(dataGeneratorIn); + } + + @Override + protected List>>, LootParameterSet>> getTables() + { + return ImmutableList.of(Pair.of(Blocks::new, LootParameterSets.BLOCK)); + } + + private static class Blocks extends BlockLootTables + { + @Override + protected void addTables() + { + for (RegistryObject block : BloodMagicBlocks.BASICBLOCKS.getEntries()) + { + this.registerDropSelfLootTable(block.get()); + } + + this.registerDropSelfLootTable(BloodMagicBlocks.BLOOD_ALTAR.get()); + registerNoDropLootTable(BloodMagicBlocks.ALCHEMY_ARRAY.get()); + registerNoDropLootTable(BloodMagicBlocks.BLOOD_LIGHT.get()); + this.registerDropSelfLootTable(BloodMagicBlocks.SOUL_FORGE.get()); + +// LootPool.Builder builder = LootPool.builder().name(ModBlocks.GOO_BLOCK.get().getRegistryName().toString()).rolls(ConstantRange.of(1)).acceptCondition(SurvivesExplosion.builder()).addEntry(ItemLootEntry.builder(ModItems.GOO_RESIDUE.get())); +// this.registerLootTable(ModBlocks.GOO_BLOCK.get(), LootTable.builder().addLootPool(builder)); +// +// LootPool.Builder builder2 = LootPool.builder().name(ModBlocks.GOO_BLOCK_TERRAIN.get().getRegistryName().toString()).rolls(ConstantRange.of(1)).acceptCondition(SurvivesExplosion.builder()).addEntry(ItemLootEntry.builder(ModItems.GOO_RESIDUE.get())); +// this.registerLootTable(ModBlocks.GOO_BLOCK_TERRAIN.get(), LootTable.builder().addLootPool(builder2)); +// +// this.registerDropSelfLootTable(ModBlocks.GOO_BLOCK_POISON.get()); +// this.registerDropSelfLootTable(ModBlocks.GNT_BLOCK_T1.get()); +// this.registerDropSelfLootTable(ModBlocks.GNT_BLOCK_T2.get()); +// this.registerDropSelfLootTable(ModBlocks.GNT_BLOCK_T3.get()); +// this.registerDropSelfLootTable(ModBlocks.GNT_BLOCK_T4.get()); +// this.registerDropSelfLootTable(ModBlocks.TURRET_BLOCK.get()); +// this.registerDropSelfLootTable(ModBlocks.ZAPPER_TURRET_BLOCK.get()); +// this.registerDropSelfLootTable(ModBlocks.ANTI_GOO_BEACON.get()); +// this.registerDropSelfLootTable(ModBlocks.ANTI_GOO_FIELD_GEN.get()); +// this.registerDropSelfLootTable(ModBlocks.GOOLIMINATIONFIELDGEN.get()); +// this.registerDropSelfLootTable(ModBlocks.GOO_DETECTOR.get()); +// this.registerDropping(ModBlocks.GOO_RENDER.get(), ItemStack.EMPTY.getItem()); +// // this.registerDropping(ModBlocks.GOO_RENDER_BURST.get(), +// // ItemStack.EMPTY.getItem()); +// this.registerDropping(ModBlocks.GOO_RENDER_TERRAIN.get(), ItemStack.EMPTY.getItem()); + + } + + private void registerNoDropLootTable(Block block) + { + LootPool.Builder builder = LootPool.builder().name(block.getRegistryName().toString()); + this.registerLootTable(block, LootTable.builder().addLootPool(builder)); + } + + @Override + protected Iterable getKnownBlocks() + { + return ForgeRegistries.BLOCKS.getValues().stream().filter(b -> b.getRegistryName().getNamespace().equals(BloodMagic.MODID)).collect(Collectors.toList()); + } + } + + @Override + protected void validate(Map map, ValidationTracker validationtracker) + { + map.forEach((name, table) -> LootTableManager.validateLootTable(validationtracker, name, table)); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/BaseRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BaseRecipeProvider.java new file mode 100644 index 00000000..e8e9ead3 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BaseRecipeProvider.java @@ -0,0 +1,44 @@ +package wayoftime.bloodmagic.common.data.recipe; + +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.data.RecipeProvider; +import wayoftime.bloodmagic.common.recipe.ISubRecipeProvider; + +public abstract class BaseRecipeProvider extends RecipeProvider +{ + private final String modid; + + public BaseRecipeProvider(DataGenerator gen, String modid) + { + super(gen); + this.modid = modid; + } + + @Override + public String getName() + { + return super.getName() + modid; + } + + @Override + protected void registerRecipes(Consumer consumer) + { + getSubRecipeProviders().forEach(subRecipeProvider -> subRecipeProvider.addRecipes(consumer)); + } + + /** + * Gets all the sub/offloaded recipe providers that this recipe provider has. + * + * @implNote This is only called once per provider so there is no need to bother + * caching the list that this returns + */ + protected List getSubRecipeProviders() + { + return Collections.emptyList(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeBuilder.java new file mode 100644 index 00000000..21098bdf --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeBuilder.java @@ -0,0 +1,145 @@ +package wayoftime.bloodmagic.common.data.recipe; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.ICriterionInstance; +import net.minecraft.advancements.IRequirementsStrategy; +import net.minecraft.advancements.criterion.RecipeUnlockedTrigger; +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.util.Constants; + +public abstract class BloodMagicRecipeBuilder> +{ + + protected static ResourceLocation bmSerializer(String name) + { + return new ResourceLocation(BloodMagic.MODID, name); + } + + protected final List conditions = new ArrayList<>(); + protected final Advancement.Builder advancementBuilder = Advancement.Builder.builder(); + protected final ResourceLocation serializerName; + + protected BloodMagicRecipeBuilder(ResourceLocation serializerName) + { + this.serializerName = serializerName; + } + + public BUILDER addCriterion(RecipeCriterion criterion) + { + return addCriterion(criterion.name, criterion.criterion); + } + + public BUILDER addCriterion(String name, ICriterionInstance criterion) + { + advancementBuilder.withCriterion(name, criterion); + return (BUILDER) this; + } + + public BUILDER addCondition(ICondition condition) + { + conditions.add(condition); + return (BUILDER) this; + } + + protected boolean hasCriteria() + { + return !advancementBuilder.getCriteria().isEmpty(); + } + + protected abstract RecipeResult getResult(ResourceLocation id); + + protected void validate(ResourceLocation id) + { + } + + public void build(Consumer consumer, ResourceLocation id) + { + validate(id); + if (hasCriteria()) + { + // If there is a way to "unlock" this recipe then add an advancement with the + // criteria + advancementBuilder.withParentId(new ResourceLocation("recipes/root")).withCriterion("has_the_recipe", RecipeUnlockedTrigger.create(id)).withRewards(AdvancementRewards.Builder.recipe(id)).withRequirementsStrategy(IRequirementsStrategy.OR); + } + consumer.accept(getResult(id)); + } + + protected abstract class RecipeResult implements IFinishedRecipe + { + + private final ResourceLocation id; + + public RecipeResult(ResourceLocation id) + { + this.id = id; + } + + @Override + public JsonObject getRecipeJson() + { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty(Constants.JSON.TYPE, serializerName.toString()); + if (!conditions.isEmpty()) + { + JsonArray conditionsArray = new JsonArray(); + for (ICondition condition : conditions) + { + conditionsArray.add(CraftingHelper.serialize(condition)); + } + jsonObject.add(Constants.JSON.CONDITIONS, conditionsArray); + } + this.serialize(jsonObject); + return jsonObject; + } + + @Nonnull + @Override + public IRecipeSerializer getSerializer() + { + // Note: This may be null if something is screwed up but this method isn't + // actually used so it shouldn't matter + // and in fact it will probably be null if only the API is included. But again, + // as we manually just use + // the serializer's name this should not effect us + return ForgeRegistries.RECIPE_SERIALIZERS.getValue(serializerName); + } + + @Nonnull + @Override + public ResourceLocation getID() + { + return this.id; + } + + @Nullable + @Override + public JsonObject getAdvancementJson() + { + return hasCriteria() ? advancementBuilder.serialize() : null; + } + + @Nullable + @Override + public ResourceLocation getAdvancementID() + { + return new ResourceLocation(id.getNamespace(), "recipes/" + id.getPath()); + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java new file mode 100644 index 00000000..9bbf2eed --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/BloodMagicRecipeProvider.java @@ -0,0 +1,25 @@ +package wayoftime.bloodmagic.common.data.recipe; + +import java.util.Arrays; +import java.util.List; + +import net.minecraft.data.DataGenerator; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.recipe.AlchemyArrayRecipeProvider; +import wayoftime.bloodmagic.common.recipe.BloodAltarRecipeProvider; +import wayoftime.bloodmagic.common.recipe.ISubRecipeProvider; +import wayoftime.bloodmagic.common.recipe.TartaricForgeRecipeProvider; + +public class BloodMagicRecipeProvider extends BaseRecipeProvider +{ + public BloodMagicRecipeProvider(DataGenerator gen) + { + super(gen, BloodMagic.MODID); + } + + @Override + protected List getSubRecipeProviders() + { + return Arrays.asList(new BloodAltarRecipeProvider(), new AlchemyArrayRecipeProvider(), new TartaricForgeRecipeProvider()); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/RecipeCriterion.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/RecipeCriterion.java new file mode 100644 index 00000000..4418c70a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/RecipeCriterion.java @@ -0,0 +1,20 @@ +package wayoftime.bloodmagic.common.data.recipe; + +import net.minecraft.advancements.ICriterionInstance; + +public class RecipeCriterion +{ + public final String name; + public final ICriterionInstance criterion; + + private RecipeCriterion(String name, ICriterionInstance criterion) + { + this.name = name; + this.criterion = criterion; + } + + public static RecipeCriterion of(String name, ICriterionInstance criterion) + { + return new RecipeCriterion(name, criterion); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java new file mode 100644 index 00000000..dd6fcdcf --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java @@ -0,0 +1,58 @@ +package wayoftime.bloodmagic.common.data.recipe.builder; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder; +import wayoftime.bloodmagic.util.Constants; + +public class AlchemyArrayRecipeBuilder extends BloodMagicRecipeBuilder +{ + private final ResourceLocation texture; + private final Ingredient baseInput; + private final Ingredient addedInput; + private final ItemStack output; + + protected AlchemyArrayRecipeBuilder(ResourceLocation texture, Ingredient baseInput, Ingredient addedInput, ItemStack output) + { + super(bmSerializer("array")); + this.texture = texture; + this.baseInput = baseInput; + this.addedInput = addedInput; + this.output = output; + } + + public static AlchemyArrayRecipeBuilder array(ResourceLocation texture, Ingredient baseInput, Ingredient addedInput, ItemStack output) + { + return new AlchemyArrayRecipeBuilder(texture, baseInput, addedInput, output); + } + + @Override + protected AlchemyArrayRecipeResult getResult(ResourceLocation id) + { + return new AlchemyArrayRecipeResult(id); + } + + public class AlchemyArrayRecipeResult extends RecipeResult + { + protected AlchemyArrayRecipeResult(ResourceLocation id) + { + super(id); + } + + @Override + public void serialize(@Nonnull JsonObject json) + { + json.addProperty(Constants.JSON.TEXTURE, texture.toString()); +// JSONUtils.getString(json, ); + json.add(Constants.JSON.BASEINPUT, baseInput.serialize()); + json.add(Constants.JSON.ADDEDINPUT, addedInput.serialize()); + json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output)); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java new file mode 100644 index 00000000..1b6ef6eb --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java @@ -0,0 +1,63 @@ +package wayoftime.bloodmagic.common.data.recipe.builder; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder; +import wayoftime.bloodmagic.util.Constants; + +public class BloodAltarRecipeBuilder extends BloodMagicRecipeBuilder +{ + private final Ingredient input; + private final ItemStack output; + private final int minimumTier; + private final int syphon; + private final int consumeRate; + private final int drainRate; + + protected BloodAltarRecipeBuilder(Ingredient input, ItemStack output, int minimumTier, int syphon, int consumeRate, int drainRate) + { + super(bmSerializer("altar")); + this.input = input; + this.output = output; + this.minimumTier = minimumTier; + this.syphon = syphon; + this.consumeRate = consumeRate; + this.drainRate = drainRate; + } + + public static BloodAltarRecipeBuilder altar(Ingredient input, ItemStack output, int minimumTier, int syphon, int consumeRate, int drainRate) + { + return new BloodAltarRecipeBuilder(input, output, minimumTier, syphon, consumeRate, drainRate); + } + + @Override + protected BloodAltarRecipeResult getResult(ResourceLocation id) + { + return new BloodAltarRecipeResult(id); + } + + public class BloodAltarRecipeResult extends RecipeResult + { + protected BloodAltarRecipeResult(ResourceLocation id) + { + super(id); + } + + @Override + public void serialize(@Nonnull JsonObject json) + { + json.add(Constants.JSON.INPUT, input.serialize()); + json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output)); + json.addProperty(Constants.JSON.ALTAR_TIER, minimumTier); + json.addProperty(Constants.JSON.ALTAR_SYPHON, syphon); + json.addProperty(Constants.JSON.ALTAR_CONSUMPTION_RATE, consumeRate); + json.addProperty(Constants.JSON.ALTAR_DRAIN_RATE, drainRate); + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java new file mode 100644 index 00000000..25c88c51 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java @@ -0,0 +1,75 @@ +package wayoftime.bloodmagic.common.data.recipe.builder; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder; +import wayoftime.bloodmagic.util.Constants; + +public class TartaricForgeRecipeBuilder extends BloodMagicRecipeBuilder +{ + private final List input; + private final ItemStack output; + private final double minimumSouls; + private final double soulDrain; + + protected TartaricForgeRecipeBuilder(List input, ItemStack output, double minimumSouls, double soulDrain) + { + super(bmSerializer("soulforge")); + this.input = input; + this.output = output; + this.minimumSouls = minimumSouls; + this.soulDrain = soulDrain; + } + + public static TartaricForgeRecipeBuilder tartaricForge(List input, ItemStack output, double minimumSouls, double soulDrain) + { + return new TartaricForgeRecipeBuilder(input, output, minimumSouls, soulDrain); + } + + public static TartaricForgeRecipeBuilder tartaricForge(ItemStack output, double minimumSouls, double soulDrain, Ingredient... inputArray) + { + List inputList = new ArrayList(); + for (int i = 0; i < inputArray.length; i++) + { + inputList.add(inputArray[i]); + } + return new TartaricForgeRecipeBuilder(inputList, output, minimumSouls, soulDrain); + } + + @Override + protected TartaricForgeRecipeResult getResult(ResourceLocation id) + { + return new TartaricForgeRecipeResult(id); + } + + public class TartaricForgeRecipeResult extends RecipeResult + { + protected TartaricForgeRecipeResult(ResourceLocation id) + { + super(id); + } + + @Override + public void serialize(@Nonnull JsonObject json) + { + for (int i = 0; i < Math.min(input.size(), 4); i++) + { + json.add(Constants.JSON.INPUT + i, input.get(i).serialize()); + } + + json.add(Constants.JSON.OUTPUT, SerializerHelper.serializeItemStack(output)); + json.addProperty(Constants.JSON.TARTARIC_MINIMUM, (float) minimumSouls); + json.addProperty(Constants.JSON.TARTARIC_DRAIN, (float) soulDrain); + + } + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java new file mode 100644 index 00000000..69855511 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java @@ -0,0 +1,113 @@ +package wayoftime.bloodmagic.common.item; + +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilAir; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilBloodLight; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilDivination; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilFastMiner; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilFrost; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilGreenGrove; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilLava; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilMagnetism; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilVoid; +import wayoftime.bloodmagic.common.item.sigil.ItemSigilWater; +import wayoftime.bloodmagic.common.item.soul.ItemMonsterSoul; +import wayoftime.bloodmagic.common.item.soul.ItemSentientSword; +import wayoftime.bloodmagic.common.item.soul.ItemSoulGem; +import wayoftime.bloodmagic.common.item.soul.ItemSoulSnare; +import wayoftime.bloodmagic.common.registration.impl.BloodOrbDeferredRegister; +import wayoftime.bloodmagic.common.registration.impl.BloodOrbRegistryObject; +import wayoftime.bloodmagic.orb.BloodOrb; +import wayoftime.bloodmagic.will.EnumDemonWillType; + +public class BloodMagicItems +{ +// public static Item.ToolMaterial SOUL_TOOL_MATERIAL = EnumHelper.addToolMaterial("demonic", 4, 520, 7, 8, 50); +// public static final BloodOrb WEAK_ORB_INSTANCE = new BloodOrb(new ResourceLocation(BloodMagic.MODID, "weakbloodorb"), 0, 5000, 10); + public static final BloodOrbDeferredRegister BLOOD_ORBS = new BloodOrbDeferredRegister(BloodMagic.MODID); + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BloodMagic.MODID); + public static final DeferredRegister BASICITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, BloodMagic.MODID); + + public static final BloodOrbRegistryObject ORB_WEAK = BLOOD_ORBS.register("weakbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "weakbloodorb"), 1, 5000, 2)); + public static final BloodOrbRegistryObject ORB_APPRENTICE = BLOOD_ORBS.register("apprenticebloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "apprenticebloodorb"), 2, 25000, 5)); + public static final BloodOrbRegistryObject ORB_MAGICIAN = BLOOD_ORBS.register("magicianbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "magicianbloodorb"), 3, 150000, 15)); + public static final BloodOrbRegistryObject ORB_MASTER = BLOOD_ORBS.register("masterbloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "masterbloodorb"), 4, 1000000, 25)); + public static final BloodOrbRegistryObject ORB_ARCHMAGE = BLOOD_ORBS.register("archmagebloodorb", () -> new BloodOrb(new ResourceLocation(BloodMagic.MODID, "archmagebloodorb"), 5, 10000000, 50)); +// public static final DeferredRegister BLOOD_ORBS = DeferredRegister.create(RegistrarBloodMagic.BLOOD_ORBS, BloodMagic.MODID); + +// public static final RegistryObject BLOODSTONE_ITEM = ITEMS.register("ruby_block", () -> new BlockItem(BloodMagicBlocks.BLOODSTONE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject SOUL_FORGE_ITEM = ITEMS.register("soulforge", () -> new BlockItem(BloodMagicBlocks.SOUL_FORGE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject BLANK_RUNE_ITEM = ITEMS.register("blankrune", () -> new BlockItem(BloodMagicBlocks.BLANK_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject SPEED_RUNE_ITEM = ITEMS.register("speedrune", () -> new BlockItem(BloodMagicBlocks.SPEED_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject SACRIFICE_RUNE_ITEM = ITEMS.register("sacrificerune", () -> new BlockItem(BloodMagicBlocks.SACRIFICE_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject SELF_SACRIFICE_RUNE_ITEM = ITEMS.register("selfsacrificerune", () -> new BlockItem(BloodMagicBlocks.SELF_SACRIFICE_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject DISPLACEMENT_RUNE_ITEM = ITEMS.register("dislocationrune", () -> new BlockItem(BloodMagicBlocks.DISPLACEMENT_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject CAPACITY_RUNE_ITEM = ITEMS.register("altarcapacityrune", () -> new BlockItem(BloodMagicBlocks.CAPACITY_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject AUGMENTED_CAPACITY_RUNE_ITEM = ITEMS.register("bettercapacityrune", () -> new BlockItem(BloodMagicBlocks.AUGMENTED_CAPACITY_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject ORB_RUNE_ITEM = ITEMS.register("orbcapacityrune", () -> new BlockItem(BloodMagicBlocks.ORB_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject ACCELERATION_RUNE_ITEM = ITEMS.register("accelerationrune", () -> new BlockItem(BloodMagicBlocks.ACCELERATION_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + public static final RegistryObject CHARGING_RUNE_ITEM = ITEMS.register("chargingrune", () -> new BlockItem(BloodMagicBlocks.CHARGING_RUNE.get(), new Item.Properties().group(BloodMagic.TAB))); + + public static final RegistryObject BLOOD_ALTAR_ITEM = ITEMS.register("altar", () -> new BlockItem(BloodMagicBlocks.BLOOD_ALTAR.get(), new Item.Properties().group(BloodMagic.TAB))); + + // TODO: Need to rework the above instantiations for the ItemBlocks so that it's + // done with the Blocks. + +// public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", ItemBloodOrb::new); +// public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", () -> new ItemBloodOrb(WEAK_ORB_INSTANCE)); + public static final RegistryObject WEAK_BLOOD_ORB = BASICITEMS.register("weakbloodorb", () -> new ItemBloodOrb(ORB_WEAK)); + public static final RegistryObject APPRENTICE_BLOOD_ORB = BASICITEMS.register("apprenticebloodorb", () -> new ItemBloodOrb(ORB_APPRENTICE)); + public static final RegistryObject MAGICIAN_BLOOD_ORB = BASICITEMS.register("magicianbloodorb", () -> new ItemBloodOrb(ORB_MAGICIAN)); + public static final RegistryObject MASTER_BLOOD_ORB = BASICITEMS.register("masterbloodorb", () -> new ItemBloodOrb(ORB_MASTER)); + + public static final RegistryObject DIVINATION_SIGIL = BASICITEMS.register("divinationsigil", () -> new ItemSigilDivination(true)); + public static final RegistryObject SACRIFICIAL_DAGGER = BASICITEMS.register("sacrificialdagger", () -> new ItemSacrificialDagger()); + public static final RegistryObject SLATE = BASICITEMS.register("blankslate", () -> new ItemBase()); + public static final RegistryObject REINFORCED_SLATE = BASICITEMS.register("reinforcedslate", () -> new ItemBase()); + public static final RegistryObject IMBUED_SLATE = BASICITEMS.register("infusedslate", () -> new ItemBase()); + public static final RegistryObject DEMONIC_SLATE = BASICITEMS.register("demonslate", () -> new ItemBase()); + public static final RegistryObject ETHEREAL_SLATE = BASICITEMS.register("etherealslate", () -> new ItemBase()); + public static final RegistryObject WATER_SIGIL = BASICITEMS.register("watersigil", () -> new ItemSigilWater()); + public static final RegistryObject VOID_SIGIL = BASICITEMS.register("voidsigil", () -> new ItemSigilVoid()); + public static final RegistryObject LAVA_SIGIL = BASICITEMS.register("lavasigil", () -> new ItemSigilLava()); + public static final RegistryObject GREEN_GROVE_SIGIL = ITEMS.register("growthsigil", () -> new ItemSigilGreenGrove()); + public static final RegistryObject FAST_MINER_SIGIL = ITEMS.register("miningsigil", () -> new ItemSigilFastMiner()); + public static final RegistryObject MAGNETISM_SIGIL = ITEMS.register("sigilofmagnetism", () -> new ItemSigilMagnetism()); + public static final RegistryObject ICE_SIGIL = ITEMS.register("icesigil", () -> new ItemSigilFrost()); + public static final RegistryObject AIR_SIGIL = BASICITEMS.register("airsigil", ItemSigilAir::new); + public static final RegistryObject BLOOD_LIGHT_SIGIL = BASICITEMS.register("bloodlightsigil", ItemSigilBloodLight::new); + + public static final RegistryObject ARCANE_ASHES = BASICITEMS.register("arcaneashes", () -> new ItemArcaneAshes()); + public static final RegistryObject DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice()); + + // Reagents used to make the Sigils + public static final RegistryObject REAGENT_WATER = BASICITEMS.register("reagentwater", () -> new ItemBase()); + public static final RegistryObject REAGENT_LAVA = BASICITEMS.register("reagentlava", () -> new ItemBase()); + public static final RegistryObject REAGENT_VOID = BASICITEMS.register("reagentvoid", () -> new ItemBase()); + public static final RegistryObject REAGENT_GROWTH = BASICITEMS.register("reagentgrowth", () -> new ItemBase()); + public static final RegistryObject REAGENT_FAST_MINER = BASICITEMS.register("reagentfastminer", () -> new ItemBase()); + public static final RegistryObject REAGENT_MAGNETISM = BASICITEMS.register("reagentmagnetism", () -> new ItemBase()); + public static final RegistryObject REAGENT_AIR = BASICITEMS.register("reagentair", () -> new ItemBase()); + public static final RegistryObject REAGENT_BLOOD_LIGHT = BASICITEMS.register("reagentbloodlight", () -> new ItemBase()); + + // Tartaric Gems + public static final RegistryObject PETTY_GEM = ITEMS.register("soulgempetty", () -> new ItemSoulGem("petty", 64)); + public static final RegistryObject LESSER_GEM = ITEMS.register("soulgemlesser", () -> new ItemSoulGem("lesser", 256)); + public static final RegistryObject COMMON_GEM = ITEMS.register("soulgemcommon", () -> new ItemSoulGem("common", 1024)); + + public static final RegistryObject MONSTER_SOUL_RAW = BASICITEMS.register("basemonstersoul", () -> new ItemMonsterSoul(EnumDemonWillType.DEFAULT)); + public static final RegistryObject MONSTER_SOUL_CORROSIVE = BASICITEMS.register("basemonstersoul_corrosive", () -> new ItemMonsterSoul(EnumDemonWillType.CORROSIVE)); + public static final RegistryObject MONSTER_SOUL_DESTRUCTIVE = BASICITEMS.register("basemonstersoul_destructive", () -> new ItemMonsterSoul(EnumDemonWillType.DESTRUCTIVE)); + public static final RegistryObject MONSTER_SOUL_STEADFAST = BASICITEMS.register("basemonstersoul_steadfast", () -> new ItemMonsterSoul(EnumDemonWillType.STEADFAST)); + public static final RegistryObject MONSTER_SOUL_VENGEFUL = BASICITEMS.register("basemonstersoul_vengeful", () -> new ItemMonsterSoul(EnumDemonWillType.VENGEFUL)); + + public static final RegistryObject SOUL_SNARE = BASICITEMS.register("soulsnare", ItemSoulSnare::new); + public static final RegistryObject SENTIENT_SWORD = ITEMS.register("soulsword", () -> new ItemSentientSword()); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemArcaneAshes.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemArcaneAshes.java new file mode 100644 index 00000000..dd4cde28 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemArcaneAshes.java @@ -0,0 +1,98 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.tile.TileAlchemyArray; + +public class ItemArcaneAshes extends Item +{ + public ItemArcaneAshes() + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB).maxDamage(20)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.arcaneAshes")); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) + { + ItemStack stack = context.getItem(); + BlockPos newPos = context.getPos().offset(context.getFace()); + World world = context.getWorld(); + PlayerEntity player = context.getPlayer(); + + if (world.isAirBlock(newPos)) + { + if (!world.isRemote) + { + Direction rotation = Direction.fromAngle(player.getRotationYawHead()); + world.setBlockState(newPos, BloodMagicBlocks.ALCHEMY_ARRAY.get().getDefaultState()); + TileEntity tile = world.getTileEntity(newPos); + if (tile instanceof TileAlchemyArray) + { + ((TileAlchemyArray) tile).setRotation(rotation); + } + +// PickaxeItem d; + stack.damageItem(1, player, (entity) -> { + entity.sendBreakAnimation(EquipmentSlotType.MAINHAND); + }); + + } + + return ActionResultType.SUCCESS; + } + + return ActionResultType.FAIL; + } + +// @Override +// public ActionResultType onItemUse(PlayerEntity player, World world, BlockPos blockPos, Hand hand, Direction side, float hitX, float hitY, float hitZ) +// { +// ItemStack stack = player.getHeldItem(hand); +// BlockPos newPos = blockPos.offset(side); +// +// if (world.isAirBlock(newPos)) +// { +// if (!world.isRemote) +// { +// Direction rotation = Direction.fromAngle(player.getRotationYawHead()); +// world.setBlockState(newPos, RegistrarBloodMagicBlocks.ALCHEMY_ARRAY.getDefaultState()); +// TileEntity tile = world.getTileEntity(newPos); +// if (tile instanceof TileAlchemyArray) +// { +// ((TileAlchemyArray) tile).setRotation(rotation); +// } +// +// stack.damageItem(1, player); +// } +// +// return ActionResultType.SUCCESS; +// } +// +// return ActionResultType.FAIL; +// } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemBase.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemBase.java new file mode 100644 index 00000000..d6aecf25 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemBase.java @@ -0,0 +1,38 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; + +public class ItemBase extends Item +{ + private final String desc; + + public ItemBase() + { + this(""); + } + + public ItemBase(String desc) + { + super(new Item.Properties().maxStackSize(64).group(BloodMagic.TAB)); + this.desc = desc; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!desc.isEmpty()) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic." + desc)); + + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java new file mode 100644 index 00000000..0b37cf63 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java @@ -0,0 +1,35 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.iface.IBindable; + +public class ItemBindableBase extends Item implements IBindable +{ + public ItemBindableBase() + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + + Binding binding = getBinding(stack); + if (binding != null) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java new file mode 100644 index 00000000..080417c2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java @@ -0,0 +1,106 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.extensions.IForgeItem; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.orb.BloodOrb; +import wayoftime.bloodmagic.orb.IBloodOrb; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemBloodOrb extends ItemBindableBase implements IBloodOrb, IForgeItem +{ + private final Supplier sup; + + public ItemBloodOrb(Supplier sup) + { + this.sup = sup; + } + + @Override + public BloodOrb getOrb(ItemStack stack) + { + return sup.get(); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + BloodOrb orb = getOrb(stack); + + if (orb == null) + return ActionResult.resultFail(stack); + + if (world == null) + return super.onItemRightClick(world, player, hand); + + world.playSound(null, player.getPosX(), player.getPosY(), player.getPosZ(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + if (PlayerHelper.isFakePlayer(player)) + return super.onItemRightClick(world, player, hand); + + if (!stack.hasTag()) + return super.onItemRightClick(world, player, hand); + + Binding binding = getBinding(stack); + if (binding == null) + return super.onItemRightClick(world, player, hand); + + if (world.isRemote) + return super.onItemRightClick(world, player, hand); + + SoulNetwork ownerNetwork = NetworkHelper.getSoulNetwork(binding); + if (binding.getOwnerId().equals(player.getGameProfile().getId())) + ownerNetwork.setOrbTier(orb.getTier()); + + ownerNetwork.add(SoulTicket.item(stack, world, player, 200), orb.getCapacity()); // Add LP to owner's network + ownerNetwork.hurtPlayer(player, 200); // Hurt whoever is using it + return super.onItemRightClick(world, player, hand); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.orb.desc")); + + BloodOrb orb = getOrb(stack); + if (flag.isAdvanced() && orb != null) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.orb.owner", stack.getItem().getRegistryName())); + + super.addInformation(stack, world, tooltip, flag); + } + +// + @Override + public ItemStack getContainerItem(ItemStack stack) + { + return stack.copy(); + } + + @Override + public boolean hasContainerItem(ItemStack stack) + { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemDaggerOfSacrifice.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemDaggerOfSacrifice.java new file mode 100644 index 00000000..f1ba5d85 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemDaggerOfSacrifice.java @@ -0,0 +1,75 @@ +package wayoftime.bloodmagic.common.item; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraftforge.common.util.FakePlayer; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.util.DamageSourceBloodMagic; +import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper; + +public class ItemDaggerOfSacrifice extends Item +{ + public ItemDaggerOfSacrifice() + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + } + + @Override + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) + { + if (attacker instanceof FakePlayer) + return false; + + if (target == null || attacker == null || attacker.getEntityWorld().isRemote + || (attacker instanceof PlayerEntity && !(attacker instanceof ServerPlayerEntity))) + return false; + + if (!target.isNonBoss()) + return false; + + if (target instanceof PlayerEntity) + return false; + + if (target.isChild() && !(target instanceof IMob)) + return false; + + if (!target.isAlive() || target.getHealth() < 0.5F) + return false; + +// EntityEntry entityEntry = EntityRegistry.getEntry(target.getClass()); +// if (entityEntry == null) +// return false; +// int lifeEssenceRatio = BloodMagicAPI.INSTANCE.getValueManager().getSacrificial().getOrDefault(entityEntry.getRegistryName(), 25); + int lifeEssenceRatio = 25; + + if (lifeEssenceRatio <= 0) + return false; + + int lifeEssence = (int) (lifeEssenceRatio * target.getHealth()); +// if (target instanceof AnimalEntity) +// { +// lifeEssence = (int) (lifeEssence * (1 + PurificationHelper.getCurrentPurity((AnimalEntity) target))); +// } + + if (target.isChild()) + { + lifeEssence *= 0.5F; + } + + if (PlayerSacrificeHelper.findAndFillAltar(attacker.getEntityWorld(), target, lifeEssence, true)) + { + target.getEntityWorld().playSound(null, target.getPosX(), target.getPosY(), target.getPosZ(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + + (target.getEntityWorld().rand.nextFloat() - target.getEntityWorld().rand.nextFloat()) * 0.8F); + target.setHealth(-1); + target.onDeath(DamageSourceBloodMagic.INSTANCE); + } + + return false; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java new file mode 100644 index 00000000..5f807d6e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemSacrificialDagger.java @@ -0,0 +1,204 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.UseAction; +import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.ConfigHandler; +import wayoftime.bloodmagic.event.SacrificeKnifeUsedEvent; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.DamageSourceBloodMagic; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; +import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper; + +public class ItemSacrificialDagger extends Item +{ + + public ItemSacrificialDagger() + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { +// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.desc")))); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sacrificialdagger.desc")); + +// if (stack.getItemDamage() == 1) +// list.add(TextHelper.localizeEffect("tooltip.bloodmagic.sacrificialDagger.creative")); + } + + @Override + public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) + { + if (entityLiving instanceof PlayerEntity && !entityLiving.getEntityWorld().isRemote) + PlayerSacrificeHelper.sacrificePlayerHealth((PlayerEntity) entityLiving); + } + + @Override + public int getUseDuration(ItemStack stack) + { + return 72000; + } + + @Override + public UseAction getUseAction(ItemStack stack) + { + return UseAction.BOW; + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (PlayerHelper.isFakePlayer(player)) + return super.onItemRightClick(world, player, hand); + + if (this.canUseForSacrifice(stack)) + { + player.setActiveHand(hand); + return ActionResult.resultSuccess(stack); + } + + int lpAdded = ConfigHandler.values.sacrificialDaggerConversion * 2; + +// RayTraceResult rayTrace = rayTrace(world, player, false); +// if (rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) +// { +// TileEntity tile = world.getTileEntity(rayTrace.getBlockPos()); +// +// if (tile != null && tile instanceof TileAltar && stack.getItemDamage() == 1) +// lpAdded = ((TileAltar) tile).getCapacity(); +// } + + if (!player.abilities.isCreativeMode) + { + SacrificeKnifeUsedEvent evt = new SacrificeKnifeUsedEvent(player, true, true, 2, lpAdded); + if (MinecraftForge.EVENT_BUS.post(evt)) + return super.onItemRightClick(world, player, hand); + + if (evt.shouldDrainHealth) + { + player.hurtResistantTime = 0; + player.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 0.001F); + player.setHealth(Math.max(player.getHealth() - 1.998F, 0.0001f)); + if (player.getHealth() <= 0.001f) + { + player.onDeath(DamageSourceBloodMagic.INSTANCE); + player.setHealth(0); + } +// player.attackEntityFrom(BloodMagicAPI.getDamageSource(), 2.0F); + } + + if (!evt.shouldFillAltar) + return super.onItemRightClick(world, player, hand); + + lpAdded = evt.lpAdded; + } + + double posX = player.getPosX(); + double posY = player.getPosY(); + double posZ = player.getPosZ(); + world.playSound(null, posX, posY, posZ, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + + for (int l = 0; l < 8; ++l) world.addParticle(RedstoneParticleData.REDSTONE_DUST, posX + Math.random() + - Math.random(), posY + Math.random() - Math.random(), posZ + Math.random() - Math.random(), 0, 0, 0); + + if (!world.isRemote && PlayerHelper.isFakePlayer(player)) + return super.onItemRightClick(world, player, hand); + + // TODO - Check if SoulFray is active + PlayerSacrificeHelper.findAndFillAltar(world, player, lpAdded, false); + + return super.onItemRightClick(world, player, hand); + } + + @Override + public void inventoryTick(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) + { + if (!world.isRemote && entity instanceof PlayerEntity) + this.setUseForSacrifice(stack, this.isPlayerPreparedForSacrifice(world, (PlayerEntity) entity)); + } + + public boolean isPlayerPreparedForSacrifice(World world, PlayerEntity player) + { + return !world.isRemote && (PlayerSacrificeHelper.getPlayerIncense(player) > 0); + } + + public boolean canUseForSacrifice(ItemStack stack) + { + stack = NBTHelper.checkNBT(stack); + return stack.getTag().getBoolean(Constants.NBT.SACRIFICE); + } + + public void setUseForSacrifice(ItemStack stack, boolean sacrifice) + { + stack = NBTHelper.checkNBT(stack); + stack.getTag().putBoolean(Constants.NBT.SACRIFICE, sacrifice); + } + +// @Override +// @SideOnly(Side.CLIENT) +// public ItemMeshDefinition getMeshDefinition() +// { +// return stack -> { +// String variant = "type=normal"; +// if (stack.getItemDamage() != 0) +// variant = "type=creative"; +// +// if (canUseForSacrifice(stack)) +// variant = "type=ceremonial"; +// +// return new ModelResourceLocation(getRegistryName(), variant); +// }; +// } +// +// @Override +// public void gatherVariants(Consumer variants) +// { +// variants.accept("type=normal"); +// variants.accept("type=creative"); +// variants.accept("type=ceremonial"); +// } +// +// public enum DaggerType implements ISubItem +// { +// +// NORMAL, CREATIVE,; +// +// @Nonnull +// @Override +// public String getInternalName() +// { +// return name().toLowerCase(Locale.ROOT); +// } +// +// @Nonnull +// @Override +// public ItemStack getStack(int count) +// { +// return new ItemStack(RegistrarBloodMagicItems.SACRIFICIAL_DAGGER, count, ordinal()); +// } +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java new file mode 100644 index 00000000..89dfef5d --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java @@ -0,0 +1,64 @@ +package wayoftime.bloodmagic.common.item; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.iface.IBindable; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; + +/** + * Base class for all (static) sigils. + */ +public class ItemSigil extends Item implements IBindable, ISigil +{ + private int lpUsed; + + public ItemSigil(Properties prop, int lpUsed) + { + super(prop); + + this.lpUsed = lpUsed; + } + + public boolean isUnusable(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + return stack.getTag().getBoolean(Constants.NBT.UNUSABLE); + } + + public ItemStack setUnusable(ItemStack stack, boolean unusable) + { + NBTHelper.checkNBT(stack); + + stack.getTag().putBoolean(Constants.NBT.UNUSABLE, unusable); + return stack; + } + + public int getLpUsed() + { + return lpUsed; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + + Binding binding = getBinding(stack); + if (binding != null) + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentOwner", binding.getOwnerName())); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java new file mode 100644 index 00000000..b7f12ffd --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java @@ -0,0 +1,62 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilAir extends ItemSigilBase +{ + public ItemSigilAir() + { + super("air", 50); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + boolean unusable = isUnusable(stack); + if (world.isRemote && !unusable) + { + Vector3d vec = player.getLookVec(); + double wantedVelocity = 1.7; + + // TODO - Revisit after potions +// if (player.isPotionActive(RegistrarBloodMagic.BOOST)) +// { +// int amplifier = player.getActivePotionEffect(RegistrarBloodMagic.BOOST).getAmplifier(); +// wantedVelocity += (1 + amplifier) * (0.35); +// } + + player.setMotion(vec.x * wantedVelocity, vec.y * wantedVelocity, vec.z * wantedVelocity); + + world.playSound(null, player.getPosX(), player.getPosY(), player.getPosZ(), SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + } + + if (!world.isRemote) + { + if (!player.isCreative()) + this.setUnusable(stack, !NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()); + + if (!unusable) + player.fallDistance = 0; + } + + return super.onItemRightClick(world, player, hand); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBase.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBase.java new file mode 100644 index 00000000..11c77760 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBase.java @@ -0,0 +1,51 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.item.ItemSigil; + +public class ItemSigilBase extends ItemSigil +{ + protected final String tooltipBase; +// private final String name; + + public ItemSigilBase(String name, int lpUsed) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB), lpUsed); +// super(lpUsed); + +// this.name = name; + this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; + } + + public ItemSigilBase(String name) + { + this(name, 0); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent(tooltipBase + "desc")); +// if (TextHelper.canTranslate(tooltipBase + "desc")) +// tooltip.addAll(Arrays.asList(WordUtils.wrap(TextHelper.localizeEffect(tooltipBase +// + "desc"), 30, "/cut", false).split("/cut"))); + + super.addInformation(stack, world, tooltip, flag); + } + +// public String getName() +// { +// return name; +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java new file mode 100644 index 00000000..f2332c44 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java @@ -0,0 +1,104 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.entity.projectile.EntityBloodLight; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilBloodLight extends ItemSigilBase +{ + public ItemSigilBloodLight() + { + super("bloodlight", 10); + } + + @Override + public void inventoryTick(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + { + if (getCooldownRemainder(stack) > 0) + reduceCooldown(stack); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + RayTraceResult mop = rayTrace(world, player, RayTraceContext.FluidMode.NONE); + + if (getCooldownRemainder(stack) > 0) + return super.onItemRightClick(world, player, hand); + + if (mop != null && mop.getType() == RayTraceResult.Type.BLOCK) + { + BlockRayTraceResult blockRayTrace = (BlockRayTraceResult) mop; + BlockPos blockPos = blockRayTrace.getPos().offset(blockRayTrace.getFace()); + + if (world.isAirBlock(blockPos)) + { + world.setBlockState(blockPos, BloodMagicBlocks.BLOOD_LIGHT.get().getDefaultState()); + if (!world.isRemote) + { + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); + network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); + } + resetCooldown(stack); + player.swingArm(hand); + return super.onItemRightClick(world, player, hand); + } + } else + { + if (!world.isRemote) + { + SoulNetwork network = NetworkHelper.getSoulNetwork(getBinding(stack)); + EntityBloodLight light = new EntityBloodLight(world, player); + light.func_234612_a_(player, player.rotationPitch, player.rotationYaw, 0.0F, 1.5F, 1.0F); + world.addEntity(light); + network.syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())); + } + resetCooldown(stack); + } + + return super.onItemRightClick(world, player, hand); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) + { + return oldStack.getItem() != newStack.getItem(); + } + + public int getCooldownRemainder(ItemStack stack) + { + return NBTHelper.checkNBT(stack).getTag().getInt(Constants.NBT.TICKS_REMAINING); + } + + public void reduceCooldown(ItemStack stack) + { + NBTHelper.checkNBT(stack).getTag().putInt(Constants.NBT.TICKS_REMAINING, getCooldownRemainder(stack) - 1); + } + + public void resetCooldown(ItemStack stack) + { + NBTHelper.checkNBT(stack).getTag().putInt(Constants.NBT.TICKS_REMAINING, 10); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java new file mode 100644 index 00000000..90e242a5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java @@ -0,0 +1,114 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import java.util.List; + +import com.google.common.collect.Lists; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import wayoftime.bloodmagic.altar.IBloodAltar; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.iface.IAltarReader; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.NumeralHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilDivination extends ItemSigilBase implements IAltarReader +{ + + public ItemSigilDivination(boolean simple) + { + super(simple ? "divination" : "seer"); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + if (!world.isRemote) + { + RayTraceResult position = Item.rayTrace(world, player, FluidMode.NONE); + + if (position == null || position.getType() == RayTraceResult.Type.MISS) + { + super.onItemRightClick(world, player, hand); + + Binding binding = getBinding(stack); + if (binding != null) + { + int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence(); + List toSend = Lists.newArrayList(); + if (!binding.getOwnerId().equals(player.getGameProfile().getId())) + toSend.add(new TranslationTextComponent(tooltipBase + "otherNetwork", binding.getOwnerName())); + toSend.add(new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence)); + ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); + } + } else + { + if (position.getType() == RayTraceResult.Type.BLOCK) + { + TileEntity tile = world.getTileEntity(new BlockPos(position.getHitVec())); + + if (tile != null && tile instanceof IBloodAltar) + { + IBloodAltar altar = (IBloodAltar) tile; + int tier = altar.getTier().ordinal() + 1; + int currentEssence = altar.getCurrentBlood(); + int capacity = altar.getCapacity(); + altar.checkTier(); + ChatUtil.sendNoSpam(player, new TranslationTextComponent(tooltipBase + + "currentAltarTier", NumeralHelper.toRoman(tier)), new TranslationTextComponent(tooltipBase + + "currentEssence", currentEssence), new TranslationTextComponent(tooltipBase + + "currentAltarCapacity", capacity)); + } +// else if (tile != null && tile instanceof TileIncenseAltar) +// { +// TileIncenseAltar altar = (TileIncenseAltar) tile; +// altar.recheckConstruction(); +// double tranquility = altar.tranquility; +// ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentTranquility", (int) ((100D * (int) (100 * tranquility)) / 100d)), new TextComponentTranslation(tooltipBase + "currentBonus", (int) (100 * altar.incenseAddition))); +// } else if (tile != null && tile instanceof TileInversionPillar) +// { +// TileInversionPillar pillar = (TileInversionPillar) tile; +// double inversion = pillar.getCurrentInversion(); +// ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentInversion", ((int) (10 * inversion)) / 10d)); +// } + else + { + Binding binding = getBinding(stack); + if (binding != null) + { + int currentEssence = NetworkHelper.getSoulNetwork(binding).getCurrentEssence(); + List toSend = Lists.newArrayList(); + if (!binding.getOwnerId().equals(player.getGameProfile().getId())) + toSend.add(new TranslationTextComponent(tooltipBase + + "otherNetwork", binding.getOwnerName())); + toSend.add(new TranslationTextComponent(tooltipBase + "currentEssence", currentEssence)); + ChatUtil.sendNoSpam(player, toSend.toArray(new ITextComponent[toSend.size()])); + } + } + } + } + + } + + return super.onItemRightClick(world, player, hand); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFastMiner.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFastMiner.java new file mode 100644 index 00000000..5caaab09 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFastMiner.java @@ -0,0 +1,61 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import java.util.List; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Effects; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import wayoftime.bloodmagic.util.DamageSourceBloodMagic; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilFastMiner extends ItemSigilToggleableBase +{ + public ItemSigilFastMiner() + { + super("fast_miner", 100); + } + + @Override + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) + { + if (PlayerHelper.isFakePlayer(player)) + return; + player.addPotionEffect(new EffectInstance(Effects.HASTE, 2, 0, true, false)); + } + + @Override + public boolean performArrayEffect(World world, BlockPos pos) + { + double radius = 10; + int ticks = 600; + int potionPotency = 2; + + AxisAlignedBB bb = new AxisAlignedBB(pos).grow(radius); + List playerList = world.getEntitiesWithinAABB(PlayerEntity.class, bb); + for (PlayerEntity player : playerList) + { + if (!player.isPotionActive(Effects.HASTE) || (player.isPotionActive(Effects.HASTE) + && player.getActivePotionEffect(Effects.HASTE).getAmplifier() < potionPotency)) + { + player.addPotionEffect(new EffectInstance(Effects.HASTE, ticks, potionPotency)); + if (!player.isCreative()) + { + player.hurtResistantTime = 0; + player.attackEntityFrom(DamageSourceBloodMagic.INSTANCE, 1.0F); + } + } + } + + return false; + } + + @Override + public boolean hasArrayEffect() + { + return true; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java new file mode 100644 index 00000000..53224f84 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFluidBase.java @@ -0,0 +1,152 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BucketItem; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fluids.capability.wrappers.BlockWrapper; + +public abstract class ItemSigilFluidBase extends ItemSigilBase +{ + // Class for sigils that interact with fluids, either creating or deleting them. + // Sigils still have to define their own onRightClick behavior, but the actual + // fluid-interacting code is largely limited to here. + public final FluidStack sigilFluid; + + public ItemSigilFluidBase(String name, int lpUsed, FluidStack fluid) + { + super(name, lpUsed); + sigilFluid = fluid; + } + + public ItemSigilFluidBase(String name, FluidStack fluid) + { + super(name); + sigilFluid = fluid; + } + + public ItemSigilFluidBase(String name) + { + super(name); + sigilFluid = null; + } + + // The following are handler functions for fluids, all genericized. + // They're all based off of the Forge FluidUtil methods, but directly taking the + // sigilFluid constant instead of getting an argument. + + /* + * Gets a fluid handler for the targeted block and siding. Works for both tile + * entity liquid containers and fluid blocks. This one is literally identical to + * the FluidUtil method of the same signature. + */ + @Nullable + protected IFluidHandler getFluidHandler(World world, BlockPos blockPos, @Nullable Direction side) + { + BlockState state = world.getBlockState(blockPos); + Block block = state.getBlock(); + BucketItem b; + System.out.println(block); + IFluidHandler targetFluidHandler = FluidUtil.getFluidHandler(world, blockPos, side).orElse(null); + System.out.println(targetFluidHandler); + + if (targetFluidHandler == null) + + { + + } + return targetFluidHandler; +// if (block instanceof IFluidBlock) +// return new FluidBlockWrapper((IFluidBlock) block, world, blockPos); +// else if (block instanceof BlockLiquid) +// return new BlockLiquidWrapper((BlockLiquid) block, world, blockPos); +// return null; + } + + /* + * Tries to insert fluid into a fluid handler. If doTransfer is false, only + * simulate the transfer. If true, actually do so. Returns true if the transfer + * is successful, false otherwise. + */ + protected boolean tryInsertSigilFluid(IFluidHandler destination, boolean doTransfer) + { + if (destination == null) + return false; + return destination.fill(sigilFluid, doTransfer ? FluidAction.EXECUTE : FluidAction.SIMULATE) > 0; + } + + /* + * Tries basically the oppostive of the above, removing fluids instead of adding + * them + */ + protected boolean tryRemoveFluid(IFluidHandler source, int amount, boolean doTransfer) + { + if (source == null) + return false; + return source.drain(amount, doTransfer ? FluidAction.EXECUTE : FluidAction.SIMULATE) != null; + } + + /* + * Tries to place a fluid block in the world. Returns true if successful, + * otherwise false. This is the big troublesome one, oddly enough. It's + * genericized in case anyone wants to create variant sigils with weird fluids. + */ + protected boolean tryPlaceSigilFluid(PlayerEntity player, World world, BlockPos blockPos) + { + BlockState state = sigilFluid.getFluid().getAttributes().getBlock(world, blockPos, sigilFluid.getFluid().getDefaultState()); + BlockWrapper wrapper = new BlockWrapper(state, world, blockPos); + return wrapper.fill(sigilFluid, FluidAction.EXECUTE) > 0; +// // Make sure world coordinants are valid +// if (world == null || blockPos == null) +// { +// return false; +// } +// // Make sure fluid is placeable +// Fluid fluid = sigilFluid.getFluid(); +// if (!fluid.getAttributes().canBePlacedInWorld(world, blockPos, sigilFluid)) +// { +// return false; +// } +// +// // Check if the block is an air block or otherwise replaceable +// BlockState state = world.getBlockState(blockPos); +// Material mat = state.getMaterial(); +// boolean isDestSolid = mat.isSolid(); +// boolean isDestReplaceable = state.getBlock().isReplaceable(state, fluid); +// if (!world.isAirBlock(blockPos) && isDestSolid && !isDestReplaceable) +// { +// return false; +// } +// +//// // If the fluid vaporizes, this exists here in the lava sigil solely so the code +//// // is usable for other fluids +//// if (world.provider.doesWaterVaporize() && fluid.doesVaporize(sigilFluid)) +//// { +//// fluid.vaporize(player, world, blockPos, sigilFluid); +//// return true; +//// } +// +// // Finally we've done enough checking to make sure everything at the end is +// // safe, let's place some fluid. +// IFluidHandler handler; +// Block block = fluid.getAttributes().getStateForPlacement(world, blockPos, sigilFluid).getBlockState().getBlock(); +// if (block instanceof IFluidBlock) +// { +// handler = new FluidBlockWrapper((IFluidBlock) block, world, blockPos); +// } else if (block instanceof BlockLiquid) +// handler = new BlockLiquidWrapper((BlockLiquid) block, world, blockPos); +// else +// handler = new BlockWrapper(block, world, blockPos); +// return tryInsertSigilFluid(handler, true); +//// return false; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFrost.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFrost.java new file mode 100644 index 00000000..622a25ed --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilFrost.java @@ -0,0 +1,24 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.enchantment.FrostWalkerEnchantment; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilFrost extends ItemSigilToggleableBase +{ + public ItemSigilFrost() + { + super("frost", 100); + } + + @Override + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) + { + if (PlayerHelper.isFakePlayer(player)) + return; + + FrostWalkerEnchantment.freezeNearby(player, world, player.getPosition(), 1); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilGreenGrove.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilGreenGrove.java new file mode 100644 index 00000000..820e0063 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilGreenGrove.java @@ -0,0 +1,114 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.block.BlockState; +import net.minecraft.block.IGrowable; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilGreenGrove extends ItemSigilToggleableBase +{ + public ItemSigilGreenGrove() + { + super("green_grove", 150); + } + + @Override + public boolean onSigilUse(ItemStack stack, PlayerEntity player, World world, BlockPos blockPos, Direction side, Vector3d vec) + { + if (PlayerHelper.isFakePlayer(player)) + return false; + + if (NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess() + && applyBonemeal(stack, world, blockPos, player)) + { + if (!world.isRemote) + { + world.playEvent(2005, blockPos, 0); + } + return true; + } + + return false; + } + + @Override + public void onSigilUpdate(ItemStack stack, World worldIn, PlayerEntity player, int itemSlot, boolean isSelected) + { + if (PlayerHelper.isFakePlayer(player)) + return; + + int range = 3; + int verticalRange = 2; + int posX = (int) Math.round(player.getPosX() - 0.5f); + int posY = (int) player.getPosY(); + int posZ = (int) Math.round(player.getPosZ() - 0.5f); + if (worldIn instanceof ServerWorld) + { + ServerWorld serverWorld = (ServerWorld) worldIn; + 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++) + { + BlockPos blockPos = new BlockPos(ix, iy, iz); + BlockState state = worldIn.getBlockState(blockPos); + +// if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) + { + if (state.getBlock() instanceof IGrowable) + { + if (worldIn.rand.nextInt(50) == 0) + { + BlockState preBlockState = worldIn.getBlockState(blockPos); + ((IGrowable) state.getBlock()).grow(serverWorld, worldIn.rand, blockPos, state); + + BlockState newState = worldIn.getBlockState(blockPos); + if (!newState.equals(preBlockState) && !worldIn.isRemote) + worldIn.playEvent(2005, blockPos, 0); + } + } + } + } + } + } + } + + } + + private static boolean applyBonemeal(ItemStack stack, World worldIn, BlockPos pos, PlayerEntity player) + { + BlockState blockstate = worldIn.getBlockState(pos); + int hook = net.minecraftforge.event.ForgeEventFactory.onApplyBonemeal(player, worldIn, pos, blockstate, stack); + if (hook != 0) + return hook > 0; + if (blockstate.getBlock() instanceof IGrowable) + { + IGrowable igrowable = (IGrowable) blockstate.getBlock(); + if (igrowable.canGrow(worldIn, pos, blockstate, worldIn.isRemote)) + { + if (worldIn instanceof ServerWorld) + { + if (igrowable.canUseBonemeal(worldIn, worldIn.rand, pos, blockstate)) + { + igrowable.grow((ServerWorld) worldIn, worldIn.rand, pos, blockstate); + } + + } + + return true; + } + } + + return false; + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java new file mode 100644 index 00000000..7fd76930 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java @@ -0,0 +1,90 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilLava extends ItemSigilFluidBase +{ + public ItemSigilLava() + { + super("lava", 1000, new FluidStack(Fluids.LAVA, 10000)); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + if (!world.isRemote && !isUnusable(stack)) + { + RayTraceResult rayTrace = rayTrace(world, player, RayTraceContext.FluidMode.NONE); + + if (rayTrace == null || rayTrace.getType() != RayTraceResult.Type.BLOCK) + { + return ActionResult.resultFail(stack); + } + + BlockRayTraceResult blockRayTrace = (BlockRayTraceResult) rayTrace; + BlockPos blockPos = blockRayTrace.getPos(); + Direction sideHit = blockRayTrace.getFace(); + BlockPos blockpos1 = blockPos.offset(sideHit); + + if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockpos1, sideHit, stack)) + { + + // Case for if block at blockPos is a fluid handler like a tank + // Try to put fluid into tank + IFluidHandler destination = getFluidHandler(world, blockPos, null); + if (destination != null && tryInsertSigilFluid(destination, false) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + boolean result = tryInsertSigilFluid(destination, true); + if (result) + return ActionResult.resultSuccess(stack); + } + // Do the same as above, but use sidedness to interact with the fluid handler. + IFluidHandler destinationSide = getFluidHandler(world, blockPos, sideHit); + if (destinationSide != null && tryInsertSigilFluid(destinationSide, false) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + boolean result = tryInsertSigilFluid(destinationSide, true); + if (result) + return ActionResult.resultSuccess(stack); + } + + // Case for if block at blockPos is not a tank + // Place fluid in world + if (destination == null && destinationSide == null) + { + BlockPos targetPos = blockPos.offset(sideHit); + if (tryPlaceSigilFluid(player, world, targetPos) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + return ActionResult.resultSuccess(stack); + } + } + } + } + + return super.onItemRightClick(world, player, hand); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilMagnetism.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilMagnetism.java new file mode 100644 index 00000000..b4cbea14 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilMagnetism.java @@ -0,0 +1,54 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import java.util.List; + +import net.minecraft.entity.item.ExperienceOrbEntity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.world.World; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilMagnetism extends ItemSigilToggleableBase +{ + public ItemSigilMagnetism() + { + super("magnetism", 50); + } + + @Override + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) + { + if (PlayerHelper.isFakePlayer(player)) + return; + + int range = 5; + int verticalRange = 5; + float posX = Math.round(player.getPosX()); + float posY = (float) (player.getPosY() - player.getEyeHeight()); + float posZ = Math.round(player.getPosZ()); + List entities = player.getEntityWorld().getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(posX + - 0.5f, posY - 0.5f, posZ + - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(range, verticalRange, range)); + List xpOrbs = player.getEntityWorld().getEntitiesWithinAABB(ExperienceOrbEntity.class, new AxisAlignedBB(posX + - 0.5f, posY - 0.5f, posZ + - 0.5f, posX + 0.5f, posY + 0.5f, posZ + 0.5f).expand(range, verticalRange, range)); + + for (ItemEntity entity : entities) + { + if (entity != null && !world.isRemote && entity.isAlive()) + { + entity.onCollideWithPlayer(player); + } + } + + for (ExperienceOrbEntity xpOrb : xpOrbs) + { + if (xpOrb != null && !world.isRemote) + { + xpOrb.onCollideWithPlayer(player); + } + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java new file mode 100644 index 00000000..10f44429 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java @@ -0,0 +1,119 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.World; +import wayoftime.bloodmagic.common.item.ItemSigil; +import wayoftime.bloodmagic.core.data.Binding; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.iface.IActivatable; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +/** + * Base class for all toggleable sigils. + */ +public class ItemSigilToggleable extends ItemSigil implements IActivatable +{ + + public ItemSigilToggleable(Properties property, int lpUsed) + { + super(property, lpUsed); + } + + @Override + public boolean getActivated(ItemStack stack) + { + return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTag().getBoolean(Constants.NBT.ACTIVATED); + } + + @Override + public ItemStack setActivatedState(ItemStack stack, boolean activated) + { + if (!stack.isEmpty()) + { + NBTHelper.checkNBT(stack).getTag().putBoolean(Constants.NBT.ACTIVATED, activated); + return stack; + } + + return stack; + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + if (!world.isRemote && !isUnusable(stack)) + { + if (player.isSneaking()) + setActivatedState(stack, !getActivated(stack)); + if (getActivated(stack)) + return super.onItemRightClick(world, player, hand); + } + + return super.onItemRightClick(world, player, hand); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) + { + World world = context.getWorld(); + BlockPos blockpos = context.getPos(); + + PlayerEntity player = context.getPlayer(); + ItemStack stack = context.getItem(); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + + Binding binding = getBinding(stack); + if (binding == null || player.isSneaking()) // Make sure Sigils are bound before handling. Also ignores while + // toggling state + return ActionResultType.PASS; + + return onSigilUse(stack, player, world, blockpos, context.getFace(), context.getHitVec()) + ? ActionResultType.SUCCESS + : ActionResultType.FAIL; + } + + public boolean onSigilUse(ItemStack itemStack, PlayerEntity player, World world, BlockPos blockPos, Direction side, Vector3d hitVec) + { + return false; + } + + @Override + public void inventoryTick(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) + { + if (!worldIn.isRemote && entityIn instanceof PlayerEntity && getActivated(stack)) + { + if (entityIn.ticksExisted % 100 == 0) + { + if (!NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage((PlayerEntity) entityIn, SoulTicket.item(stack, worldIn, entityIn, getLpUsed())).isSuccess()) + { + setActivatedState(stack, false); + } + } + + onSigilUpdate(stack, worldIn, (PlayerEntity) entityIn, itemSlot, isSelected); + } + } + + public void onSigilUpdate(ItemStack stack, World world, PlayerEntity player, int itemSlot, boolean isSelected) + { + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleableBase.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleableBase.java new file mode 100644 index 00000000..bc1c5c1f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleableBase.java @@ -0,0 +1,54 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; + +public class ItemSigilToggleableBase extends ItemSigilToggleable// implements IMeshProvider +{ + protected final String tooltipBase; + private final String name; + + public ItemSigilToggleableBase(String name, int lpUsed) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB), lpUsed); + + this.name = name; + this.tooltipBase = "tooltip.bloodmagic.sigil." + name + "."; + + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + super.addInformation(stack, world, tooltip, flag); + if (!stack.hasTag()) + return; + + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic." + (getActivated(stack) ? "activated" + : "deactivated"))); + } + +// @Override +// @SideOnly(Side.CLIENT) +// public ItemMeshDefinition getMeshDefinition() +// { +// return new CustomMeshDefinitionActivatable("sigil_" + name.toLowerCase(Locale.ROOT)); +// } +// +// @Override +// public void gatherVariants(Consumer variants) +// { +// variants.accept("active=false"); +// variants.accept("active=true"); +// } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java new file mode 100644 index 00000000..a9071c53 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java @@ -0,0 +1,85 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.block.BlockState; +import net.minecraft.block.IBucketPickupHandler; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilVoid extends ItemSigilFluidBase +{ + public ItemSigilVoid() + { + super("void", 50, new FluidStack(Fluids.EMPTY, 1000)); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + if (!world.isRemote && !isUnusable(stack)) + { + RayTraceResult rayTrace = rayTrace(world, player, RayTraceContext.FluidMode.SOURCE_ONLY); + + if (rayTrace == null || rayTrace.getType() != RayTraceResult.Type.BLOCK) + { + return ActionResult.resultFail(stack); + } + + BlockRayTraceResult blockRayTrace = (BlockRayTraceResult) rayTrace; + BlockPos blockPos = blockRayTrace.getPos(); + Direction sideHit = blockRayTrace.getFace(); + + if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockPos, sideHit, stack)) + { + BlockState blockState = world.getBlockState(blockPos); + if (blockState.getBlock() instanceof IBucketPickupHandler) + { + if (NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + ((IBucketPickupHandler) blockState.getBlock()).pickupFluid(world, blockPos, blockState); + return ActionResult.resultSuccess(stack); + } + } + // Void is simpler than the other fluid sigils, because getFluidHandler grabs + // fluid blocks just fine + // So extract from fluid tanks with a null side; or drain fluid blocks. +// IFluidHandler destination = getFluidHandler(world, blockPos, sideHit); +// if (destination != null && tryRemoveFluid(destination, 1000, false) +// && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) +// { +// if (tryRemoveFluid(destination, 1000, true)) +// return ActionResult.resultSuccess(stack); +// } +// // Do the same as above, but use sidedness to interact with the fluid handler. +// IFluidHandler destinationSide = getFluidHandler(world, blockPos, sideHit); +// if (destinationSide != null && tryRemoveFluid(destinationSide, 1000, false) +// && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) +// { +// if (tryRemoveFluid(destinationSide, 1000, true)) +// return ActionResult.resultSuccess(stack); +// } + } + } + + return super.onItemRightClick(world, player, hand); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java new file mode 100644 index 00000000..e5682d3d --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java @@ -0,0 +1,100 @@ +package wayoftime.bloodmagic.common.item.sigil; + +import net.minecraft.block.Blocks; +import net.minecraft.block.CauldronBlock; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import wayoftime.bloodmagic.core.data.SoulTicket; +import wayoftime.bloodmagic.iface.ISigil; +import wayoftime.bloodmagic.util.helper.NetworkHelper; +import wayoftime.bloodmagic.util.helper.PlayerHelper; + +public class ItemSigilWater extends ItemSigilFluidBase +{ + public ItemSigilWater() + { + super("water", 100, new FluidStack(Fluids.WATER, 10000)); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + if (stack.getItem() instanceof ISigil.Holding) + stack = ((Holding) stack.getItem()).getHeldItem(stack, player); + if (PlayerHelper.isFakePlayer(player)) + return ActionResult.resultFail(stack); + + if (!world.isRemote && !isUnusable(stack)) + { + RayTraceResult rayTrace = rayTrace(world, player, RayTraceContext.FluidMode.NONE); + + if (rayTrace == null || rayTrace.getType() != RayTraceResult.Type.BLOCK) + { + return ActionResult.resultFail(stack); + } + + BlockRayTraceResult blockRayTrace = (BlockRayTraceResult) rayTrace; + BlockPos blockPos = blockRayTrace.getPos(); + Direction sideHit = blockRayTrace.getFace(); + BlockPos blockpos1 = blockPos.offset(sideHit); + + if (world.isBlockModifiable(player, blockPos) && player.canPlayerEdit(blockpos1, sideHit, stack)) + { + + // Case for if block at blockPos is a fluid handler like a tank + // Try to put fluid into tank + IFluidHandler destination = getFluidHandler(world, blockPos, null); + if (destination != null && tryInsertSigilFluid(destination, false) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + boolean result = tryInsertSigilFluid(destination, true); + if (result) + return ActionResult.resultSuccess(stack); + } + // Do the same as above, but use sidedness to interact with the fluid handler. + IFluidHandler destinationSide = getFluidHandler(world, blockPos, sideHit); + if (destinationSide != null && tryInsertSigilFluid(destinationSide, false) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + boolean result = tryInsertSigilFluid(destinationSide, true); + if (result) + return ActionResult.resultSuccess(stack); + } + + // Special vanilla cauldron handling, yay. + if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().with(CauldronBlock.LEVEL, 3)); + return ActionResult.resultSuccess(stack); + } + + // Case for if block at blockPos is not a tank + // Place fluid in world + if (destination == null && destinationSide == null) + { + BlockPos targetPos = blockPos.offset(sideHit); + if (tryPlaceSigilFluid(player, world, targetPos) + && NetworkHelper.getSoulNetwork(getBinding(stack)).syphonAndDamage(player, SoulTicket.item(stack, world, player, getLpUsed())).isSuccess()) + { + return ActionResult.resultSuccess(stack); + } + } + } + } + + return super.onItemRightClick(world, player, hand); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java new file mode 100644 index 00000000..8558b314 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java @@ -0,0 +1,128 @@ +package wayoftime.bloodmagic.common.item.soul; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.NonNullList; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.will.EnumDemonWillType; +import wayoftime.bloodmagic.will.IDemonWill; + +public class ItemMonsterSoul extends Item implements IDemonWill +{ + private final EnumDemonWillType type; + + public ItemMonsterSoul(EnumDemonWillType type) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + this.type = type; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.will", ChatUtil.DECIMAL_FORMAT.format(getWill(getType(stack), stack)))); + + super.addInformation(stack, world, tooltip, flag); + } + + @Override + public EnumDemonWillType getType(ItemStack stack) + { + return type; + } + + @Override + public double getWill(EnumDemonWillType type, ItemStack soulStack) + { + if (type != this.getType(soulStack)) + { + return 0; + } + + NBTHelper.checkNBT(soulStack); + + CompoundNBT tag = soulStack.getTag(); + + return tag.getDouble(Constants.NBT.SOULS); + } + + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) + { + if (this.isInGroup(group)) + { + ItemStack stack = new ItemStack(this); + this.setWill(type, stack, 5); + items.add(stack); + } + } + + @Override + public boolean setWill(EnumDemonWillType type, ItemStack soulStack, double souls) + { + if (type != this.getType(soulStack)) + { + return false; + } + + NBTHelper.checkNBT(soulStack); + CompoundNBT tag = soulStack.getTag(); + tag.putDouble(Constants.NBT.SOULS, souls); + + return true; + } + + @Override + public double drainWill(EnumDemonWillType type, ItemStack soulStack, double drainAmount) + { + double souls = getWill(type, soulStack); + + double soulsDrained = Math.min(drainAmount, souls); + setWill(type, soulStack, souls - soulsDrained); + + return soulsDrained; + } + + @Override + public ItemStack createWill(double number) + { + ItemStack soulStack = new ItemStack(this); + setWill(getType(soulStack), soulStack, number); + return soulStack; + } + +// @Override +// public double getWill(ItemStack willStack) +// { +// return this.getWill(EnumDemonWillType.DEFAULT, willStack); +// } +// +// @Override +// public void setWill(ItemStack willStack, double will) +// { +// this.setWill(EnumDemonWillType.DEFAULT, willStack, will); +// } +// +// @Override +// public double drainWill(ItemStack willStack, double drainAmount) +// { +// return this.drainWill(EnumDemonWillType.DEFAULT, willStack, drainAmount); +// } + +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java new file mode 100644 index 00000000..8e59bcd2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java @@ -0,0 +1,503 @@ +package wayoftime.bloodmagic.common.item.soul; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.UUID; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.attributes.Attribute; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.monster.IMob; +import net.minecraft.entity.monster.SlimeEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.EquipmentSlotType; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.Difficulty; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.iface.IMultiWillTool; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.will.EnumDemonWillType; +import wayoftime.bloodmagic.will.IDemonWill; +import wayoftime.bloodmagic.will.IDemonWillWeapon; +import wayoftime.bloodmagic.will.PlayerDemonWillHandler; + +public class ItemSentientSword extends Item implements IDemonWillWeapon, IMultiWillTool +{ + public static int[] soulBracket = new int[] + { 16, 60, 200, 400, 1000, 2000, 4000 }; + public static double[] defaultDamageAdded = new double[] + { 1, 1.5, 2, 2.5, 3, 3.5, 4 }; + public static double[] destructiveDamageAdded = new double[] + { 1.5, 2.25, 3, 3.75, 4.5, 5.25, 6 }; + public static double[] vengefulDamageAdded = new double[] + { 0, 0.5, 1, 1.5, 2, 2.25, 2.5 }; + public static double[] steadfastDamageAdded = new double[] + { 0, 0.5, 1, 1.5, 2, 2.25, 2.5 }; + public static double[] soulDrainPerSwing = new double[] + { 0.05, 0.1, 0.2, 0.4, 0.75, 1, 1.25 }; + public static double[] soulDrop = new double[] + { 2, 4, 7, 10, 13, 15, 18 }; + public static double[] staticDrop = new double[] + { 1, 1, 2, 3, 3, 4, 4 }; + + public static double[] healthBonus = new double[] + { 0, 0, 0, 0, 0, 0, 0 }; // TODO: Think of implementing this later + public static double[] vengefulAttackSpeed = new double[] + { -2.1, -2, -1.8, -1.7, -1.6, -1.6, -1.5 }; + public static double[] destructiveAttackSpeed = new double[] + { -2.6, -2.7, -2.8, -2.9, -3, -3, -3 }; + + public static int[] absorptionTime = new int[] + { 200, 300, 400, 500, 600, 700, 800 }; + + public static double maxAbsorptionHearts = 10; + + public static int[] poisonTime = new int[] + { 25, 50, 60, 80, 100, 120, 150 }; + public static int[] poisonLevel = new int[] + { 0, 0, 0, 1, 1, 1, 1 }; + + public static double[] movementSpeed = new double[] + { 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4 }; + + public ItemSentientSword() + { +// super(RegistrarBloodMagicItems.SOUL_TOOL_MATERIAL); + super(new Item.Properties().maxDamage(520).group(BloodMagic.TAB)); + } + +// @Override +// public boolean getIsRepairable(ItemStack toRepair, ItemStack repair) +// { +// return RegistrarBloodMagicItems.ITEM_DEMON_CRYSTAL == repair.getItem() +// || super.getIsRepairable(toRepair, repair); +// } + + public void recalculatePowers(ItemStack stack, World world, PlayerEntity player) + { + EnumDemonWillType type = PlayerDemonWillHandler.getLargestWillType(player); + double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); + recalculatePowers(stack, type, soulsRemaining); + } + + public void recalculatePowers(ItemStack stack, EnumDemonWillType type, double will) + { + this.setCurrentType(stack, will > 0 ? type : EnumDemonWillType.DEFAULT); + int level = getLevel(stack, will); + + double drain = level >= 0 ? soulDrainPerSwing[level] : 0; + double extraDamage = getExtraDamage(type, level); + + setActivatedState(stack, will > 16); + + setDrainOfActivatedSword(stack, drain); + setDamageOfActivatedSword(stack, 5 + extraDamage); + setStaticDropOfActivatedSword(stack, level >= 0 ? staticDrop[level] : 1); + setDropOfActivatedSword(stack, level >= 0 ? soulDrop[level] : 0); + setAttackSpeedOfSword(stack, level >= 0 ? getAttackSpeed(type, level) : -2.4); + setHealthBonusOfSword(stack, level >= 0 ? getHealthBonus(type, level) : 0); + setSpeedOfSword(stack, level >= 0 ? getMovementSpeed(type, level) : 0); + } + + public boolean getActivated(ItemStack stack) + { + return !stack.isEmpty() && NBTHelper.checkNBT(stack).getTag().getBoolean(Constants.NBT.ACTIVATED); + } + + public ItemStack setActivatedState(ItemStack stack, boolean activated) + { + if (!stack.isEmpty()) + { + NBTHelper.checkNBT(stack).getTag().putBoolean(Constants.NBT.ACTIVATED, activated); + return stack; + } + + return stack; + } + + public double getExtraDamage(EnumDemonWillType type, int willBracket) + { + if (willBracket < 0) + { + return 0; + } + + switch (type) + { + case CORROSIVE: + case DEFAULT: + return defaultDamageAdded[willBracket]; + case DESTRUCTIVE: + return destructiveDamageAdded[willBracket]; + case VENGEFUL: + return vengefulDamageAdded[willBracket]; + case STEADFAST: + return steadfastDamageAdded[willBracket]; + } + + return 0; + } + + public double getAttackSpeed(EnumDemonWillType type, int willBracket) + { + switch (type) + { + case VENGEFUL: + return vengefulAttackSpeed[willBracket]; + case DESTRUCTIVE: + return destructiveAttackSpeed[willBracket]; + default: + return -2.4; + } + } + + public double getHealthBonus(EnumDemonWillType type, int willBracket) + { + switch (type) + { + case STEADFAST: + return healthBonus[willBracket]; + default: + return 0; + } + } + + public double getMovementSpeed(EnumDemonWillType type, int willBracket) + { + switch (type) + { + case VENGEFUL: + return movementSpeed[willBracket]; + default: + return 0; + } + } + + public void applyEffectToEntity(EnumDemonWillType type, int willBracket, LivingEntity target, LivingEntity attacker) + { +// switch (type) +// { +// case CORROSIVE: +// target.addPotionEffect(new PotionEffect(MobEffects.WITHER, poisonTime[willBracket], poisonLevel[willBracket])); +// break; +// case DEFAULT: +// break; +// case DESTRUCTIVE: +// break; +// case STEADFAST: +// if (!target.isEntityAlive()) +// { +// float absorption = attacker.getAbsorptionAmount(); +// attacker.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, absorptionTime[willBracket], 127)); +// attacker.setAbsorptionAmount((float) Math.min(absorption +// + target.getMaxHealth() * 0.05f, maxAbsorptionHearts)); +// } +// break; +// case VENGEFUL: +// break; +// } + } + + @Override + public boolean hitEntity(ItemStack stack, LivingEntity target, LivingEntity attacker) + { + if (super.hitEntity(stack, target, attacker)) + { + if (attacker instanceof PlayerEntity) + { + PlayerEntity attackerPlayer = (PlayerEntity) attacker; + this.recalculatePowers(stack, attackerPlayer.getEntityWorld(), attackerPlayer); + EnumDemonWillType type = this.getCurrentType(stack); + double will = PlayerDemonWillHandler.getTotalDemonWill(type, attackerPlayer); + int willBracket = this.getLevel(stack, will); + + applyEffectToEntity(type, willBracket, target, attackerPlayer); + +// ItemStack offStack = attackerPlayer.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND); +// if (offStack.getItem() instanceof ISentientSwordEffectProvider) +// { +// ISentientSwordEffectProvider provider = (ISentientSwordEffectProvider) offStack.getItem(); +// if (provider.providesEffectForWill(type)) +// { +// provider.applyOnHitEffect(type, stack, offStack, attacker, target); +// } +// } + } + + return true; + } + + return false; + } + + @Override + public EnumDemonWillType getCurrentType(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + if (!tag.contains(Constants.NBT.WILL_TYPE)) + { + return EnumDemonWillType.DEFAULT; + } + + return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); + } + + public void setCurrentType(ItemStack stack, EnumDemonWillType type) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + recalculatePowers(player.getHeldItem(hand), world, player); + return super.onItemRightClick(world, player, hand); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) + { + return oldStack.getItem() != newStack.getItem(); + } + + private int getLevel(ItemStack stack, double soulsRemaining) + { + int lvl = -1; + for (int i = 0; i < soulBracket.length; i++) + { + if (soulsRemaining >= soulBracket[i]) + { + lvl = i; + } + } + + return lvl; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + +// tooltip.addAll(Arrays.asList(TextHelper.cutLongString(TextHelper.localizeEffect("tooltip.bloodmagic.sentientSword.desc")))); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.sentientSword.desc")); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentType." + getCurrentType(stack).name().toLowerCase())); + } + + @Override + public boolean onLeftClickEntity(ItemStack stack, PlayerEntity player, Entity entity) + { + recalculatePowers(stack, player.getEntityWorld(), player); + + double drain = this.getDrainOfActivatedSword(stack); + if (drain > 0) + { + EnumDemonWillType type = getCurrentType(stack); + double soulsRemaining = PlayerDemonWillHandler.getTotalDemonWill(type, player); + + if (drain > soulsRemaining) + { + return false; + } else + { + PlayerDemonWillHandler.consumeDemonWill(type, player, drain); + } + } + + return super.onLeftClickEntity(stack, player, entity); + } + + @Override + public List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting) + { + List soulList = new ArrayList<>(); + + if (killedEntity.getEntityWorld().getDifficulty() != Difficulty.PEACEFUL && !(killedEntity instanceof IMob)) + { + return soulList; + } + + double willModifier = killedEntity instanceof SlimeEntity ? 0.67 : 1; + + IDemonWill soul = ((IDemonWill) BloodMagicItems.MONSTER_SOUL_RAW.get()); + + EnumDemonWillType type = this.getCurrentType(stack); + + for (int i = 0; i <= looting; i++) + { + if (i == 0 || attackingEntity.getEntityWorld().rand.nextDouble() < 0.4) + { + ItemStack soulStack = soul.createWill(willModifier + * (this.getDropOfActivatedSword(stack) * attackingEntity.getEntityWorld().rand.nextDouble() + + this.getStaticDropOfActivatedSword(stack)) + * killedEntity.getMaxHealth() / 20d); + soulList.add(soulStack); + } + } + + return soulList; + } + + // TODO: Change attack speed. + @Override + public Multimap getAttributeModifiers(EquipmentSlotType slot, ItemStack stack) + { + Multimap multimap = HashMultimap.create(); + if (slot == EquipmentSlotType.MAINHAND) + { + multimap.put(Attributes.ATTACK_DAMAGE, new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", getDamageOfActivatedSword(stack), AttributeModifier.Operation.ADDITION)); + multimap.put(Attributes.ATTACK_SPEED, new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", this.getAttackSpeedOfSword(stack), AttributeModifier.Operation.ADDITION)); + multimap.put(Attributes.MAX_HEALTH, new AttributeModifier(new UUID(0, 31818145), "Weapon modifier", this.getHealthBonusOfSword(stack), AttributeModifier.Operation.ADDITION)); + multimap.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(new UUID(0, 4218052), "Weapon modifier", this.getSpeedOfSword(stack), AttributeModifier.Operation.ADDITION)); + } + + return multimap; + } + + public double getDamageOfActivatedSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_DAMAGE); + } + + public void setDamageOfActivatedSword(ItemStack stack, double damage) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_DAMAGE, damage); + } + + public double getDrainOfActivatedSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN); + } + + public void setDrainOfActivatedSword(ItemStack stack, double drain) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_ACTIVE_DRAIN, drain); + } + + public double getStaticDropOfActivatedSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP); + } + + public void setStaticDropOfActivatedSword(ItemStack stack, double drop) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_STATIC_DROP, drop); + } + + public double getDropOfActivatedSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_DROP); + } + + public void setDropOfActivatedSword(ItemStack stack, double drop) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_DROP, drop); + } + + public double getHealthBonusOfSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_HEALTH); + } + + public void setHealthBonusOfSword(ItemStack stack, double hp) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_HEALTH, hp); + } + + public double getAttackSpeedOfSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED); + } + + public void setAttackSpeedOfSword(ItemStack stack, double speed) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_ATTACK_SPEED, speed); + } + + public double getSpeedOfSword(ItemStack stack) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + return tag.getDouble(Constants.NBT.SOUL_SWORD_SPEED); + } + + public void setSpeedOfSword(ItemStack stack, double speed) + { + NBTHelper.checkNBT(stack); + + CompoundNBT tag = stack.getTag(); + + tag.putDouble(Constants.NBT.SOUL_SWORD_SPEED, speed); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java new file mode 100644 index 00000000..9206dd15 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java @@ -0,0 +1,260 @@ +package wayoftime.bloodmagic.common.item.soul; + +import java.util.List; +import java.util.Locale; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.iface.IMultiWillTool; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NBTHelper; +import wayoftime.bloodmagic.will.EnumDemonWillType; +import wayoftime.bloodmagic.will.IDemonWill; +import wayoftime.bloodmagic.will.IDemonWillGem; +import wayoftime.bloodmagic.will.PlayerDemonWillHandler; + +public class ItemSoulGem extends Item implements IDemonWillGem, IMultiWillTool +{ + private final int maxWill; + private final String name; + + public ItemSoulGem(String name, int maxWill) + { + super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB)); + this.name = name; + this.maxWill = maxWill; + } + + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) + { + if (this.isInGroup(group)) + { + for (EnumDemonWillType type : EnumDemonWillType.values()) + { + ItemStack stack = new ItemStack(this); + this.setCurrentType(type, stack); + this.setWill(type, stack, maxWill); + items.add(stack); + } + } + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) + { + ItemStack stack = player.getHeldItem(hand); + EnumDemonWillType type = this.getCurrentType(stack); + double drain = Math.min(this.getWill(type, stack), this.getMaxWill(type, stack) / 10); + + double filled = PlayerDemonWillHandler.addDemonWill(type, player, drain, stack); + this.drainWill(type, stack, filled, true); + + return new ActionResult<>(ActionResultType.PASS, stack); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + if (!stack.hasTag()) + return; + + Items d; + + EnumDemonWillType type = this.getCurrentType(stack); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.soulGem." + name)); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.will", ChatUtil.DECIMAL_FORMAT.format(getWill(type, stack)))); + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.currentType." + getCurrentType(stack).name().toLowerCase())); + + super.addInformation(stack, world, tooltip, flag); + } + + @Override + public boolean showDurabilityBar(ItemStack stack) + { + return true; + } + + @Override + public double getDurabilityForDisplay(ItemStack stack) + { + EnumDemonWillType type = this.getCurrentType(stack); + double maxWill = getMaxWill(type, stack); + if (maxWill <= 0) + { + return 1; + } + return 1.0 - (getWill(type, stack) / maxWill); + } + + @Override + public int getRGBDurabilityForDisplay(ItemStack stack) + { + EnumDemonWillType type = this.getCurrentType(stack); + double maxWill = getMaxWill(type, stack); + if (maxWill <= 0) + { + return 1; + } + + return MathHelper.hsvToRGB(Math.max(0.0F, (float) (getWill(type, stack)) / (float) maxWill) / 3.0F, 1.0F, 1.0F); + } + + @Override + public ItemStack fillDemonWillGem(ItemStack soulGemStack, ItemStack soulStack) + { + if (soulStack != null && soulStack.getItem() instanceof IDemonWill) + { + EnumDemonWillType thisType = this.getCurrentType(soulGemStack); + if (thisType != ((IDemonWill) soulStack.getItem()).getType(soulStack)) + { + return soulStack; + } + IDemonWill soul = (IDemonWill) soulStack.getItem(); + double soulsLeft = getWill(thisType, soulGemStack); + + if (soulsLeft < getMaxWill(thisType, soulGemStack)) + { + double newSoulsLeft = Math.min(soulsLeft + + soul.getWill(thisType, soulStack), getMaxWill(thisType, soulGemStack)); + soul.drainWill(thisType, soulStack, newSoulsLeft - soulsLeft); + + setWill(thisType, soulGemStack, newSoulsLeft); + if (soul.getWill(thisType, soulStack) <= 0) + { + return ItemStack.EMPTY; + } + } + } + + return soulStack; + } + + @Override + public double getWill(EnumDemonWillType type, ItemStack soulGemStack) + { + if (!type.equals(getCurrentType(soulGemStack))) + { + return 0; + } + + CompoundNBT tag = soulGemStack.getTag(); + + return tag.getDouble(Constants.NBT.SOULS); + } + + @Override + public void setWill(EnumDemonWillType type, ItemStack soulGemStack, double souls) + { + setCurrentType(type, soulGemStack); + + CompoundNBT tag = soulGemStack.getTag(); + + tag.putDouble(Constants.NBT.SOULS, souls); + } + + @Override + public double drainWill(EnumDemonWillType type, ItemStack soulGemStack, double drainAmount, boolean doDrain) + { + EnumDemonWillType currentType = this.getCurrentType(soulGemStack); + if (currentType != type) + { + return 0; + } + double souls = getWill(type, soulGemStack); + + double soulsDrained = Math.min(drainAmount, souls); + + if (doDrain) + { + setWill(type, soulGemStack, souls - soulsDrained); + } + + return soulsDrained; + } + + @Override + public int getMaxWill(EnumDemonWillType type, ItemStack soulGemStack) + { + EnumDemonWillType currentType = getCurrentType(soulGemStack); + if (!type.equals(currentType) && currentType != EnumDemonWillType.DEFAULT) + { + return 0; + } + + return maxWill; + } + + @Override + public EnumDemonWillType getCurrentType(ItemStack soulGemStack) + { + NBTHelper.checkNBT(soulGemStack); + + CompoundNBT tag = soulGemStack.getTag(); + + if (!tag.contains(Constants.NBT.WILL_TYPE)) + { + return EnumDemonWillType.DEFAULT; + } + + return EnumDemonWillType.valueOf(tag.getString(Constants.NBT.WILL_TYPE).toUpperCase(Locale.ENGLISH)); + } + + public void setCurrentType(EnumDemonWillType type, ItemStack soulGemStack) + { + NBTHelper.checkNBT(soulGemStack); + + CompoundNBT tag = soulGemStack.getTag(); + + if (type == EnumDemonWillType.DEFAULT) + { + if (tag.contains(Constants.NBT.WILL_TYPE)) + { + tag.remove(Constants.NBT.WILL_TYPE); + } + + return; + } + + tag.putString(Constants.NBT.WILL_TYPE, type.toString()); + } + + @Override + public double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill) + { + if (!type.equals(getCurrentType(stack)) && this.getWill(getCurrentType(stack), stack) > 0) + { + return 0; + } + + double current = this.getWill(type, stack); + double maxWill = this.getMaxWill(type, stack); + + double filled = Math.min(fillAmount, maxWill - current); + + if (doFill) + { + this.setWill(type, stack, filled + current); + } + + return filled; + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulSnare.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulSnare.java new file mode 100644 index 00000000..c69305d5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulSnare.java @@ -0,0 +1,76 @@ +package wayoftime.bloodmagic.common.item.soul; + +import java.util.List; + +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.SnowballItem; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.entity.projectile.EntitySoulSnare; + +public class ItemSoulSnare extends Item +{ + public static String[] names = + { "base" }; + + public ItemSoulSnare() + { + super(new Item.Properties().maxStackSize(16).group(BloodMagic.TAB)); + +// setTranslationKey(BloodMagic.MODID + ".soulSnare."); +// setCreativeTab(BloodMagic.TAB_BM); +// setHasSubtypes(true); +// setMaxStackSize(16); + } + + @Override + public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand hand) + { + ItemStack stack = playerIn.getHeldItem(hand); + if (!playerIn.isCreative()) + { + stack.shrink(1); + } + + SnowballItem d; + + worldIn.playSound((PlayerEntity) null, playerIn.getPosX(), playerIn.getPosY(), playerIn.getPosZ(), SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F + / (random.nextFloat() * 0.4F + 0.8F)); + + if (!worldIn.isRemote) + { + System.out.println("Attempting to spawn"); + EntitySoulSnare snare = new EntitySoulSnare(worldIn, playerIn); + snare.func_234612_a_(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); + worldIn.addEntity(snare); +// +// SnowballEntity snowballentity = new SnowballEntity(worldIn, playerIn); +// snowballentity.setItem(itemstack); +// snowballentity.func_234612_a_(playerIn, playerIn.rotationPitch, playerIn.rotationYaw, 0.0F, 1.5F, 1.0F); +// worldIn.addEntity(snowballentity); + } + + return new ActionResult<>(ActionResultType.SUCCESS, stack); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World world, List tooltip, ITooltipFlag flag) + { + tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.soulSnare.desc")); + + super.addInformation(stack, world, tooltip, flag); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyArrayRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyArrayRecipeProvider.java new file mode 100644 index 00000000..dfe9c6ec --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/AlchemyArrayRecipeProvider.java @@ -0,0 +1,38 @@ +package wayoftime.bloodmagic.common.recipe; + +import java.util.function.Consumer; + +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.data.recipe.builder.AlchemyArrayRecipeBuilder; +import wayoftime.bloodmagic.common.item.BloodMagicItems; + +public class AlchemyArrayRecipeProvider implements ISubRecipeProvider +{ + + @Override + public void addRecipes(Consumer consumer) + { + String basePath = "array/"; +// AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/airsigil.png"), Ingredient.fromItems(Items.STONE), Ingredient.fromItems(Items.STONE), new ItemStack(Items.DIAMOND)).build(consumer, BloodMagic.rl(basePath +// + "airsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/divinationsigil.png"), Ingredient.fromItems(Items.REDSTONE), Ingredient.fromItems(BloodMagicItems.SLATE.get()), new ItemStack(BloodMagicItems.DIVINATION_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "divinationsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/watersigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_WATER.get()), Ingredient.fromItems(BloodMagicItems.SLATE.get()), new ItemStack(BloodMagicItems.WATER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "watersigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/lavasigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_LAVA.get()), Ingredient.fromItems(BloodMagicItems.SLATE.get()), new ItemStack(BloodMagicItems.LAVA_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "lavasigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/voidsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_VOID.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.VOID_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "voidsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/growthsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_GROWTH.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.GREEN_GROVE_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "growthsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/fastminersigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_FAST_MINER.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.FAST_MINER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "fastminersigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/magnetismsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_MAGNETISM.get()), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), new ItemStack(BloodMagicItems.MAGNETISM_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "magnetismsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/lightsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_BLOOD_LIGHT.get()), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), new ItemStack(BloodMagicItems.BLOOD_LIGHT_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "bloodlightsigil")); + AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/airsigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_AIR.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.AIR_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "airsigil")); +// AlchemyArrayRecipeBuilder.array(BloodMagic.rl("textures/models/alchemyarrays/fastminersigil.png"), Ingredient.fromItems(BloodMagicItems.REAGENT_FAST_MINER.get()), Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.FAST_MINER_SIGIL.get())).build(consumer, BloodMagic.rl(basePath + "frostsigil")); +// BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()), AltarTier.ONE.ordinal(), 2000, 2, 1).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath +// + "weakbloodorb")); +// BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STONE), new ItemStack(BloodMagicItems.SLATE.get()), AltarTier.ONE.ordinal(), 1000, 5, 5).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath +// + "slate")); + + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java new file mode 100644 index 00000000..671843fa --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodAltarRecipeProvider.java @@ -0,0 +1,72 @@ +package wayoftime.bloodmagic.common.recipe; + +import java.util.function.Consumer; + +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.Tags; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.altar.AltarTier; +import wayoftime.bloodmagic.common.data.recipe.builder.BloodAltarRecipeBuilder; +import wayoftime.bloodmagic.common.item.BloodMagicItems; + +public class BloodAltarRecipeProvider implements ISubRecipeProvider +{ + + @Override + public void addRecipes(Consumer consumer) + { + String basePath = "altar/"; + + // ONE + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), new ItemStack(BloodMagicItems.WEAK_BLOOD_ORB.get()), AltarTier.ONE.ordinal(), 2000, 2, 1).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath + "weakbloodorb")); + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STONE), new ItemStack(BloodMagicItems.SLATE.get()), AltarTier.ONE.ordinal(), 1000, 5, 5).build(consumer, new ResourceLocation(BloodMagic.MODID, basePath + "slate")); + + // TWO + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(BloodMagicItems.SLATE.get()), new ItemStack(BloodMagicItems.REINFORCED_SLATE.get()), AltarTier.THREE.ordinal(), 2000, 5, 5).build(consumer, BloodMagic.rl(basePath + "reinforcedslate")); + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_REDSTONE), new ItemStack(BloodMagicItems.APPRENTICE_BLOOD_ORB.get()), AltarTier.TWO.ordinal(), 5000, 5, 5).build(consumer, BloodMagic.rl(basePath + "apprenticebloodorb")); + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(Items.IRON_SWORD), new ItemStack(BloodMagicItems.DAGGER_OF_SACRIFICE.get()), AltarTier.TWO.ordinal(), 3000, 5, 5).build(consumer, BloodMagic.rl(basePath + "daggerofsacrifice")); + + // THREE + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(BloodMagicItems.REINFORCED_SLATE.get()), new ItemStack(BloodMagicItems.IMBUED_SLATE.get()), AltarTier.THREE.ordinal(), 5000, 15, 10).build(consumer, BloodMagic.rl(basePath + "imbuedslate")); + BloodAltarRecipeBuilder.altar(Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_GOLD), new ItemStack(BloodMagicItems.MAGICIAN_BLOOD_ORB.get()), AltarTier.THREE.ordinal(), 25000, 20, 20).build(consumer, BloodMagic.rl(basePath + "magicianbloodorb")); + + // FOUR + BloodAltarRecipeBuilder.altar(Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get()), new ItemStack(BloodMagicItems.DEMONIC_SLATE.get()), AltarTier.FOUR.ordinal(), 15000, 20, 20).build(consumer, BloodMagic.rl(basePath + "demonicslate")); + +// BloodAltarRecipeBuilder.altar(input, output, minimumTier, syphon, consumeRate, drainRate).build(consumer, BloodMagic.rl(basePath + "")); + +// registrar.addBloodAltar(new OreIngredient("stone"), ItemSlate.SlateType.BLANK.getStack(), AltarTier.ONE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.BUCKET), FluidUtil.getFilledBucket(new FluidStack(BlockLifeEssence.getLifeEssence(), Fluid.BUCKET_VOLUME)), AltarTier.ONE.ordinal(), 1000, 5, 0); +// registrar.addBloodAltar(Ingredient.fromItem(Items.BOOK), new ItemStack(RegistrarBloodMagicItems.SANGUINE_BOOK), AltarTier.ONE.ordinal(), 1000, 20, 0); +// +// // TWO +// registrar.addBloodAltar(new OreIngredient("blockRedstone"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_APPRENTICE), AltarTier.TWO.ordinal(), 5000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.BLANK.getStack()), ItemSlate.SlateType.REINFORCED.getStack(), AltarTier.TWO.ordinal(), 2000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.IRON_SWORD), new ItemStack(RegistrarBloodMagicItems.DAGGER_OF_SACRIFICE), AltarTier.TWO.ordinal(), 3000, 5, 5); +// +// // THREE +// registrar.addBloodAltar(new OreIngredient("blockGold"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MAGICIAN), AltarTier.THREE.ordinal(), 25000, 20, 20); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.REINFORCED.getStack()), ItemSlate.SlateType.IMBUED.getStack(), AltarTier.THREE.ordinal(), 5000, 15, 10); +// registrar.addBloodAltar(new OreIngredient("obsidian"), EnumRuneType.EARTH.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(new OreIngredient("blockLapis"), EnumRuneType.WATER.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.MAGMA_CREAM), EnumRuneType.FIRE.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(Items.GHAST_TEAR), EnumRuneType.AIR.getStack(), AltarTier.THREE.ordinal(), 1000, 5, 5); +// registrar.addBloodAltar(Ingredient.fromItem(RegistrarBloodMagicItems.LAVA_CRYSTAL), new ItemStack(RegistrarBloodMagicItems.ACTIVATION_CRYSTAL), AltarTier.THREE.ordinal(), 10000, 20, 10); +// +// // FOUR +// registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.BLOOD_SHARD)), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_MASTER), AltarTier.FOUR.ordinal(), 40000, 30, 50); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.IMBUED.getStack()), ItemSlate.SlateType.DEMONIC.getStack(), AltarTier.FOUR.ordinal(), 15000, 20, 20); +// registrar.addBloodAltar(new OreIngredient("blockCoal"), EnumRuneType.DUSK.getStack(), AltarTier.FOUR.ordinal(), 2000, 20, 10); +// registrar.addBloodAltar(new OreIngredient("enderpearl"), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS), AltarTier.FOUR.ordinal(), 2000, 10, 10); +// registrar.addBloodAltar(Ingredient.fromStacks(new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS)), new ItemStack(RegistrarBloodMagicItems.TELEPOSITION_FOCUS, 1, 1), AltarTier.FOUR.ordinal(), 10000, 20, 10); +// +// // FIVE +// registrar.addBloodAltar(new OreIngredient("netherStar"), OrbRegistry.getOrbStack(RegistrarBloodMagic.ORB_ARCHMAGE), AltarTier.FIVE.ordinal(), 80000, 50, 100); +// registrar.addBloodAltar(Ingredient.fromStacks(ItemSlate.SlateType.DEMONIC.getStack()), ItemSlate.SlateType.ETHEREAL.getStack(), AltarTier.FIVE.ordinal(), 30000, 40, 100); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java new file mode 100644 index 00000000..e8a99239 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java @@ -0,0 +1,13 @@ +package wayoftime.bloodmagic.common.recipe; + +import net.minecraft.item.crafting.IRecipeType; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; + +public class BloodMagicRecipeType +{ + public static final IRecipeType ALTAR = IRecipeType.register("altar"); + public static final IRecipeType ARRAY = IRecipeType.register("array"); + public static final IRecipeType TARTARICFORGE = IRecipeType.register("soulforge"); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/ISubRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/ISubRecipeProvider.java new file mode 100644 index 00000000..d7aa8f7c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/ISubRecipeProvider.java @@ -0,0 +1,14 @@ +package wayoftime.bloodmagic.common.recipe; + +import java.util.function.Consumer; + +import net.minecraft.data.IFinishedRecipe; + +/** + * Interface for helping split the recipe provider over multiple classes to make + * it a bit easier to interact with + */ +public interface ISubRecipeProvider +{ + void addRecipes(Consumer consumer); +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java new file mode 100644 index 00000000..43344e81 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/TartaricForgeRecipeProvider.java @@ -0,0 +1,36 @@ +package wayoftime.bloodmagic.common.recipe; + +import java.util.function.Consumer; + +import net.minecraft.data.IFinishedRecipe; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.tags.ItemTags; +import net.minecraftforge.common.Tags; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.data.recipe.builder.TartaricForgeRecipeBuilder; +import wayoftime.bloodmagic.common.item.BloodMagicItems; + +public class TartaricForgeRecipeProvider implements ISubRecipeProvider +{ + + @Override + public void addRecipes(Consumer consumer) + { + String basePath = "soulforge/"; + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.PETTY_GEM.get()), 1, 1, Ingredient.fromTag(Tags.Items.DUSTS_REDSTONE), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.GLASS), Ingredient.fromTag(Tags.Items.GEMS_LAPIS)).build(consumer, BloodMagic.rl(basePath + "pettytartaricgem")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.LESSER_GEM.get()), 60, 20, Ingredient.fromItems(BloodMagicItems.PETTY_GEM.get()), Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_REDSTONE), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_LAPIS)).build(consumer, BloodMagic.rl(basePath + "lessertartaricgem")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.COMMON_GEM.get()), 240, 50, Ingredient.fromItems(BloodMagicItems.LESSER_GEM.get()), Ingredient.fromTag(Tags.Items.GEMS_DIAMOND), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_GOLD), Ingredient.fromItems(BloodMagicItems.IMBUED_SLATE.get())).build(consumer, BloodMagic.rl(basePath + "commontartaricgem")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.SENTIENT_SWORD.get()), 0, 0, Ingredient.fromItems(BloodMagicItems.PETTY_GEM.get()), Ingredient.fromItems(Items.IRON_SWORD)).build(consumer, BloodMagic.rl(basePath + "sentientsword")); + + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.ARCANE_ASHES.get()), 0, 0, Ingredient.fromTag(Tags.Items.DUSTS_REDSTONE), Ingredient.fromTag(Tags.Items.DYES_WHITE), Ingredient.fromTag(Tags.Items.GUNPOWDER), Ingredient.fromTag(ItemTags.COALS)).build(consumer, BloodMagic.rl(basePath + "arcaneashes")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_WATER.get()), 10, 3, Ingredient.fromItems(Items.SUGAR), Ingredient.fromItems(Items.WATER_BUCKET), Ingredient.fromItems(Items.WATER_BUCKET)).build(consumer, BloodMagic.rl(basePath + "reagent_water")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_LAVA.get()), 32, 10, Ingredient.fromItems(Items.LAVA_BUCKET), Ingredient.fromTag(Tags.Items.DUSTS_REDSTONE), Ingredient.fromTag(Tags.Items.COBBLESTONE), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_COAL)).build(consumer, BloodMagic.rl(basePath + "reagent_lava")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_VOID.get()), 64, 10, Ingredient.fromItems(Items.BUCKET), Ingredient.fromTag(Tags.Items.STRING), Ingredient.fromTag(Tags.Items.STRING), Ingredient.fromTag(Tags.Items.GUNPOWDER)).build(consumer, BloodMagic.rl(basePath + "reagent_void")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_GROWTH.get()), 128, 20, Ingredient.fromTag(ItemTags.SAPLINGS), Ingredient.fromTag(ItemTags.SAPLINGS), Ingredient.fromItems(Items.SUGAR_CANE), Ingredient.fromItems(Items.SUGAR)).build(consumer, BloodMagic.rl(basePath + "reagent_growth")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_MAGNETISM.get()), 600, 10, Ingredient.fromTag(Tags.Items.STRING), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.INGOTS_GOLD), Ingredient.fromTag(Tags.Items.STORAGE_BLOCKS_IRON)).build(consumer, BloodMagic.rl(basePath + "reagent_magnetism")); + TartaricForgeRecipeBuilder.tartaricForge(new ItemStack(BloodMagicItems.REAGENT_FAST_MINER.get()), 128, 20, Ingredient.fromItems(Items.IRON_PICKAXE), Ingredient.fromItems(Items.IRON_AXE), Ingredient.fromItems(Items.IRON_SHOVEL), Ingredient.fromTag(Tags.Items.GUNPOWDER)).build(consumer, BloodMagic.rl(basePath + "reagent_fastminer")); + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java new file mode 100644 index 00000000..6a37051f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java @@ -0,0 +1,89 @@ +package wayoftime.bloodmagic.common.recipe.serializer; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistryEntry; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.util.Constants; + +public class AlchemyArrayRecipeSerializer + extends ForgeRegistryEntry> implements IRecipeSerializer +{ + private final IFactory factory; + + public AlchemyArrayRecipeSerializer(IFactory factory) + { + this.factory = factory; + } + + @Nonnull + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull JsonObject json) + { + JsonElement input1 = JSONUtils.isJsonArray(json, Constants.JSON.BASEINPUT) + ? JSONUtils.getJsonArray(json, Constants.JSON.BASEINPUT) + : JSONUtils.getJsonObject(json, Constants.JSON.BASEINPUT); + + JsonElement input2 = JSONUtils.isJsonArray(json, Constants.JSON.ADDEDINPUT) + ? JSONUtils.getJsonArray(json, Constants.JSON.ADDEDINPUT) + : JSONUtils.getJsonObject(json, Constants.JSON.ADDEDINPUT); + + Ingredient baseInput = Ingredient.deserialize(input1); + Ingredient addedInput = Ingredient.deserialize(input2); + ResourceLocation texture = null; + if (json.has(Constants.JSON.TEXTURE)) + texture = new ResourceLocation(JSONUtils.getString(json, Constants.JSON.TEXTURE)); + ItemStack output = SerializerHelper.getItemStack(json, Constants.JSON.OUTPUT); + + return this.factory.create(recipeId, texture, baseInput, addedInput, output); + } + + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer) + { + try + { + ResourceLocation texture = null; + if (buffer.readBoolean()) + texture = buffer.readResourceLocation(); + Ingredient baseInput = Ingredient.read(buffer); + Ingredient addedInput = Ingredient.read(buffer); + ItemStack output = buffer.readItemStack(); + + return this.factory.create(recipeId, texture, baseInput, addedInput, output); + } catch (Exception e) + { +// Mekanism.logger.error("Error reading electrolysis recipe from packet.", e); + throw e; + } + } + + @Override + public void write(@Nonnull PacketBuffer buffer, @Nonnull RECIPE recipe) + { + try + { + recipe.write(buffer); + } catch (Exception e) + { +// Mekanism.logger.error("Error writing electrolysis recipe to packet.", e); + throw e; + } + } + + @FunctionalInterface + public interface IFactory + { + RECIPE create(ResourceLocation id, ResourceLocation texture, Ingredient baseInput, Ingredient addedInput, ItemStack output); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java new file mode 100644 index 00000000..66852235 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java @@ -0,0 +1,85 @@ +package wayoftime.bloodmagic.common.recipe.serializer; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistryEntry; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.util.Constants; + +public class BloodAltarRecipeSerializer + extends ForgeRegistryEntry> implements IRecipeSerializer +{ + private final IFactory factory; + + public BloodAltarRecipeSerializer(IFactory factory) + { + this.factory = factory; + } + + @Nonnull + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull JsonObject json) + { + JsonElement input = JSONUtils.isJsonArray(json, Constants.JSON.INPUT) + ? JSONUtils.getJsonArray(json, Constants.JSON.INPUT) + : JSONUtils.getJsonObject(json, Constants.JSON.INPUT); + + Ingredient inputIng = Ingredient.deserialize(input); + ItemStack output = SerializerHelper.getItemStack(json, Constants.JSON.OUTPUT); + int minimumTier = JSONUtils.getInt(json, Constants.JSON.ALTAR_TIER); + int syphon = JSONUtils.getInt(json, Constants.JSON.ALTAR_SYPHON); + int consumeRate = JSONUtils.getInt(json, Constants.JSON.ALTAR_CONSUMPTION_RATE); + int drainRate = JSONUtils.getInt(json, Constants.JSON.ALTAR_DRAIN_RATE); + + return this.factory.create(recipeId, inputIng, output, minimumTier, syphon, consumeRate, drainRate); + } + + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer) + { + try + { + Ingredient input = Ingredient.read(buffer); + ItemStack output = buffer.readItemStack(); + int minimumTier = buffer.readInt(); + int syphon = buffer.readInt(); + int consumeRate = buffer.readInt(); + int drainRate = buffer.readInt(); + + return this.factory.create(recipeId, input, output, minimumTier, syphon, consumeRate, drainRate); + } catch (Exception e) + { +// Mekanism.logger.error("Error reading electrolysis recipe from packet.", e); + throw e; + } + } + + @Override + public void write(@Nonnull PacketBuffer buffer, @Nonnull RECIPE recipe) + { + try + { + recipe.write(buffer); + } catch (Exception e) + { +// Mekanism.logger.error("Error writing electrolysis recipe to packet.", e); + throw e; + } + } + + @FunctionalInterface + public interface IFactory + { + RECIPE create(ResourceLocation id, Ingredient input, ItemStack output, int minimumTier, int syphon, int consumeRate, int drainRate); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java new file mode 100644 index 00000000..bf8d009e --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java @@ -0,0 +1,100 @@ +package wayoftime.bloodmagic.common.recipe.serializer; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistryEntry; +import wayoftime.bloodmagic.api.SerializerHelper; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.util.Constants; + +public class TartaricForgeRecipeSerializer + extends ForgeRegistryEntry> implements IRecipeSerializer +{ + + private final IFactory factory; + + public TartaricForgeRecipeSerializer(IFactory factory) + { + this.factory = factory; + } + + @Nonnull + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull JsonObject json) + { + List inputList = new ArrayList(); + for (int i = 0; i < 4; i++) + { + if (json.has(Constants.JSON.INPUT + i)) + { + JsonElement input = JSONUtils.isJsonArray(json, Constants.JSON.INPUT + i) + ? JSONUtils.getJsonArray(json, Constants.JSON.INPUT + i) + : JSONUtils.getJsonObject(json, Constants.JSON.INPUT + i); + inputList.add(Ingredient.deserialize(input)); + } + } + + ItemStack output = SerializerHelper.getItemStack(json, Constants.JSON.OUTPUT); + + float minimumSouls = JSONUtils.getFloat(json, Constants.JSON.TARTARIC_MINIMUM); + float soulDrain = JSONUtils.getFloat(json, Constants.JSON.TARTARIC_DRAIN); + + return this.factory.create(recipeId, inputList, output, minimumSouls, soulDrain); + } + + @Override + public RECIPE read(@Nonnull ResourceLocation recipeId, @Nonnull PacketBuffer buffer) + { + try + { + int size = buffer.readInt(); + List input = new ArrayList(size); + + for (int i = 0; i < size; i++) + { + input.add(i, Ingredient.read(buffer)); + } + + ItemStack output = buffer.readItemStack(); + double minimumSouls = buffer.readDouble(); + double soulDrain = buffer.readDouble(); + + return this.factory.create(recipeId, input, output, minimumSouls, soulDrain); + } catch (Exception e) + { +// Mekanism.logger.error("Error reading electrolysis recipe from packet.", e); + throw e; + } + } + + @Override + public void write(@Nonnull PacketBuffer buffer, @Nonnull RECIPE recipe) + { + try + { + recipe.write(buffer); + } catch (Exception e) + { +// Mekanism.logger.error("Error writing electrolysis recipe to packet.", e); + throw e; + } + } + + @FunctionalInterface + public interface IFactory + { + RECIPE create(ResourceLocation id, List input, ItemStack output, double minimumSouls, double soulDrain); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/INamedEntry.java b/src/main/java/wayoftime/bloodmagic/common/registration/INamedEntry.java new file mode 100644 index 00000000..a75d9fe8 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/INamedEntry.java @@ -0,0 +1,11 @@ +package wayoftime.bloodmagic.common.registration; + +public interface INamedEntry +{ + + /** + * Used for retrieving the path/name of a registry object before the registry + * object has been fully initialized + */ + String getInternalRegistryName(); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/WrappedDeferredRegister.java b/src/main/java/wayoftime/bloodmagic/common/registration/WrappedDeferredRegister.java new file mode 100644 index 00000000..f6a707df --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/WrappedDeferredRegister.java @@ -0,0 +1,49 @@ +package wayoftime.bloodmagic.common.registration; + +import java.util.function.Function; +import java.util.function.Supplier; + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.IForgeRegistryEntry; +import net.minecraftforge.registries.RegistryBuilder; + +public class WrappedDeferredRegister> +{ + protected final DeferredRegister internal; + + protected WrappedDeferredRegister(String modid, IForgeRegistry registry) + { + internal = DeferredRegister.create(registry, modid); + } + + /** + * @apiNote For use with custom registries + */ + protected WrappedDeferredRegister(String modid, Class base) + { + internal = DeferredRegister.create(base, modid); + } + + protected > W register(String name, Supplier sup, + Function, W> objectWrapper) + { + return objectWrapper.apply(internal.register(name, sup)); + } + + /** + * Only call this from mekanism and for custom registries + */ + public void createAndRegister(IEventBus bus, String name) + { + internal.makeRegistry(name, RegistryBuilder::new); + register(bus); + } + + public void register(IEventBus bus) + { + internal.register(bus); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/WrappedRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/WrappedRegistryObject.java new file mode 100644 index 00000000..7d37f782 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/WrappedRegistryObject.java @@ -0,0 +1,32 @@ +package wayoftime.bloodmagic.common.registration; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.IForgeRegistryEntry; + +public class WrappedRegistryObject> implements Supplier, INamedEntry +{ + + protected RegistryObject registryObject; + + protected WrappedRegistryObject(RegistryObject registryObject) + { + this.registryObject = registryObject; + } + + @Nonnull + @Override + public T get() + { + return registryObject.get(); + } + + @Override + public String getInternalRegistryName() + { + return registryObject.getId().getPath(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java new file mode 100644 index 00000000..cc54ca3b --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java @@ -0,0 +1,26 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import java.util.function.Supplier; + +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.common.registration.WrappedDeferredRegister; +import wayoftime.bloodmagic.orb.BloodOrb; + +public class BloodOrbDeferredRegister extends WrappedDeferredRegister +{ + public BloodOrbDeferredRegister(String modid) + { + super(modid, BloodOrb.class); + } + + public BloodOrbRegistryObject register(String name, ResourceLocation rl, int tier, int capacity, + int fillRate) + { + return register(name, () -> new BloodOrb(rl, tier, capacity, fillRate)); + } + + public BloodOrbRegistryObject register(String name, Supplier sup) + { + return register(name, sup, BloodOrbRegistryObject::new); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java new file mode 100644 index 00000000..f97d2347 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java @@ -0,0 +1,13 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import net.minecraftforge.fml.RegistryObject; +import wayoftime.bloodmagic.common.registration.WrappedRegistryObject; +import wayoftime.bloodmagic.orb.BloodOrb; + +public class BloodOrbRegistryObject extends WrappedRegistryObject +{ + public BloodOrbRegistryObject(RegistryObject registryObject) + { + super(registryObject); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeDeferredRegister.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeDeferredRegister.java new file mode 100644 index 00000000..0176e647 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeDeferredRegister.java @@ -0,0 +1,20 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.common.registration.WrappedDeferredRegister; + +public class EntityTypeDeferredRegister extends WrappedDeferredRegister> +{ + + public EntityTypeDeferredRegister(String modid) + { + super(modid, ForgeRegistries.ENTITIES); + } + + public EntityTypeRegistryObject register(String name, EntityType.Builder builder) + { + return register(name, () -> builder.build(name), EntityTypeRegistryObject::new); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java new file mode 100644 index 00000000..13b1aa1c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java @@ -0,0 +1,26 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import javax.annotation.Nonnull; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraftforge.fml.RegistryObject; +import wayoftime.bloodmagic.api.providers.IEntityTypeProvider; +import wayoftime.bloodmagic.common.registration.WrappedRegistryObject; + +public class EntityTypeRegistryObject extends WrappedRegistryObject> + implements IEntityTypeProvider +{ + + public EntityTypeRegistryObject(RegistryObject> registryObject) + { + super(registryObject); + } + + @Nonnull + @Override + public EntityType getEntityType() + { + return get(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerDeferredRegister.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerDeferredRegister.java new file mode 100644 index 00000000..10c94aba --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerDeferredRegister.java @@ -0,0 +1,23 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import java.util.function.Supplier; + +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraftforge.registries.ForgeRegistries; +import wayoftime.bloodmagic.common.registration.WrappedDeferredRegister; + +public class IRecipeSerializerDeferredRegister extends WrappedDeferredRegister> +{ + + public IRecipeSerializerDeferredRegister(String modid) + { + super(modid, ForgeRegistries.RECIPE_SERIALIZERS); + } + + public > IRecipeSerializerRegistryObject register(String name, + Supplier> sup) + { + return register(name, sup, IRecipeSerializerRegistryObject::new); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerRegistryObject.java new file mode 100644 index 00000000..70d3d56c --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/IRecipeSerializerRegistryObject.java @@ -0,0 +1,24 @@ +package wayoftime.bloodmagic.common.registration.impl; + +import javax.annotation.Nonnull; + +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraftforge.fml.RegistryObject; +import wayoftime.bloodmagic.common.registration.WrappedRegistryObject; + +public class IRecipeSerializerRegistryObject> + extends WrappedRegistryObject> +{ + + public IRecipeSerializerRegistryObject(RegistryObject> registryObject) + { + super(registryObject); + } + + @Nonnull + public IRecipeSerializer getRecipeSerializer() + { + return get(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicEntityTypes.java b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicEntityTypes.java new file mode 100644 index 00000000..c5f775f0 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicEntityTypes.java @@ -0,0 +1,22 @@ +package wayoftime.bloodmagic.common.registries; + +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.EntityType; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.common.registration.impl.EntityTypeDeferredRegister; +import wayoftime.bloodmagic.common.registration.impl.EntityTypeRegistryObject; +import wayoftime.bloodmagic.entity.projectile.EntityBloodLight; +import wayoftime.bloodmagic.entity.projectile.EntitySoulSnare; + +public class BloodMagicEntityTypes +{ + private BloodMagicEntityTypes() + { + + } + + public static final EntityTypeDeferredRegister ENTITY_TYPES = new EntityTypeDeferredRegister(BloodMagic.MODID); + + public static final EntityTypeRegistryObject SNARE = ENTITY_TYPES.register("soulsnare", EntityType.Builder.create(EntitySoulSnare::new, EntityClassification.MISC).setTrackingRange(64).setUpdateInterval(1).size(0.25f, 0.25f)); + public static final EntityTypeRegistryObject BLOOD_LIGHT = ENTITY_TYPES.register("bloodlight", EntityType.Builder.create(EntityBloodLight::new, EntityClassification.MISC).setTrackingRange(64).setUpdateInterval(1).size(0.25f, 0.25f)); +} diff --git a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java new file mode 100644 index 00000000..53f454d7 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java @@ -0,0 +1,33 @@ +package wayoftime.bloodmagic.common.registries; + +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.common.recipe.serializer.AlchemyArrayRecipeSerializer; +import wayoftime.bloodmagic.common.recipe.serializer.BloodAltarRecipeSerializer; +import wayoftime.bloodmagic.common.recipe.serializer.TartaricForgeRecipeSerializer; +import wayoftime.bloodmagic.common.registration.impl.IRecipeSerializerDeferredRegister; +import wayoftime.bloodmagic.common.registration.impl.IRecipeSerializerRegistryObject; +import wayoftime.bloodmagic.recipe.IRecipeAlchemyArray; +import wayoftime.bloodmagic.recipe.IRecipeBloodAltar; +import wayoftime.bloodmagic.recipe.IRecipeTartaricForge; + +public class BloodMagicRecipeSerializers +{ + private BloodMagicRecipeSerializers() + { + + } + + public static final IRecipeSerializerDeferredRegister RECIPE_SERIALIZERS = new IRecipeSerializerDeferredRegister(BloodMagic.MODID); + + public static final IRecipeSerializerRegistryObject ALTAR = RECIPE_SERIALIZERS.register("altar", () -> new BloodAltarRecipeSerializer<>(IRecipeBloodAltar::new)); + public static final IRecipeSerializerRegistryObject ARRAY = RECIPE_SERIALIZERS.register("array", () -> new AlchemyArrayRecipeSerializer<>(IRecipeAlchemyArray::new)); + public static final IRecipeSerializerRegistryObject TARTARIC = RECIPE_SERIALIZERS.register("soulforge", () -> new TartaricForgeRecipeSerializer<>(IRecipeTartaricForge::new)); + +// public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, BloodMagic.MODID); + +// public static final DeferredObject REC = RECIPE_SERIALIZERS.register("test", () -> new BloodAltarRecipeSerializer<>(IRecipeBloodAltar::new)); +// public static final IRecipeSerializerDeferredRegister RECIPE_SERIALIZERS = new IRecipeSerializerDeferredRegister(BloodMagic.MODID); +} diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java new file mode 100644 index 00000000..51cbc160 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java @@ -0,0 +1,130 @@ +package wayoftime.bloodmagic.compat.jei.altar; + +import java.awt.Color; +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.matrix.MatrixStack; + +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.util.ChatUtil; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.NumeralHelper; +import wayoftime.bloodmagic.util.helper.TextHelper; + +public class BloodAltarRecipeCategory implements IRecipeCategory +{ + private static final int INPUT_SLOT = 1; + private static final int OUTPUT_SLOT = 0; + public static final ResourceLocation UID = BloodMagic.rl(Constants.Compat.JEI_CATEGORY_ALTAR); + + @Nonnull + private final IDrawable background; + private final IDrawable icon; +// @Nonnull +// private final ICraftingGridHelper craftingGridHelper; + + public BloodAltarRecipeCategory(IGuiHelper guiHelper) + { + icon = guiHelper.createDrawableIngredient(new ItemStack(BloodMagicBlocks.BLOOD_ALTAR.get())); + background = guiHelper.createDrawable(BloodMagic.rl("gui/jei/altar.png"), 3, 4, 155, 65); +// craftingGridHelper = guiHelper.createCraftingGridHelper(INPUT_SLOT); + } + + @Nonnull + @Override + public ResourceLocation getUid() + { + return UID; + } + + @Override + public List getTooltipStrings(RecipeBloodAltar recipe, double mouseX, double mouseY) + { + List tooltip = Lists.newArrayList(); + + if (mouseX >= 13 && mouseX <= 64 && mouseY >= 27 && mouseY <= 58) + { + tooltip.add(new TranslationTextComponent("jei.bloodmagic.recipe.consumptionrate", ChatUtil.DECIMAL_FORMAT.format(recipe.getConsumeRate()))); + tooltip.add(new TranslationTextComponent("jei.bloodmagic.recipe.drainrate", ChatUtil.DECIMAL_FORMAT.format(recipe.getDrainRate()))); + } + + return tooltip; + } + + @Nonnull + @Override + public String getTitle() + { + return TextHelper.localize("jei.bloodmagic.recipe.altar"); + } + + @Nonnull + @Override + public IDrawable getBackground() + { + return background; + } + + @Nullable + @Override + public IDrawable getIcon() + { + return icon; + } + + @Override + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull RecipeBloodAltar recipe, @Nonnull IIngredients ingredients) + { + IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); + + guiItemStacks.init(OUTPUT_SLOT, false, 125, 30); + guiItemStacks.init(INPUT_SLOT, true, 31, 0); + + guiItemStacks.set(ingredients); + } + + @Override + public Class getRecipeClass() + { + return RecipeBloodAltar.class; + } + + @Override + public void setIngredients(RecipeBloodAltar recipe, IIngredients ingredients) + { + ingredients.setInputIngredients(recipe.getIngredients()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getOutput()); + } + + @Override + public void draw(RecipeBloodAltar recipe, MatrixStack matrixStack, double mouseX, double mouseY) + { + Minecraft mc = Minecraft.getInstance(); + String[] infoString = new String[] + { TextHelper.localize("jei.bloodmagic.recipe.requiredtier", NumeralHelper.toRoman(recipe.getMinimumTier().toInt())), + TextHelper.localize("jei.bloodmagic.recipe.requiredlp", recipe.getSyphon()) }; + mc.fontRenderer.drawString(matrixStack, infoString[0], 90 + - mc.fontRenderer.getStringWidth(infoString[0]) / 2, 0, Color.gray.getRGB()); + mc.fontRenderer.drawString(matrixStack, infoString[1], 90 + - mc.fontRenderer.getStringWidth(infoString[1]) / 2, 10, Color.gray.getRGB()); + } + +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java new file mode 100644 index 00000000..2c8b7332 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java @@ -0,0 +1,93 @@ +package wayoftime.bloodmagic.compat.jei.array; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.common.item.BloodMagicItems; +import wayoftime.bloodmagic.util.Constants; +import wayoftime.bloodmagic.util.helper.TextHelper; + +public class AlchemyArrayCraftingCategory implements IRecipeCategory +{ + private static final int OUTPUT_SLOT = 0; + private static final int INPUT_SLOT = 1; + private static final int CATALYST_SLOT = 2; + public static final ResourceLocation UID = BloodMagic.rl(Constants.Compat.JEI_CATEGORY_ALCHEMYARRAY); + + @Nonnull + private final IDrawable background; + private final IDrawable icon; +// @Nonnull +// private final ICraftingGridHelper craftingGridHelper; + + public AlchemyArrayCraftingCategory(IGuiHelper guiHelper) + { + icon = guiHelper.createDrawableIngredient(new ItemStack(BloodMagicItems.ARCANE_ASHES.get())); + background = guiHelper.createDrawable(BloodMagic.rl("gui/jei/binding.png"), 0, 0, 100, 30); +// craftingGridHelper = guiHelper.createCraftingGridHelper(INPUT_SLOT); + } + + @Nonnull + @Override + public ResourceLocation getUid() + { + return UID; + } + + @Nonnull + @Override + public String getTitle() + { + return TextHelper.localize("jei.bloodmagic.recipe.alchemyarraycrafting"); + } + + @Nonnull + @Override + public IDrawable getBackground() + { + return background; + } + + @Nullable + @Override + public IDrawable getIcon() + { + return icon; + } + + @Override + public void setRecipe(@Nonnull IRecipeLayout recipeLayout, @Nonnull RecipeAlchemyArray recipe, @Nonnull IIngredients ingredients) + { + IGuiItemStackGroup guiItemStacks = recipeLayout.getItemStacks(); + + recipeLayout.getItemStacks().init(OUTPUT_SLOT, false, 73, 5); + recipeLayout.getItemStacks().init(INPUT_SLOT, true, 0, 5); + recipeLayout.getItemStacks().init(CATALYST_SLOT, true, 29, 3); + + guiItemStacks.set(ingredients); + } + + @Override + public Class getRecipeClass() + { + return RecipeAlchemyArray.class; + } + + @Override + public void setIngredients(RecipeAlchemyArray recipe, IIngredients ingredients) + { + ingredients.setInputIngredients(recipe.getIngredients()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getOutput()); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java new file mode 100644 index 00000000..e1af6cee --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java @@ -0,0 +1,53 @@ +package wayoftime.bloodmagic.core.registry; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.tuple.Pair; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.common.alchemyarray.AlchemyArrayEffect; +import wayoftime.bloodmagic.common.alchemyarray.AlchemyArrayEffectCrafting; + +public class AlchemyArrayRegistry +{ + public static Map effectMap = new HashMap(); + + public static boolean registerEffect(ResourceLocation rl, AlchemyArrayEffect effect) + { + boolean hadKey = effectMap.containsKey(rl); + + effectMap.put(rl, effect); + + return hadKey; + } + + public static AlchemyArrayEffect getEffect(World world, ResourceLocation rl, RecipeAlchemyArray recipe) + { + if (effectMap.containsKey(rl)) + { + return effectMap.get(rl).getNewCopy(); + } + + if (!recipe.getOutput().isEmpty()) + { + // Return a new instance of AlchemyEffectCrafting + return new AlchemyArrayEffectCrafting(recipe.getOutput()); + } + + return null; + } + + public static AlchemyArrayEffect getEffect(World world, ItemStack input, ItemStack catalyst) + { + Pair array = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(world, input, catalyst); + if (array == null || array.getRight() == null || !array.getLeft()) + return null; + + return getEffect(world, array.getRight().getId(), array.getRight()); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java new file mode 100644 index 00000000..e346f33f --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java @@ -0,0 +1,67 @@ +package wayoftime.bloodmagic.core.registry; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.tuple.Pair; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import wayoftime.bloodmagic.api.impl.BloodMagicAPI; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.client.render.alchemyarray.AlchemyArrayRenderer; + +public class AlchemyArrayRendererRegistry +{ + @OnlyIn(Dist.CLIENT) + public static final AlchemyArrayRenderer DEFAULT_RENDERER = new AlchemyArrayRenderer(new ResourceLocation("bloodmagic", "textures/models/alchemyarrays/basearray.png")); + + @OnlyIn(Dist.CLIENT) + public static Map rendererMap = new HashMap(); + + /** + * + * @param rl + * @param renderer + * @return True if there was already a renderer registered for this rl. + */ + @OnlyIn(Dist.CLIENT) + public static boolean registerRenderer(ResourceLocation rl, AlchemyArrayRenderer renderer) + { + boolean hadKey = rendererMap.containsKey(rl); + + rendererMap.put(rl, renderer); + + return hadKey; + } + + @OnlyIn(Dist.CLIENT) + public static AlchemyArrayRenderer getRenderer(World world, ResourceLocation rl, RecipeAlchemyArray recipe) + { + if (rendererMap.containsKey(rl)) + { + return rendererMap.get(rl); + } + + ResourceLocation texture = recipe.getTexture(); + if (texture != null) + return new AlchemyArrayRenderer(texture); + + return null; + } + + @OnlyIn(Dist.CLIENT) + public static AlchemyArrayRenderer getRenderer(World world, ItemStack input, ItemStack catalyst) + { + Pair array = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getAlchemyArray(world, input, catalyst); + if (array == null || array.getRight() == null) + { + return null; + } + + return getRenderer(world, array.getRight().getId(), array.getRight()); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/entity/BloodMagicEntities.java b/src/main/java/wayoftime/bloodmagic/entity/BloodMagicEntities.java new file mode 100644 index 00000000..9ae8814d --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/entity/BloodMagicEntities.java @@ -0,0 +1,30 @@ +package wayoftime.bloodmagic.entity; + +import net.minecraft.entity.EntityType; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import wayoftime.bloodmagic.BloodMagic; + +@Mod.EventBusSubscriber(modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class BloodMagicEntities +{ + private BloodMagicEntities() + { + } + + @SubscribeEvent + public static void registerEntities(RegistryEvent.Register> event) + { +// System.out.println("Ow O"); +// event.getRegistry().register(EntityType.Builder.create(EntitySoulSnare::new, EntityClassification.MISC).setTrackingRange(64).setUpdateInterval(1).setShouldReceiveVelocityUpdates(false).setCustomClientFactory(((spawnEntity, world) -> new EntitySoulSnare(EntitySoulSnare.TYPE, world))).build("").setRegistryName(BloodMagic.rl("entitysoulsnare"))); + } + + @SubscribeEvent + public static void registerModels(ModelRegistryEvent evt) + { +// System.out.println("O wO"); +// RenderingRegistry.registerEntityRenderingHandler(BloodMagicEntityTypes.SNARE.getEntityType(), SoulSnareRenderer::new); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/network/BasePacketHandler.java b/src/main/java/wayoftime/bloodmagic/network/BasePacketHandler.java new file mode 100644 index 00000000..74d39066 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/network/BasePacketHandler.java @@ -0,0 +1,151 @@ +package wayoftime.bloodmagic.network; + +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.RegistryKey; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.fml.network.NetworkDirection; +import net.minecraftforge.fml.network.NetworkEvent.Context; +import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.PacketDistributor; +import net.minecraftforge.fml.network.simple.SimpleChannel; + +/** + * Copied liberally from Mekanism. Many thanks to pupnewfster! + * + */ +public abstract class BasePacketHandler +{ + + protected static SimpleChannel createChannel(ResourceLocation name) + { + return NetworkRegistry.ChannelBuilder.named(name).clientAcceptedVersions(getProtocolVersion()::equals).serverAcceptedVersions(getProtocolVersion()::equals).networkProtocolVersion(BasePacketHandler::getProtocolVersion).simpleChannel(); + } + + private static String getProtocolVersion() + { + return "1"; + } + + /** + * Helper for reading strings to make sure we don't accidentally call + * PacketBuffer#readString on the server + */ + public static String readString(PacketBuffer buffer) + { + return buffer.readString(Short.MAX_VALUE); + } + +// public static void log(String log) +// { +// // TODO: Add more logging for packets using this +// if (MekanismConfig.general.logPackets.get()) +// { +// Mekanism.logger.info(log); +// } +// } +// + public static PlayerEntity getPlayer(Supplier context) + { + return context.get().getSender(); + } + + private int index = 0; + + protected abstract SimpleChannel getChannel(); + + public abstract void initialize(); + + protected void registerClientToServer(Class type, BiConsumer encoder, + Function decoder, BiConsumer> consumer) + { + getChannel().registerMessage(index++, type, encoder, decoder, consumer, Optional.of(NetworkDirection.PLAY_TO_SERVER)); + } + + protected void registerServerToClient(Class type, BiConsumer encoder, + Function decoder, BiConsumer> consumer) + { + getChannel().registerMessage(index++, type, encoder, decoder, consumer, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); + } + + /** + * Send this message to the specified player. + * + * @param message - the message to send + * @param player - the player to send it to + */ + public void sendTo(MSG message, ServerPlayerEntity player) + { + getChannel().sendTo(message, player.connection.getNetworkManager(), NetworkDirection.PLAY_TO_CLIENT); + } + + /** + * Send this message to everyone connected to the server. + * + * @param message - message to send + */ + public void sendToAll(MSG message) + { + getChannel().send(PacketDistributor.ALL.noArg(), message); + } + + /** + * Send this message to everyone within the supplied dimension. + * + * @param message - the message to send + * @param dimension - the dimension to target + */ + public void sendToDimension(MSG message, RegistryKey dimension) + { + getChannel().send(PacketDistributor.DIMENSION.with(() -> dimension), message); + } + + /** + * Send this message to the server. + * + * @param message - the message to send + */ + public void sendToServer(MSG message) + { + getChannel().sendToServer(message); + } + + public void sendToAllTracking(MSG message, Entity entity) + { + getChannel().send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), message); + } + + public void sendToAllTracking(MSG message, TileEntity tile) + { + sendToAllTracking(message, tile.getWorld(), tile.getPos()); + } + + public void sendToAllTracking(MSG message, World world, BlockPos pos) + { + if (world instanceof ServerWorld) + { + // If we have a ServerWorld just directly figure out the ChunkPos so as to not + // require looking up the chunk + // This provides a decent performance boost over using the packet distributor + ((ServerWorld) world).getChunkProvider().chunkManager.getTrackingPlayers(new ChunkPos(pos), false).forEach(p -> sendTo(message, p)); + } else + { + // Otherwise fallback to entities tracking the chunk if some mod did something + // odd and our world is not a ServerWorld + getChannel().send(PacketDistributor.TRACKING_CHUNK.with(() -> world.getChunk(pos.getX() >> 4, pos.getZ() >> 4)), message); + } + } + +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java new file mode 100644 index 00000000..8e4cd60a --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/potion/BloodMagicPotions.java @@ -0,0 +1,16 @@ +package wayoftime.bloodmagic.potion; + +import net.minecraft.potion.Effect; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.registries.IForgeRegistry; + +public class BloodMagicPotions +{ + public static final Effect soulSnare = new PotionSoulSnare(); + + public static void registerPotions(RegistryEvent.Register evt) + { + IForgeRegistry reg = evt.getRegistry(); + reg.register(soulSnare.setRegistryName("soulsnare")); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/potion/PotionSoulSnare.java b/src/main/java/wayoftime/bloodmagic/potion/PotionSoulSnare.java new file mode 100644 index 00000000..34e0cc68 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/potion/PotionSoulSnare.java @@ -0,0 +1,11 @@ +package wayoftime.bloodmagic.potion; + +import net.minecraft.potion.EffectType; + +public class PotionSoulSnare extends PotionBloodMagic +{ + public PotionSoulSnare() + { + super(EffectType.NEUTRAL, 0xFFFFFF); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java new file mode 100644 index 00000000..414c3647 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java @@ -0,0 +1,31 @@ +package wayoftime.bloodmagic.recipe; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.impl.recipe.RecipeAlchemyArray; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; +import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; + +public class IRecipeAlchemyArray extends RecipeAlchemyArray +{ + public IRecipeAlchemyArray(ResourceLocation id, ResourceLocation texture, Ingredient baseIngredient, Ingredient addedIngredient, ItemStack result) + { + super(id, texture, baseIngredient, addedIngredient, result); + } + + @Override + public IRecipeSerializer getSerializer() + { + return BloodMagicRecipeSerializers.ARRAY.getRecipeSerializer(); + } + + @Override + public IRecipeType getType() + { + return BloodMagicRecipeType.ARRAY; + } + +} diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java new file mode 100644 index 00000000..ae6a87bf --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java @@ -0,0 +1,30 @@ +package wayoftime.bloodmagic.recipe; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.impl.recipe.RecipeBloodAltar; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; +import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; + +public class IRecipeBloodAltar extends RecipeBloodAltar +{ + public IRecipeBloodAltar(ResourceLocation id, Ingredient input, ItemStack output, int minimumTier, int syphon, int consumeRate, int drainRate) + { + super(id, input, output, minimumTier, syphon, consumeRate, drainRate); + } + + @Override + public IRecipeSerializer getSerializer() + { + return BloodMagicRecipeSerializers.ALTAR.getRecipeSerializer(); + } + + @Override + public IRecipeType getType() + { + return BloodMagicRecipeType.ALTAR; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java new file mode 100644 index 00000000..71ce5276 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java @@ -0,0 +1,35 @@ +package wayoftime.bloodmagic.recipe; + +import java.util.List; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.ResourceLocation; +import wayoftime.bloodmagic.api.impl.recipe.RecipeTartaricForge; +import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType; +import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers; + +public class IRecipeTartaricForge extends RecipeTartaricForge +{ + public IRecipeTartaricForge(ResourceLocation id, @Nonnull List input, @Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain) + { + super(id, input, output, minimumSouls, soulDrain); + } + + @Override + public IRecipeSerializer getSerializer() + { + return BloodMagicRecipeSerializers.TARTARIC.getRecipeSerializer(); + } + + @Override + public IRecipeType getType() + { + return BloodMagicRecipeType.TARTARICFORGE; + } +} diff --git a/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerSoulForge.java b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerSoulForge.java new file mode 100644 index 00000000..cb242cbc --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/tile/contailer/ContainerSoulForge.java @@ -0,0 +1,154 @@ +package wayoftime.bloodmagic.tile.contailer; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.IIntArray; +import net.minecraft.util.IntArray; +import wayoftime.bloodmagic.common.block.BloodMagicBlocks; +import wayoftime.bloodmagic.tile.TileSoulForge; +import wayoftime.bloodmagic.will.IDemonWill; +import wayoftime.bloodmagic.will.IDemonWillGem; + +public class ContainerSoulForge extends Container +{ + public final IInventory tileForge; + public final IIntArray data; + +// public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileForge) +// { +// this.tileForge = tileForge; +// +// } + + public ContainerSoulForge(int windowId, PlayerInventory playerInventory, PacketBuffer extraData) + { + this((TileSoulForge) playerInventory.player.world.getTileEntity(extraData.readBlockPos()), new IntArray(5), windowId, playerInventory); + } + + public ContainerSoulForge(@Nullable TileSoulForge tile, IIntArray data, int windowId, PlayerInventory playerInventory) + { + super(BloodMagicBlocks.SOUL_FORGE_CONTAINER.get(), windowId); + this.tileForge = tile; + this.setup(playerInventory, tile); + this.data = data; + } + + public void setup(PlayerInventory inventory, IInventory tileForge) + { + this.addSlot(new Slot(tileForge, 0, 8, 15)); + this.addSlot(new Slot(tileForge, 1, 80, 15)); + this.addSlot(new Slot(tileForge, 2, 8, 87)); + this.addSlot(new Slot(tileForge, 3, 80, 87)); + this.addSlot(new SlotSoul(tileForge, TileSoulForge.soulSlot, 152, 51)); + this.addSlot(new SlotOutput(tileForge, TileSoulForge.outputSlot, 44, 51)); + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlot(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 123 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlot(new Slot(inventory, i, 8 + i * 18, 181)); + } + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) + { + ItemStack itemstack = ItemStack.EMPTY; + Slot slot = this.inventorySlots.get(index); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (index == 5) + { + if (!this.mergeItemStack(itemstack1, 6, 6 + 36, true)) + { + return ItemStack.EMPTY; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (index > 5) + { + if (itemstack1.getItem() instanceof IDemonWill || itemstack1.getItem() instanceof IDemonWillGem) + { + if (!this.mergeItemStack(itemstack1, 4, 5, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 0, 4, false)) + { + return ItemStack.EMPTY; + } + } else if (!this.mergeItemStack(itemstack1, 6, 42, false)) + { + return ItemStack.EMPTY; + } + + if (itemstack1.getCount() == 0) + { + slot.putStack(ItemStack.EMPTY); + } else + { + slot.onSlotChanged(); + } + + if (itemstack1.getCount() == itemstack.getCount()) + { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, itemstack1); + } + + return itemstack; + } + + @Override + public boolean canInteractWith(PlayerEntity playerIn) + { + return this.tileForge.isUsableByPlayer(playerIn); + } + + private class SlotSoul extends Slot + { + public SlotSoul(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + return itemStack.getItem() instanceof IDemonWillGem || itemStack.getItem() instanceof IDemonWill; + } + } + + private class SlotOutput extends Slot + { + public SlotOutput(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack) + { + return false; + } + } +} diff --git a/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java new file mode 100644 index 00000000..21997641 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java @@ -0,0 +1,99 @@ +package wayoftime.bloodmagic.will; + +import java.util.HashMap; +import java.util.Map.Entry; + +import net.minecraft.nbt.CompoundNBT; + +public class DemonWillHolder +{ + public HashMap willMap = new HashMap<>(); + + public double addWill(EnumDemonWillType type, double amount, double max) + { + double current = 0; + if (willMap.containsKey(type)) + { + current = willMap.get(type); + } + + double added = Math.min(max - current, amount); + addWill(type, amount); + + return added; + } + + public void addWill(EnumDemonWillType type, double amount) + { + if (willMap.containsKey(type)) + { + willMap.put(type, amount + willMap.get(type)); + } else + { + willMap.put(type, amount); + } + } + + public double drainWill(EnumDemonWillType type, double amount) + { + if (willMap.containsKey(type)) + { + double current = willMap.get(type); + double reduced = Math.min(current, amount); + + if (reduced >= current) + { + willMap.remove(type); + } else + { + willMap.put(type, current - reduced); + } + + return reduced; + } + + return 0; + } + + public double getWill(EnumDemonWillType type) + { + if (willMap.containsKey(type)) + { + return willMap.get(type); + } + + return 0; + } + + public void readFromNBT(CompoundNBT tag, String key) + { + CompoundNBT willTag = tag.getCompound(key); + + willMap.clear(); + + for (EnumDemonWillType type : EnumDemonWillType.values()) + { + double amount = willTag.getDouble("EnumWill" + type.name()); + if (amount > 0) + { + willMap.put(type, amount); + } + } + } + + public void writeToNBT(CompoundNBT tag, String key) + { + CompoundNBT willTag = new CompoundNBT(); + for (Entry entry : willMap.entrySet()) + { + willTag.putDouble("EnumWill" + entry.getKey().name(), entry.getValue()); + } + + tag.put(key, willTag); + } + + public void clearWill() + { + willMap.clear(); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java b/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java new file mode 100644 index 00000000..3bd96e39 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java @@ -0,0 +1,33 @@ +package wayoftime.bloodmagic.will; + +import java.util.Locale; + +import net.minecraft.util.IStringSerializable; + +public enum EnumDemonWillType implements IStringSerializable +{ + DEFAULT("default"), + CORROSIVE("corrosive"), + DESTRUCTIVE("destructive"), + VENGEFUL("vengeful"), + STEADFAST("steadfast"); + + public final String name; + + EnumDemonWillType(String name) + { + this.name = name; + } + + @Override + public String toString() + { + return name().toLowerCase(Locale.ENGLISH); + } + + @Override + public String getString() + { + return this.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWill.java b/src/main/java/wayoftime/bloodmagic/will/IDemonWill.java new file mode 100644 index 00000000..3234d1fd --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/IDemonWill.java @@ -0,0 +1,45 @@ +package wayoftime.bloodmagic.will; + +import net.minecraft.item.ItemStack; + +public interface IDemonWill +{ + /** + * Obtains the amount of Will an ItemStack contains. + * + * @param willStack - The stack to retrieve the Will from + * @return - The amount of Will an ItemStack contains + */ + double getWill(EnumDemonWillType type, ItemStack willStack); + + /** + * Sets the amount of Will in a given ItemStack. + * + * @param willStack - The ItemStack of the Will + * @param will - The amount of will to set the stack to + * @return True if successfully set. + */ + boolean setWill(EnumDemonWillType type, ItemStack willStack, double will); + + /** + * Drains the demonic will from the willStack. If all of the will is drained, + * the willStack will be removed. + * + * @param willStack - The ItemStack of the will + * @param drainAmount - The amount of Will to drain + * @return The amount of will drained. + */ + double drainWill(EnumDemonWillType type, ItemStack willStack, double drainAmount); + + /** + * Creates a new ItemStack with the specified number of will. Implementation + * should respect the number requested. + * + * @param meta - The meta of the ItemStack to create + * @param number - The amount of Will to create the Stack with. + * @return - An ItemStack with the set amount of Will + */ + ItemStack createWill(double number); + + EnumDemonWillType getType(ItemStack stack); +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java b/src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java new file mode 100644 index 00000000..61fa7138 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java @@ -0,0 +1,19 @@ +package wayoftime.bloodmagic.will; + +/** + * Implement this interface on a block that can accept and store Demonic Will. + */ +public interface IDemonWillConduit +{ + int getWeight(); + + double fillDemonWill(EnumDemonWillType type, double amount, boolean doFill); + + double drainDemonWill(EnumDemonWillType type, double amount, boolean doDrain); + + boolean canFill(EnumDemonWillType type); + + boolean canDrain(EnumDemonWillType type); + + double getCurrentWill(EnumDemonWillType type); +} diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java b/src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java new file mode 100644 index 00000000..e1f9a799 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java @@ -0,0 +1,29 @@ +package wayoftime.bloodmagic.will; + +import net.minecraft.item.ItemStack; + +public interface IDemonWillGem +{ + /** + * @param willGemStack - The ItemStack for this demon will gem. + * @param willStack - The ItemStack for the will. Item should extend + * IDemonWill + * @return - The remainder willStack after the will has been absorbed into the + * gem. Return null if there is no will left in the stack. + */ + ItemStack fillDemonWillGem(ItemStack willGemStack, ItemStack willStack); + + /** + * Returns the number of souls that are left in the soul gem. Returns a double + * because souls can be fractionally drained. + */ + double getWill(EnumDemonWillType type, ItemStack willGemStack); + + void setWill(EnumDemonWillType type, ItemStack willGemStack, double amount); + + int getMaxWill(EnumDemonWillType type, ItemStack willGemStack); + + double drainWill(EnumDemonWillType type, ItemStack stack, double drainAmount, boolean doDrain); + + double fillWill(EnumDemonWillType type, ItemStack stack, double fillAmount, boolean doFill); +} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java b/src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java new file mode 100644 index 00000000..e74f7ac5 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java @@ -0,0 +1,11 @@ +package wayoftime.bloodmagic.will; + +import java.util.List; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; + +public interface IDemonWillWeapon +{ + List getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting); +} diff --git a/src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java b/src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java new file mode 100644 index 00000000..9388ce13 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java @@ -0,0 +1,41 @@ +package wayoftime.bloodmagic.will; + +import net.minecraft.item.ItemStack; + +public interface IDiscreteDemonWill +{ + /** + * Obtains the amount of Will an ItemStack contains. + * + * @param soulStack - The stack to retrieve the Will from + * @return - The amount of Will an ItemStack contains + */ + double getWill(ItemStack soulStack); + + /** + * Drains the demonic will from the willStack. If all of the will is drained, + * the willStack will be removed. Will only drain in discrete amounts, + * determined by getDiscretization. + * + * @param willStack - The ItemStack of the will + * @param drainAmount - The amount of Will to drain + * @return The amount of will drained. + */ + double drainWill(ItemStack willStack, double drainAmount); + + /** + * Gets the discrete number for this demonic will. + * + * @param willStack - The ItemStack of the will + * @return - The discrete number for the given stack. + */ + double getDiscretization(ItemStack willStack); + + /** + * Obtains the type of will this is. + * + * @param willStack - The ItemStack of the will + * @return - The type of will this is. + */ + EnumDemonWillType getType(ItemStack willStack); +} diff --git a/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java b/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java new file mode 100644 index 00000000..1576c5e2 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java @@ -0,0 +1,200 @@ +package wayoftime.bloodmagic.will; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import wayoftime.bloodmagic.util.helper.NetworkHelper; + +/** + * This class provides several helper methods in order to handle soul + * consumption and use for a player. This refers to the Soul System, meaning + * Monster Souls and Soul Gems, etc. The Soul Network's helper methods are found + * in {@link NetworkHelper} + */ +public class PlayerDemonWillHandler +{ + /** + * Gets the total amount of Will a player contains in their inventory + * + * @param type - The type of Will to check for + * @param player - The player to check the will of + * @return - The amount of will the player contains + */ + public static double getTotalDemonWill(EnumDemonWillType type, PlayerEntity player) + { + NonNullList inventory = player.inventory.mainInventory; + double souls = 0; + + for (ItemStack stack : inventory) + { + if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) + { + souls += ((IDemonWill) stack.getItem()).getWill(type, stack); + } else if (stack.getItem() instanceof IDemonWillGem) + { + souls += ((IDemonWillGem) stack.getItem()).getWill(type, stack); + } + } + + return souls; + } + + public static EnumDemonWillType getLargestWillType(PlayerEntity player) + { + EnumDemonWillType type = EnumDemonWillType.DEFAULT; + double max = getTotalDemonWill(type, player); + + for (EnumDemonWillType testType : EnumDemonWillType.values()) + { + double value = getTotalDemonWill(testType, player); + if (value > max) + { + type = testType; + } + } + + return type; + } + + /** + * Checks if the player's Tartaric gems are completely full. + * + * @param type - The type of Will to check for + * @param player - The player to check the Will of + * @return - True if all Will containers are full, false if not. + */ + public static boolean isDemonWillFull(EnumDemonWillType type, PlayerEntity player) + { + NonNullList inventory = player.inventory.mainInventory; + + boolean hasGem = false; + for (ItemStack stack : inventory) + { + if (stack.getItem() instanceof IDemonWillGem) + { + hasGem = true; + if (((IDemonWillGem) stack.getItem()).getWill(type, stack) < ((IDemonWillGem) stack.getItem()).getMaxWill(type, stack)) + return false; + } + } + + return hasGem; + } + + /** + * Consumes Will from the inventory of a given player + * + * @param player - The player to consume the will of + * @param amount - The amount of will to consume + * @return - The amount of will consumed. + */ + public static double consumeDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) + { + double consumed = 0; + + NonNullList inventory = player.inventory.mainInventory; + + for (int i = 0; i < inventory.size(); i++) + { + if (consumed >= amount) + return consumed; + + ItemStack stack = inventory.get(i); + if (stack.getItem() instanceof IDemonWill && ((IDemonWill) stack.getItem()).getType(stack) == type) + { + consumed += ((IDemonWill) stack.getItem()).drainWill(type, stack, amount - consumed); + if (((IDemonWill) stack.getItem()).getWill(type, stack) <= 0) + inventory.set(i, ItemStack.EMPTY); + } else if (stack.getItem() instanceof IDemonWillGem) + { + consumed += ((IDemonWillGem) stack.getItem()).drainWill(type, stack, amount - consumed, true); + } + } + + return consumed; + } + + /** + * Adds an IDemonWill contained in an ItemStack to one of the Soul Gems in the + * player's inventory. + * + * @param player - The player to add will to + * @param willStack - ItemStack that contains an IDemonWill to be added + * @return - The modified willStack + */ + public static ItemStack addDemonWill(PlayerEntity player, ItemStack willStack) + { + if (willStack.isEmpty()) + return ItemStack.EMPTY; + + NonNullList inventory = player.inventory.mainInventory; + + for (ItemStack stack : inventory) + { + if (stack.getItem() instanceof IDemonWillGem) + { + ItemStack newStack = ((IDemonWillGem) stack.getItem()).fillDemonWillGem(stack, willStack); + if (newStack.isEmpty()) + return ItemStack.EMPTY; + } + } + + return willStack; + } + + /** + * Adds an IDiscreteDemonWill contained in an ItemStack to one of the Soul Gems + * in the player's inventory. + * + * @param type - The type of Will to add + * @param player - The player to check the Will of + * @param amount - The amount of will to add + * @return - The amount of will added + */ + public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount) + { + NonNullList inventory = player.inventory.mainInventory; + double remaining = amount; + + for (ItemStack stack : inventory) + { + if (stack.getItem() instanceof IDemonWillGem) + { + remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); + if (remaining <= 0) + break; + } + } + + return amount - remaining; + } + + /** + * Adds an IDiscreteDemonWill contained in an ItemStack to one of the Soul Gems + * in the player's inventory while ignoring a specified stack. + * + * @param type - The type of Will to add + * @param player - The player to check the Will of + * @param amount - The amount of will to add + * @param ignored - A stack to ignore + * @return - The amount of will added + */ + public static double addDemonWill(EnumDemonWillType type, PlayerEntity player, double amount, ItemStack ignored) + { + NonNullList inventory = player.inventory.mainInventory; + double remaining = amount; + + for (ItemStack stack : inventory) + { + if (!stack.equals(ignored) && stack.getItem() instanceof IDemonWillGem) + { + remaining -= ((IDemonWillGem) stack.getItem()).fillWill(type, stack, remaining, true); + + if (remaining <= 0) + break; + } + } + + return amount - remaining; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..fab0e4b1 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,59 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion="[34,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="All rights reserved" +# A URL to refer people to when problems occur with this mod +issueTrackerURL="http://my.issue.tracker/" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="bloodmagic" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +version="${file.jarVersion}" #mandatory + # A display name for the mod +displayName="Blood Magic" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +logoFile="examplemod.png" #optional +# A text field displayed in the mod UI +credits="Thanks for this example mod goes to Java" #optional +# A text field displayed in the mod UI +authors="WayofTime" #optional +# The description text for the mod (multi line!) (#mandatory) +description=''' +This is a long form description of the mod. You can write whatever you want here + +Have some lorem ipsum. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. +''' +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.examplemod]] #optional + # the modid of the dependency + modId="forge" #mandatory + # Does this dependency have to exist - if not, ordering below must be specified + mandatory=true #mandatory + # The version range of the dependency + versionRange="[34,)" #mandatory + # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT or SERVER + side="BOTH" +# Here's another dependency +[[dependencies.examplemod]] + modId="minecraft" + mandatory=true + versionRange="[1.16.3]" + ordering="NONE" + side="BOTH" diff --git a/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json b/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json deleted file mode 100644 index 16d07d04..00000000 --- a/src/main/resources/assets/bloodmagic/armatures/block/pillar_mid.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "joints": { - "ring": { "0": [ 1.0 ], "1": [ 1.0 ], "2": [ 1.0 ], "3": [ 1.0 ], "4": [ 1.0 ], "5": [ 1.0 ], "6": [ 1.0 ], "7": [ 1.0 ], "8": [ 1.0 ], "9": [ 1.0 ], "10": [ 1.0 ], "11": [ 1.0 ], "12": [ 1.0 ], "13": [ 1.0 ], "14": [ 1.0 ], "15": [ 1.0 ], "16": [ 1.0 ], "17": [ 1.0 ], "18": [ 1.0 ], "19": [ 1.0 ], "20": [ 1.0 ], "21": [ 1.0 ], "22": [ 1.0 ] } - }, - "clips": { - "default": { - "loop": false, - "joint_clips": {}, - "events": {} - }, - "moving": { - "loop": true, - "joint_clips": { - "ring": [ - { - "variable": "offset_y", - "type": "uniform", - "interpolation": "linear", - "samples": [ -0.0625, -0.0442, 0, 0.0442, 0.0625, 0.0442, 0, -0.0442 ] - }, - { - "variable": "axis_y", - "type": "uniform", - "interpolation": "nearest", - "samples": [ 1 ] - }, - { - "variable": "angle", - "type": "uniform", - "interpolation": "linear", - "samples": [ - 0, 120, 240 - ] - } - ] - }, - "events": { - - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json b/src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json deleted file mode 100644 index 2ebde5e6..00000000 --- a/src/main/resources/assets/bloodmagic/asms/block/inversion_pillar.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "parameters": { - "clip_time": [ "-/", "#offset", "#cycle_length" ] - }, - "clips": { - "moving": [ "apply", "bloodmagic:block/pillar_mid@moving", "#clip_time" ] - }, - "states": [ - "moving" - ], - "transitions": {}, - "start_state": "moving" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json deleted file mode 100644 index b5535ec3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/activation_crystal.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "weak": { - "textures": { - "layer0": "bloodmagic:items/activationCrystalWeak" - } - }, - "awakened": { - "textures": { - "layer0": "bloodmagic:items/activationCrystalAwakened" - } - }, - "creative": { - "textures": { - "layer0": "bloodmagic:items/activationCrystalCreative" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json b/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json deleted file mode 100644 index 74f8af30..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/alchemic_vial.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/Alchemic_Liquid", - "layer1": "bloodmagic:items/Alchemic_Vial", - "layer2": "bloodmagic:items/Alchemic_Ribbon" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json b/src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json index 03ba5c90..38eed1f0 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json +++ b/src/main/resources/assets/bloodmagic/blockstates/alchemy_array.json @@ -1,10 +1,7 @@ { "variants": { - "normal": { - "model": "bloodmagic:BlockAlchemyArray", - "textures": { - "all": "bloodmagic:models/AlchemyArrays/StupidArray" - } + "": { + "model": "bloodmagic:block/blockalchemyarray" } } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json b/src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json deleted file mode 100644 index d1d44534..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/alchemy_table.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:ModelAlchemyTable.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block", - "uvlock": true - }, - "variants": { - "direction": { - "down": { - }, - "up": { - }, - "north": { - "transform": { - "rotation": {"y": -90} - } - }, - "south": { - "transform": { - "rotation": {"y": 90} - } - }, - "east": { - "transform": { - "rotation": {"y": 180} - } - }, - "west": { - - } - }, - "invisible": { - "true": { - "model": "cube_all", - "textures": { - "all": "bloodmagic:blocks/empty" - } - }, - "false": { - - } - }, - "inventory": [{ - - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/altar.json b/src/main/resources/assets/bloodmagic/blockstates/altar.json index 7fa4988e..256d4acd 100644 --- a/src/main/resources/assets/bloodmagic/blockstates/altar.json +++ b/src/main/resources/assets/bloodmagic/blockstates/altar.json @@ -1,22 +1,7 @@ { - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockAltar.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, "variants": { - "normal": [{ - } - ], - "powered=true": [ - { - } - ], - "powered=false": [ - { - - }] + "": { + "model": "bloodmagic:block/bloodaltar" } + } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/altar_maker.json b/src/main/resources/assets/bloodmagic/blockstates/altar_maker.json deleted file mode 100644 index d9853286..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/altar_maker.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "altarmaker": { - "textures": { - "layer0": "bloodmagic:items/AltarMaker" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json b/src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json deleted file mode 100644 index df9edd3c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/arcane_ashes.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "arcaneashes": { - "textures": { - "layer0": "bloodmagic:items/ArcaneAshes" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json b/src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json deleted file mode 100644 index 430e8f47..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/base_fluid_filter.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "exact": { - "textures": { - "layer0": "bloodmagic:items/FluidRouterFilterExact" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json b/src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json deleted file mode 100644 index afe3e19d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/base_item_filter.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "exact": { - "textures": { - "layer0": "bloodmagic:items/ItemRouterFilterExact" - } - }, - "ignorenbt": { - "textures": { - "layer0": "bloodmagic:items/ItemRouterFilterIgnoreNBT" - } - }, - "moditems": { - "textures": { - "layer0": "bloodmagic:items/ItemRouterFilterModItems" - } - }, - "oredict": { - "textures": { - "layer0": "bloodmagic:items/ItemRouterFilterOreDict" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_light.json b/src/main/resources/assets/bloodmagic/blockstates/blood_light.json deleted file mode 100644 index c67139da..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_light.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "normal": { - "model": "bloodmagic:BlockBloodLight", - "textures": { - "all": "bloodmagic:blocks/BlockBloodLight" - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json b/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json deleted file mode 100644 index a5c42df5..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_orb.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "weak": { - "textures": { - "layer0": "bloodmagic:items/weakbloodorb" - } - }, - "apprentice": { - "textures": { - "layer0": "bloodmagic:items/apprenticebloodorb" - } - }, - "magician": { - "textures": { - "layer0": "bloodmagic:items/magicianbloodorb" - } - }, - "master": { - "textures": { - "layer0": "bloodmagic:items/masterbloodorb" - } - }, - "archmage": { - "textures": { - "layer0": "bloodmagic:items/archmagebloodorb" - } - }, - "transcendent": { - "textures": { - "layer0": "bloodmagic:items/transcendentbloodorb" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json b/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json deleted file mode 100644 index 80973833..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_rune.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "blank": { - "textures": { - "all": "bloodmagic:blocks/BlankRune" - } - }, - "speed": { - "textures": { - "all": "bloodmagic:blocks/SpeedRune" - } - }, - "efficiency": { - "textures": { - "all": "bloodmagic:blocks/EfficiencyRune" - } - }, - "sacrifice": { - "textures": { - "all": "bloodmagic:blocks/RuneOfSacrifice" - } - }, - "self_sacrifice": { - "textures": { - "all": "bloodmagic:blocks/RuneOfSelfSacrifice" - } - }, - "displacement": { - "textures": { - "all": "bloodmagic:blocks/DislocationRune" - } - }, - "capacity": { - "textures": { - "all": "bloodmagic:blocks/AltarCapacityRune" - } - }, - "augmented_capacity": { - "textures": { - "all": "bloodmagic:blocks/BetterCapacityRune" - } - }, - "orb": { - "textures": { - "all": "bloodmagic:blocks/OrbCapacityRune" - } - }, - "acceleration": { - "textures": { - "all": "bloodmagic:blocks/AccelerationRune" - } - }, - "charging": { - "textures": { - "all": "bloodmagic:blocks/ChargingRune" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_shard.json b/src/main/resources/assets/bloodmagic/blockstates/blood_shard.json deleted file mode 100644 index 4cf72004..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_shard.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "weak": { - "textures": { - "layer0": "bloodmagic:items/WeakBloodShard" - } - }, - "demonic": { - "textures": { - "layer0": "bloodmagic:items/DemonBloodShard" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/blood_tank.json b/src/main/resources/assets/bloodmagic/blockstates/blood_tank.json deleted file mode 100644 index d71d03f6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/blood_tank.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { "all": "bloodmagic:blocks/BloodTank" }, - "model": "bloodmagic:BlockBloodTank", - "uvlock": true - }, - "variants": { - "tier": { - "0": {}, - "1": {}, - "2": {}, - "3": {}, - "4": {}, - "5": {}, - "6": {}, - "7": {}, - "8": {}, - "9": {}, - "10": {}, - "11": {}, - "12": {}, - "13": {}, - "14": {}, - "15": {} - }, - "inventory": [{}] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/bound_axe.json b/src/main/resources/assets/bloodmagic/blockstates/bound_axe.json deleted file mode 100644 index dc27b28a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/bound_axe.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "active": { - "true": { - "textures": { - "layer0": "bloodmagic:items/BoundAxe_activated" - } - }, - "false": { - "textures": { - "layer0": "bloodmagic:items/Item_deactivated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json deleted file mode 100644 index 6acaacca..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/bound_pickaxe.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "active": { - "true": { - "textures": { - "layer0": "bloodmagic:items/BoundPickaxe_activated" - } - }, - "false": { - "textures": { - "layer0": "bloodmagic:items/Item_deactivated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json b/src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json deleted file mode 100644 index adba2311..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/bound_shovel.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "active": { - "true": { - "textures": { - "layer0": "bloodmagic:items/BoundShovel_activated" - } - }, - "false": { - "textures": { - "layer0": "bloodmagic:items/Item_deactivated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/bound_sword.json b/src/main/resources/assets/bloodmagic/blockstates/bound_sword.json deleted file mode 100644 index ae592f33..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/bound_sword.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "active": { - "true": { - "textures": { - "layer0": "bloodmagic:items/BoundSword_activated" - } - }, - "false": { - "textures": { - "layer0": "bloodmagic:items/Item_deactivated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/component.json b/src/main/resources/assets/bloodmagic/blockstates/component.json deleted file mode 100644 index 898f699e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/component.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "frame_part": { - "textures": { - "layer0": "bloodmagic:items/ComponentFrameParts" - } - }, - "sand_iron": { - "textures": { - "layer0": "bloodmagic:items/IronSand" - } - }, - "sand_gold": { - "textures": { - "layer0": "bloodmagic:items/GoldSand" - } - }, - "sand_coal": { - "textures": { - "layer0": "bloodmagic:items/CoalSand" - } - }, - "plant_oil": { - "textures": { - "layer0": "bloodmagic:items/PlantOil" - } - }, - "sulfur": { - "textures": { - "layer0": "bloodmagic:items/Sulfur" - } - }, - "saltpeter": { - "textures": { - "layer0": "bloodmagic:items/Saltpeter" - } - }, - "neuro_toxin": { - "textures": { - "layer0": "bloodmagic:items/NeuroToxin" - } - }, - "antiseptic": { - "textures": { - "layer0": "bloodmagic:items/Antiseptic" - } - }, - "catalyst_length_1": { - "textures": { - "layer0": "bloodmagic:items/MundaneLengtheningCatalyst" - } - }, - "catalyst_power_1": { - "textures": { - "layer0": "bloodmagic:items/MundanePowerCatalyst" - } - }, - "reagent_water": { - "textures": { - "layer0": "bloodmagic:items/ReagentWater" - } - }, - "reagent_lava": { - "textures": { - "layer0": "bloodmagic:items/ReagentLava" - } - }, - "reagent_air": { - "textures": { - "layer0": "bloodmagic:items/ReagentAir" - } - }, - "reagent_fast_miner": { - "textures": { - "layer0": "bloodmagic:items/ReagentFastMiner" - } - }, - "reagent_void": { - "textures": { - "layer0": "bloodmagic:items/ReagentVoid" - } - }, - "reagent_growth": { - "textures": { - "layer0": "bloodmagic:items/ReagentGrowth" - } - }, - "reagent_affinity": { - "textures": { - "layer0": "bloodmagic:items/ReagentAffinity" - } - }, - "reagent_sight": { - "textures": { - "layer0": "bloodmagic:items/ReagentSight" - } - }, - "reagent_binding": { - "textures": { - "layer0": "bloodmagic:items/ReagentBinding" - } - }, - "reagent_suppression": { - "textures": { - "layer0": "bloodmagic:items/ReagentSuppression" - } - }, - "reagent_blood_light": { - "textures": { - "layer0": "bloodmagic:items/ReagentBloodLight" - } - }, - "reagent_magnetism": { - "textures": { - "layer0": "bloodmagic:items/ReagentMagnetism" - } - }, - "reagent_haste": { - "textures": { - "layer0": "bloodmagic:items/ReagentHaste" - } - }, - "reagent_compression": { - "textures": { - "layer0": "bloodmagic:items/ReagentCompression" - } - }, - "reagent_bridge": { - "textures": { - "layer0": "bloodmagic:items/ReagentBridge" - } - }, - "reagent_severance": { - "textures": { - "layer0": "bloodmagic:items/ReagentSeverance" - } - }, - "reagent_teleposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTeleposition" - } - }, - "reagent_transposition": { - "textures": { - "layer0": "bloodmagic:items/ReagentTransposition" - } - }, - "reagent_holding": { - "textures": { - "layer0": "bloodmagic:items/ReagentHolding" - } - }, - "reagent_claw": { - "textures": { - "layer0": "bloodmagic:items/ReagentClaw" - } - }, - "reagent_bounce": { - "textures": { - "layer0": "bloodmagic:items/ReagentBounce" - } - }, - "reagent_frost": { - "textures": { - "layer0": "bloodmagic:items/ReagentFrost" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json b/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json deleted file mode 100644 index 0d733140..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/cutting_fluid.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "basic": { - "textures": { - "layer0": "bloodmagic:items/BasicCuttingFluid" - } - }, - "explosive": { - "textures": { - "layer0": "bloodmagic:items/ExplosivePowder" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json deleted file mode 100644 index 5cae9434..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/dagger_of_sacrifice.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/DaggerOfSacrifice" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json b/src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json deleted file mode 100644 index 00970ac6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/decorative_brick.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "bloodstone_tile": { - "textures": { - "all": "bloodmagic:blocks/LargeBloodStoneBrick" - } - }, - "bloodstone_brick": { - "textures": { - "all": "bloodmagic:blocks/BloodStoneBrick" - } - }, - "crystal_tile": { - "textures": { - "all": "bloodmagic:blocks/shardcluster" - } - }, - "crystal_brick": { - "textures": { - "all": "bloodmagic:blocks/shardclusterbrick" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json deleted file mode 100644 index bff693ef..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_brick_1.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type=brick1_raw": [ - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick1"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick2"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick3"}} - ], - "type=brick1_corrosive": [ - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick1_c"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick2_c"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick3_c"}} - ], - "type=brick1_destructive": [ - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick1_d"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick2_d"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick3_d"}} - ], - "type=brick1_vengeful": [ - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick1_v"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick2_v"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick3_v"}} - ], - "type=brick1_steadfast": [ - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick1_s"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick2_s"}}, - {"textures": {"all": "bloodmagic:blocks/dungeon/dungeon_brick3_s"}} - ] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json deleted file mode 100644 index deef552c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_brick_2.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "smallbrick_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_smallbrick" - } - }, - "smallbrick_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_smallbrick_c" - } - }, - "smallbrick_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_smallbrick_d" - } - }, - "smallbrick_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_smallbrick_v" - } - }, - "smallbrick_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_smallbrick_s" - } - }, - "tile_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tile" - } - }, - "tile_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tile_c" - } - }, - "tile_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tile_d" - } - }, - "tile_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tile_v" - } - }, - "tile_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tile_s" - } - }, - "tilespecial_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tilespecial" - } - }, - "tilespecial_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tilespecial_c" - } - }, - "tilespecial_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tilespecial_d" - } - }, - "tilespecial_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tilespecial_v" - } - }, - "tilespecial_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_tilespecial_s" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json deleted file mode 100644 index 6a1615be..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_crucible.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockDemonCrucible.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "normal": [{ - - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json deleted file mode 100644 index 792e272f..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_crystal.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { "#crystal" : "bloodmagic:models/DefaultCrystal" }, - "model": "bloodmagic:crystal/Crystal1.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "attached": { - "down": { - "transform": { - "rotation": {"x": 180} - } - }, - "up": { - }, - "north": { - "transform": { - "rotation": {"x": -90} - } - }, - "south": { - "transform": { - "rotation": {"x": 90} - } - }, - "east": { - "transform": { - "rotation": {"z": -90} - } - }, - "west": { - "transform": { - "rotation": {"z": 90} - } - } - }, - "type": { - "default": { - "textures": { - "#crystal" : "bloodmagic:models/DefaultCrystal" - } - }, - "corrosive": { - "textures": { - "#crystal" : "bloodmagic:models/CorrosiveCrystal" - } - }, - "destructive": { - "textures": { - "#crystal" : "bloodmagic:models/DestructiveCrystal" - } - }, - "vengeful": { - "textures": { - "#crystal" : "bloodmagic:models/VengefulCrystal" - } - }, - "steadfast": { - "textures": { - "#crystal" : "bloodmagic:models/SteadfastCrystal" - } - } - }, - "age": { - "0": { - - }, - "1": { - "submodel": "bloodmagic:crystal/Crystal2.obj" - }, - "2": { - "submodel": { - "crystal2": {"model": "bloodmagic:crystal/Crystal2.obj"}, - "crystal3": {"model": "bloodmagic:crystal/Crystal3.obj"} - } - }, - "3": { - "submodel": { - "crystal2": {"model": "bloodmagic:crystal/Crystal2.obj"}, - "crystal3": {"model": "bloodmagic:crystal/Crystal3.obj"}, - "crystal4": {"model": "bloodmagic:crystal/Crystal4.obj"} - } - }, - "4": { - "submodel": { - "crystal2": {"model": "bloodmagic:crystal/Crystal2.obj"}, - "crystal3": {"model": "bloodmagic:crystal/Crystal3.obj"}, - "crystal4": {"model": "bloodmagic:crystal/Crystal4.obj"}, - "crystal5": {"model": "bloodmagic:crystal/Crystal5.obj"} - } - }, - "5": { - "submodel": { - "crystal2": {"model": "bloodmagic:crystal/Crystal2.obj"}, - "crystal3": {"model": "bloodmagic:crystal/Crystal3.obj"}, - "crystal4": {"model": "bloodmagic:crystal/Crystal4.obj"}, - "crystal5": {"model": "bloodmagic:crystal/Crystal5.obj"}, - "crystal6": {"model": "bloodmagic:crystal/Crystal6.obj"} - } - }, - "6": { - "submodel": { - "crystal2": {"model": "bloodmagic:crystal/Crystal2.obj"}, - "crystal3": {"model": "bloodmagic:crystal/Crystal3.obj"}, - "crystal4": {"model": "bloodmagic:crystal/Crystal4.obj"}, - "crystal5": {"model": "bloodmagic:crystal/Crystal5.obj"}, - "crystal6": {"model": "bloodmagic:crystal/Crystal6.obj"}, - "crystal7": {"model": "bloodmagic:crystal/Crystal7.obj"} - } - } - }, - "inventory": [{ - "variants": { - "type": { - "default": { - "textures": { - "#crystal" : "bloodmagic:models/DefaultCrystal" - } - }, - "corrosive": { - "textures": { - "#crystal" : "bloodmagic:models/CorrosiveCrystal" - } - }, - "destructive": { - "textures": { - "#crystal" : "bloodmagic:models/DestructiveCrystal" - } - }, - "vengeful": { - "textures": { - "#crystal" : "bloodmagic:models/VengefulCrystal" - } - }, - "steadfast": { - "textures": { - "#crystal" : "bloodmagic:models/SteadfastCrystal" - } - } - } - } - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json b/src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json deleted file mode 100644 index ef8d9802..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_crystallizer.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockDemonCrystallizer.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "normal": [{ - - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_extras.json b/src/main/resources/assets/bloodmagic/blockstates/demon_extras.json deleted file mode 100644 index 4854590c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_extras.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "stone_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_stone" - } - }, - "stone_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_stone_c" - } - }, - "stone_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_stone_d" - } - }, - "stone_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_stone_v" - } - }, - "stone_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_stone_s" - } - }, - "polished_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_polished" - } - }, - "polished_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_polished_c" - } - }, - "polished_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_polished_d" - } - }, - "polished_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_polished_v" - } - }, - "polished_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_polished_s" - } - }, - "metal_raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_metal" - } - }, - "metal_corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_metal_c" - } - }, - "metal_destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_metal_d" - } - }, - "metal_vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_metal_v" - } - }, - "metal_steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_metal_s" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_light.json b/src/main/resources/assets/bloodmagic/blockstates/demon_light.json deleted file mode 100644 index 171bdd39..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_light.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "raw": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_eye" - } - }, - "corrosive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_eye_c" - } - }, - "destructive": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_eye_d" - } - }, - "vengeful": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_eye_v" - } - }, - "steadfast": { - "textures": { - "all": "bloodmagic:blocks/dungeon/dungeon_eye_s" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json deleted file mode 100644 index c32dd8ac..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_1.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "minecraft:cube", - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart", - "side": "bloodmagic:blocks/dungeon/dungeon_pillar", - "particle": "#end" - } - }, - "variants": { - "axis": { - "x": { - "model": "bloodmagic:BlockPillarX" - }, - "y": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end" - } - }, - "z": { - "model": "bloodmagic:BlockPillarZ" - } - }, - "type": { - "raw": { - - }, - "corrosive": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c", - "side": "bloodmagic:blocks/dungeon/dungeon_pillar_c" - } - }, - "destructive": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_d", - "side": "bloodmagic:blocks/dungeon/dungeon_pillar_d" - } - }, - "vengeful": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_v", - "side": "bloodmagic:blocks/dungeon/dungeon_pillar_v" - } - }, - "steadfast": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_s", - "side": "bloodmagic:blocks/dungeon/dungeon_pillar_s" - } - } - }, - "inventory": [{ }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json deleted file mode 100644 index 9285da20..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_2.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "minecraft:cube", - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart", - "side": "bloodmagic:blocks/dungeon/dungeon_pillarspecial", - "particle": "#end" - } - }, - "variants": { - "axis": { - "x": { - "model": "bloodmagic:BlockPillarX" - }, - "y": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end" - } - }, - "z": { - "model": "bloodmagic:BlockPillarZ" - } - }, - "type": { - "raw": { - - }, - "corrosive": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c", - "side": "bloodmagic:blocks/dungeon/dungeon_pillarspecial_c" - } - }, - "destructive": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_d", - "side": "bloodmagic:blocks/dungeon/dungeon_pillarspecial_d" - } - }, - "vengeful": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_v", - "side": "bloodmagic:blocks/dungeon/dungeon_pillarspecial_v" - } - }, - "steadfast": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_s", - "side": "bloodmagic:blocks/dungeon/dungeon_pillarspecial_s" - } - } - }, - "inventory": [{ }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json deleted file mode 100644 index 01b3ebae..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_1.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "minecraft:cube", - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart", - "sideBottom": "bloodmagic:blocks/dungeon/dungeon_pillarbottom", - "sideTop": "bloodmagic:blocks/dungeon/dungeon_pillartop", - "particle": "#end" - } - }, - "variants": { - "facing": { - "down": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideBottom" - } - }, - "up": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideTop" - } - }, - "north": { - "model": "bloodmagic:BlockPillarCapNorth" - }, - "south": { - "model": "bloodmagic:BlockPillarCapSouth" - }, - "west": { - "model": "bloodmagic:BlockPillarCapWest" - }, - "east": { - "model": "bloodmagic:BlockPillarCapEast" - } - }, - "type": { - "raw": { - - }, - "corrosive": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c", - "sideBottom": "bloodmagic:blocks/dungeon/dungeon_pillarbottom_c", - "sideTop": "bloodmagic:blocks/dungeon/dungeon_pillartop_c" - } - } - }, - "inventory": [{ }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json deleted file mode 100644 index 68d4de9a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_2.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "minecraft:cube", - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_d", - "sideBottom": "bloodmagic:blocks/dungeon/dungeon_pillarbottom_d", - "sideTop": "bloodmagic:blocks/dungeon/dungeon_pillartop_d", - "particle": "#end" - } - }, - "variants": { - "facing": { - "down": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideBottom" - } - }, - "up": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideTop" - } - }, - "north": { - "model": "bloodmagic:BlockPillarCapNorth" - }, - "south": { - "model": "bloodmagic:BlockPillarCapSouth" - }, - "west": { - "model": "bloodmagic:BlockPillarCapWest" - }, - "east": { - "model": "bloodmagic:BlockPillarCapEast" - } - }, - "type": { - "destructive": { - - }, - "vengeful": { - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_v", - "sideBottom": "bloodmagic:blocks/dungeon/dungeon_pillarbottom_v", - "sideTop": "bloodmagic:blocks/dungeon/dungeon_pillartop_v" - } - } - }, - "inventory": [{ }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json deleted file mode 100644 index e373b095..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pillar_cap_3.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "minecraft:cube", - "textures": { - "end": "bloodmagic:blocks/dungeon/dungeon_pillarheart_s", - "sideBottom": "bloodmagic:blocks/dungeon/dungeon_pillarbottom_s", - "sideTop": "bloodmagic:blocks/dungeon/dungeon_pillartop_s", - "particle": "#end" - } - }, - "variants": { - "facing": { - "down": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideBottom" - } - }, - "up": { - "model": "minecraft:cube_bottom_top", - "textures": { - "top": "#end", - "bottom": "#end", - "side": "#sideTop" - } - }, - "north": { - "model": "bloodmagic:BlockPillarCapNorth" - }, - "south": { - "model": "bloodmagic:BlockPillarCapSouth" - }, - "west": { - "model": "bloodmagic:BlockPillarCapWest" - }, - "east": { - "model": "bloodmagic:BlockPillarCapEast" - } - }, - "type": { - "steadfast": { - - } - }, - "inventory": [{ }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json b/src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json deleted file mode 100644 index 4a2b009e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_pylon.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockDemonPylon.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "normal": [{ - - }] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json deleted file mode 100644 index 8bb70c0c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_1.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "texture1": "bloodmagic:blocks/dungeon/dungeon_pillarheart", - "texture2": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c", - "all": "#texture1", - "bottom": "#all", - "top": "#all", - "side": "#all", - "particle": "#all" - }, - "model": "minecraft:stairs", - "transform" : "forge:default-block" - }, - "variants": { - "facing=east,half=bottom,shape=straight,type=raw": { "model": "minecraft:stairs" }, - "facing=west,half=bottom,shape=straight,type=raw": { "model": "minecraft:stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=straight,type=raw": { "model": "minecraft:stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=straight,type=raw": { "model": "minecraft:stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs" }, - "facing=west,half=bottom,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs" }, - "facing=north,half=bottom,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=east,half=bottom,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs" }, - "facing=west,half=bottom,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs" }, - "facing=north,half=bottom,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=east,half=top,shape=straight,type=raw": { "model": "minecraft:stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=straight,type=raw": { "model": "minecraft:stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=straight,type=raw": { "model": "minecraft:stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=straight,type=raw": { "model": "minecraft:stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=outer_right,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=outer_left,type=raw": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=inner_right,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=inner_left,type=raw": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - - "facing=east,half=bottom,shape=straight,type=corrosive": { "model": "minecraft:stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=straight,type=corrosive": { "model": "minecraft:stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=straight,type=corrosive": { "model": "minecraft:stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=straight,type=corrosive": { "model": "minecraft:stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=straight,type=corrosive": { "model": "minecraft:stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=straight,type=corrosive": { "model": "minecraft:stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=straight,type=corrosive": { "model": "minecraft:stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=straight,type=corrosive": { "model": "minecraft:stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=outer_right,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=outer_left,type=corrosive": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=inner_right,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=inner_left,type=corrosive": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "inventory": [{}] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json deleted file mode 100644 index e3376cc8..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_2.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "texture1": "bloodmagic:blocks/dungeon/dungeon_pillarheart_d", - "texture2": "bloodmagic:blocks/dungeon/dungeon_pillarheart_v", - "all": "#texture1", - "bottom": "#all", - "top": "#all", - "side": "#all", - "particle": "#all" - }, - "model": "minecraft:stairs", - "transform" : "forge:default-block" - }, - "variants": { - "facing=east,half=bottom,shape=straight,type=destructive": { "model": "minecraft:stairs" }, - "facing=west,half=bottom,shape=straight,type=destructive": { "model": "minecraft:stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=straight,type=destructive": { "model": "minecraft:stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=straight,type=destructive": { "model": "minecraft:stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs" }, - "facing=west,half=bottom,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs" }, - "facing=north,half=bottom,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=east,half=bottom,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs" }, - "facing=west,half=bottom,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs" }, - "facing=north,half=bottom,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=east,half=top,shape=straight,type=destructive": { "model": "minecraft:stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=straight,type=destructive": { "model": "minecraft:stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=straight,type=destructive": { "model": "minecraft:stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=straight,type=destructive": { "model": "minecraft:stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=outer_right,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=outer_left,type=destructive": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=inner_right,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=inner_left,type=destructive": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - - "facing=east,half=bottom,shape=straight,type=vengeful": { "model": "minecraft:stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=straight,type=vengeful": { "model": "minecraft:stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=straight,type=vengeful": { "model": "minecraft:stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=straight,type=vengeful": { "model": "minecraft:stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=bottom,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=bottom,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=bottom,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "textures": {"all": "#texture2"} }, - "facing=north,half=bottom,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=straight,type=vengeful": { "model": "minecraft:stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=straight,type=vengeful": { "model": "minecraft:stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=straight,type=vengeful": { "model": "minecraft:stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=straight,type=vengeful": { "model": "minecraft:stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=outer_right,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=outer_left,type=vengeful": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=inner_right,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=east,half=top,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=west,half=top,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=south,half=top,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true, "textures": {"all": "#texture2"} }, - "facing=north,half=top,shape=inner_left,type=vengeful": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true, "textures": {"all": "#texture2"} }, - "inventory": [{}] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json b/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json deleted file mode 100644 index 51640cbd..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_stairs_3.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "texture1": "bloodmagic:blocks/dungeon/dungeon_pillarheart_s", - "texture2": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c", - "all": "#texture1", - "bottom": "#all", - "top": "#all", - "side": "#all", - "particle": "#all" - }, - "model": "minecraft:stairs", - "transform" : "forge:default-block" - }, - "variants": { - "facing=east,half=bottom,shape=straight,type=steadfast": { "model": "minecraft:stairs" }, - "facing=west,half=bottom,shape=straight,type=steadfast": { "model": "minecraft:stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=straight,type=steadfast": { "model": "minecraft:stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=straight,type=steadfast": { "model": "minecraft:stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs" }, - "facing=west,half=bottom,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs" }, - "facing=north,half=bottom,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "y": 180, "uvlock": true }, - "facing=east,half=bottom,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs" }, - "facing=west,half=bottom,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=south,half=bottom,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=north,half=bottom,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=east,half=bottom,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "y": 270, "uvlock": true }, - "facing=west,half=bottom,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "y": 90, "uvlock": true }, - "facing=south,half=bottom,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs" }, - "facing=north,half=bottom,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "y": 180, "uvlock": true }, - "facing=east,half=top,shape=straight,type=steadfast": { "model": "minecraft:stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=straight,type=steadfast": { "model": "minecraft:stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=straight,type=steadfast": { "model": "minecraft:stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=straight,type=steadfast": { "model": "minecraft:stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=outer_right,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=outer_left,type=steadfast": { "model": "minecraft:outer_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=east,half=top,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=west,half=top,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - "facing=south,half=top,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=north,half=top,shape=inner_right,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=east,half=top,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "uvlock": true }, - "facing=west,half=top,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 180, "uvlock": true }, - "facing=south,half=top,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 90, "uvlock": true }, - "facing=north,half=top,shape=inner_left,type=steadfast": { "model": "minecraft:inner_stairs", "x": 180, "y": 270, "uvlock": true }, - "inventory": [{}] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json b/src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json deleted file mode 100644 index b7782a56..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_wall_1.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_pillarheart", - "particle": "#wall" - }, - "model": "bloodmagic:BlockBlank", - "transform" : "forge:default-block" - }, - "variants": { - "up": { - "true": {"submodel": "minecraft:wall_post"}, - "false": {} - }, - "north": { - "true": {"submodel": "minecraft:wall_side", "uvlock": true}, - "false": {} - }, - "south": { - "true": {"submodel": "minecraft:wall_side", "uvlock": true, "y": 180}, - "false": {} - }, - "east": { - "true": {"submodel": "minecraft:wall_side", "uvlock": true, "y": 90}, - "false": {} - }, - "west": { - "true": {"submodel": "minecraft:wall_side", "uvlock": true, "y": 270}, - "false": {} - }, - "type": { - "brick_raw": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_brick3" - } - }, - "brick_corrosive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_brick3_c" - } - }, - "brick_destructive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_brick3_d" - } - }, - "brick_vengeful": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_brick3_v" - } - }, - "brick_steadfast": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_brick3_s" - } - }, - "smallbrick_raw": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_smallbrick" - } - }, - "smallbrick_corrosive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_smallbrick_c" - } - }, - "smallbrick_destructive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_smallbrick_d" - } - }, - "smallbrick_vengeful": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_smallbrick_v" - } - }, - "smallbrick_steadfast": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_smallbrick_s" - } - }, - "large_raw": { - - }, - "large_corrosive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_pillarheart_c" - } - }, - "large_destructive": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_pillarheart_d" - } - }, - "large_vengeful": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_pillarheart_v" - } - }, - "large_steadfast": { - "textures": { - "wall": "bloodmagic:blocks/dungeon/dungeon_pillarheart_s" - } - } - }, - "inventory": [{}] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json b/src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json deleted file mode 100644 index 33dc70e5..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/demon_will_gauge.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "willgauge": { - "textures": { - "layer0": "bloodmagic:items/DemonWillGauge" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json b/src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json deleted file mode 100644 index a1ec1631..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/dimensional_portal.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": {}, - "uvlock": true - }, - "variants": { - "meta": { - "0": {"model": "bloodmagic:BlockDimensionalPortalNS"}, - "1": {"model": "bloodmagic:BlockDimensionalPortalEW"}, - "2": {} - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/experience_tome.json b/src/main/resources/assets/bloodmagic/blockstates/experience_tome.json deleted file mode 100644 index 0441a8e1..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/experience_tome.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "experiencetome": { - "textures": { - "layer0": "bloodmagic:items/ExperienceBook" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json b/src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json deleted file mode 100644 index 748b4003..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/icarus_scroll.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/icarusscroll_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/icarusscroll_activated" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/incense_altar.json b/src/main/resources/assets/bloodmagic/blockstates/incense_altar.json deleted file mode 100644 index f5c0414e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/incense_altar.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockIncenseAltar.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "normal": [{ - - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json b/src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json deleted file mode 100644 index 01f96406..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/input_routing_node.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { "#node" : "bloodmagic:models/ModelInputRoutingNode" }, - "model": "bloodmagic:routing/ModelRoutingNodeCore.obj", - "transform" : "forge:default-block", - "custom": { "flip-v": true }, - "uvlock": true - }, - "variants": { - "north": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": 90} - } - }, - "false": {} - }, - "south": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": -90} - } - }, - "false": {} - }, - "east": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": 90} - } - }, - "false": {} - }, - "west": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -90} - } - }, - "false": {} - }, - "down": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }, - "false": {} - }, - "up": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -180} - } - }, - "false": {} - }, - "inventory": [{ - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json b/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json deleted file mode 100644 index 2a14cf73..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/inscription_tool.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "blank": { }, - "water": { - "textures": { - "layer0": "bloodmagic:items/WaterScribeTool" - } - }, - "fire": { - "textures": { - "layer0": "bloodmagic:items/FireScribeTool" - } - }, - "earth": { - "textures": { - "layer0": "bloodmagic:items/EarthScribeTool" - } - }, - "air": { - "textures": { - "layer0": "bloodmagic:items/AirScribeTool" - } - }, - "dusk": { - "textures": { - "layer0": "bloodmagic:items/DuskScribeTool" - } - }, - "dawn": { - "textures": { - "layer0": "bloodmagic:items/DawnScribeTool" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json b/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json deleted file mode 100644 index fdf9e93d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "texture": "bloodmagic:models/pillar_mid", - "particle": "#texture" - }, - "transform" : "forge:default-block", - "model": "bloodmagic:pillar_mid" - }, - "variants": { - "type": { - "raw": { - "textures": { - - } - }, - "corrosive": { - "textures": { - "texture": "bloodmagic:models/pillar_mid_c" - } - }, - "vengeful": { - "textures": { - "texture": "bloodmagic:models/pillar_mid_v" - } - }, - "destructive": { - "textures": { - "texture": "bloodmagic:models/pillar_mid_d" - } - }, - "steadfast": { - "textures": { - "texture": "bloodmagic:models/pillar_mid_s" - } - } - }, - "static": { - "true": { - "model": "builtin/generated" - }, - "false": { - "model": "bloodmagic:pillar_mid" - } - }, - "inventory": [{}] - } -} - - diff --git a/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json b/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json deleted file mode 100644 index 295c172a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/inversion_pillar_end.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { - "texture": "bloodmagic:models/pillar_base", - "particle": "#texture" - }, - "transform" : "forge:default-block", - "model": "bloodmagic:pillar_bottom" - }, - "variants": { - "type": { - "raw_bottom": { - "textures": { - - } - }, - "raw_top": { - "textures": { - - }, - "model": "bloodmagic:pillar_top" - }, - "corrosive_bottom": { - "textures": { - "texture": "bloodmagic:models/pillar_base_c" - } - }, - "corrosive_top": { - "textures": { - "texture": "bloodmagic:models/pillar_base_c" - }, - "model": "bloodmagic:pillar_top" - }, - "destructive_bottom": { - "textures": { - "texture": "bloodmagic:models/pillar_base_d" - } - }, - "destructive_top": { - "textures": { - "texture": "bloodmagic:models/pillar_base_d" - }, - "model": "bloodmagic:pillar_top" - }, - "vengeful_bottom": { - "textures": { - "texture": "bloodmagic:models/pillar_base_v" - } - }, - "vengeful_top": { - "textures": { - "texture": "bloodmagic:models/pillar_base_v" - }, - "model": "bloodmagic:pillar_top" - }, - "steadfast_bottom": { - "textures": { - "texture": "bloodmagic:models/pillar_base_s" - } - }, - "steadfast_top": { - "textures": { - "texture": "bloodmagic:models/pillar_base_s" - }, - "model": "bloodmagic:pillar_top" - } - } - } -} - - diff --git a/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json deleted file mode 100644 index cfa5e17c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item_demon_crystal.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "default": { - "textures": { - "layer0": "bloodmagic:items/DefaultCrystal" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/CorrosiveCrystal" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/VengefulCrystal" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/DestructiveCrystal" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SteadfastCrystal" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json b/src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json deleted file mode 100644 index 9342eeea..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/item_routing_node.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { "#node" : "bloodmagic:models/modelroutingnode" }, - "model": "bloodmagic:routing/ModelRoutingNodeCore.obj", - "transform" : "forge:default-block", - "custom": { "flip-v": true }, - "uvlock": true - }, - "variants": { - "north": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": 90} - } - }, - "false": {} - }, - "south": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": -90} - } - }, - "false": {} - }, - "east": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": 90} - } - }, - "false": {} - }, - "west": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -90} - } - }, - "false": {} - }, - "down": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }, - "false": {} - }, - "up": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -180} - } - }, - "false": {} - }, - "inventory": [{ - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json b/src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json deleted file mode 100644 index 12890a4d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/lava_crystal.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/LavaCrystal" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/life_essence.json b/src/main/resources/assets/bloodmagic/blockstates/life_essence.json deleted file mode 100644 index 8d673ba3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/life_essence.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "forge_marker": 1, - "variants": { - "fluid": { - "model": "forge:fluid", - "custom": { "fluid": "lifeessence" } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/living_armour.json b/src/main/resources/assets/bloodmagic/blockstates/living_armour.json deleted file mode 100644 index a20acc7a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/living_armour.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "armour": { - "head": { - "textures": { - "layer0": "bloodmagic:items/LivingHelmet" - } - }, - "body": { - "textures": { - "layer0": "bloodmagic:items/LivingPlate" - } - }, - "leg": { - "textures": { - "layer0": "bloodmagic:items/LivingLeggings" - } - }, - "feet": { - "textures": { - "layer0": "bloodmagic:items/LivingBoots" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json b/src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json deleted file mode 100644 index a10dc2f5..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/master_routing_node.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "bloodmagic:routing/ModelMasterRoutingNodeCore.obj", - "transform" : "forge:default-block", - "custom": { "flip-v": true }, - "uvlock": true - }, - "variants": { - "north": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj", - "transform": { - "rotation": {"x": 90} - } - }, - "false": {} - }, - "south": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj", - "transform": { - "rotation": {"x": -90} - } - }, - "false": {} - }, - "east": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj", - "transform": { - "rotation": {"z": 90} - } - }, - "false": {} - }, - "west": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -90} - } - }, - "false": {} - }, - "down": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj" - }, - "false": {} - }, - "up": { - "true": { - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -180} - } - }, - "false": {} - }, - "inventory": [{ - "submodel": "bloodmagic:routing/ModelMasterRoutingNodeBase.obj" - }] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/mimic.json b/src/main/resources/assets/bloodmagic/blockstates/mimic.json deleted file mode 100644 index ae9c2042..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/mimic.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "nohitbox": { - "textures": { - "all": "bloodmagic:blocks/EtherealOpaqueMimic" - } - }, - "solidopaque": { - "textures": { - "all": "bloodmagic:blocks/SolidOpaqueMimic" - } - }, - "solidclear": { - "textures": { - "all": "bloodmagic:blocks/SolidClearMimic" - } - }, - "solidlight": { - "textures": { - "all": "bloodmagic:blocks/SolidLightMimic" - } - }, - "sentient": { - "textures": { - "all": "bloodmagic:blocks/SentientMimic" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json b/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json deleted file mode 100644 index 3212e25c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/monster_soul.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "raw": { - "textures": { - "layer0": "bloodmagic:items/BaseMonsterSoul" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/BaseMonsterSoul_corrosive" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/BaseMonsterSoul_destructive" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/BaseMonsterSoul_vengeful" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/BaseMonsterSoul_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/node_router.json b/src/main/resources/assets/bloodmagic/blockstates/node_router.json deleted file mode 100644 index c9a0de99..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/node_router.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/NodeRouter" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json b/src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json deleted file mode 100644 index 11d0d9cf..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/output_routing_node.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { "#node" : "bloodmagic:models/ModelOutputRoutingNode" }, - "model": "bloodmagic:routing/ModelRoutingNodeCore.obj", - "transform" : "forge:default-block", - "custom": { "flip-v": true }, - "uvlock": true - }, - "variants": { - "north": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": 90} - } - }, - "false": {} - }, - "south": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"x": -90} - } - }, - "false": {} - }, - "east": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": 90} - } - }, - "false": {} - }, - "west": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -90} - } - }, - "false": {} - }, - "down": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }, - "false": {} - }, - "up": { - "true": { - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj", - "transform": { - "rotation": {"z": -180} - } - }, - "false": {} - }, - "inventory": [{ - "submodel": "bloodmagic:routing/ModelRoutingNodeBase.obj" - }] - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json deleted file mode 100644 index 024dc061..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/pack_sacrifice.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/BloodPack" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json b/src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json deleted file mode 100644 index 024dc061..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/pack_self_sacrifice.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/BloodPack" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/path.json b/src/main/resources/assets/bloodmagic/blockstates/path.json deleted file mode 100644 index 4ebe7070..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/path.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "wood": { - "textures": { - "all": "bloodmagic:blocks/WoodBrickPath" - } - }, - "woodtile": { - "textures": { - "all": "bloodmagic:blocks/WoodTilePath" - } - }, - "stone": { - "textures": { - "all": "bloodmagic:blocks/StoneBrickPath" - } - }, - "stonetile": { - "textures": { - "all": "bloodmagic:blocks/StoneTilePath" - } - }, - "wornstone": { - "textures": { - "all": "bloodmagic:blocks/WornStoneBrickPath" - } - }, - "wornstonetile": { - "textures": { - "all": "bloodmagic:blocks/WornStoneTilePath" - } - }, - "obsidian": { - "textures": { - "all": "bloodmagic:blocks/ObsidianBrickPath" - } - }, - "obsidiantile": { - "textures": { - "all": "bloodmagic:blocks/ObsidianTilePath" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/phantom.json b/src/main/resources/assets/bloodmagic/blockstates/phantom.json deleted file mode 100644 index 7f83de76..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/phantom.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "bloodmagic:BlockPhantom" } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json b/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json deleted file mode 100644 index 61e07141..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/points_upgrade.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "draft_angelus": { - "textures": { - "layer0": "bloodmagic:items/Coagulant" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/potion_flask.json b/src/main/resources/assets/bloodmagic/blockstates/potion_flask.json deleted file mode 100644 index 3102ac66..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/potion_flask.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "full": { - "true": { - "textures": { - "layer0": "bloodmagic:items/PotionFlask_underlay", - "layer1": "bloodmagic:items/PotionFlask_outline", - "layer2": "bloodmagic:items/PotionFlask_overlay" - } - }, - "false": { - "textures": { - "layer0": "bloodmagic:items/PotionFlask_outline" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json deleted file mode 100644 index 1b8b489e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/ritual_controller.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "master": { - "textures": { - "all": "bloodmagic:blocks/MasterRitualStone" - } - }, - "imperfect": { - "textures": { - "all": "bloodmagic:blocks/ImperfectRitualStone" - } - }, - "inverted": { - "textures": { - "all": "bloodmagic:blocks/MasterRitualStone_Inverted" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json deleted file mode 100644 index e60702e6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/ritual_diviner.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "basic": { - "textures": { - "layer0": "bloodmagic:items/RitualDiviner" - } - }, - "dusk": { - "textures": { - "layer0": "bloodmagic:items/RitualDiviner" - } - }, - "dawn": { - "textures": { - "layer0": "bloodmagic:items/RitualDiviner" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json deleted file mode 100644 index 6178c0a9..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/ritual_reader.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/RitualTinkerer" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json b/src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json deleted file mode 100644 index 9eead647..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/ritual_stone.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "cube_all", - "uvlock": true - }, - "variants": { - "type": { - "blank": { - "textures": { - "all": "bloodmagic:blocks/RitualStone" - } - }, - "water": { - "textures": { - "all": "bloodmagic:blocks/WaterRitualStone" - } - }, - "fire": { - "textures": { - "all": "bloodmagic:blocks/FireRitualStone" - } - }, - "earth": { - "textures": { - "all": "bloodmagic:blocks/EarthRitualStone" - } - }, - "air": { - "textures": { - "all": "bloodmagic:blocks/AirRitualStone" - } - }, - "dusk": { - "textures": { - "all": "bloodmagic:blocks/DuskRitualStone" - } - }, - "dawn": { - "textures": { - "all": "bloodmagic:blocks/LightRitualStone" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json b/src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json deleted file mode 100644 index da29bad3..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sacrificial_dagger.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/SacrificialDagger" - } - }, - "creative": { - "textures": { - "layer0": "bloodmagic:items/SacrificialDagger" - } - }, - "ceremonial": { - "textures": { - "layer0": "bloodmagic:items/CeremonialDagger" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json b/src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json deleted file mode 100644 index 3d241ffb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sanguine_book.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/SanguineBook" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json deleted file mode 100644 index 92324fbe..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_armour.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "armour": { - "head_default": { - "textures": { - "layer0": "bloodmagic:items/SentientHelmet" - } - }, - "body_default": { - "textures": { - "layer0": "bloodmagic:items/SentientPlate" - } - }, - "leg_default": { - "textures": { - "layer0": "bloodmagic:items/SentientLeggings" - } - }, - "feet_default": { - "textures": { - "layer0": "bloodmagic:items/SentientBoots" - } - }, - "head_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SentientHelmet_corrosive" - } - }, - "body_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SentientPlate_corrosive" - } - }, - "leg_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SentientLeggings_corrosive" - } - }, - "feet_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SentientBoots_corrosive" - } - }, - "head_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SentientHelmet_vengeful" - } - }, - "body_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SentientPlate_vengeful" - } - }, - "leg_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SentientLeggings_vengeful" - } - }, - "feet_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SentientBoots_vengeful" - } - }, - "head_destructive": { - "textures": { - "layer0": "bloodmagic:items/SentientHelmet_destructive" - } - }, - "body_destructive": { - "textures": { - "layer0": "bloodmagic:items/SentientPlate_destructive" - } - }, - "leg_destructive": { - "textures": { - "layer0": "bloodmagic:items/SentientLeggings_destructive" - } - }, - "feet_destructive": { - "textures": { - "layer0": "bloodmagic:items/SentientBoots_destructive" - } - }, - "head_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SentientHelmet_steadfast" - } - }, - "body_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SentientPlate_steadfast" - } - }, - "leg_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SentientLeggings_steadfast" - } - }, - "feet_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SentientBoots_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json deleted file mode 100644 index 4a0cabfb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_armour_gem.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "activated": { - "textures": { - "layer0": "bloodmagic:items/SentientArmourGem_activated" - } - }, - "deactivated": { - "textures": { - "layer0": "bloodmagic:items/SentientArmourGem_deactivated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json deleted file mode 100644 index f93f679a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_axe.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "type": { - "default": { - "textures": { - "layer0": "bloodmagic:items/SoulAxe" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulAxe_corrosive" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulAxe_destructive" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulAxe_vengeful" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulAxe_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json deleted file mode 100644 index 4ae06da9..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_bow.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "type": { - "default": { - "model": "bloodmagic:item/ItemSentientBow" - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/SentientBow_corrosive" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/SentientBow_destructive" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/SentientBow_vengeful" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SentientBow_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json deleted file mode 100644 index fdf1b224..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_pickaxe.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "type": { - "default": { - "textures": { - "layer0": "bloodmagic:items/SoulPickaxe" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulPickaxe_corrosive" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulPickaxe_destructive" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulPickaxe_vengeful" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulPickaxe_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json deleted file mode 100644 index fe56d96d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_shovel.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "type": { - "default": { - "textures": { - "layer0": "bloodmagic:items/SoulShovel" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulShovel_corrosive" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulShovel_destructive" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulShovel_vengeful" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulShovel_steadfast" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json b/src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json deleted file mode 100644 index 31620620..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sentient_sword.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-tool" - }, - "variants": { - "type": { - "default": { - "textures": { - "layer0": "bloodmagic:items/SoulSword_activated" - } - }, - "corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulSword_corrosive_activated" - } - }, - "destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulSword_destructive_activated" - } - }, - "vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulSword_vengeful_activated" - } - }, - "steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulSword_steadfast_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json deleted file mode 100644 index 32f44849..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/AirSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json deleted file mode 100644 index dc5b4f19..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/BloodLightSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json deleted file mode 100644 index d4fdbefe..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_bounce.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/BounceSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/BounceSigil_activated" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json deleted file mode 100644 index 54f6aa1b..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_claw.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/ClawSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/ClawSigil_activated" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json deleted file mode 100644 index ad29944e..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_compression.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/CompressionSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/CompressionSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json deleted file mode 100644 index 184354d6..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/DivinationSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json deleted file mode 100644 index 313bbfe2..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_elemental_affinity.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/ElementalSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/ElementalSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json deleted file mode 100644 index 9c73f810..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_ender_severance.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/SigilOfSeverance_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/SigilOfSeverance_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json deleted file mode 100644 index 2c22c801..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_fast_miner.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/MiningSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/MiningSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json deleted file mode 100644 index b7dcb443..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_frost.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/IceSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/IceSigil_activated" - } - } - } - } -} - diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json deleted file mode 100644 index b1bfb321..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_green_grove.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/GrowthSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/GrowthSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json deleted file mode 100644 index 39b9302a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_haste.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/HasteSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/HasteSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json deleted file mode 100644 index cfe4b8ec..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_holding.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/SigilOfHolding" - } - }, - "color": { - "textures": { - "layer0": "bloodmagic:items/SigilOfHolding", - "layer1": "bloodmagic:items/SigilOverlay" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json deleted file mode 100644 index fde7dbbc..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_lava.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/LavaSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json deleted file mode 100644 index 8a3a3967..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_magnetism.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/SigilOfMagnetism_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/SigilOfMagnetism_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json deleted file mode 100644 index e37bf040..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_phantom_bridge.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/BridgeSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/BridgeSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json deleted file mode 100644 index 26097e59..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_seer.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/SeerSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json deleted file mode 100644 index b48d90eb..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_suppression.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/SigilOfSuppression_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/SigilOfSuppression_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json deleted file mode 100644 index 84d1fe93..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_teleposition.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/TelepositionSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json deleted file mode 100644 index bb09cc7d..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_transposition.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/TranspositionSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_void.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_void.json deleted file mode 100644 index 4bc0194f..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_void.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/VoidSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_water.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_water.json deleted file mode 100644 index 9f76d28b..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_water.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "normal": { - "textures": { - "layer0": "bloodmagic:items/WaterSigil" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json deleted file mode 100644 index 6c9faba0..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/sigil_whirlwind.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "active": { - "false": { - "textures": { - "layer0": "bloodmagic:items/WindSigil_deactivated" - } - }, - "true": { - "textures": { - "layer0": "bloodmagic:items/WindSigil_activated" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/slate.json b/src/main/resources/assets/bloodmagic/blockstates/slate.json deleted file mode 100644 index 7f6f59af..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/slate.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "blank": { - "textures": { - "layer0": "bloodmagic:items/BlankSlate" - } - }, - "reinforced": { - "textures": { - "layer0": "bloodmagic:items/ReinforcedSlate" - } - }, - "imbued": { - "textures": { - "layer0": "bloodmagic:items/InfusedSlate" - } - }, - "demonic": { - "textures": { - "layer0": "bloodmagic:items/DemonSlate" - } - }, - "ethereal": { - "textures": { - "layer0": "bloodmagic:items/EtherealSlate" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/soul_forge.json b/src/main/resources/assets/bloodmagic/blockstates/soul_forge.json deleted file mode 100644 index 5abbb4e2..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/soul_forge.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "bloodmagic:BlockHellfireForge.obj", - "custom": { "flip-v": true }, - "transform" : "forge:default-block" - }, - "variants": { - "normal": [{ - - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/soul_gem.json b/src/main/resources/assets/bloodmagic/blockstates/soul_gem.json deleted file mode 100644 index 33d9b6e0..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/soul_gem.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "petty_default": { - "textures": { - "layer0": "bloodmagic:items/SoulGemPetty" - } - }, - "lesser_default": { - "textures": { - "layer0": "bloodmagic:items/SoulGemLesser" - } - }, - "common_default": { - "textures": { - "layer0": "bloodmagic:items/SoulGemCommon" - } - }, - "greater_default": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGreater" - } - }, - "grand_default": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGrand" - } - }, - "petty_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemPetty_corrosive" - } - }, - "lesser_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemLesser_corrosive" - } - }, - "common_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemCommon_corrosive" - } - }, - "greater_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGreater_corrosive" - } - }, - "grand_corrosive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGrand_corrosive" - } - }, - "petty_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulGemPetty_vengeful" - } - }, - "lesser_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulGemLesser_vengeful" - } - }, - "common_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulGemCommon_vengeful" - } - }, - "greater_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGreater_vengeful" - } - }, - "grand_vengeful": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGrand_vengeful" - } - }, - "petty_destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemPetty_destructive" - } - }, - "lesser_destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemLesser_destructive" - } - }, - "common_destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemCommon_destructive" - } - }, - "greater_destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGreater_destructive" - } - }, - "grand_destructive": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGrand_destructive" - } - }, - "petty_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulGemPetty_steadfast" - } - }, - "lesser_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulGemLesser_steadfast" - } - }, - "common_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulGemCommon_steadfast" - } - }, - "greater_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGreater_steadfast" - } - }, - "grand_steadfast": { - "textures": { - "layer0": "bloodmagic:items/SoulGemGrand_steadfast" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/soul_snare.json b/src/main/resources/assets/bloodmagic/blockstates/soul_snare.json deleted file mode 100644 index e643b138..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/soul_snare.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "soulsnare": { - "textures": { - "layer0": "bloodmagic:items/SoulSnare" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/soulforge.json b/src/main/resources/assets/bloodmagic/blockstates/soulforge.json new file mode 100644 index 00000000..12e4803a --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/soulforge.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "bloodmagic:block/soulforge" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/spectral.json b/src/main/resources/assets/bloodmagic/blockstates/spectral.json deleted file mode 100644 index 1d43fa6a..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/spectral.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "normal": { - "model": "bloodmagic:BlockSpectral", - "textures": { - "all": "bloodmagic:blocks/SpectralBlock" - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/teleposer.json b/src/main/resources/assets/bloodmagic/blockstates/teleposer.json deleted file mode 100644 index 2a92da6c..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/teleposer.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "textures": { }, - "model": "orientable" - }, - "variants": { - "normal": [{ - "textures": { - "top": "bloodmagic:blocks/Teleposer_Top", - "side": "bloodmagic:blocks/Teleposer_Side", - "front": "bloodmagic:blocks/Teleposer_Side", - "bottom": "bloodmagic:blocks/Teleposer_Side" - } - }] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json b/src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json deleted file mode 100644 index 34f21365..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/teleposition_focus.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "weak": { - "textures": { - "layer0": "bloodmagic:items/TeleposerFocus" - } - }, - "enhanced": { - "textures": { - "layer0": "bloodmagic:items/EnhancedTeleposerFocus" - } - }, - "reinforced": { - "textures": { - "layer0": "bloodmagic:items/ReinforcedTeleposerFocus" - } - }, - "demonic": { - "textures": { - "layer0": "bloodmagic:items/DemonicTeleposerFocus" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json b/src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json deleted file mode 100644 index 8bdc9a94..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/test_spell_block.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "bloodmagic:sub/BlockSpellModifierCore", - "textures": { - "model": "bloodmagic:models/SpellModifierDefault" - }, - - "uvlock": false - }, - "variants": { - "input": { - "up": {"submodel": "bloodmagic:sub/BlockSpellModifierInput", "x": 90}, - "down": {"submodel": "bloodmagic:sub/BlockSpellModifierInput", "x": -90}, - "east": {"submodel": "bloodmagic:sub/BlockSpellModifierInput", "y": -90}, - "west": {"submodel": "bloodmagic:sub/BlockSpellModifierInput", "y": 90}, - "north": {"submodel": "bloodmagic:sub/BlockSpellModifierInput", "y": 180}, - "south": {"submodel": "bloodmagic:sub/BlockSpellModifierInput"} - }, - "output": { - "up": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput", "transform": {"rotation": {"z": 90}} }, - "down": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput", "transform": {"rotation": {"z": -90}} }, - "west": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput", "y": 180}, - "east": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput"}, - "north": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput", "y": -90}, - "south": {"submodel": "bloodmagic:sub/BlockSpellModifierOutput", "y": 90} - } - } -} diff --git a/src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json b/src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json deleted file mode 100644 index 1562c045..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/upgrade_tome.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "upgradetome": { - "textures": { - "layer0": "bloodmagic:items/UpgradeTome" - } - } - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json b/src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json deleted file mode 100644 index 37735a28..00000000 --- a/src/main/resources/assets/bloodmagic/blockstates/upgrade_trainer.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "forge_marker": 1, - "defaults": { - "model": "builtin/generated", - "transform": "forge:default-item" - }, - "variants": { - "type": { - "upgradetrainer": { - "textures": { - "layer0": "bloodmagic:items/UpgradeTrainer" - } - } - } - } -} diff --git a/src/main/resources/assets/bloodmagic/books/architect.xml b/src/main/resources/assets/bloodmagic/books/architect.xml deleted file mode 100644 index d8bfebc9..00000000 --- a/src/main/resources/assets/bloodmagic/books/architect.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - 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/src/main/resources/assets/bloodmagic/lang/bg_BG.lang b/src/main/resources/assets/bloodmagic/lang/bg_BG.lang deleted file mode 100644 index 7e518dd4..00000000 --- a/src/main/resources/assets/bloodmagic/lang/bg_BG.lang +++ /dev/null @@ -1,85 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=МагиÑта на Кръвта -itemGroup.bloodmagic.creativeTabTome=МагиÑта на Кръвта Ъпгрейд Томове - -#Items -item.bloodmagic.activationCrystal.weak.name=Слаб КриÑтален Ðктиватор -item.bloodmagic.activationCrystal.awakened.name=Буднат КриÑтален Ðктиватор -item.bloodmagic.activationCrystal.creative.name=Креативен КриÑтален Ðктиватор - -item.bloodmagic.sacrificialDagger.normal.name=Жертвоприношителен Ðож -item.bloodmagic.sacrificialDagger.creative.name=Креативен Жертвоприношителен Ðож -item.bloodmagic.pack.selfSacrifice.name=Кървав Пакет -item.bloodmagic.pack.sacrifice.name=ГЕРБ -item.bloodmagic.daggerOfSacrifice.name=Ðож на Жертвоприношението - -item.bloodmagic.lavaCrystal.name=Лава КриÑтал - -item.bloodmagic.bound.sword.name=Обвързано ОÑтрие -item.bloodmagic.bound.pickaxe.name=Обвързана Кирка -item.bloodmagic.bound.axe.name=Обвързана Брадва -item.bloodmagic.bound.shovel.name=Обвързана Лопата - -item.bloodmagic.bucket.lifeEssence.name=Кофата на Живота - -item.bloodmagic.orb.weak.name=Слаб Кръвен Орб -item.bloodmagic.orb.apprentice.name=Apprentice Кръвен Орб -item.bloodmagic.orb.magician.name=Магичен Кръвен Орб -item.bloodmagic.orb.master.name=МаÑтер Кръвен Орб -item.bloodmagic.orb.archmage.name=Превъзходен Кръвен Орб -item.bloodmagic.orb.transcendent.name=Съвършен Кръвен Орб - -item.bloodmagic.bloodShard.weak.name=Слабо Кръвно Парче -item.bloodmagic.bloodShard.demon.name=Демонично Кръвно Парче - -item.bloodmagic.baseComponent.reagentWater.name=Ваден Реагент -item.bloodmagic.baseComponent.reagentLava.name=Лава Реагент -item.bloodmagic.baseComponent.reagentAir.name=Въздушен Реагент -item.bloodmagic.baseComponent.reagentFastMiner.name=Минен Реагент -item.bloodmagic.baseComponent.reagentVoid.name=Void Реагент -item.bloodmagic.baseComponent.reagentGrowth.name=РаÑтежен Реагент -item.bloodmagic.baseComponent.reagentAffinity.name=Елеменарно Ðфинитен Реагент -item.bloodmagic.baseComponent.reagentSight.name=Зрителен Реагент -item.bloodmagic.baseComponent.reagentBinding.name=Обвързващ Реагент -item.bloodmagic.baseComponent.reagentSuppression.name=ПотиÑкащ Реагент -item.bloodmagic.baseComponent.frameParts.name=ЧаÑти на Рамка -item.bloodmagic.baseComponent.reagentBloodLight.name=Светлинно Кръвен Реагент -item.bloodmagic.baseComponent.reagentMagnetism.name=Магнетичен Реагент -item.bloodmagic.baseComponent.reagentHaste.name=Бързинен Реагент -item.bloodmagic.baseComponent.reagentBridge.name=Фантомен МоÑÑ‚ Реагент -item.bloodmagic.baseComponent.reagentCompression.name=КомпреÑиращ Реагент -item.bloodmagic.baseComponent.reagentSeverance.name=СкъÑÑващ Реагент - -item.bloodmagic.baseComponent.reagentTeleposition.name=ПозициÑпроменÑщ Реагент -item.bloodmagic.baseComponent.reagentTransposition.name=ТранÑпонираЩ Реагент - -item.bloodmagic.baseComponent.ironSand.name=Железен ПÑÑък -item.bloodmagic.baseComponent.goldSand.name=Златен ПÑÑък -item.bloodmagic.baseComponent.coalSand.name=Въглищен ПÑÑък - -item.bloodmagic.demonCrystal.crystalDefault.name=КриÑтал на Демонична Ð’Ð¾Ð»Ñ -item.bloodmagic.demonCrystal.crystalCorrosive.name=КриÑтал на Корозивна Ð’Ð¾Ð»Ñ -item.bloodmagic.demonCrystal.crystalDestructive.name=КриÑтал на Разрушителна Ð’Ð¾Ð»Ñ -item.bloodmagic.demonCrystal.crystalVengeful.name=КриÑтал на ОтмъÑтителна Ð’Ð¾Ð»Ñ -item.bloodmagic.demonCrystal.crystalSteadfast.name=КриÑтал на Твърда Ð’Ð¾Ð»Ñ - -item.bloodmagic.monsterSoul.base.name=ДÑволÑка Ð’Ð¾Ð»Ñ - -item.bloodmagic.livingArmour.helmet.name=Живата КаÑка -item.bloodmagic.livingArmour.chest.name=ЖивÑÑ‰Ð¸Ñ Ðагръдник -item.bloodmagic.livingArmour.legs.name=Живите Гамаши -item.bloodmagic.livingArmour.boots.name=Живите Ботуши -item.bloodmagic.sentientArmour.helmet.name=ЧувÑтвителна КаÑка -item.bloodmagic.sentientArmour.chest.name=ЧувÑтвителен Ðагръдник -item.bloodmagic.sentientArmour.legs.name=ЧувÑтвителни Гамаши -item.bloodmagic.sentientArmour.boots.name=ЧувÑтвителни Ботуши - -item.bloodmagic.altarMaker.name=Създател на алтари - -item.bloodmagic.sentientSword.name=ЧувÑтвителен Меч -item.bloodmagic.sentientBow.name=ЧувÑтвителен Лък -item.bloodmagic.sentientArmourGem.name=Ñкъпоценен камък на ЧувÑтвителната Ð‘Ñ€Ð¾Ð½Ñ - -# JustEnoughItems -jei.bloodmagic.recipe.altar=Ðлтар на Кръвта -jei.bloodmagic.recipe.ticksRequired=Време: %,d Ticks diff --git a/src/main/resources/assets/bloodmagic/lang/de_DE.lang b/src/main/resources/assets/bloodmagic/lang/de_DE.lang deleted file mode 100644 index c6627a6c..00000000 --- a/src/main/resources/assets/bloodmagic/lang/de_DE.lang +++ /dev/null @@ -1,908 +0,0 @@ -# Creative Tab -itemGroup.bloodmagic.creativeTabTome=Blood Magic - Upgrades - -# Items - -item.bloodmagic.pack.selfSacrifice.name=Blutweste -item.bloodmagic.pack.sacrifice.name=Vampirische Weste -item.bloodmagic.daggerOfSacrifice.name=Opfermesser - -item.bloodmagic.lavaCrystal.name=Lavakristall - -item.bloodmagic.activation_crystal.awakened.name=Erweckter Aktivierungskristall -item.bloodmagic.activation_crystal.creative.name=Kreativer Aktivierungskristall -item.bloodmagic.activation_crystal.weak.name=Schwacher Aktivierungskristall - -item.bloodmagic.bound.sword.name=Gebundene Klinge -item.bloodmagic.bound.pickaxe.name=Gebundene Spitzhacke -item.bloodmagic.bound.axe.name=Gebundene Axt -item.bloodmagic.bound.shovel.name=Gebundene Schaufel - -item.bloodmagic.bucket.lifeEssence.name=Eimer mit Lebensessenz - -item.bloodmagic.scribe.water.name=Elementar-Gravurwerkzeug: Wasser -item.bloodmagic.scribe.fire.name=Elementar-Gravurwerkzeug: Feuer -item.bloodmagic.scribe.earth.name=Elementar-Gravurwerkzeug: Erde -item.bloodmagic.scribe.air.name=Elementar-Gravurwerkzeug: Luft -item.bloodmagic.scribe.dusk.name=Elementar-Gravurwerkzeug: Abenddämmerung -item.bloodmagic.scribe.dawn.name=Elementar-Gravurwerkzeug: Morgendämmerung - -item.bloodmagic.focus.weak.name=Telepositionsfokus -item.bloodmagic.focus.enhanced.name=Verbesserter Telepositionsfokus -item.bloodmagic.focus.reinforced.name=Verstärkter Telepositionsfokus -item.bloodmagic.focus.demonic.name=Dämonischer Telepositionsfokus - -item.bloodmagic.slate.blank.name=Leere Schiefertafel -item.bloodmagic.slate.reinforced.name=Verstärkte Tafel -item.bloodmagic.slate.imbued.name=Erfüllte Tafel -item.bloodmagic.slate.demonic.name=Dämonische Tafel -item.bloodmagic.slate.ethereal.name=Ätherische Tafel - -item.bloodmagic.orb.weak.name=Schwache Blutkugel -item.bloodmagic.orb.apprentice.name=Blutkugel des Lehrlings -item.bloodmagic.orb.magician.name=Blutkugel des Magiers -item.bloodmagic.orb.master.name=Blutkugel des Meisters -item.bloodmagic.orb.archmage.name=Blutkugel des Erzmagiers -item.bloodmagic.orb.transcendent.name=Transzendenter Blutkugel - -item.bloodmagic.reagent.incendium.name=Incendium -item.bloodmagic.reagent.magicales.name=Magicales -item.bloodmagic.reagent.sanctus.name=Sanctus -item.bloodmagic.reagent.aether.name=Aether -item.bloodmagic.reagent.crepitous.name=Crepitous -item.bloodmagic.reagent.crystallos.name=Crystallos -item.bloodmagic.reagent.terrae.name=Terrae -item.bloodmagic.reagent.aquasalus.name=Aquasalus -item.bloodmagic.reagent.tennebrae.name=Tennebrae -item.bloodmagic.reagent.offensa.name=Offensa -item.bloodmagic.reagent.praesidium.name=Praesidium -item.bloodmagic.reagent.orbisterrae.name=Orbis Terrae -item.bloodmagic.reagent.virtus.name=Virtus -item.bloodmagic.reagent.reductus.name=Reductus -item.bloodmagic.reagent.potentia.name=Potentia - -item.bloodmagic.blood_shard.demonic.name=Dämonische Blutscherbe -item.bloodmagic.blood_shard.weak.name=Schwache Blutscherbe -item.bloodmagic.sacrificial_dagger.creative.name=Kreativer Opferdolch -item.bloodmagic.sacrificial_dagger.normal.name=Opferdolch - -item.bloodmagic.baseComponent.reagent_affinity.name=Reagenz der elementaren Verbundenheit -item.bloodmagic.baseComponent.reagent_air.name=Luftreagenz -item.bloodmagic.baseComponent.reagent_binding.name=Bindendes Reagenz -item.bloodmagic.baseComponent.reagent_fast_miner.name=Reagenz der Eile -item.bloodmagic.baseComponent.reagent_growth.name=Wachstumsreagenz -item.bloodmagic.baseComponent.reagent_lava.name=Lavareagenz -item.bloodmagic.baseComponent.reagent_sight.name=Sichtreagenz -item.bloodmagic.baseComponent.reagent_suppression.name=Verdrängendes Reagenz -item.bloodmagic.baseComponent.reagent_void.name=Reagenz der Leere -item.bloodmagic.baseComponent.reagent_water.name=Wasserreagenz -item.bloodmagic.baseComponent.reagent_blood_light.name=Blutlampenreagenz -item.bloodmagic.baseComponent.reagent_magnetism.name=Magnetismusreagenz -item.bloodmagic.baseComponent.reagent_haste.name=Reagenz der Hast -item.bloodmagic.baseComponent.reagent_bridge.name=Reagenz der Phantombrücke -item.bloodmagic.baseComponent.reagent_compression.name=Kompressionsreagenz -item.bloodmagic.baseComponent.reagent_severance.name=Trennungsreagenz -item.bloodmagic.baseComponent.reagent_holding.name=Aufbewahrungsreagenz -item.bloodmagic.baseComponent.reagent_claw.name=Klauenreagenz -item.bloodmagic.baseComponent.reagent_bounce.name=Elastizitätsreagenz -item.bloodmagic.baseComponent.reagent_frost.name=Frostreagenz -item.bloodmagic.baseComponent.reagent_teleposition.name=Telepositionsreagenz -item.bloodmagic.baseComponent.reagent_transposition.name=Transpositionsreagenz - -item.bloodmagic.baseComponent.frame_part.name=Rahmenteile -item.bloodmagic.baseComponent.sand_iron.name=Eisensand -item.bloodmagic.baseComponent.sand_gold.name=Goldsand -item.bloodmagic.baseComponent.sand_coal.name=Kohlesand -item.bloodmagic.baseComponent.plant_oil.name=Pflanzenöl -item.bloodmagic.baseComponent.sulfur.name=Schwefel -item.bloodmagic.baseComponent.saltpeter.name=Saltpeter -item.bloodmagic.baseComponent.neuro_toxin.name=Nervengift -item.bloodmagic.baseComponent.antiseptic.name=Antiseptikum -item.bloodmagic.baseComponent.catalyst_length_1.name=Einfacher Verlängerungskatalysator -item.bloodmagic.baseComponent.catalyst_power_1.name=Einfacher Machtkatalysator - -item.bloodmagic.cutting_fluid.basic.name=Einfache Schneidelösung -item.bloodmagic.cutting_fluid.explosive.name=Explosives Pulver - -item.bloodmagic.demonCrystal.default.name=Kristall dämonischer Willenskraft -item.bloodmagic.demonCrystal.corrosive.name=Kristall korrosiver dämonischer Willenskraft -item.bloodmagic.demonCrystal.destructive.name=Kristall zerstörender dämonischer Willenskraft -item.bloodmagic.demonCrystal.vengeful.name=Kristall rachsüchtiger dämonischer Willenskraft -item.bloodmagic.demonCrystal.steadfast.name=Kristall standhafter dämonischer Willenskraft - -item.bloodmagic.monster_soul.raw.name=Dämonische Willenskraft -item.bloodmagic.monster_soul.corrosive.name=Korrosive dämonische Willenskraft -item.bloodmagic.monster_soul.destructive.name=Zerstörerische dämonische Willenskraft -item.bloodmagic.monster_soul.vengeful.name=Rachsüchtige dämonische Willenskraft -item.bloodmagic.monster_soul.steadfast.name=Standhafte dämonische Willenskraft - -item.bloodmagic.sigil.air.name=Luftsiegel -item.bloodmagic.sigil.compression.name=Siegel der Kompression -item.bloodmagic.sigil.divination.name=Siegel der Weissagung -item.bloodmagic.sigil.water.name=Wassersiegel -item.bloodmagic.sigil.lava.name=Lavasiegel -item.bloodmagic.sigil.void.name=Siegel der Leere -item.bloodmagic.sigil.haste.name=Siegel der Hast -item.bloodmagic.sigil.suppression.name=Siegel der Verdrängung -item.bloodmagic.sigil.magnetism.name=Siegel des Magnetismus -item.bloodmagic.sigil.seer.name=Siegel des Sehers -item.bloodmagic.sigil.whirlwind.name=Siegel des Wirbelwindes -item.bloodmagic.sigil.holding.name=Siegel der Aufbewahrung -item.bloodmagic.sigil.holding.display=&r%s: &o&n%s -item.bloodmagic.sigil.teleposition.name=Telepositionssiegel -item.bloodmagic.sigil.transposition.name=Transpositionssiegel -item.bloodmagic.sigil.claw.name=Siegel der Klaue -item.bloodmagic.sigil.bounce.name=Siegel der Elastizität -item.bloodmagic.sigil.frost.name=Siegel des Winteratems -item.bloodmagic.sigil.blood_light.name=Siegel der Blutlampe -item.bloodmagic.sigil.elemental_affinity.name=Siegel der elementaren Verbundenheit -item.bloodmagic.sigil.ender_severance.name=Siegel des Endertrennens -item.bloodmagic.sigil.fast_miner.name=Siegel des Eile -item.bloodmagic.sigil.green_grove.name=Siegel des grünen Hains -item.bloodmagic.sigil.phantom_bridge.name=Siegel der Phantombrücke - -item.bloodmagic.livingArmour.helmet.name=Lebender Helm -item.bloodmagic.livingArmour.chest.name=Lebender Brustpanzer -item.bloodmagic.livingArmour.legs.name=Lebender Beinschutz -item.bloodmagic.livingArmour.boots.name=Lebende Schuhe -item.bloodmagic.sentientArmour.helmet.name=Empfindsamer Helm -item.bloodmagic.sentientArmour.chest.name=Empfindsamer Brustpanzer -item.bloodmagic.sentientArmour.legs.name=Empfindsamer Beinschutz -item.bloodmagic.sentientArmour.boots.name=Empfindsame Schuhe - -item.bloodmagic.altarMaker.name=Altarersteller - -item.bloodmagic.ritualDismantler.name=Ritual Dismantler -item.bloodmagic.ritualDivinernormal.name=Ritualrute -item.bloodmagic.ritualDivinerdusk.name=Ritualrute [Abenddämmerung] -item.bloodmagic.ritualDivinerdawn.name=Ritualrute [Morgendämmerung] -item.bloodmagic.ritualReader.name=Ritual-Tüftler - -item.bloodmagic.arcaneAshes.name=Arkane Asche -item.bloodmagic.upgradeTome.name=These zur Verbesserung lebender Rüstung -item.bloodmagic.downgradeTome.name=These zur Schwächung lebender Rüstung -item.bloodmagic.upgradeTrainer.name=Trainingsband für Lebende Rüstung - -item.bloodmagic.sentientSword.name=Empfindsames Schwert -item.bloodmagic.soulGem.petty.name=Winziges Juwel des Tartaros -item.bloodmagic.soulGem.lesser.name=Niederes Juwel des Tartaros -item.bloodmagic.soulGem.common.name=Gewöhnliches Juwel des Tartaros -item.bloodmagic.soulGem.greater.name=Größeres Juwel des Tartaros -item.bloodmagic.soulGem.grand.name=Großartiges Juwel des Tartaros -item.bloodmagic.soulSnare.base.name=Rudimentäre Schlinge -item.bloodmagic.sentientBow.name=Empfindsamer Bogen -item.bloodmagic.sentientArmourGem.name=Juwel der Empfindsamen Rüstung -item.bloodmagic.sentientAxe.name=Empfindsame Axt -item.bloodmagic.sentientPickaxe.name=Empfindsame Spitzhacke -item.bloodmagic.sentientShovel.name=Empfindsame Schaufel - -item.bloodmagic.nodeRouter.name=Netzknoten-Router -item.bloodmagic.itemFilter.exact.name=Präziser Gegenstandsfilter -item.bloodmagic.itemFilter.ignoreNBT.name=Ignoriere NBT Gegenstandsfilter -item.bloodmagic.itemFilter.modItems.name=Mod Gegenstandsfilter -item.bloodmagic.itemFilter.oreDict.name=Ore Dictionary Gegenstandsfilter -item.bloodmagic.fluidFilter.exact.name=Flüssigeitsfilter - -item.bloodmagic.experienceTome.name=Peritia-Foliant -item.bloodmagic.sanguineBook.name=Inspectoris Scandalum - -item.bloodmagic.living_point_upgrade.draft_angelus.name=Trank der Engelsmacht - -item.bloodmagic.willGauge.name=Dämonischer Auramesser -item.bloodmagic.potionFlask.name=Trankflasche - -item.bloodmagic.icarusScroll.name=Ikarusrolle - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=Lebensessenz - -tile.bloodmagic.bloodstone_brick.name=Blutsteinziegel -tile.bloodmagic.bloodstone_tile.name=Großer Blutsteinziegel - -tile.bloodmagic.crystal_brick.name=Kristallklumpenziegel -tile.bloodmagic.crystal_tile.name=Kristallklumpen - -tile.bloodmagic.phantom.name=Phantomblock - -tile.bloodmagic.stone.ritual.master.name=Meisterritualstein -tile.bloodmagic.stone.ritual.imperfect.name=Imperfekter Ritualstein -tile.bloodmagic.stone.ritual.inverted.name=Umgekehrter Meisterritualstein - -tile.bloodmagic.altar.name=Blutaltar -tile.bloodmagic.alchemyArray.name=Alchemische Anordnung - -tile.bloodmagic.rune.blank.name=Leere Rune -tile.bloodmagic.rune.speed.name=Geschwindigkeitsrune -tile.bloodmagic.rune.efficiency.name=Effizienzrune -tile.bloodmagic.rune.sacrifice.name=Rune der Opferung -tile.bloodmagic.rune.displacement.name=Rune der Verlagerung -tile.bloodmagic.rune.capacity.name=Kapazitätsrune -tile.bloodmagic.rune.orb.name=Rune der Blutkugel -tile.bloodmagic.rune.acceleration.name=Beschleunigungsrune -tile.bloodmagic.rune.charging.name=Aufladungsrune -tile.bloodmagic.rune.augmented_capacity.name=Rune der erweiterten Kapazität -tile.bloodmagic.rune.self_sacrifice.name=Rune der Selbstopferung - -tile.bloodmagic.ritualStone.blank.name=Ritualstein -tile.bloodmagic.ritualStone.water.name=Wasserritualstein -tile.bloodmagic.ritualStone.fire.name=Feuerritualstein -tile.bloodmagic.ritualStone.earth.name=Erdritualstein -tile.bloodmagic.ritualStone.air.name=Luftritualstein -tile.bloodmagic.ritualStone.dusk.name=Abenddämmerungsritualstein -tile.bloodmagic.ritualStone.dawn.name=Morgendämmerungsritualstein - -tile.bloodmagic.bloodLight.name=Blutlampe -tile.bloodmagic.spectralBlock.name=Spektralblock -tile.bloodmagic.incenseAltar.name=Räucheraltar - -tile.bloodmagic.teleposer.name=Teleposer -tile.bloodmagic.soulForge.name=Höllenfeuerschmiede -tile.bloodmagic.alchemyTable.name=Alchemietisch -tile.bloodmagic.demonCrucible.name=Dämonenschmelztiegel -tile.bloodmagic.demonPylon.name=Dämonenpylon -tile.bloodmagic.demonCrystallizer.name=Dämonenkristallisierer - -tile.bloodmagic.masterRouting.name=Haupt-Verteilerknoten -tile.bloodmagic.outputRouting.name=Ausgehender Verteilerknoten -tile.bloodmagic.inputRouting.name=Eingehender Verteilerknoten -tile.bloodmagic.itemRouting.name=Verteilerknoten - -tile.bloodmagic.path.wood.name=Hölzerner Pfad -tile.bloodmagic.path.woodtile.name=Gekachelter Holzpfad -tile.bloodmagic.path.stone.name=Steinziegelpfad -tile.bloodmagic.path.stonetile.name=Gekachelter Steinpfad -tile.bloodmagic.path.wornstone.name=Verwitterter Steinziegelpfad -tile.bloodmagic.path.wornstonetile.name=Gekachelter verwitterter Steinpfad -tile.bloodmagic.path.obsidian.name=Obsidianziegelpfad -tile.bloodmagic.path.obsidiantile.name=Gekachelter Obsidianpfad - -tile.bloodmagic.dimensionalPortal.name=Dimensionsportal -tile.bloodmagic.bloodTank.name=Bluttank - -tile.bloodmagic.demonCrystal.default.name=Kristallgruppe dämonischen Willens -tile.bloodmagic.demonCrystal.corrosive.name=Kristallgruppe korrosiven dämonischen Willens -tile.bloodmagic.demonCrystal.destructive.name=Kristallgruppe zerstörerischen dämonischen Willens -tile.bloodmagic.demonCrystal.vengeful.name=Kristallgruppe rachsüchtigen dämonischen Willens -tile.bloodmagic.demonCrystal.steadfast.name=Kristallgruppe standhaften dämonischen Willens - -tile.bloodmagic.mimic.nohitbox.name=Ätherischer opaker Mimikblock -tile.bloodmagic.mimic.solidopaque.name=Opaker Mimikblock -tile.bloodmagic.mimic.solidclear.name=Klarer Mimikblock -tile.bloodmagic.mimic.solidlight.name=Leuchtender Mimikblock -tile.bloodmagic.mimic.sentient.name=Empfindsamer Mimikblock - -tile.bloodmagic.bricks1.brick1_raw.name=Rohe Steinziegel -tile.bloodmagic.bricks1.brick1_corrosive.name=Korrosive Steinziegel -tile.bloodmagic.bricks1.brick1_destructive.name=Zerstörerische Steinziegel -tile.bloodmagic.bricks1.brick1_vengeful.name=Rachsüchtige Steinziegel -tile.bloodmagic.bricks1.brick1_steadfast.name=Standhafte Steinziegel - -tile.bloodmagic.bricks2.smallbrick_raw.name=Kleine rohe Steinziegel -tile.bloodmagic.bricks2.smallbrick_corrosive.name=Kleine korrosive Steinziegel -tile.bloodmagic.bricks2.smallbrick_destructive.name=Kleine zerstörerische Steinziegel -tile.bloodmagic.bricks2.smallbrick_vengeful.name=Kleine rachsüchtige Steinziegel -tile.bloodmagic.bricks2.smallbrick_steadfast.name=Kleine standhafte Steinziegel -tile.bloodmagic.bricks2.tile_raw.name=Rohe Steinkacheln -tile.bloodmagic.bricks2.tile_corrosive.name=Korrosive Steinkacheln -tile.bloodmagic.bricks2.tile_destructive.name=Zerstörerische Steinkacheln -tile.bloodmagic.bricks2.tile_vengeful.name=Rachsüchtige Steinkacheln -tile.bloodmagic.bricks2.tile_steadfast.name=Standhafte Steinkacheln -tile.bloodmagic.bricks2.tilespecial_raw.name=Betonte rohe Steinkacheln -tile.bloodmagic.bricks2.tilespecial_corrosive.name=Betonte korrosive Steinkacheln -tile.bloodmagic.bricks2.tilespecial_destructive.name=Betonte zerstörerische Steinkacheln -tile.bloodmagic.bricks2.tilespecial_vengeful.name=Betonte rachsüchtige Steinkacheln -tile.bloodmagic.bricks2.tilespecial_steadfast.name=Betonte standhafte Steinkacheln - -tile.bloodmagic.inversionpillar.raw.name=Rohe Inversionssäule -tile.bloodmagic.inversionpillar.corrosive.name=Korrosive Inversionssäule -tile.bloodmagic.inversionpillar.destructive.name=Zerstörerische Inversionssäule -tile.bloodmagic.inversionpillar.vengeful.name=Rachsüchtige Inversionssäule -tile.bloodmagic.inversionpillar.steadfast.name=Standhafte Inversionssäule - -tile.bloodmagic.inversionpillarend.raw_bottom.name=Basis der rohen Inversionssäule -tile.bloodmagic.inversionpillarend.corrosive_bottom.name=Basis der korrosiven Inversionssäule -tile.bloodmagic.inversionpillarend.destructive_bottom.name=Basis der zerstörerischen Inversionssäule -tile.bloodmagic.inversionpillarend.vengeful_bottom.name=Basis der rachsüchtigen Inversionssäule -tile.bloodmagic.inversionpillarend.steadfast_bottom.name=Basis der standhaften Inversionssäule -tile.bloodmagic.inversionpillarend.raw_top.name=Kapitell der rohen Inversionssäule -tile.bloodmagic.inversionpillarend.corrosive_top.name=Kapitell der korrosiven Inversionssäule -tile.bloodmagic.inversionpillarend.destructive_top.name=Kapitell der zerstörerischen Inversionssäule -tile.bloodmagic.inversionpillarend.vengeful_top.name=Kapitell der rachsüchtigen Inversionssäule -tile.bloodmagic.inversionpillarend.steadfast_top.name=Kapitell der standhaften Inversionssäule - -tile.bloodmagic.demonlight.raw.name=Rohes Dämonenauge -tile.bloodmagic.demonlight.corrosive.name=Korrosives Dämonenauge -tile.bloodmagic.demonlight.destructive.name=Zerstörerisches Dämonenauge -tile.bloodmagic.demonlight.vengeful.name=Rachsüchtiges Dämonenauge -tile.bloodmagic.demonlight.steadfast.name=Standhaftes Dämonenauge - -tile.bloodmagic.extras.stone_raw.name=Roher Stein -tile.bloodmagic.extras.stone_corrosive.name=Korrosiver Stein -tile.bloodmagic.extras.stone_destructive.name=Zerstörerischer Stein -tile.bloodmagic.extras.stone_vengeful.name=Rachsüchtiger Stein -tile.bloodmagic.extras.stone_steadfast.name=Standhafter Stein - -tile.bloodmagic.extras.polished_raw.name=Polierter roher Stein -tile.bloodmagic.extras.polished_corrosive.name=Polierter korrosiver Stein -tile.bloodmagic.extras.polished_destructive.name=Polierter zerstörerischer Stein -tile.bloodmagic.extras.polished_vengeful.name=Polierter rachsüchtiger Stein -tile.bloodmagic.extras.polished_steadfast.name=Polierter standhafter Stein - -tile.bloodmagic.extras.metal_raw.name=Rohe Dämonenlegierung -tile.bloodmagic.extras.metal_corrosive.name=Korrosive Dämonenlegierung -tile.bloodmagic.extras.metal_destructive.name=Zerstörerische Dämonenlegierung -tile.bloodmagic.extras.metal_vengeful.name=Rachsüchtige Dämonenlegierung -tile.bloodmagic.extras.metal_steadfast.name=Standhafte Dämonenlegierung - -tile.bloodmagic.pillar1.raw.name=Rohe Steinsäule -tile.bloodmagic.pillar1.corrosive.name=Korrosive Steinsäule -tile.bloodmagic.pillar1.destructive.name=Zerstörerische Steinsäule -tile.bloodmagic.pillar1.vengeful.name=Rachsüchtige Steinsäule -tile.bloodmagic.pillar1.steadfast.name=Standhafte Steinsäule - -tile.bloodmagic.pillar2.raw.name=Betonte rohe Steinsäule -tile.bloodmagic.pillar2.corrosive.name=Betonte korrosive Steinsäule -tile.bloodmagic.pillar2.destructive.name=Betonte zerstörerische Steinsäule -tile.bloodmagic.pillar2.vengeful.name=Betonte rachsüchtige Steinsäule -tile.bloodmagic.pillar2.steadfast.name=Betonte standhafte Steinsäule - -tile.bloodmagic.pillarCap1.raw.name=Kapitell der rohen Steinsäule -tile.bloodmagic.pillarCap1.corrosive.name=Kapitell der korrosiven Steinsäule -tile.bloodmagic.pillarCap2.destructive.name=Kapitell der zerstörerischen Steinsäule -tile.bloodmagic.pillarCap2.vengeful.name=Kapitell der rachsüchtigen Steinsäule -tile.bloodmagic.pillarCap3.steadfast.name=Kapitell der standhaften Steinsäule - -tile.bloodmagic.wall1.brick_raw.name=Rohe Steinziegelmauer -tile.bloodmagic.wall1.brick_corrosive.name=Korrosive Steinziegelmauer -tile.bloodmagic.wall1.brick_destructive.name=Zerstörerische Steinziegelmauer -tile.bloodmagic.wall1.brick_vengeful.name=Rachsüchtige Steinziegelmauer -tile.bloodmagic.wall1.brick_steadfast.name=Standhafte Steinziegelmauer -tile.bloodmagic.wall1.smallbrick_raw.name=Rohe Steinmauer mit kleinen Ziegeln -tile.bloodmagic.wall1.smallbrick_corrosive.name=Korrosive Steinmauer mit kleinen Ziegeln -tile.bloodmagic.wall1.smallbrick_destructive.name=Zerstörerische Steinmauer mit kleinen Ziegeln -tile.bloodmagic.wall1.smallbrick_vengeful.name=Rachsüchtige Steinmauer mit kleinen Ziegeln -tile.bloodmagic.wall1.smallbrick_steadfast.name=Standhafte Steinmauer mit kleinen Ziegeln -tile.bloodmagic.wall1.large_raw.name=Rohe Steinmauer -tile.bloodmagic.wall1.large_corrosive.name=Korrosive Steinmauer -tile.bloodmagic.wall1.large_destructive.name=Zerstörerische Steinmauer -tile.bloodmagic.wall1.large_vengeful.name=Rachsüchtige Steinmauer -tile.bloodmagic.wall1.large_steadfast.name=Standhafte Steinmauer - -tile.bloodmagic.stairs1.raw.name=Rohe Steintreppe -tile.bloodmagic.stairs1.corrosive.name=Korrosive Steintreppe -tile.bloodmagic.stairs2.destructive.name=Zerstörerische Steintreppe -tile.bloodmagic.stairs2.vengeful.name=Rachsüchtige Steintreppe -tile.bloodmagic.stairs3.steadfast.name=Standhafte Steintreppe - -# Fluids -fluid.lifeEssence=Lebensessenz - -# HUD -hud.bloodmagic.inactive=Inactive - -# Tooltips -tooltip.bloodmagic.extraInfo=&9-Halte Shift für mehr Info- - -tooltip.bloodmagic.orb.desc=Speichert Lebensessenz -tooltip.bloodmagic.orb.owner=Hinzugefügt durch: %s -tooltip.bloodmagic.currentOwner=Eigentümer: %s -tooltip.bloodmagic.currentTier=Momentane Ausbaustufe: %d -tooltip.bloodmagic.config.disabled=Zurzeit durch Konfiguration deaktiviert -tooltip.bloodmagic.tier=Ausbaustufe %d - -tooltip.bloodmagic.activated=Aktiviert -tooltip.bloodmagic.deactivated=Deaktiviert - -tooltip.bloodmagic.activation_crystal.awakened=Aktiviert mächtigere Rituale -tooltip.bloodmagic.activation_crystal.creative=Kreativmodus: Aktiviert jedes Ritual -tooltip.bloodmagic.activation_crystal.weak=Aktiviert niedrig-levelige Rituale - -tooltip.bloodmagic.sigil.air.desc=&oIch fühl mich schon leichter... -tooltip.bloodmagic.sigil.compression.desc=&oDiamanthände -tooltip.bloodmagic.sigil.divination.desc=&oSpähe in die Seele -tooltip.bloodmagic.sigil.divination.otherNetwork=Peering into the soul of %s -tooltip.bloodmagic.sigil.divination.currentAltarTier=Ausbaustufe: %d -tooltip.bloodmagic.sigil.divination.currentEssence=Gespeicherte Lebensessenz: %d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=Maximale Kapazität: %d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=Momentane Gelassenheit: %d -tooltip.bloodmagic.sigil.divination.currentInversion=Momentane Inversion: %d -tooltip.bloodmagic.sigil.divination.currentBonus=Momentaner Bonus: +%d%% -tooltip.bloodmagic.sigil.water.desc=&oHat jemand nach unendlichem Wasser gefragt? -tooltip.bloodmagic.sigil.lava.desc=&oHEISS! NICHT ESSEN! -tooltip.bloodmagic.sigil.void.desc=&oBesser als Swiffer®! -tooltip.bloodmagic.sigil.magnetism.desc=&oIch habe eine anziehende Persönlichkeit -tooltip.bloodmagic.sigil.suppression.desc=&oBesser als Telekinese -tooltip.bloodmagic.sigil.haste.desc=&o42 Dosen Koffein später... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oAchtung! Fallende Feuerfische -tooltip.bloodmagic.sigil.seer.desc=&oWenn allsehend nicht genug ist -tooltip.bloodmagic.sigil.seer.currentAltarProgress=Fortschritt: %d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=Fortschritt: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=Verbrauch: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=Ausbaustufe: %d -tooltip.bloodmagic.sigil.seer.currentEssence=Gespeicherte Lebensessenz: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=Maximale Kapazität: %d LP -tooltip.bloodmagic.sigil.seer.currentCharge=Ladung: %d -tooltip.bloodmagic.sigil.seer.currentTranquility=Momentane Gelassenheit: %d -tooltip.bloodmagic.sigil.seer.currentBonus=Momentaner Bonus: +%d%% -tooltip.bloodmagic.sigil.whirlwind.desc=&oBesser keinen Rock tragen -tooltip.bloodmagic.sigil.teleposition.desc=Das ist beinahe ein bewegender Moment. -tooltip.bloodmagic.sigil.transposition.desc=Spüre die Stärke der Macht, mein junger Schüler. -tooltip.bloodmagic.sigil.holding.press=Drücke &o%s&r&7 zum ändern -tooltip.bloodmagic.sigil.holding.desc=Gesiegelte Siegel -tooltip.bloodmagic.sigil.holding.sigilInSlot=Platz %d: %s -tooltip.bloodmagic.sigil.blood_light.desc=&oIch sehe ein Licht! -tooltip.bloodmagic.sigil.ender_severance.desc=&oBringt Endermen in Notlage -tooltip.bloodmagic.sigil.fast_miner.desc=&oHacke wie ein Weltmeister -tooltip.bloodmagic.sigil.green_grove.desc=&oUmweltverträglich -tooltip.bloodmagic.sigil.phantom_bridge.desc=&oLaufen auf dünner Luft... - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=Erhöht die maximalen Punkte der Lebenden Rüstung auf %d. - -tooltip.bloodmagic.bound.sword.desc=&oSchlachten der Schwachen -tooltip.bloodmagic.bound.pickaxe.desc=&oSteinzerstörung ohne Erbarmen -tooltip.bloodmagic.bound.axe.desc=&oDämonischer Kahlschlag -tooltip.bloodmagic.bound.shovel.desc=&oSchrubbt den Dreck vom Boden - -tooltip.bloodmagic.sacrificialDagger.desc=Schon ein Stich in den Finger genügt -tooltip.bloodmagic.sacrificialDagger.creative=Rechtsklicke einen Altar während du kriechst, um diesen zu füllen -tooltip.bloodmagic.slate.desc=Stein getränkt im Blutaltar -tooltip.bloodmagic.inscriber.desc=Die Zeichen sind an der Wand... - -tooltip.bloodmagic.pack.selfSacrifice.desc=Es scheuert richtig... -tooltip.bloodmagic.pack.sacrifice.desc=Beschreibung -tooltip.bloodmagic.pack.stored=Enthält: %d LP - - -tooltip.bloodmagic.diviner.currentRitual=Ritual: -tooltip.bloodmagic.diviner.blankRune=Leere Runen: %d -tooltip.bloodmagic.diviner.waterRune=Wasserrunen: %d -tooltip.bloodmagic.diviner.airRune=Luftrunen: %d -tooltip.bloodmagic.diviner.fireRune=Feuerrunen: %d -tooltip.bloodmagic.diviner.earthRune=Erdrunen: %d -tooltip.bloodmagic.diviner.duskRune=Runen der Abenddämmerung: %d -tooltip.bloodmagic.diviner.dawnRune=Runen der Morgendämmerung: %d -tooltip.bloodmagic.diviner.totalRune=Runen insgesamt: %d -tooltip.bloodmagic.diviner.extraInfo=Halte Shift für extra Info -tooltip.bloodmagic.diviner.extraExtraInfo=&9-Halte Shift + M für Augmentationsinfo- -tooltip.bloodmagic.diviner.currentDirection=Richtung: %s - -tooltip.bloodmagic.ritualReader.currentState=Modus: %s -tooltip.bloodmagic.ritualReader.set_area=Definiere Gebiet -tooltip.bloodmagic.ritualReader.information=Information -tooltip.bloodmagic.ritualReader.set_will_types=Setze verbrauchten Willen -tooltip.bloodmagic.ritualReader.desc.set_area=Rechtsklick auf einen aktiven Meisterritualstein, um auszuwählen, welches Gebiet vom Ritual modifiziert werden soll. Dann klicke auf zwei gegenüberliegende Ecken, um das neue Gebiet zu definieren. -tooltip.bloodmagic.ritualReader.desc.information=Rechtsklick auf einen aktiven Meisterritualstein, um Informationen über das Ritual anzuzeigen. -tooltip.bloodmagic.ritualReader.desc.set_will_types=Setze durch einen Rechtsklick auf den MRS mit den jeweiligen Kristallen die Aspekte dämonischen Willens, die das Ritual über die Aura aufnimmt. - -tooltip.bloodmagic.arcaneAshes=Asche gebraucht für einen alchemischen Kreis - -tooltip.bloodmagic.telepositionFocus.coords=Koordinaten: (%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=Dimensions-ID: %d -tooltip.bloodmagic.telepositionFocus.bound=Bound: %s at %d, %d, %d -tooltip.bloodmagic.telepositionFocus.weak=Benutzt, um Blöcke zu teleportieren -tooltip.bloodmagic.telepositionFocus.enhanced=Benutzt, um Blöcke zu teleportieren -tooltip.bloodmagic.telepositionFocus.reinforced=Benutzt, um Blöcke zu teleportieren -tooltip.bloodmagic.telepositionFocus.demonic=Benutzt, um Blöcke zu teleportieren - -tooltip.bloodmagic.livingArmour.upgrade.speed=Schnelle Füße -tooltip.bloodmagic.livingArmour.upgrade.digging=Zwergenhafte Stärke -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=Giftresistenz -tooltip.bloodmagic.livingArmour.upgrade.fireResist=Gabe des Feuers -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=Zähe Handballen -tooltip.bloodmagic.livingArmour.upgrade.knockback=Body Builder -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=Zähe Haut -tooltip.bloodmagic.livingArmour.upgrade.health=Gesund -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Heftiger Schlag -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Trickschuss -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Stufenhilfe -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=Sprint des Sensenmanns -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=Solarbetrieben -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=Runenschild -tooltip.bloodmagic.livingArmour.upgrade.revealing=Aufdeckend -tooltip.bloodmagic.livingArmour.upgrade.experienced=Erfahren -tooltip.bloodmagic.livingArmour.upgrade.jump=Starke Beine -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=Weicher Fall -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=Totengräber -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=Sturmangriff -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=Gezielter Angriff -tooltip.bloodmagic.livingArmour.upgrade.elytra=Elytra -tooltip.bloodmagic.livingArmour.upgrade.nightSight=Nachtwandler -tooltip.bloodmagic.livingArmour.upgrade.repair=Reparierend - - -tooltip.bloodmagic.livingArmour.upgrade.slowness=Humpelnd -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=Verkümmerter Arm -tooltip.bloodmagic.livingArmour.upgrade.slippery=Schlittern -tooltip.bloodmagic.livingArmour.upgrade.battleHunger=Bluthunger -tooltip.bloodmagic.livingArmour.upgrade.quenched=Löschend -tooltip.bloodmagic.livingArmour.upgrade.meleeDecrease=Stumpfe Klinge -tooltip.bloodmagic.livingArmour.upgrade.digSlowdown=Schwache Spitzhacke -tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=Sturmtruppe -tooltip.bloodmagic.livingArmour.upgrade.slowHeal=Verseucht -tooltip.bloodmagic.livingArmour.upgrade.disoriented=Disorientiert - -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Level %d) -tooltip.bloodmagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.bloodmagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s - -tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-Halte Shift + M für Fortschrittsinfo- - -tooltip.bloodmagic.will=Willensqualität: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=Benutzt Dämonenwille um volles Potential freizusetzen -tooltip.bloodmagic.sentientAxe.desc=Benutzt Dämonenwille um volles Potential freizusetzen -tooltip.bloodmagic.sentientPickaxe.desc=Benutzt Dämonenwille um volles Potential freizusetzen -tooltip.bloodmagic.sentientShovel.desc=Benutzt Dämonenwille um volles Potential freizusetzen -tooltip.bloodmagic.soulGem.petty=Ein Juwel, das eine winzige Menge an Willen aufnehmen kann -tooltip.bloodmagic.soulGem.lesser=Ein Juwel, das ein wenig Willen festhalten kann -tooltip.bloodmagic.soulGem.common=Ein Juwel, das eine ordentliche Menge an Willen aufnehmen kann -tooltip.bloodmagic.soulGem.greater=Ein Juwel, das eine größere Menge an Willen aufnehmen kann -tooltip.bloodmagic.soulGem.grand=Ein Juwel, das eine große Menge an Willen aufnehmen kann -tooltip.bloodmagic.soulSnare.desc=Werfe nach einem Monster und töte es anschließend, um seinen Dämonischen Willen zu erhalten - -tooltip.bloodmagic.itemFilter.exact=Stellt sicher, dass die Gegenstände genau übereinstimmen -tooltip.bloodmagic.itemFilter.ignoreNBT=Ignoriert NBT des Filters -tooltip.bloodmagic.itemFilter.modItems=Erlaubt alle Gegenstände der gleichen Mod -tooltip.bloodmagic.itemFilter.oreDict=Filtert durch das Ore Dictionary - -tooltip.bloodmagic.fluidFilter.exact=Filtert Flüssigkeitseingang/-ausgang - -tooltip.bloodmagic.fluid.type=Enthaltene Flüssigkeit: %s -tooltip.bloodmagic.fluid.amount=Menge: %d / %d mB -tooltip.bloodmagic.fluid.capacity=Kapazität: %d mB - -tooltip.bloodmagic.ghost.everything=Alles -tooltip.bloodmagic.ghost.amount=Geistergegenstandsanzahl: %d - -tooltip.bloodmagic.currentType.default=Enthält: Roher Wille -tooltip.bloodmagic.currentType.corrosive=Enthält: Korrosiver Wille -tooltip.bloodmagic.currentType.destructive=Enthält: Zerstörerischer Wille -tooltip.bloodmagic.currentType.vengeful=Enthält: Rachsüchtiger Wille -tooltip.bloodmagic.currentType.steadfast=Enthält: Standhafter Wille - -tooltip.bloodmagic.currentBaseType.default=Roh -tooltip.bloodmagic.currentBaseType.corrosive=Korrosiv -tooltip.bloodmagic.currentBaseType.destructive=Zerstörerisch -tooltip.bloodmagic.currentBaseType.vengeful=Rachsüchtig -tooltip.bloodmagic.currentBaseType.steadfast=Standhaft - -tooltip.bloodmagic.experienceTome=Ein Buch, um Erfahrung zu sammeln -tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=Level: %d - -tooltip.bloodmagic.decoration.safe=Sicher als Dekoration -tooltip.bloodmagic.decoration.notSafe=Gefährlich als Dekoration - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d Nutzungen verbleibend - -tooltip.bloodmagic.potion.uses=%d Nutzungen verbleibend - -tooltip.bloodmagic.book.shifting=Diese Symbole scheinen sich zu... &overändern... - -tooltip.bloodmagic.willGauge=Ein merkwürdiges Gerät, das dämonischen Willen in der Aura messen kann. - -# Ritual -ritual.bloodmagic.blockRange.tooBig=Das Gebiet ist zu groß! Darf höchstens %s Blöcke groß sein. -ritual.bloodmagic.blockRange.tooFar=Das Gebiet ist zu weit! Muss in einer vertikalen Reichweite von %s Blöcken und einer horizontalen Reichweite von %s Blöcken sein. -ritual.bloodmagic.blockRange.inactive=Das Ritual ist inaktiv, das Gebiet kann nicht verändert werden. -ritual.bloodmagic.blockRange.noRange=Das Gebiet wurde nicht richtig ausgewählt. -ritual.bloodmagic.blockRange.firstBlock=Erster Block des neuen Gebietes gesetzt. -ritual.bloodmagic.blockRange.success=Neues Gebiet erfolgreich gesetzt! -ritual.bloodmagic.willConfig.set=Das Ritual wird den folgenden Typ dämonischen Willens nutzen: %s -ritual.bloodmagic.willConfig.void=Das Ritual nutzt keinen Willen mehr. - -ritual.bloodmagic.testRitual=Testritual -ritual.bloodmagic.waterRitual=Ritual der vollen Quelle -ritual.bloodmagic.lavaRitual=Serenade des Nethers -ritual.bloodmagic.greenGroveRitual=Ritual des grünen Hains -ritual.bloodmagic.jumpRitual=Ritual des hohen Sprungs -ritual.bloodmagic.wellOfSufferingRitual=Quelle des Leidens -ritual.bloodmagic.featheredKnifeRitual=Ritual der federnden Klinge -ritual.bloodmagic.regenerationRitual=Ritual der Regeneration -ritual.bloodmagic.harvestRitual=Ritual der Mondernte -ritual.bloodmagic.magneticRitual=Ritual des Magnetismus -ritual.bloodmagic.crushingRitual=Ritual des Brechers -ritual.bloodmagic.fullStomachRitual=Ritual des gefüllten Magens -ritual.bloodmagic.interdictionRitual=Ritual der Verbietung -ritual.bloodmagic.containmentRitual=Ritual der Eindämmung -ritual.bloodmagic.speedRitual=Ritual der Geschwindigkeit -ritual.bloodmagic.suppressionRitual=Ritual der Verdrängung -ritual.bloodmagic.expulsionRitual=Aura der Vertreibung -ritual.bloodmagic.zephyrRitual=Ruf des Zephyrs -ritual.bloodmagic.upgradeRemoveRitual=Klang der reinigenden Seele -ritual.bloodmagic.armourEvolveRitual=Ritual der lebenden Evolution -ritual.bloodmagic.animalGrowthRitual=Ritual des Hirten -ritual.bloodmagic.forsakenSoulRitual=Versammlung der verlassenen Seelen -ritual.bloodmagic.crystalHarvestRitual=Riss des gebrochenen Kristalls -ritual.bloodmagic.meteorRitual=Zeichen des fallenden Turms -ritual.bloodmagic.ellipseRitual=Fokus der Ellipse -ritual.bloodmagic.cobblestoneRitual=Ritual des gefrorenen Vulkans -ritual.bloodmagic.placerRitual=Füllung der Grube -ritual.bloodmagic.fellingRitual=Kahlschlag des Holzfällers -ritual.bloodmagic.pumpRitual=Hymne der Absaugung -ritual.bloodmagic.altarBuilderRitual=Die Zusammensetzung des hohen Altares -ritual.bloodmagic.portalRitual=Das Tor der Faltung -ritual.bloodmagic.downgradeRitual=Sühne der belasteten Seele -ritual.bloodmagic.crystalSplitRitual=Resonanz des facettierten Kristalls -ritual.bloodmagic.condorRitual=Reverence of the Condor -ritual.bloodmagic.eternalSoulRitual=Cry of the Eternal Soul -ritual.bloodmagic.groundingRitual=Ritual of Grounding -ritual.bloodmagic.featheredEarthRitual=Ritual of the Feathered Earth -ritual.bloodmagic.veilOfEvilRitual=Veil of Evil -ritual.bloodmagic.wardOfSacrosanctityRitual=Ward of Sacrosanctity - -ritual.bloodmagic.waterRitual.info=Generiert eine Wasserquelle auf dem Meisterritualstein. -ritual.bloodmagic.lavaRitual.info=Generiert eine Lavaquelle auf dem Meisterritualstein. -ritual.bloodmagic.lavaRitual.default.info=(Roh) Verringert die LP-Kosten der Lava und erlaubt die Platzierung in einem Tank. -ritual.bloodmagic.lavaRitual.corrosive.info=(Korrosiv) Objekte in Reichweite, die immun gegen Feuer sind nehmen hohen Schaden. -ritual.bloodmagic.lavaRitual.destructive.info=(Zerstörerisch) Lava Platzierungsweite ist basierend auf der Menge an Wille erhöht. -ritual.bloodmagic.lavaRitual.vengeful.info=(Rachsüchtig) Objekte in Reichweite werden mit dem Effekt Fire Fuse betroffen. -ritual.bloodmagic.lavaRitual.steadfast.info=(Standhaft) Spieler in einer gesetzten Reichweite bekommen Feuerresistenz. - -ritual.bloodmagic.greenGroveRitual.info=Beschleunigt das Pflanzenwachstum. -ritual.bloodmagic.jumpRitual.info=Objekte in Reichweite werden in die Luft gestoßen. -ritual.bloodmagic.wellOfSufferingRitual.info=Fügt Monstern im Gebiet Schaden zu und füllt damit LP in den Blutaltar. -ritual.bloodmagic.featheredKnifeRitual.info=Entzieht Spielern in Reichweite Leben und führt dem Blutaltar LP zu. -ritual.bloodmagic.regenerationRitual.info=Gibt allen Objekten in Reichweite den Regenerations-Effekt, wenn ihnen Leben fehlt. -ritual.bloodmagic.regenerationRitual.default.info=(Roh) -ritual.bloodmagic.regenerationRitual.corrosive.info=(Korrosiv) Stiehlt Leben von Monstern in Reichweite des Vampirismus-Effekts und führt es Spielern direkt zu. -ritual.bloodmagic.regenerationRitual.destructive.info=(Zerstörerisch) -ritual.bloodmagic.regenerationRitual.vengeful.info=(Rachsüchtig) -ritual.bloodmagic.regenerationRitual.steadfast.info=(Standhaft) -ritual.bloodmagic.harvestRitual.info=Erntet Pflanzen in Reichweite und lässt die Erträge auf den Boden fallen. -ritual.bloodmagic.magneticRitual.info=Zieht Erze aus dem Boden un platziert sie in Reichweite des Rituals. -ritual.bloodmagic.crushingRitual.info=Bricht Blöcke in Reichweite und platziert die Gegenstände in einer verbundenen Truhe. -ritual.bloodmagic.crushingRitual.destructive.info=(Zerstörerisch) Die Blöcke werden mit großer Kraft zerstört: Alle Blöcke sind mit Glück III betroffen. -ritual.bloodmagic.crushingRitual.steadfast.info=(Standhaft) Alle zerstörten Blöcke sind mit Behutsamkeit betroffen. Ãœberschreibt Glück falls anwendbar. -ritual.bloodmagic.crushingRitual.corrosive.info=(Korrosiv) Alle Blöcke werden mit einer Art Schneidelösung betroffen. Ãœberschreibt Behutsamkeit falls anwendbar. -ritual.bloodmagic.crushingRitual.vengeful.info=(Rachsüchtig) Komprimiert das Inventar bei einer erfolgreichen Operation. Momentan nur eine Kompression per Operation. -ritual.bloodmagic.crushingRitual.default.info=(Roh) Erhöht die Geschwindigkeit des Rituals basierend auf dem vorhandenen Willen. -ritual.bloodmagic.greenGroveRitual.corrosive.info=(Korrosiv) Objekte in Reichweite werden von Pflanzen attackiert, wodurch ihr Leben entzogen wird. -ritual.bloodmagic.greenGroveRitual.default.info=(Roh) Erhöht die Geschwindigkeit aller Operationen des Rituals basierend auf dem vorhandenen Willen in der Aura. -ritual.bloodmagic.greenGroveRitual.vengeful.info=(Rachsüchtig) Erhöht die Chance, dass ein Wachstumstick erfolgreich ist. -ritual.bloodmagic.greenGroveRitual.steadfast.info=(Standhaft) Samen werden neu gepflanzt und Blöcke in Reichweite werden bewässert. -ritual.bloodmagic.greenGroveRitual.destructive.info=(Zerstörerisch) Wachstumsreichweite wird basierend auf vorhandenen Willen erhöht. -ritual.bloodmagic.featheredKnifeRitual.default.info=(Roh) Erhöht die Geschwindigkeit des Rituals basierend auf dem vorhandenen Willen. -ritual.bloodmagic.featheredKnifeRitual.destructive.info=(Zerstörerisch) Erhöht den Ertrag des Rituals basierend auf dem vorhandenen Willen. -ritual.bloodmagic.featheredKnifeRitual.vengeful.info=(Rachsüchtig) Setzt die Mindestlebenspunkte für die Opferung auf 10%%. Wird von Standhaft für den Besitzer überschrieben, wenne es aktiv ist. -ritual.bloodmagic.featheredKnifeRitual.corrosive.info=(Korrosiv) Nutzt den Bonus des Räucheraltars, um den Ertrag der Opferung zu erhöhen. -ritual.bloodmagic.featheredKnifeRitual.steadfast.info=(Standhaft) Erhöht die Mindestlebenspunkte für die Opferung von 30%% to 70%%. -ritual.bloodmagic.speedRitual.default.info=(Roh) Erhöht die Geschwindigkeit basierend auf vorhandenen Willen. -ritual.bloodmagic.speedRitual.vengeful.info=(Rachsüchtig) Verhindert, dass erwachsene Mobs und Spieler transportiert werden. Spieler werden transportiert, wenn es mit Zerstörerisch kombiniert wird. -ritual.bloodmagic.speedRitual.destructive.info=(Zerstörerisch) Verhindert, dass Kindmobs und Spieler transportiert werden. Spieler werden transportiert, wenn es mit Rachsüchtig kombiniert wird. -ritual.bloodmagic.animalGrowthRitual.vengeful.info=(Rachsüchtig) Verringert die Zeit zwischen Deckungen. -ritual.bloodmagic.animalGrowthRitual.steadfast.info=(Standhaft) Züchtet Erwachsene im Gebiet automatisch mit Gegenständen aus einer verbundenen Truhe. -ritual.bloodmagic.animalGrowthRitual.default.info=(Roh) Erhöht die Geschwindigkeit des Rituals basierend auf dem vorhandenen Willen in der Aura. -ritual.bloodmagic.animalGrowthRitual.destructive.info=(Zerstörerisch) Lässt Erwachsene, die sich länger nicht mehr gedeckt haben, auf Monster zulaufen und explodieren. -ritual.bloodmagic.animalGrowthRitual.corrosive.info=(Korrosiv) Nicht implementiert. -ritual.bloodmagic.groundingRitual.info=Forces entities on the ground and prevents jumping. -ritual.bloodmagic.groundingRitual.default.info=(Raw) Affects players. -ritual.bloodmagic.groundingRitual.corrosive.info=(Corrosive) Disables gravity (+Vengeful) Applies Levitation. -ritual.bloodmagic.groundingRitual.destructive.info=(Destructive) Applies Heavy Heart (increases fall damage) (+Vengeful) Stronger effect. -ritual.bloodmagic.groundingRitual.steadfast.info=(Steadfast) Affects Bosses. Doesn't affect bosses that are immune against motion change or immune against potions (except Wither and Ender Dragon). -ritual.bloodmagic.groundingRitual.vengeful.info=(Vengeful) Makes effects stronger. (+Corrosive) Applies Levitation. (+Destructive) Higher Heavy Heart amplifier. -ritual.bloodmagic.condorRitual.info=Provides flight in an area around the ritual. -ritual.bloodmagic.eternalSoulRitual.info=Capable of transferring Life Essence from a Network back into an Altar at a cost. - -ritual.bloodmagic.crystalSplitRitual.info=Spaltet eine ausgewachsene rohe Kristallgruppe in die Aspekte auf. -ritual.bloodmagic.fullStomachRitual.info=Entfernt Essen aus der verbundenen Truhe, um die Sättigung des Spielers zu füllen. -ritual.bloodmagic.interdictionRitual.info=Stößt alle Mobs im Gebiet weg vom Meisterritualstein. -ritual.bloodmagic.containmentRitual.info=Zieht alle Mobs im Gebiet zum Meisterritualstein. -ritual.bloodmagic.speedRitual.info=Stößt Spieler im Gebiet in Richtung des Rituals -ritual.bloodmagic.suppressionRitual.info=Verdrängt Flüssigkeiten im Ritualbereich - das Deaktivieren des Rituals bringt die Flüssigkeiten wieder zurück. -ritual.bloodmagic.expulsionRitual.info=Teleportiert Spieler, die weder Besitzer des Rituals sind, noch eine gebundene Blutkugel in einer verbundenen Truhe haben, weg vom Ritual. -ritual.bloodmagic.zephyrRitual.info=Nimmt in der nähe befindliche Gegenstände auf und platziert sie in der verbundenen Truhe. -ritual.bloodmagic.upgradeRemoveRitual.info=Entfernt alle Eigenschaften von der Lebenden Rüstung und gibt die dazugehörigen Thesen. Diese können benutzt werden, um sie wieder der Lebenden Rüstung hinzuzufügen. -ritual.bloodmagic.armourEvolveRitual.info=Erhöht das Maximum verfügbarer Upgrade-Punkte der Lebenden Rüstung auf 300. -ritual.bloodmagic.animalGrowthRitual.info=Erhöht die Wachstumsgeschwindigkeit nahegelegener Tiere, die noch nicht erwachsen sind. -ritual.bloodmagic.forsakenSoulRitual.info=Fügt Mobs im Gebiet Schaden zu. Wenn ein Mob stirbt, wird ein Kristall in der Kristlalreichweite wachsen. -ritual.bloodmagic.crystalHarvestRitual.info=Zerstört Kristalle dämonischen Willes in Reichweite. Die Erträge werden auf den Kristallen fallen gelassen. -ritual.bloodmagic.placerRitual.info=Nimmt sich Blöcke aus dem verbundenen Inventar und platziert sie in der Welt. -ritual.bloodmagic.fellingRitual.info=Zerstört alle Bäume (ihr Holz und Blätter) in einem Gebiet und platziert die Erträge in einem verbundenen Inventar. -ritual.bloodmagic.pumpRitual.info=Sucht im definierten Gebiet nach Flüssigkeiten. Entfernt und platziert die Flüssigkeiten nur in einem verbundenen Tank, wenn dieser bereits mindestens mit einem Eimer der Flüssigkeit gefüllt ist. -ritual.bloodmagic.altarBuilderRitual.info=Baut einen Altar aus den Materialien im verbundenen Altar. -ritual.bloodmagic.portalRitual.info=Erstellt ein Portalnetzwerk basierend auf dem aktivierenden Spieler und Blöcke, die sich in direkter Umgebung des Rituals befinden. Blöcke können nach aktivierung des Portals verändert werden, ohne das Netzwerk zu ändern und portale mit dem gleichen "Schlüssel" verbinden sich miteinander. -ritual.bloodmagic.meteorRitual.info=Konsumiert einen Gegenstand in Reichweite um einen Meteor voller Ressourcen vom Himmel zu beschwören, welcher direkt auf das Ritual fällt. - -ritual.bloodmagic.waterRitual.waterRange.info=(Wasser) Das Gebiet, in dem das Ritual Wasser-Quellblöcke platzieren wird. -ritual.bloodmagic.waterRitual.waterTank.info=(Roh) Der von dem Ritual mit Wasser zu befüllende Tank. -ritual.bloodmagic.lavaRitual.lavaRange.info=(Lava) Das Gebiet, in dem das Ritual Lava-Quellblöcke platzieren wird -ritual.bloodmagic.lavaRitual.lavaTank.info=(Roh) Der von dem Ritual mit Lava zu befüllende Tank. -ritual.bloodmagic.lavaRitual.fireFuse.info=(Rachsüchtig) Objekte in diesem Gebiet erhalten den "Fire Fuse"-Effekt. -ritual.bloodmagic.lavaRitual.fireResist.info=(Standhaft) Spieler in diesem Gebiet erhalten Feuerresistenz. -ritual.bloodmagic.lavaRitual.fireDamage.info=(Korrosiv) Objekte in diesem Gebiet, die immun gegen Feuerschaden sind, nehmen Schaden proportional zum vorhandenem Willen. -ritual.bloodmagic.greenGroveRitual.growing.info=(Wachstum) Das Gebiet, in dem das Ritual Pflanzen wachsen lässt. -ritual.bloodmagic.greenGroveRitual.leech.info=(Korrosiv) Objekte in diesem Gebiet wird Leben entzogen, um die Pflanzen wachsen zu lassen. -ritual.bloodmagic.greenGroveRitual.hydrate.info=(Standhaft) Blöcke in diesem gebiet werden zu Farmland bewässert und Samen in diesem Gebiet werden in der Nähe gepflanzt. -ritual.bloodmagic.jumpRitual.jumpRange.info=(Springen) Objekte in diesem Gebiet werden in die Luft gestoßen. -ritual.bloodmagic.wellOfSufferingRitual.altar.info=(Altar) In diesem Gebiet sucht das Ritual nach dem Blutaltar. Eine Veränderung wird das Gebiet entweder vergrößern oder verringern. -ritual.bloodmagic.wellOfSufferingRitual.damage.info=(Schaden) Dieses Gebiet definiert, wo Mobs schaden nehmen. Alle Mobs in diesem gebiet (außer dem Spieler) werden Schaden über Zeit nehmen. -ritual.bloodmagic.featheredKnifeRitual.altar.info=(Altar) In diesem Gebiet sucht das Ritual nach dem Blutaltar. Eine Veränderung wird das Gebiet entweder vergrößern oder verringern. -ritual.bloodmagic.featheredKnifeRitual.damage.info=(Schaden) In diesem Gebiet wird den Spielern Schaden durch das Ritual zugefügt. Spieler innerhalb des Gebietes nehmen Schaden über Zeit bis zum gesetzten Limit. -ritual.bloodmagic.regenerationRitual.heal.info=(Heilung) Objekte innerhalb dieses Gebietes bekommen einen Regenerationseffekt. -ritual.bloodmagic.regenerationRitual.vampire.info=(Vampirismus) Mobs innerhalb des Gebiets wird Leben entzogen um den Spieler im Heilgebiet zu heilen. -ritual.bloodmagic.harvestRitual.harvestRange.info=(Ernte) Pflanzen in diesem Gebiet werden geerntet. -ritual.bloodmagic.magneticRitual.placementRange.info=(Platzierung) Das Gebiet, in das das Ritual die gesammelten Erze platziert. -ritual.bloodmagic.crushingRitual.crushingRange.info=(Brecher) Die Blöcke, die von dem Ritual zerstört werden. -ritual.bloodmagic.crushingRitual.chest.info=(Truhe) Die Position der Truhe, in die die zerstörten Blöcke platziert werden. -ritual.bloodmagic.fullStomachRitual.fillRange.info=(Fütterung) Das Gebiet, in dem das Ritual nach Spielern sucht, die gefüttert werden. -ritual.bloodmagic.fullStomachRitual.chest.info=(Truhe) Die Position des Inventars, aus dem das Ritual Essen nimmt, um Spieler in Reichweite zu füttern. -ritual.bloodmagic.interdictionRitual.interdictionRange.info=(Stoßen) Das Gebiet, in dem Mobs weggestoßen werden. Alle Mobs werden vom Meisterritualstein weggestoßen, egal wo sich das Gebiet befindet. -ritual.bloodmagic.containmentRitual.containmentRange.info=(Eindämmung) Das Gebiet, in dem Mobs herangezogen werden. Alle Mobs werden vom Meisterritualstein weggestoßen, egal wo sich das Gebiet befindet. -ritual.bloodmagic.speedRitual.sanicRange.info=(Geschwindigkeit) Alle Objekte in diesem Gebiet werden in die Richtung des Pfeils, der vom Ritual geformt wurde, katapultiert. -ritual.bloodmagic.suppressionRitual.suppressionRange.info=(Verdrängung) Alle Flüssigkeiten im Gebiet werden verdrängt. -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(Vertreibung) Das Gebiet, in dem Spieler, die nicht Besitzer sind und keine Blutkugel in der Truhe haben, wegteleportiert werden. -ritual.bloodmagic.zephyrRitual.zephyrRange.info=(Saugen) Gegenstände in diesem Gebiet werden in die verbundene Truhe gesaugt. -ritual.bloodmagic.zephyrRitual.chest.info=(Truhe) Die Position der Truhe, in die aufgenommene Gegenstände platziert werden. -ritual.bloodmagic.animalGrowthRitual.growing.info=(Wachstum) Tiere in diesem Gebiet werden wesentlich schneller wachsen. -ritual.bloodmagic.animalGrowthRitual.chest.info=(Truhe) Truhe mit Gegenständen, die für das Züchten verwendet werden, falls das Ritual dementsprechend verbessert wurde. -ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Kristall) Dämonenkristalle in diesem Gebiet wachsen schneller wenn ein Mob vom Ritual getötet wurde. -ritual.bloodmagic.forsakenSoulRitual.damage.info=(Schaden) Mobs in diesem Gebiet nehmen langsam schaden und lassen einen Kristall wachsen, wenn sie durch das Ritual sterben. -ritual.bloodmagic.crystalHarvestRitual.crystal.info=(Kristall) Von allen Dämonenkristallgruppen wird ein Kristall abgebrochen, der Gegenstand wird in der Welt fallengelassen. Sollte in der Gruppe nur noch ein Kristall sein, wird dieser nicht abgebrochen. - -ritual.bloodmagic.ellipseRitual.info=Erzeugt eine hohle Spähre um das Ritual mit den Blöcken in der verbundenen Truhe. -ritual.bloodmagic.ellipseRitual.spheroidRange.info=(Platzierung) Das Gebiet, in dem Blöcke platziert werden. Die Sphäre ist auf das Ritual zentriert - falls eine Seite kürzer als die andere ist, wird die Sphäre an der kürzeren Seite abgeschnitten. -ritual.bloodmagic.ellipseRitual.chest.info=(Truhe) Die Position des Inventars, von dem sich das Ritual die zu platzierenden Blöcke holt. - -ritual.bloodmagic.placerRitual.placerRange.info=(Platzierung) Das Gebiet, in das das Ritual die Blöcke platziert. -ritual.bloodmagic.placerRitual.chest.info=(Truhe) Die Position des Inventars, von dem sich das Ritual die zu platzierenden Blöcke holt. -ritual.bloodmagic.fellingRitual.fellingRange.info=(Fällung) Das Gebiet, in dem das Ritual nach Baumstämmen und Blättern sucht, um sie zu Fällen. -ritual.bloodmagic.fellingRitual.chest.info=(Truhe) Die Position des Inventars, in das die Gegenstände gesetzt werden, die vom Ritual gesammelt wurden. -ritual.bloodmagic.pumpRitual.pumpRange.info=(Pumpe) Das Gebiet, in dem das Ritual nach aufnehmbaren Flüssigkeiten sucht. - -ritual.bloodmagic.downgradeRitual.dialogue.bow.1=Also, Sterblicher... Du verlangst nach mehr Macht...? -ritual.bloodmagic.downgradeRitual.dialogue.bow.100=Natürlich wirst du wissen, dass alles einen Preis hat... Ich kann dir nicht einfach mehr Macht geben, ohne dass du etwas dafür zahlen musst... -ritual.bloodmagic.downgradeRitual.dialogue.bow.300=Wenn du mir ein Opfer darbringst, wirst du deine Wahrnehmung aufgeben, deine Pfeile werden auf große Distanz nicht mehr treffen. Die Kunst des Bogens wird dir nicht länger von Nutzen sein. -ritual.bloodmagic.downgradeRitual.dialogue.bow.500=Dafür werde ich das Potential deiner Rüstung noch weiter vergrößern, ihr Nutzen und Macht könnte noch weiter wachsen... Alles was du tun musst ist knien... und mir das richtige Opfer darbringen... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.1=Sei gegrüßt, Sterblicher. Ich sehe, dass du mehr Macht erlangen möchtest... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.100=Du musst dir im klaren sein, dass wenn das Glas voll ist, es geleert werden muss bevor es wieder befüllt werden kann. -ritual.bloodmagic.downgradeRitual.dialogue.quenched.300=Somit schlage ich dir einen Handel vor: gebe die Fähigkeit zu trinken auf und ich werde dein Potential stark erhöhen. Ob du glaubst, dass der Handel gerecht ist, ist eine ganz andere Frage... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.500=Nun knie, Sterblicher, und trinke von dem Kelch, den ich dir anbiete, da es dein letzter Schluck sein soll. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.1=Hmmm... was ist es, wochnach es dich wirklich lüstet...? -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.100=Falls es Stärke jenseits der sterblichen Wesen ist, dann kann ich es dir nicht geben - allerdings hätte ich einen anderen Handel für dich... -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.300=Ich kann die Fähigkeiten deiner Rüstung erweitern, sodass du neue Höhen erreichen sollst. Allerdings benötige ich auch etwas von dir: deine Kraft im Nahkampf. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.500=Falls du zustimmst, wirst du deine Waffen nicht mehr mit solch einer Zuversicht schwingen können und nur einen Bruchteil deines vorherigen Schadens anrichten. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.700=Also, die Wahl liegt bei dir: wirst du vor diesem Altar knien, oder wirst du weiterhin dein Schwert erheben? -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.1=Vorsicht, Sterblicher, denn du wandelst auf dünnem Eis. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Anders als meine Brüder biete ich dir einen der aussichtslosesten Handel an, die sich jemand, der sich mit der Magie des eigenen Blutes brüstet, vorstellen kann. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.300=Auch wenn deine Wunden noch heilen mögen, werden sie es doch nur langsam, fall du mein "Angebot" akzeptieren solltest und die Wunden der Schlacht werden dir noch mehr schmerzen. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.500=Also überlege gut, bevor du einen Handel eingehst, den du bereuen wirst. Denn auch wenn dein Glas leer sein sollte, wird es nahezu unmöglich sein, es wieder zu füllen... - -ritual.bloodmagic.featheredEarthRitual.info=Prevents falldamage in an area. - -# Chat -chat.bloodmagic.altarMaker.setTier=Setze Ausbaustufe auf: %d -chat.bloodmagic.altarMaker.building=Baue Stufe %d-Altar -chat.bloodmagic.altarMaker.destroy=Stufe %d-Altar zerstört -chat.bloodmagic.altarMaker.creativeOnly=Diese Item ist nur im Kreativmodus erhältlich. - -chat.bloodmagic.damageSource=%ss Seele ist zu schwach geworden. - -chat.bloodmagic.ritual.weak=Du spürst einen Drang, bist aber zu schwach für ein Ritual. -chat.bloodmagic.ritual.prevent=Das Ritual versucht, dir zu widerstehen. -chat.bloodmagic.ritual.activate=Ein Energiestrom fließt durch das Ritual. -chat.bloodmagic.ritual.notValid=Du fühlst, dass die Runen nicht richtig eingerichtet sind... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=Du fühlst dich schon wieder besser! -chat.bloodmagic.livingArmour.upgrade.fireRemove=&6Ein kühles Gefühl kommt hervor, mit dem das Brennen nachlässt. -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6Eine schattenhafte Macht zieht dich vom Rande des Todes zurück! -chat.bloodmagic.livingArmour.newUpgrade=&4Upgrade erworben! - -chat.bloodmagic.routing.remove=Entferne gespeicherte Position -chat.bloodmagic.routing.set=Setze Knotenposition -chat.bloodmagic.routing.link.master=Knoten mit Hauptknoten verbunden! -chat.bloodmagic.routing.link=Knoten miteinander verbunden. - -chat.bloodmagic.altar.comp.glowstone=ein Glowstone-Block -chat.bloodmagic.altar.comp.bloodstone=ein großer Blutsteinziegel -chat.bloodmagic.altar.comp.beacon=ein Leuchtfeuer -chat.bloodmagic.altar.comp.bloodrune=eine Blutrune -chat.bloodmagic.altar.comp.crystal=ein Block, noch nicht implementiert -chat.bloodmagic.altar.comp.notair=ein fester Block - -chat.bloodmagic.altar.nextTier=Für die nächste Ausbaustufe des Altars fehlt %s an %s. - -chat.bloodmagic.mimic.potionSet=Trankfalle wurde gesetzt. -chat.bloodmagic.mimic.potionRemove=Trankfalle wurde deaktiviert. -chat.bloodmagic.mimic.potionInterval.up=Trankintervall wurde erhöht auf: %d Ticks. -chat.bloodmagic.mimic.potionInterval.down=Trankintervall wurde verringert auf: %d Ticks. -chat.bloodmagic.mimic.detectRadius.up=Spieler-Erfassungsradius wurde erhöht auf: %d Blöcke. -chat.bloodmagic.mimic.detectRadius.down=Spieler-Erfassungsradius wurde verringert auf: %d Blöcke. -chat.bloodmagic.mimic.potionSpawnRadius.up=Trankerzeugungsradius wurde erhöht auf: %d Blöcke. -chat.bloodmagic.mimic.potionSpawnRadius.down=Trankerzeugungsradis wurde verringert auf: %d Blöcke. - -death.attack.ritual_damage=%1$s wurde für ein Ritual geopfert. -death.attack.ritual_damage.player=%2$s hat %1$s für ein Ritual geopfert. - -# entity -entity.bloodmagic.SentientSpecter.name=Empfindsamer Geist -entity.bloodmagic.Mimic.name=Mimik - -# Commands -commands.bloodmagic.error.arg.invalid=Ungültige Argumente -commands.bloodmagic.error.arg.missing=Nicht genug Argumente -commands.bloodmagic.error.arg.player.missing=Du musst einen Spieler für diese Aktion bestimmen. -commands.bloodmagic.error.negative=Amount must be a positive Integer. -commands.bloodmagic.error.outofbounds=Given integer is too large (must be within list ID boundaries). - -commands.bloodmagic.success=Erfolgreich ausgeführt - -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help=Zeigt hilfe für den Befehl "/bloodmagic" an. - -commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] Spieler [amount] -commands.bloodmagic.network.help=LP Netzwerk Befehle - -commands.bloodmagic.network.syphon.help=Zieht den gegebenen Wert an LP vom LP-Netzwerk des gegebenen Spielers ab. -commands.bloodmagic.network.syphon.success=Erfolgreich %d LP von %s abgezogen. -commands.bloodmagic.network.add.help=Fügt den gegebenen Wert an LP dem LP-Netzwerk des gegebenen Spielers zu. Folgt normalen LP Regeln. -commands.bloodmagic.network.add.success=Erfolgreich %d LP zu %ss LP-Netzwerk hinzugefügt. -commands.bloodmagic.network.set.help=Setzt die LP des gegebenen Spielers auf einen bestimmten Wert. -commands.bloodmagic.network.set.success=Erfolgreich %ss LP-Netzwerk auf %d LP gesetzt. -commands.bloodmagic.network.get.help=Zeigt an, wie viel LP ein Spieler in seinem Netzwerk hat. -commands.bloodmagic.network.fill.help=Füllt das LP-Netzwerk des Spielers auf %d. -commands.bloodmagic.network.fill.success=%ss LP-Netzwerk erfolgreich befüllt. -commands.bloodmagic.network.cap.help=Füllt das LP-Netzwerk des Spielers bis zu dem Maximum, das dessen höchstes Blutkugel speichern kann. -commands.bloodmagic.network.cap.success=%ss LP-Netzwerk erfolgreich gefüllt. - -commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [Spieler] -commands.bloodmagic.bind.help=Versucht, den gehaltenen Gegenstand zu binden bzw. die Bindung zu entfernen. -commands.bloodmagic.bind.success=Gegenstand erfolgreich gebunden! -commands.bloodmagic.bind.remove.success=Bindung erfolgreich entfernt -commands.bloodmagic.bind.error.ownerEqualsTarget=Es hat sich nichts geändert: Ziel und Besitzer sind identsich. -commands.bloodmagic.bind.error.notBound=Bindung kann nicht gelöscht werden: Nicht gebunden. -commands.bloodmagic.bind.error.notBindable=Kann nicht gebunden werden: Gegenstand nicht bindbar. - -commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] Spieler [tier] -commands.bloodmagic.orb.help=Setzt oder zeigt die Blutkugel-Ausbaustufe des Spielers. - -# GUI -tile.bloodmagic.inputNode.name=Eingangsknoten -tile.bloodmagic.outputNode.name=Ausgangsknoten - -# Keybinds -bloodmagic.keybind.open_holding=Öffne Siegel der Aufbewahrung -bloodmagic.keybind.cycle_holding_pos=Siegelrotation (+) -bloodmagic.keybind.cycle_holding_neg=Siegelrotation (-) - -# JustEnoughItems -jei.bloodmagic.recipe.altar=Blutaltar -jei.bloodmagic.recipe.binding=Alchemische Anordnung (Bindung) -jei.bloodmagic.recipe.alchemyArrayCrafting=Alchemische Anordnung -jei.bloodmagic.recipe.soulForge=Höllenfeuerschmiede -jei.bloodmagic.recipe.alchemyTable=Alchemietisch -jei.bloodmagic.recipe.armourDowngrade=Sühne (Ritual) -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=Ausbaustufe: %d -jei.bloodmagic.recipe.consumptionRate=Verbrauch: %d LP/t -jei.bloodmagic.recipe.drainRate=Ablauf: %d LP/t -jei.bloodmagic.recipe.minimumSouls=Minimum: %1$..2f Wille -jei.bloodmagic.recipe.soulsDrained=Verbraucht: %1$..2f Wille -jei.bloodmagic.recipe.lpDrained=Verbraucht: %.d LP -jei.bloodmagic.recipe.ticksRequired=Zeit: %.d Ticks - -jei.bloodmagic.desc.altarBuilder=Ein Gegenstand zum Testen. Nur im Kreativmodus erhältlich.\n\nShift+Rechtsklick um die Ausbaustufe zu ändern. Rechtsklicke auf einen Altar, um den Bau zu starten.\n\nZerstöre einen Altar mit ihm in der Hand, um alles abzubauen. -jei.bloodmagic.desc.demonicWill=Prägung eines dämonischen Wesens gebunden an eine Kreatur.\n\nKann durch das Töten eines Monsters mit einer empfindsamen Waffe, oder das Werfen einer Falle und Umbringen während as weiße Partikel aussendet, gesammelt werden. - -# WAILA -waila.bloodmagic.sneak=&oSchleiche für Info -waila.bloodmagic.array.reagent=Reagenz: %s -waila.bloodmagic.array.catalyst=Katalysator: %s -option.bloodmagic.bypassSneak=Umgehe Schleichen -option.bloodmagic.bloodAltar=Blutaltar -option.bloodmagic.ritualController=Ritualsteine -option.bloodmagic.teleposer=Teleposer -option.bloodmagic.array=Alchemische Anordnung - -# Thaumcraft -tc.research_category.BLOODMAGIC=Sanguine Arcana - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=Blood Magic -bloodmagic.research_text.BLOODMAGIC=Sanguine Arcana -bloodmagic.research_page.BLOODMAGIC.1=Das Reich der Blutmagier schien immer schon eine etaws einsamere und... "individuelle" Kunst zu sein... Blutmagier waren immer schon sehr zurückgezogen und manchmal auch etwas verrückt zu sein. Allerdings haben die Mächte der Selbstopferung Nutzen jenseits der Sicht eines normalen Blutmagiers. Tatsächlich ist es ziemlich offensichtlich, dass es schließlich doch einen Nutzen in Thaumaturgie hat! - -# Buttons -button.bloodmagic.tooltip.fill=Fülle Netzwerk diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang deleted file mode 100644 index 0d4c026d..00000000 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ /dev/null @@ -1,954 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic | Tomes - -#Items -item.bloodmagic.activation_crystal.weak.name=Weak Activation Crystal -item.bloodmagic.activation_crystal.awakened.name=Awakened Activation Crystal -item.bloodmagic.activation_crystal.creative.name=Creative Activation Crystal - -item.bloodmagic.sacrificial_dagger.normal.name=Sacrificial Dagger -item.bloodmagic.sacrificial_dagger.creative.name=Creative Sacrificial Dagger -item.bloodmagic.pack.selfSacrifice.name=Blood Letter's Pack -item.bloodmagic.pack.sacrifice.name=Coat of Arms -item.bloodmagic.daggerOfSacrifice.name=Dagger of Sacrifice - -item.bloodmagic.lavaCrystal.name=Lava Crystal - -item.bloodmagic.bound.sword.name=Bound Blade -item.bloodmagic.bound.pickaxe.name=Bound Pickaxe -item.bloodmagic.bound.axe.name=Bound Axe -item.bloodmagic.bound.shovel.name=Bound Shovel - -item.bloodmagic.bucket.lifeEssence.name=Bucket of Life - -item.bloodmagic.scribe.water.name=Elemental Inscription Tool: Water -item.bloodmagic.scribe.fire.name=Elemental Inscription Tool: Fire -item.bloodmagic.scribe.earth.name=Elemental Inscription Tool: Earth -item.bloodmagic.scribe.air.name=Elemental Inscription Tool: Air -item.bloodmagic.scribe.dusk.name=Elemental Inscription Tool: Dusk -item.bloodmagic.scribe.dawn.name=Elemental Inscription Tool: Dawn - -item.bloodmagic.focus.weak.name=Teleposition Focus -item.bloodmagic.focus.enhanced.name=Enhanced Teleposition Focus -item.bloodmagic.focus.reinforced.name=Reinforced Teleposition Focus -item.bloodmagic.focus.demonic.name=Demonic Teleposition Focus - -item.bloodmagic.slate.blank.name=Blank Slate -item.bloodmagic.slate.reinforced.name=Reinforced Slate -item.bloodmagic.slate.imbued.name=Imbued Slate -item.bloodmagic.slate.demonic.name=Demonic Slate -item.bloodmagic.slate.ethereal.name=Ethereal Slate - -item.bloodmagic.orb.weak.name=Weak Blood Orb -item.bloodmagic.orb.apprentice.name=Apprentice Blood Orb -item.bloodmagic.orb.magician.name=Magician Blood Orb -item.bloodmagic.orb.master.name=Master Blood Orb -item.bloodmagic.orb.archmage.name=Archmage Blood Orb -item.bloodmagic.orb.transcendent.name=Transcendent Blood Orb - -item.bloodmagic.reagent.incendium.name=Incendium -item.bloodmagic.reagent.magicales.name=Magicales -item.bloodmagic.reagent.sanctus.name=Sanctus -item.bloodmagic.reagent.aether.name=Aether -item.bloodmagic.reagent.crepitous.name=Crepitous -item.bloodmagic.reagent.crystallos.name=Crystallos -item.bloodmagic.reagent.terrae.name=Terrae -item.bloodmagic.reagent.aquasalus.name=Aquasalus -item.bloodmagic.reagent.tennebrae.name=Tennebrae -item.bloodmagic.reagent.offensa.name=Offensa -item.bloodmagic.reagent.praesidium.name=Praesidium -item.bloodmagic.reagent.orbisterrae.name=Orbis Terrae -item.bloodmagic.reagent.virtus.name=Virtus -item.bloodmagic.reagent.reductus.name=Reductus -item.bloodmagic.reagent.potentia.name=Potentia - -item.bloodmagic.blood_shard.weak.name=Weak Blood Shard -item.bloodmagic.blood_shard.demonic.name=Demon Blood Shard - -item.bloodmagic.baseComponent.reagent_water.name=Water Reagent -item.bloodmagic.baseComponent.reagent_lava.name=Lava Reagent -item.bloodmagic.baseComponent.reagent_air.name=Air Reagent -item.bloodmagic.baseComponent.reagent_fast_miner.name=Mining Reagent -item.bloodmagic.baseComponent.reagent_void.name=Void Reagent -item.bloodmagic.baseComponent.reagent_growth.name=Growth Reagent -item.bloodmagic.baseComponent.reagent_affinity.name=Elemental Affinity Reagent -item.bloodmagic.baseComponent.reagent_sight.name=Sight Reagent -item.bloodmagic.baseComponent.reagent_binding.name=Binding Reagent -item.bloodmagic.baseComponent.reagent_suppression.name=Suppression Reagent -item.bloodmagic.baseComponent.reagent_blood_light.name=Blood Lamp Reagent -item.bloodmagic.baseComponent.reagent_magnetism.name=Magnetism Reagent -item.bloodmagic.baseComponent.reagent_haste.name=Haste Reagent -item.bloodmagic.baseComponent.reagent_bridge.name=Phantom Bridge Reagent -item.bloodmagic.baseComponent.reagent_compression.name=Compression Reagent -item.bloodmagic.baseComponent.reagent_severance.name=Severance Reagent -item.bloodmagic.baseComponent.reagent_holding.name=Holding Reagent -item.bloodmagic.baseComponent.reagent_claw.name=Claw Reagent -item.bloodmagic.baseComponent.reagent_bounce.name=Elasticity Reagent -item.bloodmagic.baseComponent.reagent_frost.name=Frost Reagent -item.bloodmagic.baseComponent.reagent_teleposition.name=Teleposition Reagent -item.bloodmagic.baseComponent.reagent_transposition.name=Transposition Reagent - -item.bloodmagic.baseComponent.frame_part.name=Frame Parts -item.bloodmagic.baseComponent.sand_iron.name=Iron Sand -item.bloodmagic.baseComponent.sand_gold.name=Gold Sand -item.bloodmagic.baseComponent.sand_coal.name=Coal Sand -item.bloodmagic.baseComponent.plant_oil.name=Plant Oil -item.bloodmagic.baseComponent.sulfur.name=Sulfur -item.bloodmagic.baseComponent.saltpeter.name=Saltpeter -item.bloodmagic.baseComponent.neuro_toxin.name=Neuro Toxin -item.bloodmagic.baseComponent.antiseptic.name=Antiseptic -item.bloodmagic.baseComponent.catalyst_length_1.name=Simple Lengthening Catalyst -item.bloodmagic.baseComponent.catalyst_power_1.name=Simple Power Catalyst - -item.bloodmagic.cutting_fluid.basic.name=Basic Cutting Fluid -item.bloodmagic.cutting_fluid.explosive.name=Explosive Powder - -item.bloodmagic.demonCrystal.default.name=Demon Will Crystal -item.bloodmagic.demonCrystal.corrosive.name=Corrosive Will Crystal -item.bloodmagic.demonCrystal.destructive.name=Destructive Will Crystal -item.bloodmagic.demonCrystal.vengeful.name=Vengeful Will Crystal -item.bloodmagic.demonCrystal.steadfast.name=Steadfast Will Crystal - -item.bloodmagic.monster_soul.raw.name=Demonic Will -item.bloodmagic.monster_soul.corrosive.name=Corrosive Demonic Will -item.bloodmagic.monster_soul.destructive.name=Destructive Demonic Will -item.bloodmagic.monster_soul.vengeful.name=Vengeful Demonic Will -item.bloodmagic.monster_soul.steadfast.name=Steadfast Demonic Will - -item.bloodmagic.sigil.air.name=Air Sigil -item.bloodmagic.sigil.blood_light.name=Sigil of the Blood Lamp -item.bloodmagic.sigil.compression.name=Sigil of Compression -item.bloodmagic.sigil.divination.name=Divination Sigil -item.bloodmagic.sigil.water.name=Water Sigil -item.bloodmagic.sigil.lava.name=Lava Sigil -item.bloodmagic.sigil.void.name=Void Sigil -item.bloodmagic.sigil.green_grove.name=Sigil of the Green Grove -item.bloodmagic.sigil.elemental_affinity.name=Sigil of Elemental Affinity -item.bloodmagic.sigil.haste.name=Sigil of Haste -item.bloodmagic.sigil.suppression.name=Sigil of Suppression -item.bloodmagic.sigil.magnetism.name=Sigil of Magnetism -item.bloodmagic.sigil.fast_miner.name=Sigil of the Fast Miner -item.bloodmagic.sigil.seer.name=Seer's Sigil -item.bloodmagic.sigil.phantom_bridge.name=Sigil of the Phantom Bridge -item.bloodmagic.sigil.whirlwind.name=Sigil of the Whirlwind -item.bloodmagic.sigil.ender_severance.name=Sigil of Ender Severance -item.bloodmagic.sigil.holding.name=Sigil of Holding -item.bloodmagic.sigil.holding.display=&r%s: &o&n%s -item.bloodmagic.sigil.teleposition.name=Teleposition Sigil -item.bloodmagic.sigil.transposition.name=Transposition Sigil -item.bloodmagic.sigil.claw.name=Sigil of the Claw -item.bloodmagic.sigil.bounce.name=Sigil of Elasticity -item.bloodmagic.sigil.frost.name=Sigil of Winter's Breath - -item.bloodmagic.livingArmour.helmet.name=Living Helmet -item.bloodmagic.livingArmour.chest.name=Living Chestplate -item.bloodmagic.livingArmour.legs.name=Living Leggings -item.bloodmagic.livingArmour.boots.name=Living Boots -item.bloodmagic.sentientArmour.helmet.name=Sentient Helmet -item.bloodmagic.sentientArmour.chest.name=Sentient Chestplate -item.bloodmagic.sentientArmour.legs.name=Sentient Leggings -item.bloodmagic.sentientArmour.boots.name=Sentient Boots - -item.bloodmagic.altarMaker.name=Altar Maker - -item.bloodmagic.ritualDismantler.name=Ritual Dismantler -item.bloodmagic.ritualDivinernormal.name=Ritual Diviner -item.bloodmagic.ritualDivinerdusk.name=Ritual Diviner [Dusk] -item.bloodmagic.ritualDivinerdawn.name=Ritual Diviner [Dawn] -item.bloodmagic.ritualReader.name=Ritual Tinkerer - -item.bloodmagic.arcaneAshes.name=Arcane Ashes -item.bloodmagic.upgradeTome.name=Living Armour Upgrade Tome -item.bloodmagic.downgradeTome.name=Living Armour Downgrade Tome -item.bloodmagic.upgradeTrainer.name=Living Armour Training Bracelet - -item.bloodmagic.sentientSword.name=Sentient Sword -item.bloodmagic.soulGem.petty.name=Petty Tartaric Gem -item.bloodmagic.soulGem.lesser.name=Lesser Tartaric Gem -item.bloodmagic.soulGem.common.name=Common Tartaric Gem -item.bloodmagic.soulGem.greater.name=Greater Tartaric Gem -item.bloodmagic.soulGem.grand.name=Grand Tartaric Gem -item.bloodmagic.soulSnare.base.name=Rudimentary Snare -item.bloodmagic.sentientBow.name=Sentient Bow -item.bloodmagic.sentientArmourGem.name=Sentient Armour Gem -item.bloodmagic.sentientAxe.name=Sentient Axe -item.bloodmagic.sentientPickaxe.name=Sentient Pickaxe -item.bloodmagic.sentientShovel.name=Sentient Shovel - -item.bloodmagic.nodeRouter.name=Node Router -item.bloodmagic.itemFilter.exact.name=Precise Item Filter -item.bloodmagic.itemFilter.ignoreNBT.name=NBT Item Filter -item.bloodmagic.itemFilter.modItems.name=Mod Item Filter -item.bloodmagic.itemFilter.oreDict.name=Ore Dictionary Item Filter -item.bloodmagic.fluidFilter.exact.name=Fluid Filter - -item.bloodmagic.experienceTome.name=Tome of Peritia -item.bloodmagic.sanguineBook.name=Inspectoris Scandalum - -item.bloodmagic.living_point_upgrade.draft_angelus.name=Draft of Angelus - -item.bloodmagic.willGauge.name=Demon Will Aura Gauge -item.bloodmagic.potionFlask.name=Potion Flask - -item.bloodmagic.icarusScroll.name=Scroll of Icarus - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=Life Essence - -tile.bloodmagic.stone.ritual.master.name=Master Ritual Stone -tile.bloodmagic.stone.ritual.imperfect.name=Imperfect Ritual Stone -tile.bloodmagic.stone.ritual.inverted.name=Inverted Master Ritual Stone - -tile.bloodmagic.altar.name=Blood Altar -tile.bloodmagic.alchemyArray.name=Alchemy Array - -tile.bloodmagic.rune.blank.name=Blank Rune -tile.bloodmagic.rune.speed.name=Speed Rune -tile.bloodmagic.rune.efficiency.name=Efficiency Rune -tile.bloodmagic.rune.sacrifice.name=Rune of Sacrifice -tile.bloodmagic.rune.self_sacrifice.name=Rune of Self Sacrifice -tile.bloodmagic.rune.displacement.name=Displacement Rune -tile.bloodmagic.rune.capacity.name=Rune of Capacity -tile.bloodmagic.rune.augmented_capacity.name=Rune of Augmented Capacity -tile.bloodmagic.rune.orb.name=Rune of the Orb -tile.bloodmagic.rune.acceleration.name=Acceleration Rune -tile.bloodmagic.rune.charging.name=Charging Rune - -tile.bloodmagic.ritualStone.blank.name=Ritual Stone -tile.bloodmagic.ritualStone.water.name=Ritual Stone of Water -tile.bloodmagic.ritualStone.fire.name=Ritual Stone of Fire -tile.bloodmagic.ritualStone.earth.name=Ritual Stone of Earth -tile.bloodmagic.ritualStone.air.name=Ritual Stone of Air -tile.bloodmagic.ritualStone.dusk.name=Ritual Stone of Dusk -tile.bloodmagic.ritualStone.dawn.name=Ritual Stone of Dawn - -tile.bloodmagic.bloodstone_tile.name=Large Bloodstone Tile -tile.bloodmagic.bloodstone_brick.name=Bloodstone Brick -tile.bloodmagic.crystal_tile.name=Crystal Cluster -tile.bloodmagic.crystal_brick.name=Crystal Cluster Brick -tile.bloodmagic.bloodLight.name=Blood Light -tile.bloodmagic.spectralBlock.name=Spectral Block -tile.bloodmagic.phantom.name=Phantom Block -tile.bloodmagic.incenseAltar.name=Incense Altar - -tile.bloodmagic.teleposer.name=Teleposer -tile.bloodmagic.soulForge.name=Hellfire Forge -tile.bloodmagic.alchemyTable.name=Alchemy Table -tile.bloodmagic.demonCrucible.name=Demon Crucible -tile.bloodmagic.demonPylon.name=Demon Pylon -tile.bloodmagic.demonCrystallizer.name=Demon Crystallizer - -tile.bloodmagic.masterRouting.name=Master Routing Node -tile.bloodmagic.outputRouting.name=Output Routing Node -tile.bloodmagic.inputRouting.name=Input Routing Node -tile.bloodmagic.itemRouting.name=Routing Node - -tile.bloodmagic.path.wood.name=Wooden Path -tile.bloodmagic.path.woodtile.name=Tiled Wooden Path -tile.bloodmagic.path.stone.name=Stone Brick Path -tile.bloodmagic.path.stonetile.name=Tiled Stone Path -tile.bloodmagic.path.wornstone.name=Worn Stone Brick Path -tile.bloodmagic.path.wornstonetile.name=Tiled Worn Stone Path -tile.bloodmagic.path.obsidian.name=Obsidian Brick Path -tile.bloodmagic.path.obsidiantile.name=Tiled Obsidian Path - -tile.bloodmagic.dimensionalPortal.name=Dimensional Portal -tile.bloodmagic.bloodTank.name=Blood Tank - -tile.bloodmagic.demonCrystal.default.name=Demon Will Crystal Cluster -tile.bloodmagic.demonCrystal.corrosive.name=Corrosive Will Crystal Cluster -tile.bloodmagic.demonCrystal.destructive.name=Destructive Will Crystal Cluster -tile.bloodmagic.demonCrystal.vengeful.name=Vengeful Will Crystal Cluster -tile.bloodmagic.demonCrystal.steadfast.name=Steadfast Will Crystal Cluster - -tile.bloodmagic.mimic.nohitbox.name=Ethereal Opaque Mimic Block -tile.bloodmagic.mimic.solidopaque.name=Opaque Mimic Block -tile.bloodmagic.mimic.solidclear.name=Clear Mimic Block -tile.bloodmagic.mimic.solidlight.name=Lighted Mimic Block -tile.bloodmagic.mimic.sentient.name=Sentient Mimic Block - -tile.bloodmagic.bricks1.brick1_raw.name=Raw Stone Bricks -tile.bloodmagic.bricks1.brick1_corrosive.name=Corrosive Stone Bricks -tile.bloodmagic.bricks1.brick1_destructive.name=Destructive Stone Bricks -tile.bloodmagic.bricks1.brick1_vengeful.name=Vengeful Stone Bricks -tile.bloodmagic.bricks1.brick1_steadfast.name=Steadfast Stone Bricks - -tile.bloodmagic.bricks2.smallbrick_raw.name=Small Raw Stone Bricks -tile.bloodmagic.bricks2.smallbrick_corrosive.name=Small Corrosive Stone Bricks -tile.bloodmagic.bricks2.smallbrick_destructive.name=Small Destructive Stone Bricks -tile.bloodmagic.bricks2.smallbrick_vengeful.name=Small Vengeful Stone Bricks -tile.bloodmagic.bricks2.smallbrick_steadfast.name=Small Steadfast Stone Bricks -tile.bloodmagic.bricks2.tile_raw.name=Raw Stone Tiles -tile.bloodmagic.bricks2.tile_corrosive.name=Corrosive Stone Tiles -tile.bloodmagic.bricks2.tile_destructive.name=Destructive Stone Tiles -tile.bloodmagic.bricks2.tile_vengeful.name=Vengeful Stone Tiles -tile.bloodmagic.bricks2.tile_steadfast.name=Steadfast Stone Tiles -tile.bloodmagic.bricks2.tilespecial_raw.name=Accented Raw Stone Tiles -tile.bloodmagic.bricks2.tilespecial_corrosive.name=Accented Corrosive Stone Tiles -tile.bloodmagic.bricks2.tilespecial_destructive.name=Accented Destructive Stone Tiles -tile.bloodmagic.bricks2.tilespecial_vengeful.name=Accented Vengeful Stone Tiles -tile.bloodmagic.bricks2.tilespecial_steadfast.name=Accented Steadfast Stone Tiles - -tile.bloodmagic.inversionpillar.raw.name=Raw Inversion Pillar -tile.bloodmagic.inversionpillar.corrosive.name=Corrosive Inversion Pillar -tile.bloodmagic.inversionpillar.destructive.name=Destructive Inversion Pillar -tile.bloodmagic.inversionpillar.vengeful.name=Vengeful Inversion Pillar -tile.bloodmagic.inversionpillar.steadfast.name=Steadfast Inversion Pillar - -tile.bloodmagic.inversionpillarend.raw_bottom.name=Raw Inversion Pillar Base -tile.bloodmagic.inversionpillarend.corrosive_bottom.name=Corrosive Inversion Pillar Base -tile.bloodmagic.inversionpillarend.destructive_bottom.name=Destructive Inversion Pillar Base -tile.bloodmagic.inversionpillarend.vengeful_bottom.name=Vengeful Inversion Pillar Base -tile.bloodmagic.inversionpillarend.steadfast_bottom.name=Steadfast Inversion Pillar Base -tile.bloodmagic.inversionpillarend.raw_top.name=Raw Inversion Pillar Cap -tile.bloodmagic.inversionpillarend.corrosive_top.name=Corrosive Inversion Pillar Cap -tile.bloodmagic.inversionpillarend.destructive_top.name=Destructive Inversion Pillar Cap -tile.bloodmagic.inversionpillarend.vengeful_top.name=Vengeful Inversion Pillar Cap -tile.bloodmagic.inversionpillarend.steadfast_top.name=Steadfast Inversion Pillar Cap - -tile.bloodmagic.demonlight.raw.name=Raw Demon Eye -tile.bloodmagic.demonlight.corrosive.name=Corrosive Demon Eye -tile.bloodmagic.demonlight.destructive.name=Destructive Demon Eye -tile.bloodmagic.demonlight.vengeful.name=Vengeful Demon Eye -tile.bloodmagic.demonlight.steadfast.name=Steadfast Demon Eye - -tile.bloodmagic.extras.stone_raw.name=Raw Stone -tile.bloodmagic.extras.stone_corrosive.name=Corrosive Stone -tile.bloodmagic.extras.stone_destructive.name=Destructive Stone -tile.bloodmagic.extras.stone_vengeful.name=Vengeful Stone -tile.bloodmagic.extras.stone_steadfast.name=Steadfast Stone - -tile.bloodmagic.extras.polished_raw.name=Polished Raw Stone -tile.bloodmagic.extras.polished_corrosive.name=Polished Corrosive Stone -tile.bloodmagic.extras.polished_destructive.name=Polished Destructive Stone -tile.bloodmagic.extras.polished_vengeful.name=Polished Vengeful Stone -tile.bloodmagic.extras.polished_steadfast.name=Polished Steadfast Stone - -tile.bloodmagic.extras.metal_raw.name=Raw Demon Alloy -tile.bloodmagic.extras.metal_corrosive.name=Corrosive Demon Alloy -tile.bloodmagic.extras.metal_destructive.name=Destructive Demon Alloy -tile.bloodmagic.extras.metal_vengeful.name=Vengeful Demon Alloy -tile.bloodmagic.extras.metal_steadfast.name=Steadfast Demon Alloy - -tile.bloodmagic.pillar1.raw.name=Raw Stone Pillar -tile.bloodmagic.pillar1.corrosive.name=Corrosive Stone Pillar -tile.bloodmagic.pillar1.destructive.name=Destructive Stone Pillar -tile.bloodmagic.pillar1.vengeful.name=Vengeful Stone Pillar -tile.bloodmagic.pillar1.steadfast.name=Steadfast Stone Pillar - -tile.bloodmagic.pillar2.raw.name=Accented Raw Stone Pillar -tile.bloodmagic.pillar2.corrosive.name=Accented Corrosive Stone Pillar -tile.bloodmagic.pillar2.destructive.name=Accented Destructive Stone Pillar -tile.bloodmagic.pillar2.vengeful.name=Accented Vengeful Stone Pillar -tile.bloodmagic.pillar2.steadfast.name=Accented Steadfast Stone Pillar - -tile.bloodmagic.pillarCap1.raw.name=Raw Stone Pillar Cap -tile.bloodmagic.pillarCap1.corrosive.name=Corrosive Stone Pillar Cap -tile.bloodmagic.pillarCap2.destructive.name=Destructive Stone Pillar Cap -tile.bloodmagic.pillarCap2.vengeful.name=Vengeful Stone Pillar Cap -tile.bloodmagic.pillarCap3.steadfast.name=Steadfast Stone Pillar Cap - -tile.bloodmagic.wall1.brick_raw.name=Raw Stone Brick Wall -tile.bloodmagic.wall1.brick_corrosive.name=Corrosive Stone Brick Wall -tile.bloodmagic.wall1.brick_destructive.name=Destructive Stone Brick Wall -tile.bloodmagic.wall1.brick_vengeful.name=Vengeful Stone Brick Wall -tile.bloodmagic.wall1.brick_steadfast.name=Steadfast Stone Brick Wall -tile.bloodmagic.wall1.smallbrick_raw.name=Raw Small Stone Brick Wall -tile.bloodmagic.wall1.smallbrick_corrosive.name=Corrosive Small Stone Brick Wall -tile.bloodmagic.wall1.smallbrick_destructive.name=Destructive Small Stone Brick Wall -tile.bloodmagic.wall1.smallbrick_vengeful.name=Vengeful Small Stone Brick Wall -tile.bloodmagic.wall1.smallbrick_steadfast.name=Steadfast Small Stone Brick Wall -tile.bloodmagic.wall1.large_raw.name=Raw Stone Wall -tile.bloodmagic.wall1.large_corrosive.name=Corrosive Stone Wall -tile.bloodmagic.wall1.large_destructive.name=Destructive Stone Wall -tile.bloodmagic.wall1.large_vengeful.name=Vengeful Stone Wall -tile.bloodmagic.wall1.large_steadfast.name=Steadfast Stone Wall - -tile.bloodmagic.stairs1.raw.name=Raw Stone Stairs -tile.bloodmagic.stairs1.corrosive.name=Corrosive Stone Stairs -tile.bloodmagic.stairs2.destructive.name=Destructive Stone Stairs -tile.bloodmagic.stairs2.vengeful.name=Vengeful Stone Stairs -tile.bloodmagic.stairs3.steadfast.name=Steadfast Stone Stairs - -# Fluids -fluid.lifeEssence=Life Essence - -# HUD -hud.bloodmagic.inactive=Inactive - -# Tooltips -tooltip.bloodmagic.extraInfo=&9-Hold shift for more info- - -tooltip.bloodmagic.orb.desc=Stores raw Life Essence -tooltip.bloodmagic.orb.owner=Added by: %s -tooltip.bloodmagic.currentOwner=Current owner: %s -tooltip.bloodmagic.currentTier=Current tier: %d -tooltip.bloodmagic.config.disabled=Currently disabled in the Config -tooltip.bloodmagic.tier=Tier %d - -tooltip.bloodmagic.activated=Activated -tooltip.bloodmagic.deactivated=Deactivated - -tooltip.bloodmagic.sigil.air.desc=&oI feel lighter already... -tooltip.bloodmagic.sigil.blood_light.desc=&oI see a light! -tooltip.bloodmagic.sigil.compression.desc=&oHands of diamonds -tooltip.bloodmagic.sigil.divination.desc=&oPeer into the soul -tooltip.bloodmagic.sigil.divination.otherNetwork=Peering into the soul of %s -tooltip.bloodmagic.sigil.divination.currentAltarTier=Current Tier: %d -tooltip.bloodmagic.sigil.divination.currentEssence=Current Essence: %d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=Current Capacity: %d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=Current Tranquility: %d -tooltip.bloodmagic.sigil.divination.currentInversion=Current Inversion: %d -tooltip.bloodmagic.sigil.divination.currentBonus=Current Bonus: +%d%% -tooltip.bloodmagic.sigil.water.desc=&oInfinite water, anyone? -tooltip.bloodmagic.sigil.lava.desc=&oHOT! DO NOT EAT -tooltip.bloodmagic.sigil.void.desc=&oBetter than a Swiffer®! -tooltip.bloodmagic.sigil.green_grove.desc=&oEnvironmentally friendly -tooltip.bloodmagic.sigil.magnetism.desc=&oI have a very magnetic personality -tooltip.bloodmagic.sigil.suppression.desc=&oBetter than telekinesis... -tooltip.bloodmagic.sigil.haste.desc=&o42 doses of caffeine later... -tooltip.bloodmagic.sigil.fast_miner.desc=&oKeep mining, and mining... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oFalling fire fishes! -tooltip.bloodmagic.sigil.seer.desc=&oWhen seeing all is not enough -tooltip.bloodmagic.sigil.seer.currentAltarProgress=Current Progress: %d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=Current Progress: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=Consumption Rate: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=Current Tier: %d -tooltip.bloodmagic.sigil.seer.currentEssence=Current Essence: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=Current Capacity: %d LP -tooltip.bloodmagic.sigil.seer.currentCharge=Current Charge: %d -tooltip.bloodmagic.sigil.seer.currentTranquility=Current Tranquility: %d -tooltip.bloodmagic.sigil.seer.currentBonus=Current Bonus: +%d%% -tooltip.bloodmagic.sigil.phantom_bridge.desc=&oWalking on thin air... -tooltip.bloodmagic.sigil.whirlwind.desc=&oBest not to wear a skirt -tooltip.bloodmagic.sigil.ender_severance.desc=&oPutting Endermen in Dire situations! -tooltip.bloodmagic.sigil.teleposition.desc=I am very close to being moved by this. -tooltip.bloodmagic.sigil.transposition.desc=Feel the power of the Force, my young apprentice. -tooltip.bloodmagic.sigil.holding.press=Press &o%s&r&7 to modify -tooltip.bloodmagic.sigil.holding.desc=Sigil-ception -tooltip.bloodmagic.sigil.holding.sigilInSlot=Slot %d: %s - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=Increases the max points of Living Armour to %d. - -tooltip.bloodmagic.bound.sword.desc=&oCulling the weak -tooltip.bloodmagic.bound.pickaxe.desc=&oDestroying stone without mercy -tooltip.bloodmagic.bound.axe.desc=&oDemonic deforestation -tooltip.bloodmagic.bound.shovel.desc=&oScrubs floors clean of dirt - -tooltip.bloodmagic.sacrificialDagger.desc=Just a prick of the finger will suffice... -tooltip.bloodmagic.sacrificialDagger.creative=Right click an altar while sneaking to fill it -tooltip.bloodmagic.slate.desc=Infused stone inside of a Blood Altar -tooltip.bloodmagic.inscriber.desc=The writing is on the wall... - -tooltip.bloodmagic.pack.selfSacrifice.desc=This pack really chafes... -tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=Stored: %d LP - -tooltip.bloodmagic.activation_crystal.weak=Activates low-level rituals -tooltip.bloodmagic.activation_crystal.awakened=Activates more powerful rituals -tooltip.bloodmagic.activation_crystal.creative=Creative Only - Activates any ritual - -tooltip.bloodmagic.diviner.currentRitual=Current Ritual: %s -tooltip.bloodmagic.diviner.blankRune=Blank Runes: %d -tooltip.bloodmagic.diviner.waterRune=Water Runes: %d -tooltip.bloodmagic.diviner.airRune=Air Runes: %d -tooltip.bloodmagic.diviner.fireRune=Fire Runes: %d -tooltip.bloodmagic.diviner.earthRune=Earth Runes: %d -tooltip.bloodmagic.diviner.duskRune=Dusk Runes: %d -tooltip.bloodmagic.diviner.dawnRune=Dawn Runes: %d -tooltip.bloodmagic.diviner.totalRune=Total Runes: %d -tooltip.bloodmagic.diviner.extraInfo=&9-Hold shift for rune info- -tooltip.bloodmagic.diviner.extraExtraInfo=&9-Hold shift + M for augmentation info- -tooltip.bloodmagic.diviner.currentDirection=Current Direction: %s - -tooltip.bloodmagic.ritualReader.currentState=Current mode: %s -tooltip.bloodmagic.ritualReader.set_area=Define Area -tooltip.bloodmagic.ritualReader.information=Information -tooltip.bloodmagic.ritualReader.set_will_types=Set Will Consumed -tooltip.bloodmagic.ritualReader.desc.set_area=Right click on an active Master Ritual stone to cycle what area of the ritual you want to modify. Then click on the two corners of the new range you want to set the range. -tooltip.bloodmagic.ritualReader.desc.information=Right click on an active Master Ritual Stone to gather basic information about the ritual. -tooltip.bloodmagic.ritualReader.desc.set_will_types=Set the types of demon will that the ritual will consume from the aura by right clicking on the MRS with the same types of crystals on your hotbar. - -tooltip.bloodmagic.arcaneAshes=Ashes used to draw an alchemy circle - -tooltip.bloodmagic.telepositionFocus.coords=Current coordinates: (%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=Dimension ID: %d -tooltip.bloodmagic.telepositionFocus.bound=Bound: %s at %d, %d, %d -tooltip.bloodmagic.telepositionFocus.weak=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.enhanced=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.reinforced=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.demonic=Used to move blocks in the world - -tooltip.bloodmagic.livingArmour.upgrade.speed=Quick Feet -tooltip.bloodmagic.livingArmour.upgrade.digging=Dwarven Might -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=Poison Resistance -tooltip.bloodmagic.livingArmour.upgrade.fireResist=Gift of Ignis -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=Tough Palms -tooltip.bloodmagic.livingArmour.upgrade.knockback=Body Builder -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=Tough Skin -tooltip.bloodmagic.livingArmour.upgrade.health=Healthy -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Fierce Strike -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Trick Shot -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Step Assist -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=Grim Reaper's Sprint -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=Solar Powered -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=Runic Shielding -tooltip.bloodmagic.livingArmour.upgrade.revealing=Revealing -tooltip.bloodmagic.livingArmour.upgrade.experienced=Experienced -tooltip.bloodmagic.livingArmour.upgrade.jump=Strong Legs -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=Soft Fall -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=Grave Digger -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=Charging Strike -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=True Strike -tooltip.bloodmagic.livingArmour.upgrade.elytra=Elytra -tooltip.bloodmagic.livingArmour.upgrade.nightSight=Nocturnal Prowess -tooltip.bloodmagic.livingArmour.upgrade.repair=Repairing - - -tooltip.bloodmagic.livingArmour.upgrade.slowness=Limp Leg -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=Crippled Arm -tooltip.bloodmagic.livingArmour.upgrade.slippery=Loose Traction -tooltip.bloodmagic.livingArmour.upgrade.battleHunger=Battle Hungry -tooltip.bloodmagic.livingArmour.upgrade.quenched=Quenched -tooltip.bloodmagic.livingArmour.upgrade.meleeDecrease=Dulled Blade -tooltip.bloodmagic.livingArmour.upgrade.digSlowdown=Weakened Pick -tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=Storm Trooper -tooltip.bloodmagic.livingArmour.upgrade.slowHeal=Diseased -tooltip.bloodmagic.livingArmour.upgrade.disoriented=Disoriented - -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Level %d) -tooltip.bloodmagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.bloodmagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s - -tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-Hold shift + M for progress info- - -tooltip.bloodmagic.will=Will Quality: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientAxe.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientPickaxe.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientShovel.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.soulGem.petty=A gem used to contain a little will -tooltip.bloodmagic.soulGem.lesser=A gem used to contain some will -tooltip.bloodmagic.soulGem.common=A gem used to contain more will -tooltip.bloodmagic.soulGem.greater=A gem used to contain a greater amount of will -tooltip.bloodmagic.soulGem.grand=A gem used to contain a large amount of will -tooltip.bloodmagic.soulSnare.desc=Throw at a monster and then kill them to obtain their demonic will - -tooltip.bloodmagic.itemFilter.exact=Will make sure the items match precisely -tooltip.bloodmagic.itemFilter.ignoreNBT=Ignores the NBT of the filter -tooltip.bloodmagic.itemFilter.modItems=Matches all items from the same mod -tooltip.bloodmagic.itemFilter.oreDict=Used to filter through the Ore Dictionary - -tooltip.bloodmagic.fluidFilter.exact=Filters the fluid input/output - -tooltip.bloodmagic.fluid.type=Fluid Contained: %s -tooltip.bloodmagic.fluid.amount=Amount: %d / %d mB -tooltip.bloodmagic.fluid.capacity=Capacity: %d mB - -tooltip.bloodmagic.ghost.everything=Everything -tooltip.bloodmagic.ghost.amount=Ghost item amount: %d - -tooltip.bloodmagic.currentType.default=Contains: Raw Will -tooltip.bloodmagic.currentType.corrosive=Contains: Corrosive Will -tooltip.bloodmagic.currentType.destructive=Contains: Destructive Will -tooltip.bloodmagic.currentType.vengeful=Contains: Vengeful Will -tooltip.bloodmagic.currentType.steadfast=Contains: Steadfast Will - -tooltip.bloodmagic.currentBaseType.default=Raw -tooltip.bloodmagic.currentBaseType.corrosive=Corrosive -tooltip.bloodmagic.currentBaseType.destructive=Destructive -tooltip.bloodmagic.currentBaseType.vengeful=Vengeful -tooltip.bloodmagic.currentBaseType.steadfast=Steadfast - -tooltip.bloodmagic.experienceTome=A book used to store experience -tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=Level: %d - -tooltip.bloodmagic.decoration.safe=Safe for decoration -tooltip.bloodmagic.decoration.notSafe=Dangerous for decoration - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d uses remaining - -tooltip.bloodmagic.potion.uses=%d uses remaining - -tooltip.bloodmagic.book.shifting=These symbols seem to be... &oshifting... - -tooltip.bloodmagic.willGauge=A strange device that can measure the Demon Will in the Aura. - -# Ritual -ritual.bloodmagic.blockRange.tooBig=The block range given is too big! Needs to be at most %s blocks. -ritual.bloodmagic.blockRange.tooFar=The block range given is too far! Needs to be within a vertical range of %s blocks and a horizontal range of %s blocks. -ritual.bloodmagic.blockRange.inactive=The ritual stone is currently inactive, and cannot have its range modified. -ritual.bloodmagic.blockRange.noRange=The range was not properly chosen. -ritual.bloodmagic.blockRange.firstBlock=First block for new range stored. -ritual.bloodmagic.blockRange.success=New range successfully set! -ritual.bloodmagic.willConfig.set=The ritual will use these Demon Will types: %s -ritual.bloodmagic.willConfig.void=The ritual no longer uses Demon Will - -ritual.bloodmagic.testRitual=Test Ritual -ritual.bloodmagic.waterRitual=Ritual of the Full Spring -ritual.bloodmagic.lavaRitual=Serenade of the Nether -ritual.bloodmagic.greenGroveRitual=Ritual of the Green Grove -ritual.bloodmagic.jumpRitual=Ritual of the High Jump -ritual.bloodmagic.wellOfSufferingRitual=Well of Suffering -ritual.bloodmagic.featheredKnifeRitual=Ritual of the Feathered Knife -ritual.bloodmagic.regenerationRitual=Ritual of Regeneration -ritual.bloodmagic.harvestRitual=Reap of the Harvest Moon -ritual.bloodmagic.magneticRitual=Ritual of Magnetism -ritual.bloodmagic.crushingRitual=Ritual of the Crusher -ritual.bloodmagic.fullStomachRitual=Ritual of the Satiated Stomach -ritual.bloodmagic.interdictionRitual=Ritual of Interdiction -ritual.bloodmagic.containmentRitual=Ritual of Containment -ritual.bloodmagic.speedRitual=Ritual of Speed -ritual.bloodmagic.suppressionRitual=Ritual of Suppression -ritual.bloodmagic.expulsionRitual=Aura of Expulsion -ritual.bloodmagic.zephyrRitual=Call of the Zephyr -ritual.bloodmagic.upgradeRemoveRitual=Sound of the Cleansing Soul -ritual.bloodmagic.armourEvolveRitual=Ritual of Living Evolution -ritual.bloodmagic.animalGrowthRitual=Ritual of the Shepherd -ritual.bloodmagic.forsakenSoulRitual=Gathering of the Forsaken Souls -ritual.bloodmagic.crystalHarvestRitual=Crack of the Fractured Crystal -ritual.bloodmagic.meteorRitual=Mark of the Falling Tower -ritual.bloodmagic.ellipseRitual=Focus of the Ellipsoid -ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius -ritual.bloodmagic.placerRitual=Laying of the Filler -ritual.bloodmagic.fellingRitual=Crash of the Timberman -ritual.bloodmagic.pumpRitual=Hymn of Syphoning -ritual.bloodmagic.altarBuilderRitual=The Assembly of the High Altar -ritual.bloodmagic.portalRitual=The Gate of the Fold -ritual.bloodmagic.downgradeRitual=Penance of the Leadened Soul -ritual.bloodmagic.crystalSplitRitual=Resonance of the Faceted Crystal -ritual.bloodmagic.condorRitual=Reverence of the Condor -ritual.bloodmagic.eternalSoulRitual=Cry of the Eternal Soul -ritual.bloodmagic.groundingRitual=Ritual of Grounding -ritual.bloodmagic.featheredEarthRitual=Ritual of the Feathered Earth -ritual.bloodmagic.veilOfEvilRitual=Veil of Evil -ritual.bloodmagic.wardOfSacrosanctityRitual=Ward of Sacrosanctity - -ritual.bloodmagic.waterRitual.info=Generates a source of water from the master ritual stone. -ritual.bloodmagic.lavaRitual.info=Generates a source of lava from the master ritual stone. -ritual.bloodmagic.lavaRitual.default.info=(Raw) Decreases the LP cost of placing lava and allows lava to be placed insided of a linked container. -ritual.bloodmagic.lavaRitual.corrosive.info=(Corrosive) Entities within range that are immune to fire are damaged severely. -ritual.bloodmagic.lavaRitual.destructive.info=(Destructive) Lava placement range is increased based on total Will. -ritual.bloodmagic.lavaRitual.vengeful.info=(Vengeful) Entities within range have Fire Fuse applied to them. -ritual.bloodmagic.lavaRitual.steadfast.info=(Steadfast) Players within a designated range have Fire Resistance applied to them. - -ritual.bloodmagic.greenGroveRitual.info=Grows crops within its area. -ritual.bloodmagic.jumpRitual.info=Causes entities to leap up into the air. -ritual.bloodmagic.wellOfSufferingRitual.info=Attacks mobs within its damage zone and puts the LP into a nearby blood altar. -ritual.bloodmagic.featheredKnifeRitual.info=Drains health from players in its area and puts the LP into a nearby blood altar. -ritual.bloodmagic.regenerationRitual.info=Casts regeneration on entities within its range if they are missing health. -ritual.bloodmagic.regenerationRitual.default.info=(Raw) -ritual.bloodmagic.regenerationRitual.corrosive.info=(Corrosive) Steals health from non-players inside of its Vampirism range and directly heals players. -ritual.bloodmagic.regenerationRitual.destructive.info=(Destructive) -ritual.bloodmagic.regenerationRitual.vengeful.info=(Vengeful) -ritual.bloodmagic.regenerationRitual.steadfast.info=(Steadfast) -ritual.bloodmagic.harvestRitual.info=Harvests plants within its range, dropping the results on the ground. -ritual.bloodmagic.magneticRitual.info=Pulls up ores from the ground and puts them into its placement range. -ritual.bloodmagic.crushingRitual.info=Breaks blocks within its crushing range and places the items into the linked chest. -ritual.bloodmagic.crushingRitual.destructive.info=(Destructive) Blocks are broken down forcefully: all blocks broken are affected by Fortune III. -ritual.bloodmagic.crushingRitual.steadfast.info=(Steadfast) Causes all blocks that are broken to be picked up with silk touch. Overrides Fortune where applicable. -ritual.bloodmagic.crushingRitual.corrosive.info=(Corrosive) All blocks are broken to be processed with a form of cutting fluid. Overrides Silk Touch where applicable. -ritual.bloodmagic.crushingRitual.vengeful.info=(Vengeful) Compresses the inventory on successful operation. Currently only does one compression per operation. -ritual.bloodmagic.crushingRitual.default.info=(Raw) Increases the speed of the ritual based on total Will. -ritual.bloodmagic.greenGroveRitual.corrosive.info=(Corrosive) Entities within range are attacked by nearby plants, leeching away their life. -ritual.bloodmagic.greenGroveRitual.default.info=(Raw) Increases the speed of all of the ritual operations depending on the total Will in the Aura. -ritual.bloodmagic.greenGroveRitual.vengeful.info=(Vengeful) Increases the rate that a growth tick is successful. -ritual.bloodmagic.greenGroveRitual.steadfast.info=(Steadfast) Seeds are replanted and blocks are hydrated within the Hydration range. -ritual.bloodmagic.greenGroveRitual.destructive.info=(Destructive) Growing range is increased based on total Will. -ritual.bloodmagic.featheredKnifeRitual.default.info=(Raw) Increases the speed of the ritual based on the total Will in the Aura. -ritual.bloodmagic.featheredKnifeRitual.destructive.info=(Destructive) Increases the yield of the ritual based on total Will. -ritual.bloodmagic.featheredKnifeRitual.vengeful.info=(Vengeful) Sets the minimum health for sacrificing to 10%%. Overridden by Steadfast for the Owner if active. -ritual.bloodmagic.featheredKnifeRitual.corrosive.info=(Corrosive) Uses the player's Incense to increase the yield. -ritual.bloodmagic.featheredKnifeRitual.steadfast.info=(Steadfast) Sets the minimum health for sacrificing from 30%% to 70%%. -ritual.bloodmagic.speedRitual.default.info=(Raw) Increases the velocity caused by the ritual based on total Will. -ritual.bloodmagic.speedRitual.vengeful.info=(Vengeful) Prevents adult mobs and players from being transported. Players are transported if paired with Destructive. -ritual.bloodmagic.speedRitual.destructive.info=(Destructive) Prevents child mobs and players from being transported. Players are transported if paired with Vengeful. -ritual.bloodmagic.animalGrowthRitual.vengeful.info=(Vengeful) Decreases the time it takes for adults to breed again. -ritual.bloodmagic.animalGrowthRitual.steadfast.info=(Steadfast) Automatically breeds adults within its area using items in the connected chest. -ritual.bloodmagic.animalGrowthRitual.default.info=(Raw) Increases the speed of the ritual based on the total Will in the Aura. -ritual.bloodmagic.animalGrowthRitual.destructive.info=(Destructive) Causes adults that have not bred lately to run at mobs and explode. -ritual.bloodmagic.animalGrowthRitual.corrosive.info=(Corrosive) Unimplemented. -ritual.bloodmagic.groundingRitual.info=Forces entities on the ground and prevents jumping. -ritual.bloodmagic.groundingRitual.default.info=(Raw) Affects players. -ritual.bloodmagic.groundingRitual.corrosive.info=(Corrosive) Disables gravity (+Vengeful) Applies Levitation. -ritual.bloodmagic.groundingRitual.destructive.info=(Destructive) Applies Heavy Heart (increases fall damage) (+Vengeful) Stronger effect. -ritual.bloodmagic.groundingRitual.steadfast.info=(Steadfast) Affects Bosses. Doesn't affect bosses that are immune against motion change or immune against potions (except Wither and Ender Dragon). -ritual.bloodmagic.groundingRitual.vengeful.info=(Vengeful) Makes effects stronger. (+Corrosive) Applies Levitation. (+Destructive) Higher Heavy Heart amplifier. -ritual.bloodmagic.condorRitual.info=Provides flight in an area around the ritual. -ritual.bloodmagic.eternalSoulRitual.info=Capable of transferring Life Essence from a Network back into an Altar at a cost. - -ritual.bloodmagic.crystalSplitRitual.info=Splits apart a well-grown Raw crystal cluster into seperal aspected crystal clusters. -ritual.bloodmagic.fullStomachRitual.info=Takes food from the linked chest and fills the player's saturation with it. -ritual.bloodmagic.interdictionRitual.info=Pushes all mobs within its area away from the master ritual stone. -ritual.bloodmagic.containmentRitual.info=Pulls all mobs within its area towards the master ritual stone. -ritual.bloodmagic.speedRitual.info=Launches players within its range in the direction of the ritual. -ritual.bloodmagic.suppressionRitual.info=Suppresses fluids within its range - deactivating the ritual returns the fluids back to the world. -ritual.bloodmagic.expulsionRitual.info=Expels players from its range that are neither the owner nor have a bound blood orb in the chest on top of the master ritual stone. -ritual.bloodmagic.zephyrRitual.info=Picks up items within its range and places them into the linked chest. -ritual.bloodmagic.upgradeRemoveRitual.info=Removes all upgrades (and downgrades) from your Living Armor and gives you the corresponding Upgrade (and Downgrade) Tomes. These Tomes can be used to be applied to your Living Armor again. -ritual.bloodmagic.armourEvolveRitual.info=Increases the amount of maximum Upgrade Points on your Living Armor to 300. -ritual.bloodmagic.animalGrowthRitual.info=Increases the maturity rate of baby animals within its range. -ritual.bloodmagic.forsakenSoulRitual.info=Damages mobs within its damage range and when the mob dies a demon crystal within its crystal range will be grown. -ritual.bloodmagic.crystalHarvestRitual.info=Breaks Demon Will crystal clusters within its range, dropping the results on top of the crystals. -ritual.bloodmagic.placerRitual.info=Grabs blocks that are inside of the connected inventory and places them into the world. -ritual.bloodmagic.fellingRitual.info=A standard tree-cutting machine, this ritual will cut down all trees and leaves within its area and collect the drops. -ritual.bloodmagic.pumpRitual.info=Looks around the world and grabs fluids from the defined area. Will only remove and put the fluid into the connected tank if the tank has at least a bucket's worth of the same fluid. -ritual.bloodmagic.altarBuilderRitual.info=Builds an altar out of the components inside of the connected inventory. -ritual.bloodmagic.portalRitual.info=Creates a portal network based on the activator and the immediately surrounding blocks. Blocks can be changed after activation without changing the network of portals, and portals with the same "key" will link together. -ritual.bloodmagic.meteorRitual.info=Consumes an item inside of its item range to summon a meteor full of resources from the sky, aimed directly at the ritual. - -ritual.bloodmagic.waterRitual.waterRange.info=(Water) The area that the ritual will place water source blocks. -ritual.bloodmagic.waterRitual.waterTank.info=(Raw) The tank that the ritual will place water into. -ritual.bloodmagic.lavaRitual.lavaRange.info=(Lava) The area that the ritual will place lava source blocks. -ritual.bloodmagic.lavaRitual.lavaTank.info=(Raw) The tank that the ritual will place lava into. -ritual.bloodmagic.lavaRitual.fireFuse.info=(Vengeful) Entities in this range are afflicted by Fire Fuse. -ritual.bloodmagic.lavaRitual.fireResist.info=(Steadfast) Players in this range have Fire Resist applied. -ritual.bloodmagic.lavaRitual.fireDamage.info=(Corrosive) Entities within this range that are immune to fire damage are hurt proportional to the Will. -ritual.bloodmagic.greenGroveRitual.growing.info=(Growth) The area that the ritual will grow plants in. -ritual.bloodmagic.greenGroveRitual.leech.info=(Corrosive) Entities in this area have their life drained to grow nearby crops. -ritual.bloodmagic.greenGroveRitual.hydrate.info=(Steadfast) Blocks within this range are rehydrated into farmland, and seeds within the area are planted nearby. -ritual.bloodmagic.jumpRitual.jumpRange.info=(Jumping) Entities in this range will be launched in the air. -ritual.bloodmagic.wellOfSufferingRitual.altar.info=(Altar) This range defines the area that the ritual searches for the blood altar. Changing this will either expand or limit the range to a certain region. -ritual.bloodmagic.wellOfSufferingRitual.damage.info=(Damage) This defines where the ritual will damage a mob. All mobs inside of this range (except for players) will receive damage over time. -ritual.bloodmagic.featheredKnifeRitual.altar.info=(Altar) This range defines the area that the ritual searches for the blood altar. Changing this will either expand or limit the range to a certain region. -ritual.bloodmagic.featheredKnifeRitual.damage.info=(Damage) This defines where the ritual will damage a player. Players inside of this range will receive damage over time up to the specified limit. -ritual.bloodmagic.regenerationRitual.heal.info=(Healing) Entities within this range will receive a regeneration buff. -ritual.bloodmagic.regenerationRitual.vampire.info=(Vampirism) Mobs within this range have their health syphoned to heal players in the Healing range. -ritual.bloodmagic.harvestRitual.harvestRange.info=(Harvesting) Plants within this range will be harvested. -ritual.bloodmagic.magneticRitual.placementRange.info=(Placement) The range that the ritual will place the grabbed ores into. -ritual.bloodmagic.crushingRitual.crushingRange.info=(Crushing) The blocks that the ritual will break. -ritual.bloodmagic.crushingRitual.chest.info=(Chest) The location of the inventory that the ritual will place the broken blocks into. -ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the ritual will look at to feed players. -ritual.bloodmagic.fullStomachRitual.chest.info=(Chest) The location of the inventory that the ritual will grab food from to feed players in range. -ritual.bloodmagic.interdictionRitual.interdictionRange.info=(Push) The area of the ritual where mobs will be pushed. All mobs are pushed away from the master ritual stone, regardless of where this area is. -ritual.bloodmagic.containmentRitual.containmentRange.info=(Containment) The area of the ritual where mobs will be pulled. All mobs are pulled towards the master ritual stone, regardless of where this area is. -ritual.bloodmagic.speedRitual.sanicRange.info=(Speed) All entities within this area are launched in the direction of the arrow formed by the ritual. -ritual.bloodmagic.suppressionRitual.suppressionRange.info=(Suppress) All liquids within the range are suppressed. -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(Expulsion) The area from which players that are not owner or have an orb in the chest will be teleported away from. -ritual.bloodmagic.zephyrRitual.zephyrRange.info=(Suction) Items within this range will be sucked into the linked chest. -ritual.bloodmagic.zephyrRitual.chest.info=(Chest) The location of the inventory that the ritual will place the picked up items into. -ritual.bloodmagic.animalGrowthRitual.growing.info=(Growth) Animals within this range will grow much faster. -ritual.bloodmagic.animalGrowthRitual.chest.info=(Chest) Chest for breeding items if properly augmented. -ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in this range receive an increase in growth speed when a mob is killed by the ritual. -ritual.bloodmagic.forsakenSoulRitual.damage.info=(Damage) Mobs within this range will be slowly damaged, and when killed will grow the crystals. -ritual.bloodmagic.crystalHarvestRitual.crystal.info=(Crystal) All Demon Will crystal clusters have a single crystal broken off, spawning the crystal into the world. If there is only one crystal on the cluster, it will not break it. - -ritual.bloodmagic.ellipseRitual.info=Creates a hollow spheroid around the ritual using the blocks in the attached chest. -ritual.bloodmagic.ellipseRitual.spheroidRange.info=(Placement) The range that the ritual will place its blocks in. Spheroid is centered on the ritual - if one side is shorter than the side opposite the spheroid is truncated. -ritual.bloodmagic.ellipseRitual.chest.info=(Chest) The location of the inventory that the ritual will grab blocks from to place in the world. - -ritual.bloodmagic.placerRitual.placerRange.info=(Placement) The range that the ritual will place its blocks in. -ritual.bloodmagic.placerRitual.chest.info=(Chest) The location of the inventory that the ritual will grab blocks from to place in the world. -ritual.bloodmagic.fellingRitual.fellingRange.info=(Cutting) The range that the ritual will search out logs and leaves in order to cut down. -ritual.bloodmagic.fellingRitual.chest.info=(Chest) The location of the inventory that the ritual will place the results into. -ritual.bloodmagic.pumpRitual.pumpRange.info=(Pump) The region that the ritual will look for fluids to grab from the world. - -ritual.bloodmagic.downgradeRitual.dialogue.bow.1=So, mortal, you want to gain more power...? -ritual.bloodmagic.downgradeRitual.dialogue.bow.100=Of course you must know that everything has a cost... I cannot simply grant you more power without you paying something in return... -ritual.bloodmagic.downgradeRitual.dialogue.bow.300=If you lay an offering before me, you will forsake your perception, preventing you from using long-ranged projectiles with any form of accuracy. Arrows will no longer be your key to victory. -ritual.bloodmagic.downgradeRitual.dialogue.bow.500=But in return, I will unlock your armour so that it may grow even further... All you have to do is kneel before this altar with the correct offering... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.1=Fufufu... Greetings. I see that you wish to become more powerful. -ritual.bloodmagic.downgradeRitual.dialogue.quenched.100=You must be fully aware that when one's cup becomes full, it invariably has to empty once more to be filled again. -ritual.bloodmagic.downgradeRitual.dialogue.quenched.300=As such, I offer you a deal: by forsaking one's ability to drink, I shall grant you a vast increase to your potential. Whether this is a deal you think is worth taking is another matter entirely... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.500=So kneel, mortal, and drink from this cup that I offer to you, for it may be your last drink. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.1=Hmmm... What is it that you truly desire? -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.100=If it is strength beyond mortal men, then I cannot provide that - instead, I can offer you a different deal... -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.300=I can expand the capabilities of your armour, allowing you to achieve greater heights. However, I will need something from you in return: your strength in physical combat. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.500=By agreeing to this, you will no longer be able to swing a weapon with as much certainty, only able to do a fraction of the damage you could before. -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.700=So, the choice is yours: will you kneel at this altar, or will you still take up your sword? -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.1=Beware, mortal, for you are on shaky ground. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=Unlike my comrades, I offer one of the most grim deals that you could possibly hope for as a magician that deals in your own health. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.300=Although your wounds may heal, they will do so slowly if you accept my "offering," and the stings of battle will plague you even more. -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.500=So think carefully before you rush into something that you may regret, since even though your cup may be empty it will be almost impossible to fill once more... - -ritual.bloodmagic.featheredEarthRitual.info=Prevents falldamage in an area. -ritual.bloodmagic.condorRitual.info=Provides flight in an area around the ritual. -ritual.bloodmagic.eternalSoulRitual.info=Capable of transferring Life Essence from a Network back into an Altar at a cost. - -# Chat -chat.bloodmagic.altarMaker.setTier=Set Tier to: %d -chat.bloodmagic.altarMaker.building=Building a Tier %d Altar -chat.bloodmagic.altarMaker.destroy=Destroyed a Tier %d Altar -chat.bloodmagic.altarMaker.creativeOnly=This is a creative only item. - -chat.bloodmagic.damageSource=%s's soul became too weak - -chat.bloodmagic.ritual.weak=You feel a push, but are too weak to perform this ritual. -chat.bloodmagic.ritual.prevent=The ritual is actively resisting you! -chat.bloodmagic.ritual.activate=A rush of energy flows through the ritual! -chat.bloodmagic.ritual.notValid=You feel that these runes are not configured correctly... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=You are starting to feel better already! -chat.bloodmagic.livingArmour.upgrade.fireRemove=&6A cool feeling envelopes you as the burning subsides. -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6A shadowy force pulls you from the brink of death! -chat.bloodmagic.livingArmour.newUpgrade=&4Upgrade acquired! - -chat.bloodmagic.routing.remove=Removing contained location -chat.bloodmagic.routing.set=Setting node location -chat.bloodmagic.routing.link.master=Linked node to master! -chat.bloodmagic.routing.link=Linked nodes together - -chat.bloodmagic.altar.comp.glowstone=a block of glowstone -chat.bloodmagic.altar.comp.bloodstone=a large bloodstone brick -chat.bloodmagic.altar.comp.beacon=a beacon -chat.bloodmagic.altar.comp.bloodrune=a blood rune -chat.bloodmagic.altar.comp.crystal=an unimplemented item -chat.bloodmagic.altar.comp.notair=a solid block - -chat.bloodmagic.altar.nextTier=The next tier of blood altar is missing %s at %s. - -chat.bloodmagic.mimic.potionSet=Potion trap has been set. -chat.bloodmagic.mimic.potionRemove=Potion trap has been disabled. -chat.bloodmagic.mimic.potionInterval.up=Potion Interval has been increased to: %d ticks. -chat.bloodmagic.mimic.potionInterval.down=Potion Interval has been decreased to: %d ticks. -chat.bloodmagic.mimic.detectRadius.up=Player detection radius has been increased to: %d blocks. -chat.bloodmagic.mimic.detectRadius.down=Player detection radius has been decreased to: %d blocks. -chat.bloodmagic.mimic.potionSpawnRadius.up=Potion spawning radius has been increased to: %d blocks. -chat.bloodmagic.mimic.potionSpawnRadius.down=Potion spawning radius has been decreased to: %d blocks. - -death.attack.ritual_damage=%1$s has been sacrificed for a ritual. -death.attack.ritual_damage.player=%2$s has sacrificed %1$s for a ritual. - -# entity -entity.bloodmagic.SentientSpecter.name=Sentient Specter -entity.bloodmagic.Mimic.name=Mimic - -# Commands -commands.bloodmagic.error.arg.invalid=Invalid arguments -commands.bloodmagic.error.arg.missing=Not enough arguments -commands.bloodmagic.error.arg.player.missing=You must specify which player you wish to perform this action on. -commands.bloodmagic.error.negative=Amount must be a positive Integer. -commands.bloodmagic.error.outofbounds=Given integer is too large (must be within list ID boundaries). - -commands.bloodmagic.success=Executed successfully - -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic" command. - -commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] player [amount] -commands.bloodmagic.network.help=LP network utilities - -commands.bloodmagic.network.syphon.help=Removes the given amount of LP from the given player's LP network. -commands.bloodmagic.network.syphon.success=Successfully syphoned %d LP from %s. -commands.bloodmagic.network.syphon.usage=/bloodmagic network syphon [player] [amount] -commands.bloodmagic.network.syphon.amountTooHigh=Cannot syphon more LP than available. -commands.bloodmagic.network.add.help=Adds the given amount of LP to the given player's LP network. Follows standard LP gain rules. -commands.bloodmagic.network.add.usage=/bloodmagic network add [player] [amount] -commands.bloodmagic.network.add.success=Successfully added %d LP to %s's LP network. -commands.bloodmagic.network.set.help=Sets the given player's LP to the given amount. -commands.bloodmagic.network.set.usage=/bloodmagic network set [player] [amount] -commands.bloodmagic.network.set.success=Successfully set %s's LP network to %d LP. -commands.bloodmagic.network.get.help=Returns the amount of LP in the given player's LP network. -commands.bloodmagic.network.get.usage=/bloodmagic network get [player] -commands.bloodmagic.network.fill.help=Fills the given player's LP network to %d. -commands.bloodmagic.network.fill.usage=/bloodmagic network fill [player] -commands.bloodmagic.network.fill.success=Successfully filled %s's LP network. -commands.bloodmagic.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. -commands.bloodmagic.network.cap.usage=/bloodmagic network cap [player] -commands.bloodmagic.network.cap.success=Successfully capped off %s's LP network. -commands.bloodmagic.network.tickethistory.help=Shows the soul ticket history containing information about LP consumers for the player -commands.bloodmagic.network.tickethistory.usage=/bloodmagic network tickethistory [player] - -commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [player] ("?" or "help" for help) -commands.bloodmagic.bind.help=Attempts to (un)bind the currently held item. -commands.bloodmagic.bind.success=Successfully bound to %d. -commands.bloodmagic.bind.remove.success=Unbinding successful -commands.bloodmagic.bind.error.ownerEqualsTarget=Nothing changed: Target and current owner are equal. -commands.bloodmagic.bind.error.notBound=Cannot unbind: Item not bound. -commands.bloodmagic.bind.error.notBindable=Cannot bind: Item not bindable. - -commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] player [tier] ("?" or "help" for help) -commands.bloodmagic.orb.help=Used to set or get the Player's max Blood Orb tier. -commands.bloodmagic.orb.get.help=Used to get the Player's max Blood Orb tier. -commands.bloodmagic.orb.get.usage=/bloodmagic orb get [player|?|help] -commands.bloodmagic.orb.set.help=Used to set the Player's max Blood Orb tier. -commands.bloodmagic.orb.set.usage=/bloodmagic orb set [player|?|help] -commands.bloodmagic.orb.currenttier=Current Orb tier is %d. -commands.bloodmagic.orb.error.tierTooHigh=Orb tier cannot be higher than %d. - -commands.bloodmagic.ritual.create.help=Creates the specified ritual with the MRS at your feet, ignores other blocks by default. (Optional parameters: ([ (safe|true|false)] | [safe|true|false])) -commands.bloodmagic.ritual.repair.help=Repairs the ritual with the closest match to the remaining ritual stones, ignores other blocks by default. (Optional parameters: ([ (safe|true|false)] | [safe|true|false])) - -commands.bloodmagic.ritual.create.noRitual=You must select a ritual. (Tab-completions are available!) -commands.bloodmagic.ritaul.create.error.unsafe=Created or repaired ritual cannot be placed safely. -commands.bloodmagic.ritual.create.error.outOfWorldBoundaries=Created or repaired ritual would be out of world boundaries. -commands.bloodmagic.ritual.error.noMRS=You need to stand on a Master Ritual Stone to execute the command! - -commands.bloodmagic.teleposer.usage=Teleposer Utilities ("?" or "help" for help) -commands.bloodmagic.teleposer.list.help=Returns a list of all valid teleposers, optionally possessed by [player]. -commands.bloodmagic.teleposer.list.usage=/bloodmagic teleposer list [player|?|help] -commands.bloodmagic.teleposer.teleport.help=Teleports to the location of the specified teleposer. -commands.bloodmagic.teleposer.teleport.usage=/bloodmagic teleposer teleport [ID|?|help] -commands.bloodmagic.teleposer.teleportfocus.help=Teleports to the location stored in the specified teleposer's focus. -commands.bloodmagic.teleposer.teleportfocus.usage=/bloodmagic teleposer teleportfocus [ID|?|help] -commands.bloodmagic.teleposer.rmrf.help=Follows teleposer foci and removes all teleposers along the path, starting with the specified teleposer. -commands.bloodmagic.teleposer.rmrf.usage=/bloodmagic teleposer rmrf [ID|?|help] -commands.bloodmagic.teleposer.remove.help=Removes the specified teleposer. -commands.bloodmagic.teleposer.remove.usage=/bloodmagic teleposer remove [ID|?|help] -commands.bloodmagic.teleposer.removeall.help=Removes all teleposers or all teleposers containing a focus bound to [player], if specified. -commands.bloodmagic.teleposer.removeall.usage=/bloodmagic teleposer removeall [player|?|help] - -#Used by commands.bloodmagic.teleposer.list for the dump sent to the player -commands.bloodmagic.teleposer.anddimension=: Teleposer: DimID: -commands.bloodmagic.teleposer.focusanddim=Focus: DimID: -commands.bloodmagic.teleposer.owner=Owner: - - -# GUI -tile.bloodmagic.inputNode.name=Input Node -tile.bloodmagic.outputNode.name=Output Node -gui.bloodmagic.save=Save -gui.bloodmagic.cancel=Cancel -gui.bloodmagic.default=Default -gui.bloodmagic.toggle=Toggle -config.bloodmagic.edit_hud=Edit HUD Elements - -# Keybinds -bloodmagic.keybind.open_holding=Open Sigil of Holding -bloodmagic.keybind.cycle_holding_pos=Cycle Sigil (+) -bloodmagic.keybind.cycle_holding_neg=Cycle Sigil (-) - -# JustEnoughItems -jei.bloodmagic.recipe.altar=Blood Altar -jei.bloodmagic.recipe.binding=Alchemy Array (Binding) -jei.bloodmagic.recipe.alchemyArrayCrafting=Alchemy Array -jei.bloodmagic.recipe.soulForge=Hellfire Forge -jei.bloodmagic.recipe.alchemyTable=Alchemy Table -jei.bloodmagic.recipe.armourDowngrade=Penance (Ritual) -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=Tier: %d -jei.bloodmagic.recipe.consumptionRate=Consumption: %d LP/t -jei.bloodmagic.recipe.drainRate=Drain: %d LP/t -jei.bloodmagic.recipe.minimumSouls=Minimum: %1$,.2f Will -jei.bloodmagic.recipe.soulsDrained=Drained: %1$,.2f Will -jei.bloodmagic.recipe.lpDrained=Drained: %,d LP -jei.bloodmagic.recipe.ticksRequired=Time: %,d Ticks - -jei.bloodmagic.desc.altarBuilder=A creative-only item for use in debugging and testing.\n\nShift + Right click to change the tier to build. Right click an Altar to initiate the build.\n\nBreak an Altar while holding to dismantle it. -jei.bloodmagic.desc.demonicWill=An imprint of a demonic entity attached to a creature.\n\nCan be obtained by killing a mob with a sentient weapon or by throwing a snare at a mob and killing it while it has white particles. - -# WAILA -waila.bloodmagic.sneak=&oSneak for Information -waila.bloodmagic.array.reagent=Reagent: %s -waila.bloodmagic.array.catalyst=Catalyst: %s -option.bloodmagic.bypassSneak=Bypass Sneak -option.bloodmagic.bloodAltar=Blood Altar -option.bloodmagic.ritualController=Ritual Stones -option.bloodmagic.teleposer=Teleposer -option.bloodmagic.array=Alchemy Array - -# Thaumcraft -tc.research_category.BLOODMAGIC=Sanguine Arcana - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=Blood Magic -bloodmagic.research_text.BLOODMAGIC=Sanguine Arcana -bloodmagic.research_page.BLOODMAGIC.1=The realm of the Blood Magics has always appeared to be a more solitary and "individual" art with blood mages being notoriously reclusive and a bit insane at times. However, the powers of self-sacrifice and life essence have uses even beyond a normal blood mage's sight, in fact, it is quite apparent that it may have some uses in thaumaturgy after all! - -# Buttons -button.bloodmagic.tooltip.fill=Fill network diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang_old b/src/main/resources/assets/bloodmagic/lang/en_US.lang_old deleted file mode 100644 index 2d74a6ce..00000000 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang_old +++ /dev/null @@ -1,542 +0,0 @@ -#Items -item.AlchemicalWizardry.bindable.activationCrystal.weak.name=Weak Activation Crystal -item.AlchemicalWizardry.bindable.activationCrystal.awakened.name=Awakened Activation Crystal -item.AlchemicalWizardry.bindable.activationCrystal.creative.name=Creative Activation Crystal - -item.AlchemicalWizardry.dagger.name=Sacrificial Dagger -item.AlchemicalWizardry.dagger.creative.name=Creative Sacrificial Dagger - -item.AlchemicalWizardry.scribe.water.name=Water Scribing Tools -item.AlchemicalWizardry.scribe.fire.name=Fire Scribing Tools -item.AlchemicalWizardry.scribe.earth.name=Earth Scribing Tools -item.AlchemicalWizardry.scribe.air.name=Air Scribing Tools -item.AlchemicalWizardry.scribe.dusk.name=Dusk Scribing Tools -item.AlchemicalWizardry.scribe.dawn.name=Dawn Scribing Tools - -item.AlchemicalWizardry.slate.blank.name=Blank Slate -item.AlchemicalWizardry.slate.reinforced.name=Reinforced Slate -item.AlchemicalWizardry.slate.imbued.name=Imbued Slate -item.AlchemicalWizardry.slate.demonic.name=Demonic Slate - -item.AlchemicalWizardry.focus.weak.name=Teleposition Focus -item.AlchemicalWizardry.focus.enhanced.name=Enhanced Teleposition Focus -item.AlchemicalWizardry.focus.reinforced.name=Reinforced Teleposition Focus -item.AlchemicalWizardry.focus.demonic.name=Demonic Teleposition Focus - -item.AlchemicalWizardry.orb.weak.name=Weak Blood Orb -item.AlchemicalWizardry.orb.apprentice.name=Apprentice Blood Orb -item.AlchemicalWizardry.orb.magician.name=Magician Blood Orb -item.AlchemicalWizardry.orb.master.name=Master Blood Orb -item.AlchemicalWizardry.orb.archmage.name=Archmage Blood Orb -item.AlchemicalWizardry.orb.transcendent.name=Transcendent Blood Orb - -item.AlchemicalWizardry.reagent.incendium.name=Incendium -item.AlchemicalWizardry.reagent.magicales.name=Magicales -item.AlchemicalWizardry.reagent.sanctus.name=Sanctus -item.AlchemicalWizardry.reagent.aether.name=Aether -item.AlchemicalWizardry.reagent.crepitous.name=Crepitous -item.AlchemicalWizardry.reagent.crystallos.name=Crystallos -item.AlchemicalWizardry.reagent.terrae.name=Terrae -item.AlchemicalWizardry.reagent.aquasalus.name=Aquasalus -item.AlchemicalWizardry.reagent.tennebrae.name=Tennebrae -item.AlchemicalWizardry.reagent.offensa.name=Offensa -item.AlchemicalWizardry.reagent.praesidium.name=Praesidium -item.AlchemicalWizardry.reagent.orbisterrae.name=Orbis Terrae -item.AlchemicalWizardry.reagent.virtus.name=Virtus -item.AlchemicalWizardry.reagent.reductus.name=Reductus -item.AlchemicalWizardry.reagent.potentia.name=Potentia - -item.AlchemicalWizardry.sigil.air.name=Air Sigil -item.AlchemicalWizardry.sigil.bloodLight.name=Sigil of the Blood Lamp -item.AlchemicalWizardry.sigil.compression.name=Sigil of Compression -item.AlchemicalWizardry.sigil.divination.name=Divination Sigil - -# Tooltips -tooltip.sigil.air.desc=I feel lighter already... -tooltip.sigil.bloodLight.desc=I see a light! -tooltip.sigil.compression.desc=Hands of Diamonds -tooltip.sigil.divination.desc=Peer into the soul - -#Block Localization -tile.altar.name=Blood Altar -tile.blood_rune.blank.name=Blood Rune -tile.blood_rune.fill.name=Rune of Augmented Capacity -tile.blood_rune.empty.name=Rune of Dislocation -tile.blood_rune.orb.name=Rune of the Orb -tile.blood_rune.betterCapacity.name=Rune of Superior Capacity -tile.blood_rune.acceleration.name=Rune of Acceleration -tile.speed_rune.name=Speed Rune -tile.efficiency_rune.name=Efficiency Rune -tile.sacrifice_rune.name=Rune of Sacrifice -tile.self_sacrifice_rune.name=Rune of Self-Sacrifice -tile.ritual_stone.name=Ritual Stone -tile.master_ritual_stone.name=Master Ritual Stone -tile.filled_socket.name=Filled Socket -tile.imperfect_ritual_stone.name=Imperfect Ritual Stone -tile.soul_armour_forge.name=Soul Armour Forge -tile.empty_socket.name=Empty Socket -tile.bloodstone_brick.name=Bloodstone Brick -tile.large_bloodstone_brick.name=Large Bloodstone Brick -tile.chemistry_set.name=Alchemical Chemistry Set -tile.spell_table.name=Spell Table -tile.pedestal.name=Arcane Pedestal -tile.plinth.name=Arcane Plinth -tile.teleposer.name=Teleposer -tile.spell_conduit.name=Spell Conduit -tile.spell_paradigm.projectile.name=Particle Generator -tile.spell_paradigm.self.name=Self Augmentator -tile.spell_paradigm.melee.name=Melee Aggregator -tile.spell_paradigm.tool.name=Tool Forger -tile.spell_enhancement.power1.name=Unstable Spell Empowerer -tile.spell_enhancement.power2.name=Standard Spell Empowerer -tile.spell_enhancement.power3.name=Reinforced Spell Empowerer -tile.spell_enhancement.power4.name=Imbued Spell Empowerer -tile.spell_enhancement.power5.name=Demonic Spell Empowerer -tile.spell_enhancement.cost1.name=Unstable Spell Dampener -tile.spell_enhancement.cost2.name=Standard Spell Dampener -tile.spell_enhancement.cost3.name=Reinforced Spell Dampener -tile.spell_enhancement.cost4.name=Imbued Spell Dampener -tile.spell_enhancement.cost5.name=Demonic Spell Dampener -tile.spell_enhancement.potency1.name=Unstable Spell Augmentor -tile.spell_enhancement.potency2.name=Standard Spell Augmentor -tile.spell_enhancement.potency3.name=Reinforced Spell Augmentor -tile.spell_enhancement.potency4.name=Imbued Spell Augmentor -tile.spell_enhancement.potency5.name=Demonic Spell Augmentor -tile.spell_modifier.default.name=Default Spell Modifier -tile.spell_modifier.offensive.name=Offensive Spell Modifier -tile.spell_modifier.defensive.name=Defensive Spell Modifier -tile.spell_modifier.environmental.name=Environmental Spell Modifier -tile.spell_effect.fire.name=Crucible of Fire -tile.spell_effect.ice.name=Ice Maker -tile.spell_effect.wind.name=Wind Generator -tile.spell_effect.earth.name=Earth Former -tile.alchemical_calcinator.name=Alchemical Calcinator -tile.crystal_belljar.name=Crystal Belljar -tile.reagent_conduit.name=Alchemy Relay -tile.life_essence.name=Life Essence -tile.crystal_block.fullCrystal.name=Crystal Cluster -tile.crystal_block.crystalBrick.name=Crystal Cluster Brick -tile.demon_portal.name=Demon Portal -tile.demon_chest.name=Demon's Chest -tile.enchantment_glyph.enchantability.name=Glyph of the Adept Enchanter -tile.enchantment_glyph.enchantmentLevel.name=Glyph of Arcane Potential -tile.stability_glyph.stability1.name=Glyph of Rigid Stability -tile.schematic_saver.name=Schematic Saver -tile.mimic_block.name=Mimic Block -tile.spectral_container.name=Spectral Container -tile.blood_light.name=Blood Light -tile.spectral_block.name=Spectral Block -tile.incense_crucible.name=Incense Crucible - -#Item Localization -item.weak_blood_orb.name=Weak Blood Orb -item.apprentice_blood_orb.name=Apprentice Blood Orb -item.magician_blood_orb.name=Magician's Blood Orb -item.master_blood_orb.name=Master Blood Orb -item.archmage_blood_orb.name=Archmage's Blood Orb -item.energy_blast.name=Energy Blaster -item.energy_sword.name=Bound Blade -item.lava_crystal.name=Lava Crystal -item.water_sigil.name=Water Sigil -item.lava_sigil.name=Lava Sigil -item.void_sigil.name=Void Sigil -item.blank_slate.name=Blank Slate -item.reinforced_slate.name=Reinforced Slate -item.sacrificial_dagger.name=Sacrificial Knife -item.dagger_of_sacrifice.name=Dagger of Sacrifice -item.air_sigil.name=Air Sigil -item.sigil_of_the_fast_miner.name=Sigil of the Fast Miner -item.sigil_of_elemental_affinity.name=Sigil of Elemental Affinity -item.sigil_of_haste.name=Sigil of Haste -item.sigil_of_holding.name=Sigil of Holding -item.divination_sigil.name=Divination Sigil -item.water_scribe_tool.name=Elemental Inscription Tool: Water -item.fire_scribe_tool.name=Elemental Inscription Tool: Fire -item.earth_scribe_tool.name=Elemental Inscription Tool: Earth -item.air_scribe_tool.name=Elemental Inscription Tool: Air -item.dusk_scribe_tool.name=Elemental Inscription Tool: Dusk -item.activation_crystal_weak.name=Weak Activation Crystal -item.activation_crystal_awakened.name=Awakened Activation Crystal -item.activation_crystal_creative.name=Creative Activation Crystal -item.bound_pickaxe.name=Bound Pickaxe -item.bound_axe.name=Bound Axe -item.bound_shovel.name=Bound Shovel -item.bound_helmet.name=Bound Helmet -item.bound_chestplate.name=Bound Chestplate -item.bound_leggings.name=Bound Leggings -item.bound_boots.name=Bound Boots -item.weak_blood_shard.name=Weak Blood Shard -item.growth_sigil.name=Sigil of the Green Grove -item.blank_spell.name=Unbound Crystal -item.alchemy_flask.name=Potion Flask -item.standard_binding_agent.name=Standard Binding Agent -item.mundane_power_catalyst.name=Mundane Power Catalyst -item.average_power_catalyst.name=Average Power Catalyst -item.greater_power_catalyst.name=Greater Power Catalyst -item.mundane_lengthening_catalyst.name=Mundane Lengthening Catalyst -item.average_lengthening_catalyst.name=Average Lengthening Catalyst -item.greater_lengthening_catalyst.name=Greater Lengthening Catalyst -item.incendium.name=Incendium -item.magicales.name=Magicales -item.sanctus.name=Sanctus -item.aether.name=Aether -item.simple_catalyst.name=Simple Catalyst -item.crepitous.name=Crepitous -item.crystallos.name=Crystallos -item.terrae.name=Terrae -item.aquasalus.name=Aquasalus -item.tennebrae.name=Tenebrae -item.demon_blood_shard.name=Demon Blood Shard -item.sigil_of_wind.name=Sigil of the Whirlwind -item.teleposition_focus.name=Teleposition Focus -item.enhanced_teleposition_focus.name=Enhanced Teleposition Focus -item.reinforced_teleposition_focus.name=Reinforced Teleposition Focus -item.demonic_teleposition_focus.name=Demonic Teleposition Focus -item.imbued_slate.name=Imbued Slate -item.demonic_slate.name=Demonic Slate -item.sigil_of_the_bridge.name=Sigil of the Phantom Bridge -item.armour_inhibitor.name=Armour Inhibitor -item.creative_orb.name=Orb of Testing -item.weak_filling_agent.name=Weak Filling Agent -item.standard_filling_agent.name=Standard Filling Agent -item.enhanced_filling_agent.name=Enhanced Filling Agent -item.weak_binding_agent.name=Weak Binding Agent -item.ritual_diviner.name=Ritual Diviner -item.ritual_dismantler.name=Ritual Dismantler -item.sigil_of_magnetism.name=Sigil of Magnetism -item.key_of_binding.name=Key of Binding -item.energy_bazooka.name=Energy Bazooka -item.blood_light_sigil.name=Sigil of the Blood Lamp -item.complex_spell_crystal.name=Complex Spell Crystal -item.sigil_of_supression.name=Sigil of Supression -item.sigil_of_ender_severance.name=Sigil of Ender Severance -item.bucket_life.name=Bucket of Life -item.base_items.quartz_rod.name=Quartz Rod -item.base_items.empty_core.name=Empty Core -item.base_items.magicales_cable.name=Magicales Cable -item.base_items.wood_brace.name=Wooden Brace -item.base_items.stone_brace.name=Stone Brace -item.base_items.projectile_core.name=Projectile Core -item.base_items.self_core.name=Self Core -item.base_items.melee_core.name=Melee Core -item.base_items.tool_core.name=Tool Core -item.base_items.paradigm_back_plate.name=Paradigm Plate -item.base_items.output_cable.name=Output Spell Cable -item.base_items.input_cable.name=Input Spell Cable -item.base_items.flame_core.name=Fire Core -item.base_items.icy_core.name=Icy Core -item.base_items.gust_core.name=Gusty Core -item.base_items.earthen_core.name=Earthen Core -item.base_items.cracked_runic_plate.name=Cracked Runic Plate -item.base_items.runic_plate.name=Runic Plate -item.base_items.scribed_runic_plate.name=Imbued Runic Plate -item.base_items.default_core.name=Unattuned Core -item.base_items.offensive_core.name=Offensive Core -item.base_items.defensive_core.name=Defensive Core -item.base_items.environmental_core.name=Environmental Core -item.base_items.power_core.name=Power Core -item.base_items.cost_core.name=Reduction Core -item.base_items.potency_core.name=Potency Core -item.base_items.obsidian_brace.name=Obsidian Brace -item.base_items.ethereal_slate.name=Ethereal Slate -item.base_items.life_shard.name=Life Shard -item.base_items.soul_shard.name=Soul Shard -item.base_items.life_brace.name=Living Brace -item.base_items.soul_runic_plate.name=Soul Runic Plate -item.base_items.ender_shard.name=Ender Shard -item.base_alchemy_items.offensa.name=Offensa -item.base_alchemy_items.praesidium.name=Praesidium -item.base_alchemy_items.orbis_terrae.name=Orbis Terrae -item.base_alchemy_items.strengthened_catalyst.name=Strengthened Catalyst -item.base_alchemy_items.concentrated_catalyst.name=Concentrated Catalyst -item.base_alchemy_items.fractured_bone.name=Fractured Bone -item.base_alchemy_items.virtus.name=Virtus -item.base_alchemy_items.reductus.name=Reductus -item.base_alchemy_items.potentia.name=Potentia -item.sanguine_helmet.name=Sanguine Helmet -item.seer_sigil.name=Sigil of Sight -item.fluid_sigil.name=Sigil of Fluidity -item.multi_tool.name=Dynamic Mace -item.combinational_catalyst.name=Combinational Catalyst -item.sanguine_robe.name=Sanguine Robes -item.sanguine_pants.name=Sanguine Leggings -item.sanguine_boots.name=Sanguine Boots -item.alchemical_router.name=Alchemic Router -item.alchemical_segmenter.name=Alchemic Segmenter -item.alchemical_cleanser.name=Alchemic Cleanser -item.demon_crystal.name=Demon Crystal -item.creative_dagger.name=Creative Sacrificial Knife -item.blood_pack.name=Blood Letter's Pack -item.harvest_sigil.name=Harvest Goddess Sigil -item.compression_sigil.name=Sigil of Compression -item.assassin_sigil.name=Sigil of the Assassin -item.transcendent_blood_orb.name=Transcendent Blood Orb -item.mail_catalogue.name=Mail Order Catalogue -item.input_routing_focus.name=Input Routing Focus -item.output_routing_focus.default.name=Default Output Routing Focus -item.output_routing_focus.modItem.name=Output Routing Focus (ModItem) -item.output_routing_focus.ignMeta.name=Output Routing Focus (Ignore Meta) -item.output_routing_focus.matchNBT.name=Output Routing Focus (MatchNBT) -item.output_routing_focus.global.name=Output Routing Focus (Global) -item.dawn_scribe_tool.name=Elemental Inscription Tool: Dawn -item.bound_helmet_earth.name=Earth Omega Helmet -item.bound_chestplate_earth.name=Earth Omega Chestplate -item.bound_leggings_earth.name=Earth Omega Leggings -item.bound_boots_earth.name=Earth Omega Boots -item.bound_helmet_wind.name=Wind Omega Helmet -item.bound_chestplate_wind.name=Wind Omega Chestplate -item.bound_leggings_wind.name=Wind Omega Leggings -item.bound_boots_wind.name=Wind Omega Boots -item.bound_helmet_fire.name=Fire Omega Helmet -item.bound_chestplate_fire.name=Fire Omega Chestplate -item.bound_leggings_fire.name=Fire Omega Leggings -item.bound_boots_fire.name=Fire Omega Boots -item.bound_helmet_water.name=Water Omega Helmet -item.bound_chestplate_water.name=Water Omega Chestplate -item.bound_leggings_water.name=Water Omega Leggings -item.bound_boots_water.name=Water Omega Boots - -item.incense.wood_ash.name=Wood Ash -item.incense.byrrus.name=Byrrus -item.incense.livens.name=Livens -item.incense.viridis.name=Viridis -item.incense.purpura.name=Purpura - -#Creative Tab -itemGroup.tabBloodMagic=Blood Magic - -#Extra Strings -bm.string.consume=Usage -bm.string.drain=Drain -bm.string.tier=Tier -bm.string.crafting.orb.shaped=Shaped Orb Crafting -bm.string.crafting.orb.shapeless=Shapeless Orb Crafting -text.recipe.altar=Blood Altar -text.recipe.altar.tier=Tier: %s -text.recipe.altar.bloodRequired=LP: %s -text.recipe.shapedOrb=Shaped Orb Recipe - -#Entities -entity.AWWayofTime.EarthElemental.name=Earth Elemental -entity.AWWayofTime.FireElemental.name=Fire Elemental -entity.AWWayofTime.HolyElemental.name=Holy Elemental -entity.AWWayofTime.ShadeElemental.name=Shade Elemental -entity.AWWayofTime.WaterElemental.name=Water Elemental -entity.AWWayofTime.AirElemental.name=Air Elemental -entity.AWWayofTime.Shade.name=Shade -entity.AWWayofTime.BoulderFist.name=Boulder Fist -entity.AWWayofTime.IceDemon.name=Ice Demon -entity.AWWayofTime.SmallEarthGolem.name=Small Earth Golem -entity.AWWayofTime.WingedFireDemon.name=Winged Fire Demon -entity.AWWayofTime.BileDemon.name=Bile Demon -entity.AWWayofTime.LowerGuardian.name=Lower Guardian -entity.AWWayofTime.FallenAngel.name=Fallen Angel -entity.AWWayofTime.MinorDemonGruntGuardian.name=Demon Grunt Guardian -entity.AWWayofTime.MinorDemonGruntGuardianWind.name=Wind Demon Grunt Guardian -entity.AWWayofTime.MinorDemonGruntGuardianFire.name=Fire Demon Grunt Guardian -entity.AWWayofTime.MinorDemonGruntGuardianIce.name=Ice Demon Grunt Guardian -entity.AWWayofTime.MinorDemonGruntGuardianEarth.name=Earth Demon Grunt Guardian -entity.AWWayofTime.MinorDemonGruntWind.name=Wind Demon Grunt -entity.AWWayofTime.MinorDemonGruntFire.name=Fire Demon Grunt -entity.AWWayofTime.MinorDemonGruntIce.name=Ice Demon Grunt -entity.AWWayofTime.MinorDemonGruntEarth.name=Earth Demon Grunt -entity.AWWayofTime.MinorDemonGrunt.name=Demon Grunt - -#Commands -commands.soulnetwork.usage=/soulnetwork -commands.bind.usage=/bind -commands.bind.success=Item successfully bound! -commands.bind.failed.noPlayer=There is no player specified -commands.bind.failed.alreadyBound=Item is already bound; use /unbind to unbind it -commands.bind.failed.notBindable=Item cannot be bound -commands.unbind.usage=/unbind -commands.unbind.success=Item successfully unbound! -commands.unbind.failed.notBindable=Item cannot be unbound -commands.soulnetwork.usage=/soulnetwork [amount] -commands.soulnetwork.add.success=Successfully added %dLP to %s's Soul Network! -commands.soulnetwork.subtract.success=Successfully subtracted %dLP from %s's Soul Network! -commands.soulnetwork.fill.success=Successfully filled %s's Soul Network! -commands.soulnetwork.empty.success=Successfully emptied %s's Soul Network! -commands.soulnetwork.get.success=There is %dLP in %s's Soul Network! -commands.soulnetwork.noPlayer=There is no player specified -commands.soulnetwork.noCommand=There is no command specified -commands.soulnetwork.notACommand=That is not a valid command -commands.soulnetwork.fillMax.success=Successfully filled %s's Soul Network to their orb max! -commands.soulnetwork.create.success=Successfully created %s's Soul Network (Orb tier: %d) - -#Tooltips -tooltip.activationcrystal.weak=Activates low-level rituals -tooltip.activationcrystal.awakened=Activates more powerful rituals -tooltip.activationcrystal.creative=Creative Only - activates any ritual -tooltip.airsigil.desc=I feel lighter already... -tooltip.alchemy.coords=Coords: %d, %d, %d -tooltip.alchemy.damage=Damage: -tooltip.alchemy.dimension=Bound Dimension: %d -tooltip.alchemy.direction=Direction: -tooltip.alchemy.forrecipe=for Recipe -tooltip.alchemy.press=Press -tooltip.alchemy.recipe=&9Recipe: -tooltip.alchemy.ritualid=RitualID: -tooltip.alchemy.shift=shift -tooltip.alchemy.pressShift=-Press &l&9shift &7for Recipe- -tooltip.alchemy.usedinalchemy=Used in Alchemy -tooltip.alchemyflask.caution=CAUTION: Contents are throwable -tooltip.alchemyflask.swigsleft=Swigs Left: -tooltip.armorinhibitor.desc1=Used to suppress a soul's -tooltip.armorinhibitor.desc2=unnatural abilities. -tooltip.attunedcrystal.desc1=A tool to tune alchemy -tooltip.attunedcrystal.desc2=reagent transmission -tooltip.blankspell.desc=Crystal of infinite possibilities. -tooltip.bloodframe.desc=Stirs bees into a frenzy. -tooltip.bloodletterpack.desc=This pack really chaffes... -tooltip.bloodlightsigil.desc=I see a light! -tooltip.boundarmor.devprotect=Devilish Protection -tooltip.boundaxe.desc=Axe me about my puns! -tooltip.boundpickaxe.desc1=The Souls of the Damned -tooltip.boundpickaxe.desc2=do not like stone... -tooltip.boundshovel.desc=No, not that type of spade. -tooltip.caution.desc1=Caution: may cause -tooltip.caution.desc2=a bad day... -tooltip.cheatyitem.desc1=Right-click to fill network, -tooltip.cheatyitem.desc2=shift-right to empty. -tooltip.complexspellcrystal.desc=Crystal of unimaginable power -tooltip.crystalbelljar.contents=Current Contents: -tooltip.crystalbelljar.empty=- Empty -tooltip.telepositionfocus.demonic.desc1=A stronger version of the focus, -tooltip.telepositionfocus.demonic.desc2=using a demonic shard -tooltip.demonplacer.desc=Used to spawn demons. -tooltip.destclearer.desc1=Used to clear the destination -tooltip.destclearer.desc2=list for an alchemy container -tooltip.diablokey.desc=Binds other items to the owner's network -tooltip.divinationsigil.desc1=Peer into the soul to -tooltip.divinationsigil.desc2=get the current essence -tooltip.energybazooka.desc=Boom. -tooltip.energybattery.desc=Stores raw Life Essence -tooltip.energyblast.desc1=Used to fire devastating -tooltip.energyblast.desc2=projectiles. -tooltip.telepositionfocus.enhanced.desc1=A focus further enhanced in an altar -tooltip.fluidsigil.beastmode=Beast Mode -tooltip.fluidsigil.desc=A sigil with a lovely affinity for fluids -tooltip.fluidsigil.draintankmode=Drain Tank Mode -tooltip.fluidsigil.filltankmode=Fill Tank Mode -tooltip.fluidsigil.fluidplacementmode=Fluid Placement Mode -tooltip.fluidsigil.forcesyphonmode=Force-syphon Mode -tooltip.fluidsigil.syphoningmode=Syphoning Mode -tooltip.harvestsigil.desc=You sow what you reap -tooltip.infusedstone.desc1=Infused stone inside of -tooltip.infusedstone.desc2=a blood altar -tooltip.item.iteminslot=Item in slot -tooltip.item.currentitem=Current Item: -tooltip.lavacrystal.desc1=Store life to smelt -tooltip.lavacrystal.desc2=stuff in the furnace. -tooltip.lavasigil.desc1=Contact with liquid is -tooltip.lavasigil.desc2=highly unrecommended. -tooltip.lp.storedlp=Stored LP: -tooltip.mode.creative=Creative Only -tooltip.owner.currentowner=Current Owner: %s -tooltip.owner.demonsowner=Demon's Owner: -tooltip.packratsigil.desc=Hands of Diamonds -tooltip.reagent.selectedreagent=Currently selected reagent: -tooltip.telepositionfocus.reinforced.desc1=A stronger version of the focus, -tooltip.telepositionfocus.reinforced.desc2=using a weak shard -tooltip.ritualdiviner.airstones=Air Stones: -tooltip.ritualdiviner.blankstones=Blank Stones: -tooltip.ritualdiviner.cannotplace=Can not place Dusk runes -tooltip.ritualdiviner.canplace=Can place Dusk runes -tooltip.ritualdiviner.canplacedawn=Can place Dusk and Dawn runes -tooltip.ritualdiviner.desc=Used to explore new types of rituals -tooltip.ritualdiviner.duskstones=Dusk Stones: -tooltip.ritualdiviner.earthstones=Earth Stones: -tooltip.ritualdiviner.firestones=Fire Stones: -tooltip.ritualdiviner.moreinfo=Press shift for extended information -tooltip.ritualdiviner.ritualtunedto=Ritual tuned to face: -tooltip.ritualdiviner.waterstones=Water Stones: -tooltip.ritualdiviner.dawnstones=Dawn Stones: -tooltip.ritualdiviner.totalStones=Total Stones: -tooltip.dismatler.desc=You could turn this upside down? -tooltip.sacrificialdagger.desc1=A slight draining feeling tickles your fingers -tooltip.sacrificialdagger.desc2=Just a prick of the -tooltip.sacrificialdagger.desc3=finger will suffice... -tooltip.sanguinearmor.desc1=A pair of goggles imbued with power -tooltip.sanguinearmor.desc2=Robes imbued with forbidden power -tooltip.sanguinearmor.visdisc=Vis discount: -tooltip._scribe_tool.desc=The writing is on the wall... -tooltip.seersigil.desc=When seeing all is not enough -tooltip.sigil_ofelementalaffinity.desc1=Perfect for a fire-breathing fish -tooltip.sigil_ofelementalaffinity.desc2=who is afraid of heights! -tooltip.sigil_ofenderseverance.desc=Put those endermen in a Dire situation! -tooltip.sigil_ofgrowth.desc1=Who needs a green thumb when -tooltip.sigil_ofgrowth.desc2=you have a green slate? -tooltip.sigil_ofhaste.desc=One dose of caffeine later... -tooltip.sigil_ofholding.desc=Used to hold several Sigils! -tooltip.sigil_ofmagnetism.desc=I have a very magnetic personality! -tooltip.sigil_ofsupression.desc=Better than telekinesis -tooltip.sigil_oftheassassin.desc=Time to stay stealthy... -tooltip.sigil_ofthebridge.desc1=Activate to create a bridge -tooltip.sigil_ofthebridge.desc2=beneath your feet. -tooltip.sigil_ofthefastminer.desc=Keep going and going and going... -tooltip.sigil_ofwind.desc=Best not to wear a skirt. -tooltip.sigil.state.activated=Activated -tooltip.sigil.state.deactivated=Deactivated -tooltip.tanksegmenter.desc1=Used to designate which -tooltip.tanksegmenter.desc2=reagents can go into a container -tooltip.telepositionfocus.weak.desc1=An Enderpearl imbued with blood -tooltip.voidsigil.desc=Better than a Swiffer! -tooltip.watersigil.desc=Infinite water, anyone? -tooltip.routingFocus.limit=Limit: -tooltip.routingFocus.desc=A focus used to route items -tooltip.alchemy.usedinincense=Purifying incense used in a crucible - -#Messages -message.altar.capacity=Capacity: %s LP -message.altar.consumptionrate=Consumption Rate: -message.altar.currentessence=Altar's Current Essence: %s LP -message.altar.currenttier=Altar's Current Tier: %s -message.altar.progress=Altar's Progress: -message.altar.inputtank= Input Tank: %s LP -message.altar.outputtank= Output Tank: %s LP -message.altar.hunger=[BM] Your high regeneration rate has caused you to become hungry... -message.attunedcrystal.clearing=Clearing saved container... -message.attunedcrystal.error.cannotfind=Can no longer find linked container. -message.attunedcrystal.error.noconnections=Linked container has no connections remaining! -message.attunedcrystal.error.toofar=Linked container is either too far or is in a different dimension. -message.attunedcrystal.linked=Container is now linked. Transmitting: -message.attunedcrystal.linking=Linking to selected container. -message.attunedcrystal.setto=Attuned Crystal now set to: -message.demon.shallfollow=I shall follow and protect you! -message.demon.willstay=I will stay here for now, Master. -message.destinationclearer.cleared=Destination list now cleared. -message.divinationsigil.amount=Amount: -message.divinationsigil.currentessence=Current Essence: %d LP -message.divinationsigil.reagent=Reagent: %s, Amount: %d -message.masterstone.crystalvibrates=Your crystal vibrates pathetically. -message.masterstone.energyflows=A rush of energy flows through the ritual! -message.masterstone.nothinghappened=Nothing appears to have happened... -message.masterstone.ritualresistyou=The ritual appears to actively resist you! -message.masterstone.somethingstoppedyou=Something stopped you in your tracks... -message.masterstone.youfeelapull=You feel a pull, but you are too weak to push any further. -message.ritual.currentritual=Current Ritual: -message.ritual.side.east=EAST -message.ritual.side.north=NORTH -message.ritual.side.south=SOUTH -message.ritual.side.west=WEST -message.ritualdemonportal.missingjar=A jar on one of the pillars appears to be missing... -message.tanksegmenter.nowhas=Tank now has -message.tanksegmenter.setto=Tank Segmenter now set to: -message.tanksegmenter.tankssetto=tank(s) set to: -message.routerfocus.limit=Focus' Item Limit set to: - -#Achievements -achievement.alchemicalwizardry:firstPrick=Your First Prick! -achievement.alchemicalwizardry:firstPrick.desc=The first drop of life into the Altar... -achievement.alchemicalwizardry:weakOrb=Faintly Glowing Red... -achievement.alchemicalwizardry:weakOrb.desc=This orb will suffice...for now... - -#G-API Downloading -bm.versioning.getGAPI=["[BM] You don't have Guide-API installed! Install it to get it to unlock the book! [",{"text":"Download","color":"red","hoverEvent":{"action":"show_text","value":{"text":"Click this to auto-magically download the latest version","color":"red"}},"clickEvent":{"action":"run_command","value":"/bloodmagic-download-g-api"}},"]"] -bm.versioning.startingDownload=[{"text":"Starting download of %s Please do not remove your hard disk.", "color":"orange"}] -bm.versioning.doneDownloading=Finished downloading %s Reload your game to update. -bm.versioning.error=An error has occurred while downloading the mod! -bm.versioning.downloadedAlready=You have the latest version already, reload your game to update! -bm.versioning.downloadingAlready=It's downloading! Be patient! -bm.versioning.disabled=This feature is disabled. diff --git a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang b/src/main/resources/assets/bloodmagic/lang/fr_FR.lang deleted file mode 100644 index 3493e25d..00000000 --- a/src/main/resources/assets/bloodmagic/lang/fr_FR.lang +++ /dev/null @@ -1,649 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic Tômes d'Améliorations - -#Items -item.bloodmagic.activationCrystal.weak.name=Cristal d'Activation Affaibli -item.bloodmagic.activationCrystal.awakened.name=Cristal d'Activation Éveillé -item.bloodmagic.activationCrystal.creative.name=Cristal d'Activation Créatif - -item.bloodmagic.sacrificialDagger.normal.name=Dague Sacrificielle -item.bloodmagic.sacrificialDagger.creative.name=Dague Sacrificielle Créative -item.bloodmagic.pack.selfSacrifice.name=Sac à dos Sanguin -item.bloodmagic.pack.sacrifice.name=Manteau des Bras -item.bloodmagic.daggerOfSacrifice.name=Dague des Sacrifices - -item.bloodmagic.lavaCrystal.name=Cristal de Lave - -item.bloodmagic.bound.sword.name=Lame Sacrificielle -item.bloodmagic.bound.pickaxe.name=Pioche Sacrificielle -item.bloodmagic.bound.axe.name=Hache Sacrificielle -item.bloodmagic.bound.shovel.name=Pelle Sacrificielle - -item.bloodmagic.bucket.lifeEssence.name=Seau de Vie - -item.bloodmagic.scribe.water.name=Craie d’Inscription Elémentaire: Eau -item.bloodmagic.scribe.fire.name=Craie d’Inscription Elémentaire: Feu -item.bloodmagic.scribe.earth.name=Craie d’Inscription Elémentaire: Terre -item.bloodmagic.scribe.air.name=Craie d’Inscription Elémentaire: Air -item.bloodmagic.scribe.dusk.name=Craie d’Inscription Elémentaire: Crépuscule -item.bloodmagic.scribe.dawn.name=Craie d’Inscription Elémentaire: Aube - -item.bloodmagic.focus.weak.name=Focus de Téléposition -item.bloodmagic.focus.enhanced.name=Focus de Téléposition Amélioré -item.bloodmagic.focus.reinforced.name=Focus de Téléposition Renforcé -item.bloodmagic.focus.demonic.name=Focus de Téléposition Diabolique - -item.bloodmagic.slate.blank.name=Tablette Vierge -item.bloodmagic.slate.reinforced.name=Tablette Renforcée -item.bloodmagic.slate.imbued.name=Tablette Imprégnée -item.bloodmagic.slate.demonic.name=Tablette Diabolique -item.bloodmagic.slate.ethereal.name=Tablette Éthérée - -item.bloodmagic.orb.weak.name=Orbe Sanguinaire Affaiblie -item.bloodmagic.orb.apprentice.name=Orbe Sanguinaire de l’Apprenti -item.bloodmagic.orb.magician.name=Orbe Sanguinaire du Magicien -item.bloodmagic.orb.master.name=Orbe Sanguinaire du Maître -item.bloodmagic.orb.archmage.name=Orbe Sanguinaire de l'Enchanteur -item.bloodmagic.orb.transcendent.name=Orb Sanguinaire Transcendante - -item.bloodmagic.reagent.incendium.name=Incendium -item.bloodmagic.reagent.magicales.name=Magicales -item.bloodmagic.reagent.sanctus.name=Sanctus -item.bloodmagic.reagent.aether.name=Aether -item.bloodmagic.reagent.crepitous.name=Crepitous -item.bloodmagic.reagent.crystallos.name=Crystallos -item.bloodmagic.reagent.terrae.name=Terrae -item.bloodmagic.reagent.aquasalus.name=Aquasalus -item.bloodmagic.reagent.tennebrae.name=Tennebrae -item.bloodmagic.reagent.offensa.name=Offensa -item.bloodmagic.reagent.praesidium.name=Praesidium -item.bloodmagic.reagent.orbisterrae.name=Orbis Terrae -item.bloodmagic.reagent.virtus.name=Virtus -item.bloodmagic.reagent.reductus.name=Reductus -item.bloodmagic.reagent.potentia.name=Potentia - -item.bloodmagic.bloodShard.weak.name=Tesson Sanguin Faible -item.bloodmagic.bloodShard.demon.name=Tesson Sanguin Diabolique - -item.bloodmagic.baseComponent.reagentWater.name=Réactif d'Eau -item.bloodmagic.baseComponent.reagentLava.name=Réactif de Lave -item.bloodmagic.baseComponent.reagentAir.name=Réactif d'Air -item.bloodmagic.baseComponent.reagentFastMiner.name=Réactif Minier -item.bloodmagic.baseComponent.reagentVoid.name=Réactif du Vide -item.bloodmagic.baseComponent.reagentGrowth.name=Réactif de Forestation -item.bloodmagic.baseComponent.reagentAffinity.name=Réactif d'Affinitée Élémentaire -item.bloodmagic.baseComponent.reagentSight.name=Réactif de Vue -item.bloodmagic.baseComponent.reagentBinding.name=Réactif de Sacrifice -item.bloodmagic.baseComponent.reagentSuppression.name=Réactif de Suppression -item.bloodmagic.baseComponent.frameParts.name=Parties des cadres -item.bloodmagic.baseComponent.reagentBloodLight.name=Réactif de Lampe Sanguine -item.bloodmagic.baseComponent.reagentMagnetism.name=Réactif de Magnétisme -item.bloodmagic.baseComponent.reagentHaste.name=Réactif de Célérité -item.bloodmagic.baseComponent.reagentBridge.name=Réactif du Pont Fantôme -item.bloodmagic.baseComponent.reagentCompression.name=Réactif de Compression -item.bloodmagic.baseComponent.reagentSeverance.name=Réactif de Sévérance -item.bloodmagic.baseComponent.reagentHolding.name=Réactif de Possession - -item.bloodmagic.baseComponent.reagentTeleposition.name=Réactif de Téléposition -item.bloodmagic.baseComponent.reagentTransposition.name=Réactif de Transposition - -item.bloodmagic.baseComponent.ironSand.name=Sable de Fer -item.bloodmagic.baseComponent.goldSand.name=Sable d'Or -item.bloodmagic.baseComponent.coalSand.name=Sable de Charbon -item.bloodmagic.baseComponent.plantOil.name=Huile de Plante -item.bloodmagic.baseComponent.sulfur.name=Soufre -item.bloodmagic.baseComponent.saltpeter.name=Salpêtre -item.bloodmagic.baseComponent.neurotoxin.name=Neurotoxine -item.bloodmagic.baseComponent.antiseptic.name=Antiseptique - -item.bloodmagic.cuttingFluid.basicCuttingFluid.name=Fluide Coupant de Base -item.bloodmagic.cuttingFluid.explosive.name=Poudre Explosive - -item.bloodmagic.demonCrystal.crystalDefault.name=Cristal d'une Volonté Diabolique -item.bloodmagic.demonCrystal.crystalCorrosive.name=Cristal d'une Volonté Corrosive -item.bloodmagic.demonCrystal.crystalDestructive.name=Cristal d'une Volonté Destructive -item.bloodmagic.demonCrystal.crystalVengeful.name=Cristal d'une Volonté Vengeresse -item.bloodmagic.demonCrystal.crystalSteadfast.name=Cristal d'une Volonté Inébranlable - -item.bloodmagic.monsterSoul.base.name=Volonté Diabolique - -item.bloodmagic.sigil.air.name=Emblème d'Air -item.bloodmagic.sigil.bloodLight.name=Emblème de la Lampe Sanguine -item.bloodmagic.sigil.compression.name=Emblème de Compression -item.bloodmagic.sigil.divination.name=Emblème des Pythies -item.bloodmagic.sigil.water.name=Emblème d'Eau -item.bloodmagic.sigil.lava.name=Emblème de Lave -item.bloodmagic.sigil.void.name=Emblème du Vide -item.bloodmagic.sigil.greenGrove.name=Emblème de la forestation -item.bloodmagic.sigil.elementalAffinity.name=Emblème de l'Affinité Élémentaire -item.bloodmagic.sigil.haste.name=Emblème de Célérité -item.bloodmagic.sigil.suppression.name=Emblème de Délétion -item.bloodmagic.sigil.magnetism.name=Emblème de Magnétisme -item.bloodmagic.sigil.fastMiner.name=Emblème du Mineur Rapide -item.bloodmagic.sigil.seer.name=Emblème du Voyant -item.bloodmagic.sigil.phantomBridge.name=Emblème du Pont du Fantôme -item.bloodmagic.sigil.whirlwind.name=Emblème de la Tempête -item.bloodmagic.sigil.enderSeverance.name=Emblème de Sévérance de l'Ender -item.bloodmagic.sigil.holding.name=Emblème de Possession -item.bloodmagic.sigil.holding.display=&r%s: &o&n%s -item.bloodmagic.sigil.teleposition.name=Emblème de Téléposition -item.bloodmagic.sigil.transposition.name=Emblème de Transposition - -item.bloodmagic.livingArmour.helmet.name=Casque Vivant -item.bloodmagic.livingArmour.chest.name=Plastron Vivant -item.bloodmagic.livingArmour.legs.name=Jambières Vivantes -item.bloodmagic.livingArmour.boots.name=Bottes Vivantes -item.bloodmagic.sentientArmour.helmet.name=Casque Sentient -item.bloodmagic.sentientArmour.chest.name=Plastron Sentient -item.bloodmagic.sentientArmour.legs.name=Jambières Sentientes -item.bloodmagic.sentientArmour.boots.name=Bottes Sentientes - -item.bloodmagic.altarMaker.name=Créateur d'Autels - -item.bloodmagic.ritualDivinernormal.name=Devineur de Rituels -item.bloodmagic.ritualDivinerdusk.name=Devineur de Rituels [Crépuscule] -item.bloodmagic.ritualDivinerdawn.name=Devineur de Rituels [Aube] -item.bloodmagic.ritualReader.name=Bricoleur de Rituels - -item.bloodmagic.arcaneAshes.name=Cendres Ésotériques -item.bloodmagic.upgradeTome.name=Tablette d'Amélioration d'Armure Vivante -item.bloodmagic.upgradeTrainer.name=Bracelet d'Entrainement d'Armure Vivante - -item.bloodmagic.sentientSword.name=Épée Sentiente -item.bloodmagic.soulGem.petty.name=Faible Gemme Tartrique -item.bloodmagic.soulGem.lesser.name=Simple Gemme Tartrique -item.bloodmagic.soulGem.common.name=Gemme Tartrique Commune -item.bloodmagic.soulGem.greater.name=Gemme Tartrique Complexe -item.bloodmagic.soulGem.grand.name=Gemme Tartrique Puissante -item.bloodmagic.soulSnare.base.name=Piège Rudimentaire -item.bloodmagic.sentientBow.name=Arc Sentient -item.bloodmagic.sentientArmourGem.name=Gemme d'Armure Sentiente -item.bloodmagic.sentientAxe.name=Hâche Sentiente -item.bloodmagic.sentientPickaxe.name=Pioche Sentiente -item.bloodmagic.sentientShovel.name=Pelle Sentiente - -item.bloodmagic.nodeRouter.name=Routeur de Jonction -item.bloodmagic.itemFilter.exact.name=Filtre d'Objets Précis -item.bloodmagic.itemFilter.ignoreNBT.name=Filtre d'Objets par NBT -item.bloodmagic.itemFilter.modItems.name=Filtre d'Objets par Mod -item.bloodmagic.itemFilter.oreDict.name=Filtre d'Objets par le Catalogue de Minerai - -item.bloodmagic.experienceTome.name=Tôme de Peritia -item.bloodmagic.sanguineBook.name=Livre Sanguin - -item.bloodmagic.livingPointUpgrade.draftAngelus.name=Draft d'Angelus - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=Essence de Vie - -tile.bloodmagic.stone.ritual.master.name=Pierre Rituelle Maîtresse -tile.bloodmagic.stone.ritual.imperfect.name=Pierre Rituelle Imparfaite - -tile.bloodmagic.altar.name=Autel de Sang -tile.bloodmagic.alchemyArray.name=Étalage d'Alchimie - -tile.bloodmagic.rune.blank.name=Rune de Sang -tile.bloodmagic.rune.speed.name=Rune de Vitesse -tile.bloodmagic.rune.efficiency.name=Rune d'Efficacité -tile.bloodmagic.rune.sacrifice.name=Rune de Sacrifice -tile.bloodmagic.rune.selfsacrifice.name=Rune de l'Autosacrifice -tile.bloodmagic.rune.displacement.name=Rune de Dislocation -tile.bloodmagic.rune.capacity.name=Rune de Capacité -tile.bloodmagic.rune.augcapacity.name=Rune de Capacité Supérieure -tile.bloodmagic.rune.orb.name=Rune de l'Orbe -tile.bloodmagic.rune.acceleration.name=Rune d'Accélération -tile.bloodmagic.rune.charging.name=Rune de Chargement - - -tile.bloodmagic.ritualStone.blank.name=Pierre Rituelle -tile.bloodmagic.ritualStone.water.name=Pierre Rituelle d'Eau -tile.bloodmagic.ritualStone.fire.name=Pierre Rituelle du Feu -tile.bloodmagic.ritualStone.earth.name=Pierre Rituelle de la Terre -tile.bloodmagic.ritualStone.air.name=Pierre Rituelle de l'Air -tile.bloodmagic.ritualStone.dusk.name=Pierre Rituelle du Crépuscule -tile.bloodmagic.ritualStone.dawn.name=Pierre Rituelle de l'Aube - -tile.bloodmagic.bloodstonebrick.large.name=Brique Large de Roche-Sang -tile.bloodmagic.bloodstonebrick.brick.name=Brique de Roche-Sang -tile.bloodmagic.crystal.large.name=Groupe de Cristaux -tile.bloodmagic.crystal.brick.name=Bloc de Crystal -tile.bloodmagic.bloodLight.name=Lumière Sanguine -tile.bloodmagic.spectralBlock.name=Bloc Spectral -tile.bloodmagic.phantom.name=Bloc Fantôme -tile.bloodmagic.incenseAltar.name=Autel Encens - -tile.bloodmagic.teleposer.name=Téléposeur -tile.bloodmagic.soulForge.name=Hellfire Forge -tile.bloodmagic.alchemyTable.name=Table d'Alchimie -tile.bloodmagic.demonCrucible.name=Creuset Diabolique -tile.bloodmagic.demonPylon.name=Pylône Diabolique -tile.bloodmagic.demonCrystallizer.name=Crystaliseur Diabolique - -tile.bloodmagic.masterRouting.name=NÅ“ud de Routage Maître -tile.bloodmagic.outputRouting.name=NÅ“ud de Routage de Sortie -tile.bloodmagic.inputRouting.name=NÅ“ud de Routage d'Entré -tile.bloodmagic.itemRouting.name=NÅ“ud de Routage - -tile.bloodmagic.path.wood.name=Chemin en Bois -tile.bloodmagic.path.woodtile.name=Chemin en Bois Carrelé -tile.bloodmagic.path.stone.name=Chemin en Pierre -tile.bloodmagic.path.stonetile.name=Chemin en Pierre Carrelée -tile.bloodmagic.path.wornstone.name=Chemin en Pierre Usé -tile.bloodmagic.path.wornstonetile.name=Chemin en Pierre Usé Carrelée -tile.bloodmagic.path.obsidian.name=Chemin en Obsidienne -tile.bloodmagic.path.obsidiantile.name=Chemin en Obsidienne Carrelée - -tile.bloodmagic.dimensionalPortal.name=Portail Dimensionnel -tile.bloodmagic.bloodTank.name=Réservoir de Sang - -tile.bloodmagic.demonCrystal.default.name=Groupe de Cristaux d'une Volonté Diabolique -tile.bloodmagic.demonCrystal.corrosive.name=Groupe de Cristaux d'une Volonté Corrosive -tile.bloodmagic.demonCrystal.destructive.name=Groupe de Cristaux d'une Volonté Destructive -tile.bloodmagic.demonCrystal.vengeful.name=Groupe de Cristaux d'une Volonté Vengeresse -tile.bloodmagic.demonCrystal.steadfast.name=Groupe de Cristaux d'une Volonté Inébranlable - -# Fluids -fluid.lifeEssence=Essence de Vie - -#Tooltips -tooltip.bloodmagic.extraInfo=&9-Tenir shift pour plus d'info- - -tooltip.bloodmagic.orb.desc=Stock d'essence de vie crue -tooltip.bloodmagic.orb.owner=Added by: %s -tooltip.bloodmagic.currentOwner=Propriétaire actuel: %s -tooltip.bloodmagic.currentTier=Niveau actuel: %d -tooltip.bloodmagic.config.disabled=Désactivée dans cet insant dans le ficher de Config - -tooltip.bloodmagic.activated=Activé -tooltip.bloodmagic.deactivated=Désactivé - -tooltip.bloodmagic.sigil.air.desc=&oJe me sens plus léger déjà... -tooltip.bloodmagic.sigil.bloodLight.desc=&oJe vois une lumière! -tooltip.bloodmagic.sigil.compression.desc=&oMains en Diamants -tooltip.bloodmagic.sigil.divination.desc=&oDévisager l'âme -tooltip.bloodmagic.sigil.divination.otherNetwork=Dévisager l'âme de %s -tooltip.bloodmagic.sigil.divination.currentAltarTier=Niveau Actuel: %d -tooltip.bloodmagic.sigil.divination.currentEssence=Essence Actuel: %d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=Capacité Actuelle: %d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=Tranquillité Actuelle: %d -tooltip.bloodmagic.sigil.divination.currentBonus=Bonus Actuel: +%d%% -tooltip.bloodmagic.sigil.water.desc=&oUne infinité d'eau, personne? -tooltip.bloodmagic.sigil.lava.desc=&oCHAUD! NE LE MANGEZ PAS -tooltip.bloodmagic.sigil.void.desc=&oMieux que Swiffer®! -tooltip.bloodmagic.sigil.greenGrove.desc=&oÉcologique -tooltip.bloodmagic.sigil.magnetism.desc=&oJ'ai une personnalité très attirante -tooltip.bloodmagic.sigil.suppression.desc=&oMieux que la télékinésie... -tooltip.bloodmagic.sigil.haste.desc=&o42 doses de caféine plus tard... -tooltip.bloodmagic.sigil.fastMiner.desc=&oContinue à miner, à miner... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oDes poissons enflamées qui tombent! -tooltip.bloodmagic.sigil.seer.desc=&oQuand voir tout n'est pas suffisant -tooltip.bloodmagic.sigil.seer.currentAltarProgress=Progrès Actuel: %d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=Progrès Actuel: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=Vitesse de consomation: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=Niveau Actuel: %d -tooltip.bloodmagic.sigil.seer.currentEssence=Essence Actuelle: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=Capacité Actuelle: %d LP -tooltip.bloodmagic.sigil.seer.currentCharge=Charge Actuelle: %d -tooltip.bloodmagic.sigil.seer.currentTranquility=Tranquillité Actuelle: %d -tooltip.bloodmagic.sigil.seer.currentBonus=Bonus Actuel: +%d%% -tooltip.bloodmagic.sigil.phantomBridge.desc=&oMarcher sur de l'air fin... -tooltip.bloodmagic.sigil.whirlwind.desc=&oMieux de ne pas porter une jupe -tooltip.bloodmagic.sigil.enderSeverance.desc=&oMettre les Endermen dans des situations terribles! -tooltip.bloodmagic.sigil.teleposition.desc=Je suis très proche d'ètre transporté comme ça. -tooltip.bloodmagic.sigil.transposition.desc=Sens le pouvoir de la force, mon jeune apprenti. -tooltip.bloodmagic.sigil.holding.desc=Sigil-ception -tooltip.bloodmagic.sigil.holding.sigilInSlot=Slot %d: %s - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=Augmente le maxium de points de l'Armure Vivante à %d. - -tooltip.bloodmagic.bound.sword.desc=&oBattre le faible -tooltip.bloodmagic.bound.pickaxe.desc=&oDétruir les pierres sans pitié -tooltip.bloodmagic.bound.axe.desc=&oDéforestation diabolique -tooltip.bloodmagic.bound.shovel.desc=&oEffacer la terre du sol - -tooltip.bloodmagic.sacrificialDagger.desc=Juste une pîqure du doigt va suffir... -tooltip.bloodmagic.sacrificialDagger.creative=Faites un clic-droit sur un autel en appuyant sur le bouton 'sneak' pour le remplir -tooltip.bloodmagic.slate.desc=Pierre infusée dans un Autel de Sang -tooltip.bloodmagic.inscriber.desc=L'écriture est sur le mur... - -tooltip.bloodmagic.pack.selfSacrifice.desc=Ce sac à dos me frictionne vraiment... -tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=Stored: %d LP - -tooltip.bloodmagic.activationCrystal.weak=Actionne les rituels d'un Bas Niveau -tooltip.bloodmagic.activationCrystal.awakened=Actionne des rituels plus puissants -tooltip.bloodmagic.activationCrystal.creative=Creative Seulement - Actionne tout les rituels - -tooltip.bloodmagic.diviner.currentRitual=Rituel Courant: -tooltip.bloodmagic.diviner.blankRune=Runes Vierge: %d -tooltip.bloodmagic.diviner.waterRune=Runes d'Eau: %d -tooltip.bloodmagic.diviner.airRune=Runes d'Air: %d -tooltip.bloodmagic.diviner.fireRune=Runes de Feu: %d -tooltip.bloodmagic.diviner.earthRune=Runes de Terre: %d -tooltip.bloodmagic.diviner.duskRune=Runes de Cépuscule: %d -tooltip.bloodmagic.diviner.dawnRune=Runes d'Aube: %d -tooltip.bloodmagic.diviner.totalRune=Runes Totales: %d -tooltip.bloodmagic.diviner.extraInfo=Appuyer sur shift pour encore plus d'info -tooltip.bloodmagic.diviner.currentDirection=Directon Courante: %s - -tooltip.bloodmagic.ritualReader.currentState=Mode Courant: %s -tooltip.bloodmagic.ritualReader.set_area=Endroit Déterminé -tooltip.bloodmagic.ritualReader.information=Information -tooltip.bloodmagic.ritualReader.set_will_types=Choisir la volonté consommée -tooltip.bloodmagic.ritualReader.desc.set_area=Clic-droit sur une Pierre Rituelle Maîtresse pour cycler l'endroit de la rituelle que vous vouleiz modifier. Ensuite, cliquez les deux coins du nouveaux endroit que vous vouliez. -tooltip.bloodmagic.ritualReader.desc.information=Clic-droit sur une Pierre Rituelle Maîtresse pour receuillir des informations basics sur le rituel. -tooltip.bloodmagic.ritualReader.desc.set_will_types=Donnez les types de volonté diabolique que le rituel va consommer de l'aura par un Clic-Droit sur la PRM avec le même type de crystal dans votre bar chaude. - -tooltip.bloodmagic.arcaneAshes=Cendres sont utilisées pour dessiner un cercle d'alchimie - -tooltip.bloodmagic.telepositionFocus.coords=Coodornées courantes: (%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=Dimension ID: %d -tooltip.bloodmagic.telepositionFocus.weak=Utilisé pour déplacer les blocs dans le monde -tooltip.bloodmagic.telepositionFocus.enhanced=Utilisé pour déplacer les blocs dans le monde -tooltip.bloodmagic.telepositionFocus.reinforced=Utilisé pour déplacer les blocs dans le monde -tooltip.bloodmagic.telepositionFocus.demonic=Utilisé pour déplacer les blocs dans le monde - -tooltip.bloodmagic.livingArmour.upgrade.speed=Pieds Rapides -tooltip.bloodmagic.livingArmour.upgrade.digging=Puissance des Nains -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=Résistance au Poison -tooltip.bloodmagic.livingArmour.upgrade.fireResist=Cadeau d'Ignis -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=Paumes Dures -tooltip.bloodmagic.livingArmour.upgrade.knockback=Culturiste -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=Peau Dure -tooltip.bloodmagic.livingArmour.upgrade.health=Sain -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Coup Féroce -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Tir Acrobatique -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Marche Assistée -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=Sprint de la Faucheuse -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=Solar Powered -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=Runic Shielding -tooltip.bloodmagic.livingArmour.upgrade.revealing=Revealing -tooltip.bloodmagic.livingArmour.upgrade.experienced=Experienced -tooltip.bloodmagic.livingArmour.upgrade.jump=Strong Legs -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=Soft Fall -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=Grave Digger -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=Charging Strike -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=True Strike -tooltip.bloodmagic.livingArmour.upgrade.elytra=Elytra -tooltip.bloodmagic.livingArmour.upgrade.slowness=Limp Leg -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=Crippled Arm -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Level %d) -tooltip.bloodmagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s - -tooltip.bloodmagic.will=Will Quality: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientAxe.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientPickaxe.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.sentientShovel.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.soulGem.petty=A gem used to contain a little will -tooltip.bloodmagic.soulGem.lesser=A gem used to contain some will -tooltip.bloodmagic.soulGem.common=A gem used to contain more will -tooltip.bloodmagic.soulGem.greater=A gem used to contain a greater amount of will -tooltip.bloodmagic.soulGem.grand=A gem used to contain a large amount of will -tooltip.bloodmagic.soulSnare.desc=Throw at a monster and then kill them to obtain their demonic will - -tooltip.bloodmagic.itemFilter.exact=S'assure que les objets se ressemblent exactement -tooltip.bloodmagic.itemFilter.ignoreNBT=Ignore le NBT du filtre -tooltip.bloodmagic.itemFilter.modItems=Assortis les objets du même mod -tooltip.bloodmagic.itemFilter.oreDict=Used to filter through the Ore Dictionary - -tooltip.bloodmagic.fluid.type=Fluid Contained -tooltip.bloodmagic.fluid.amount=Amount -tooltip.bloodmagic.fluid.capacity=Capacity - -tooltip.bloodmagic.ghost.everything=Everything -tooltip.bloodmagic.ghost.amount=Ghost item amount: %d - -tooltip.bloodmagic.currentType.default=Contient: Volonté Crue -tooltip.bloodmagic.currentType.corrosive=Contient: Volonté Corrosive -tooltip.bloodmagic.currentType.destructive=Contient: Volonté Destructive -tooltip.bloodmagic.currentType.vengeful=Contient: Volonté Vengeresse -tooltip.bloodmagic.currentType.steadfast=Contient: Volonté Inébranlable - -tooltip.bloodmagic.experienceTome=A book used to store experience -tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=Level: %d - -tooltip.bloodmagic.decoration.safe=Safe for decoration -tooltip.bloodmagic.decoration.notSafe=Dangerous for decoration - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d uses remaining - -tooltip.bloodmagic.book.shifting=These symbols seem to be... &oshifting... - -# Ritual -ritual.bloodmagic.blockRange.tooBig=The block range given is too big! Needs to be at most %s blocks. -ritual.bloodmagic.blockRange.tooFar=The block range given is too far! Needs to be within a vertical range of %s blocks and a horizontal range of %s blocks. -ritual.bloodmagic.blockRange.inactive=The ritual stone is currently inactive, and cannot have its range modified. -ritual.bloodmagic.blockRange.noRange=The range was not properly chosen. -ritual.bloodmagic.blockRange.firstBlock=First block for new range stored. -ritual.bloodmagic.blockRange.success=New range successfully set! - -ritual.bloodmagic.testRitual=Test Ritual -ritual.bloodmagic.waterRitual=Ritual of the Full Spring -ritual.bloodmagic.lavaRitual=Serenade of the Nether -ritual.bloodmagic.greenGroveRitual=Ritual of the Green Grove -ritual.bloodmagic.jumpRitual=Ritual of the High Jump -ritual.bloodmagic.wellOfSufferingRitual=Well of Suffering -ritual.bloodmagic.featheredKnifeRitual=Ritual of the Feathered Knife -ritual.bloodmagic.regenerationRitual=Ritual of Regeneration -ritual.bloodmagic.harvestRitual=Reap of the Harvest Moon -ritual.bloodmagic.magneticRitual=Ritual of Magnetism -ritual.bloodmagic.crushingRitual=Ritual of the Crusher -ritual.bloodmagic.fullStomachRitual=Ritual of the Satiated Stomach -ritual.bloodmagic.interdictionRitual=Ritual of Interdiction -ritual.bloodmagic.containmentRitual=Ritual of Containment -ritual.bloodmagic.speedRitual=Ritual of Speed -ritual.bloodmagic.suppressionRitual=Ritual of Suppression -ritual.bloodmagic.expulsionRitual=Aura of Expulsion -ritual.bloodmagic.zephyrRitual=Call of the Zephyr -ritual.bloodmagic.upgradeRemoveRitual=Sound of the Cleansing Soul -ritual.bloodmagic.armourEvolveRitual=Ritual of Living Evolution -ritual.bloodmagic.animalGrowthRitual=Ritual of the Shepherd -ritual.bloodmagic.forsakenSoulRitual=Gathering of the Forsaken Souls -ritual.bloodmagic.crystalHarvestRitual=Crack of the Fractured Crystal - -ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius -ritual.bloodmagic.placerRitual=Laying of the Filler -ritual.bloodmagic.fellingRitual=Crash of the Timberman -ritual.bloodmagic.pumpRitual=Hymn of Siphoning -ritual.bloodmagic.altarBuilderRitual=The Assembly of the High Altar -ritual.bloodmagic.portalRitual=The Gate of the Fold - - -ritual.bloodmagic.waterRitual.info=Generates a source of water from the master ritual stone. -ritual.bloodmagic.lavaRitual.info=Generates a source of lava from the master ritual stone. -ritual.bloodmagic.greenGroveRitual.info=Grows crops within its area. -ritual.bloodmagic.jumpRitual.info=Causes entities to leap up into the air. -ritual.bloodmagic.wellOfSufferingRitual.info=Attacks mobs within its damage zone and puts the LP into a nearby blood altar. -ritual.bloodmagic.featheredKnifeRitual.info=Drains health from players in its area and puts the LP into a nearby blood altar. -ritual.bloodmagic.regenerationRitual.info=Casts regeneration on entities within its range if they are missing health. -ritual.bloodmagic.harvestRitual.info=Harvests plants within its range, dropping the results on the ground. -ritual.bloodmagic.magneticRitual.info=Pulls up ores from the ground and puts them into its placement range. -ritual.bloodmagic.crushingRitual.info=Breaks blocks within its crushing range and places the items into the linked chest. -ritual.bloodmagic.fullStomachRitual.info=Takes food from the linked chest and fills the player's saturation with it. -ritual.bloodmagic.interdictionRitual.info=Pushes all mobs within its area away from the master ritual stone. -ritual.bloodmagic.containmentRitual.info=Pulls all mobs within its area towards the master ritual stone. -ritual.bloodmagic.speedRitual.info=Launches players within its range in the direction of the ritual. -ritual.bloodmagic.suppressionRitual.info=Suppresses fluids within its range - deactivating the ritual returns the fluids back to the world. -ritual.bloodmagic.expulsionRitual.info=Expels players from its range that are neither the owner nor have a bound blood orb in the chest on top of the master ritual stone. -ritual.bloodmagic.zephyrRitual.info=Picks up items within its range and places them into the linked chest. -ritual.bloodmagic.upgradeRemoveRitual.info=Undocumented. -ritual.bloodmagic.armourEvolveRitual.info=Undocumented. -ritual.bloodmagic.animalGrowthRitual.info=Increases the maturity rate of baby animals within its range. -ritual.bloodmagic.forsakenSoulRitual.info=Damages mobs within its damage range and when the mob dies a demon crystal within its crystal range will be grown. -ritual.bloodmagic.crystalHarvestRitual.info=Breaks Demon Will crystal clusters within its range, dropping the results on top of the crystals. - -ritual.bloodmagic.placerRitual.info=Grabs blocks that are inside of the connected inventory and places them into the world. -ritual.bloodmagic.fellingRitual.info=A standard tree-cutting machine, this ritual will cut down all trees and leaves within its area and collect the drops. -ritual.bloodmagic.pumpRitual.info=Looks around the world and grabs fluids from the defined area. Will only remove and put the fluid into the connected tank if the tank has at least a bucket's worth of the same fluid. -ritual.bloodmagic.altarBuilderRitual.info=Builds an altar out of the components inside of the connected inventory. -ritual.bloodmagic.portalRitual.info=Creates a portal network based on the activator and the immediately surrounding blocks. Blocks can be changed after activation without changing the network of portals, and portals with the same "key" will link together. - -ritual.bloodmagic.waterRitual.waterRange.info=(Water) The area that the ritual will place water source blocks. -ritual.bloodmagic.lavaRitual.lavaRange.info=(Lava) The area that the ritual will place lava source blocks. -ritual.bloodmagic.greenGroveRitual.growing.info=(Growth) The area that the ritual will grow plants in. -ritual.bloodmagic.jumpRitual.jumpRange.info=(Jumping) Entities in this range will be launched in the air. -ritual.bloodmagic.wellOfSufferingRitual.altar.info=(Altar) This range defines the area that the ritual searches for the blood altar. Changing this will either expand or limit the range to a certain region. -ritual.bloodmagic.wellOfSufferingRitual.damage.info=(Damage) This defines where the ritual will damage a mob. All mobs inside of this range (except for players) will receive damage over time. -ritual.bloodmagic.featheredKnifeRitual.altar.info=(Altar) This range defines the area that the ritual searches for the blood altar. Changing this will either expand or limit the range to a certain region. -ritual.bloodmagic.featheredKnifeRitual.damage.info=(Damage) This defines where the ritual will damage a player. Players inside of this range will receive damage over time up to the specified limit. -ritual.bloodmagic.regenerationRitual.heal.info=(Healing) Mobs within this range will receive a regeneration buff. -ritual.bloodmagic.harvestRitual.harvestRange.info=(Harvesting) Plants within this range will be harvested. -ritual.bloodmagic.magneticRitual.placementRange.info=(Placement) The range that the ritual will place the grabbed ores into. -ritual.bloodmagic.crushingRitual.crushingRange.info=(Crushing) The blocks that the ritual will break. -ritual.bloodmagic.crushingRitual.chest.info=(Chest) The location of the inventory that the ritual will place the broken blocks into. -ritual.bloodmagic.fullStomachRitual.fillRange.info=(Feeding) The range that the ritual will look at to feed players. -ritual.bloodmagic.fullStomachRitual.chest.info=(Chest) The location of the inventory that the ritual will grab food from to feed players in range. -ritual.bloodmagic.interdictionRitual.interdictionRange.info=(Push) The area of the ritual where mobs will be pushed. All mobs are pushed away from the master ritual stone, regardless of where this area is. -ritual.bloodmagic.containmentRitual.containmentRange.info=(Containment) The area of the ritual where mobs will be pulled. All mobs are pulled towards the master ritual stone, regardless of where this area is. -ritual.bloodmagic.speedRitual.sanicRange.info=(Speed) All entities within this area are launched in the direction of the arrow formed by the ritual. -ritual.bloodmagic.suppressionRitual.suppressionRange.info=(Suppress) All liquids within the range are suppressed. -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(Expulsion) -ritual.bloodmagic.zephyrRitual.zephyrRange.info=(Suction) Items within this range will be sucked into the linked chest. -ritual.bloodmagic.zephyrRitual.chest.info=(Chest) The location of the inventory that the ritual will place the picked up items into. -ritual.bloodmagic.animalGrowthRitual.growing.info=(Growth) Animals within this range will grow much faster. -ritual.bloodmagic.forsakenSoulRitual.crystal.info=(Crystal) Demon Crystals in this range receive an increase in growth speed when a mob is killed by the ritual. -ritual.bloodmagic.forsakenSoulRitual.damage.info=(Damage) Mobs within this range will be slowly damaged, and when killed will grow the crystals. -ritual.bloodmagic.crystalHarvestRitual.crystal.info=(Crystal) All Demon Will crystal clusters have a single crystal broken off, spawning the crystal into the world. If there is only one crystal on the cluster, it will not break it. - -ritual.bloodmagic.placerRitual.placerRange.info=(Placement) The range that the ritual will place its blocks in. -ritual.bloodmagic.placerRitual.chest.info=(Chest) The location of the inventory that the ritual will grab blocks from to place in the world. -ritual.bloodmagic.fellingRitual.fellingRange.info=(Cutting) The range that the ritual will search out logs and leaves in order to cut down. -ritual.bloodmagic.fellingRitual.chest.info=(Chest) The location of the inventory that the ritual will place the results into. -ritual.bloodmagic.pumpRitual.pumpRange.info=(Pump) The region that the ritual will look for fluids to grab from the world. - -# Chat -chat.bloodmagic.altarMaker.setTier=Set Tier to: %d -chat.bloodmagic.altarMaker.building=Building a Tier %d Altar -chat.bloodmagic.altarMaker.destroy=Destroyed a Tier %d Altar -chat.bloodmagic.altarMaker.creativeOnly=This is a creative only item. - -chat.bloodmagic.damageSource=%s's soul became too weak - -chat.bloodmagic.ritual.weak=You feel a push, but are too weak to perform this ritual. -chat.bloodmagic.ritual.prevent=The ritual is actively resisting you! -chat.bloodmagic.ritual.activate=A rush of energy flows through the ritual! -chat.bloodmagic.ritual.notValid=You feel that these runes are not configured correctly... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=You are starting to feel better already! -chat.bloodmagic.livingArmour.upgrade.fireRemove=&6A cool feeling envelopes you as the burning subsides. -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6A shadowy force pulls you from the brink of death! -chat.bloodmagic.livingArmour.newUpgrade=&4Upgrade acquired! - -chat.bloodmagic.routing.remove=Removing contained location -chat.bloodmagic.routing.set=Setting node location -chat.bloodmagic.routing.link.master=Linked node to master! -chat.bloodmagic.routing.link=Linked nodes together - -chat.bloodmagic.altar.comp.glowstone=a block of glowstone -chat.bloodmagic.altar.comp.bloodstone=a large bloodstone brick -chat.bloodmagic.altar.comp.beacon=a beacon -chat.bloodmagic.altar.comp.bloodrune=a blood rune -chat.bloodmagic.altar.comp.crystal=an unimplemented item -chat.bloodmagic.altar.comp.notair=a solid block - -chat.bloodmagic.altar.nextTier=The next tier of blood altar is missing %s at %s. - -# sekrit - -secret.bloodmagic.bread.bloody=&r&cBloody Bread -secret.bloodmagic.bread.bloody.desc=Only for &odire &r&7emergencies. - -# Commands -commands.bloodmagic.error.arg.invalid=Invalid arguments -commands.bloodmagic.error.arg.missing=Not enough arguments -commands.bloodmagic.error.arg.player.missing=You must specify which player you wish to perform this action on. -commands.bloodmagic.error.404=Command not found! -commands.bloodmagic.error.unknown=Unknown command! -commands.bloodmagic.error.perm=You do not have permission to use this command. - -commands.bloodmagic.success=Executed successfully - -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help=Displays the help information for the "/bloodmagic" command. - -commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] player [amount] -commands.bloodmagic.network.help=LP network utilities -commands.bloodmagic.network.syphon.help=Removes the given amount of LP from the given player's LP network. -commands.bloodmagic.network.syphon.success=Successfully syphoned %d LP from %s. -commands.bloodmagic.network.add.help=Adds the given amount of LP to the given player's LP network. Follows standard LP gain rules. -commands.bloodmagic.network.add.success=Successfully added %d LP to %s's LP network. -commands.bloodmagic.network.set.help=Sets the given player's LP to the given amount. -commands.bloodmagic.network.set.success=Successfully set %s's LP network to %d LP. -commands.bloodmagic.network.get.help=Returns the amount of LP in the given player's LP network. -commands.bloodmagic.network.fill.help=Fills the given player's LP network to %d. -commands.bloodmagic.network.fill.success=Successfully filled %s's LP network. -commands.bloodmagic.network.cap.help=Fills the given player's LP network to the max that their highest Blood Orb can store. -commands.bloodmagic.network.cap.success=Successfully capped off %s's LP network. - -commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [player] -commands.bloodmagic.bind.help=Attempts to (un)bind the currently held item. -commands.bloodmagic.bind.success=Binding successful -commands.bloodmagic.bind.remove.success=Unbinding successful - -commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] player [tier] -commands.bloodmagic.orb.help=Used to set or get the Player's max Blood Orb tier. - -commands.bloodmagic.bind.usage=/bind -commands.bloodmagic.bind.success=Item successfully bound! -commands.bloodmagic.bind.failed.noPlayer=There is no player specified -commands.bloodmagic.bind.failed.alreadyBound=Item is already bound; use /unbind to unbind it -commands.bloodmagic.bind.failed.notBindable=Item cannot be bound -commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=Item successfully unbound! -commands.bloodmagic.unbind.failed.notBindable=Item cannot be unbound -commands.bloodmagic.soulnetwork.usage=/soulnetwork [amount] -commands.bloodmagic.soulnetwork.add.success=Successfully added %dLP to %s's Soul Network! -commands.bloodmagic.soulnetwork.subtract.success=Successfully subtracted %dLP from %s's Soul Network! -commands.bloodmagic.soulnetwork.fill.success=Successfully filled %s's Soul Network! -commands.bloodmagic.soulnetwork.empty.success=Successfully emptied %s's Soul Network! -commands.bloodmagic.soulnetwork.get.success=There is %dLP in %s's Soul Network! -commands.bloodmagic.soulnetwork.noPlayer=There is no player specified -commands.bloodmagic.soulnetwork.noCommand=There is no command specified -commands.bloodmagic.soulnetwork.notACommand=That is not a valid command -commands.bloodmagic.soulnetwork.fillMax.success=Successfully filled %s's Soul Network to their orb max! -commands.bloodmagic.soulnetwork.create.success=Successfully created %s's Soul Network (Orb tier: %d) - -# Keybinds -bloodmagic.keybind.openSigilHolding=Open Sigil of Holding - -# JustEnoughItems -jei.bloodmagic.recipe.altar=Blood Altar -jei.bloodmagic.recipe.binding=Alchemy Array (Binding) -jei.bloodmagic.recipe.alchemyArrayCrafting=Alchemy Array -jei.bloodmagic.recipe.soulForge=Hellfire Forge -jei.bloodmagic.recipe.alchemyTable=Alchemy Table -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=Tier: %d -jei.bloodmagic.recipe.consumptionRate=Consumption: %d LP/t -jei.bloodmagic.recipe.drainRate=Drain: %d LP/t -jei.bloodmagic.recipe.minimumSouls=Minimum: %1$,.2f Will -jei.bloodmagic.recipe.soulsDrained=Drained: %1$,.2f Will -jei.bloodmagic.recipe.lpDrained=Drained: %,d LP -jei.bloodmagic.recipe.ticksRequired=Time: %,d Ticks - -jei.bloodmagic.desc.altarBuilder=A creative-only item for use in debugging and testing.\n\nShift + Right click to change the tier to build. Right click an Altar to initiate the build.\n\nBreak an Altar while holding to dismantle it. -jei.bloodmagic.desc.demonicWill=An imprint of a demonic entity attached to a creature.\n\nCan be obtained by killing a mob with a sentient weapon or by throwing a snare at a mob and killing it while it has white particles. - -# WAILA -waila.bloodmagic.sneak=&oSneak for Information -waila.bloodmagic.array.reagent=Reagent: %s -waila.bloodmagic.array.catalyst=Catalyst: %s -option.bloodmagic.bypassSneak=Bypass Sneak -option.bloodmagic.bloodAltar=Blood Altar -option.bloodmagic.ritualController=Ritual Stones -option.bloodmagic.teleposer=Teleposer -option.bloodmagic.array=Alchemy Array - -# Thaumcraft -tc.research_category.BLOODMAGIC=Sanguine Arcana - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=Blood Magic -bloodmagic.research_text.BLOODMAGIC=Sanguine Arcana -bloodmagic.research_page.BLOODMAGIC.1=The realm of the Blood Magics has always appeared to be a more solitary and "individual" art with blood mages being notoriously reclusive and a bit insane at times. However, the powers of self-sacrifice and life essence have uses even beyond a normal blood mage's sight, in fact, it is quite apparent that it may have some uses in thaumaturgy after all! diff --git a/src/main/resources/assets/bloodmagic/lang/it_IT.lang b/src/main/resources/assets/bloodmagic/lang/it_IT.lang deleted file mode 100644 index 265b4275..00000000 --- a/src/main/resources/assets/bloodmagic/lang/it_IT.lang +++ /dev/null @@ -1,181 +0,0 @@ -#Block Localization -tile.bloodAltar.name=Altare del Sangue -tile.bloodRune.blank.name=Runa del Sangue -tile.bloodRune.fill.name=Runa di Capacità Aumentata -tile.bloodRune.empty.name=Runa di Dislocazione -tile.bloodRune.test.name=Runa del Globo -tile.speedRune.name=Runa di Velocità -tile.efficiencyRune.name=Runa di Efficienza -tile.runeOfSacrifice.name=Runa del Sacrificio -tile.runeOfSelfSacrifice.name=Runa di Auto-Sacrificio -tile.ritualStone.name=Pietra del Rituale -tile.blockMasterStone.name=Pietra Maestra del Rituale -tile.bloodSocket.name=Cavità Piena -tile.imperfectRitualStone.name=Pietra del Rituale Imperfetta -tile.armourForge.name=Forgia delle Armature dell'Anima -tile.emptySocket.name=Cavità Vuota -tile.bloodStoneBrick.name=Mattone di Pietra del Sangue -tile.largeBloodStoneBrick.name=Gran Mattone di Pietra del Sangue -tile.blockWritingTable.name=Set da Alchimista -tile.blockHomHeart.name=Tavolo della Magia -tile.bloodPedestal.name=Piedistallo Arcano -tile.bloodPlinth.name=Basamento Arcano -tile.bloodTeleposer.name=Teleposer -tile.blockConduit.name=Condotto di Magia -tile.blockSpellParadigm.projectile.name=Generatore di Particelle -tile.blockSpellParadigm.self.name=Auto-Miglioratore -tile.blockSpellParadigm.melee.name=Aggregatore di Mischia -tile.blockSpellEnhancement.power1.name=Potenziatore Instabile di Magia -tile.blockSpellEnhancement.power2.name=Potenziatore Standard di Magia -tile.blockSpellEnhancement.power3.name=Potenziatore Rinforzato di Magia -tile.blockSpellEnhancement.power4.name=Potenziatore Invaso di Magia -tile.blockSpellEnhancement.power5.name=Potenziatore Demoniaco di Magia -tile.blockSpellEnhancement.cost1.name=Smorzatore Instabile di Magia -tile.blockSpellEnhancement.cost2.name=Smorzatore Standard di Magia -tile.blockSpellEnhancement.cost3.name=Smorzatore Rinforzato di Magia -tile.blockSpellEnhancement.cost4.name=Smorzatore Invaso di Magia -tile.blockSpellEnhancement.cost5.name=Smorzatore Demoniaco di Magia -tile.blockSpellEnhancement.potency1.name=Miglioratore Instabile di Magia -tile.blockSpellEnhancement.potency2.name=Miglioratore Standard di Magia -tile.blockSpellEnhancement.potency3.name=Miglioratore Rinforzato di Magia -tile.blockSpellEnhancement.potency4.name=Miglioratore Invaso di Magia -tile.blockSpellEnhancement.potency5.name=Miglioratore Demoniaco di Magia -tile.blockSpellModifier.default.name=Modificatore di Magia -tile.blockSpellModifier.offensive.name=Modificatore di Magia Offensiva -tile.blockSpellModifier.defensive.name=Modificatore di Magia Difensiva -tile.blockSpellModifier.environmental.name=Modificatore di Magia Ambientale -tile.blockSpellEffect.fire.name=Crogiolo del Fuoco -tile.blockSpellEffect.ice.name=Creatore di Ghiaccio -tile.blockSpellEffect.wind.name=Generatore del Vento -tile.blockSpellEffect.earth.name=Formatore della Terra - -#Item Localization -item.weakBloodOrb.name=Globo di Sangue Debole -item.apprenticeBloodOrb.name=Globo di Sangue dell'Apprendista -item.magicianBloodOrb.name=Globo di Sangue del Mago -item.masterBloodOrb.name=Globo di Sangue del Maestro -item.archmageBloodOrb.name=Globo di Sangue dell'Arcimago -item.energyBlast.name=Blaster Energetico -item.energySword.name=Lama Legata -item.lavaCrystal.name=Cristallo Lavico -item.waterSigil.name=Sigillo dell'Acqua -item.lavaSigil.name=Sigillo di Lava -item.voidSigil.name=Sigillo del Vuoto -item.blankSlate.name=Ardesia Bianca -item.reinforcedSlate.name=Ardesia Rinforzata -item.sacrificialDagger.name=Pugnale Sacrificale -item.daggerOfSacrifice.name=Daga Sacrificale -item.airSigil.name=Sigillo dell'Aria -item.sigilOfTheFastMiner.name=Sigillo del Rapido Minatore -item.sigilOfElementalAffinity.name=Sigillo di Affinità Elementale -item.sigilOfHaste.name=Sigillo di Rapidità -item.sigilOfHolding.name=Sigillo della Tenacia Egoista -item.divinationSigil.name=Sigillo di Divinatione -item.waterScribeTool.name=Utensile d'Iscrizione Elementale: Acqua -item.fireScribeTool.name=Utensile d'Iscrizione Elementale: Fuoco -item.earthScribeTool.name=Utensile d'Iscrizione Elementale: Terra -item.airScribeTool.name=Utensile d'Iscrizione Elementale: Aria -item.duskScribeTool.name=Utensile d'Iscrizione Elementale: Crepuscolo -item.activationCrystalWeak.name=Cristallo d'Attivazione Debole -item.activationCrystalAwakened.name=Cristallo d'Attivazione Risvegliato -item.boundPickaxe.name=Piccone Vincolato -item.boundAxe.name=Ascia Vincolata -item.boundShovel.name=Vanga Vincolata -item.boundHelmet.name=Elmo Vincolato -item.boundPlate.name=Piastra Vincolata -item.boundLeggings.name=Gambali Vincolati -item.boundBoots.name=Stivali Vincolati -item.weakBloodShard.name=Scheggia di Sangue Debole -item.growthSigil.name=Sigillo del Verde Bosco -item.blankSpell.name=Cristallo non Vincolato -item.alchemyFlask.name=Boccetta per Pozione -item.standardBindingAgent.name=Agente Vincolante Standard -item.mundanePowerCatalyst.name=Catalizzatore Comune di Potere -item.averagePowerCatalyst.name=Catalizzatore Medio di Potere -item.greaterPowerCatalyst.name=Catalizzatore Maggiore di Potere -item.mundaneLengtheningCatalyst.name=Catalizzatore Procastinante Comune -item.averageLengtheningCatalyst.name=Catalizzatore Procastinante Medio -item.greaterLengtheningCatalyst.name=Catalizzatore Procastinante Maggiore -item.incendium.name=Incendium -item.magicales.name=Magicales -item.sanctus.name=Sanctus -item.aether.name=Etere -item.simpleCatalyst.name=Catalizzatore Semplice -item.crepitous.name=Crepitous -item.crystallos.name=Crystallos -item.terrae.name=Terrae -item.aquasalus.name=Aquasalus -item.tennebrae.name=Tenebrae -item.demonBloodShard.name=Scheggia di Sangue di Demone -item.sigilOfWind.name=Sigillo del Vortice -item.telepositionFocus.name=Focus di Teleposizione -item.enhancedTelepositionFocus.name=Focus Migliorato di Teleposizione -item.reinforcedTelepositionFocus.name=Focus Rinforzato di Teleposizione -item.demonicTelepositionFocus.name=Focus Demoniaco di Teleposizione -item.imbuedSlate.name=Piastra Invasa -item.demonicSlate.name=Piastra Demoniaca -item.sigilOfTheBridge.name=Sigillo del POnte Spettrale -item.armourInhibitor.name=Inibitore di Armatura -item.cheatyItem.name=Globo di Prova -item.weakFillingAgent.name=Agente Riempiente Debole -item.standardFillingAgent.name=Agente Riempiente Standard -item.enhancedFillingAgent.name=Agente Riempiente Potenziato -item.weakBindingAgent.name=Agente Vincolante Debole -item.ritualDiviner.name=Divinatore del Rituale -item.sigilOfMagnetism.name=Sigillo del Magnetismo -item.itemDiabloKey.name=Chiave del Vincolo -item.energyBazooka.name=Cannone Energetico -item.bloodLightSigil.name=Sigillo della Torcia di Sangue -item.itemComplexSpellCrystal.name=Cristallo Magico Complesso -item.itemSigilOfSupression.name=Sigillo di Soppressione -item.itemSigilOfEnderSeverance.name=Sigillo di Disgiunzione Ender -item.bucketLive.name=Secchio di Vita -item.bloodMagicBaseItem.QuartzRod.name=Verga di Quarzo -item.bloodMagicBaseItem.EmptyCore.name=Nucleo Vuoto -item.bloodMagicBaseItem.MagicalesCable.name=Connessione Magicales -item.bloodMagicBaseItem.WoodBrace.name=Pilastro di Legno -item.bloodMagicBaseItem.StoneBrace.name=Pilastro di Pietra -item.bloodMagicBaseItem.ProjectileCore.name=Nucleo Proiettile -item.bloodMagicBaseItem.SelfCore.name=Auto-Nucleo -item.bloodMagicBaseItem.MeleeCore.name=Nucleo di Mischia -item.bloodMagicBaseItem.ParadigmBackPlate.name=Piastra Modello -item.bloodMagicBaseItem.OutputCable.name=Connessione in Uscita di Magia -item.bloodMagicBaseItem.InputCable.name=Connessione in Entrata di Magia -item.bloodMagicBaseItem.FlameCore.name=Nucleo Infuocato -item.bloodMagicBaseItem.IcyCore.name=Nucleo Ghiacciato -item.bloodMagicBaseItem.GustCore.name=Nucleo Ventoso -item.bloodMagicBaseItem.EarthenCore.name=Nucleo Terroso -item.bloodMagicBaseItem.CrackedRunicPlate.name=Piastra Runica Incrinata -item.bloodMagicBaseItem.RunicPlate.name=Piastra Runica -item.bloodMagicBaseItem.ScribedRunicPlate.name=Piastra Runica Invasa -item.bloodMagicBaseItem.DefaultCore.name=Nucleo Disarmonico -item.bloodMagicBaseItem.OffensiveCore.name=Nucleo Offensivo -item.bloodMagicBaseItem.DefensiveCore.name=Nucleo Difensivo -item.bloodMagicBaseItem.EnvironmentalCore.name=Nucleo Ambientale -item.bloodMagicBaseItem.PowerCore.name=Nucleo di Forza -item.bloodMagicBaseItem.CostCore.name=Nucleo di Riduzione -item.bloodMagicBaseItem.PotencyCore.name=Nucleo di Potenza -item.bloodMagicBaseItem.ObsidianBrace.name=Pilastro di Ossidiana -item.bloodMagicAlchemyItem.Offensa.name=Offensa -item.bloodMagicAlchemyItem.Praesidium.name=Praesidium -item.bloodMagicAlchemyItem.OrbisTerrae.name=Orbis Terrae -item.bloodMagicAlchemyItem.StrengthenedCatalyst.name=Catalizzatore Rafforzato -item.bloodMagicAlchemyItem.ConcentratedCatalyst.name=Catalizzatore Concentrato -item.bloodMagicAlchemyItem.FracturedBone.name=Osso Fratturato -item.bloodMagicAlchemyItem.Virtus.name=Virtus -item.bloodMagicAlchemyItem.Reductus.name=Reductus -item.bloodMagicAlchemyItem.Potentia.name=Potentia -item.sanguineHelmet.name=Elmo Sanguigno -item.itemSeerSigil.name=Sigillo della Veduta -item.itemFluidSigil.name= - - -#Creative Tab -itemGroup.tabBloodMagic=Magia del Sangue - -#Extra Strings -bm.string.consume=Utilizzo -bm.string.drain=Drenaggio -bm.string.tier=Livello -bm.string.crafting.orb.shaped=Creazione di un Glodo Formato -bm.string.crafting.orb.shapeless=Creazione di un Globo Informe \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang b/src/main/resources/assets/bloodmagic/lang/ja_JP.lang deleted file mode 100644 index 5cffaa40..00000000 --- a/src/main/resources/assets/bloodmagic/lang/ja_JP.lang +++ /dev/null @@ -1,892 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic ¦ 書物 - -#Items -item.bloodmagic.activationCrystal.weak.name=å¼±ã„起動クリスタル -item.bloodmagic.activationCrystal.awakened.name=覚醒ã—ãŸèµ·å‹•ã‚¯ãƒªã‚¹ã‚¿ãƒ« -item.bloodmagic.activationCrystal.creative.name=クリエイティブ用ã®èµ·å‹•ã‚¯ãƒªã‚¹ã‚¿ãƒ« - -item.bloodmagic.sacrificialDagger.normal.name=生贄ã®ãƒ€ã‚¬ãƒ¼ -item.bloodmagic.sacrificialDagger.creative.name=生贄ã®ãƒ€ã‚¬ãƒ¼(クリエイティブ) -item.bloodmagic.pack.selfSacrifice.name=瀉血者ã®ãƒ‘ック -item.bloodmagic.pack.sacrifice.name=武装コート -item.bloodmagic.daggerOfSacrifice.name=サクリファイスダガー - -item.bloodmagic.lavaCrystal.name=溶岩ã®ã‚¯ãƒªã‚¹ã‚¿ãƒ« - -item.bloodmagic.bound.sword.name=çµåˆã—ãŸå‰£ -item.bloodmagic.bound.pickaxe.name=çµåˆã—ãŸãƒ„ルãƒã‚· -item.bloodmagic.bound.axe.name=çµåˆã—ãŸæ–§ -item.bloodmagic.bound.shovel.name=çµåˆã—ãŸã‚·ãƒ£ãƒ™ãƒ« - -item.bloodmagic.bucket.lifeEssence.name=ライフエッセンス入りãƒã‚±ãƒ„ - -item.bloodmagic.scribe.water.name=属性筆記具:水 -item.bloodmagic.scribe.fire.name=å±žæ€§ç­†è¨˜å…·ï¼šç« -item.bloodmagic.scribe.earth.name=属性筆記具:土 -item.bloodmagic.scribe.air.name=属性筆記具:風 -item.bloodmagic.scribe.dusk.name=å±žæ€§ç­†è¨˜å…·ï¼šé»„æ˜ -item.bloodmagic.scribe.dawn.name=å±žæ€§ç­†è¨˜å…·ï¼šæš - -item.bloodmagic.focus.weak.name=テレãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ -item.bloodmagic.focus.enhanced.name=強化テレãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ -item.bloodmagic.focus.reinforced.name=増強テレãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ -item.bloodmagic.focus.demonic.name=悪魔テレãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¼ã‚«ã‚¹ - -item.bloodmagic.slate.blank.name=空ã®çŸ³ç‰ˆ -item.bloodmagic.slate.reinforced.name=強化ã•ã‚ŒãŸçŸ³ç‰ˆ -item.bloodmagic.slate.imbued.name=染ã¿ã“ã‚“ã çŸ³ç‰ˆ -item.bloodmagic.slate.demonic.name=悪魔ã®çŸ³ç‰ˆ -item.bloodmagic.slate.ethereal.name=エーテルã®çŸ³ç‰ˆ - -item.bloodmagic.orb.weak.name=å¼±ã„ブラッドオーブ -item.bloodmagic.orb.apprentice.name=見習ã„ã®ãƒ–ラッドオーブ -item.bloodmagic.orb.magician.name=魔術師ã®ãƒ–ラッドオーブ -item.bloodmagic.orb.master.name=熟練者ã®ãƒ–ラッドオーブ -item.bloodmagic.orb.archmage.name=大魔術師ã®ãƒ–ラッドオーブ -item.bloodmagic.orb.transcendent.name=超越ã®ãƒ–ラッドオーブ - -item.bloodmagic.reagent.incendium.name=インセンディウム -item.bloodmagic.reagent.magicales.name=マギカリス -item.bloodmagic.reagent.sanctus.name=サンクトゥス -item.bloodmagic.reagent.aether.name=エーサー -item.bloodmagic.reagent.crepitous.name=クレピタス -item.bloodmagic.reagent.crystallos.name=クリスタロス -item.bloodmagic.reagent.terrae.name=テラエ -item.bloodmagic.reagent.aquasalus.name=アクアサルス -item.bloodmagic.reagent.tennebrae.name=テãƒãƒ–レ -item.bloodmagic.reagent.offensa.name=オフェンサ -item.bloodmagic.reagent.praesidium.name=プレジディウム -item.bloodmagic.reagent.orbisterrae.name=オービス・テラエ -item.bloodmagic.reagent.virtus.name=ヴィルトゥス -item.bloodmagic.reagent.reductus.name=レドクトゥス -item.bloodmagic.reagent.potentia.name=ãƒãƒ†ãƒ³ã‚·ã‚¢ - -item.bloodmagic.bloodShard.weak.name=å¼±ã„è¡€ã®çµæ™¶ç‰‡ -item.bloodmagic.bloodShard.demon.name=悪魔ã®è¡€ã®çµæ™¶ç‰‡ - -item.bloodmagic.baseComponent.reagentWater.name=æ°´ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentLava.name=溶岩ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentAir.name=風ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentFastMiner.name=鉱夫ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentVoid.name=虚無ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentGrowth.name=緑化ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentAffinity.name=精霊ã®åŠ è­·ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentSight.name=識別ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentBinding.name=çµåˆã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentSuppression.name=除去ã®è©¦è–¬ -item.bloodmagic.baseComponent.frameParts.name=フレームパーツ -item.bloodmagic.baseComponent.reagentBloodLight.name=è¡€ã®ãƒ©ãƒ³ãƒ—ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentMagnetism.name=ç£åŠ›ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentHaste.name=迅速ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentBridge.name=幻影橋ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentCompression.name=圧縮ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentSeverance.name=断絶ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentHolding.name=貯蔵ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentClaw.name=鉤爪ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentBounce.name=弾性ã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentFrost.name=寒気ã®è©¦è–¬ - -item.bloodmagic.baseComponent.reagentTeleposition.name=テレãƒãƒ¼ãƒˆã®è©¦è–¬ -item.bloodmagic.baseComponent.reagentTransposition.name=転ä½ã®è©¦è–¬ - -item.bloodmagic.baseComponent.ironSand.name=鉄ã®ç ‚ -item.bloodmagic.baseComponent.goldSand.name=金ã®ç ‚ -item.bloodmagic.baseComponent.coalSand.name=石炭ã®ç ‚ -item.bloodmagic.baseComponent.plantOil.name=æ¤ç‰©æ²¹ -item.bloodmagic.baseComponent.sulfur.name=硫黄 -item.bloodmagic.baseComponent.saltpeter.name=ç¡çŸ³ -item.bloodmagic.baseComponent.neurotoxin.name=神経毒 -item.bloodmagic.baseComponent.antiseptic.name=防è…剤 - -item.bloodmagic.cuttingFluid.basicCuttingFluid.name=基礎切削液 -item.bloodmagic.cuttingFluid.explosive.name=爆薬 - -item.bloodmagic.baseComponent.mundaneLength.name=ç°¡ç´ ãªå»¶é•·è§¦åª’ -item.bloodmagic.baseComponent.mundanePower.name=ç°¡ç´ ãªå¼·åŒ–触媒 - - -item.bloodmagic.demonCrystal.crystalDefault.name=デーモンウィルçµæ™¶ -item.bloodmagic.demonCrystal.crystalCorrosive.name=è…食性ウィルçµæ™¶ -item.bloodmagic.demonCrystal.crystalDestructive.name=破壊性ウィルçµæ™¶ -item.bloodmagic.demonCrystal.crystalVengeful.name=報復性ウィルçµæ™¶ -item.bloodmagic.demonCrystal.crystalSteadfast.name=ä¸æ´»æ€§ã‚¦ã‚£ãƒ«çµæ™¶ - -item.bloodmagic.monsterSoul.base.name=デーモニックウィル -item.bloodmagic.monsterSoul.corrosive.name=è…食性デーモニックウィル -item.bloodmagic.monsterSoul.destructive.name=破壊性デーモニックウィル -item.bloodmagic.monsterSoul.vengeful.name=報復性デーモニックウィル -item.bloodmagic.monsterSoul.steadfast.name=ä¸æ´»æ€§ãƒ‡ãƒ¼ãƒ¢ãƒ‹ãƒƒã‚¯ã‚¦ã‚£ãƒ« - -item.bloodmagic.sigil.air.name=風ã®å°ç«  -item.bloodmagic.sigil.bloodLight.name=è¡€ã®ãƒ©ãƒ³ãƒ—ã®å°ç«  -item.bloodmagic.sigil.compression.name=圧縮ã®å°ç«  -item.bloodmagic.sigil.divination.name=神託ã®å°ç«  -item.bloodmagic.sigil.water.name=æ°´ã®å°ç«  -item.bloodmagic.sigil.lava.name=溶岩ã®å°ç«  -item.bloodmagic.sigil.void.name=虚無ã®å°ç«  -item.bloodmagic.sigil.greenGrove.name=緑化ã®å°ç«  -item.bloodmagic.sigil.elementalAffinity.name=精霊ã®åŠ è­·ã®å°ç«  -item.bloodmagic.sigil.haste.name=迅速ã®å°ç«  -item.bloodmagic.sigil.suppression.name=除去ã®å°ç«  -item.bloodmagic.sigil.magnetism.name=ç£åŠ›ã®å°ç«  -item.bloodmagic.sigil.fastMiner.name=鉱夫ã®å°ç«  -item.bloodmagic.sigil.seer.name=識別ã®å°ç«  -item.bloodmagic.sigil.phantomBridge.name=幻影橋ã®å°ç«  -item.bloodmagic.sigil.whirlwind.name=旋風ã®å°ç«  -item.bloodmagic.sigil.enderSeverance.name=エンダー断絶ã®å°ç«  -item.bloodmagic.sigil.holding.name=貯蔵ã®å°ç«  -item.bloodmagic.sigil.holding.display=&r%s: &o&n%s -item.bloodmagic.sigil.teleposition.name=テレãƒãƒ¼ãƒˆã®å°ç«  -item.bloodmagic.sigil.transposition.name=転ä½ã®å°ç«  -item.bloodmagic.sigil.claw.name=鉤爪ã®å°ç«  -item.bloodmagic.sigil.bounce.name=弾性ã®å°ç«  -item.bloodmagic.sigil.frost.name=冬ã®æ¯å¹ã®å°ç«  - -item.bloodmagic.livingArmour.helmet.name=生体ã®ãƒ˜ãƒ«ãƒ¡ãƒƒãƒˆ -item.bloodmagic.livingArmour.chest.name=生体ã®ãƒã‚§ã‚¹ãƒˆãƒ—レート -item.bloodmagic.livingArmour.legs.name=生体ã®ãƒ¬ã‚®ãƒ³ã‚¹ -item.bloodmagic.livingArmour.boots.name=生体ã®ãƒ–ーツ -item.bloodmagic.sentientArmour.helmet.name=ç†åŠ›ã®ãƒ˜ãƒ«ãƒ¡ãƒƒãƒˆ -item.bloodmagic.sentientArmour.chest.name=ç†åŠ›ã®ãƒã‚§ã‚¹ãƒˆãƒ—レート -item.bloodmagic.sentientArmour.legs.name=ç†åŠ›ã®ãƒ¬ã‚®ãƒ³ã‚¹ -item.bloodmagic.sentientArmour.boots.name=ç†åŠ›ã®ãƒ–ーツ - -item.bloodmagic.altarMaker.name=祭壇メーカー - -item.bloodmagic.ritualDivinernormal.name=å„€å¼ã®å ã„棒 -item.bloodmagic.ritualDivinerdusk.name=å„€å¼ã®å ã„棒 [黄æ˜] -item.bloodmagic.ritualDivinerdawn.name=å„€å¼ã®å ã„棒 [æš] -item.bloodmagic.ritualReader.name=å„€å¼ã®èª¿æ•´å™¨ - -item.bloodmagic.arcaneAshes.name=秘儀ã®ç° -item.bloodmagic.upgradeTome.name=生体アーマー強化ã®æ›¸ -item.bloodmagic.downgradeTome.name=生体アーマー弱化ã®æ›¸ -item.bloodmagic.upgradeTrainer.name=生体アーマー養æˆãƒ–レスレット - -item.bloodmagic.sentientSword.name=ç†åŠ›ã®å‰£ -item.bloodmagic.soulGem.petty.name=微細ãªã‚¿ãƒ«ã‚¿ãƒªãƒƒã‚¯ã‚¸ã‚§ãƒ  -item.bloodmagic.soulGem.lesser.name=å°ã•ãªã‚¿ãƒ«ã‚¿ãƒªãƒƒã‚¯ã‚¸ã‚§ãƒ  -item.bloodmagic.soulGem.common.name=普通ã®ã‚¿ãƒ«ã‚¿ãƒªãƒƒã‚¯ã‚¸ã‚§ãƒ  -item.bloodmagic.soulGem.greater.name=大ããªã‚¿ãƒ«ã‚¿ãƒªãƒƒã‚¯ã‚¸ã‚§ãƒ  -item.bloodmagic.soulGem.grand.name=巨大ãªã‚¿ãƒ«ã‚¿ãƒªãƒƒã‚¯ã‚¸ã‚§ãƒ  -item.bloodmagic.soulSnare.base.name=ç°¡ç´ ãªæŠ•ã’ç½  -item.bloodmagic.sentientBow.name=ç†åŠ›ã®å¼“ -item.bloodmagic.sentientArmourGem.name=ç†åŠ›ã®ã‚¢ãƒ¼ãƒžãƒ¼ã‚¸ã‚§ãƒ  -item.bloodmagic.sentientAxe.name=ç†åŠ›ã®æ–§ -item.bloodmagic.sentientPickaxe.name=ç†åŠ›ã®ãƒ„ルãƒã‚· -item.bloodmagic.sentientShovel.name=ç†åŠ›ã®ã‚·ãƒ£ãƒ™ãƒ« - -item.bloodmagic.nodeRouter.name=ノード設定器 -item.bloodmagic.itemFilter.exact.name=精密アイテムフィルタ -item.bloodmagic.itemFilter.ignoreNBT.name=NBTタグフィルタ -item.bloodmagic.itemFilter.modItems.name=MODアイテムフィルタ -item.bloodmagic.itemFilter.oreDict.name=鉱石辞書フィルタ -item.bloodmagic.fluidFilter.exact.name=液体フィルタ - -item.bloodmagic.experienceTome.name=ペリティアã®æ›¸ -item.bloodmagic.sanguineBook.name=インスペクトリス・スカンダルム - -item.bloodmagic.livingPointUpgrade.draftAngelus.name=アンジェラスã®ä¸€é£²ã¿ - -item.bloodmagic.willGauge.name=デーモンウィルオーラ計測器 -item.bloodmagic.potionFlask.name=フラスコ入りãƒãƒ¼ã‚·ãƒ§ãƒ³ - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=ライフエッセンス - -tile.bloodmagic.stone.ritual.master.name=マスター儀å¼çŸ³ -tile.bloodmagic.stone.ritual.imperfect.name=簡易儀å¼çŸ³ -tile.bloodmagic.stone.ritual.inverted.name=å転マスター儀å¼çŸ³ - -tile.bloodmagic.altar.name=è¡€ã®ç¥­å£‡ -tile.bloodmagic.alchemyArray.name=錬金術魔法陣 - -tile.bloodmagic.rune.blank.name=空ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.speed.name=速度ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.efficiency.name=効率ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.sacrifice.name=生贄ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.selfsacrifice.name=自己犠牲ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.displacement.name=転移ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.capacity.name=容é‡å¢—加ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.augcapacity.name=容é‡å€åŠ ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.orb.name=オーブã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.acceleration.name=加速ã®ãƒ«ãƒ¼ãƒ³ -tile.bloodmagic.rune.charging.name=è“„ç©ã®ãƒ«ãƒ¼ãƒ³ - - -tile.bloodmagic.ritualStone.blank.name=å„€å¼çŸ³ -tile.bloodmagic.ritualStone.water.name=æ°´ã®å„€å¼çŸ³ -tile.bloodmagic.ritualStone.fire.name=ç«ã®å„€å¼çŸ³ -tile.bloodmagic.ritualStone.earth.name=土ã®å„€å¼çŸ³ -tile.bloodmagic.ritualStone.air.name=風ã®å„€å¼çŸ³ -tile.bloodmagic.ritualStone.dusk.name=黄æ˜ã®å„€å¼çŸ³ -tile.bloodmagic.ritualStone.dawn.name=æšã®å„€å¼çŸ³ - -tile.bloodmagic.bloodstonebrick.large.name=大ããªãƒ–ラッドストーンレンガ -tile.bloodmagic.bloodstonebrick.brick.name=ブラッドストーンレンガ -tile.bloodmagic.crystal.large.name=クリスタルクラスター -tile.bloodmagic.crystal.brick.name=クリスタルクラスターレンガ -tile.bloodmagic.bloodLight.name=è¡€ã®ç¯ç« -tile.bloodmagic.spectralBlock.name=亡霊ブロック -tile.bloodmagic.phantom.name=幻影ブロック -tile.bloodmagic.incenseAltar.name=香ã®ç¥­å£‡ - -tile.bloodmagic.teleposer.name=テレãƒãƒ¼ã‚¶ãƒ¼ -tile.bloodmagic.soulForge.name=業ç«ã®ã‹ã¾ã© -tile.bloodmagic.alchemyTable.name=錬金術テーブル -tile.bloodmagic.demonCrucible.name=悪魔ã®ã‚‹ã¤ã¼ -tile.bloodmagic.demonPylon.name=悪魔ã®å¡” -tile.bloodmagic.demonCrystallizer.name=悪魔ã®æ™¶æžè£…ç½® - -tile.bloodmagic.masterRouting.name=マスター中継ノード -tile.bloodmagic.outputRouting.name=出力中継ノード -tile.bloodmagic.inputRouting.name=入力中継ノード -tile.bloodmagic.itemRouting.name=中継ノード - -tile.bloodmagic.path.wood.name=木ã®çµŒè·¯ -tile.bloodmagic.path.woodtile.name=タイル状ã®æœ¨ã®çµŒè·¯ -tile.bloodmagic.path.stone.name=石レンガã®çµŒè·¯ -tile.bloodmagic.path.stonetile.name=タイル状ã®çŸ³ã®çµŒè·¯ -tile.bloodmagic.path.wornstone.name=摩耗ã—ãŸçŸ³ã®çµŒè·¯ -tile.bloodmagic.path.wornstonetile.name=タイル状ã®æ‘©è€—ã—ãŸçŸ³ã®çµŒè·¯ -tile.bloodmagic.path.obsidian.name=黒曜石レンガã®çµŒè·¯ -tile.bloodmagic.path.obsidiantile.name=タイル状ã®é»’曜石ã®çµŒè·¯ - -tile.bloodmagic.dimensionalPortal.name=ワープãƒãƒ¼ã‚¿ãƒ« -tile.bloodmagic.bloodTank.name=血液タンク - -tile.bloodmagic.demonCrystal.default.name=デーモンウィルçµæ™¶æ ª -tile.bloodmagic.demonCrystal.corrosive.name=è…食性ウィルçµæ™¶æ ª -tile.bloodmagic.demonCrystal.destructive.name=破壊性ウィルçµæ™¶æ ª -tile.bloodmagic.demonCrystal.vengeful.name=報復性ウィルçµæ™¶æ ª -tile.bloodmagic.demonCrystal.steadfast.name=ä¸æ´»æ€§ã‚¦ã‚£ãƒ«çµæ™¶æ ª - -tile.bloodmagic.mimic.nohitbox.name=希薄ã§ä¸é€éŽãªå½è£…ブロック -tile.bloodmagic.mimic.solidopaque.name=ä¸é€éŽãªå½è£…ブロック -tile.bloodmagic.mimic.solidclear.name=é€éŽãªå½è£…ブロック -tile.bloodmagic.mimic.solidlight.name=発光ã™ã‚‹å½è£…ブロック -tile.bloodmagic.mimic.sentient.name=ç†åŠ›ã®å½è£…ブロック - -tile.bloodmagic.bricks1.brick1_raw.name=é•·ã„原生ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks1.brick1_corrosive.name=é•·ã„è…食性ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks1.brick1_destructive.name=é•·ã„破壊性ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks1.brick1_vengeful.name=é•·ã„報復性ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks1.brick1_steadfast.name=é•·ã„ä¸æ´»æ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ - -tile.bloodmagic.bricks2.smallbrick_raw.name=å°ã•ãªåŽŸç”Ÿã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks2.smallbrick_corrosive.name=å°ã•ãªè…食性ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks2.smallbrick_destructive.name=å°ã•ãªç ´å£Šæ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks2.smallbrick_vengeful.name=å°ã•ãªå ±å¾©æ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks2.smallbrick_steadfast.name=å°ã•ãªä¸æ´»æ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ -tile.bloodmagic.bricks2.tile_raw.name=原生ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tile_corrosive.name=è…食性ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tile_destructive.name=破壊性ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tile_vengeful.name=報復性ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tile_steadfast.name=ä¸æ´»æ€§ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tilespecial_raw.name=装飾ã•ã‚ŒãŸåŽŸç”Ÿã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tilespecial_corrosive.name=装飾ã•ã‚ŒãŸè…食性ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tilespecial_destructive.name=装飾ã•ã‚ŒãŸç ´å£Šæ€§ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tilespecial_vengeful.name=装飾ã•ã‚ŒãŸå ±å¾©æ€§ã®çŸ³ã‚¿ã‚¤ãƒ« -tile.bloodmagic.bricks2.tilespecial_steadfast.name=装飾ã•ã‚ŒãŸä¸æ´»æ€§ã®çŸ³ã‚¿ã‚¤ãƒ« - -tile.bloodmagic.inversionpillar.raw.name=原生ã®å転柱 -tile.bloodmagic.inversionpillar.corrosive.name=è…食性ã®å転柱 -tile.bloodmagic.inversionpillar.destructive.name=破壊性ã®å転柱 -tile.bloodmagic.inversionpillar.vengeful.name=報復性ã®å転柱 -tile.bloodmagic.inversionpillar.steadfast.name=ä¸æ´»æ€§ã®å転柱 - -tile.bloodmagic.inversionpillarend.raw_bottom.name=原生ã®å転柱ã®å°åº§ -tile.bloodmagic.inversionpillarend.corrosive_bottom.name=è…食性ã®å転柱ã®å°åº§ -tile.bloodmagic.inversionpillarend.destructive_bottom.name=破壊性ã®å転柱ã®å°åº§ -tile.bloodmagic.inversionpillarend.vengeful_bottom.name=報復性ã®å転柱ã®å°åº§ -tile.bloodmagic.inversionpillarend.steadfast_bottom.name=ä¸æ´»æ€§ã®å転柱ã®å°åº§ -tile.bloodmagic.inversionpillarend.raw_top.name=原生ã®å転柱ã®æŸ±é ­ -tile.bloodmagic.inversionpillarend.corrosive_top.name=è…食性ã®å転柱ã®æŸ±é ­ -tile.bloodmagic.inversionpillarend.destructive_top.name=破壊性ã®å転柱ã®æŸ±é ­ -tile.bloodmagic.inversionpillarend.vengeful_top.name=報復性ã®å転柱ã®æŸ±é ­ -tile.bloodmagic.inversionpillarend.steadfast_top.name=ä¸æ´»æ€§ã®å転柱ã®æŸ±é ­ - -tile.bloodmagic.demonlight.raw.name=原生デーモンアイ -tile.bloodmagic.demonlight.corrosive.name=è…食性デーモンアイ -tile.bloodmagic.demonlight.destructive.name=破壊性デーモンアイ -tile.bloodmagic.demonlight.vengeful.name=報復性デーモンアイ -tile.bloodmagic.demonlight.steadfast.name=ä¸æ´»æ€§ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¢ã‚¤ - -tile.bloodmagic.extras.stone_raw.name=原生ã®çŸ³ -tile.bloodmagic.extras.stone_corrosive.name=è…食性ã®çŸ³ -tile.bloodmagic.extras.stone_destructive.name=破壊性ã®çŸ³ -tile.bloodmagic.extras.stone_vengeful.name=報復性ã®çŸ³ -tile.bloodmagic.extras.stone_steadfast.name=ä¸æ´»æ€§ã®çŸ³ - -tile.bloodmagic.extras.polished_raw.name=磨ã‹ã‚ŒãŸåŽŸç”Ÿã®çŸ³ -tile.bloodmagic.extras.polished_corrosive.name=磨ã‹ã‚ŒãŸè…食性ã®çŸ³ -tile.bloodmagic.extras.polished_destructive.name=磨ã‹ã‚ŒãŸç ´å£Šæ€§ã®çŸ³ -tile.bloodmagic.extras.polished_vengeful.name=磨ã‹ã‚ŒãŸå ±å¾©æ€§ã®çŸ³ -tile.bloodmagic.extras.polished_steadfast.name=磨ã‹ã‚ŒãŸä¸æ´»æ€§ã®çŸ³ - -tile.bloodmagic.extras.metal_raw.name=原生デーモンåˆé‡‘ -tile.bloodmagic.extras.metal_corrosive.name=報復性デーモンåˆé‡‘ -tile.bloodmagic.extras.metal_destructive.name=破壊性デーモンåˆé‡‘ -tile.bloodmagic.extras.metal_vengeful.name=報復性デーモンåˆé‡‘ -tile.bloodmagic.extras.metal_steadfast.name=ä¸æ´»æ€§ãƒ‡ãƒ¼ãƒ¢ãƒ³åˆé‡‘ - -tile.bloodmagic.pillar1.raw.name=原生ã®çŸ³æŸ± -tile.bloodmagic.pillar1.corrosive.name=è…食性ã®çŸ³æŸ± -tile.bloodmagic.pillar1.destructive.name=破壊性ã®çŸ³æŸ± -tile.bloodmagic.pillar1.vengeful.name=報復性ã®çŸ³æŸ± -tile.bloodmagic.pillar1.steadfast.name=ä¸æ´»æ€§ã®çŸ³æŸ± - -tile.bloodmagic.pillar2.raw.name=装飾ã•ã‚ŒãŸåŽŸç”Ÿã®çŸ³æŸ± -tile.bloodmagic.pillar2.corrosive.name=装飾ã•ã‚ŒãŸè…食性ã®çŸ³æŸ± -tile.bloodmagic.pillar2.destructive.name=装飾ã•ã‚ŒãŸç ´å£Šæ€§ã®çŸ³æŸ± -tile.bloodmagic.pillar2.vengeful.name=装飾ã•ã‚ŒãŸå ±å¾©æ€§ã®çŸ³æŸ± -tile.bloodmagic.pillar2.steadfast.name=装飾ã•ã‚ŒãŸä¸æ´»æ€§ã®çŸ³æŸ± - -tile.bloodmagic.pillarCap1.raw.name=原生ã®çŸ³æŸ±ã®æŸ±é ­ -tile.bloodmagic.pillarCap1.corrosive.name=è…食性ã®çŸ³æŸ±ã®æŸ±é ­ -tile.bloodmagic.pillarCap2.destructive.name=破壊性ã®çŸ³æŸ±ã®æŸ±é ­ -tile.bloodmagic.pillarCap2.vengeful.name=報復性ã®çŸ³æŸ±ã®æŸ±é ­ -tile.bloodmagic.pillarCap3.steadfast.name=ä¸æ´»æ€§ã®çŸ³æŸ±ã®æŸ±é ­ - -tile.bloodmagic.wall1.brick_raw.name=原生ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å£ -tile.bloodmagic.wall1.brick_corrosive.name=è…食性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å£ -tile.bloodmagic.wall1.brick_destructive.name=破壊性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å£ -tile.bloodmagic.wall1.brick_vengeful.name=報復性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å£ -tile.bloodmagic.wall1.brick_steadfast.name=ä¸æ´»æ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å£ -tile.bloodmagic.wall1.smallbrick_raw.name=原生ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å°ã•ãªå£ -tile.bloodmagic.wall1.smallbrick_corrosive.name=è…食性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å°ã•ãªå£ -tile.bloodmagic.wall1.smallbrick_destructive.name=破壊性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å°ã•ãªå£ -tile.bloodmagic.wall1.smallbrick_vengeful.name=報復性ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å°ã•ãªå£ -tile.bloodmagic.wall1.smallbrick_steadfast.name=ä¸æ´»æ€§ã®çŸ³ãƒ¬ãƒ³ã‚¬ã®å°ã•ãªå£ -tile.bloodmagic.wall1.large_raw.name=原生ã®çŸ³ã®å£ -tile.bloodmagic.wall1.large_corrosive.name=è…食性ã®çŸ³ã®å£ -tile.bloodmagic.wall1.large_destructive.name=破壊性ã®çŸ³ã®å£ -tile.bloodmagic.wall1.large_vengeful.name=報復性ã®çŸ³ã®å£ -tile.bloodmagic.wall1.large_steadfast.name=ä¸æ´»æ€§ã®çŸ³ã®å£ - -tile.bloodmagic.stairs1.raw.name=原生ã®çŸ³ã®éšŽæ®µ -tile.bloodmagic.stairs1.corrosive.name=è…食性ã®çŸ³ã®éšŽæ®µ -tile.bloodmagic.stairs2.destructive.name=破壊性ã®çŸ³ã®éšŽæ®µ -tile.bloodmagic.stairs2.vengeful.name=報復性ã®çŸ³ã®éšŽæ®µ -tile.bloodmagic.stairs3.steadfast.name=ä¸æ´»æ€§ã®çŸ³ã®éšŽæ®µ - -# Fluids -fluid.lifeEssence=ライフエッセンス - -# Tooltips -tooltip.bloodmagic.extraInfo=&9-Siftキーã§è©³ç´°è¡¨ç¤º- - -tooltip.bloodmagic.orb.desc=加工å‰ã®ãƒ©ã‚¤ãƒ•ã‚¨ãƒƒã‚»ãƒ³ã‚¹ã§æº€ã¡ã¦ã„ã‚‹ -tooltip.bloodmagic.orb.owner=以下ã«ã‚ˆã‚‹è¿½åŠ è¦ç´ ï¼š %s -tooltip.bloodmagic.currentOwner=ç¾åœ¨ã®æ‰€æœ‰è€…: %s -tooltip.bloodmagic.currentTier=祭壇ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d -tooltip.bloodmagic.config.disabled=ç¾åœ¨configã«ã‚ˆã‚Šç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ -tooltip.bloodmagic.tier=グレード%d - -tooltip.bloodmagic.activated=アクティブ -tooltip.bloodmagic.deactivated=éžã‚¢ã‚¯ãƒ†ã‚£ãƒ– - -tooltip.bloodmagic.sigil.air.desc=&o体ãŒè»½ãæ„Ÿã˜ã‚‹... -tooltip.bloodmagic.sigil.bloodLight.desc=&o明ã‹ã‚Šã ï¼ -tooltip.bloodmagic.sigil.compression.desc=&oダイヤモンドã®æ‰‹ -tooltip.bloodmagic.sigil.divination.desc=&o魂を覗ã込む -tooltip.bloodmagic.sigil.divination.otherNetwork=%sã®é­‚ã¨ç›¸äº’リンク中 -tooltip.bloodmagic.sigil.divination.currentAltarTier=祭壇ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d -tooltip.bloodmagic.sigil.divination.currentEssence=貯蔵é‡ï¼š %d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=最大容é‡ï¼š %d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=ç¾åœ¨ã®éŽ®é™åŠ¹æžœï¼š %d -tooltip.bloodmagic.sigil.divination.currentInversion=ç¾åœ¨ã®å転度: %d -tooltip.bloodmagic.sigil.divination.currentBonus=çµåˆåº¦ï¼š +%d%% -tooltip.bloodmagic.sigil.water.desc=&oç„¡é™ã®æ°´ã¯ã„ã‹ãŒï¼Ÿ -tooltip.bloodmagic.sigil.lava.desc=&o高温注æ„ï¼é£Ÿã¹ã‚‰ã‚Œã¾ã›ã‚“ -tooltip.bloodmagic.sigil.void.desc=&oクイックルワイパー(R)より素晴らã—ã„ï¼ -tooltip.bloodmagic.sigil.greenGrove.desc=&o環境ã«ã‚„ã•ã—ã„ -tooltip.bloodmagic.sigil.magnetism.desc=&oç§ã¯å¼•ã付ã‘る性格ã§ã™ -tooltip.bloodmagic.sigil.suppression.desc=&o素晴らã—ã„念動力ã ... -tooltip.bloodmagic.sigil.haste.desc=&oコーヒー42æ¯é£²ã‚“ã ã‚ã¨... -tooltip.bloodmagic.sigil.fastMiner.desc=&o掘ã£ã¦ã€æŽ˜ã£ã¦ã€ã¾ãŸæŽ˜ã£ã¦... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oファイアフィッシュã«ãªã‚‹ï¼ -tooltip.bloodmagic.sigil.seer.desc=&oã™ã¹ã¦ã‚’見通ã›ã¦ã‚‚ã¾ã ç‰©è¶³ã‚Šãªã„ -tooltip.bloodmagic.sigil.seer.currentAltarProgress=進æ—状æ³ï¼š %d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=進æ—状æ³ï¼š %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=消費率: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=祭壇ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d -tooltip.bloodmagic.sigil.seer.currentEssence=貯蔵é‡ï¼š %d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=最大容é‡ï¼š %d LP -tooltip.bloodmagic.sigil.seer.currentCharge=ç¾åœ¨ã®ãƒãƒ£ãƒ¼ã‚¸ï¼š %d -tooltip.bloodmagic.sigil.seer.currentTranquility=ç¾åœ¨ã®éŽ®é™åŠ¹æžœï¼š %d -tooltip.bloodmagic.sigil.seer.currentBonus=çµåˆåº¦ï¼š +%d%% -tooltip.bloodmagic.sigil.phantomBridge.desc=&o空を歩ã“ã†... -tooltip.bloodmagic.sigil.whirlwind.desc=&oスカートã¯å±¥ã‹ãªã„ã»ã†ãŒã„ã„よã†ã  -tooltip.bloodmagic.sigil.enderSeverance.desc=&oエンダーマンã¯æ‚²æƒ¨ãªäº‹ã«ãªã‚‹ï¼ -tooltip.bloodmagic.sigil.teleposition.desc=ã‚ãšã‹ãªè·é›¢ãªã‚‰ç§»å‹•ã§ããã†ã ã€‚ -tooltip.bloodmagic.sigil.transposition.desc=フォースã®åŠ›ã‚’æ„Ÿã˜ã‚‹ã®ã ã€è‹¥ã弟å­ã‚ˆã€‚ -tooltip.bloodmagic.sigil.holding.press=&o%s&r&7を押ã™ã“ã¨ã§å¤‰æ›´ -tooltip.bloodmagic.sigil.holding.desc=多é‡åŒ–å°ç«  -tooltip.bloodmagic.sigil.holding.sigilInSlot=スロット %d: %s - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=生体アーマーã®å¼·åŒ–ãƒã‚¤ãƒ³ãƒˆã®æœ€å¤§å€¤ã‚’%dã«å¢—加ã•ã›ã‚‹ã€‚ - -tooltip.bloodmagic.bound.sword.desc=&o弱者ã®æ·˜æ±° -tooltip.bloodmagic.bound.pickaxe.desc=&o石ã¸ã®ç„¡æ…ˆæ‚²ãªç ´å£Š -tooltip.bloodmagic.bound.axe.desc=&o悪魔ã®ä¼æŽ¡æ©Ÿ -tooltip.bloodmagic.bound.shovel.desc=&o土を掃除ã—ã¦ç¶ºéº—ã« - -tooltip.bloodmagic.sacrificialDagger.desc=指を刺ã™ã«ã¯å分ãªåˆ‡ã‚Œå‘³ã®ã‚ˆã†ã ... -tooltip.bloodmagic.sacrificialDagger.creative=スニーク状態ã§è¡€ã®ç¥­å£‡ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã‚’ã™ã‚‹ã“ã¨ã§æº€ã‚¿ãƒ³ã«ãªã‚‹ -tooltip.bloodmagic.slate.desc=è¡€ã®ç¥­å£‡ã§æ³¨å…¥ã•ã‚ŒãŸçŸ³ -tooltip.bloodmagic.inscriber.desc=å£ã«æãã®ã«ä½¿ã†ã‚ˆã†ã ... - -tooltip.bloodmagic.pack.selfSacrifice.desc=ã“ã®ãƒ‘ックã¯æœ¬å½“ã«ãƒã‚¯ãƒã‚¯ã™ã‚‹... -tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=貯蔵é‡ï¼š %d LP - -tooltip.bloodmagic.activationCrystal.weak=低レベルã®å„€å¼ã‚’èµ·å‹•ã•ã›ã‚‹ -tooltip.bloodmagic.activationCrystal.awakened=より強力ãªå„€å¼ã‚’èµ·å‹•ã•ã›ã‚‹ -tooltip.bloodmagic.activationCrystal.creative=クリエイティブ専用 - å…¨ã¦ã®å„€å¼ã‚’èµ·å‹• - -tooltip.bloodmagic.diviner.currentRitual=é¸æŠžä¸­ã®å„€å¼ï¼š -tooltip.bloodmagic.diviner.blankRune=å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.waterRune=æ°´ã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.airRune=風ã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.fireRune=ç«ã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.earthRune=土ã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.duskRune=黄æ˜ã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.dawnRune=æšã®å„€å¼çŸ³ï¼š %d個 -tooltip.bloodmagic.diviner.totalRune=å„€å¼çŸ³ã®åˆè¨ˆï¼š %d個 -tooltip.bloodmagic.diviner.extraInfo=&9-Shiftキーã§ãƒ«ãƒ¼ãƒ³ã®è©³ç´°è¡¨ç¤º- -tooltip.bloodmagic.diviner.extraExtraInfo=&9-Shift + Mキーã§æ©Ÿèƒ½æ‹¡å¼µã®è©³ç´°è¡¨ç¤º- -tooltip.bloodmagic.diviner.currentDirection=ç¾åœ¨ã®æ–¹è§’: %s - -tooltip.bloodmagic.ritualReader.currentState=ç¾åœ¨ã®ãƒ¢ãƒ¼ãƒ‰ï¼š %s -tooltip.bloodmagic.ritualReader.set_area=設定エリア -tooltip.bloodmagic.ritualReader.information=基本情報 -tooltip.bloodmagic.ritualReader.set_will_types=消費ウィルã®è¨­å®š -tooltip.bloodmagic.ritualReader.desc.set_area=起動中ã®ãƒžã‚¹ã‚¿ãƒ¼å„€å¼çŸ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€å„€å¼ã®åŠ¹æžœç¯„囲を変更ã§ãã¾ã™ã€‚最åˆã«ãƒžã‚¹ã‚¿ãƒ¼å„€å¼çŸ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã€æ¬¡ã«æ–°ã—ã設定ã—ãŸã„効果範囲㮠両端2箇所を順番ã«ã‚¯ãƒªãƒƒã‚¯ã—ã¾ã™ã€‚ -tooltip.bloodmagic.ritualReader.desc.information=起動中ã®ãƒžã‚¹ã‚¿ãƒ¼å„€å¼çŸ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã“ã¨ã§ã€åŸºæœ¬æƒ…報を読ã¿å–ã‚Šã¾ã™ã€‚ -tooltip.bloodmagic.ritualReader.desc.set_will_types=ホットãƒãƒ¼ã«ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶ã‚’入れãŸçŠ¶æ…‹ã§ãƒžã‚¹ã‚¿ãƒ¼å„€å¼çŸ³ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ãã®ã‚¦ã‚£ãƒ«ã‚’消費ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¾ã™ã€‚ - -tooltip.bloodmagic.arcaneAshes=錬金術魔法陣をæãã®ã«ç”¨ã„ã‚‹ç° - -tooltip.bloodmagic.telepositionFocus.coords=ç¾åœ¨ã®è¨­å®šåº§æ¨™ï¼š (%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=ディメンションID: %d -tooltip.bloodmagic.telepositionFocus.weak=ワールド内ã®ãƒ–ロックã®è»¢é€ã«ç”¨ã„ã‚‹ -tooltip.bloodmagic.telepositionFocus.enhanced=ワールド内ã®ãƒ–ロックã®è»¢é€ã«ç”¨ã„ã‚‹ -tooltip.bloodmagic.telepositionFocus.reinforced=ワールド内ã®ãƒ–ロックã®è»¢é€ã«ç”¨ã„ã‚‹ -tooltip.bloodmagic.telepositionFocus.demonic=ワールド内ã®ãƒ–ロックã®è»¢é€ã«ç”¨ã„ã‚‹ - -tooltip.bloodmagic.livingArmour.upgrade.speed=迅速 -tooltip.bloodmagic.livingArmour.upgrade.digging=ドワーフã®åŠ› -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=毒抵抗 -tooltip.bloodmagic.livingArmour.upgrade.fireResist=イグニスã®æ©æµ -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=頑丈ãªæŒ‡ -tooltip.bloodmagic.livingArmour.upgrade.knockback=ボディービルダー -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=強固ãªèº«ä½“ -tooltip.bloodmagic.livingArmour.upgrade.health=生命力 -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=å¼·æ’ƒ -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=トリックショット -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=歩行補助 -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=死神ã®ç–¾èµ° -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=太陽ã®æ©æµ -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=ルーンã®åŠ è­· -tooltip.bloodmagic.livingArmour.upgrade.revealing=洞察 -tooltip.bloodmagic.livingArmour.upgrade.experienced=経験 -tooltip.bloodmagic.livingArmour.upgrade.jump=è·³èº -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=軟ç€é™¸ -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=グレイヴディガー -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=ãƒãƒ£ãƒ¼ã‚¸ã‚¹ãƒˆãƒ©ã‚¤ã‚¯ -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=トゥルーストライク -tooltip.bloodmagic.livingArmour.upgrade.elytra=エリトラ -tooltip.bloodmagic.livingArmour.upgrade.nightSight=夜間技能 -tooltip.bloodmagic.livingArmour.upgrade.repair=補修 - - -tooltip.bloodmagic.livingArmour.upgrade.slowness=引ããšã‚‹è¶³ -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=ä¸è‡ªç”±ãªè…• -tooltip.bloodmagic.livingArmour.upgrade.slippery=摩擦力低下 -tooltip.bloodmagic.livingArmour.upgrade.battleHunger=飢餓ã®æˆ¦ã„ -tooltip.bloodmagic.livingArmour.upgrade.quenched=抑制 -tooltip.bloodmagic.livingArmour.upgrade.meleeDecrease=éˆã„刃 -tooltip.bloodmagic.livingArmour.upgrade.digSlowdown=朽ã¡ãŸãƒ„ルãƒã‚· -tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=çªæ’ƒå…µ -tooltip.bloodmagic.livingArmour.upgrade.slowHeal=ç—…å¼± -tooltip.bloodmagic.livingArmour.upgrade.disoriented=æ–¹å‘感覚障害 - -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Lv %d) -tooltip.bloodmagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.bloodmagic.livingArmour.upgrade.points=&6強化ãƒã‚¤ãƒ³ãƒˆï¼š %s / %s - -tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-Shift + Mã§é€²æ—情報- - -tooltip.bloodmagic.will=ウィルå«æœ‰é‡ï¼š %1$,.2f -tooltip.bloodmagic.sentientSword.desc=デーモンウィルを使用ã™ã‚‹ã“ã¨ã§æ½œåœ¨èƒ½åŠ›ãŒé–‹æ”¾ã•ã‚Œã¾ã™ -tooltip.bloodmagic.sentientAxe.desc=デーモンウィルを使用ã™ã‚‹ã“ã¨ã§æ½œåœ¨èƒ½åŠ›ãŒé–‹æ”¾ã•ã‚Œã¾ã™ -tooltip.bloodmagic.sentientPickaxe.desc=デーモンウィルを使用ã™ã‚‹ã“ã¨ã§æ½œåœ¨èƒ½åŠ›ãŒé–‹æ”¾ã•ã‚Œã¾ã™ -tooltip.bloodmagic.sentientShovel.desc=デーモンウィルを使用ã™ã‚‹ã“ã¨ã§æ½œåœ¨èƒ½åŠ›ãŒé–‹æ”¾ã•ã‚Œã¾ã™ -tooltip.bloodmagic.soulGem.petty=ã“ã®å®çŸ³ã¯å¾®é‡ã®ã‚¦ã‚£ãƒ«ã‚’貯蔵ã§ãã¾ã™ -tooltip.bloodmagic.soulGem.lesser=ã“ã®å®çŸ³ã¯å°‘é‡ã®ã‚¦ã‚£ãƒ«ã‚’貯蔵ã§ãã¾ã™ -tooltip.bloodmagic.soulGem.common=ã“ã®å®çŸ³ã¯ãã“ãã“ã®ã‚¦ã‚£ãƒ«ã‚’貯蔵ã§ãã¾ã™ -tooltip.bloodmagic.soulGem.greater=ã“ã®å®çŸ³ã¯å¤§é‡ã®ã‚¦ã‚£ãƒ«ã‚’貯蔵ã§ãã¾ã™ -tooltip.bloodmagic.soulGem.grand=ã“ã®å®çŸ³ã¯èŽ«å¤§ãªã‚¦ã‚£ãƒ«ã‚’貯蔵ã§ãã¾ã™ -tooltip.bloodmagic.soulSnare.desc=モンスターã«æŠ•ã’ã¤ã‘ã¦ã‹ã‚‰å€’ã™ã“ã¨ã§ãƒ‡ãƒ¼ãƒ¢ãƒ‹ãƒƒã‚¯ã‚¦ã‚£ãƒ«ã‚’入手ã§ãã¾ã™ - -tooltip.bloodmagic.itemFilter.exact=アイテムãŒæ­£ç¢ºã«ä¸€è‡´ã™ã‚‹å ´åˆã«ãƒ•ã‚£ãƒ«ã‚¿ã—ã¾ã™ -tooltip.bloodmagic.itemFilter.ignoreNBT=NBTã‚¿ã‚°ã§ãƒ•ã‚£ãƒ«ã‚¿ã—ã¾ã™ -tooltip.bloodmagic.itemFilter.modItems=特定MODã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’フィルタã—ã¾ã™ -tooltip.bloodmagic.itemFilter.oreDict=鉱石辞書を用ã„ã¦ãƒ•ã‚£ãƒ«ã‚¿ã—ã¾ã™ - -tooltip.bloodmagic.itemFilter.exact=液体ã®å…¥å‡ºåŠ›ã‚’フィルタã—ã¾ã™ - -tooltip.bloodmagic.fluid.type=液体内容物: %s -tooltip.bloodmagic.fluid.amount=内容é‡ï¼š %d / %d mB -tooltip.bloodmagic.fluid.capacity=最大容é‡ï¼š %d mB - -tooltip.bloodmagic.ghost.everything=全㦠-tooltip.bloodmagic.ghost.amount=幻影アイテムã®å€‹æ•°ï¼š %d個 - -tooltip.bloodmagic.currentType.default=内容物: 原生ウィル -tooltip.bloodmagic.currentType.corrosive=内容物: è…食性ウィル -tooltip.bloodmagic.currentType.destructive=内容物: 破壊性ウィル -tooltip.bloodmagic.currentType.vengeful=内容物: 報復性ウィル -tooltip.bloodmagic.currentType.steadfast=内容物: ä¸æ´»æ€§ã‚¦ã‚£ãƒ« - -tooltip.bloodmagic.currentBaseType.default=原生 -tooltip.bloodmagic.currentBaseType.corrosive=è…食性 -tooltip.bloodmagic.currentBaseType.destructive=破壊性 -tooltip.bloodmagic.currentBaseType.vengeful=報復性 -tooltip.bloodmagic.currentBaseType.steadfast=ä¸æ´»æ€§ - -tooltip.bloodmagic.experienceTome=経験値を貯蔵ã™ã‚‹ãŸã‚ã«ç”¨ã„る本 -tooltip.bloodmagic.experienceTome.exp=Exp: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=レベル: %d - -tooltip.bloodmagic.decoration.safe=安全ãªè£…飾 -tooltip.bloodmagic.decoration.notSafe=å±é™ºãªè£…飾 - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d 回使用å¯èƒ½ - -tooltip.bloodmagic.potion.uses=%d 回使用å¯èƒ½ - -tooltip.bloodmagic.book.shifting=紋様ãŒ... &oShiftã—ã¦... - -tooltip.bloodmagic.willGauge=大気中ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’測定ã™ã‚‹ãŸã‚ã®å¥‡å¦™ãªè£…置。 - -# Ritual -ritual.bloodmagic.blockRange.tooBig=指定ã•ã‚ŒãŸãƒ–ロック範囲ãŒåºƒã™ãŽã¾ã™ï¼æœ€å¤§%sブロックã®ç¯„囲内ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ritual.bloodmagic.blockRange.tooFar=指定ã•ã‚ŒãŸãƒ–ロック範囲ãŒé ã™ãŽã¾ã™ï¼åž‚ç›´æ–¹å‘ã«%sブロックã€æ°´å¹³æ–¹å‘ã«%sブロックã®ç¯„囲内ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -ritual.bloodmagic.blockRange.inactive=å„€å¼çŸ³ã¯åœæ­¢ä¸­ã§ã‚ã‚Šã€ç¯„囲ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 -ritual.bloodmagic.blockRange.noRange=ブロック範囲ã¯é©åˆ‡ã«è¨­å®šã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ -ritual.bloodmagic.blockRange.firstBlock=効果範囲ã®é–‹å§‹ãƒ–ロックを設定ã—ã¾ã—ãŸã€‚ -ritual.bloodmagic.blockRange.success=正常ã«æ–°ã—ã„効果範囲ãŒè¨­å®šã•ã‚Œã¾ã—ãŸï¼ -ritual.bloodmagic.willConfig.set=ã“ã®å„€å¼ã«ä»¥ä¸‹ã®ç¨®é¡žã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’使用: %s -ritual.bloodmagic.willConfig.void=ã“ã®å„€å¼ã¯ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«ã‚’使用ã—ã¾ã›ã‚“ - -ritual.bloodmagic.testRitual=è©¦é¨“ç”¨å„€å¼ -ritual.bloodmagic.waterRitual=湧水ã®å„€å¼ -ritual.bloodmagic.lavaRitual=ãƒã‚¶ãƒ¼ã®å°å¤œæ›² -ritual.bloodmagic.greenGroveRitual=緑化ã®å„€å¼ -ritual.bloodmagic.jumpRitual=è·³èºã®å„€å¼ -ritual.bloodmagic.wellOfSufferingRitual=苦痛ã®äº•æˆ¸ -ritual.bloodmagic.featheredKnifeRitual=フェザーナイフã®å„€å¼ -ritual.bloodmagic.regenerationRitual=å†ç”Ÿã®å„€å¼ -ritual.bloodmagic.harvestRitual=åŽç©«æœˆã®å„€å¼ -ritual.bloodmagic.magneticRitual=ç£åŠ›ã®å„€å¼ -ritual.bloodmagic.crushingRitual=粉砕者ã®å„€å¼ -ritual.bloodmagic.fullStomachRitual=飽食ã®å„€å¼ -ritual.bloodmagic.interdictionRitual=排除ã®å„€å¼ -ritual.bloodmagic.containmentRitual=幽閉ã®å„€å¼ -ritual.bloodmagic.speedRitual=風ã®å„€å¼ -ritual.bloodmagic.suppressionRitual=除去ã®å„€å¼ -ritual.bloodmagic.expulsionRitual=追放ã®ã‚ªãƒ¼ãƒ© -ritual.bloodmagic.zephyrRitual=ゼファーã®å‘¼ã³å£° -ritual.bloodmagic.upgradeRemoveRitual=浄霊ã®èª¿ã¹ -ritual.bloodmagic.armourEvolveRitual=生体進化ã®å„€å¼ -ritual.bloodmagic.animalGrowthRitual=牧羊ã®å„€å¼ -ritual.bloodmagic.forsakenSoulRitual=見放ã•ã‚ŒãŸé­‚ã®è’集 -ritual.bloodmagic.crystalHarvestRitual=欠ã‘ãŸçµæ™¶ã®ç²‰ç • -ritual.bloodmagic.meteorRitual=崩壊ã™ã‚‹å¡”ã®å° - -ritual.bloodmagic.cobblestoneRitual=ル・ヴォルカノス・フィギュス -ritual.bloodmagic.placerRitual=設置充填ã®å„€å¼ -ritual.bloodmagic.fellingRitual=木ã“ã‚Šã®ç²‰ç • -ritual.bloodmagic.pumpRitual=サイフォンã®è®ƒæ­Œ -ritual.bloodmagic.altarBuilderRitual=高ä½ç¥­å£‡æ§‹ç¯‰å„€å¼ -ritual.bloodmagic.portalRitual=組ã¿è¾¼ã¿ã‚²ãƒ¼ãƒˆ -ritual.bloodmagic.downgradeRitual=é‡ãé­‚ã®æ‡ºæ‚” - -ritual.bloodmagic.waterRitual.info=マスター儀å¼çŸ³ã‹ã‚‰æ°´æºã‚’生æˆã—ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.info=マスター儀å¼çŸ³ã‹ã‚‰æº¶å²©æºã‚’生æˆã—ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.default.info=(原生) 溶岩ã®ç”ŸæˆLPコストを下ã’ã€ãƒªãƒ³ã‚¯ã•ã›ãŸå®¹å™¨ã«æº¶å²©ã‚’注ãŽè¾¼ã¿ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.corrosive.info=(è…食性) 範囲内ã«ã„る生物ã®ã†ã¡ã€ç«ç‚Žè€æ€§ã‚’æŒã¤ã‚‚ã®ã«æ·±åˆ»ãªãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.destructive.info=(破壊性) ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦æº¶å²©ã®è¨­ç½®ç¯„囲ãŒæ‹¡å¤§ã—ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.vengeful.info=(報復性) 範囲内ã®ç”Ÿç‰©ã«å¯¾ã—ã¦ç«ç‚Žã¸ã®æŠµæŠ—を付与ã—ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.steadfast.info=(ä¸æ´»æ€§) 指定ã—ãŸç¯„囲内ã«ã„るプレイヤーã«å¯¾ã—ã¦ç«ç‚Žè€æ€§ã‚’付与ã—ã¾ã™ã€‚ - -ritual.bloodmagic.greenGroveRitual.info=エリア内ã®ä½œç‰©ã‚’æˆé•·ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.jumpRitual.info=空中ã«ã¯ã­é£›ã¶åŠ¹æžœã‚’付与ã—ã¾ã™ã€‚ -ritual.bloodmagic.wellOfSufferingRitual.info=生物ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã‚¨ãƒªã‚¢ã‚’生æˆã—ã€ä»˜è¿‘ã®è¡€ã®ç¥­å£‡ã«LPを供給ã—ã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.info=プレイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã‚¨ãƒªã‚¢ã‚’生æˆã—ã€ä»˜è¿‘後ã®ç¥­å£‡ã«LPを供給ã—ã¾ã™ã€‚ -ritual.bloodmagic.regenerationRitual.info=エリア内ã«HPãŒæ¸›å°‘ã—ã¦ã„る生物ãŒã„ãŸå ´åˆã€å†ç”Ÿèƒ½åŠ›ã‚’付与ã—ã¾ã™ã€‚ -ritual.bloodmagic.regenerationRitual.default.info=(原生) -ritual.bloodmagic.regenerationRitual.corrosive.info=(è…食性) 範囲内ã«ã„るプレイヤー以外ã®ç”Ÿç‰©ã‹ã‚‰ç”Ÿå‘½åŠ›ã‚’奪ã„ã€ãƒ—レイヤーを治癒ã—ã¾ã™ã€‚ -ritual.bloodmagic.regenerationRitual.destructive.info=(破壊性) -ritual.bloodmagic.regenerationRitual.vengeful.info=(報復性) -ritual.bloodmagic.regenerationRitual.steadfast.info=(ä¸æ´»æ€§) -ritual.bloodmagic.harvestRitual.info=エリア内ã®ä½œç‰©ã‚’刈りå–ã‚Šã€ç¨®ãªã©ã®åŽç©«ç‰©ãŒã‚ã£ãŸå ´åˆã¯æ¤ãˆç›´ã—ã¾ã™ã€‚ -ritual.bloodmagic.magneticRitual.info=地中ã‹ã‚‰é‰±çŸ³ã‚’掘り起ã“ã—ã€æŒ‡å®šã‚¨ãƒªã‚¢ã«ä¸¦ã¹ã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.info=指定エリアã®ãƒ–ロックを破壊ã—ã€åŽé›†ç‰©ã‚’リンクã—ã¦ã„ã‚‹ãƒã‚§ã‚¹ãƒˆã«æ ¼ç´ã—ã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.destructive.info=(破壊性) ブロックを強制的ã«ç ´å£Šã—ã¾ã™ï¼šç ´å£Šã—ãŸå…¨ã¦ã®ãƒ–ロックã¯å¹¸é‹IIIã®åŠ¹æžœãŒé©ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.steadfast.info=(ä¸æ´»æ€§) å…¨ã¦ã®ãƒ–ロックã¯ã‚·ãƒ«ã‚¯ã‚¿ãƒƒãƒã«ã‚ˆã£ã¦ç ´å£Šã•ã‚Œã¾ã™ã€‚幸é‹ã®åŠ¹æžœã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.corrosive.info=(è…食性) å…¨ã¦ã®ãƒ–ロックã¯åˆ‡å‰Šæ¶²ã§ç ´å£Šã•ã‚Œã¾ã™ã€‚シルクタッãƒã®åŠ¹æžœã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.vengeful.info=(報復性) å¯èƒ½ã§ã‚ã‚Œã°ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®åœ§ç¸®ã‚’試ã¿ã¾ã™ã€‚1回ã®å‹•ä½œã§ä¸€åº¦ã®åœ§ç¸®ã—ã‹è¡Œã‚ã‚Œã¾ã›ã‚“。 -ritual.bloodmagic.crushingRitual.default.info=(原生) ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€å„€å¼ã®é€Ÿåº¦ãŒå‘上ã—ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.corrosive.info=(è…食性) 作物ã®å‘¨å›²ã«ã„る生物ã¯æ”»æ’ƒã‚’å—ã‘ã€ç”Ÿå‘½åŠ›ãŒä½œç‰©ã«å¸åŽã•ã‚Œã‚‹ã€‚ -ritual.bloodmagic.greenGroveRitual.default.info=(原生) オーラ中ã®ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦å…¨ã¦ã®å„€å¼ã®ä½œå‹•é€Ÿåº¦ãŒå‘上ã—ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.vengeful.info=(報復性) Tick当ãŸã‚Šã®æˆé•·ã®æˆåŠŸçŽ‡ãŒå¢—加ã—ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.steadfast.info=(ä¸æ´»æ€§) 種をæ¤ãˆç›´ã—ã€æ½…水範囲ã«ã‚るブロックを湿らã›ã‚‹ã€‚ -ritual.bloodmagic.greenGroveRitual.destructive.info=(破壊性) ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€æˆé•·ã•ã›ã‚‹ç¯„囲ãŒæ‹¡å¤§ã—ã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.default.info=(原生) オーラ中ã®ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€å„€å¼ã®é€Ÿåº¦ãŒå‘上ã—ã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.destructive.info=(破壊性) オーラ中ã®ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€å„€å¼ã«ã‚ˆã‚‹åŽé›†é‡ã‚’増やã—ã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.vengeful.info=(報復性) 犠牲ã«ã™ã‚‹HPã®æœ€ä½Žå€¤ã‚’10%%ã¾ã§ã«ã—ã¾ã™ã€‚所有者ãŒä¸æ´»æ€§ãŒæœ‰åŠ¹ã«ã—ã¦ã„ã‚‹ã¨ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.corrosive.info=(è…食性) ãŠé¦™ã«ã‚ˆã‚‹åŠ¹æžœå¢—大を有効ã«ã—ã¾ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.steadfast.info=(ä¸æ´»æ€§) 犠牲ã«ã™ã‚‹HPã®æœ€ä½Žå€¤ã‚’30%%ã‹ã‚‰70%%ã«ã—ã¾ã™ã€‚ -ritual.bloodmagic.speedRitual.default.info=(原生) オーラ中ã®ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€å°„出速度ãŒä¸Šæ˜‡ã—ã¾ã™ã€‚ -ritual.bloodmagic.speedRitual.vengeful.info=(報復性) 大人ã®ç”Ÿç‰©ã‚„プレイヤーを移動ã•ã›ã¾ã™ã€‚破壊性も利用ã—ã¦ã„ãŸå ´åˆã¯ãƒ—レイヤーを移動ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.speedRitual.destructive.info=(破壊性) å­ä¾›ã®ç”Ÿç‰©ã‚„プレイヤーを移動ã•ã›ã¾ã™ã€‚報復性も利用ã—ã¦ã„ãŸå ´åˆã¯ãƒ—レイヤーを移動ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.animalGrowthRitual.vengeful.info=(報復性) 大人ãŒå†ã³ç¹æ®–ã™ã‚‹ã¾ã§ã®æ™‚間を短縮ã™ã¾ã™ã€‚ -ritual.bloodmagic.animalGrowthRitual.steadfast.info=(ä¸æ´»æ€§) 関連付ã‘られãŸãƒã‚§ã‚¹ãƒˆå†…ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’用ã„ã¦ã€ã‚¨ãƒªã‚¢å†…ã®å¤§äººã‚’自動的ã«ç¹æ®–ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.animalGrowthRitual.default.info=(原生) オーラ中ã®ç·ã‚¦ã‚£ãƒ«é‡ã«å¿œã˜ã¦ã€å„€å¼ã®é€Ÿåº¦ãŒå‘上ã—ã¾ã™ã€‚ -ritual.bloodmagic.animalGrowthRitual.destructive.info=(破壊性) é•·ã„é–“ç¹æ®–ã‚’è¡Œã£ã¦ã„ãªã„大人ã¯ã€MOBã«å‘ã‹ã£ã¦ã„ã爆発ã™ã‚‹ã€‚ -ritual.bloodmagic.animalGrowthRitual.corrosive.info=(è…食性) Unimplemented. - -ritual.bloodmagic.fullStomachRitual.info=リンクã—ã¦ã„ã‚‹ãƒã‚§ã‚¹ãƒˆå†…ã«ã‚る食料をã€æº€è…¹ã§ãªã„プレイヤーã«è‡ªå‹•çš„ã«ä¾›çµ¦ã—ã¾ã™ã€‚ -ritual.bloodmagic.interdictionRitual.info=マスター儀å¼çŸ³ã®ä¸€å®šã‚¨ãƒªã‚¢å†…ã®ç”Ÿç‰©ã‚’排除ã—ã¦ä¾µå…¥ã§ããªã„よã†ã«ã—ã¾ã™ã€‚ -ritual.bloodmagic.containmentRitual.info=エリア内ã®ç”Ÿç‰©ã‚’スター儀å¼çŸ³ã®å‘¨å›²ã«å¼•ã寄ã›ã¾ã™ã€‚ -ritual.bloodmagic.speedRitual.info=矢å°çŠ¶ã®å„€å¼çŸ³ã®æ–¹å‘ã¸ã€ãƒ—レイヤーを射出ã—ã¾ã™ã€‚ -ritual.bloodmagic.suppressionRitual.info=ã‚らゆるæµä½“元を除去ã—ã¾ã™ - å„€å¼ã®å‹•ä½œã‚’åœæ­¢ã™ã‚‹ã¨æ¶²ä½“ã¯æˆ»ã£ã¦ãる。 -ritual.bloodmagic.expulsionRitual.info=å„€å¼ã®è¨­ç½®è€…ã‹ã€ãƒžã‚¹ã‚¿ãƒ¼å„€å¼çŸ³ã®ä¸Šã®ãƒã‚§ã‚¹ãƒˆã«å¥‘約済ã¿ãƒ–ラッドオーブã®ã‚’入れãŸãƒ—レイヤー以外を所定エリアã‹ã‚‰æŽ’除ã—ã¾ã™ã€‚ -ritual.bloodmagic.zephyrRitual.info=エリア内ã®ãƒ‰ãƒ­ãƒƒãƒ—アイテムをåŽé›†ã—ã€ãƒªãƒ³ã‚¯ã•ã‚ŒãŸãƒã‚§ã‚¹ãƒˆã«åŽç´ã—ã¾ã™ã€‚ -ritual.bloodmagic.upgradeRemoveRitual.info=Undocumented. -ritual.bloodmagic.armourEvolveRitual.info=Undocumented. -ritual.bloodmagic.animalGrowthRitual.info=エリア内ã«ã„ã‚‹å­ä¾›ç”Ÿç‰©ã®æˆé•·é€Ÿåº¦ã‚’æ—©ã‚ã¾ã™ã€‚ -ritual.bloodmagic.forsakenSoulRitual.info=エリア内ã®ç”Ÿç‰©ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã€ç”Ÿç‰©ãŒæ­»ã‚“ã æ™‚ã«ã‚¦ã‚£ãƒ«ã‚’回åŽã—ã¦ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶ã‚’æˆé•·ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.crystalHarvestRitual.info=範囲内ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶æ ªã‚’破壊ã—ã¦ã‚¦ã‚£ãƒ«çµæ™¶ã«ã—ã¦ãƒ‰ãƒ­ãƒƒãƒ—ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.placerRitual.info=リンクã—ã¦ã„ã‚‹ãƒã‚§ã‚¹ã®ä¸­ã‹ã‚‰ãƒ–ロックã¨ã—ã¦è¨­ç½®å¯èƒ½ãªã‚‚ã®ã‚’å–り出ã—ã€éš™é–“ãªã設置ã—ã¾ã™ã€‚ -ritual.bloodmagic.fellingRitual.info=ã“ã®å„€å¼ã¯æ¨™æº–çš„ãªæœ¨æä¼æŽ¡è£…ç½®ã¨ã—ã¦å‹•ä½œã—ã€ã‚¨ãƒªã‚¢å†…ã®ã™ã¹ã¦ã®åŽŸæœ¨åŠã³è‘‰ã‚’ä¼æŽ¡ãŠã‚ˆã³æŽ¡å–ã—ã¾ã™ã€‚ -ritual.bloodmagic.pumpRitual.info=設定エリアã‹ã‚‰æµä½“ã‚’å¸ã„出ã—ã€1ãƒã‚±ãƒ„分以上ã®å®¹é‡ãŒã‚ã‚‹æµä½“タンクã¸ã¨ä¾›çµ¦ã—ã¾ã™ã€‚ -ritual.bloodmagic.altarBuilderRitual.info=マスター儀å¼çŸ³ã¨ãƒªãƒ³ã‚¯ã—ã¦ã„ã‚‹ãƒã‚§ã‚¹ãƒˆã®ä¸­èº«ã‚’使用ã—ã¦è¡€ã®ç¥­å£‡ã‚’構築ã—ã¾ã™ã€‚ -ritual.bloodmagic.portalRitual.info=作æˆã—èµ·å‹•ã•ã›ã‚‹ã¨åŒæ™‚ã«å‘¨å›²ã®ãƒ–ロックæ質を固有ã®â€ã‚­ãƒ¼â€ã¨ã™ã‚‹ãƒãƒ¼ã‚¿ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’構築ã—ã¾ã™ã€‚周囲ブロックã®å¤‰æ›´ã¯èµ·å‹•å¾Œã§ã‚‚å¯èƒ½ã§ã‚ã‚Šã€ãƒãƒ¼ã‚¿ãƒ«ã¯åŒã˜ã‚­ãƒ¼åŒå£«ã‚’リンクã—ã¾ã™ã€‚ -ritual.bloodmagic.meteorRitual.info=範囲内ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’消費ã—ã€ç©ºã‹ã‚‰è³‡æºã«å¯Œã‚“ã éš•çŸ³ã‚’å„€å¼ã«ç›´æ’ƒã•ã›ã‚‹ã‚ˆã†ã«å¬å–šã—ã¾ã™ã€‚ - -ritual.bloodmagic.waterRitual.waterRange.info=(æ°´) 設定ã—ãŸã‚¨ãƒªã‚¢ã«æ°´æºã‚’生æˆã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.lavaRange.info=(溶岩) 設定ã—ãŸã‚¨ãƒªã‚¢ã«æº¶å²©æºã‚’生æˆã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.lavaTank.info=(原生) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿæˆã—ãŸæº¶å²©ã‚’入れるタンク。 -ritual.bloodmagic.lavaRitual.fireFuse.info=(報復性) 範囲内ã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã¯ç‚Žã«ã‚ˆã£ã¦è‹¦ã—ã‚られã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.fireResist.info=(ä¸æ´»æ€§) 範囲内ã®ãƒ—レイヤーã¯ç«ç‚Žè€æ€§ã®åŠ¹æžœã‚’与ãˆã¾ã™ã€‚ -ritual.bloodmagic.lavaRitual.fireDamage.info=(è…食性) 範囲内ã«ã„ã‚‹ç«ç‚Žè€æ€§ã‚’æŒã¤ç”Ÿç‰©ã¯ã‚¦ã‚£ãƒ«é‡ã«æ¯”例ã—ãŸãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.growing.info=(æˆé•·) 設定ã—ãŸã‚¨ãƒªã‚¢å†…ã®æ¤ç‰©ã®æˆé•·ã‚’促進ã•ã›ã¾ã™ã€‚ -ritual.bloodmagic.greenGroveRitual.leech.info=(è…食性) 作物ã®æˆé•·ã®ãŸã‚ã«å‘¨è¾ºã®ç”Ÿç‰©ã¯ç”Ÿå‘½åŠ›ã‚’å¸åŽã•ã‚Œã‚‹ã€‚ -ritual.bloodmagic.greenGroveRitual.hydrate.info=(ä¸æ´»æ€§) 範囲内ã®è€•ã—ãŸãƒ–ロックを湿らã›ã€ã‚¨ãƒªã‚¢å‘¨è¾ºã«ã‚る種å­ã‚’æ¤ãˆä»˜ã‘る。 -ritual.bloodmagic.jumpRitual.jumpRange.info=(è·³èº) 設定ã—ãŸã‚¨ãƒªã‚¢å†…ã«å±…る生物を空中ã«é£›ã³ä¸ŠãŒã‚‰ã›ã¾ã™ã€‚ -ritual.bloodmagic.wellOfSufferingRitual.altar.info=(祭壇) å„€å¼ãŒè¡€ã®ç¥­å£‡ã‚’検索ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’指定ã—ã¾ã™ã€‚変更ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ¤œç´¢ã‚¨ãƒªã‚¢ã‚’拡大ã—ãŸã‚Šç‰¹å®šã®é ˜åŸŸã«åˆ¶é™ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ -ritual.bloodmagic.wellOfSufferingRitual.damage.info=(ダメージ) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿç‰©ãŒç¶™ç¶šãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘るエリアを設定ã—ã¾ã™ã€‚ã“ã®ç¯„囲内ã«å±…ã‚‹ã™ã¹ã¦ã®ç”Ÿç‰©ã¯å¾ã€…ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘続ã‘ã‚‹(プレイヤーを除ã)。 -ritual.bloodmagic.featheredKnifeRitual.altar.info=(祭壇)儀å¼ãŒè¡€ã®ç¥­å£‡ã‚’検索ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’指定ã—ã¾ã™ã€‚変更ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šæ¤œç´¢ã‚¨ãƒªã‚¢ã‚’拡大ã—ãŸã‚Šç‰¹å®šã®é ˜åŸŸã«åˆ¶é™ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ -ritual.bloodmagic.featheredKnifeRitual.damage.info=(ダメージ) å„€å¼ã«ã‚ˆã£ã¦ãƒ—レイヤーãŒç¶™ç¶šãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘るエリアを設定ã—ã¾ã™ã€‚ã“ã®ç¯„囲内ã«å±…るプレイヤーã¯æ­»ã¬ä¸€æ­©æ‰‹å‰ã¾ã§å¾ã€…ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘続ã‘る。 -ritual.bloodmagic.regenerationRitual.heal.info=(回復) 範囲内ã«å±…る生物ã¯å†ç”Ÿèƒ½åŠ›ã®åŠ¹æžœã‚’与ãˆã¾ã™ã€‚ -ritual.bloodmagic.regenerationRitual.vampire.info=(å¸è¡€ä¸»ç¾©) 範囲内ã«ã„る生物ã¯ãƒ—レイヤーã®å›žå¾©ã®ãŸã‚ã«ç”Ÿå‘½åŠ›ãŒå‰Šã‚‰ã‚Œã¦ã„ãã¾ã™ã€‚ -ritual.bloodmagic.harvestRitual.harvestRange.info=(åŽç©«) 範囲内ã®æ¤ç‰©ã‚’åŽç©«ã—ã¾ã™ã€‚ -ritual.bloodmagic.magneticRitual.placementRange.info=(é…ç½®) å„€å¼ã¯ã“ã®ã‚¨ãƒªã‚¢ã«æ‰‹ã«å…¥ã‚ŒãŸé‰±çŸ³ã‚’é…ç½®ã—ã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.crushingRange.info=(粉砕) å„€å¼ã¯ã“ã®ã‚¨ãƒªã‚¢å†…ã®ãƒ–ロックを破壊ã—ã¦å…¥æ‰‹ã—ã¾ã™ã€‚ -ritual.bloodmagic.crushingRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) å„€å¼ãŒç ´å£Šã—ãŸãƒ–ロックを格ç´ã™ã‚‹ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®å ´æ‰€ã€‚ -ritual.bloodmagic.fullStomachRitual.fillRange.info=(補給) å„€å¼ãŒãƒ—レイヤーã«é£Ÿæ–™ã‚’供給ã™ã‚‹ç¯„囲。 -ritual.bloodmagic.fullStomachRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) å„€å¼ãŒãƒ—レイヤーã«ä¾›çµ¦ã™ã‚‹ãŸã‚ã®é£Ÿæ–™ã‚’å–り出ã™ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®å ´æ‰€ã€‚ -ritual.bloodmagic.interdictionRitual.interdictionRange.info=(排除) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿç‰©ãŒå¼¾ã飛ã°ã•ã‚Œã‚‹ç¯„囲。ã™ã¹ã¦ã®ç”Ÿç‰©ã¯ã“ã®è¨­å®šã‚¨ãƒªã‚¢ã«é–¢ä¿‚ãªãマスター儀å¼çŸ³ã‹ã‚‰å¼¾ã飛ã°ã•ã‚Œã‚‹ã€‚ -ritual.bloodmagic.containmentRitual.containmentRange.info=(幽閉) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿç‰©ãŒå¼•ã寄ã›ã‚‰ã‚Œã‚‹ç¯„囲。ã™ã¹ã¦ã®ç”Ÿç‰©ã¯ã“ã®è¨­å®šã‚¨ãƒªã‚¢ã«é–¢ä¿‚ãªãマスター儀å¼çŸ³ã®æ–¹ã¸ã¨å¼•ã寄ã›ã‚‰ã‚Œã‚‹ã€‚ -ritual.bloodmagic.speedRitual.sanicRange.info=(加速) 設定ã—ãŸã‚¨ãƒªã‚¢å†…ã®ã™ã¹ã¦ã®ç”Ÿç‰©ãŒçŸ¢å°ã®æ–¹å‘ã¸ã¨å°„出ã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.suppressionRitual.suppressionRange.info=(除去) 範囲内ã®ã™ã¹ã¦ã®æ¶²ä½“ãŒæŠ¼ã—ã®ã‘られã¾ã™ã€‚ -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(追放) -ritual.bloodmagic.zephyrRitual.zephyrRange.info=(å¸å¼•) 設定範囲内ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒåŽé›†ã•ã‚Œã€ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã‚‹ãƒã‚§ã‚¹ãƒˆã«åŽç´ã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.zephyrRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) å„€å¼ãŒåŽé›†ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’åŽç´ã™ã‚‹ãŸã‚ã®ãƒã‚§ã‚¹ãƒˆã®å ´æ‰€ã€‚ -ritual.bloodmagic.animalGrowthRitual.growing.info=(æˆé•·) 範囲内ã®å‹•ç‰©ãŒã¨ã¦ã‚‚æ—©ãæˆé•·ã—ã¾ã™ã€‚ -ritual.bloodmagic.animalGrowthRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) ç¹æ®–ã•ã›ã‚‹ãŸã‚ã®é©åˆ‡ãªé¤Œã‚’入れãŸãƒã‚§ã‚¹ãƒˆã®å ´æ‰€ã€‚ -ritual.bloodmagic.forsakenSoulRitual.crystal.info=(çµæ™¶) å„€å¼ã«ã‚ˆã£ã¦ç”Ÿç‰©ãŒæ­»äº¡ã—ãŸéš›ã«ã€ã“ã®ç¯„囲内ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶ã®æˆé•·ãŒä¿ƒé€²ã—ã¾ã™ã€‚ -ritual.bloodmagic.forsakenSoulRitual.damage.info=(ダメージ) ã“ã®ç¯„囲内ã®ç”Ÿç‰©ã¯å¾ã€…ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã€æ­»äº¡ã—ãŸéš›ã®ã‚¦ã‚£ãƒ«ãŒã‚¯ãƒªã‚¹ã‚¿ãƒ«ã®æˆé•·ã«åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚ -ritual.bloodmagic.crystalHarvestRitual.crystal.info=(çµæ™¶) æžå‡ºã—ãŸå…¨ã¦ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚¦ã‚£ãƒ«çµæ™¶æ ªã‚’破壊ã—ã¦å˜çµæ™¶ã®çµæ™¶ã«ã—ã¾ã™ã€‚çµæ™¶æ ªãŒ1ã¤ã ã‘ã«ãªã£ãŸå ´åˆã¯ç ´å£Šã—ãªã„。 - -ritual.bloodmagic.placerRitual.placerRange.info=(場所) å„€å¼ãŒè¨­å®šç¯„囲ã«ãƒ–ロックを設置ã—ã¾ã™ã€‚ -ritual.bloodmagic.placerRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) å„€å¼ãŒãƒ–ロックを設置ã™ã‚‹ãŸã‚ã«ã€ãƒ–ロックをå–り出ã™ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®å ´æ‰€ã€‚ -ritual.bloodmagic.fellingRitual.fellingRange.info=(ä¼æŽ¡) å„€å¼ãŒä¼æŽ¡ã™ã‚‹ãŸã‚ã®åŽŸæœ¨ã‚„葉を探ã™ç¯„囲。 -ritual.bloodmagic.fellingRitual.chest.info=(ãƒã‚§ã‚¹ãƒˆ) å„€å¼ãŒè’集物を格ç´ã™ã‚‹ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®å ´æ‰€ã€‚ -ritual.bloodmagic.pumpRitual.pumpRange.info=(ãƒãƒ³ãƒ—) å„€å¼ãŒæŽ¡å–ã™ã‚‹ãŸã‚ã®æ¶²ä½“を探ã™ç¯„囲。 - -ritual.bloodmagic.downgradeRitual.dialogue.bow.1=ã•ã¦äººé–“よã€æ›´ãªã‚‹åŠ›ãŒæ¬²ã—ã„ã‹...? -ritual.bloodmagic.downgradeRitual.dialogue.bow.100=ã‚‚ã¡ã‚ん知ã£ã¦ã„ã‚‹ã ã‚ã†ãŒã€ä½•äº‹ã«ã‚‚対価ãŒå¿…è¦ã§ã‚ã‚‹... 何らã‹ã®ä»£å„Ÿã‚’支払ã†ã“ã¨ãªãã€ç§ã¯ãŠå‰ã«æ›´ãªã‚‹åŠ›ã‚’与ãˆã‚‹è¨³ã«ã¯ã„ã‹ãªã„ã®ã ... -ritual.bloodmagic.downgradeRitual.dialogue.bow.300=ç§ã®å‰ã«ä¾›ç‰©ã‚’å·®ã—出ã™ã“ã¨ã§ãŠå‰ã¯æ„Ÿè¦šã‚’失ã„ã€é•·è·é›¢ã®æŠ•æ“²ç‰©ã‚’命中ã•ã›ã‚‹ã“ã¨ãŒã§ããªããªã‚‹ã ã‚ã†ã€‚弓矢ãŒå‹åˆ©ã®éµãŸã‚Šå¾—ã‚‹ã“ã¨ã¯ã€ã‚‚ã¯ã‚„ãªã„ã®ã ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.bow.500=ã ãŒãã®è¦‹è¿”ã‚Šã¨ã—ã¦ã€ç§ã¯ã•ã‚‰ãªã‚‹æˆé•·ã‚’ã‚‚ãŸã‚‰ã™ãŸã‚ã«ãŠå‰ã®éŽ§ã‚’解放ã—よã†... ãŠå‰ãŒã™ã¹ã事ã¯ä¾›ç‰©ã‚’æ§ã’ã€ã“ã®ç¥­å£‡ã«è·ªãã“ã¨ã ... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.1=フフフ... ã”ãã’んよã†ã€‚ より強力ãªåŠ›ã‚’欲ã—ã¦ã„るよã†ã ãªã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.quenched.100=ã„ã£ã±ã„ã«ãªã£ãŸæ¯ã‚’å†ã³æ³¨ãŽç›´ã™ã«ã¯ã€å¿…ãšä¸€åº¦ç©ºã«ã™ã‚‹å¿…è¦ãŒã‚る。ã“ã‚Œã¯ãŠå‰ã«ã‚‚å分ç†è§£ã§ãã‚‹ã ã‚ã†ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.quenched.300=次ã®ã‚ˆã†ãªå–引をæŒã¡ã‹ã‘よã†ï¼šé£²ã‚€ã“ã¨ã«ã‚ˆã‚ŠæŠ€èƒ½ã‚’ã²ã¨ã¤å¤±ã„ã€ç§ã¯ãŠå‰ã«èŽ«å¤§ãªæ½œåœ¨èƒ½åŠ›ã‚’与ãˆã‚ˆã†ã€‚ã—ã‹ã—ãªãŒã‚‰ã€ã“ã®å–引ãŒãŠå‰ã«ã¨ã£ã¦ä¾¡å€¤ã‚ã‚‹ã‚‚ã®ã§ã‚ã‚‹ã‹ã©ã†ã‹ã¯å®Œå…¨ã«åˆ¥ã®å•é¡Œã ... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.500=ã•ã‚è·ªã‘ã€äººé–“よ。ãã—ã¦ç§ãŒæŽˆã‘ãŸæ¯ã‚’飲ã¿å¹²ã™ãŒã„ã„。ãŠãらããã‚Œã¯ãŠå‰ã«ã¨ã£ã¦ã®æœ€å¾Œã®ä¸€æ¯ã¨ãªã‚ã†ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.1=ãµã†ã‚€... ãŠå‰ã®æœ¬å½“ã®æœ›ã¿ã¯ä½•ãªã®ã ï¼Ÿ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.100=ã‚‚ã—死を超越ã—ãŸäººé–“ãªã‚‰ã°ã€ç§ã¯ãŠå‰ã¨å–引をã™ã‚‹ã“ã¨ã¯ã§ããªã„─ ãã®ä»£ã‚ã‚Šã«åˆ¥ã®å–引をæ示ã™ã‚‹ã“ã¨ã¯ã§ãã‚‹... -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.300=ãŸã ã—ã€ç§ã¯ãŠå‰ã«ä½•ã‹ã—らã®ä»£å„Ÿã‚’è¦æ±‚ã—よã†ï¼šãŠå‰ã®ç‰©ç†çš„ãªæˆ¦é—˜èƒ½åŠ›ã ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.500=ã“ã‚Œã«å¥‘ç´„ã™ã‚‹ã“ã¨ã§ã€ã‚‚ã¯ã‚„ãŠå‰ã¯ç¢ºå®Ÿã«æ­¦å™¨ã‚’振るãˆãªããªã‚Šã€ä»¥å‰ã«æŒ¯ã‚‹ãˆã¦ã„ãŸãƒ€ãƒ¡ãƒ¼ã‚¸ã®ã»ã‚“ã®åƒ…ã‹ã—ã‹ä¸Žãˆã‚‹ã“ã¨ãŒã§ããªããªã‚‹ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.700=ã•ã‚ã€ãŠå‰ã®é¸æŠžæ¬¡ç¬¬ã ï¼šç¥­å£‡ã«è·ªãã‹ã€å·±ã®å‰£ã‚’執り続ã‘ã‚‹ã®ã‹ï¼Ÿ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.1=用心ã—ãŸã¾ãˆã€äººé–“よ。ãŠå‰ã®åœ°ç›¤ã¯å´©ã‚Œè¡Œãã“ã¨ã«ãªã‚‹ã ã‚ã†ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=ç§ã¯æˆ‘ãŒåŒè¼©ãŸã¡ã¨ã¯ç•°ãªã‚‹ã€‚ãŠå‰ã®ç”Ÿå‘½ã‚’扱ã†é­”術師ã¨ã—ã¦ã€ãŠå‰ã®æœ›ã¿ã‚’å¶ãˆã‚‹ãŸã‚ã®æã‚ã—ã„契約をæä¾›ã—よã†ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.300=ãŠå‰ã®æ€ªæˆ‘ã¯ã„ãšã‚Œç™’ãˆã‚‹ã“ã¨ã ã‚ã†ã€‚ã—ã‹ã—ç§ã®â€åŠ è­·â€ã‚’å—ã‘ã—者ã¯ãã‚ŒãŒé…·ãゆã£ãŸã‚Šã¨ã—ãŸã‚‚ã®ã«ãªã‚‹ã€‚戦場ã§å‚·ã‚’è² ãˆã°ãŠå‰ã‚’ã•ã‚‰ã«æ‚©ã¾ã›ã‚‹ã“ã¨ã ã‚ã†ã€‚ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.500=挑むå‰ã«ã‚ˆãよã考ãˆãŸã¾ãˆã€‚ã²ã¨ãŸã³ç©ºã«ã—ã¦ã—ã¾ã£ãŸæ¯ã‚’ã€å†ã³æº€ãŸã™ã“ã¨ã¯ä¸å¯èƒ½ãªã®ã ã‹ã‚‰... - -# Chat -chat.bloodmagic.altarMaker.setTier=グレードを設定: %d -chat.bloodmagic.altarMaker.building=グレード %dã®ç¥­å£‡ã‚’ä½œæˆ -chat.bloodmagic.altarMaker.destroy=グレード %dã®ç¥­å£‡ã‚’破壊 -chat.bloodmagic.altarMaker.creativeOnly=ã“ã‚Œã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–モード専用アイテムã§ã™ã€‚ - -chat.bloodmagic.damageSource=%sã®é­‚ã¯éžå¸¸ã«å¼±ããªã£ã¦ã„ã¾ã™ - -chat.bloodmagic.ritual.weak=エãƒãƒ«ã‚®ãƒ¼ã®æµã‚ŒãŒæ„Ÿã˜ã‚‰ã‚Œã‚‹ãŒã€å„€å¼ã®èµ·å‹•ã«ã¯ä½•ã‹ãŒè¶³ã‚Šãªã„よã†ã ã€‚ -chat.bloodmagic.ritual.prevent=å„€å¼ãŒã‚ãªãŸã«æ¿€ã—ã抵抗ã—ã¦ã„ã‚‹ï¼ -chat.bloodmagic.ritual.activate=エãƒãƒ«ã‚®ãƒ¼ã®å¥”æµãŒå„€å¼ã«æµã‚Œè¾¼ã‚€ï¼ -chat.bloodmagic.ritual.notValid=ã‚ãªãŸã¯ãƒ«ãƒ¼ãƒ³ã®é…ç½®ãŒæ­£ã—ããªã„よã†ã«æ„Ÿã˜ãŸ... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=ã‚ãªãŸã¯è‰¯ã„効果を感ã˜ãŸï¼ -chat.bloodmagic.livingArmour.upgrade.fireRemove=&6清涼感ãŒã‚ãªãŸã‚’包ã¿è¾¼ã¿ã€ç‚Žä¸ŠãŒåŽã¾ã£ãŸã€‚ -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6é—‡ã®åŠ›ãŒã‚ãªãŸã‚’æ­»ã®æ·µã‹ã‚‰å¼•ã寄ã›ã‚‹ï¼ -chat.bloodmagic.livingArmour.newUpgrade=&4強化ãƒã‚¤ãƒ³ãƒˆã‚’å–å¾—ã—ã¾ã—ãŸï¼ - -chat.bloodmagic.routing.remove=記録ã•ã‚ŒãŸåº§æ¨™æƒ…報を消去ã—ã¾ã—㟠-chat.bloodmagic.routing.set=ノードã®åº§æ¨™ã‚’設定ã—ã¾ã—㟠-chat.bloodmagic.routing.link.master=マスターã®ãƒŽãƒ¼ãƒ‰ã¨ãƒªãƒ³ã‚¯ã•ã›ã¾ã—ãŸï¼ -chat.bloodmagic.routing.link=ノードをãŠäº’ã„ã«ãƒªãƒ³ã‚¯ã•ã›ã¾ã—㟠- -chat.bloodmagic.altar.comp.glowstone=グロウストーンã®ãƒ–ロック -chat.bloodmagic.altar.comp.bloodstone=大ããªãƒ–ラッドストーンレンガ -chat.bloodmagic.altar.comp.beacon=ビーコン -chat.bloodmagic.altar.comp.bloodrune=è¡€ã®ãƒ«ãƒ¼ãƒ³ -chat.bloodmagic.altar.comp.crystal=未実装ã®ã‚¢ã‚¤ãƒ†ãƒ  -chat.bloodmagic.altar.comp.notair=固体ブロック - -chat.bloodmagic.altar.nextTier=次ã®ã‚°ãƒ¬ãƒ¼ãƒ‰ã®è¡€ã®ç¥­å£‡ã«ã™ã‚‹ã«ã¯%sãŒ%sã®å ´æ‰€ã«ä¸è¶³ã—ã¦ã„ã¾ã™ã€‚ - -chat.bloodmagic.mimic.potionSet=ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’設置ã—ã¾ã—ãŸã€‚ -chat.bloodmagic.mimic.potionRemove=ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’無効化ã—ã¾ã—ãŸã€‚ -chat.bloodmagic.mimic.potionInterval.up=ãƒãƒ¼ã‚·ãƒ§ãƒ³ç”Ÿæˆã®æ™‚間間隔を以下ã«å¢—加ã—ã¾ã—ãŸ: %d tick -chat.bloodmagic.mimic.potionInterval.down=ãƒãƒ¼ã‚·ãƒ§ãƒ³ç”Ÿæˆã®æ™‚間間隔を以下ã«æ¸›å°‘ã—ã¾ã—ãŸ: %d tick -chat.bloodmagic.mimic.detectRadius.up=プレイヤーã®æ¤œçŸ¥ç¯„囲を以下ã«æ‹¡å¤§ã—ã¾ã—ãŸ: %d ブロック -chat.bloodmagic.mimic.detectRadius.down=プレイヤーã®æ¤œçŸ¥ç¯„囲を以下ã«ç¸®å°ã—ã¾ã—ãŸ: %d ブロック -chat.bloodmagic.mimic.potionSpawnRadius.up=ãƒãƒ¼ã‚·ãƒ§ãƒ³ç”Ÿæˆã®åŠ¹æžœç¯„囲を以下ã«æ‹¡å¤§ã—ã¾ã—ãŸ: %d ブロック -chat.bloodmagic.mimic.potionSpawnRadius.down=ãƒãƒ¼ã‚·ãƒ§ãƒ³ç”Ÿæˆã®åŠ¹æžœç¯„囲を以下ã«æ¸›å°‘ã—ã¾ã—ãŸ: %d ブロック - -# entity -entity.bloodmagic.SentientSpecter.name=ç†åŠ›ã®éœŠé­‚ -entity.bloodmagic.Mimic.name=ミミック - -# Commands -commands.bloodmagic.error.arg.invalid=無効ãªå¼•æ•°ã§ã™ -commands.bloodmagic.error.arg.missing=引数ãŒè¶³ã‚Šã¾ã›ã‚“ -commands.bloodmagic.error.arg.player.missing=ã‚ãªãŸã¯å®Ÿè¡Œã™ã‚‹å¯¾è±¡ãƒ—レイヤーを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ -commands.bloodmagic.error.404=コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼ -commands.bloodmagic.error.unknown=未知ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã™ï¼ -commands.bloodmagic.error.perm=ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 - -commands.bloodmagic.success=正常ã«å®Ÿè¡Œã•ã‚Œã¾ã—㟠- -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help="/bloodmagic" コマンドã§ãƒ˜ãƒ«ãƒ—情報ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ - -commands.bloodmagic.network.usage=/bloodmagic network [syphon|add|get|fill|cap] <プレイヤー> [é‡] -commands.bloodmagic.network.help=LP ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ -commands.bloodmagic.network.syphon.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‹ã‚‰LPを削減ã—ã¾ã™ -commands.bloodmagic.network.syphon.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削減ã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.bloodmagic.network.add.help=指定ã•ã‚ŒãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®LPã‚’ã€LP増加ルールã®ç¯„囲内ã§å¢—加ã•ã›ã¾ã™ã€‚ -commands.bloodmagic.network.add.success=%d LPã ã‘ã€%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’増加ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.bloodmagic.network.set.help=指定ã—ãŸãƒ—レイヤーã®LPを設定ã—ã¾ã™ã€‚ -commands.bloodmagic.network.set.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’%d LPã«è¨­å®šã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.bloodmagic.network.get.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®LPé‡ã‚’è¿”ã—ã¾ã™ã€‚ -commands.bloodmagic.network.fill.help=指定ã—ãŸãƒ—レイヤーã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’%d LPã¾ã§æº€ãŸã—ã¾ã™ã€‚ -commands.bloodmagic.network.fill.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’最大ã¾ã§ä»˜ä¸Žã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ -commands.bloodmagic.network.cap.help=プレイヤーãŒå…¥æ‰‹ã§ãる最高ä½ã®ãƒ–ラッドオーブã§è²¯è”µå¯èƒ½ãªæœ€å¤§å€¤ã®LPを付与ã—ã¾ã™ã€‚ -commands.bloodmagic.network.cap.success=%sã®LPãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®é™ç•Œå€¤ã¾ã§LPを付与ã™ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸã€‚ - -commands.bloodmagic.bind.usage=/bloodmagic bind [true|false] [プレイヤー] -commands.bloodmagic.bind.help=手ã«æ‰€æŒã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’çµåˆï¼åˆ†é›¢ã—ã¾ã™ã€‚ -commands.bloodmagic.bind.success=çµåˆã«æˆåŠŸã—ã¾ã—㟠-commands.bloodmagic.bind.remove.success=分離ã«æˆåŠŸã—ã¾ã—㟠- -commands.bloodmagic.orb.usage=/bloodmagic orb [set|get] <プレイヤー> [グレード] -commands.bloodmagic.orb.help=対象プレイヤーã®ãƒ–ラッドオーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ã®æœ€å¤§å€¤ã‚’設定ã€å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ - -commands.bloodmagic.bind.usage=/bind <プレイヤー> -commands.bloodmagic.bind.success=アイテムã®ç™»éŒ²ãŒæˆåŠŸã—ã¾ã—ãŸï¼ -commands.bloodmagic.bind.failed.noPlayer=指定ã•ã‚ŒãŸãƒ—レイヤーã¯å­˜åœ¨ã—ã¾ã›ã‚“ -commands.bloodmagic.bind.failed.alreadyBound=アイテムã¯æ—¢ã«ç™»éŒ²æ¸ˆã¿ã§ã™ï¼› /unbind コマンドã§ç™»éŒ²è§£é™¤ã—ã¦ãã ã•ã„ -commands.bloodmagic.bind.failed.notBindable=アイテムã®ç™»éŒ²ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—㟠-commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=アイテムã®ç™»éŒ²è§£é™¤ãŒæˆåŠŸã—ã¾ã—ãŸï¼ -commands.bloodmagic.unbind.failed.notBindable=アイテムã®ç™»éŒ²è§£é™¤ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—㟠-commands.bloodmagic.soulnetwork.usage=/soulnetwork <プレイヤー> [é‡] -commands.bloodmagic.soulnetwork.add.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’増加ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸï¼ -commands.bloodmagic.soulnetwork.subtract.success=%d LPã ã‘ã€%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’減少ã•ã›ã‚‹ã“ã¨ã«æˆåŠŸã—ã¾ã—ãŸï¼ -commands.bloodmagic.soulnetwork.fill.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’満ãŸã—ã¾ã—ãŸï¼ -commands.bloodmagic.soulnetwork.empty.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’空ã«ã—ã¾ã—ãŸï¼ -commands.bloodmagic.soulnetwork.get.success=%dã ã‘%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã¯LPãŒã‚ã‚Šã¾ã™ï¼ -commands.bloodmagic.soulnetwork.noPlayer=指定ã•ã‚ŒãŸãƒ—レイヤーã¯å­˜åœ¨ã—ã¾ã›ã‚“ -commands.bloodmagic.soulnetwork.noCommand=指定ã•ã‚ŒãŸã‚³ãƒžãƒ³ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“ -commands.bloodmagic.soulnetwork.notACommand=有効ãªã‚³ãƒžãƒ³ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“ -commands.bloodmagic.soulnetwork.fillMax.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã‚ªãƒ¼ãƒ–ã®æœ€å¤§å€¤ã¾ã§LPを供給ã—ã¾ã—ãŸï¼ -commands.bloodmagic.soulnetwork.create.success=正常ã«%sã®ã‚½ã‚¦ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’構築ã—ã¾ã—ãŸ(オーブã®ã‚°ãƒ¬ãƒ¼ãƒ‰ï¼š %d) - -# GUI -tile.bloodmagic.inputNode.name=入力ノード -tile.bloodmagic.outputNode.name=出力ノード - -# Keybinds -bloodmagic.keybind.open_holding=貯蔵ã®å°ç« ã‚’é–‹ã -bloodmagic.keybind.cycle_holding_pos=å°ç« ã‚’é †ã«å›žã™ (+) -bloodmagic.keybind.cycle_holding_neg=å°ç« ã‚’逆ã«å›žã™ (-) - -# JustEnoughItems -jei.bloodmagic.recipe.altar=è¡€ã®ç¥­å£‡ -jei.bloodmagic.recipe.binding=錬金術魔法陣(çµåˆ) -jei.bloodmagic.recipe.alchemyArrayCrafting=錬金術魔法陣 -jei.bloodmagic.recipe.soulForge=業ç«ã®ã‹ã¾ã© -jei.bloodmagic.recipe.alchemyTable=錬金術テーブル -jei.bloodmagic.recipe.armourDowngrade=懺悔 (å„€å¼) -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=グレード: %d -jei.bloodmagic.recipe.consumptionRate=消費率: %d LP/t -jei.bloodmagic.recipe.drainRate=消費率: %d LP/t -jei.bloodmagic.recipe.minimumSouls=最å°ï¼š %1$,.2fウィル -jei.bloodmagic.recipe.soulsDrained=消費: %1$,.2fウィル -jei.bloodmagic.recipe.lpDrained=消費: %,d LP -jei.bloodmagic.recipe.ticksRequired=時間: %,d Ticks - -jei.bloodmagic.desc.altarBuilder=デãƒãƒƒã‚°ã‚„テストã«åˆ©ç”¨ã™ã‚‹ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–モード専用アイテム。\n\nShift+å³ã‚¯ãƒªãƒƒã‚¯ã§ä½œæˆã™ã‚‹ã‚°ãƒ¬ãƒ¼ãƒ‰ã®å¤‰æ›´ã‚’è¡Œã„ã€å³ã‚¯ãƒªãƒƒã‚¯ã§ç¥­å£‡ã‚’構築。\n\nè¡€ã®ç¥­å£‡ã‚’左クリックã§å„€å¼çŸ³ã”ã¨ç ´å£Šã•ã‚Œã¾ã™ã€‚ -jei.bloodmagic.desc.demonicWill=生物ãŒå†…包ã™ã‚‹æ‚ªé­”ã®å› å­ã€‚\n\nMobã‚’ç†åŠ›ã®å‰£ã«ã‚ˆã£ã¦æ®ºå®³ã™ã‚‹ã€ã¾ãŸã¯ç°¡ç´ ãªæŠ•ã’罠を投ã’ã€ç™½ã„パーティクルãŒç™ºç”Ÿã—ã¦ã„ã‚‹é–“ã«æ®ºå®³ã™ã‚‹ã“ã¨ã§å…¥æ‰‹ãŒã§ãる。 - -# WAILA -waila.bloodmagic.sneak=&oスニークã§è©³ç´°æƒ…å ± -waila.bloodmagic.array.reagent=試薬: %s -waila.bloodmagic.array.catalyst=触媒: %s -option.bloodmagic.bypassSneak=スニークã§å›žé¿ -option.bloodmagic.bloodAltar=è¡€ã®ç¥­å£‡ -option.bloodmagic.ritualController=å„€å¼çŸ³ -option.bloodmagic.teleposer=テレãƒãƒ¼ã‚¶ãƒ¼ -option.bloodmagic.array=錬金術魔法陣 - -# Thaumcraft -tc.research_category.BLOODMAGIC=血紅ã®ç§˜å„€ - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=Blood Magic -bloodmagic.research_text.BLOODMAGIC=血紅ã®ç§˜å„€ -bloodmagic.research_page.BLOODMAGIC.1=Blood Magic ã®é ˜åŸŸã¯å¸¸ã«å­¤ç‹¬ã§ã‚り〠â€å€‹äººã®â€ 技能ã¯ä¸–é–“ã‹ã‚‰ç–Žã¾ã‚Œã€æ™‚ã«ã¯å¿ƒã‚’ç—…ã‚“ã§ã—ã¾ã†ã“ã¨ã‚‚ã‚ã‚‹ã‹ã‚‚知れãªã„。ã—ã‹ã—ã€è‡ªå·±çŠ ç‰²ã¨ãƒ©ã‚¤ãƒ•ã‚¨ãƒƒã‚»ãƒ³ã‚¹ã®åŠ›ã¯ä¸€èˆ¬ã®è¡€ã®é­”術師を超ãˆãŸé ˜åŸŸã«åˆ°é”ã—ã€ãã‚Œã©ã“ã‚ã‹äººçŸ¥ã‚’超ãˆãŸèƒ½åŠ›ã‚’身ã«ã¤ã‚‰ã‚Œã‚‹ã ã‚ã†ã“ã¨ã¯å®Œå…¨ã«æ˜Žç™½ã§ã‚ã‚ã†ï¼ - -# Buttons -button.bloodmagic.tooltip.fill=ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å……å¡« \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/lang/ko_KR.lang b/src/main/resources/assets/bloodmagic/lang/ko_KR.lang deleted file mode 100644 index 5787e851..00000000 --- a/src/main/resources/assets/bloodmagic/lang/ko_KR.lang +++ /dev/null @@ -1,194 +0,0 @@ -#Block Localization -tile.bloodAltar.name=í”¼ì˜ ì œë‹¨ -tile.bloodRune.blank.name=í”¼ì˜ ë£¬ -tile.bloodRune.fill.name=저장량ì¦ê°€ì˜ 룬 -tile.bloodRune.empty.name=í¡ìˆ˜ì˜ 룬 -tile.bloodRune.orb.name=ë³´ì£¼ì˜ ë£¬ -tile.bloodRune.betterCapacity.name=Rune of Superior Capacity -tile.speedRune.name=ì†ë„ì˜ ë£¬ -tile.efficiencyRune.name=íš¨ìœ¨ì˜ ë£¬ -tile.runeOfSacrifice.name=í¬ìƒì˜ 룬 -tile.runeOfSelfSacrifice.name=ìžê¸°í¬ìƒì˜ 룬 -tile.ritualStone.name=ì˜ì‹ì˜ ëŒ -tile.blockMasterStone.name=ì˜ì‹ì˜ëŒ 제어 -tile.bloodSocket.name=Filled Socket -tile.imperfectRitualStone.name=Imperfect Ritual Stone -tile.armourForge.name=Soul Armour Forge -tile.emptySocket.name=빈 소켓 -tile.bloodStoneBrick.name=Bloodstone Brick -tile.largeBloodStoneBrick.name=í° ì„ í˜ˆì„ìž¬ë²½ëŒ -tile.blockWritingTable.name=Alchemic Chemistry Set -tile.blockHomHeart.name=Spell Table -tile.bloodPedestal.name=Arcane Pedestal -tile.bloodPlinth.name=Arcane Plinth -tile.bloodTeleposer.name=Teleposer -tile.blockConduit.name=Spell Conduit -tile.blockSpellParadigm.projectile.name=Particle Generator -tile.blockSpellParadigm.self.name=Self Augmentator -tile.blockSpellParadigm.melee.name=Melee Aggregator -tile.blockSpellParadigm.tool.name=Tool Forger -tile.blockSpellEnhancement.power1.name=Unstable Spell Empowerer -tile.blockSpellEnhancement.power2.name=Standard Spell Empowerer -tile.blockSpellEnhancement.power3.name=Reinforced Spell Empowerer -tile.blockSpellEnhancement.power4.name=Imbued Spell Empowerer -tile.blockSpellEnhancement.power5.name=Demonic Spell Empowerer -tile.blockSpellEnhancement.cost1.name=Unstable Spell Dampener -tile.blockSpellEnhancement.cost2.name=Standard Spell Dampener -tile.blockSpellEnhancement.cost3.name=Reinforced Spell Dampener -tile.blockSpellEnhancement.cost4.name=Imbued Spell Dampener -tile.blockSpellEnhancement.cost5.name=Demonic Spell Dampener -tile.blockSpellEnhancement.potency1.name=Unstable Spell Augmentor -tile.blockSpellEnhancement.potency2.name=Standard Spell Augmentor -tile.blockSpellEnhancement.potency3.name=Reinforced Spell Augmentor -tile.blockSpellEnhancement.potency4.name=Imbued Spell Augmentor -tile.blockSpellEnhancement.potency5.name=Demonic Spell Augmentor -tile.blockSpellModifier.default.name=Default Spell Modifier -tile.blockSpellModifier.offensive.name=Offensive Spell Modifier -tile.blockSpellModifier.defensive.name=Defensive Spell Modifier -tile.blockSpellModifier.environmental.name=Environmental Spell Modifier -tile.blockSpellEffect.fire.name=Crucible of Fire -tile.blockSpellEffect.ice.name=Ice Maker -tile.blockSpellEffect.wind.name=Wind Generator -tile.blockSpellEffect.earth.name=Earth Former -tile.alchemicCalcinator.name=Alchemic Calcinator -tile.crystalBelljar.name=Crystal Belljar -tile.blockReagentConduit.name=Alchemy Relay - -#Item Localization -item.weakBloodOrb.name=약한 ì„ í˜ˆì˜ ë³´ì£¼ -item.apprenticeBloodOrb.name=견습 ì„ í˜ˆì˜ ë³´ì£¼ -item.magicianBloodOrb.name=ë§ˆë²•ì‚¬ì˜ ì„ í˜ˆë³´ì£¼ -item.masterBloodOrb.name=마스터 ì„ í˜ˆì˜ ë³´ì£¼ -item.archmageBloodOrb.name=ì•„í¬ë©”ì´ì§€ì˜ 선혈보주 -item.energyBlast.name=Energy Blaster -item.energySword.name=Bound Blade -item.lavaCrystal.name=용암수정 -item.waterSigil.name=ë¬¼ì˜ ë¶€ì  -item.lavaSigil.name=ìš©ì•”ì˜ ë¶€ì  -item.voidSigil.name=ê³µí—ˆì˜ ë¶€ì  -item.blankSlate.name=빈 íŒ -item.reinforcedSlate.name=ë³´ê°•ëœ íŒ -item.sacrificialDagger.name=í¬ìƒì˜ ê²€ -item.daggerOfSacrifice.name=í¬ìƒì˜ 단검 -item.airSigil.name=ë°”ëžŒì˜ ë¶€ì  -item.sigilOfTheFastMiner.name=쾌ì†ì˜ê´‘부 ë¶€ì  -item.sigilOfElementalAffinity.name=ì›ì†Œì¹œí™”ì˜ ë¶€ì  -item.sigilOfHaste.name=Sigil of Haste -item.sigilOfHolding.name=ë³´ê´€ì˜ ë¶€ì  -item.divinationSigil.name=ì ìˆ ì˜ 시질 -item.waterScribeTool.name=Elemental Inscription Tool: Water -item.fireScribeTool.name=Elemental Inscription Tool: Fire -item.earthScribeTool.name=Elemental Inscription Tool: Earth -item.airScribeTool.name=Elemental Inscription Tool: Air -item.duskScribeTool.name=Elemental Inscription Tool: Dusk -item.activationCrystalWeak.name=Weak Activation Crystal -item.activationCrystalAwakened.name=Awakened Activation Crystal -item.boundPickaxe.name=Bound Pickaxe -item.boundAxe.name=Bound Axe -item.boundShovel.name=Bound Shovel -item.boundHelmet.name=Bound Helmet -item.boundPlate.name=Bound Plate -item.boundLeggings.name=Bound Leggings -item.boundBoots.name=Bound Boots -item.weakBloodShard.name=Weak Blood Shard -item.growthSigil.name=ìˆ˜í’€ì˜ ë¶€ì  -item.blankSpell.name=Unbound Crystal -item.alchemyFlask.name=Potion Flask -item.standardBindingAgent.name=Standard Binding Agent -item.mundanePowerCatalyst.name=Mundane Power Catalyst -item.averagePowerCatalyst.name=Average Power Catalyst -item.greaterPowerCatalyst.name=Greater Power Catalyst -item.mundaneLengtheningCatalyst.name=Mundane Lengthening Catalyst -item.averageLengtheningCatalyst.name=Average Lengthening Catalyst -item.greaterLengtheningCatalyst.name=Greater Lengthening Catalyst -item.incendium.name=Incendium -item.magicales.name=Magicales -item.sanctus.name=Sanctus -item.aether.name=Aether -item.simpleCatalyst.name=Simple Catalyst -item.crepitous.name=Crepitous -item.crystallos.name=Crystallos -item.terrae.name=Terrae -item.aquasalus.name=Aquasalus -item.tennebrae.name=Tenebrae -item.demonBloodShard.name=Demon Blood Shard -item.sigilOfWind.name=Sigil of the Whirlwind -item.telepositionFocus.name=Teleposition Focus -item.enhancedTelepositionFocus.name=Enhanced Teleposition Focus -item.reinforcedTelepositionFocus.name=Reinforced Teleposition Focus -item.demonicTelepositionFocus.name=Demonic Teleposition Focus -item.imbuedSlate.name=Imbued Slate -item.demonicSlate.name=Demonic Slate -item.sigilOfTheBridge.name=ì˜ê°ì˜ ë¶€ì  -item.armourInhibitor.name=Armour Inhibitor -item.cheatyItem.name=Orb of Testing -item.weakFillingAgent.name=Weak Filling Agent -item.standardFillingAgent.name=Standard Filling Agent -item.enhancedFillingAgent.name=Enhanced Filling Agent -item.weakBindingAgent.name=Weak Binding Agent -item.ritualDiviner.name=Ritual Diviner -item.sigilOfMagnetism.name=ìžê¸°ë ¥ ë¶€ì  -item.itemDiabloKey.name=Key of Binding -item.energyBazooka.name=Energy Bazooka -item.bloodLightSigil.name=ì„ í˜ˆì˜ ëž¨í”„ ë¶€ì  -item.itemComplexSpellCrystal.name=Complex Spell Crystal -item.itemSigilOfSupression.name=Sigil of Supression -item.itemSigilOfEnderSeverance.name=Sigil of Ender Severance -item.bucketLife.name=Bucket of Life -item.bloodMagicBaseItem.QuartzRod.name=Quartz Rod -item.bloodMagicBaseItem.EmptyCore.name=Empty Core -item.bloodMagicBaseItem.MagicalesCable.name=Magicales Cable -item.bloodMagicBaseItem.WoodBrace.name=Wooden Brace -item.bloodMagicBaseItem.StoneBrace.name=Stone Brace -item.bloodMagicBaseItem.ProjectileCore.name=Projectile Core -item.bloodMagicBaseItem.SelfCore.name=Self Core -item.bloodMagicBaseItem.MeleeCore.name=Melee Core -item.bloodMagicBaseItem.ToolCore.name=Tool Core -item.bloodMagicBaseItem.ParadigmBackPlate.name=Paradigm Plate -item.bloodMagicBaseItem.OutputCable.name=Output Spell Cable -item.bloodMagicBaseItem.InputCable.name=Input Spell Cable -item.bloodMagicBaseItem.FlameCore.name=Fire Core -item.bloodMagicBaseItem.IcyCore.name=Icy Core -item.bloodMagicBaseItem.GustCore.name=Gusty Core -item.bloodMagicBaseItem.EarthenCore.name=Earthen Core -item.bloodMagicBaseItem.CrackedRunicPlate.name=Cracked Runic Plate -item.bloodMagicBaseItem.RunicPlate.name=Runic Plate -item.bloodMagicBaseItem.ScribedRunicPlate.name=Imbued Runic Plate -item.bloodMagicBaseItem.DefaultCore.name=Unattuned Core -item.bloodMagicBaseItem.OffensiveCore.name=Offensive Core -item.bloodMagicBaseItem.DefensiveCore.name=Defensive Core -item.bloodMagicBaseItem.EnvironmentalCore.name=Environmental Core -item.bloodMagicBaseItem.PowerCore.name=Power Core -item.bloodMagicBaseItem.CostCore.name=Reduction Core -item.bloodMagicBaseItem.PotencyCore.name=Potency Core -item.bloodMagicBaseItem.ObsidianBrace.name=Obsidian Brace -item.bloodMagicAlchemyItem.Offensa.name=Offensa -item.bloodMagicAlchemyItem.Praesidium.name=Praesidium -item.bloodMagicAlchemyItem.OrbisTerrae.name=Orbis Terrae -item.bloodMagicAlchemyItem.StrengthenedCatalyst.name=Strengthened Catalyst -item.bloodMagicAlchemyItem.ConcentratedCatalyst.name=Concentrated Catalyst -item.bloodMagicAlchemyItem.FracturedBone.name=Fractured Bone -item.bloodMagicAlchemyItem.Virtus.name=Virtus -item.bloodMagicAlchemyItem.Reductus.name=Reductus -item.bloodMagicAlchemyItem.Potentia.name=Potentia -item.sanguineHelmet.name=Sanguine Helmet -item.itemSeerSigil.name=Sigil of Sight -#item.itemFluidSigil.name= -item.multiTool.name=Dynamic Mace -item.itemCombinationalCatalyst.name=Combinational Catalyst -item.sanguineRobe.name=Sanguine Robes -item.sanguinePants.name=Sanguine Leggings -item.sanguineBoots.name=Sanguine Boots -item.itemAttunedCrystal.name=Alchemic Router -item.itemTankSegmenter.name=Alchemic Segmenter -item.destinationClearer.name=Alchemic Cleanser - -#Creative Tab -itemGroup.tabbloodmagic=선혈ì˜ë§ˆìˆ [Blood Magic] - -#Extra Strings -bm.string.consume=사용량 -bm.string.drain=í¡ìˆ˜ëŸ‰ -bm.string.tier=í‹°ì–´ -bm.string.crafting.orb.shaped=ë¸”ëŸ¬ë“œë§¤ì§ ì˜¤ë¸Œ 조합법 -bm.string.crafting.orb.shapeless=ë¸”ëŸ¬ë“œë§¤ì§ ì˜¤ë¸Œ 조합법 diff --git a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang b/src/main/resources/assets/bloodmagic/lang/ru_RU.lang deleted file mode 100644 index a91e66e9..00000000 --- a/src/main/resources/assets/bloodmagic/lang/ru_RU.lang +++ /dev/null @@ -1,572 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=Blood Magic -itemGroup.bloodmagic.creativeTabTome=Blood Magic Upgrade Tomes - -#Items -item.bloodmagic.activation_crystal.weak.name=Слабый криÑталл активации -item.bloodmagic.activation_crystal.awakened.name=Пробуждённый криÑталл активации -item.bloodmagic.activation_crystal.creative.name=ТворчеÑкий криÑталл активации - -item.bloodmagic.sacrificial_dagger.normal.name=Жертвенный кинжал -item.bloodmagic.sacrificial_dagger.creative.name=ТворчеÑкий жертвенный кинжал -item.bloodmagic.pack.selfSacrifice.name=Blood Letter's Pack -item.bloodmagic.pack.sacrifice.name=Coat of Arms -item.bloodmagic.daggerOfSacrifice.name=Кинжал Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ - -item.bloodmagic.lavaCrystal.name=Лавовый криÑталл - -item.bloodmagic.bound.sword.name=СвÑзанный клинок -item.bloodmagic.bound.pickaxe.name=СвÑÐ·Ð°Ð½Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° -item.bloodmagic.bound.axe.name=СвÑзанный топор -item.bloodmagic.bound.shovel.name=СвÑÐ·Ð°Ð½Ð½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° - -item.bloodmagic.bucket.lifeEssence.name=Ведро жизни - -item.bloodmagic.scribe.water.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: Вода -item.bloodmagic.scribe.fire.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: Огонь -item.bloodmagic.scribe.earth.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: Ð—ÐµÐ¼Ð»Ñ -item.bloodmagic.scribe.air.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: Воздух -item.bloodmagic.scribe.dusk.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: Сумерки -item.bloodmagic.scribe.dawn.name=ИнÑтрумент Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ñлемента: РаÑÑвет - -item.bloodmagic.focus.weak.name=Ð¤Ð¾ÐºÑƒÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ -item.bloodmagic.focus.enhanced.name=Улучшенный Ñ„Ð¾ÐºÑƒÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ -item.bloodmagic.focus.reinforced.name=УÑиленный Ñ„Ð¾ÐºÑƒÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ -item.bloodmagic.focus.demonic.name=ДемоничеÑкий Ñ„Ð¾ÐºÑƒÑ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ - -item.bloodmagic.slate.blank.name=ЧиÑÑ‚Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ° -item.bloodmagic.slate.reinforced.name=Ð£ÐºÑ€ÐµÐ¿Ð»Ñ‘Ð½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ° -item.bloodmagic.slate.imbued.name=ÐŸÑ€Ð¾Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ° -item.bloodmagic.slate.demonic.name=ДемоничеÑÐºÐ°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ° -item.bloodmagic.slate.ethereal.name=Ð­Ñ„Ð¸Ñ€Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ° - -item.bloodmagic.orb.weak.name=Слабый кровавый шар -item.bloodmagic.orb.apprentice.name=Кровавый шар ученика -item.bloodmagic.orb.magician.name=Кровавый шар мага -item.bloodmagic.orb.master.name=Кровавый шар маÑтера -item.bloodmagic.orb.archmage.name=Кровавый шар архимага -item.bloodmagic.orb.transcendent.name=Ðеобыкновенный кровавый шар - -item.bloodmagic.reagent.incendium.name=Incendium -item.bloodmagic.reagent.magicales.name=Magicales -item.bloodmagic.reagent.sanctus.name=Sanctus -item.bloodmagic.reagent.aether.name=Aether -item.bloodmagic.reagent.crepitous.name=Crepitous -item.bloodmagic.reagent.crystallos.name=Crystallos -item.bloodmagic.reagent.terrae.name=Terrae -item.bloodmagic.reagent.aquasalus.name=Aquasalus -item.bloodmagic.reagent.tennebrae.name=Tennebrae -item.bloodmagic.reagent.offensa.name=Offensa -item.bloodmagic.reagent.praesidium.name=Praesidium -item.bloodmagic.reagent.orbisterrae.name=Orbis Terrae -item.bloodmagic.reagent.virtus.name=Virtus -item.bloodmagic.reagent.reductus.name=Reductus -item.bloodmagic.reagent.potentia.name=Potentia - -item.bloodmagic.blood_shard.weak.name=Слабый кровавый оÑколок -item.bloodmagic.blood_shard.demonic.name=ДемоничеÑкий кровавый оÑколок - -item.bloodmagic.baseComponent.reagent_water.name=Реагент воды -item.bloodmagic.baseComponent.reagent_lava.name=Реагент лавы -item.bloodmagic.baseComponent.reagent_air.name=Реагент воздуха -item.bloodmagic.baseComponent.reagent_fast_miner.name=Реагент добычи -item.bloodmagic.baseComponent.reagent_void.name=Реагент пуÑтоты -item.bloodmagic.baseComponent.reagent_growth.name=Реагент роÑта -item.bloodmagic.baseComponent.reagent_affinity.name=Реагент Ñтихийного родÑтва -item.bloodmagic.baseComponent.reagent_sight.name=Реагент взглÑда -item.bloodmagic.baseComponent.reagent_binding.name=Реагент ÑвÑзи -item.bloodmagic.baseComponent.reagent_suppression.name=Реагент Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ -item.bloodmagic.baseComponent.reagent_blood_light.name=Реагент Ñвета -item.bloodmagic.baseComponent.reagent_magnetism.name=Реагент притÑÐ¶ÐµÐ½Ð¸Ñ -item.bloodmagic.baseComponent.reagent_haste.name=Реагент ÑкороÑти -item.bloodmagic.baseComponent.reagent_bridge.name=Реагент моÑта -item.bloodmagic.baseComponent.reagent_compression.name=Реагент ÑÐ¶Ð°Ñ‚Ð¸Ñ -item.bloodmagic.baseComponent.reagent_severance.name=Реагент разрыва -item.bloodmagic.baseComponent.reagent_holding.name=Реагент ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ -item.bloodmagic.baseComponent.reagent_claw.name=Реагент крюка -item.bloodmagic.baseComponent.reagent_bounce.name=Реагент ÑлаÑтичноÑти -item.bloodmagic.baseComponent.reagent_frost.name=Реагент заморозки -item.bloodmagic.baseComponent.reagent_teleposition.name=Реагент телепозиции -item.bloodmagic.baseComponent.reagent_transposition.name=Реагент транÑпозиции - -item.bloodmagic.baseComponent.frame_part.name=ЧаÑти каркаÑа -item.bloodmagic.baseComponent.sand_iron.name=Железный пеÑок -item.bloodmagic.baseComponent.sand_gold.name=Золотой пеÑок -item.bloodmagic.baseComponent.sand_coal.name=Угольный пеÑок -item.bloodmagic.baseComponent.plant_oil.name=РаÑтительное маÑло -item.bloodmagic.baseComponent.sulfur.name=Сера -item.bloodmagic.baseComponent.saltpeter.name=Селитра -item.bloodmagic.baseComponent.neuro_toxin.name=ÐейротокÑин -item.bloodmagic.baseComponent.antiseptic.name=ÐнтиÑептик -item.bloodmagic.baseComponent.catalyst_length_1.name=Слабый удлинÑющий катализатор -item.bloodmagic.baseComponent.catalyst_power_1.name=Слабый уÑиливающий катализатор - -item.bloodmagic.cutting_fluid.basic.name=Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ñ€ÐµÐ¶ÑƒÑ‰Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾ÑÑ‚ÑŒ -item.bloodmagic.cutting_fluid.explosive.name=Взрывчатый порошок - -item.bloodmagic.demonCrystal.default.name=КриÑталл демоничеÑкой Ñнергии -item.bloodmagic.demonCrystal.corrosive.name=КриÑталл коррозионной Ñнергии -item.bloodmagic.demonCrystal.destructive.name=КриÑталл разрушающей Ñнергии -item.bloodmagic.demonCrystal.vengeful.name=КриÑталл мÑтительной Ñнергии -item.bloodmagic.demonCrystal.steadfast.name=КриÑталл уÑтойчивой Ñнергии - -item.bloodmagic.monster_soul.raw.name=ДемоничеÑÐºÐ°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ -item.bloodmagic.monster_soul.corrosive.name=ÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð¾Ð½Ð½Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ -item.bloodmagic.monster_soul.destructive.name=Ð Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ -item.bloodmagic.monster_soul.vengeful.name=ÐœÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ -item.bloodmagic.monster_soul.steadfast.name=УÑÑ‚Ð¾Ð¹Ñ‡Ð¸Ð²Ð°Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ - -item.bloodmagic.sigil.air.name=Сигил воздуха -item.bloodmagic.sigil.blood_light.name=Сигил кровавого Ñветильника -item.bloodmagic.sigil.compression.name=Сигил ÑÐ¶Ð°Ñ‚Ð¸Ñ -item.bloodmagic.sigil.divination.name=Сигил предÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ -item.bloodmagic.sigil.water.name=Сигил воды -item.bloodmagic.sigil.lava.name=Сигил лавы -item.bloodmagic.sigil.void.name=Сигил пуÑтоты -item.bloodmagic.sigil.green_grove.name=Сигил зеленой рощи -item.bloodmagic.sigil.elemental_affinity.name=Сигил Ñтихийного родÑтва -item.bloodmagic.sigil.haste.name=Сигил ÑкороÑти -item.bloodmagic.sigil.suppression.name=Сигил Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ -item.bloodmagic.sigil.magnetism.name=Сигил притÑÐ¶ÐµÐ½Ð¸Ñ -item.bloodmagic.sigil.fast_miner.name=Сигил быÑтрого ÐºÐ¾Ð¿Ð°Ñ‚ÐµÐ»Ñ -item.bloodmagic.sigil.seer.name=Сигил Ð·Ñ€ÐµÐ½Ð¸Ñ -item.bloodmagic.sigil.phantom_bridge.name=Сигил призрачного моÑта -item.bloodmagic.sigil.whirlwind.name=Сигил Ð²Ð¸Ñ…Ñ€Ñ -item.bloodmagic.sigil.ender_severance.name=Сигил разрыва ÐšÑ€Ð°Ñ -item.bloodmagic.sigil.holding.name=Сигил ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ -item.bloodmagic.sigil.holding.display=&r%s: &o&n%s -item.bloodmagic.sigil.claw.name=Сигил ÐºÐ¾Ð³Ñ‚Ñ -item.bloodmagic.sigil.bounce.name=Сигил ÑлаÑтичноÑти -item.bloodmagic.sigil.frost.name=Сигил зимнего Ð´Ñ‹Ñ…Ð°Ð½Ð¸Ñ -item.bloodmagic.sigil.teleposition.name=Сигил телепозиции -item.bloodmagic.sigil.transposition.name=Сигил транÑпозиции - -item.bloodmagic.livingArmour.helmet.name=Живой шлем -item.bloodmagic.livingArmour.chest.name=Ð–Ð¸Ð²Ð°Ñ ÐºÐ¸Ñ€Ð°Ñа -item.bloodmagic.livingArmour.legs.name=Живые поножи -item.bloodmagic.livingArmour.boots.name=Живые ботинки -item.bloodmagic.sentientArmour.helmet.name=Разумный шлем -item.bloodmagic.sentientArmour.chest.name=Ð Ð°Ð·ÑƒÐ¼Ð½Ð°Ñ ÐºÐ¸Ñ€Ð°Ñа -item.bloodmagic.sentientArmour.legs.name=Разумные поножи -item.bloodmagic.sentientArmour.boots.name=Разумные ботинки - -item.bloodmagic.altarMaker.name=Создатель Ð°Ð»Ñ‚Ð°Ñ€Ñ -item.bloodmagic.alchemic_vial.base.name=ÐлхимичеÑÐºÐ°Ñ Ð¿Ñ€Ð¾Ð±Ð¸Ñ€ÐºÐ° - -item.bloodmagic.ritualDivinernormal.name=ПредÑказатель ритуала -item.bloodmagic.ritualDivinerdusk.name=ПредÑказатель ритуала [Сумерки] -item.bloodmagic.ritualDivinerdawn.name=ПредÑказатель ритуала [РаÑÑвет] -item.bloodmagic.ritualReader.name=Редактор ритуала - -item.bloodmagic.arcaneAshes.name=Волшебный пепел -item.bloodmagic.upgradeTome.name=Living Armour Upgrade Tome -item.bloodmagic.upgradeTrainer.name=Living Armour Training Bracelet - -item.bloodmagic.sentientSword.name=Разумный меч -item.bloodmagic.soulGem.petty.name=Маленький адÑкий камень -item.bloodmagic.soulGem.lesser.name=Ðебольшой адÑкий камень -item.bloodmagic.soulGem.common.name=Обычный адÑкий камень -item.bloodmagic.soulGem.greater.name=Большой адÑкий камень -item.bloodmagic.soulGem.grand.name=Великий адÑкий камень -item.bloodmagic.soulSnare.base.name=ПроÑÑ‚Ð°Ñ Ð»Ð¾Ð²ÑƒÑˆÐºÐ° -item.bloodmagic.sentientBow.name=Разумный лук -item.bloodmagic.sentientArmourGem.name=Разумный камень -item.bloodmagic.sentientAxe.name=Разумный топор -item.bloodmagic.sentientPickaxe.name=Ð Ð°Ð·ÑƒÐ¼Ð½Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° -item.bloodmagic.sentientShovel.name=Ð Ð°Ð·ÑƒÐ¼Ð½Ð°Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð° - -item.bloodmagic.nodeRouter.name=Node Router -item.bloodmagic.itemFilter.exact.name=Точный фильтр предметов -item.bloodmagic.itemFilter.ignoreNBT.name=NBT фильтр предметов -item.bloodmagic.itemFilter.modItems.name=Mod фильтр предметов -item.bloodmagic.itemFilter.oreDict.name=OreDict фильтр предметов -item.bloodmagic.fluidFilter.exact.name=Фильтр жидкоÑтей - -item.bloodmagic.experienceTome.name=Том иÑÑледований -item.bloodmagic.sanguineBook.name=ИнÑпектор блоков - -item.bloodmagic.living_point_upgrade.draft_angelus.name=Призыв Ðнгела - -item.bloodmagic.willGauge.name=Измеритель ауры демоничеÑкой Ñнергии -item.bloodmagic.potionFlask.name=ФлÑжка Ð´Ð»Ñ Ð·ÐµÐ»Ð¸Ð¹ - -item.bloodmagic.icarusScroll.name=Свиток ИкаруÑа - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=Ð–Ð¸Ð·Ð½ÐµÐ½Ð½Ð°Ñ ÑÑÑÐµÐ½Ñ†Ð¸Ñ - -tile.bloodmagic.stone.ritual.master.name=Главный ритуальный камень -tile.bloodmagic.stone.ritual.imperfect.name=Ðеполноценный ритуальный камень -tile.bloodmagic.stone.ritual.inverted.name=Инвертированный ритуальный камень - -tile.bloodmagic.altar.name=Кровавый алтарь -tile.bloodmagic.alchemyArray.name=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° - -tile.bloodmagic.rune.blank.name=ЧиÑÑ‚Ð°Ñ Ñ€ÑƒÐ½Ð° -tile.bloodmagic.rune.speed.name=Руна ÑкороÑти -tile.bloodmagic.rune.efficiency.name=Руна ÑффективноÑти -tile.bloodmagic.rune.sacrifice.name=Руна Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ -tile.bloodmagic.rune.self_sacrifice.name=Руна ÑÐ°Ð¼Ð¾Ð¿Ð¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ -tile.bloodmagic.rune.displacement.name=Руна Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ -tile.bloodmagic.rune.capacity.name=Руна ёмкоÑти -tile.bloodmagic.rune.augmented_capacity.name=Руна дополнительной ёмкоÑти -tile.bloodmagic.rune.orb.name=Руна шара -tile.bloodmagic.rune.acceleration.name=Руна уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ -tile.bloodmagic.rune.charging.name=Руна зарÑда - -tile.bloodmagic.ritualStone.blank.name=Ритуальный камень -tile.bloodmagic.ritualStone.water.name=Ритуальный камень воды -tile.bloodmagic.ritualStone.fire.name=Ритуальный камень Ð¾Ð³Ð½Ñ -tile.bloodmagic.ritualStone.earth.name=Ритуальный камень земли -tile.bloodmagic.ritualStone.air.name=Ритуальный камень воздуха -tile.bloodmagic.ritualStone.dusk.name=Ритуальный камень Ñумерек -tile.bloodmagic.ritualStone.dawn.name=Ритуальный камень раÑÑвета - -tile.bloodmagic.bloodstone_tile.name=Большой кровавый кирпич -tile.bloodmagic.bloodstone_brick.name=Кровавый кирпич -tile.bloodmagic.crystal_tile.name=Большой криÑтальный кирпич -tile.bloodmagic.crystal_brick.name=КриÑтальный кирпич -tile.bloodmagic.bloodLight.name=Кровавый Ñвет -tile.bloodmagic.spectralBlock.name=Иллюзорный блок -tile.bloodmagic.phantom.name=Призрачный блок -tile.bloodmagic.incenseAltar.name=Жертвенник Ð´Ð»Ñ ÐºÑƒÑ€ÐµÐ½Ð¸Ð¹ - -tile.bloodmagic.teleposer.name=Телепозер -tile.bloodmagic.soulForge.name=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° -tile.bloodmagic.alchemyTable.name=Стол алхимии -tile.bloodmagic.demonCrucible.name=ДемоничеÑкий тигель -tile.bloodmagic.demonPylon.name=ДемоничеÑкий пилон -tile.bloodmagic.demonCrystallizer.name=ДемоничеÑкий криÑталлизатор - -tile.bloodmagic.masterRouting.name=Master Routing Node -tile.bloodmagic.outputRouting.name=Output Routing Node -tile.bloodmagic.inputRouting.name=Input Routing Node -tile.bloodmagic.itemRouting.name=Routing Node - -tile.bloodmagic.path.wood.name=ДеревÑÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.woodtile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ Ð´ÐµÑ€ÐµÐ²ÑÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.stone.name=ÐšÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.stonetile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.wornstone.name=Ð¡Ñ‚Ð°Ñ€Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.wornstonetile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ ÑÑ‚Ð°Ñ€Ð°Ñ ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.obsidian.name=ОбÑÐ¸Ð´Ð¸Ð°Ð½Ð¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° -tile.bloodmagic.path.obsidiantile.name=Ð£Ð·Ð¾Ñ€Ð½Ð°Ñ Ð¾Ð±ÑÐ¸Ð´Ð¸Ð°Ð½Ð¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° - -tile.bloodmagic.dimensionalPortal.name=ПроÑтранÑтвенный портал -tile.bloodmagic.bloodTank.name=Резервуар крови - -tile.bloodmagic.demonCrystal.default.name=КриÑтальный клаÑтер демоничеÑкой Ñнергии -tile.bloodmagic.demonCrystal.corrosive.name=КриÑтальный клаÑтер коррозионной Ñнергии -tile.bloodmagic.demonCrystal.destructive.name=КриÑтальный клаÑтер разрушительной Ñнергии -tile.bloodmagic.demonCrystal.vengeful.name=КриÑтальный клаÑтер мÑтительной Ñнергии -tile.bloodmagic.demonCrystal.steadfast.name=КриÑтальный клаÑтер уÑтойчивой Ñнергии - -tile.bloodmagic.mimic.nohitbox.name=Эфирный непрозрачный поддельный блок -tile.bloodmagic.mimic.solidopaque.name=Ðепрозрачный поддельный блок -tile.bloodmagic.mimic.solidclear.name=ЧиÑтый поддельный блок -tile.bloodmagic.mimic.solidlight.name=СветÑщийÑÑ Ð¿Ð¾Ð´Ð´ÐµÐ»ÑŒÐ½Ñ‹Ð¹ блок -tile.bloodmagic.mimic.sentient.name=Разумный поддельный блок - -tile.bloodmagic.bricks1.brick1_raw.name=Сырые каменные кирпичи -tile.bloodmagic.bricks1.brick1_corrosive.name=Коррозионные каменные кирпичи -tile.bloodmagic.bricks1.brick1_destructive.name=Разрушительные каменные кирпичи -tile.bloodmagic.bricks1.brick1_vengeful.name=ÐœÑтительные каменные кирпичи -tile.bloodmagic.bricks1.brick1_steadfast.name=УÑтойчивые каменные кирпичи - -# Fluids -fluid.lifeEssence=Ð–Ð¸Ð·Ð½ÐµÐ½Ð½Ð°Ñ ÑÑÑÐµÐ½Ñ†Ð¸Ñ - -# HUD -hud.bloodmagic.inactive=Ðеактивный - -# Tooltips -tooltip.bloodmagic.orb.desc=Хранит жизненную ÑÑÑенцию -tooltip.bloodmagic.orb.owner=Создан: %s -tooltip.bloodmagic.currentOwner=Владелец: %s -tooltip.bloodmagic.currentTier=Уровень: %d -tooltip.bloodmagic.config.disabled=Отключено в наÑтройках -tooltip.bloodmagic.tier=Уровень %d - -tooltip.bloodmagic.activated=Ðктивирован -tooltip.bloodmagic.deactivated=Деактивирован - -tooltip.bloodmagic.sigil.air.desc=&oОщущаетÑÑ Ð»ÐµÐ³ÐºÐ¾ÑÑ‚ÑŒ... -tooltip.bloodmagic.sigil.blood_light.desc=&oЯ вижу Ñвет! -tooltip.bloodmagic.sigil.compression.desc=&oКучи алмазов -tooltip.bloodmagic.sigil.divination.desc=&oВзглÑд в душу -tooltip.bloodmagic.sigil.divination.otherNetwork=ЗаглÑнем в душу %s -tooltip.bloodmagic.sigil.divination.currentAltarTier=Уровень: %d -tooltip.bloodmagic.sigil.divination.currentEssence=ЭÑÑенции: %d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=ÐмкоÑÑ‚ÑŒ: %d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=СпокойÑтвие: %d -tooltip.bloodmagic.sigil.divination.currentInversion=ИнверÑиÑ: %d -tooltip.bloodmagic.sigil.divination.currentBonus=БонуÑ: +%d%% -tooltip.bloodmagic.sigil.water.desc=&oÐужна вода? -tooltip.bloodmagic.sigil.lava.desc=&oГОРЯЧЕЕ! ÐЕ ЕСТЬ! -tooltip.bloodmagic.sigil.void.desc=&oЛучше чем Swiffer! -tooltip.bloodmagic.sigil.green_grove.desc=&oЭкологичеÑки чиÑтый -tooltip.bloodmagic.sigil.magnetism.desc=&oЯ очень притÑÐ³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð»Ð¸Ñ‡Ð½Ð¾ÑÑ‚ÑŒ! -tooltip.bloodmagic.sigil.suppression.desc=&oЛучше, чем телекинез... -tooltip.bloodmagic.sigil.haste.desc=&oПоÑле 42 чашек кофе... -tooltip.bloodmagic.sigil.fast_miner.desc=&oÐ’Ñе глубже и глубже... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oÐŸÐ°Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¾Ð³Ð½ÐµÐ½Ð½Ð°Ñ Ñ€Ñ‹Ð±Ð°! -tooltip.bloodmagic.sigil.seer.desc=&oКогда проÑто видеть недоÑтаточно -tooltip.bloodmagic.sigil.seer.currentAltarProgress=ПрогреÑÑ: %d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=ПрогреÑÑ: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=РаÑход: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=Уровень: %d -tooltip.bloodmagic.sigil.seer.currentEssence=ЭÑÑенции: %d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=ÐмкоÑÑ‚ÑŒ: %d LP -tooltip.bloodmagic.sigil.seer.currentCharge=ЗарÑд: %d -tooltip.bloodmagic.sigil.seer.currentTranquility=СпокойÑтвие: %d -tooltip.bloodmagic.sigil.seer.currentBonus=БонуÑ: +%d%% -tooltip.bloodmagic.sigil.phantomBridge.desc=&oПрогулки в воздухе... -tooltip.bloodmagic.sigil.whirlwind.desc=&oЛучше не надевать юбку -tooltip.bloodmagic.sigil.enderSeverance.desc=&oÐеприÑтноÑти Ð´Ð»Ñ Ñтранников КраÑ! -tooltip.bloodmagic.sigil.teleposition.desc=Я очень близок к возможноÑти перемещениÑ. -tooltip.bloodmagic.sigil.transposition.desc=Ощути Ñилу, мой юный ученик. -tooltip.bloodmagic.sigil.holding.press=Ðажмите &o%s&r&7 Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ -tooltip.bloodmagic.sigil.holding.desc=Может хранить Ñигилы. -tooltip.bloodmagic.sigil.holding.sigilInSlot=Слот %d: %s - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=Увеличивает макÑимальное количеÑтво очков Живой Брони до %d. - -tooltip.bloodmagic.bound.sword.desc=&oОтбраковка Ñлабаков -tooltip.bloodmagic.bound.pickaxe.desc=&oБезжалоÑтное уничтожение ÐºÐ°Ð¼Ð½Ñ -tooltip.bloodmagic.bound.axe.desc=&oДемоничеÑÐºÐ°Ñ Ð²Ñ‹Ñ€ÑƒÐ±ÐºÐ° -tooltip.bloodmagic.bound.shovel.desc=&oОчиÑтим пол от грÑзи - -tooltip.bloodmagic.sacrificialDagger.desc=Ðебольшой надрез на пальце... -tooltip.bloodmagic.slate.desc=Камень, наполненный в кровавом алтаре -tooltip.bloodmagic.inscriber.desc=ÐадпиÑи на Ñтене... - -tooltip.bloodmagic.pack.selfSacrifice.desc=Это реально раздражает... -tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=Ðакоплено: %d LP - -tooltip.bloodmagic.activation_crystal.weak=Ðктивирует проÑтые ритуалы -tooltip.bloodmagic.activation_crystal.awakened=Ðктивирует Ñложные ритуалы -tooltip.bloodmagic.activation_crystal.creative=Только Ð´Ð»Ñ Ñ‚Ð²Ð¾Ñ€Ñ‡ÐµÑкого режима. Ðктивирует любые ритуалы - -tooltip.bloodmagic.diviner.currentRitual=Выбранный ритуал: %s -tooltip.bloodmagic.diviner.blankRune=ЧиÑтые руны: %d -tooltip.bloodmagic.diviner.waterRune=Руны воды: %d -tooltip.bloodmagic.diviner.airRune=Руны воздуха: %d -tooltip.bloodmagic.diviner.fireRune=Руны огнÑ: %d -tooltip.bloodmagic.diviner.earthRune=Руны земли: %d -tooltip.bloodmagic.diviner.duskRune=Руны Ñумерек: %d -tooltip.bloodmagic.diviner.dawnRune=Руны раÑÑвета: %d -tooltip.bloodmagic.diviner.totalRune=Ð’Ñего рун: %d -tooltip.bloodmagic.diviner.extraInfo=&9-Удерживайте Shift Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о рунах- -tooltip.bloodmagic.diviner.extraExtraInfo=&9-Удерживайте Shift+M Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о ритуале- -tooltip.bloodmagic.diviner.currentDirection=Ðаправление: %s - -tooltip.bloodmagic.arcaneAshes=Пепел Ð´Ð»Ñ Ð½Ð°Ñ‡ÐµÑ€Ñ‚Ð°Ð½Ð¸Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸Ñ‡ÐµÑких знаков - -tooltip.bloodmagic.telepositionFocus.coords=Координаты: (%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=ID ИзмерениÑ: %d -tooltip.bloodmagic.telepositionFocus.bound=Владелец: %s. Координаты: %d, %d, %d -tooltip.bloodmagic.telepositionFocus.weak=Может перемещать блоки -tooltip.bloodmagic.telepositionFocus.enhanced=Может перемещать блоки -tooltip.bloodmagic.telepositionFocus.reinforced=Может перемещать блоки -tooltip.bloodmagic.telepositionFocus.demonic=Может перемещать блоки - -tooltip.bloodmagic.livingArmour.upgrade.speed=БыÑтрые ноги -tooltip.bloodmagic.livingArmour.upgrade.digging=Сила гномов -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=СтойкоÑÑ‚ÑŒ к Ñдам -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=Твердые ладони -tooltip.bloodmagic.livingArmour.upgrade.knockback=КультуриÑÑ‚ -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=ТолÑÑ‚Ð°Ñ ÐºÐ¾Ð¶Ð° -tooltip.bloodmagic.livingArmour.upgrade.health=Здоровый -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Свирепый удар -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Меткий Ñтрелок -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Ð’Ñ‹Ñокий шаг -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=Избежал Ñмерти -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=Ð¡Ð¾Ð»Ð½ÐµÑ‡Ð½Ð°Ñ ÑÐ½ÐµÑ€Ð³Ð¸Ñ -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=РуничеÑкий щит -tooltip.bloodmagic.livingArmour.upgrade.revealing=Обнаружение -tooltip.bloodmagic.livingArmour.upgrade.experienced=Опытный -tooltip.bloodmagic.livingArmour.upgrade.jump=Сильные ноги -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=ÐœÑгкое падение -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=Копатель могил -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=ЗарÑженный удар -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=Сильный удар -tooltip.bloodmagic.livingArmour.upgrade.elytra=Элитра -tooltip.bloodmagic.livingArmour.upgrade.nightSight=ÐÐ¾Ñ‡Ð½Ð°Ñ Ð´Ð¾Ð±Ð»ÐµÑÑ‚ÑŒ -tooltip.bloodmagic.livingArmour.upgrade.repair=ВоÑÑтанавливающий - -tooltip.bloodmagic.livingArmour.upgrade.slowness=Слабые ноги -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=Ð¡Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ€ÑƒÐºÐ° -tooltip.bloodmagic.livingArmour.upgrade.slippery=Ð¡Ð²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ Ñ‚Ñга -tooltip.bloodmagic.livingArmour.upgrade.battleHunger=Боевой голод -tooltip.bloodmagic.livingArmour.upgrade.quenched=Охлаждение -tooltip.bloodmagic.livingArmour.upgrade.meleeDecrease=Тупой меч -tooltip.bloodmagic.livingArmour.upgrade.digSlowdown=Ð¡Ð»Ð°Ð±Ð°Ñ ÐºÐ¸Ñ€ÐºÐ° -tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=Штурмовик -tooltip.bloodmagic.livingArmour.upgrade.slowHeal=Больной -tooltip.bloodmagic.livingArmour.upgrade.disoriented=Дезориентированный - -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Уровень %d) -tooltip.bloodmagic.livingArmour.upgrade.progress=%s (%d/100) -tooltip.bloodmagic.livingArmour.upgrade.points=&6Очки улучшениÑ: %s / %s - -tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-Удерживайте Shift+M Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ об уровне- - -tooltip.bloodmagic.will=Энергии: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=ИÑпользует демоничеÑкую Ñнергию Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной ÑффективноÑти. -tooltip.bloodmagic.sentientAxe.desc=ИÑпользует демоничеÑкую Ñнергию Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной ÑффективноÑти. -tooltip.bloodmagic.sentientPickaxe.desc=ИÑпользует демоничеÑкую Ñнергию Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной ÑффективноÑти. -tooltip.bloodmagic.sentientShovel.desc=ИÑпользует демоничеÑкую Ñнергию Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной ÑффективноÑти. -tooltip.bloodmagic.soulGem.petty=Этот камень может хранить очень мало Ñнергии -tooltip.bloodmagic.soulGem.lesser=Этот камень может хранить немного Ñнергии -tooltip.bloodmagic.soulGem.common=Этот камень может хранить Ñреднее количеÑтво Ñнергии -tooltip.bloodmagic.soulGem.greater=Этот камень может хранить много Ñнергии -tooltip.bloodmagic.soulGem.grand=Этот камень может хранить очень много Ñнергии -tooltip.bloodmagic.soulSnare.desc=БроÑьте в ÑущеÑтво и затем убейте, что бы получить демоничеÑкую Ñнергию - -tooltip.bloodmagic.itemFilter.exact=Требует точного ÑоответÑÑ‚Ð²Ð¸Ñ -tooltip.bloodmagic.itemFilter.ignoreNBT=ПозволÑет игнорировать NBT -tooltip.bloodmagic.itemFilter.modItems=ПозволÑет отобрать предметы из одного мода -tooltip.bloodmagic.itemFilter.oreDict=Фильтр иÑпользующий Ore Dictionary - -tooltip.bloodmagic.fluid.type=ЖидкоÑÑ‚ÑŒ: %s -tooltip.bloodmagic.fluid.amount=Кол-во: %d / %d мВ -tooltip.bloodmagic.fluid.capacity=ÐмкоÑÑ‚ÑŒ: %d мВ - -tooltip.bloodmagic.ghost.everything=Ð’Ñе -tooltip.bloodmagic.ghost.amount=КоличеÑтво призрачных предметов: %d - -tooltip.bloodmagic.currentType.default=Содержит Ñырую Ñнергию -tooltip.bloodmagic.currentType.corrosive=Содержит коррозионную Ñнергию -tooltip.bloodmagic.currentType.destructive=Содержит разрушающую Ñнергию -tooltip.bloodmagic.currentType.vengeful=Содержит мÑтительную Ñнергию -tooltip.bloodmagic.currentType.steadfast=Содержит уÑтойчивую Ñнергию - -tooltip.bloodmagic.currentBaseType.default=Ð¡Ñ‹Ñ€Ð°Ñ -tooltip.bloodmagic.currentBaseType.corrosive=ÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð¾Ð½Ð½Ð°Ñ -tooltip.bloodmagic.currentBaseType.destructive=Ð Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ -tooltip.bloodmagic.currentBaseType.vengeful=ÐœÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ -tooltip.bloodmagic.currentBaseType.steadfast=УÑÑ‚Ð¾Ð¹Ñ‡Ð¸Ð²Ð°Ñ - -tooltip.bloodmagic.experienceTome=Книга Ð´Ð»Ñ Ñбора опыта -tooltip.bloodmagic.experienceTome.exp=Опыт: %0.3f -tooltip.bloodmagic.experienceTome.expLevel=Уровень: %d - -tooltip.bloodmagic.decoration.safe=БезопаÑно Ð´Ð»Ñ ÑƒÐºÑ€Ð°ÑˆÐµÐ½Ð¸Ñ -tooltip.bloodmagic.decoration.notSafe=ОпаÑно Ð´Ð»Ñ ÑƒÐºÑ€Ð°ÑˆÐµÐ½Ð¸Ñ - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d иÑпользований оÑталоÑÑŒ - -tooltip.bloodmagic.potion.uses=%d иÑпользований оÑталоÑÑŒ - -# Ritual -ritual.bloodmagic.testRitual=ТеÑтовый ритуал -ritual.bloodmagic.waterRitual=Ритуал вызова родника -ritual.bloodmagic.lavaRitual=ÐдÑÐºÐ°Ñ Ñеренада -ritual.bloodmagic.greenGroveRitual=Ритуал зеленой рощи -ritual.bloodmagic.jumpRitual=Ритуал выÑокого прыжка -ritual.bloodmagic.wellOfSufferingRitual=Колодец Страданий -ritual.bloodmagic.featheredKnifeRitual=Ритуал быÑтрого кинжала -ritual.bloodmagic.regenerationRitual=Ритуал регенерации -ritual.bloodmagic.harvestRitual=Ритуал жнеца -ritual.bloodmagic.magneticRitual=Ритуал магнетизма -ritual.bloodmagic.crushingRitual=Ритуал Ð´Ñ€Ð¾Ð±Ð»ÐµÐ½Ð¸Ñ -ritual.bloodmagic.fullStomachRitual=Ритуал ÑытоÑти -ritual.bloodmagic.interdictionRitual=Ритуал запрета -ritual.bloodmagic.containmentRitual=Ритуал ÑÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ -ritual.bloodmagic.speedRitual=Ритуал ÑкороÑти -ritual.bloodmagic.suppressionRitual=Ритуал Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ -ritual.bloodmagic.expulsionRitual=Ðура Ð¸Ð·Ð³Ð½Ð°Ð½Ð¸Ñ -ritual.bloodmagic.zephyrRitual=Зов Зефира -ritual.bloodmagic.upgradeRemoveRitual=Звук Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð¸Ñ Ð´ÑƒÑˆ -ritual.bloodmagic.armourEvolveRitual=Ритуал Ñволюции -ritual.bloodmagic.animalGrowthRitual=Ритуал Шеперда -ritual.bloodmagic.forsakenSoulRitual=Сбор покинутых душ -ritual.bloodmagic.crystalHarvestRitual=Трещина разрушенного криÑталла -ritual.bloodmagic.meteorRitual=Ритуал падающей башни -ritual.bloodmagic.ellipseRitual=Ð¤Ð¾ÐºÑƒÑ ÑллипÑоида -ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius -ritual.bloodmagic.placerRitual=Ðаполнитель -ritual.bloodmagic.fellingRitual=ДровоÑек -ritual.bloodmagic.pumpRitual=Гимн откачки -ritual.bloodmagic.altarBuilderRitual=Строитель Ð°Ð»Ñ‚Ð°Ñ€Ñ -ritual.bloodmagic.portalRitual=Ритуал врат - -ritual.bloodmagic.waterRitual.info=Создаёт иÑточник воды на главном ритуальном камне -ritual.bloodmagic.lavaRitual.info=Создаёт иÑточник лавы на главном ритуальном камне -ritual.bloodmagic.lavaRitual.default.info=(СыраÑ) Уменьшает затраты LP на Ñоздание лавы и позволÑет помещать лаву внутрь привÑзанного контейнера -ritual.bloodmagic.lavaRitual.corrosive.info=(КоррозионнаÑ) Повреждает ÑущноÑтей (ÐаходÑщихÑÑ Ð² зоне дейÑÑ‚Ð²Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°), которые невоÑприимчивы к огню. -ritual.bloodmagic.lavaRitual.destructive.info=(РазрушительнаÑ) Ð Ð°Ð´Ð¸ÑƒÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð»Ð°Ð²Ñ‹ увеличиваетÑÑ Ð² завиÑимоÑти от общей Ñнергии. -ritual.bloodmagic.lavaRitual.vengeful.info=(ÐœÑтительнаÑ) Защищает ÑущноÑтей (ÐаходÑщихÑÑ Ð² зоне дейÑÑ‚Ð²Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°) от огнÑ. -ritual.bloodmagic.lavaRitual.steadfast.info=(УÑтойчиваÑ) Защищает игроков в пределах заданного диапазона от огнÑ. - -# Chat -chat.bloodmagic.altarMaker.setTier=УÑтановить уровень: %d -chat.bloodmagic.altarMaker.building=СтроитÑÑ Ð°Ð»Ñ‚Ð°Ñ€ÑŒ %d ÑƒÑ€Ð¾Ð²Ð½Ñ -chat.bloodmagic.altarMaker.destroy=Разобран алтарь %d ÑƒÑ€Ð¾Ð²Ð½Ñ -chat.bloodmagic.altarMaker.creativeOnly=Предмет только Ð´Ð»Ñ ÐºÑ€ÐµÐ°Ñ‚Ð¸Ð²Ð°. - -chat.bloodmagic.damageSource=Душа %s Ñлишком оÑлабла - -chat.bloodmagic.ritual.weak=Ð’Ñ‹ Ñлишком Ñлабы, чтобы активировать ритуал. -chat.bloodmagic.ritual.prevent=Ритуал ÑопротивлÑетÑÑ Ð’Ð°Ð¼! -chat.bloodmagic.ritual.activate=Потоки Ñнергии текут через ритуал! -chat.bloodmagic.ritual.notValid=Ð’Ñ‹ чувÑтвуете, что руны ÑтоÑÑ‚ неправильно... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=You are starting to feel better already! -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6Темные Ñилы ÑпаÑли Ð²Ð°Ñ Ð·Ð° Ñекунду до Ñмерти! -chat.bloodmagic.livingArmour.newUpgrade=&4Получено улучшение! - -# Commands -commands.bloodmagic.error.arg.invalid=Ðеправильные аргументы -commands.bloodmagic.error.arg.missing=Мало аргументов -commands.bloodmagic.error.arg.player.missing=Ð’Ñ‹ должны указать никнейм игрока -commands.bloodmagic.error.404=Команда не найдена! -commands.bloodmagic.error.unknown=ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°! -commands.bloodmagic.error.perm=У Ð’Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ команды. - -commands.bloodmagic.success=Выполнено уÑпешно - -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help=Отображает информацию о команде "/bloodmagic". - -# JustEnoughItems -jei.bloodmagic.recipe.altar=Кровавый алтарь -jei.bloodmagic.recipe.binding=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° (СвÑзывание) -jei.bloodmagic.recipe.alchemyArrayCrafting=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° -jei.bloodmagic.recipe.soulForge=ÐдÑÐºÐ°Ñ ÐºÑƒÐ·Ð½Ð¸Ñ†Ð° -jei.bloodmagic.recipe.alchemyTable=Стол алхимии -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=Уровень: %d -jei.bloodmagic.recipe.consumptionRate=РаÑход: %d LP/t -jei.bloodmagic.recipe.drainRate=Потери: %d LP/t -jei.bloodmagic.recipe.minimumSouls=Минимум: %1$,.2f Ñнергии -jei.bloodmagic.recipe.soulsDrained=Затраты: %1$,.2f Ñнергии - -jei.bloodmagic.desc.altarBuilder=Креативный предмет, который иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸ и теÑтированиÑ.\n\nShift+ПКМ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° ÑƒÑ€Ð¾Ð²Ð½Ñ Ð°Ð»Ñ‚Ð°Ñ€Ñ. ПКМ по алтарю Ð´Ð»Ñ Ð¿Ð¾Ñтройки.\n\nЛКМ по алтарю чтобы разобрать алтарь. -jei.bloodmagic.desc.demonicWill=An imprint of a demonic entity attached to a creature.\n\nCan be obtained by killing a mob with a sentient weapon or by throwing a snare at a mob and killing it while it has white particles. - -# WAILA -waila.bloodmagic.sneak=&oShift Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ информации -waila.bloodmagic.array.reagent=Реагент: %s -waila.bloodmagic.array.catalyst=Катализатор: %s -option.bloodmagic.bypassSneak=ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±ÐµÐ· Shift -option.bloodmagic.bloodAltar=Кровавый алтарь -option.bloodmagic.bloodTank=Резервуар крови -option.bloodmagic.ritualController=Ритуальные камни -option.bloodmagic.teleposer=Телепозер -option.bloodmagic.array=ÐлхимичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð° - -# Thaumcraft -tc.research_category.BLOODMAGIC=Sanguine Arcana - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=Blood Magic -bloodmagic.research_text.BLOODMAGIC=Sanguine Arcana -bloodmagic.research_page.BLOODMAGIC.1=The realm of the Blood Magics has always appeared to be a more solitary and "individual" art with blood mages being notoriously reclusive and a bit insane at times. However, the powers of self-sacrifice and life essence have uses even beyond a normal blood mage's sight, in fact, it is quite apparent that it may have some uses in thaumaturgy after all! - -# Buttons -button.bloodmagic.tooltip.fill=Заполнить Ñеть diff --git a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang b/src/main/resources/assets/bloodmagic/lang/zh_CN.lang deleted file mode 100644 index d27f9496..00000000 --- a/src/main/resources/assets/bloodmagic/lang/zh_CN.lang +++ /dev/null @@ -1,890 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=血魔法 -itemGroup.bloodmagic.creativeTabTome=血魔法|手册 - -#Items -item.bloodmagic.activation_crystal.weak.name=[虚弱]激活水晶 -item.bloodmagic.activation_crystal.awakened.name=[觉醒]激活水晶 -item.bloodmagic.activation_crystal.creative.name=[创造]激活水晶 - -item.bloodmagic.sacrificial_dagger.normal.name=牺牲匕首 -item.bloodmagic.sacrificial_dagger.creative.name=[创造]牺牲匕首 -item.bloodmagic.pack.selfSacrifice.name=血液背包 -item.bloodmagic.pack.sacrifice.name=斗士铠衣 -item.bloodmagic.daggerOfSacrifice.name=献祭刀 - -item.bloodmagic.lavaCrystal.name=熔岩晶体 - -item.bloodmagic.bound.sword.name=æŸç¼šä¹‹å‰‘ -item.bloodmagic.bound.pickaxe.name=æŸç¼šä¹‹é• -item.bloodmagic.bound.axe.name=æŸç¼šä¹‹æ–§ -item.bloodmagic.bound.shovel.name=æŸç¼šä¹‹é”¹ - -item.bloodmagic.bucket.lifeEssence.name=生命æºè´¨æ¡¶ - -item.bloodmagic.scribe.water.name=元素铭文工具:水 -item.bloodmagic.scribe.fire.name=å…ƒç´ é“­æ–‡å·¥å…·ï¼šç« -item.bloodmagic.scribe.earth.name=元素铭文工具:土 -item.bloodmagic.scribe.air.name=元素铭文工具:风 -item.bloodmagic.scribe.dusk.name=元素铭文工具:薄暮 -item.bloodmagic.scribe.dawn.name=元素铭文工具:破晓 - -item.bloodmagic.focus.weak.name=ä¼ é€æ ¸å¿ƒ -item.bloodmagic.focus.enhanced.name=[加强]ä¼ é€æ ¸å¿ƒ -item.bloodmagic.focus.reinforced.name=[强化]ä¼ é€æ ¸å¿ƒ -item.bloodmagic.focus.demonic.name=[æ¶é­”]ä¼ é€æ ¸å¿ƒ - -item.bloodmagic.slate.blank.name=ç©ºç™½çŸ³æ¿ -item.bloodmagic.slate.reinforced.name=å¼ºåŒ–çŸ³æ¿ -item.bloodmagic.slate.imbued.name=çŒè¾“çŸ³æ¿ -item.bloodmagic.slate.demonic.name=æ¶é­”çŸ³æ¿ -item.bloodmagic.slate.ethereal.name=æ‚¬å¹½çŸ³æ¿ - -item.bloodmagic.orb.weak.name=[虚弱]气血å®ç  -item.bloodmagic.orb.apprentice.name=[学徒]气血å®ç  -item.bloodmagic.orb.magician.name=[法师]气血å®ç  -item.bloodmagic.orb.master.name=[导师]气血å®ç  -item.bloodmagic.orb.archmage.name=[贤者]气血å®ç  -item.bloodmagic.orb.transcendent.name=[å“越]气血å®ç  - -item.bloodmagic.reagent.incendium.name=烈焰元素 -item.bloodmagic.reagent.magicales.name=魔法元素 -item.bloodmagic.reagent.sanctus.name=神圣元素 -item.bloodmagic.reagent.aether.name=以太元素 -item.bloodmagic.reagent.crepitous.name=爆破元素 -item.bloodmagic.reagent.crystallos.name=冰晶元素 -item.bloodmagic.reagent.terrae.name=大地元素 -item.bloodmagic.reagent.aquasalus.name=液之元素 -item.bloodmagic.reagent.tennebrae.name=暗黑元素 -item.bloodmagic.reagent.offensa.name=攻势元素 -item.bloodmagic.reagent.praesidium.name=守护元素 -item.bloodmagic.reagent.orbisterrae.name=奥土元素 -item.bloodmagic.reagent.virtus.name=力é‡å…ƒç´  -item.bloodmagic.reagent.reductus.name=代价元素 -item.bloodmagic.reagent.potentia.name=效能元素 - -item.bloodmagic.blood_shard.weak.name=[虚弱]气血碎片 -item.bloodmagic.blood_shard.demonic.name=[æ¶é­”]气血碎片 - -item.bloodmagic.baseComponent.reagent_water.name=水之试剂 -item.bloodmagic.baseComponent.reagent_lava.name=熔岩试剂 -item.bloodmagic.baseComponent.reagent_air.name=风之试剂 -item.bloodmagic.baseComponent.reagent_fast_miner.name=采掘试剂 -item.bloodmagic.baseComponent.reagent_void.name=虚空试剂 -item.bloodmagic.baseComponent.reagent_growth.name=促生试剂 -item.bloodmagic.baseComponent.reagent_affinity.name=元素试剂 -item.bloodmagic.baseComponent.reagent_sight.name=è§è§£è¯•å‰‚ -item.bloodmagic.baseComponent.reagent_binding.name=æŸç¼šè¯•å‰‚ -item.bloodmagic.baseComponent.reagent_suppression.name=抑液试剂 -item.bloodmagic.baseComponent.reagent_bloodlight.name=血光试剂 -item.bloodmagic.baseComponent.reagent_magnetism.name=ç£å¼•è¯•å‰‚ -item.bloodmagic.baseComponent.reagent_haste.name=急速试剂 -item.bloodmagic.baseComponent.reagent_bridge.name=影桥试剂 -item.bloodmagic.baseComponent.reagent_compression.name=压挤试剂 -item.bloodmagic.baseComponent.reagent_severance.name=éš”ç»è¯•å‰‚ -item.bloodmagic.baseComponent.reagent_holding.name=集æŒè¯•å‰‚ -item.bloodmagic.baseComponent.reagent_claw.name=爪之试剂 -item.bloodmagic.baseComponent.reagent_bounce.name=弹性试剂 -item.bloodmagic.baseComponent.reagent_frost.name=霜之试剂 -item.bloodmagic.baseComponent.reagent_teleposition.name=ä¼ é€è¯•å‰‚ -item.bloodmagic.baseComponent.reagent_transposition.name=移ä½è¯•å‰‚ - -item.bloodmagic.baseComponent.frame_part.name=框架零件 -item.bloodmagic.baseComponent.sand_iron.name=é“矿砂 -item.bloodmagic.baseComponent.sand_gold.name=金矿砂 -item.bloodmagic.baseComponent.sand_coal.name=煤矿砂 -item.bloodmagic.baseComponent.plant_oil.name=æ¤ç‰©æ²¹ -item.bloodmagic.baseComponent.sulfur.name=硫磺 -item.bloodmagic.baseComponent.saltpeter.name=ç¡çŸ³ -item.bloodmagic.baseComponent.neuro_toxin.name=神ç»æ¯’ç´  -item.bloodmagic.baseComponent.antiseptic.name=防è…剂 -item.bloodmagic.baseComponent.catalyst_length_1.name=简å•çš„延时催化剂 -item.bloodmagic.baseComponent.catalyst_power_1.name=简å•çš„功效催化剂 - -item.bloodmagic.cutting_fluid.basic.name=基础切削油 -item.bloodmagic.cutting_fluid.explosive.name=爆炸ç«è¯ - -item.bloodmagic.demonCrystal.default.name=æ¶é­”æ„志晶体 -item.bloodmagic.demonCrystal.corrosive.name=è…蚀æ„志晶体 -item.bloodmagic.demonCrystal.destructive.name=ç ´åæ„志晶体 -item.bloodmagic.demonCrystal.vengeful.name=å¤ä»‡æ„志晶体 -item.bloodmagic.demonCrystal.steadfast.name=åšæ¯…æ„志晶体 - -item.bloodmagic.monster_soul.raw.name=[原生]æ¶é­”æ„å¿— -item.bloodmagic.monster_soul.corrosive.name=[è…蚀]æ¶é­”æ„å¿— -item.bloodmagic.monster_soul.destructive.name=[ç ´å]æ¶é­”æ„å¿— -item.bloodmagic.monster_soul.vengeful.name=[å¤ä»‡]æ¶é­”æ„å¿— -item.bloodmagic.monster_soul.steadfast.name=[åšæ¯…]æ¶é­”æ„å¿— - -item.bloodmagic.sigil.air.name=风之å°è®° -item.bloodmagic.sigil.blood_light.name=血光å°è®° -item.bloodmagic.sigil.compression.name=压挤å°è®° -item.bloodmagic.sigil.divination.name=å åœå°è®° -item.bloodmagic.sigil.water.name=水之å°è®° -item.bloodmagic.sigil.lava.name=熔岩å°è®° -item.bloodmagic.sigil.void.name=虚空å°è®° -item.bloodmagic.sigil.green_grove.name=绿丛å°è®° -item.bloodmagic.sigil.elemental_affinity.name=元素å°è®° -item.bloodmagic.sigil.haste.name=急速å°è®° -item.bloodmagic.sigil.suppression.name=抑液å°è®° -item.bloodmagic.sigil.magnetism.name=ç£å¼•å°è®° -item.bloodmagic.sigil.fast_miner.name=速掘å°è®° -item.bloodmagic.sigil.seer.name=è§è§£å°è®° -item.bloodmagic.sigil.phantom_bridge.name=影桥å°è®° -item.bloodmagic.sigil.whirlwind.name=旋风å°è®° -item.bloodmagic.sigil.ender_severance.name=ç»å½±å°è®° -item.bloodmagic.sigil.holding.name=集æŒå°è®° -item.bloodmagic.sigil.holding.display=&r%s:&o&n%s -item.bloodmagic.sigil.teleposition.name=ä¼ é€å°è®° -item.bloodmagic.sigil.transposition.name=移ä½å°è®° -item.bloodmagic.sigil.claw.name=爪之å°è®° -item.bloodmagic.sigil.bounce.name=弹性å°è®° -item.bloodmagic.sigil.frost.name=冰霜å°è®° - -item.bloodmagic.livingArmour.helmet.name=æŸçµå¤´ç›” -item.bloodmagic.livingArmour.chest.name=æŸçµèƒ¸ç”² -item.bloodmagic.livingArmour.legs.name=æŸçµæŠ¤è…¿ -item.bloodmagic.livingArmour.boots.name=æŸçµé´å­ -item.bloodmagic.sentientArmour.helmet.name=感知头盔 -item.bloodmagic.sentientArmour.chest.name=感知胸甲 -item.bloodmagic.sentientArmour.legs.name=感知护腿 -item.bloodmagic.sentientArmour.boots.name=感知é´å­ - -item.bloodmagic.altarMaker.name=祭å›æ­å»ºå·¥å…· - -item.bloodmagic.ritualDivinernormal.name=仪å¼æŽ¨æµ‹ä»— -item.bloodmagic.ritualDivinerdusk.name=仪å¼æŽ¨æµ‹ä»— [è–„æš®] -item.bloodmagic.ritualDivinerdawn.name=仪å¼æŽ¨æµ‹ä»— [破晓] -item.bloodmagic.ritualReader.name=仪å¼è°ƒæ•´é’³ - -item.bloodmagic.arcaneAshes.name=å¥¥æœ¯ç²‰ç° -item.bloodmagic.upgradeTome.name=æŸçµç›”甲强化手册 -item.bloodmagic.downgradeTome.name=æŸçµç›”甲é™çº§æ‰‹å†Œ -item.bloodmagic.upgradeTrainer.name=æŸçµç›”甲训练手镯 - -item.bloodmagic.sentientSword.name=感知之剑 -item.bloodmagic.soulGem.petty.name=[å¾®å°]地狱魂石 -item.bloodmagic.soulGem.lesser.name=[细å—]地狱魂石 -item.bloodmagic.soulGem.common.name=[普通]地狱魂石 -item.bloodmagic.soulGem.greater.name=[较大]地狱魂石 -item.bloodmagic.soulGem.grand.name=[精制]地狱魂石 -item.bloodmagic.soulSnare.base.name=原始投网 -item.bloodmagic.sentientBow.name=感知之弓 -item.bloodmagic.sentientArmourGem.name=感知盔甲å®çŸ³ -item.bloodmagic.sentientAxe.name=感知之斧 -item.bloodmagic.sentientPickaxe.name=æ„ŸçŸ¥ä¹‹é• -item.bloodmagic.sentientShovel.name=感知之锹 - -item.bloodmagic.nodeRouter.name=节点连接工具 -item.bloodmagic.itemFilter.exact.name=精确物å“筛选器 -item.bloodmagic.itemFilter.ignoreNBT.name=NBT物å“筛选器 -item.bloodmagic.itemFilter.modItems.name=Mod物å“筛选器 -item.bloodmagic.itemFilter.oreDict.name=矿物物å“筛选器 -item.bloodmagic.fluidFilter.exact.name=精确液体筛选器 - -item.bloodmagic.experienceTome.name=ç»éªŒæ‰‹å†Œ -item.bloodmagic.sanguineBook.name=指示之书 - -item.bloodmagic.living_point_upgrade.draft_angelus.name=祷告之始 - -item.bloodmagic.willGauge.name=çµåŸŸæµ‹é‡ä»ª -item.bloodmagic.potionFlask.name=è¯å‰‚瓶 - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=生命æºè´¨ - -tile.bloodmagic.stone.ritual.master.name=主仪å¼çŸ³ -tile.bloodmagic.stone.ritual.imperfect.name=ä¸å®Œå–„的仪å¼çŸ³ -tile.bloodmagic.stone.ritual.inverted.name=å转的主仪å¼çŸ³ - -tile.bloodmagic.altar.name=è¡€ä¹‹ç¥­å› -tile.bloodmagic.alchemyArray.name=炼金矩阵 - -tile.bloodmagic.rune.blank.name=空白符文 -tile.bloodmagic.rune.speed.name=速度符文 -tile.bloodmagic.rune.efficiency.name=效率符文 -tile.bloodmagic.rune.sacrifice.name=献祭符文 -tile.bloodmagic.rune.self_sacrifice.name=牺牲符文 -tile.bloodmagic.rune.displacement.name=转ä½ç¬¦æ–‡ -tile.bloodmagic.rune.capacity.name=增容符文 -tile.bloodmagic.rune.augmented_capacity.name=超容符文 -tile.bloodmagic.rune.orb.name=å®ç ç¬¦æ–‡ -tile.bloodmagic.rune.acceleration.name=促进符文 -tile.bloodmagic.rune.charging.name=充能符文 - - -tile.bloodmagic.ritualStone.blank.name=仪å¼çŸ³ -tile.bloodmagic.ritualStone.water.name=水之仪å¼çŸ³ -tile.bloodmagic.ritualStone.fire.name=ç«ä¹‹ä»ªå¼çŸ³ -tile.bloodmagic.ritualStone.earth.name=土之仪å¼çŸ³ -tile.bloodmagic.ritualStone.air.name=风之仪å¼çŸ³ -tile.bloodmagic.ritualStone.dusk.name=薄暮仪å¼çŸ³ -tile.bloodmagic.ritualStone.dawn.name=破晓仪å¼çŸ³ - -tile.bloodmagic.bloodstone_tile.name=大血石砖 -tile.bloodmagic.bloodstone_brick.name=血石砖 -tile.bloodmagic.crystal_tile.name=æ™¶ç°‡å— -tile.bloodmagic.crystal_brick.name=晶簇砖 -tile.bloodmagic.bloodLight.name=è¡€ä¹‹å…‰æº -tile.bloodmagic.spectralBlock.name=å¹½çµæ–¹å— -tile.bloodmagic.phantom.name=å½±æ¡¥æ–¹å— -tile.bloodmagic.incenseAltar.name=ç†é¦™ç¥­å› - -tile.bloodmagic.teleposer.name=ä¼ é€å™¨ -tile.bloodmagic.soulForge.name=狱ç«ç†”炉 -tile.bloodmagic.alchemyTable.name=炼金术桌 -tile.bloodmagic.demonCrucible.name=æ¶é­”å©åŸš -tile.bloodmagic.demonPylon.name=æ¶é­”导能塔 -tile.bloodmagic.demonCrystallizer.name=æ¶é­”ç»“æ™¶å› - -tile.bloodmagic.masterRouting.name=主控路由节点 -tile.bloodmagic.outputRouting.name=输出路由节点 -tile.bloodmagic.inputRouting.name=输入路由节点 -tile.bloodmagic.itemRouting.name=路由节点 - -tile.bloodmagic.path.wood.name=æœ¨åˆ¶è·¯é¢ -tile.bloodmagic.path.woodtile.name=æœ¨ç“¦è·¯é¢ -tile.bloodmagic.path.stone.name=çŸ³ç –è·¯é¢ -tile.bloodmagic.path.stonetile.name=çŸ³ç“¦è·¯é¢ -tile.bloodmagic.path.wornstone.name=ç¢ŽçŸ³ç –è·¯é¢ -tile.bloodmagic.path.wornstonetile.name=ç¢ŽçŸ³è·¯é¢ -tile.bloodmagic.path.obsidian.name=é»‘æ›œçŸ³ç –è·¯é¢ -tile.bloodmagic.path.obsidiantile.name=é»‘æ›œçŸ³ç“¦è·¯é¢ - -tile.bloodmagic.dimensionalPortal.name=空间传é€é—¨ -tile.bloodmagic.bloodTank.name=è¡€æ³•å¸ˆçš„å‚¨ç½ - -tile.bloodmagic.demonCrystal.default.name=[原生]æ„志晶簇 -tile.bloodmagic.demonCrystal.corrosive.name=[è…蚀]æ„志晶簇 -tile.bloodmagic.demonCrystal.destructive.name=[ç ´å]æ„志晶簇 -tile.bloodmagic.demonCrystal.vengeful.name=[å¤ä»‡]æ„志晶簇 -tile.bloodmagic.demonCrystal.steadfast.name=[åšæ¯…]æ„志晶簇 - -tile.bloodmagic.mimic.nohitbox.name=[悬幽]æ‹Ÿæ€æ–¹å— -tile.bloodmagic.mimic.solidopaque.name=æ‹Ÿæ€æ–¹å— -tile.bloodmagic.mimic.solidclear.name=[清é€]æ‹Ÿæ€æ–¹å— -tile.bloodmagic.mimic.solidlight.name=[光亮]æ‹Ÿæ€æ–¹å— -tile.bloodmagic.mimic.sentient.name=[感知]æ‹Ÿæ€æ–¹å— - -tile.bloodmagic.bricks1.brick1_raw.name=原生石砖 -tile.bloodmagic.bricks1.brick1_corrosive.name=è…蚀石砖 -tile.bloodmagic.bricks1.brick1_destructive.name=ç ´å石砖 -tile.bloodmagic.bricks1.brick1_vengeful.name=å¤ä»‡çŸ³ç – -tile.bloodmagic.bricks1.brick1_steadfast.name=åšæ¯…石砖 - -tile.bloodmagic.bricks2.smallbrick_raw.name=å°åŽŸç”ŸçŸ³ç – -tile.bloodmagic.bricks2.smallbrick_corrosive.name=å°è…蚀石砖 -tile.bloodmagic.bricks2.smallbrick_destructive.name=å°ç ´å石砖 -tile.bloodmagic.bricks2.smallbrick_vengeful.name=å°å¤ä»‡çŸ³ç – -tile.bloodmagic.bricks2.smallbrick_steadfast.name=å°åšæ¯…石砖 -tile.bloodmagic.bricks2.tile_raw.name=原生石瓦 -tile.bloodmagic.bricks2.tile_corrosive.name=è…蚀石瓦 -tile.bloodmagic.bricks2.tile_destructive.name=ç ´å石瓦 -tile.bloodmagic.bricks2.tile_vengeful.name=å¤ä»‡çŸ³ç“¦ -tile.bloodmagic.bricks2.tile_steadfast.name=åšæ¯…石瓦 -tile.bloodmagic.bricks2.tilespecial_raw.name=二é‡åŽŸç”ŸçŸ³ç“¦ -tile.bloodmagic.bricks2.tilespecial_corrosive.name=二é‡è…蚀石瓦 -tile.bloodmagic.bricks2.tilespecial_destructive.name=二é‡ç ´å石瓦 -tile.bloodmagic.bricks2.tilespecial_vengeful.name=二é‡å¤ä»‡çŸ³ç“¦ -tile.bloodmagic.bricks2.tilespecial_steadfast.name=二é‡åšæ¯…石瓦 - -tile.bloodmagic.inversionpillar.raw.name=[原生]å转柱 -tile.bloodmagic.inversionpillar.corrosive.name=[è…蚀]å转柱 -tile.bloodmagic.inversionpillar.destructive.name=[ç ´å]å转柱 -tile.bloodmagic.inversionpillar.vengeful.name=[å¤ä»‡]å转柱 -tile.bloodmagic.inversionpillar.steadfast.name=[åšæ¯…]å转柱 - -tile.bloodmagic.inversionpillarend.raw_bottom.name=[原生]å转柱基 -tile.bloodmagic.inversionpillarend.corrosive_bottom.name=[è…蚀]å转柱基 -tile.bloodmagic.inversionpillarend.destructive_bottom.name=[ç ´å]å转柱基 -tile.bloodmagic.inversionpillarend.vengeful_bottom.name=[å¤ä»‡]å转柱基 -tile.bloodmagic.inversionpillarend.steadfast_bottom.name=[åšæ¯…]å转柱基 -tile.bloodmagic.inversionpillarend.raw_top.name=[原生]å转柱顶盖 -tile.bloodmagic.inversionpillarend.corrosive_top.name=[è…蚀]å转柱顶盖 -tile.bloodmagic.inversionpillarend.destructive_top.name=[ç ´å]å转柱顶盖 -tile.bloodmagic.inversionpillarend.vengeful_top.name=[å¤ä»‡]å转柱顶盖 -tile.bloodmagic.inversionpillarend.steadfast_top.name=[åšæ¯…]å转柱顶盖 - -tile.bloodmagic.demonlight.raw.name=[原生]æ„志之瞳 -tile.bloodmagic.demonlight.corrosive.name=[è…蚀]æ„志之瞳 -tile.bloodmagic.demonlight.destructive.name=[ç ´å]æ„志之瞳 -tile.bloodmagic.demonlight.vengeful.name=[å¤ä»‡]æ„志之瞳 -tile.bloodmagic.demonlight.steadfast.name=[åšæ¯…]æ„志之瞳 - -tile.bloodmagic.extras.stone_raw.name=原生石头 -tile.bloodmagic.extras.stone_corrosive.name=è…蚀石头 -tile.bloodmagic.extras.stone_destructive.name=ç ´å石头 -tile.bloodmagic.extras.stone_vengeful.name=å¤ä»‡çŸ³å¤´ -tile.bloodmagic.extras.stone_steadfast.name=åšæ¯…石头 - -tile.bloodmagic.extras.polished_raw.name=磨制原生石 -tile.bloodmagic.extras.polished_corrosive.name=磨制è…蚀石 -tile.bloodmagic.extras.polished_destructive.name=磨制破å石 -tile.bloodmagic.extras.polished_vengeful.name=磨制å¤ä»‡çŸ³ -tile.bloodmagic.extras.polished_steadfast.name=磨制åšæ¯…石 - -tile.bloodmagic.extras.metal_raw.name=原生æ„å¿—åˆé‡‘ -tile.bloodmagic.extras.metal_corrosive.name=è…蚀æ„å¿—åˆé‡‘ -tile.bloodmagic.extras.metal_destructive.name=ç ´åæ„å¿—åˆé‡‘ -tile.bloodmagic.extras.metal_vengeful.name=å¤ä»‡æ„å¿—åˆé‡‘ -tile.bloodmagic.extras.metal_steadfast.name=åšæ¯…æ„å¿—åˆé‡‘ - -tile.bloodmagic.pillar1.raw.name=原生石柱 -tile.bloodmagic.pillar1.corrosive.name=è…蚀石柱 -tile.bloodmagic.pillar1.destructive.name=ç ´å石柱 -tile.bloodmagic.pillar1.vengeful.name=å¤ä»‡çŸ³æŸ± -tile.bloodmagic.pillar1.steadfast.name=åšæ¯…石柱 - -tile.bloodmagic.pillar2.raw.name=二é‡åŽŸç”ŸçŸ³æŸ± -tile.bloodmagic.pillar2.corrosive.name=二é‡è…蚀石柱 -tile.bloodmagic.pillar2.destructive.name=二é‡ç ´å石柱 -tile.bloodmagic.pillar2.vengeful.name=二é‡å¤ä»‡çŸ³æŸ± -tile.bloodmagic.pillar2.steadfast.name=二é‡åšæ¯…石柱 - -tile.bloodmagic.pillarCap1.raw.name=原生顶柱 -tile.bloodmagic.pillarCap1.corrosive.name=è…蚀顶柱 -tile.bloodmagic.pillarCap2.destructive.name=ç ´å顶柱 -tile.bloodmagic.pillarCap2.vengeful.name=å¤ä»‡é¡¶æŸ± -tile.bloodmagic.pillarCap3.steadfast.name=åšæ¯…顶柱 - -tile.bloodmagic.wall1.brick_raw.name=原生石砖墙 -tile.bloodmagic.wall1.brick_corrosive.name=è…蚀石砖墙 -tile.bloodmagic.wall1.brick_destructive.name=ç ´å石砖墙 -tile.bloodmagic.wall1.brick_vengeful.name=å¤ä»‡çŸ³ç –墙 -tile.bloodmagic.wall1.brick_steadfast.name=åšæ¯…石砖墙 -tile.bloodmagic.wall1.smallbrick_raw.name=å°åŽŸç”ŸçŸ³ç –墙 -tile.bloodmagic.wall1.smallbrick_corrosive.name=å°è…蚀石砖墙 -tile.bloodmagic.wall1.smallbrick_destructive.name=å°ç ´å石砖墙 -tile.bloodmagic.wall1.smallbrick_vengeful.name=å°å¤ä»‡çŸ³ç –墙 -tile.bloodmagic.wall1.smallbrick_steadfast.name=å°åšæ¯…石砖墙 -tile.bloodmagic.wall1.large_raw.name=原生石墙 -tile.bloodmagic.wall1.large_corrosive.name=è…蚀石墙 -tile.bloodmagic.wall1.large_destructive.name=ç ´å石墙 -tile.bloodmagic.wall1.large_vengeful.name=å¤ä»‡çŸ³å¢™ -tile.bloodmagic.wall1.large_steadfast.name=åšæ¯…石墙 - -tile.bloodmagic.stairs1.raw.name=原生石楼梯 -tile.bloodmagic.stairs1.corrosive.name=è…蚀石楼梯 -tile.bloodmagic.stairs2.destructive.name=ç ´å石楼梯 -tile.bloodmagic.stairs2.vengeful.name=å¤ä»‡çŸ³æ¥¼æ¢¯ -tile.bloodmagic.stairs3.steadfast.name=åšæ¯…石楼梯 - -# Fluids -fluid.lifeEssence=生命æºè´¨ - -# Tooltips -tooltip.bloodmagic.extraInfo=&9-æŒ‰ä½ Shift 了解更多信æ¯- - -tooltip.bloodmagic.orb.desc=储存原生的生命æºè´¨ -tooltip.bloodmagic.orb.owner=æ¥æºï¼š%s -tooltip.bloodmagic.currentOwner=当å‰æ‰€æœ‰è€…:%s -tooltip.bloodmagic.currentTier=当å‰å±‚级:%d -tooltip.bloodmagic.config.disabled=于é…置信æ¯ä¸­ç¦ç”¨ -tooltip.bloodmagic.tier=层级 %d - -tooltip.bloodmagic.activated=激活 -tooltip.bloodmagic.deactivated=åœç”¨ - -tooltip.bloodmagic.sigil.air.desc=&o我感到轻æ¾å¤šäº†... -tooltip.bloodmagic.sigil.blood_light.desc=&o我看è§äº†ä¸€æŸå…‰æ˜Ž! -tooltip.bloodmagic.sigil.compression.desc=&o钻石之手 -tooltip.bloodmagic.sigil.divination.desc=&o窥视çµé­‚ -tooltip.bloodmagic.sigil.divination.otherNetwork=窥视 %s çš„çµé­‚ -tooltip.bloodmagic.sigil.divination.currentAltarTier=当å‰å±‚级:%d -tooltip.bloodmagic.sigil.divination.currentEssence=当å‰æºè´¨ï¼š%d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=当å‰å®¹é‡ï¼š%d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=当å‰é™è°§ï¼š%d -tooltip.bloodmagic.sigil.divination.currentInversion=当å‰å转:%d -tooltip.bloodmagic.sigil.divination.currentBonus=当å‰æ•ˆç›Šï¼š+%d%% -tooltip.bloodmagic.sigil.water.desc=&oæ— é™æ°´æº? -tooltip.bloodmagic.sigil.lava.desc=&o噢好烫! ä¸è¦åƒ -tooltip.bloodmagic.sigil.void.desc=&o胜过速易æ´Â®! -tooltip.bloodmagic.sigil.green_grove.desc=&o绿色环ä¿æ— æ±¡æŸ“ -tooltip.bloodmagic.sigil.magnetism.desc=&o我现在éžå¸¸å…·æœ‰å¸å¼•åŠ› -tooltip.bloodmagic.sigil.suppression.desc=&o比念力移动更好... -tooltip.bloodmagic.sigil.haste.desc=&o42继咖啡因åŽ... -tooltip.bloodmagic.sigil.fast_miner.desc=&o继续挖, 继续挖... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oè½å…¥ç„°ä¸­çš„鱼儿! -tooltip.bloodmagic.sigil.seer.desc=&o当看到的一切还ä¸è¶³å¤Ÿ -tooltip.bloodmagic.sigil.seer.currentAltarProgress=当å‰è¿›åº¦ï¼š%d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=当å‰è¿›åº¦ï¼š%s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=消耗率:%d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=当å‰å±‚级:%d -tooltip.bloodmagic.sigil.seer.currentEssence=当å‰æºè´¨ï¼š%d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=当å‰å®¹é‡ï¼š%d LP -tooltip.bloodmagic.sigil.seer.currentCharge=当å‰å‚¨èƒ½ï¼š%d -tooltip.bloodmagic.sigil.seer.currentTranquility=当å‰é™è°§ï¼š%d -tooltip.bloodmagic.sigil.seer.currentBonus=当å‰æ•ˆç›Šï¼š+%d%% -tooltip.bloodmagic.sigil.phantom_bridge.desc=&o御气于é’空之上... -tooltip.bloodmagic.sigil.whirlwind.desc=&o最好ä¸è¦ç©¿è£™å­ -tooltip.bloodmagic.sigil.ender_severance.desc=&o使末影人é‡ä¸Šä¸€ä¸ªä¸¥å³»å½¢åŠ¿ï¼ -tooltip.bloodmagic.sigil.teleposition.desc=éšæ—¶å¯ä»¥è„±ç¦»è¿™é‡Œã€‚ -tooltip.bloodmagic.sigil.transposition.desc=æ„Ÿå—原力的力é‡ï¼Œæˆ‘年轻的学徒。 -tooltip.bloodmagic.sigil.holding.press=按下&o%s&r&7修改 -tooltip.bloodmagic.sigil.holding.desc=å°è®°æŽŒæŽ§ -tooltip.bloodmagic.sigil.holding.sigilInSlot=å°è®° %d:%s - -tooltip.bloodmagic.livingArmourPointsUpgrade.desc=æå‡æ„ŸçŸ¥ç›”甲的最大点数至 %d。 - -tooltip.bloodmagic.bound.sword.desc=&oå± æ€å¹¼å¼±ä¹‹ç”Ÿçµ -tooltip.bloodmagic.bound.pickaxe.desc=&o无情地凿通大地 -tooltip.bloodmagic.bound.axe.desc=&oæ¶é­”般的滥ç æ»¥ä¼ -tooltip.bloodmagic.bound.shovel.desc=&o洗扫大地除去尘土 - -tooltip.bloodmagic.sacrificialDagger.desc=åªè¦è½»è½»åˆ’过手指... -tooltip.bloodmagic.sacrificialDagger.creative=对ç€ç¥­å›æ½œè¡Œå³å‡»å¡«æ»¡ -tooltip.bloodmagic.slate.desc=在祭å›ä¸­å°†çŸ³å¤´è½¬åŒ– -tooltip.bloodmagic.inscriber.desc=在墙é¢ä¸Šçš„文字... - -tooltip.bloodmagic.pack.selfSacrifice.desc=相当ä¸èˆ’适的背包... -tooltip.bloodmagic.pack.sacrifice.desc=æè¿° -tooltip.bloodmagic.pack.stored=储存:%d LP - -tooltip.bloodmagic.activation_crystal.weak=æ¿€æ´»ä½Žç­‰ä»ªå¼ -tooltip.bloodmagic.activation_crystal.awakened=æ¿€æ´»æ›´å¼ºå¤§çš„ä»ªå¼ -tooltip.bloodmagic.activation_crystal.creative=åˆ›é€ æ¨¡å¼ - æ¿€æ´»ä»»ä½•ä»ªå¼ - -tooltip.bloodmagic.diviner.currentRitual=当å‰ä»ªå¼: -tooltip.bloodmagic.diviner.blankRune=空白仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.waterRune=水之仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.airRune=风之仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.fireRune=ç«ä¹‹ä»ªå¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.earthRune=土之仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.duskRune=薄暮仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.dawnRune=破晓仪å¼çŸ³ï¼š%d -tooltip.bloodmagic.diviner.totalRune=仪å¼çŸ³æ€»æ•°ï¼š%d -tooltip.bloodmagic.diviner.extraInfo=&9-按 Shift 了解详细信æ¯- -tooltip.bloodmagic.diviner.extraExtraInfo=&9-æŒ‰ä½ Shift + M 展开更多信æ¯- -tooltip.bloodmagic.diviner.currentDirection=当å‰æœå‘:%s - -tooltip.bloodmagic.ritualReader.currentState=当å‰æ¨¡å¼ï¼š%s -tooltip.bloodmagic.ritualReader.set_area=定义区域 -tooltip.bloodmagic.ritualReader.information=ä¿¡æ¯ -tooltip.bloodmagic.ritualReader.set_will_types=设置æ„志消耗 -tooltip.bloodmagic.ritualReader.desc.set_area=å³å‡»å·²æ¿€æ´»ä»ªå¼çš„主仪å¼çŸ³ï¼Œé€‰è‡³ä½ æƒ³æ›´æ”¹çš„区域,éšåŽåˆ†åˆ«å³å‡»æ–°åŒºåŸŸè§’è½çš„两个方å—。 -tooltip.bloodmagic.ritualReader.desc.information=å³å‡»å·²æ¿€æ´»ä»ªå¼çš„主仪å¼çŸ³äº†è§£ä»ªå¼çš„基本信æ¯ã€‚ -tooltip.bloodmagic.ritualReader.desc.set_will_types=设置仪å¼å°†æ¶ˆè€—çš„æ¶é­”æ„志类型, 工具æ ä¸­å­˜æ”¾è¯¥ç±»æ™¶ä½“å³å‡»ä¸»ä»ªå¼çŸ³. - -tooltip.bloodmagic.arcaneAshes=ç”¨äºŽç»˜åˆ¶ç‚¼é‡‘çŸ©é˜µçš„ç²‰ç° - -tooltip.bloodmagic.telepositionFocus.coords=当å‰å标:(%d, %d, %d) -tooltip.bloodmagic.telepositionFocus.dimension=世界ID:%d -tooltip.bloodmagic.telepositionFocus.bound=绑定:%s 于 %d, %d, %d -tooltip.bloodmagic.telepositionFocus.weak=用于在世界中转移区域 -tooltip.bloodmagic.telepositionFocus.enhanced=用于在世界中转移区域 -tooltip.bloodmagic.telepositionFocus.reinforced=用于在世界中转移区域 -tooltip.bloodmagic.telepositionFocus.demonic=用于在世界中转移区域 - -tooltip.bloodmagic.livingArmour.upgrade.speed=è¿…æ·åŒè¶³ -tooltip.bloodmagic.livingArmour.upgrade.digging=çŸ®äººåŠ›é‡ -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=抗毒体质 -tooltip.bloodmagic.livingArmour.upgrade.fireResist=ç„°ç«ä¹‹ç¤¼ -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=结实手心 -tooltip.bloodmagic.livingArmour.upgrade.knockback=强劲身躯 -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=åšéŸ§çš®è‚¤ -tooltip.bloodmagic.livingArmour.upgrade.health=å¥å£®ä½“è´¨ -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=猛烈击打 -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=å°„å‡»è¯€çª -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=æ­¥ä¼è¡¥åŠ© -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=死神竞跑 -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=é˜³å…‰èƒ½é‡ -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=å¤ç¢‘守护 -tooltip.bloodmagic.livingArmour.upgrade.revealing=æ­ç¤º -tooltip.bloodmagic.livingArmour.upgrade.experienced=熟练 -tooltip.bloodmagic.livingArmour.upgrade.jump=壮实åŒè…¿ -tooltip.bloodmagic.livingArmour.upgrade.fallProtect=柔和è½å¶ -tooltip.bloodmagic.livingArmour.upgrade.graveDigger=掘墓者 -tooltip.bloodmagic.livingArmour.upgrade.sprintAttack=冲撞击打 -tooltip.bloodmagic.livingArmour.upgrade.criticalStrike=精准击打 -tooltip.bloodmagic.livingArmour.upgrade.elytra=鞘翅 -tooltip.bloodmagic.livingArmour.upgrade.nightSight=夜行猛技 -tooltip.bloodmagic.livingArmour.upgrade.repair=ä¿®å¤ - - -tooltip.bloodmagic.livingArmour.upgrade.slowness=疲瘸之腿 -tooltip.bloodmagic.livingArmour.upgrade.crippledArm=残废手臂 -tooltip.bloodmagic.livingArmour.upgrade.slippery=如履寒冰 -tooltip.bloodmagic.livingArmour.upgrade.battleHunger=饿æ®é野 -tooltip.bloodmagic.livingArmour.upgrade.quenched=æ·¬ç« -tooltip.bloodmagic.livingArmour.upgrade.meleeDecrease=é’拙之刃 -tooltip.bloodmagic.livingArmour.upgrade.digSlowdown=弱化挖掘 -tooltip.bloodmagic.livingArmour.upgrade.stormTrooper=风暴骑兵 -tooltip.bloodmagic.livingArmour.upgrade.slowHeal=愈åˆå»¶ç¼“ -tooltip.bloodmagic.livingArmour.upgrade.disoriented=平衡失调 - -tooltip.bloodmagic.livingArmour.upgrade.level=%s(等级 %d) -tooltip.bloodmagic.livingArmour.upgrade.progress=%s(%d/100) -tooltip.bloodmagic.livingArmour.upgrade.points=&6强化点数:%s / %s - -tooltip.bloodmagic.livingArmour.extraExtraInfo=&9-æŒ‰ä½ Shift + M 查看进展信æ¯- - -tooltip.bloodmagic.will=æ„å¿—è´¨é‡ï¼š%1$,.2f -tooltip.bloodmagic.sentientSword.desc=以æ¶é­”æ„志唤起其最大潜能。 -tooltip.bloodmagic.sentientAxe.desc=以æ¶é­”æ„志唤起其最大潜能。 -tooltip.bloodmagic.sentientPickaxe.desc=以æ¶é­”æ„志唤起其最大潜能。 -tooltip.bloodmagic.sentientShovel.desc=以æ¶é­”æ„志唤起其最大潜能。 -tooltip.bloodmagic.soulGem.petty=用于存储微é‡æ„å¿—çš„å®çŸ³ -tooltip.bloodmagic.soulGem.lesser=用于存储少é‡æ„å¿—çš„å®çŸ³ -tooltip.bloodmagic.soulGem.common=用于存储更多æ„å¿—çš„å®çŸ³ -tooltip.bloodmagic.soulGem.greater=用于存储大é‡æ„å¿—çš„å®çŸ³ -tooltip.bloodmagic.soulGem.grand=用于存储æžå¤§æ•°é¢æ„å¿—çš„å®çŸ³ -tooltip.bloodmagic.soulSnare.desc=投掷å‘怪物并消ç­å®ƒä»¬æ¥èŽ·å–附于其身的æ¶é­”æ„å¿— - -tooltip.bloodmagic.itemFilter.exact=精确匹é…ç‰©å“ -tooltip.bloodmagic.itemFilter.ignoreNBT=忽视筛选的NBT -tooltip.bloodmagic.itemFilter.modItems=åŒMod的物å“å…¨éƒ¨åŒ¹é… -tooltip.bloodmagic.itemFilter.oreDict=按矿物辞典筛选 - -tooltip.bloodmagic.itemFilter.exact=精确匹é…液体 - -tooltip.bloodmagic.fluid.type=所å«æ¶²ä½“:%s -tooltip.bloodmagic.fluid.amount=æ•°é‡ï¼š%d / %d mB -tooltip.bloodmagic.fluid.capacity=容é‡ï¼š%d mB - -tooltip.bloodmagic.ghost.everything=ä»»ä½•ç‰©å“ -tooltip.bloodmagic.ghost.amount=å¹½çµç‰©å“æ•°é‡ï¼š%d - -tooltip.bloodmagic.currentType.default=è•´å«ï¼šåŽŸç”Ÿæ„å¿— -tooltip.bloodmagic.currentType.corrosive=è•´å«ï¼šè…蚀æ„å¿— -tooltip.bloodmagic.currentType.destructive=è•´å«ï¼šç ´åæ„å¿— -tooltip.bloodmagic.currentType.vengeful=è•´å«ï¼šå¤ä»‡æ„å¿— -tooltip.bloodmagic.currentType.steadfast=è•´å«ï¼šåšæ¯…æ„å¿— - -tooltip.bloodmagic.currentBaseType.default=原生 -tooltip.bloodmagic.currentBaseType.corrosive=è…蚀 -tooltip.bloodmagic.currentBaseType.destructive=ç ´å -tooltip.bloodmagic.currentBaseType.vengeful=å¤ä»‡ -tooltip.bloodmagic.currentBaseType.steadfast=åšæ¯… - -tooltip.bloodmagic.experienceTome=用于储存ç»éªŒçš„书 -tooltip.bloodmagic.experienceTome.exp=ç»éªŒå€¼ï¼š%0.3f -tooltip.bloodmagic.experienceTome.expLevel=等级:%d - -tooltip.bloodmagic.decoration.safe=安全装潢 -tooltip.bloodmagic.decoration.notSafe=å±é™©è£…æ½¢ - -tooltip.bloodmagic.cuttingFluidRatio=%d/%d 所剩å¯ç”¨ - -tooltip.bloodmagic.potion.uses=剩余使用次数:%d - -tooltip.bloodmagic.book.shifting=这些符å·ä¼¼ä¹Ž... &o在å˜æ¢ç€... - -tooltip.bloodmagic.willGauge=一个奇怪的装置,å¯ä»¥æµ‹é‡æ¶é­”çµåŸŸä¸­çš„æ¶é­”æ„志。 - -# Ritual -ritual.bloodmagic.blockRange.tooBig=æ供的方å—范围过大ï¼æœ€å¤šä¸è¶…过 %s 个方å—。 -ritual.bloodmagic.blockRange.tooFar=æ供的方å—范围太远ï¼éœ€è¦åœ¨åž‚ç›´è·ç¦» %s , æ°´å¹³è·ç¦» %s 之内。 -ritual.bloodmagic.blockRange.inactive=该仪å¼çŸ³ç›®å‰æ— æ´»åŠ¨ï¼Œæ²¡æœ‰å¯ä¿®æ”¹çš„范围。 -ritual.bloodmagic.blockRange.noRange=范围选择ä¸æ°å½“。 -ritual.bloodmagic.blockRange.firstBlock=记录新范围的第一个方å—。 -ritual.bloodmagic.blockRange.success=新范围设置æˆåŠŸï¼ -ritual.bloodmagic.willConfig.set=该仪å¼å°†ä½¿ç”¨è¿™ç±»æ¶é­”æ„志类型:%s -ritual.bloodmagic.willConfig.void=该仪å¼ä¸å†ä¼šä½¿ç”¨æ¶é­”æ„å¿— - -ritual.bloodmagic.testRitual=æµ‹è¯•ä»ªå¼ -ritual.bloodmagic.waterRitual=æ¶Œæ³‰ä»ªå¼ -ritual.bloodmagic.lavaRitual=下界夜曲 -ritual.bloodmagic.greenGroveRitual=ç»¿ä¸›ä»ªå¼ -ritual.bloodmagic.jumpRitual=é«˜è·³ä»ªå¼ -ritual.bloodmagic.wellOfSufferingRitual=苦难之井 -ritual.bloodmagic.featheredKnifeRitual=ç¾½åˆ€ä»ªå¼ -ritual.bloodmagic.regenerationRitual=é‡ç”Ÿä»ªå¼ -ritual.bloodmagic.harvestRitual=丰收之月 -ritual.bloodmagic.magneticRitual=ç£å¼•ä»ªå¼ -ritual.bloodmagic.crushingRitual=æŒ–æŽ˜ä»ªå¼ -ritual.bloodmagic.fullStomachRitual=盛宴之歌 -ritual.bloodmagic.interdictionRitual=åˆ¶æ­¢ä»ªå¼ -ritual.bloodmagic.containmentRitual=ç‰µåˆ¶ä»ªå¼ -ritual.bloodmagic.speedRitual=é€Ÿç§»ä»ªå¼ -ritual.bloodmagic.suppressionRitual=æŠ‘æ¶²ä»ªå¼ -ritual.bloodmagic.expulsionRitual=驱é€æ°›åœº -ritual.bloodmagic.zephyrRitual=和风之唤 -ritual.bloodmagic.upgradeRemoveRitual=净çµä¹‹éŸ³ -ritual.bloodmagic.armourEvolveRitual=æŸçµè¿›åŒ– -ritual.bloodmagic.animalGrowthRitual=ç‰§å…»ä»ªå¼ -ritual.bloodmagic.forsakenSoulRitual=孤魂集会 -ritual.bloodmagic.crystalHarvestRitual=碎晶裂纹 -ritual.bloodmagic.meteorRitual=å æ˜Ÿæ ‡ä½ - -ritual.bloodmagic.cobblestoneRitual=æžå¯’ç«å±± -ritual.bloodmagic.placerRitual=é“ºè®¾ä»ªå¼ -ritual.bloodmagic.fellingRitual=ä¼æž—ä»ªå¼ -ritual.bloodmagic.pumpRitual=虹å¸åœ£æ›² -ritual.bloodmagic.altarBuilderRitual=祭å›é›†ç»“å· -ritual.bloodmagic.portalRitual=折域之门 -ritual.bloodmagic.downgradeRitual=沉é‡çµé­‚çš„å¿æ‚” - -ritual.bloodmagic.waterRitual.info=通过主仪å¼çŸ³ç”Ÿæˆä¸€ä¸ªæ°´æºæ–¹å— -ritual.bloodmagic.lavaRitual.info=通过主仪å¼çŸ³ç”Ÿæˆä¸€ä¸ªå²©æµ†æºæ–¹å— -ritual.bloodmagic.lavaRitual.default.info=[原生]é™ä½Žç”Ÿæˆå²©æµ†çš„LP消耗,并将岩浆导入连接的容器内 -ritual.bloodmagic.lavaRitual.corrosive.info=[è…蚀]范围内å…ç–«ç«ç„°ä¼¤å®³çš„实体将å—到伤害 -ritual.bloodmagic.lavaRitual.destructive.info=[ç ´å]岩浆的放置范围根æ®æ„志的总é‡å¢žåŠ  -ritual.bloodmagic.lavaRitual.vengeful.info=[å¤ä»‡]给予范围内实体缓燃引线效果(上天) -ritual.bloodmagic.lavaRitual.steadfast.info=[åšæ¯…]给予范围内的玩家防ç«æ•ˆæžœ - -ritual.bloodmagic.greenGroveRitual.info=在其范围内ç§æ¤å†œä½œç‰© -ritual.bloodmagic.jumpRitual.info=使实体跃å‘高空 -ritual.bloodmagic.wellOfSufferingRitual.info=攻击其伤害范围内的生物,并将所获LPå‚¨å…¥é‚»è¿‘çš„è¡€ä¹‹ç¥­å› -ritual.bloodmagic.featheredKnifeRitual.info=扣除其范围内的玩家生命值,并将所获LPå‚¨å…¥é‚»è¿‘çš„è¡€ä¹‹ç¥­å› -ritual.bloodmagic.regenerationRitual.info=治疗其范围内失去生命值的实体 -ritual.bloodmagic.regenerationRitual.default.info=[原生] -ritual.bloodmagic.regenerationRitual.corrosive.info=[è…蚀]从éžçŽ©å®¶çš„实体身上汲å–鲜血以治疗玩家 -ritual.bloodmagic.regenerationRitual.destructive.info=[ç ´å] -ritual.bloodmagic.regenerationRitual.vengeful.info=[å¤ä»‡] -ritual.bloodmagic.regenerationRitual.steadfast.info=[åšæ¯…] -ritual.bloodmagic.harvestRitual.info=收割其范围内的æ¤ç‰©ï¼Œäº§ç‰©æŽ‰è½äºŽåœ°ä¸Š -ritual.bloodmagic.magneticRitual.info=将地底的矿石传é€è‡³å…¶æ”¾ç½®åŒºåŸŸ -ritual.bloodmagic.crushingRitual.info=ç ´å其挖掘范围内的方å—,并将掉è½ç‰©æ”¾ç½®äºŽæ‰€è¿žæŽ¥çš„ç®±å­ -ritual.bloodmagic.crushingRitual.destructive.info=[ç ´å]强力的破åæ–¹å—:所有方å—ç ´åå— æ—¶è¿III å½±å“ -ritual.bloodmagic.crushingRitual.steadfast.info=[åšæ¯…]以 精准采集 获å–被破åæ–¹å—ã€‚é€‚ç”¨æƒ…å†µä¸‹è¦†ç›–æ—¶è¿ -ritual.bloodmagic.crushingRitual.corrosive.info=[è…蚀]所有被破åæ–¹å—将以基础切削油的形å¼å¤„ç†ã€‚适用情况下覆盖精准采集 -ritual.bloodmagic.crushingRitual.vengeful.info=[å¤ä»‡]压缩库存内的物å“(如将煤炭压缩æˆç…¤ç‚­å—),目å‰æ¯æ¬¡æ“作仅执行一次压缩 -ritual.bloodmagic.crushingRitual.default.info=[原生]æ ¹æ®æ„志总é‡å¢žåŠ ä»ªå¼çš„è¿è¡Œé€Ÿåº¦ -ritual.bloodmagic.greenGroveRitual.corrosive.info=[è…蚀]范围内的实体将被附近的æ¤ç‰©æ”»å‡», 蚕食掉他们的生命 -ritual.bloodmagic.greenGroveRitual.default.info=[原生]æ ¹æ®çµåŸŸå†…æ„志的总é‡åŠ å¿«æ‰€æœ‰çš„仪å¼è¿ä½œé€Ÿåº¦ -ritual.bloodmagic.greenGroveRitual.vengeful.info=[å¤ä»‡]增加生长刻æˆåŠŸçš„速率 -ritual.bloodmagic.greenGroveRitual.steadfast.info=[åšæ¯…]在水åˆèŒƒå›´å†…, ç§å­ä¼šè¢«å†æ¬¡ç§æ¤ä¸”æ–¹å—会被润湿 -ritual.bloodmagic.greenGroveRitual.destructive.info=[ç ´å] 促进作物生长的范围根æ®æ„志的总é‡å¢žåŠ  -ritual.bloodmagic.featheredKnifeRitual.default.info=[原生] æ ¹æ®çµåŸŸå†…æ„志的总é‡å¢žåŠ ä»ªå¼çš„è¿è¡Œé€Ÿåº¦ -ritual.bloodmagic.featheredKnifeRitual.destructive.info=[ç ´å] æ ¹æ®æ„志总é‡å¢žåŠ ä»ªå¼çš„产出的LP -ritual.bloodmagic.featheredKnifeRitual.vengeful.info=[å¤ä»‡] 将牺牲的最å°ç”Ÿå‘½å€¼è®¾ä¸º10%%.覆盖[åšæ¯…]的效果 -ritual.bloodmagic.featheredKnifeRitual.corrosive.info=[è…蚀] 使用玩家的“ç†é¦™â€æ¥æ高收益 -ritual.bloodmagic.featheredKnifeRitual.steadfast.info=[åšæ¯…] 将牺牲的最å°ç”Ÿå‘½å€¼è®¾ä¸º30%%到70%% -ritual.bloodmagic.speedRitual.default.info=[原生] æ ¹æ®æ„志总é‡å¢žåŠ ä»ªå¼äº§ç”Ÿçš„移动速度 -ritual.bloodmagic.speedRitual.vengeful.info=[å¤ä»‡] 防止玩家与æˆå¹´åŠ¨ç‰©è¢«è¿è¾“,如果与[ç ´å]é…åˆï¼Œåˆ™è¿è¾“玩家 -ritual.bloodmagic.speedRitual.destructive.info=[ç ´å] 防止玩家与幼年动物被è¿è¾“,如果与[å¤ä»‡]é…åˆï¼Œåˆ™è¿è¾“玩家 -ritual.bloodmagic.animalGrowthRitual.vengeful.info=[å¤ä»‡] å‡å°‘æˆå¹´åŠ¨ç‰©ç¹æ®–的间隔时间 -ritual.bloodmagic.animalGrowthRitual.steadfast.info=[åšæ¯…] 使用箱å­å†…的物å“饲养区域内的动物 -ritual.bloodmagic.animalGrowthRitual.default.info=[原生] æ ¹æ®çµåŸŸå†…æ„志的总é‡å¢žåŠ ä»ªå¼çš„è¿è¡Œé€Ÿåº¦ -ritual.bloodmagic.animalGrowthRitual.destructive.info=[ç ´å]让最近没有ç¹æ®–åŽä»£çš„æˆå¹´åŠ¨ç‰©å†²å‘怪物自爆 -ritual.bloodmagic.animalGrowthRitual.corrosive.info=[è…蚀] 暂无特殊效果 - -ritual.bloodmagic.fullStomachRitual.info=从连接的箱å­ä¸­èŽ·å–食物,æ¥è¡¥å……玩家的饥饿值。 -ritual.bloodmagic.interdictionRitual.info=使其范围内的所有生物推离于主仪å¼çŸ³ã€‚ -ritual.bloodmagic.containmentRitual.info=使其范围内的所有生物牵引å‘主仪å¼çŸ³ã€‚ -ritual.bloodmagic.speedRitual.info=将其范围内的玩家以仪å¼æ–¹å‘抛射出去。 -ritual.bloodmagic.suppressionRitual.info=抑制其范围内的液体;åœç”¨ä»ªå¼æ—¶æ¢å¤ã€‚ -ritual.bloodmagic.expulsionRitual.info=驱é€å…¶èŒƒå›´å†…,éžæ¿€æ´»è€…或主仪å¼çŸ³ä¸Šæ–¹ç®±å­ä¸­æ— ç»‘定血å®ç çš„玩家,离开该区域。 -ritual.bloodmagic.zephyrRitual.info=拾å–其范围内的掉è½ç‰©ï¼Œå¹¶æ”¾å…¥æ‰€è¿žæŽ¥çš„ç®±å­ã€‚ -ritual.bloodmagic.upgradeRemoveRitual.info=没有记载。 -ritual.bloodmagic.armourEvolveRitual.info=没有记载。 -ritual.bloodmagic.animalGrowthRitual.info=加快其范围内的幼年动物的生长速度。 -ritual.bloodmagic.forsakenSoulRitual.info=对其伤害范围内的生物造æˆä¼¤å®³ï¼Œå½“生物死亡时,其晶体范围内的æ¶é­”晶簇将生长。 -ritual.bloodmagic.crystalHarvestRitual.info=ç ´å范围内的æ¶é­”æ„志晶簇,掉è½ç‰©ä¸¢äºŽæ™¶ç°‡é¡¶éƒ¨ã€‚ -ritual.bloodmagic.placerRitual.info=å–出所连接的容器中的方å—,并放置于世界中。 -ritual.bloodmagic.fellingRitual.info=一个ä¼æœ¨è®¾æ–½ï¼Œè¯¥ä»ªå¼å°†ç ä¼å…¶èŒƒå›´å†…所有树与å¶å­ï¼Œå¹¶æ”¶é›†æŽ‰è½ç‰©ã€‚ -ritual.bloodmagic.pumpRitual.info=从规定范围获å–液体。åªæœ‰å½“所连接的液体容器至少有一桶é‡çš„相åŒæ¶²ä½“时,移入液体。 -ritual.bloodmagic.altarBuilderRitual.info=将所连接的容器中的祭å›éƒ¨ä»¶æ­å»ºå‡ºæ¥ã€‚ -ritual.bloodmagic.portalRitual.info=创建一个传é€é—¨ç½‘络,以激活者åŠç›´æŽ¥æŽ¥è§¦æ–¹å—为基础,两者相åŒçš„两个传é€é—¨è¾¾æˆè¿žæŽ¥ã€‚激活åŽæœªä¿®æ”¹ä¼ é€ç½‘络的情况下方å—å¯ä»¥å˜æ›´ã€‚ -ritual.bloodmagic.meteorRitual.info=消耗其物å“范围内的一个物å“,从天空中å¬å”¤ä¸€ä¸ªå……满资æºçš„æµæ˜Ÿï¼Œç›´æŽ¥å å‘仪å¼ã€‚ - -ritual.bloodmagic.waterRitual.waterRange.info=(æ°´æº) 仪å¼æ”¾ç½®æ°´æºæ–¹å—的区域。 -ritual.bloodmagic.lavaRitual.lavaRange.info=(岩浆) 仪å¼æ”¾ç½®å²©æµ†æ–¹å—的区域。 -ritual.bloodmagic.lavaRitual.lavaTank.info=[原生] 仪å¼å°†å²©æµ†å¯¼å…¥å…¶ä¸­çš„å‚¨ç½ -ritual.bloodmagic.lavaRitual.fireFuse.info=[å¤ä»‡] 在这个区域内的实体将é­å—缓燃引线效果 -ritual.bloodmagic.lavaRitual.fireResist.info=[åšæ¯…] 玩家在此区域内å¯èŽ·å¾—防ç«buff -ritual.bloodmagic.lavaRitual.fireDamage.info=[è…蚀] 该区域内å…ç–«ç«ç„°ä¼¤å®³çš„实体将å—到伤害,伤害é‡ä¸Žæ„å¿—çš„é‡ç›¸å…³ -ritual.bloodmagic.greenGroveRitual.growing.info=(生长) 仪å¼åŠ å¿«æ¤ç‰©ç”Ÿé•¿çš„区域。 -ritual.bloodmagic.greenGroveRitual.leech.info=[è…蚀] 区域内实体的生命将æµå¤±äºŽæ»‹å…»é™„近的农作物。 -ritual.bloodmagic.greenGroveRitual.hydrate.info=[åšæ¯…] 区域内的方å—将被润湿为耕地,且区域内的ç§å­å°†è¢«å°±è¿‘ç§æ¤ã€‚ -ritual.bloodmagic.jumpRitual.jumpRange.info=(跳跃) 在这个区域内的实体将跃å‘高空。 -ritual.bloodmagic.wellOfSufferingRitual.altar.info=(祭å›) 规定仪å¼æ£€æµ‹è¡€ä¹‹ç¥­å›çš„区域。该项修改为添加或撤销一个å标。 -ritual.bloodmagic.wellOfSufferingRitual.damage.info=(伤害) 规定仪å¼ä¼¤å®³ç”Ÿç‰©çš„区域。该区域内所有生物(除了玩家)å°†æŒç»­å—到伤害。 -ritual.bloodmagic.featheredKnifeRitual.altar.info=(祭å›) 规定仪å¼æ£€æµ‹è¡€ä¹‹ç¥­å›çš„区域。该项修改为添加或撤销一个å标。 -ritual.bloodmagic.featheredKnifeRitual.damage.info=(伤害) 规定仪å¼ä¼¤å®³çŽ©å®¶çš„区域。该区域内的玩家将æŒç»­å—到伤害直至设定的生命值下é™ã€‚ -ritual.bloodmagic.regenerationRitual.heal.info=(治愈) 该区域内的生物将获得生命æ¢å¤buff。 -ritual.bloodmagic.regenerationRitual.vampire.info=(血蛭) æ±²å–区域内怪物的生命æ¥æ²»æ„ˆçŽ©å®¶ -ritual.bloodmagic.harvestRitual.harvestRange.info=(收割) 该区域内的æ¤ç‰©å°†è¢«æ”¶å‰²ã€‚ -ritual.bloodmagic.magneticRitual.placementRange.info=(放置) 仪å¼å°†æŠŠèŽ·å–的矿石放置于该区域内。 -ritual.bloodmagic.crushingRitual.crushingRange.info=(挖掘) 该区域的方å—将被破å。 -ritual.bloodmagic.crushingRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®ï¼Œä»ªå¼å°†æŠŠç ´åçš„æ–¹å—放入其中。 -ritual.bloodmagic.fullStomachRitual.fillRange.info=(喂食) 仪å¼å°†ä¼šå–‚食该区域内的玩家。 -ritual.bloodmagic.fullStomachRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æå–其中的食物æ¥å–‚食区域内的玩家。 -ritual.bloodmagic.interdictionRitual.interdictionRange.info=(推离) 仪å¼æŽ¨ç¦»ç”Ÿç‰©çš„区域。无论该区域ä½äºŽä½•å¤„,所有生物将被推离于主仪å¼çŸ³ã€‚ -ritual.bloodmagic.containmentRitual.containmentRange.info=(牵引) 仪å¼ç‰µå¼•ç”Ÿç‰©çš„区域。无论该区域ä½äºŽä½•å¤„,所有生物将被牵引å‘主仪å¼çŸ³ã€‚ -ritual.bloodmagic.speedRitual.sanicRange.info=(速度) 所有ä½äºŽè¯¥åŒºåŸŸå†…的实体,将被抛射å‘仪å¼æ‘†ç›¸æˆçš„箭头方å‘。 -ritual.bloodmagic.suppressionRitual.suppressionRange.info=(抑液) 该区域内所有液体将被仪å¼æŠ‘制。 -ritual.bloodmagic.expulsionRitual.expulsionRange.info=(驱é€) -ritual.bloodmagic.zephyrRitual.zephyrRange.info=(拾å–) 该区域内的物å“将被拾å–储入所连接箱å­ã€‚ -ritual.bloodmagic.zephyrRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æŠŠæ‹¾å–的物å“放入其中。 -ritual.bloodmagic.animalGrowthRitual.growing.info=(æˆé•¿) 该区域内的动物将æˆé•¿å¾—更快。 -ritual.bloodmagic.animalGrowthRitual.chest.info=(ç®±å­) 用于存放喂养动物物å“çš„ç®±å­ -ritual.bloodmagic.forsakenSoulRitual.crystal.info=(晶体) 当有生物因仪å¼æ­»äº¡æ—¶ï¼Œè¯¥åŒºåŸŸå†…的晶簇生长速度将加快。 -ritual.bloodmagic.forsakenSoulRitual.damage.info=(伤害) 该区域内的生物将缓慢的收到伤害,当死亡时晶簇将生长。 -ritual.bloodmagic.crystalHarvestRitual.crystal.info=(晶体) 晶簇将被破åæˆä»…ç•™å•æ™¶çš„晶簇,被破å的晶体将掉è½äºŽä¸–界。 - -ritual.bloodmagic.placerRitual.placerRange.info=(放置) 仪å¼å°†æ”¾ç½®æ–¹å—的区域。 -ritual.bloodmagic.placerRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æå–其中的方å—放置于世界中。 -ritual.bloodmagic.fellingRitual.fellingRange.info=(ç ä¼) 仪å¼å°†æœå¯»åŽŸæœ¨å’Œæ ‘å¶å¹¶è¿›è¡Œç ä¼çš„区域。 -ritual.bloodmagic.fellingRitual.chest.info=(ç®±å­) ç®±å­ä½ç½®, 仪å¼å°†æŠŠæŽ‰è½ç‰©æ”¾å…¥å…¶ä¸­ã€‚ -ritual.bloodmagic.pumpRitual.pumpRange.info=(引水) 仪å¼äºŽä¸–界中获å–液体的区域。 - -ritual.bloodmagic.downgradeRitual.dialogue.bow.1=那么,少年,你渴望力é‡ä¹ˆ...? -ritual.bloodmagic.downgradeRitual.dialogue.bow.100=当然了,没有ä¸éœ€è¦ä»£ä»·çš„交易...我也ä¸ä¼šè½»æ˜“地给予你力é‡ï¼Œè€Œä¸æ±‚任何回报 -ritual.bloodmagic.downgradeRitual.dialogue.bow.300=那么就献祭自身,抛弃自我,放弃那百步穿æ¨çš„精准。记ä½ï¼Œç®­çŸ¢å°†ä¸å†æ˜¯ä½ èŽ·èƒœçš„å‡­ä¾ -ritual.bloodmagic.downgradeRitual.dialogue.bow.500=我会帮你解开盔甲的å°å°ä»¥ä½œå›žæŠ¥ï¼Œè¿™æ ·å®ƒä»¬å°±èƒ½è¿›ä¸€æ­¥åœ°å¼ºåŒ–下去...而你所è¦åšçš„就是在这仪å¼å‰å©æ‹œ -ritual.bloodmagic.downgradeRitual.dialogue.quenched.1=嚯嚯嚯...你好,凡人,从你眼神中我看到了渴望,对力é‡çš„渴望 -ritual.bloodmagic.downgradeRitual.dialogue.quenched.100=谨记ï¼å½“æ¯å­è£…满时,想è¦è£…下更多就必须先将她倒空 -ritual.bloodmagic.downgradeRitual.dialogue.quenched.300=那么,我们åšä¸ªäº¤æ˜“å§ï¼šå¿˜å´é‚£æœåº·çš„美味,我将给予你å˜å¾—更有潜力的机会。相信我,你完全ä¸éœ€è¦è€ƒè™‘这么åšæ˜¯å¦å€¼å¾—... -ritual.bloodmagic.downgradeRitual.dialogue.quenched.500=跪下å§ï¼å‡¡äººã€‚饮下这æ¯é…’。这或许会是你此生最åŽä¸€æ¬¡ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.1=å—¯...你究竟想è¦å¾—到什么? -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.100=想è¦è¶…脱凡人的力é‡ï¼Ÿæˆ‘无法满足你的è¦æ±‚——ä¸è¿‡ï¼Œæˆ‘这里有å¦å¤–一项交易... -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.300=我å¯ä»¥å¸®ä½ æ”¹è‰¯ä½ çš„盔甲,使它å¯ä»¥èŽ·å¾—更多的强化机会。但是,作为交æ¢ï¼Œä½ å°†å¤±åŽ»è‡ªèº«æˆ˜æ–—的能力 -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.500=如果愿æ„,就别å†æŒ¥åŠ¨æ‰‹ä¸­çš„剑刃,它将永远失去昨日的è£è€€ -ritual.bloodmagic.downgradeRitual.dialogue.dulledBlade.700=那么,你的选择是什么,是跪在仪å¼å‰ï¼Œè¿˜æ˜¯ç»§ç»­æŒ¥åŠ¨æ‰‹ä¸­çš„剑刃? -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.1=å½“å¿ƒä½ è„šä¸‹çš„å¤§åœ°ï¼Œå‡¡äººï¼ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.100=和我的伙伴ä¸åŒï¼Œæˆ‘åªæœ‰æ®‹é…·çš„交易。如果你想æˆä¸ºé­”法师,那么就用你的身体æ¥äº¤æ¢ -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.300=伤å£æ€»ä¼šæ„ˆåˆã€‚如果答应了我的æ¡ä»¶ï¼Œé‚£ä¹ˆä½ èº«ä¸Šçš„伤å£å°†æ›´éš¾æ„ˆåˆï¼Œç›´åˆ°æˆ˜æ–—的烙å°æˆ–作无形的瘟疫 -ritual.bloodmagic.downgradeRitual.dialogue.slowHeal.500=好了,赶紧考虑å§ã€‚你或许会åŽæ‚”,因为哪怕你的æ¯å­ç©ºäº†ï¼Œå®ƒä¹Ÿå¾ˆéš¾åœ¨è¢«å¡«æ»¡... - -# Chat -chat.bloodmagic.altarMaker.setTier=层级设置:%d -chat.bloodmagic.altarMaker.building=铺设一个 %d å±‚ç¥­å› -chat.bloodmagic.altarMaker.destroy=消除一个 %d å±‚ç¥­å› -chat.bloodmagic.altarMaker.creativeOnly=该物å“ä»…é™åˆ›é€ æ¨¡å¼ã€‚ - -chat.bloodmagic.damageSource=%s çš„çµé­‚开始å˜å¾—虚弱 - -chat.bloodmagic.ritual.weak=你感到有股拉力, 但没有足够的力é‡æ¥å®Œæˆè¿™ä¸ªä»ªå¼. -chat.bloodmagic.ritual.prevent=仪å¼åœ¨ç§¯æžçš„抵抗你! -chat.bloodmagic.ritual.activate=一股能é‡æµç»è¿™ä¸ªä»ªå¼! -chat.bloodmagic.ritual.notValid=这些仪å¼çŸ³ä¼¼ä¹Žæœ‰äº›æ‘†æ”¾ä¸å¾—当... - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=你感到已ç»å¥½å¤šäº†ï¼ -chat.bloodmagic.livingArmour.upgrade.fireRemove=&6ç«ç„°æŠµæŠ—éšä¸€è‚¡æ¸…凉感附ç€äºŽä½ ã€‚ -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6朦胧中一股能é‡ä½¿ä½ è„±ç¦»æ­»äº¡è¾¹ç¼˜ï¼ -chat.bloodmagic.livingArmour.newUpgrade=&4强化完æˆï¼ - -chat.bloodmagic.routing.remove=移出记录ä½ç½® -chat.bloodmagic.routing.set=设置节点ä½ç½® -chat.bloodmagic.routing.link.master=è¿žæŽ¥åˆ°ä¸»èŠ‚ç‚¹ï¼ -chat.bloodmagic.routing.link=èŠ‚ç‚¹è¿žæŽ¥å®Œæˆ - -chat.bloodmagic.altar.comp.glowstone=一个è¤çŸ³å— -chat.bloodmagic.altar.comp.bloodstone=一个大血石砖 -chat.bloodmagic.altar.comp.beacon=一个信标 -chat.bloodmagic.altar.comp.bloodrune=一个气血符文 -chat.bloodmagic.altar.comp.crystal=ä¸€ä¸ªæ— æ•ˆç‰©å“ -chat.bloodmagic.altar.comp.notair=ä¸€ä¸ªå®žå¿ƒæ–¹å— - -chat.bloodmagic.altar.nextTier=下一层级的血之祭å›ç¼ºå¤±%s,对应å标为 %s 。 - -chat.bloodmagic.mimic.potionSet=è¯å‰‚陷阱已设置. -chat.bloodmagic.mimic.potionRemove=è¯å‰‚陷阱已移除. -chat.bloodmagic.mimic.potionInterval.up=è¯å‰‚时间间隔已增加至:%d 刻。 -chat.bloodmagic.mimic.potionInterval.down=è¯å‰‚时间间隔已å‡å°‘至:%d 刻。 -chat.bloodmagic.mimic.detectRadius.up=玩家检测åŠå¾„已增加至:%d 格方å—。 -chat.bloodmagic.mimic.detectRadius.down=玩家检测åŠå¾„å·²å‡å°‘至:%d 格方å—。 -chat.bloodmagic.mimic.potionSpawnRadius.up=è¯å‰‚生æˆåŠå¾„已增加至:%d 格方å—。 -chat.bloodmagic.mimic.potionSpawnRadius.down=è¯å‰‚生æˆåŠå¾„å·²å‡å°‘至:%d 格方å—。 - -# entity -entity.bloodmagic.SentientSpecter.name=æ„ŸçŸ¥ä¹‹çµ -entity.bloodmagic.Mimic.name=æ‹Ÿæ€ - -# Commands -commands.bloodmagic.error.arg.invalid=无效å‚æ•° -commands.bloodmagic.error.arg.missing=å‚æ•°ä¸è¶³ -commands.bloodmagic.error.arg.player.missing=你必须指定一个玩家æ¥æ‰§è¡Œè¯¥å‘½ä»¤ã€‚ -commands.bloodmagic.error.404=å‘½ä»¤æœªæ‰¾åˆ°ï¼ -commands.bloodmagic.error.unknown=æœªçŸ¥çš„å‘½ä»¤ï¼ -commands.bloodmagic.error.perm=你没有使用该命令的æƒé™ã€‚ - -commands.bloodmagic.success=æˆåŠŸæ‰§è¡Œ - -commands.bloodmagic.format.help=%s - %s -commands.bloodmagic.format.error=%s - %s - -commands.bloodmagic.help.usage=/bloodmagic help -commands.bloodmagic.help.help=使用"/bloodmagic help"命令显示指令列表。 - -commands.bloodmagic.network.usage=/bloodmagic network [å¸å–(syphon)|添加(add)|查看(get)|å¡«å……(fill)|填满(cap)] <玩家> [æ•°é‡] -commands.bloodmagic.network.help=çµé­‚网络实用工具 -commands.bloodmagic.network.syphon.help=从指定玩家的çµé­‚网络中移出指定的LP值。 -commands.bloodmagic.network.syphon.success=æˆåŠŸä»Ž %s å¸å–出 %dLP。 -commands.bloodmagic.network.add.help=添加指定的LP值到指定玩家的çµé­‚网络中。æœä»Žæ ‡å‡†çš„LP增加规则。 -commands.bloodmagic.network.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚网络。 -commands.bloodmagic.network.set.help=将指定玩家的LP设置为所给数值。 -commands.bloodmagic.network.set.success=æˆåŠŸå°† %s çµé­‚网络中的LP设置为 %d。 -commands.bloodmagic.network.get.help=返还指定玩家çµé­‚网络中的LP值。 -commands.bloodmagic.network.fill.help=将指定玩家的LP填充为 %d。 -commands.bloodmagic.network.fill.success=æˆåŠŸå¡«å…… %s çš„çµé­‚网络。 -commands.bloodmagic.network.cap.help=填充指定玩家的çµé­‚网络至其所æŒæœ‰çš„最高阶气血å®ç å®¹é‡çš„最大值。 -commands.bloodmagic.network.cap.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚网络。 - -commands.bloodmagic.bind.usage=/bind <玩家> -commands.bloodmagic.bind.help=用于设置/解除对手æŒç‰©å“的绑定情况。 -commands.bloodmagic.bind.success=物å“æˆåŠŸç»‘å®šï¼ -commands.bloodmagic.bind.remove.success=解除绑定æˆåŠŸ - -commands.bloodmagic.orb.usage=/bloodmagic orb [设置(set)|查看(get)] <玩家> [等级] -commands.bloodmagic.orb.help=用于设置或查看玩家的最高血å®ç ç­‰çº§. - -commands.bloodmagic.bind.usage=/bind <玩家> -commands.bloodmagic.bind.success=物å“æˆåŠŸç»‘å®šï¼ -commands.bloodmagic.bind.failed.noPlayer=没有指定玩家 -commands.bloodmagic.bind.failed.alreadyBound=物å“å·²ç»è¢«ç»‘定;使用 /unbind æ¥è§£é™¤ç»‘定 -commands.bloodmagic.bind.failed.notBindable=物å“无法被绑定 -commands.bloodmagic.unbind.usage=/unbind -commands.bloodmagic.unbind.success=物å“æˆåŠŸè§£é™¤ç»‘å®šï¼ -commands.bloodmagic.unbind.failed.notBindable=物å“无法解除绑定 -commands.bloodmagic.soulnetwork.usage=/soulnetwork <玩家> <添加(add)|å‡åŽ»(subtract)|填满(fill)|清空(empty)|查看(get)> [æ•°é‡] -commands.bloodmagic.soulnetwork.add.success=æˆåŠŸæ·»åŠ  %dLP 到 %s çš„çµé­‚ç½‘ç»œï¼ -commands.bloodmagic.soulnetwork.subtract.success=æˆåŠŸä»Ž %s çš„çµé­‚网络中å‡åŽ» %dLPï¼ -commands.bloodmagic.soulnetwork.fill.success=æˆåŠŸå¡«æ»¡ %s çš„çµé­‚ç½‘ç»œï¼ -commands.bloodmagic.soulnetwork.empty.success=æˆåŠŸæ¸…空 %s çš„çµé­‚ç½‘ç»œï¼ -commands.bloodmagic.soulnetwork.get.success=%s çš„çµé­‚网络中有 %dLPï¼ -commands.bloodmagic.soulnetwork.noPlayer=没有指定玩家 -commands.bloodmagic.soulnetwork.noCommand=è¿™ä¸ç¬¦å‘½ä»¤è§„定 -commands.bloodmagic.soulnetwork.notACommand=è¿™ä¸æ˜¯æœ‰æ•ˆçš„命令 -commands.bloodmagic.soulnetwork.fillMax.success=æˆåŠŸå°† %s çš„çµé­‚网络填满至其å®ç çš„æœ€å¤§å€¼ï¼ -commands.bloodmagic.soulnetwork.create.success=创建 %s çš„çµé­‚网络æˆåŠŸï¼ˆå®ç ç­‰çº§ï¼š%d) - -# GUI -tile.bloodmagic.inputNode.name=输入节点 -tile.bloodmagic.outputNode.name=输出节点 - -# Keybinds -bloodmagic.keybind.open_holding=打开集æŒå°è®° -bloodmagic.keybind.cycle_holding_pos=循环选择å°è®° (+) -bloodmagic.keybind.cycle_holding_neg=循环选择å°è®° (-) - -# JustEnoughItems -jei.bloodmagic.recipe.altar=è¡€ä¹‹ç¥­å› -jei.bloodmagic.recipe.binding=炼金矩阵 (绑定) -jei.bloodmagic.recipe.alchemyArrayCrafting=炼金矩阵 -jei.bloodmagic.recipe.soulForge=狱ç«ç†”炉 -jei.bloodmagic.recipe.alchemyTable=炼金术桌 -jei.bloodmagic.recipe.armourDowngrade=ç¥­å“ (仪å¼ï¼šæ²‰é‡çµé­‚çš„å¿æ‚”) -jei.bloodmagic.recipe.requiredLP=LP: %d -jei.bloodmagic.recipe.requiredTier=层级:%d -jei.bloodmagic.recipe.consumptionRate=消耗率:%d LP/t -jei.bloodmagic.recipe.drainRate=消耗率:%d LP/t -jei.bloodmagic.recipe.minimumSouls=最å°å€¼ï¼š%1$,.2f Will -jei.bloodmagic.recipe.soulsDrained=消耗:%1$,.2f Will -jei.bloodmagic.recipe.lpDrained=消耗:%,d LP -jei.bloodmagic.recipe.ticksRequired=时间:%,d 刻 - -jei.bloodmagic.desc.altarBuilder=该物å“ä»…é™åˆ›é€ æ¨¡å¼ï¼Œç”¨äºŽè°ƒè¯•æµ‹è¯•.\n\nShift + å³é”® 改å˜å±‚级。å³é”®ç¥­å›å¼€å§‹æ­å»ºã€‚\n\n手æŒç ´å祭å›æ—¶å°†å…¨éƒ¨ç§»é™¤ã€‚ -jei.bloodmagic.desc.demonicWill=附身于生物的æ¶é­”æ„志之体现.\n\nå¯ä»¥é€šè¿‡ç”¨æ„ŸçŸ¥æ­¦å™¨æ€æ­»ç”Ÿç‰©æŽ‰è½ï¼Œæˆ–是对ç€ç”Ÿç‰©æŠ›æŽ·åŽŸå§‹æŠ•ç½‘。当它出现白色颗粒时æ€äº†å®ƒã€‚ - -# WAILA -waila.bloodmagic.sneak=&oæ½œè¡ŒæŸ¥çœ‹ä¿¡æ¯ -waila.bloodmagic.array.reagent=试剂:%s -waila.bloodmagic.array.catalyst=石æ¿ï¼š%s -option.bloodmagic.bypassSneak=潜行 -option.bloodmagic.bloodAltar=è¡€ä¹‹ç¥­å› -option.bloodmagic.ritualController=仪å¼çŸ³ -option.bloodmagic.teleposer=ä¼ é€å™¨ -option.bloodmagic.array=炼金矩阵 - -# Thaumcraft -tc.research_category.BLOODMAGIC=血红奥术 - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=血魔法 -bloodmagic.research_text.BLOODMAGIC=血红奥术 -bloodmagic.research_page.BLOODMAGIC.1=血魔法的领域总是似乎有些孤立且åƒæ˜¯â€œä¸ªäººâ€è‰ºæœ¯ï¼ŒåŒä¼—所周知的喜爱éšå±…有时还有点疯癫的血魔法师。然而,自我牺牲与生命æºè´¨çš„力é‡ç”šè‡³æ‹¥æœ‰è¶…出一般血魔法师所è§çš„用途,事实上,这ç§åŠ›é‡æ˜¾ç„¶ç»ˆç©¶èƒ½åº”用于神秘学。 - -# Buttons -button.bloodmagic.tooltip.fill=填充网络 diff --git a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang b/src/main/resources/assets/bloodmagic/lang/zh_TW.lang deleted file mode 100644 index bdabcb85..00000000 --- a/src/main/resources/assets/bloodmagic/lang/zh_TW.lang +++ /dev/null @@ -1,404 +0,0 @@ -#Creative Tab -itemGroup.bloodmagic.creativeTab=血魔法 -itemGroup.bloodmagic.creativeTabTome=血魔法強化經文 - -#Items -item.bloodmagic.activationCrystal.weak.name=[虛弱]激活水晶 -item.bloodmagic.activationCrystal.awakened.name=[覺醒]激活水晶 -item.bloodmagic.activationCrystal.creative.name=[創造模å¼]激活水晶 - -item.bloodmagic.sacrificialDagger.normal.name=犧牲匕首 -item.bloodmagic.sacrificialDagger.creative.name=創造模å¼çŠ§ç‰²åŒ•é¦– -item.bloodmagic.pack.selfSacrifice.name=血文背包 -item.bloodmagic.pack.sacrifice.name=紋章血甲 -item.bloodmagic.daggerOfSacrifice.name=ç»ç¥­åˆ€ - -item.bloodmagic.lavaCrystal.name=熔岩晶體 - -item.bloodmagic.bound.sword.name=ç´„æŸä¹‹åŠ -item.bloodmagic.bound.pickaxe.name=ç´„æŸä¹‹éŽ¬ -item.bloodmagic.bound.axe.name=ç´„æŸä¹‹æ–§ -item.bloodmagic.bound.shovel.name=ç´„æŸä¹‹é¬ - -item.bloodmagic.bucket.lifeEssence.name=生命之桶 - -item.bloodmagic.scribe.water.name=元素銘文:水 -item.bloodmagic.scribe.fire.name=å…ƒç´ éŠ˜æ–‡ï¼šç« -item.bloodmagic.scribe.earth.name=元素銘文:地 -item.bloodmagic.scribe.air.name=元素銘文:風 -item.bloodmagic.scribe.dusk.name=å…ƒç´ éŠ˜æ–‡ï¼šé»ƒæ˜ -item.bloodmagic.scribe.dawn.name=元素銘文:黎明 - -item.bloodmagic.focus.weak.name=傳é€æ–¹ä½æ ¸å¿ƒ -item.bloodmagic.focus.enhanced.name=強化傳é€æ–¹ä½æ ¸å¿ƒ -item.bloodmagic.focus.reinforced.name=力之傳é€æ–¹ä½æ ¸å¿ƒ -item.bloodmagic.focus.demonic.name=惡魔傳é€æ–¹ä½æ ¸å¿ƒ - -item.bloodmagic.slate.blank.name=ç©ºç™½çŸ³æ¿ -item.bloodmagic.slate.reinforced.name=åŠ›ä¹‹çŸ³æ¿ -item.bloodmagic.slate.imbued.name=çŒè¼¸çŸ³æ¿ -item.bloodmagic.slate.demonic.name=æƒ¡é­”çŸ³æ¿ -item.bloodmagic.slate.ethereal.name=çŽ„å¹½çŸ³æ¿ - -item.bloodmagic.orb.weak.name=è™›å¼±æ°£è¡€å¯¶ç  -item.bloodmagic.orb.apprentice.name=å­¸å¾’æ°£è¡€å¯¶ç  -item.bloodmagic.orb.magician.name=é­”æ³•ä½¿æ°£è¡€å¯¶ç  -item.bloodmagic.orb.master.name=é­”å°Žå¸«æ°£è¡€å¯¶ç  -item.bloodmagic.orb.archmage.name=å¤§è³¢è€…æ°£è¡€å¯¶ç  -item.bloodmagic.orb.transcendent.name=è¶…è¶Šè€…æ°£è¡€å¯¶ç  - -item.bloodmagic.reagent.incendium.name=ç«ç„°ç²‰æœ« -item.bloodmagic.reagent.magicales.name=魔法粉末 -item.bloodmagic.reagent.sanctus.name=神è–粉末 -item.bloodmagic.reagent.aether.name=以太元素 -item.bloodmagic.reagent.crepitous.name=爆破粉末 -item.bloodmagic.reagent.crystallos.name=冰晶粉末 -item.bloodmagic.reagent.terrae.name=泥土粉末 -item.bloodmagic.reagent.aquasalus.name=液之粉末 -item.bloodmagic.reagent.tennebrae.name=暗黑粉末 -item.bloodmagic.reagent.offensa.name=攻勢粉末 -item.bloodmagic.reagent.praesidium.name=防守粉末 -item.bloodmagic.reagent.orbisterrae.name=環境粉末 -item.bloodmagic.reagent.virtus.name=力é‡ç²‰æœ« -item.bloodmagic.reagent.reductus.name=代價粉末 -item.bloodmagic.reagent.potentia.name=效能粉末 - -item.bloodmagic.bloodShard.weak.name=虛弱氣血碎片 -item.bloodmagic.bloodShard.demon.name=惡魔氣血碎片 - -item.bloodmagic.baseComponent.reagentWater.name=水之試劑 -item.bloodmagic.baseComponent.reagentLava.name=熔岩試劑 -item.bloodmagic.baseComponent.reagentAir.name=空之試劑 -item.bloodmagic.baseComponent.reagentFastMiner.name=礦之試劑 -item.bloodmagic.baseComponent.reagentVoid.name=虛空試劑 -item.bloodmagic.baseComponent.reagentGrowth.name=æˆé•·è©¦åŠ‘ -item.bloodmagic.baseComponent.reagentAffinity.name=元素親和力試劑 -item.bloodmagic.baseComponent.reagentSight.name=視之試劑 -item.bloodmagic.baseComponent.reagentBinding.name=ç´„æŸè©¦åŠ‘ -item.bloodmagic.baseComponent.reagentSuppression.name=抑制試劑 -item.bloodmagic.baseComponent.frameParts.name=框架部件 -item.bloodmagic.baseComponent.reagentBloodLight.name=血光試劑 -item.bloodmagic.baseComponent.reagentMagnetism.name=ç£å¼•è©¦åŠ‘ -item.bloodmagic.baseComponent.reagentHaste.name=急速試劑 -item.bloodmagic.baseComponent.reagentBridge.name=影橋試劑 -item.bloodmagic.baseComponent.reagentCompression.name=壓縮試劑 -item.bloodmagic.baseComponent.reagentSeverance.name=驅散試劑 - -item.bloodmagic.baseComponent.reagentTeleposition.name=轉é€è©¦åŠ‘ -item.bloodmagic.baseComponent.reagentTransposition.name=移ä½è©¦åŠ‘ - -item.bloodmagic.monsterSoul.base.name=惡魔慾望 - -item.bloodmagic.sigil.air.name=空氣å°è¨˜ -item.bloodmagic.sigil.bloodLight.name=血光å°è¨˜ -item.bloodmagic.sigil.compression.name=壓縮å°è¨˜ -item.bloodmagic.sigil.divination.name=å åœå°è¨˜ -item.bloodmagic.sigil.water.name=水之å°è¨˜ -item.bloodmagic.sigil.lava.name=熔岩å°è¨˜ -item.bloodmagic.sigil.void.name=虛空å°è¨˜ -item.bloodmagic.sigil.greenGrove.name=綠å¢å°è¨˜ -item.bloodmagic.sigil.elementalAffinity.name=元素å°è¨˜ -item.bloodmagic.sigil.haste.name=急速å°è¨˜ -item.bloodmagic.sigil.suppression.name=抑制å°è¨˜ -item.bloodmagic.sigil.magnetism.name=ç£å¼•å°è¨˜ -item.bloodmagic.sigil.fastMiner.name=速掘å°è¨˜ -item.bloodmagic.sigil.seer.name=æœç´¢å°è¨˜ -item.bloodmagic.sigil.phantomBridge.name=影橋å°è¨˜ -item.bloodmagic.sigil.whirlwind.name=旋風å°è¨˜ -item.bloodmagic.sigil.enderSeverance.name=終末å°è¨˜ - -item.bloodmagic.sigil.teleposition.name=轉é€å°è¨˜ -item.bloodmagic.sigil.transposition.name=移ä½å°è¨˜ - -item.bloodmagic.livingArmour.helmet.name=生命頭盔 -item.bloodmagic.livingArmour.chest.name=生命胸甲 -item.bloodmagic.livingArmour.legs.name=生命護腿 -item.bloodmagic.livingArmour.boots.name=ç”Ÿå‘½é•·é´ -item.bloodmagic.sentientArmour.helmet.name=感知頭盔 -item.bloodmagic.sentientArmour.chest.name=感知胸甲 -item.bloodmagic.sentientArmour.legs.name=感知護腿 -item.bloodmagic.sentientArmour.boots.name=æ„ŸçŸ¥é•·é´ - -item.bloodmagic.altarMaker.name=祭壇產生器 - -item.bloodmagic.ritualDivinernormal.name=å„€å¼å æ– -item.bloodmagic.ritualDivinerdusk.name=å„€å¼å æ–[黃æ˜] -item.bloodmagic.ritualDivinerdawn.name=å„€å¼å æ–[黎明] - -item.bloodmagic.arcaneAshes.name=奧法ç°ç‡¼ -item.bloodmagic.upgradeTome.name=生命護甲å‡ç´šç¶“æ–‡ -item.bloodmagic.upgradeTrainer.name=生命護甲培養環 - -item.bloodmagic.sentientSword.name=æ„ŸçŸ¥åŠ -item.bloodmagic.soulGem.petty.name=貧脊酒石晶 -item.bloodmagic.soulGem.lesser.name=次級酒石晶 -item.bloodmagic.soulGem.common.name=普通酒石晶 -item.bloodmagic.soulGem.greater.name=上等酒石晶 -item.bloodmagic.soulGem.grand.name=稀世酒石晶 -item.bloodmagic.soulSnare.base.name=簡易套索 -item.bloodmagic.sentientBow.name=感知弓 -item.bloodmagic.sentientArmourGem.name=感知護甲寶石 - -item.bloodmagic.nodeRouter.name=節點路由 -item.bloodmagic.itemFilter.exact.name=精確物å“篩é¸å™¨ -item.bloodmagic.itemFilter.ignoreNBT.name=NBT物å“篩é¸å™¨ -item.bloodmagic.itemFilter.modItems.name=模組物å“篩é¸å™¨ -item.bloodmagic.itemFilter.oreDict.name=礦物辭典物å“篩é¸å™¨ - -# Blocks -tile.bloodmagic.fluid.lifeEssence.name=ç”Ÿå‘½ç²¾è¯ - -tile.bloodmagic.stone.ritual.master.name=魔導師儀å¼çŸ³ -tile.bloodmagic.stone.ritual.imperfect.name=次級儀å¼çŸ³ - -tile.bloodmagic.altar.name=血祭壇 -tile.bloodmagic.alchemyArray.name=煉金矩陣 - -tile.bloodmagic.rune.blank.name=空白符文石 -tile.bloodmagic.rune.speed.name=速度符文石 -tile.bloodmagic.rune.efficiency.name=效益符文石 -tile.bloodmagic.rune.sacrifice.name=犧牲符文石 -tile.bloodmagic.rune.selfSacrifice.name=ç»ç¥­ç¬¦æ–‡çŸ³ -tile.bloodmagic.rune.displacement.name=移ä½ç¬¦æ–‡çŸ³ -tile.bloodmagic.rune.capacity.name=容ç´ç¬¦æ–‡çŸ³ -tile.bloodmagic.rune.augCapacity.name=增容符文石 -tile.bloodmagic.rune.orb.name=ç ä¹‹ç¬¦æ–‡çŸ³ -tile.bloodmagic.rune.acceleration.name=促進符文石 -tile.bloodmagic.rune.charging.name=充能符文石 - - -tile.bloodmagic.ritualStone.blank.name=å„€å¼çŸ³ -tile.bloodmagic.ritualStone.water.name=水之儀å¼çŸ³ -tile.bloodmagic.ritualStone.fire.name=ç«ä¹‹å„€å¼çŸ³ -tile.bloodmagic.ritualStone.earth.name=地之儀å¼çŸ³ -tile.bloodmagic.ritualStone.air.name=風之儀å¼çŸ³ -tile.bloodmagic.ritualStone.dusk.name=黃æ˜å„€å¼çŸ³ -tile.bloodmagic.ritualStone.dawn.name=黎明之儀å¼çŸ³ - -tile.bloodmagic.bloodstonebrick.large.name=大血石磚 -tile.bloodmagic.bloodstonebrick.brick.name=血石磚 -tile.bloodmagic.crystal.large.name=晶簇方塊 -tile.bloodmagic.crystal.brick.name=晶簇磚 -tile.bloodmagic.bloodLight.name=血光 -tile.bloodmagic.spectralBlock.name=波譜方塊 -tile.bloodmagic.phantom.name=幻象方塊 -tile.bloodmagic.incenseAltar.name=香壇 - -tile.bloodmagic.teleposer.name=轉é€å™¨ -tile.bloodmagic.soulForge.name=ç„ç‚Žèžçˆ -tile.bloodmagic.demonCrucible.name=惡魔å©å  - -tile.bloodmagic.masterRouting.name=魔導師路由節點 -tile.bloodmagic.outputRouting.name=輸出路由節點 -tile.bloodmagic.inputRouting.name=輸入路由節點 -tile.bloodmagic.itemRouting.name=路由節點 - -tile.bloodmagic.path.wood.name=木æ通路 -tile.bloodmagic.path.woodTile.name=平滑木通路 -tile.bloodmagic.path.stone.name=石磚通路 -tile.bloodmagic.path.stoneTile.name=平滑石通路 -tile.bloodmagic.path.wornstone.name=裂石磚通路 -tile.bloodmagic.path.wornstoneTile.name=平滑裂石通路 -tile.bloodmagic.path.obsidian.name=黑曜石通路 -tile.bloodmagic.path.obsidianTile.name=平滑黑曜石通路 - -tile.bloodmagic.dimensionalPortal.name=維度傳é€é–€ -tile.bloodmagic.bloodTank.name=血槽 - -# 工具æ示 -tooltip.bloodmagic.orb.desc=å„²å­˜ç”Ÿå‘½ç²¾è¯ -tooltip.bloodmagic.orb.owner=Added by: %s -tooltip.bloodmagic.currentOwner=Current owner: %s -tooltip.bloodmagic.currentTier=Current tier: %d -tooltip.bloodmagic.config.disabled=Currently disabled in the Config - -tooltip.bloodmagic.activated=啟用 -tooltip.bloodmagic.deactivated=未啟用 - -tooltip.bloodmagic.sigil.air.desc=&oI feel lighter already... -tooltip.bloodmagic.sigil.bloodLight.desc=&oI see a light! -tooltip.bloodmagic.sigil.compression.desc=&oHands of diamonds -tooltip.bloodmagic.sigil.divination.desc=&oPeer into the soul -tooltip.bloodmagic.sigil.divination.otherNetwork=Peering into the soul of %s -tooltip.bloodmagic.sigil.divination.currentAltarTier=Current Tier: %d -tooltip.bloodmagic.sigil.divination.currentEssence=Current Essence: %,d LP -tooltip.bloodmagic.sigil.divination.currentAltarCapacity=Current Capacity: %,d LP -tooltip.bloodmagic.sigil.divination.currentTranquility=Current Tranquility: %,d -tooltip.bloodmagic.sigil.divination.currentBonus=Current Bonus: +%,d%% -tooltip.bloodmagic.sigil.water.desc=&oInfinite water, anyone? -tooltip.bloodmagic.sigil.lava.desc=&oHOT! DO NOT EAT -tooltip.bloodmagic.sigil.void.desc=&oBetter than a Swiffer®! -tooltip.bloodmagic.sigil.greenGrove.desc=&oEnvironmentally friendly -tooltip.bloodmagic.sigil.magnetism.desc=&oI have a very magnetic personality -tooltip.bloodmagic.sigil.suppression.desc=&oBetter than telekinesis... -tooltip.bloodmagic.sigil.haste.desc=&o42 doses of caffeine later... -tooltip.bloodmagic.sigil.fastMiner.desc=&oKeep mining, and mining... -tooltip.bloodmagic.sigil.elementalAffinity.desc=&oFalling fire fishes! -tooltip.bloodmagic.sigil.seer.desc=&oWhen seeing all is not enough -tooltip.bloodmagic.sigil.seer.currentAltarProgress=Current Progress: %,d LP/ %s LP -tooltip.bloodmagic.sigil.seer.currentAltarProgress.percent=Current Progress: %s -tooltip.bloodmagic.sigil.seer.currentAltarConsumptionRate=Consumption Rate: %,d LP -tooltip.bloodmagic.sigil.seer.currentAltarTier=Current Tier: %d -tooltip.bloodmagic.sigil.seer.currentEssence=Current Essence: %,d LP -tooltip.bloodmagic.sigil.seer.currentAltarCapacity=Current Capacity: %,d LP -tooltip.bloodmagic.sigil.seer.currentCharge=Current Charge: %,d -tooltip.bloodmagic.sigil.seer.currentTranquility=Current Tranquility: %,d -tooltip.bloodmagic.sigil.seer.currentBonus=Current Bonus: +%,d%% -tooltip.bloodmagic.sigil.phantomBridge.desc=&oWalking on thin air... -tooltip.bloodmagic.sigil.whirlwind.desc=&oBest not to wear a skirt -tooltip.bloodmagic.sigil.enderSeverance.desc=&oPutting Endermen in Dire situations! - -tooltip.bloodmagic.sigil.teleposition.desc=I am very close to being moved by this. -tooltip.bloodmagic.sigil.transposition.desc=Feel the power of the Force, my young apprentice. - -tooltip.bloodmagic.bound.sword.desc=&oCulling the weak -tooltip.bloodmagic.bound.pickaxe.desc=&oDestroying stone without mercy -tooltip.bloodmagic.bound.axe.desc=&oDemonic deforestation -tooltip.bloodmagic.bound.shovel.desc=&oScrubs floors clean of dirt - -tooltip.bloodmagic.sacrificialDagger.desc=Just a prick of the finger will suffice... -tooltip.bloodmagic.slate.desc=Infused stone inside of a Blood Altar -tooltip.bloodmagic.inscriber.desc=The writing is on the wall... - -tooltip.bloodmagic.pack.selfSacrifice.desc=這背包戴起來好痛… -tooltip.bloodmagic.pack.sacrifice.desc=Description -tooltip.bloodmagic.pack.stored=Stored: %,d LP - -tooltip.bloodmagic.activationCrystal.weak=å±…å‹•ä½ŽéšŽå„€å¼ -tooltip.bloodmagic.activationCrystal.awakened=é©…å‹•æ›´å¼·å¤§çš„å„€å¼ -tooltip.bloodmagic.activationCrystal.creative=Creative Only - Activates any ritual - -tooltip.bloodmagic.diviner.currentRitual=Current Ritual: -tooltip.bloodmagic.diviner.blankRune=Blank Runes: %d -tooltip.bloodmagic.diviner.waterRune=Water Runes: %d -tooltip.bloodmagic.diviner.airRune=Air Runes: %d -tooltip.bloodmagic.diviner.fireRune=Fire Runes: %d -tooltip.bloodmagic.diviner.earthRune=Earth Runes: %d -tooltip.bloodmagic.diviner.duskRune=Dusk Runes: %d -tooltip.bloodmagic.diviner.dawnRune=Dawn Runes: %d -tooltip.bloodmagic.diviner.totalRune=Total Runes: %d -tooltip.bloodmagic.diviner.extraInfo=按shift顯示é¡å¤–資訊 -tooltip.bloodmagic.diviner.currentDirection=Current Direction: %s - -tooltip.bloodmagic.arcaneAshes=ç‘一個圈以用於煉金術 - -tooltip.bloodmagic.telepositionFocus.coords=Current coordinates: (%,d, %,d, %,d) -tooltip.bloodmagic.telepositionFocus.dimension=Dimension ID: %d -tooltip.bloodmagic.telepositionFocus.weak=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.enhanced=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.reinforced=Used to move blocks in the world -tooltip.bloodmagic.telepositionFocus.demonic=Used to move blocks in the world - -tooltip.bloodmagic.livingArmour.upgrade.speed=Quick Feet -tooltip.bloodmagic.livingArmour.upgrade.digging=Dwarven Might -tooltip.bloodmagic.livingArmour.upgrade.poisonResist=Poison Resistance -tooltip.bloodmagic.livingArmour.upgrade.selfSacrifice=Tough Palms -tooltip.bloodmagic.livingArmour.upgrade.knockback=Body Builder -tooltip.bloodmagic.livingArmour.upgrade.physicalProtect=Tough Skin -tooltip.bloodmagic.livingArmour.upgrade.health=Healthy -tooltip.bloodmagic.livingArmour.upgrade.meleeDamage=Fierce Strike -tooltip.bloodmagic.livingArmour.upgrade.arrowShot=Trick Shot -tooltip.bloodmagic.livingArmour.upgrade.stepAssist=Step Assist -tooltip.bloodmagic.livingArmour.upgrade.grimReaper=Grim Reaper's Sprint -tooltip.bloodmagic.livingArmour.upgrade.solarPowered=Solar Powered -tooltip.bloodmagic.livingArmour.upgrade.thaumRunicShielding=Runic Shielding -tooltip.bloodmagic.livingArmour.upgrade.revealing=Revealing -tooltip.bloodmagic.livingArmour.upgrade.level=%s (Level %d) -tooltip.bloodmagic.livingArmour.upgrade.points=&6Upgrade points: %s / %s - -tooltip.bloodmagic.will=Will Quality: %1$,.2f -tooltip.bloodmagic.sentientSword.desc=Uses demon will to unleash its full potential. -tooltip.bloodmagic.soulGem.petty=A gem used to contain a little will -tooltip.bloodmagic.soulGem.lesser=A gem used to contain some will -tooltip.bloodmagic.soulGem.common=A gem used to contain more will -tooltip.bloodmagic.soulGem.greater=A gem used to contain a greater amount of will -tooltip.bloodmagic.soulGem.grand=A gem used to contain a large amount of will -tooltip.bloodmagic.soulSnare.desc=Throw at a monster and then kill them to obtain their demonic will - -tooltip.bloodmagic.itemFilter.exact=Will make sure the items match precisely -tooltip.bloodmagic.itemFilter.ignoreNBT=Ignores the NBT of the filter -tooltip.bloodmagic.itemFilter.modItems=Matches all items from the same mod -tooltip.bloodmagic.itemFilter.oreDict=Used to filter through the Ore Dictionary - -tooltip.bloodmagic.fluid.type=Fluid Contained -tooltip.bloodmagic.fluid.amount=Amount -tooltip.bloodmagic.fluid.capacity=Capacity - -# å„€å¼ -ritual.bloodmagic.testRitual=Test Ritual -ritual.bloodmagic.waterRitual=Ritual of the Full Spring -ritual.bloodmagic.lavaRitual=Serenade of the Nether -ritual.bloodmagic.greenGroveRitual=Ritual of the Green Grove -ritual.bloodmagic.jumpRitual=Ritual of the High Jump -ritual.bloodmagic.wellOfSufferingRitual=Well of Suffering -ritual.bloodmagic.featheredKnifeRitual=Ritual of the Feathered Knife -ritual.bloodmagic.regenerationRitual=Ritual of Regeneration -ritual.bloodmagic.harvestRitual=Reap of the Harvest Moon -ritual.bloodmagic.magneticRitual=Ritual of Magnetism -ritual.bloodmagic.crushingRitual=Ritual of the Crusher -ritual.bloodmagic.fullStomachRitual=Ritual of the Satiated Stomach -ritual.bloodmagic.interdictionRitual=Ritual of Interdiction -ritual.bloodmagic.containmentRitual=Ritual of Containment -ritual.bloodmagic.speedRitual=Ritual of Speed -ritual.bloodmagic.suppressionRitual=Ritual of Suppression -ritual.bloodmagic.expulsionRitual=Aura of Expulsion -ritual.bloodmagic.zephyrRitual=Call of the Zephyr -ritual.bloodmagic.upgradeRemoveRitual=Sound of the Cleansing Soul -ritual.bloodmagic.armourEvolveRitual=Ritual of Living Evolution - -ritual.bloodmagic.cobblestoneRitual=Le Vulcanos Frigius -ritual.bloodmagic.placerRitual=The Filler -ritual.bloodmagic.fellingRitual=The Timberman -ritual.bloodmagic.pumpRitual=Hymn of Siphoning -ritual.bloodmagic.altarBuilderRitual=The Assembly of the High Altar -ritual.bloodmagic.portalRitual=The Gate of the Fold - -# Chat -chat.bloodmagic.altarMaker.setTier=Set Tier to: %d -chat.bloodmagic.altarMaker.building=Building a Tier %d Altar -chat.bloodmagic.altarMaker.destroy=Destroyed a Tier %d Altar -chat.bloodmagic.altarMaker.creativeOnly=This is a creative only item. - -chat.bloodmagic.damageSource=%sçš„éˆé­‚變得éŽæ–¼è™›å¼± - -chat.bloodmagic.ritual.weak=你感到一股力é‡ï¼Œä½†æ˜¯éŽæ–¼å¾®å¼±ï¼Œä¸è¶³ä»¥é©…å‹•å„€å¼ã€‚ -chat.bloodmagic.ritual.prevent=ä½ å—到儀å¼åŠ‡çƒˆçš„æŠ—æ‹’ï¼ -chat.bloodmagic.ritual.activate=能é‡å¿«é€Ÿçš„在儀å¼ä¸­æµç«„ï¼ -chat.bloodmagic.ritual.notValid=你感覺這些符文的é…置似乎ä¸å¤§æ­£ç¢º… - -chat.bloodmagic.livingArmour.upgrade.poisonRemove=ä½ çš„ç‹€æ…‹å·²å¥½è½‰ï¼ -chat.bloodmagic.livingArmour.upgrade.grimReaper=&6一股陰暗的力é‡å°‡ä½ å¾žæ­»äº¡é‚Šç·£æ‹‰å›žï¼ -chat.bloodmagic.livingArmour.newUpgrade=&4å–å¾—å‡ç´šï¼ - -# JustEnoughItems -jei.bloodmagic.recipe.altar=血祭壇 -jei.bloodmagic.recipe.binding=Alchemy Array (Binding) -jei.bloodmagic.recipe.alchemyArrayCrafting=煉金矩陣 -jei.bloodmagic.recipe.soulForge=ç„ç‚Žèžçˆ -jei.bloodmagic.recipe.requiredLP=LP: %,d -jei.bloodmagic.recipe.requiredTier=Tier: %d -jei.bloodmagic.recipe.consumptionRate=Consumption: %,d LP/t -jei.bloodmagic.recipe.drainRate=Drain: %,d LP/t -jei.bloodmagic.recipe.minimumSouls=Minimum: %1$,.2f Will -jei.bloodmagic.recipe.soulsDrained=Drained: %1$,.2f Will - -jei.bloodmagic.desc.altarBuilder=A creative-only item for use in debugging and testing.\n\nShift + Right click to change the tier to build. Right click an Altar to initiate the build.\n\nBreak an Altar while holding to dismantle it. -jei.bloodmagic.desc.demonicWill=惡魔憑ä¾åœ¨ç”Ÿç‰©èº«ä¸Šè€Œç”¢ç”Ÿçš„å°è¨˜ã€‚\n\né€éŽæŒæ„ŸçŸ¥æ­¦å™¨æ®ºæ­»æ•µäººç²å¾—。或以簡易套索擲å‘敵人,使其顯ç¾å‡ºç™½å…‰å¾Œæ®ºæ­»ä»¥å–得。 - -# WAILA -waila.bloodmagic.sneak=&o潛行展開詳細資訊 -waila.bloodmagic.array.reagent=Reagent: %s -waila.bloodmagic.array.catalyst=Catalyst: %s -option.bloodmagic.bypassSneak=Bypass Sneak -option.bloodmagic.bloodAltar=血祭壇 -option.bloodmagic.ritualController=å„€å¼çŸ³ -option.bloodmagic.teleposer=轉é€å™¨ -option.bloodmagic.array=煉金矩陣 - -# Thaumcraft -tc.research_category.BLOODMAGIC=血儀術 - -# Thaumcraft Research -bloodmagic.research_name.BLOODMAGIC=血魔法 -bloodmagic.research_text.BLOODMAGIC=血儀術 -bloodmagic.research_page.BLOODMAGIC.1=血魔法的領域一直令人感到孤僻, 而血術師的"ç¨é–€"祕法更是出å的悖離人群,常使人感到瘋狂。 然而自我犧牲與生命精è¯çš„力é‡ç”šè‡³èƒ½æ“有平凡血術師所難以估計的強大力é‡ï¼Œ 顯然秘術使å¯ä»¥æŠŠå®ƒä½œç‚ºæŸäº›ç”¨é€”ï¼ diff --git a/src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json b/src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json deleted file mode 100644 index ef383f71..00000000 --- a/src/main/resources/assets/bloodmagic/loot_tables/bm_loot_table.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "pools": [ - { - "name": "Testing", - "rolls": 1, - "entries": [ - { - "type": "item", - "name": "minecraft:stone", - "weight": 3, - "functions": [ - { - "function": "set_data", - "data": 0 - }, - { - "function": "set_count", - "count": 1 - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj b/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj index 55f9cc3d..0d33a216 100644 --- a/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj +++ b/src/main/resources/assets/bloodmagic/models/block/blockaltar.obj @@ -1,6 +1,6 @@ # Blender v2.76 (sub 0) OBJ File: '' # www.blender.org -mtllib BlockAltar.mtl +mtllib blockaltar.mtl o Shape1 v 0.000000 0.500000 1.000000 v 0.000000 -0.000000 1.000000 diff --git a/src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.obj b/src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.obj index 1a818a41..595aa694 100644 --- a/src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.obj +++ b/src/main/resources/assets/bloodmagic/models/block/blockhellfireforge.obj @@ -1,6 +1,6 @@ # Blender v2.76 (sub 0) OBJ File: '' # www.blender.org -mtllib BlockHellfireForge.mtl +mtllib blockhellfireforge.mtl o BlockHellfireForge_(5) v 0.062500 0.125000 0.937500 v 0.062500 -0.000000 0.937500 diff --git a/src/main/resources/assets/bloodmagic/models/block/bloodaltar.json b/src/main/resources/assets/bloodmagic/models/block/bloodaltar.json new file mode 100644 index 00000000..8f1f343e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/bloodaltar.json @@ -0,0 +1,10 @@ +{ + "parent": "block/block", + "loader": "forge:obj", + "flip-v": true, + "model": "bloodmagic:models/block/blockaltar.obj", + "textures": { + "default": "bloodmagic:models/altar", + "particle": "#default" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/block/soulforge.json b/src/main/resources/assets/bloodmagic/models/block/soulforge.json new file mode 100644 index 00000000..6aa32fd9 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/soulforge.json @@ -0,0 +1,10 @@ +{ + "parent": "block/block", + "loader": "forge:obj", + "flip-v": true, + "model": "bloodmagic:models/block/blockhellfireforge.obj", + "textures": { + "default": "bloodmagic:models/hellfireforge", + "particle": "#default" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/altar.json b/src/main/resources/assets/bloodmagic/models/item/altar.json new file mode 100644 index 00000000..945aff81 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/altar.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/bloodaltar" +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/life_essence_bucket.json b/src/main/resources/assets/bloodmagic/models/item/life_essence_bucket.json new file mode 100644 index 00000000..7988cf44 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/life_essence_bucket.json @@ -0,0 +1,5 @@ +{ + "parent": "forge:item/bucket_drip", + "loader": "forge:bucket", + "fluid": "bloodmagic:test_fluid" +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/models/item/soulforge.json b/src/main/resources/assets/bloodmagic/models/item/soulforge.json new file mode 100644 index 00000000..3b715b5e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/item/soulforge.json @@ -0,0 +1,3 @@ +{ + "parent": "bloodmagic:block/soulforge" +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/_constants.json b/src/main/resources/assets/bloodmagic/recipes/_constants.json deleted file mode 100644 index 4685f9ef..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/_constants.json +++ /dev/null @@ -1,128 +0,0 @@ -[ - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "blockGlass" - }, - "name": "BLOCKGLASS" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "blockIron" - }, - "name": "BLOCKIRON" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "cobblestone" - }, - "name": "COBBLESTONE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "dustGlowstone" - }, - "name": "DUSTGLOWSTONE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "dustRedstone" - }, - "name": "DUSTREDSTONE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "dyeGreen" - }, - "name": "DYEGREEN" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "dyePurple" - }, - "name": "DYEPURPLE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "dyeYellow" - }, - "name": "DYEYELLOW" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "gemDiamond" - }, - "name": "GEMDIAMOND" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "glowstone" - }, - "name": "GLOWSTONE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "ingotGold" - }, - "name": "INGOTGOLD" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "ingotIron" - }, - "name": "INGOTIRON" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "nuggetGold" - }, - "name": "NUGGETGOLD" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "plankWood" - }, - "name": "PLANKWOOD" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "stickWood" - }, - "name": "STICKWOOD" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "stone" - }, - "name": "STONE" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "string" - }, - "name": "STRING" - }, - { - "ingredient": { - "type": "forge:ore_dict", - "ore": "torch" - }, - "name": "TORCH" - } -] \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/_factories.json b/src/main/resources/assets/bloodmagic/recipes/_factories.json deleted file mode 100644 index 70d84b40..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/_factories.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ingredients": { - "orb": "WayofTime.bloodmagic.core.recipe.IngredientBloodOrbFactory" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/activation_crystal.json b/src/main/resources/assets/bloodmagic/recipes/activation_crystal.json deleted file mode 100644 index 3f376baa..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/activation_crystal.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "result": { - "item": "bloodmagic:activation_crystal", - "data": 1 - }, - "ingredients": [ - { - "item": "minecraft:nether_star" - }, - { - "type": "bloodmagic:orb", - "orb": "bloodmagic:archmage" - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/alchemy_table.json b/src/main/resources/assets/bloodmagic/recipes/alchemy_table.json deleted file mode 100644 index ab2cc8c2..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/alchemy_table.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "result": { - "item": "bloodmagic:alchemy_table" - }, - "pattern": [ - "sss", - "wbw", - "gog" - ], - "type": "forge:ore_shaped", - "key": { - "b": { - "item": "minecraft:blaze_rod" - }, - "s": { - "item": "#STONE" - }, - "w": { - "item": "#PLANKWOOD" - }, - "g": { - "item": "#INGOTGOLD" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json b/src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json deleted file mode 100644 index 29d26032..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/base_fluid_filter_0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:base_fluid_filter", - "data": 0 - }, - "pattern": [ - "sgs", - "gfg", - "sgs" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STICKWOOD" - }, - "f": { - "item": "bloodmagic:component", - "data": 10 - }, - "g": { - "item": "minecraft:bucket" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json deleted file mode 100644 index 1655e10c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_0.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:base_item_filter", - "data": 0 - }, - "pattern": [ - "sgs", - "gfg", - "sgs" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STICKWOOD" - }, - "f": { - "item": "bloodmagic:component", - "data": 10 - }, - "g": { - "item": "#BLOCKGLASS" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json deleted file mode 100644 index 6f529b90..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_1.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:base_item_filter", - "data": 1 - }, - "pattern": [ - "sgs", - "gfg", - "sgs" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STICKWOOD" - }, - "f": { - "item": "bloodmagic:component", - "data": 10 - }, - "g": { - "item": "#DYEYELLOW" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json deleted file mode 100644 index 8f82c2f4..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_2.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:base_item_filter", - "data": 2 - }, - "pattern": [ - "sgs", - "gfg", - "sgs" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STICKWOOD" - }, - "f": { - "item": "bloodmagic:component", - "data": 10 - }, - "g": { - "item": "#DYEGREEN" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json b/src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json deleted file mode 100644 index a7459853..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/base_item_filter_3.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:base_item_filter", - "data": 3 - }, - "pattern": [ - "sgs", - "gfg", - "sgs" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STICKWOOD" - }, - "f": { - "item": "bloodmagic:component", - "data": 10 - }, - "g": { - "item": "#DYEPURPLE" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json deleted file mode 100644 index 885311d0..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_acceleration.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 9 - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "minecraft:bucket" - }, - "b": { - "item": "bloodmagic:slate", - "data": 3 - }, - "c": { - "item": "#INGOTGOLD" - }, - "d": { - "item": "bloodmagic:blood_rune", - "data": 1 - }, - "e": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json deleted file mode 100644 index 2c63c590..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_augcapacity.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 7 - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "minecraft:crafting_shaped", - "key": { - "a": { - "item": "minecraft:obsidian" - }, - "b": { - "item": "bloodmagic:slate", - "data": 3 - }, - "c": { - "item": "minecraft:bucket" - }, - "d": { - "item": "bloodmagic:blood_rune", - "data": 6 - }, - "e": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json deleted file mode 100644 index 1a354301..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_blank.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "pattern": [ - "aaa", - "bcb", - "aaa" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "bloodmagic:slate", - "data": 0 - }, - "c": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json deleted file mode 100644 index e3b8a876..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_capacity.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 6 - }, - "pattern": [ - "aba", - "bcb", - "ada" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "minecraft:bucket" - }, - "c": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "d": { - "item": "bloodmagic:slate", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json deleted file mode 100644 index 7ebc7383..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_charging.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 10 - }, - "pattern": [ - "RsR", - "GrG", - "ReR" - ], - "type": "forge:ore_shaped", - "key": { - "R": { - "item": "#DUSTREDSTONE" - }, - "r": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "s": { - "item": "bloodmagic:slate", - "data": 3 - }, - "e": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - }, - "G": { - "item": "#GLOWSTONE" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json deleted file mode 100644 index 54b8c8c4..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_displacement.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 5 - }, - "pattern": [ - "aba", - "bcb", - "ada" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "minecraft:water_bucket" - }, - "c": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "d": { - "item": "bloodmagic:slate", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json deleted file mode 100644 index 9f76c1a9..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_orb.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 8 - }, - "pattern": [ - "aba", - "cdc", - "aba" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - }, - "c": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "d": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json deleted file mode 100644 index 70e2c399..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_sacrifice.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 3 - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "bloodmagic:slate", - "data": 1 - }, - "c": { - "item": "#INGOTGOLD" - }, - "d": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "e": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:apprentice" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json deleted file mode 100644 index af7f3bc3..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_selfsacrifice.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 4 - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "bloodmagic:slate", - "data": 1 - }, - "c": { - "item": "#DUSTGLOWSTONE" - }, - "d": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "e": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:apprentice" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json b/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json deleted file mode 100644 index b161a4af..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_rune/blood_rune_speed.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_rune", - "data": 1 - }, - "pattern": [ - "aba", - "cdc", - "aba" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#STONE" - }, - "b": { - "item": "bloodmagic:slate", - "data": 0 - }, - "c": { - "item": "minecraft:sugar" - }, - "d": { - "item": "bloodmagic:blood_rune", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json deleted file mode 100644 index 756d43af..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_0.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 0 - }, - "pattern": [ - "RBR", - "G G", - "RRR" - ], - "type": "forge:ore_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "G": { - "item": "#BLOCKGLASS" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json deleted file mode 100644 index 5167464b..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_1.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 1 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json deleted file mode 100644 index fdf4337f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_10.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 10 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 9 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json deleted file mode 100644 index 1aee0e5e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_11.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 11 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 10 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json deleted file mode 100644 index ac198a0d..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_12.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 12 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 11 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json deleted file mode 100644 index 7d3511fc..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_13.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 13 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 12 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json deleted file mode 100644 index 057ef84b..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_14.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 14 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 13 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json deleted file mode 100644 index 9c12b336..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_15.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 15 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 14 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json deleted file mode 100644 index 46e11986..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_2.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 2 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json deleted file mode 100644 index 62d52c96..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_3.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 3 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json deleted file mode 100644 index 88b6b83e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_4.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 4 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json deleted file mode 100644 index 8d6db55e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_5.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 5 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json deleted file mode 100644 index 9304a747..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_6.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 6 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 5 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json deleted file mode 100644 index 7decd313..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_7.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 7 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 6 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json deleted file mode 100644 index 8181bfae..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_8.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 8 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 7 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json b/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json deleted file mode 100644 index e1237382..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/blood_tank/blood_tank_9.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:blood_tank", - "data": 9 - }, - "pattern": [ - "RBR", - "T T", - "RRR" - ], - "type": "minecraft:crafting_shaped", - "key": { - "R": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "B": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "T": { - "item": "bloodmagic:blood_tank", - "data": 8 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json b/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json deleted file mode 100644 index 636c8710..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_brick.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:decorative_brick", - "data": 1, - "count": 4 - }, - "pattern": [ - "aa", - "aa" - ], - "type": "minecraft:crafting_shaped", - "key": { - "a": { - "item": "bloodmagic:decorative_brick", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json b/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json deleted file mode 100644 index 9dc01b3e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/decorative_brick_bloodstone_tile.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "result": { - "item": "bloodmagic:decorative_brick", - "data": 0, - "count": 16 - }, - "ingredients": [ - { - "item": "#STONE" - }, - { - "item": "bloodmagic:blood_shard", - "data": 0 - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json deleted file mode 100644 index 90d39443..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_1", - "data": 1, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 6 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json deleted file mode 100644 index 31546399..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_1", - "data": 2, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 7 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json deleted file mode 100644 index e226f9a7..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_1", - "data": 0, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 5 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json deleted file mode 100644 index 18f5ad91..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_1", - "data": 4, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 9 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json deleted file mode 100644 index 8fa984f8..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_1_brick1_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_1", - "data": 3, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 8 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json deleted file mode 100644 index b67262f1..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 1, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json deleted file mode 100644 index aff6baa3..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 2, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json deleted file mode 100644 index 951faf2e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 0, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json deleted file mode 100644 index 3d1cc8d7..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 4, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json deleted file mode 100644 index 405fe6f5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_smallbrick_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 3, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json deleted file mode 100644 index cc134c02..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_corrosive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 6, - "count": 9 - }, - "pattern": [ - "scs", - "ccc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 1 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json deleted file mode 100644 index 305ed3a7..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_destructive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 7, - "count": 9 - }, - "pattern": [ - "scs", - "ccc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 2 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json deleted file mode 100644 index a9aa5a77..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_raw.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 5, - "count": 9 - }, - "pattern": [ - "scs", - "ccc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 0 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json deleted file mode 100644 index 718356e2..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_steadfast.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 9, - "count": 9 - }, - "pattern": [ - "scs", - "ccc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 4 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json deleted file mode 100644 index caa3ad55..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tile_vengeful.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 8, - "count": 9 - }, - "pattern": [ - "scs", - "ccc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 3 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json deleted file mode 100644 index 46cc1293..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_corrosive.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 11, - "count": 9 - }, - "pattern": [ - "scs", - "coc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 1 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 1 - }, - "o": { - "item": "bloodmagic:item_demon_crystal", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json deleted file mode 100644 index 17bc0d0e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_destructive.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 12, - "count": 9 - }, - "pattern": [ - "scs", - "coc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 2 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 2 - }, - "o": { - "item": "bloodmagic:item_demon_crystal", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json deleted file mode 100644 index 0e6832a4..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_raw.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 10, - "count": 9 - }, - "pattern": [ - "scs", - "coc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 0 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 0 - }, - "o": { - "item": "bloodmagic:item_demon_crystal", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json deleted file mode 100644 index d221cbe8..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_steadfast.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 14, - "count": 9 - }, - "pattern": [ - "scs", - "coc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 4 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 4 - }, - "o": { - "item": "bloodmagic:item_demon_crystal", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json deleted file mode 100644 index 32fbbeec..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_brick_2_tilespecial_vengeful.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_brick_2", - "data": 13, - "count": 9 - }, - "pattern": [ - "scs", - "coc", - "scs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 3 - }, - "c": { - "item": "bloodmagic:demon_brick_1", - "data": 3 - }, - "o": { - "item": "bloodmagic:item_demon_crystal", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json deleted file mode 100644 index a66bd811..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 6, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json deleted file mode 100644 index 5df3b1d9..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 7, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json deleted file mode 100644 index 49240f26..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 5, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json deleted file mode 100644 index 73845172..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 9, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json deleted file mode 100644 index 6c4cd7c5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_polished_stone_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 8, - "count": 4 - }, - "pattern": [ - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json deleted file mode 100644 index 28bf109a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_corrosive.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 1, - "count": 16 - }, - "ingredients": [ - { - "item": "bloodmagic:item_demon_crystal", - "data": 1 - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json deleted file mode 100644 index b190c56f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_destructive.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 2, - "count": 16 - }, - "ingredients": [ - { - "item": "bloodmagic:item_demon_crystal", - "data": 2 - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json deleted file mode 100644 index aeb276b6..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_raw.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 0, - "count": 16 - }, - "ingredients": [ - { - "item": "bloodmagic:item_demon_crystal", - "data": 0 - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json deleted file mode 100644 index a03834f8..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_steadfast.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 4, - "count": 16 - }, - "ingredients": [ - { - "item": "bloodmagic:item_demon_crystal", - "data": 4 - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json deleted file mode 100644 index 86e63596..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_extras_stone_vengeful.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_extras", - "data": 3, - "count": 16 - }, - "ingredients": [ - { - "item": "bloodmagic:item_demon_crystal", - "data": 3 - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json deleted file mode 100644 index 6396fc8f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_corrosive.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_light", - "data": 1, - "count": 5 - }, - "pattern": [ - "sgs", - "ggg", - "sgs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 6 - }, - "g": { - "item": "minecraft:glowstone" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json deleted file mode 100644 index d7d99aa5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_destructive.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_light", - "data": 2, - "count": 5 - }, - "pattern": [ - "sgs", - "ggg", - "sgs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 7 - }, - "g": { - "item": "minecraft:glowstone" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json deleted file mode 100644 index 8817d3ad..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_raw.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_light", - "data": 0, - "count": 5 - }, - "pattern": [ - "sgs", - "ggg", - "sgs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 5 - }, - "g": { - "item": "minecraft:glowstone" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json deleted file mode 100644 index cf27ceb3..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_steadfast.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_light", - "data": 4, - "count": 5 - }, - "pattern": [ - "sgs", - "ggg", - "sgs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 9 - }, - "g": { - "item": "minecraft:glowstone" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json deleted file mode 100644 index dfcf5d75..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_light_vengeful.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_light", - "data": 3, - "count": 5 - }, - "pattern": [ - "sgs", - "ggg", - "sgs" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 8 - }, - "g": { - "item": "minecraft:glowstone" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json deleted file mode 100644 index 4448dbfe..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_corrosive.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_1", - "data": 1, - "count": 6 - }, - "pattern": [ - "ss", - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 6 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json deleted file mode 100644 index c7ae8aed..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_destructive.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_1", - "data": 2, - "count": 6 - }, - "pattern": [ - "ss", - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 7 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json deleted file mode 100644 index afee6a8d..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_raw.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_1", - "data": 0, - "count": 6 - }, - "pattern": [ - "ss", - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 5 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json deleted file mode 100644 index fbf5d7e0..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_steadfast.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_1", - "data": 4, - "count": 6 - }, - "pattern": [ - "ss", - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 9 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json deleted file mode 100644 index f9f079d6..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_1_vengeful.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_1", - "data": 3, - "count": 6 - }, - "pattern": [ - "ss", - "ss", - "ss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 8 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json deleted file mode 100644 index e74a80a8..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_corrosive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_2", - "data": 1, - "count": 8 - }, - "pattern": [ - "ppp", - "pcp", - "ppp" - ], - "type": "minecraft:crafting_shaped", - "key": { - "p": { - "item": "bloodmagic:demon_pillar_1", - "data": 1 - }, - "c": { - "item": "bloodmagic:item_demon_crystal", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json deleted file mode 100644 index 8869bc5f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_destructive.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_2", - "data": 2, - "count": 8 - }, - "pattern": [ - "ppp", - "pcp", - "ppp" - ], - "type": "minecraft:crafting_shaped", - "key": { - "p": { - "item": "bloodmagic:demon_pillar_1", - "data": 2 - }, - "c": { - "item": "bloodmagic:item_demon_crystal", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json deleted file mode 100644 index cdc818ac..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_raw.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_2", - "data": 0, - "count": 8 - }, - "pattern": [ - "ppp", - "pcp", - "ppp" - ], - "type": "minecraft:crafting_shaped", - "key": { - "p": { - "item": "bloodmagic:demon_pillar_1", - "data": 0 - }, - "c": { - "item": "bloodmagic:item_demon_crystal", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json deleted file mode 100644 index fab79b32..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_steadfast.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_2", - "data": 4, - "count": 8 - }, - "pattern": [ - "ppp", - "pcp", - "ppp" - ], - "type": "minecraft:crafting_shaped", - "key": { - "p": { - "item": "bloodmagic:demon_pillar_1", - "data": 4 - }, - "c": { - "item": "bloodmagic:item_demon_crystal", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json deleted file mode 100644 index 2b65e834..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_2_vengeful.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_2", - "data": 3, - "count": 8 - }, - "pattern": [ - "ppp", - "pcp", - "ppp" - ], - "type": "minecraft:crafting_shaped", - "key": { - "p": { - "item": "bloodmagic:demon_pillar_1", - "data": 3 - }, - "c": { - "item": "bloodmagic:item_demon_crystal", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json deleted file mode 100644 index 7f711d0c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_cap_1", - "data": 1, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_pillar_1", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json deleted file mode 100644 index ba1305d5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_1_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_cap_1", - "data": 0, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_pillar_1", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json deleted file mode 100644 index 4b1f890a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_cap_2", - "data": 0, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_pillar_1", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json deleted file mode 100644 index 7a19d3cf..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_2_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_cap_2", - "data": 1, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_pillar_1", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json deleted file mode 100644 index a0f4f58e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_pillar_cap_3_steadfast.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_pillar_cap_3", - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_pillar_1", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json deleted file mode 100644 index 0d2824b6..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_corrosive.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_stairs_1", - "data": 1, - "count": 8 - }, - "pattern": [ - "s ", - "ss ", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 6 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json deleted file mode 100644 index 3e4ff319..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_1_raw.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_stairs_1", - "data": 0, - "count": 8 - }, - "pattern": [ - "s ", - "ss ", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 5 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json deleted file mode 100644 index 6d6a96f5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_destructive.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_stairs_2", - "data": 0, - "count": 8 - }, - "pattern": [ - "s ", - "ss ", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 7 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json deleted file mode 100644 index 77527b86..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_2_vengeful.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_stairs_2", - "data": 1, - "count": 8 - }, - "pattern": [ - "s ", - "ss ", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 8 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json deleted file mode 100644 index 9fcdcbf9..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_stairs_3_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_stairs_3", - "count": 8 - }, - "pattern": [ - "s ", - "ss ", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 9 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json deleted file mode 100644 index 7b48b030..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 1, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json deleted file mode 100644 index e1b23e21..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 2, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json deleted file mode 100644 index 25b47dec..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 0, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json deleted file mode 100644 index e7967dfa..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 4, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json deleted file mode 100644 index 98d5ec24..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_brick_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 3, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_1", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json deleted file mode 100644 index 62ea247b..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 11, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 6 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json deleted file mode 100644 index e00e4198..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 12, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 7 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json deleted file mode 100644 index 791bdb5c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 10, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 5 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json deleted file mode 100644 index 16a07805..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 14, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 9 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json deleted file mode 100644 index 33031c4d..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_large_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 13, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_extras", - "data": 8 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json deleted file mode 100644 index 32bc21f7..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_corrosive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 6, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_2", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json deleted file mode 100644 index 2f4fbf18..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_destructive.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 7, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_2", - "data": 2 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json deleted file mode 100644 index 8c42b8c9..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_raw.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 5, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_2", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json deleted file mode 100644 index b94df87c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_steadfast.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 9, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_2", - "data": 4 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json b/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json deleted file mode 100644 index 15ecb860..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/demon_decor/demon_wall_1_smallbrick_vengeful.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "result": { - "item": "bloodmagic:demon_wall_1", - "data": 8, - "count": 6 - }, - "pattern": [ - "sss", - "sss" - ], - "type": "minecraft:crafting_shaped", - "key": { - "s": { - "item": "bloodmagic:demon_brick_2", - "data": 3 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/experience_tome.json b/src/main/resources/assets/bloodmagic/recipes/experience_tome.json deleted file mode 100644 index 12dbe103..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/experience_tome.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "result": { - "item": "bloodmagic:experience_tome" - }, - "pattern": [ - "ses", - "lbl", - "gog" - ], - "type": "forge:ore_shaped", - "key": { - "b": { - "item": "minecraft:enchanted_book" - }, - "s": { - "item": "#STRING" - }, - "e": { - "item": "minecraft:lapis_block" - }, - "g": { - "item": "#INGOTGOLD" - }, - "l": { - "item": "bloodmagic:slate", - "data": 2 - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/incense_altar.json b/src/main/resources/assets/bloodmagic/recipes/incense_altar.json deleted file mode 100644 index 4748c205..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/incense_altar.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:incense_altar" - }, - "pattern": [ - "s s", - "shs", - "coc" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STONE" - }, - "c": { - "item": "#COBBLESTONE" - }, - "h": { - "item": "minecraft:coal", - "data": 1 - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/lava_crystal.json b/src/main/resources/assets/bloodmagic/recipes/lava_crystal.json deleted file mode 100644 index e0311e8f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/lava_crystal.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "result": { - "item": "bloodmagic:lava_crystal" - }, - "pattern": [ - "aba", - "bcb", - "ded" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#BLOCKGLASS" - }, - "b": { - "item": "minecraft:lava_bucket" - }, - "c": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - }, - "d": { - "item": "minecraft:obsidian" - }, - "e": { - "item": "#GEMDIAMOND" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json b/src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json deleted file mode 100644 index 361f9ed3..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/mimic_nohitbox.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:mimic", - "data": 0, - "count": 4 - }, - "pattern": [ - "b b", - " r ", - "bob" - ], - "type": "minecraft:crafting_shaped", - "key": { - "b": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "r": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json b/src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json deleted file mode 100644 index a14fa6e0..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/mimic_solidclear.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "result": { - "item": "bloodmagic:mimic", - "data": 2, - "count": 4 - }, - "pattern": [ - "bsb", - "srs", - "bob" - ], - "type": "forge:ore_shaped", - "key": { - "b": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "r": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "s": { - "item": "#BLOCKGLASS" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json b/src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json deleted file mode 100644 index 7db4b442..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/mimic_solidlight.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "result": { - "item": "bloodmagic:mimic", - "data": 3, - "count": 2 - }, - "pattern": [ - "bnb", - "trt", - "bob" - ], - "type": "forge:ore_shaped", - "key": { - "b": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "r": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "t": { - "item": "#TORCH" - }, - "n": { - "item": "#GLOWSTONE" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json b/src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json deleted file mode 100644 index 4c281089..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/mimic_solidopaque.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "result": { - "item": "bloodmagic:mimic", - "data": 1, - "count": 4 - }, - "pattern": [ - "bsb", - "srs", - "bob" - ], - "type": "forge:ore_shaped", - "key": { - "b": { - "item": "bloodmagic:decorative_brick", - "data": 0 - }, - "r": { - "item": "bloodmagic:blood_rune", - "data": 0 - }, - "s": { - "item": "#STONE" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json b/src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json deleted file mode 100644 index e82cd67e..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/pack_sacrifice.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "result": { - "item": "bloodmagic:pack_sacrifice" - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#BLOCKGLASS" - }, - "b": { - "item": "minecraft:bucket" - }, - "c": { - "item": "#INGOTIRON" - }, - "d": { - "item": "minecraft:leather_chestplate" - }, - "e": { - "item": "bloodmagic:slate", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json b/src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json deleted file mode 100644 index 138ba293..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/pack_self_sacrifice.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "result": { - "item": "bloodmagic:pack_self_sacrifice" - }, - "pattern": [ - "aba", - "cdc", - "aea" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#BLOCKGLASS" - }, - "b": { - "item": "minecraft:bucket" - }, - "c": { - "item": "minecraft:flint" - }, - "d": { - "item": "minecraft:leather_chestplate" - }, - "e": { - "item": "bloodmagic:slate", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json b/src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json deleted file mode 100644 index 2898208a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_obsidian.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 6, - "count": 4 - }, - "ingredients": [ - { - "item": "minecraft:obsidian" - }, - { - "item": "minecraft:obsidian" - }, - { - "item": "minecraft:obsidian" - }, - { - "item": "minecraft:obsidian" - }, - { - "type": "bloodmagic:orb", - "orb": "bloodmagic:archmage" - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json b/src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json deleted file mode 100644 index e235db72..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_obsidiantile.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 7, - "count": 4 - }, - "ingredients": [ - { - "item": "bloodmagic:path", - "data": 6 - }, - { - "item": "bloodmagic:path", - "data": 6 - }, - { - "item": "bloodmagic:path", - "data": 6 - }, - { - "item": "bloodmagic:path", - "data": 6 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_stone.json b/src/main/resources/assets/bloodmagic/recipes/path/path_stone.json deleted file mode 100644 index 0503ed1c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_stone.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 2, - "count": 4 - }, - "ingredients": [ - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "item": "#STONE" - }, - { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json b/src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json deleted file mode 100644 index 5cf9c223..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_stonetile.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 3, - "count": 4 - }, - "ingredients": [ - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_wood.json b/src/main/resources/assets/bloodmagic/recipes/path/path_wood.json deleted file mode 100644 index fcb33fd3..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_wood.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 0, - "count": 4 - }, - "ingredients": [ - { - "item": "#PLANKWOOD" - }, - { - "item": "#PLANKWOOD" - }, - { - "item": "#PLANKWOOD" - }, - { - "item": "#PLANKWOOD" - }, - { - "type": "bloodmagic:orb", - "orb": "bloodmagic:apprentice" - } - ], - "type": "forge:ore_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json b/src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json deleted file mode 100644 index 90b26af1..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_woodtile.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 1, - "count": 4 - }, - "ingredients": [ - { - "item": "bloodmagic:path", - "data": 0 - }, - { - "item": "bloodmagic:path", - "data": 0 - }, - { - "item": "bloodmagic:path", - "data": 0 - }, - { - "item": "bloodmagic:path", - "data": 0 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json b/src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json deleted file mode 100644 index 86e114b7..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_wornstone.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 4, - "count": 4 - }, - "ingredients": [ - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "item": "bloodmagic:path", - "data": 2 - }, - { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json b/src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json deleted file mode 100644 index 2b66ed18..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/path/path_wornstonetile.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:path", - "data": 5, - "count": 4 - }, - "ingredients": [ - { - "item": "bloodmagic:path", - "data": 4 - }, - { - "item": "bloodmagic:path", - "data": 4 - }, - { - "item": "bloodmagic:path", - "data": 4 - }, - { - "item": "bloodmagic:path", - "data": 4 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json deleted file mode 100644 index 17bfdac9..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_imperfect.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_controller", - "data": 1 - }, - "pattern": [ - "aba", - "bcb", - "aba" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "minecraft:obsidian" - }, - "b": { - "item": "#STONE" - }, - "c": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:weak" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json deleted file mode 100644 index d712efbe..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_inverted.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_controller", - "data": 2 - }, - "ingredients": [ - { - "item": "bloodmagic:ritual_controller", - "data": 0 - }, - { - "item": "minecraft:redstone_torch" - }, - { - "item": "bloodmagic:slate", - "data": 0 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json deleted file mode 100644 index 74e1458c..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_controller", - "data": 0 - }, - "pattern": [ - "aba", - "bcb", - "aba" - ], - "type": "minecraft:crafting_shaped", - "key": { - "a": { - "item": "minecraft:obsidian" - }, - "b": { - "item": "bloodmagic:ritual_stone", - "data": 0 - }, - "c": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:magician" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json b/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json deleted file mode 100644 index 5b55815a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_controller_master_alt.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_controller", - "data": 0 - }, - "ingredients": [ - { - "item": "bloodmagic:ritual_controller", - "data": 2 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json b/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json deleted file mode 100644 index 9b48c652..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_0.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_diviner", - "data": 0 - }, - "pattern": [ - "dfd", - "ase", - "dwd" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "bloodmagic:inscription_tool", - "data": 4 - }, - "s": { - "item": "#STICKWOOD" - }, - "d": { - "item": "#GEMDIAMOND" - }, - "e": { - "item": "bloodmagic:inscription_tool", - "data": 3 - }, - "f": { - "item": "bloodmagic:inscription_tool", - "data": 2 - }, - "w": { - "item": "bloodmagic:inscription_tool", - "data": 1 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json b/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json deleted file mode 100644 index ca45383a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_diviner_1.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_diviner", - "data": 1 - }, - "pattern": [ - " S ", - "tdt", - " S " - ], - "type": "minecraft:crafting_shaped", - "key": { - "S": { - "item": "bloodmagic:slate", - "data": 3 - }, - "t": { - "item": "bloodmagic:inscription_tool", - "data": 5 - }, - "d": { - "item": "bloodmagic:ritual_diviner", - "data": 0 - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_reader.json b/src/main/resources/assets/bloodmagic/recipes/ritual_reader.json deleted file mode 100644 index cbf3f52a..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_reader.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_reader" - }, - "pattern": [ - "gog", - "isi", - " s " - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "bloodmagic:slate", - "data": 3 - }, - "g": { - "item": "#BLOCKGLASS" - }, - "i": { - "item": "#INGOTGOLD" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json b/src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json deleted file mode 100644 index 7e321bb2..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_stone_blank.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_stone", - "data": 0, - "count": 4 - }, - "pattern": [ - "aba", - "bcb", - "aba" - ], - "type": "minecraft:crafting_shaped", - "key": { - "a": { - "item": "minecraft:obsidian" - }, - "b": { - "item": "bloodmagic:slate", - "data": 1 - }, - "c": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:apprentice" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json b/src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json deleted file mode 100644 index 439ad7d2..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/ritual_stone_reset.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "result": { - "item": "bloodmagic:ritual_stone", - "data": 0 - }, - "ingredients": [ - { - "item": "bloodmagic:ritual_stone", - "data": 32767 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json b/src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json deleted file mode 100644 index f622ef14..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/sacrificial_dagger.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:sacrificial_dagger", - "data": 0 - }, - "pattern": [ - "aaa", - " ba", - "c a" - ], - "type": "forge:ore_shaped", - "key": { - "a": { - "item": "#BLOCKGLASS" - }, - "b": { - "item": "#INGOTGOLD" - }, - "c": { - "item": "#INGOTIRON" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/soul_forge.json b/src/main/resources/assets/bloodmagic/recipes/soul_forge.json deleted file mode 100644 index 7dfd9961..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/soul_forge.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "result": { - "item": "bloodmagic:soul_forge" - }, - "pattern": [ - "i i", - "sgs", - "sos" - ], - "type": "forge:ore_shaped", - "key": { - "s": { - "item": "#STONE" - }, - "g": { - "item": "#INGOTGOLD" - }, - "i": { - "item": "#INGOTIRON" - }, - "o": { - "item": "#BLOCKIRON" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/soul_snare.json b/src/main/resources/assets/bloodmagic/recipes/soul_snare.json deleted file mode 100644 index 20a518c5..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/soul_snare.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "result": { - "item": "bloodmagic:soul_snare", - "data": 0, - "count": 4 - }, - "pattern": [ - "sis", - "iri", - "sis" - ], - "type": "forge:ore_shaped", - "key": { - "r": { - "item": "#DUSTREDSTONE" - }, - "s": { - "item": "#STRING" - }, - "i": { - "item": "#INGOTIRON" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/teleposer.json b/src/main/resources/assets/bloodmagic/recipes/teleposer.json deleted file mode 100644 index 388d0153..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/teleposer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "result": { - "item": "bloodmagic:teleposer" - }, - "pattern": [ - "ggg", - "efe", - "ggg" - ], - "type": "forge:ore_shaped", - "key": { - "e": { - "item": "minecraft:ender_pearl" - }, - "f": { - "item": "bloodmagic:teleposition_focus", - "data": 0 - }, - "g": { - "item": "#INGOTGOLD" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json b/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json deleted file mode 100644 index 16212c4f..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_2.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "result": { - "item": "bloodmagic:teleposition_focus", - "data": 2 - }, - "ingredients": [ - { - "item": "bloodmagic:teleposition_focus", - "data": 1 - }, - { - "item": "bloodmagic:blood_shard", - "data": 0 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json b/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json deleted file mode 100644 index 9be6ba08..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/teleposition_focus_3.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "result": { - "item": "bloodmagic:teleposition_focus", - "data": 3 - }, - "ingredients": [ - { - "item": "bloodmagic:teleposition_focus", - "data": 2 - }, - { - "item": "bloodmagic:blood_shard", - "data": 1 - } - ], - "type": "minecraft:crafting_shapeless" -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json b/src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json deleted file mode 100644 index d540e3e4..00000000 --- a/src/main/resources/assets/bloodmagic/recipes/upgrade_trainer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "result": { - "item": "bloodmagic:upgrade_trainer", - "data": 0 - }, - "pattern": [ - "ngn", - "ioi", - "ngn" - ], - "type": "forge:ore_shaped", - "key": { - "g": { - "item": "#INGOTGOLD" - }, - "i": { - "item": "#INGOTIRON" - }, - "n": { - "item": "#NUGGETGOLD" - }, - "o": { - "type": "bloodmagic:orb", - "orb": "bloodmagic:master" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/schematics/corridor1.json b/src/main/resources/assets/bloodmagic/schematics/corridor1.json deleted file mode 100644 index 7e60e3f4..00000000 --- a/src/main/resources/assets/bloodmagic/schematics/corridor1.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "dungeonWeight": 4, - "structureMap": { - "bloodmagic:Corridor1": { - "x": 0, - "y": 0, - "z": 0 - } - }, - "doorMap": { - "west": [ - { - "x": 0, - "y": 0, - "z": 3 - } - ], - "south": [ - { - "x": 3, - "y": 0, - "z": 6 - } - ], - "north": [ - { - "x": 3, - "y": 0, - "z": 0 - } - ] - }, - "descriptorList": [ - { - "minimumOffset": { - "x": 0, - "y": 0, - "z": 0 - }, - "maximumOffset": { - "x": 5, - "y": 3, - "z": 7 - }, - "blockPosCache": [], - "cache": true - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/schematics/hallchest1.json b/src/main/resources/assets/bloodmagic/schematics/hallchest1.json deleted file mode 100644 index 43d78664..00000000 --- a/src/main/resources/assets/bloodmagic/schematics/hallchest1.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "structureMap": { - "bloodmagic:HallChest1": { - "x": 0, - "y": 0, - "z": 0 - } - }, - "doorMap": { - "west": [ - { - "x": 0, - "y": 0, - "z": 4 - } - ], - "east": [ - { - "x": 11, - "y": 0, - "z": 4 - } - ] - }, - "descriptorList": [ - { - "minimumOffset": { - "x": 0, - "y": 0, - "z": 0 - }, - "maximumOffset": { - "x": 12, - "y": 5, - "z": 9 - }, - "blockPosCache": [], - "cache": true - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/schematics/rawbuilding1.json b/src/main/resources/assets/bloodmagic/schematics/rawbuilding1.json deleted file mode 100644 index 007753c7..00000000 --- a/src/main/resources/assets/bloodmagic/schematics/rawbuilding1.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "dungeonWeight": 4, - "structureMap": { - "bloodmagic:Building1": { - "x": 0, - "y": 0, - "z": 0 - } - }, - "doorMap": { - "south": [ - { - "x": 7, - "y": 0, - "z": 14 - }, - { - "x": 4, - "y": 8, - "z": 14 - } - ], - "north": [ - { - "x": 4, - "y": 8, - "z": 0 - } - ] - }, - "descriptorList": [ - { - "minimumOffset": { - "x": 0, - "y": 0, - "z": 0 - }, - "maximumOffset": { - "x": 15, - "y": 13, - "z": 15 - }, - "blockPosCache": [], - "cache": true - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/schematics/schematics.json b/src/main/resources/assets/bloodmagic/schematics/schematics.json deleted file mode 100644 index 2f91ff04..00000000 --- a/src/main/resources/assets/bloodmagic/schematics/schematics.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "bloodmagic:corridor1", - "bloodmagic:hallchest1", - "bloodmagic:rawbuilding1" -] \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag b/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag deleted file mode 100644 index e3b2e255..00000000 --- a/src/main/resources/assets/bloodmagic/shaders/beam-broken.frag +++ /dev/null @@ -1,10 +0,0 @@ - uniform sampler2D bgl_RenderedTexture; - uniform int time; - - void main() { - vec2 texcoord = vec2(gl_TexCoord[0]); - vec4 color = texture2D(bgl_RenderedTexture, texcoord); - float r = sin(texcoord.x * 6.0 - 1.5 + sin(texcoord.y - float(time) / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; - - gl_FragColor = vec4(min(1 - r, color.r * gl_Color.r), min(1 - r, color.g * gl_Color.g), color.b * gl_Color.b, color.a * gl_Color.a); - } diff --git a/src/main/resources/assets/bloodmagic/shaders/beam.frag b/src/main/resources/assets/bloodmagic/shaders/beam.frag deleted file mode 100644 index 2ccc5dcd..00000000 --- a/src/main/resources/assets/bloodmagic/shaders/beam.frag +++ /dev/null @@ -1,12 +0,0 @@ - uniform sampler2D bgl_RenderedTexture; - uniform int time; - - void main() { - vec2 texcoord = vec2(gl_TexCoord[0]); - vec4 color = texture2D(bgl_RenderedTexture, texcoord); - - float gs = (color.r + color.g + color.b) / 3.0; - float r = sin(texcoord.x * 6.0 - 1.5 + sin(texcoord.y - float(time) / 3.0)) * 1.1; //(sin((texcoord.x - texcoord.y) * 4 - time) + 1) / 2; - - gl_FragColor = vec4(gs, gs, max(gs, r), gl_Color.a); - } diff --git a/src/main/resources/assets/bloodmagic/structures/building1.nbt b/src/main/resources/assets/bloodmagic/structures/building1.nbt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/resources/assets/bloodmagic/structures/corridor1.nbt b/src/main/resources/assets/bloodmagic/structures/corridor1.nbt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/resources/assets/bloodmagic/structures/hallchest1.nbt b/src/main/resources/assets/bloodmagic/structures/hallchest1.nbt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/accelerationrune.png b/src/main/resources/assets/bloodmagic/textures/block/accelerationrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/accelerationrune.png rename to src/main/resources/assets/bloodmagic/textures/block/accelerationrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/airritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/airritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/airritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/airritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/altarcapacityrune.png b/src/main/resources/assets/bloodmagic/textures/block/altarcapacityrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/altarcapacityrune.png rename to src/main/resources/assets/bloodmagic/textures/block/altarcapacityrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bettercapacityrune.png b/src/main/resources/assets/bloodmagic/textures/block/bettercapacityrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/bettercapacityrune.png rename to src/main/resources/assets/bloodmagic/textures/block/bettercapacityrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/blankrune.png b/src/main/resources/assets/bloodmagic/textures/block/blankrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/blankrune.png rename to src/main/resources/assets/bloodmagic/textures/block/blankrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/largebloodstonebrick.png b/src/main/resources/assets/bloodmagic/textures/block/bloodlight.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/largebloodstonebrick.png rename to src/main/resources/assets/bloodmagic/textures/block/bloodlight.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bloodsocket.png b/src/main/resources/assets/bloodmagic/textures/block/bloodsocket.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/bloodsocket.png rename to src/main/resources/assets/bloodmagic/textures/block/bloodsocket.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bloodstonebrick.png b/src/main/resources/assets/bloodmagic/textures/block/bloodstonebrick.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/bloodstonebrick.png rename to src/main/resources/assets/bloodmagic/textures/block/bloodstonebrick.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png b/src/main/resources/assets/bloodmagic/textures/block/bloodtank.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/bloodtank.png rename to src/main/resources/assets/bloodmagic/textures/block/bloodtank.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/chargingrune.png b/src/main/resources/assets/bloodmagic/textures/block/chargingrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/chargingrune.png rename to src/main/resources/assets/bloodmagic/textures/block/chargingrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dislocationrune.png b/src/main/resources/assets/bloodmagic/textures/block/dislocationrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dislocationrune.png rename to src/main/resources/assets/bloodmagic/textures/block/dislocationrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick1_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick1_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick2_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick2_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_brick3_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_brick3_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_eye_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_eye_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_metal_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_metal_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillar_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillar_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarbottom_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarbottom_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarheart_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarheart_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillarspecial_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillarspecial_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_pillartop_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_pillartop_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_polished_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_polished_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_smallbrick_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_smallbrick_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_stone_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_stone_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tile_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tile_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_c.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_c.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_c.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_c.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_d.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_d.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_d.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_s.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_s.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_s.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png b/src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_v.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/dungeon/dungeon_tilespecial_v.png rename to src/main/resources/assets/bloodmagic/textures/block/dungeon/dungeon_tilespecial_v.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/duskritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/duskritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/duskritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/duskritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/earthritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/earthritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/earthritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/earthritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/efficiencyrune.png b/src/main/resources/assets/bloodmagic/textures/block/efficiencyrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/efficiencyrune.png rename to src/main/resources/assets/bloodmagic/textures/block/efficiencyrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/empty.png b/src/main/resources/assets/bloodmagic/textures/block/empty.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/empty.png rename to src/main/resources/assets/bloodmagic/textures/block/empty.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/emptysocket.png b/src/main/resources/assets/bloodmagic/textures/block/emptysocket.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/emptysocket.png rename to src/main/resources/assets/bloodmagic/textures/block/emptysocket.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/etherealopaquemimic.png b/src/main/resources/assets/bloodmagic/textures/block/etherealopaquemimic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/etherealopaquemimic.png rename to src/main/resources/assets/bloodmagic/textures/block/etherealopaquemimic.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/fireritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/fireritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/fireritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/fireritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/imperfectritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/imperfectritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/imperfectritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/imperfectritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/block/largebloodstonebrick.png b/src/main/resources/assets/bloodmagic/textures/block/largebloodstonebrick.png new file mode 100644 index 0000000000000000000000000000000000000000..4935a71f7a3de42d611fa81e58785ed83dae8781 GIT binary patch literal 598 zcmV-c0;&CpP)WFU8GbZ8()Nlj2>E@cM*00Fv5L_t(2&jrCjj$=g- z1ki}ctZ%zVFmn4XFcx`{v-cGq&bWS9 z)%#IQ$035u@8uG|)%>szVF3f4nM>OJmXwzWnD2voPo-dH1ygaM z3y83L6zXo21AaW}vdF;;$iiDPui%V76+zJsHl(%U)4q8C!Lw$N>8a-+Ppj8D0?U}1 zNA&_bwW=#)*;CZX=9G0Zp3+h`L- zgdE^tBGkZzu1L?$e@}~S(xHFOazNnw9urO9z<27#UXAI~!~Fez@5o2@)Q-qM+6bC_ k8Bx;&rwAMXz%LR11Mj3y9<}`@=l}o!07*qoM6N<$f*OSd$^ZZW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png b/src/main/resources/assets/bloodmagic/textures/block/lifeessenceflowing.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png rename to src/main/resources/assets/bloodmagic/textures/block/lifeessenceflowing.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/block/lifeessenceflowing.png.mcmeta similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/lifeessenceflowing.png.mcmeta rename to src/main/resources/assets/bloodmagic/textures/block/lifeessenceflowing.png.mcmeta diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png b/src/main/resources/assets/bloodmagic/textures/block/lifeessencestill.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png rename to src/main/resources/assets/bloodmagic/textures/block/lifeessencestill.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta b/src/main/resources/assets/bloodmagic/textures/block/lifeessencestill.png.mcmeta similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/lifeessencestill.png.mcmeta rename to src/main/resources/assets/bloodmagic/textures/block/lifeessencestill.png.mcmeta diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/lightritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/lightritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/lightritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/lightritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/masterritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/masterritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone_inverted.png b/src/main/resources/assets/bloodmagic/textures/block/masterritualstone_inverted.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/masterritualstone_inverted.png rename to src/main/resources/assets/bloodmagic/textures/block/masterritualstone_inverted.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/obsidianbrickpath.png b/src/main/resources/assets/bloodmagic/textures/block/obsidianbrickpath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/obsidianbrickpath.png rename to src/main/resources/assets/bloodmagic/textures/block/obsidianbrickpath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/obsidiantilepath.png b/src/main/resources/assets/bloodmagic/textures/block/obsidiantilepath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/obsidiantilepath.png rename to src/main/resources/assets/bloodmagic/textures/block/obsidiantilepath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/orbcapacityrune.png b/src/main/resources/assets/bloodmagic/textures/block/orbcapacityrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/orbcapacityrune.png rename to src/main/resources/assets/bloodmagic/textures/block/orbcapacityrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/phantomblock.png b/src/main/resources/assets/bloodmagic/textures/block/phantomblock.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/phantomblock.png rename to src/main/resources/assets/bloodmagic/textures/block/phantomblock.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/ritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/ritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/ritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/ritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/runeofsacrifice.png b/src/main/resources/assets/bloodmagic/textures/block/sacrificerune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/runeofsacrifice.png rename to src/main/resources/assets/bloodmagic/textures/block/sacrificerune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/runeofselfsacrifice.png b/src/main/resources/assets/bloodmagic/textures/block/selfsacrificerune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/runeofselfsacrifice.png rename to src/main/resources/assets/bloodmagic/textures/block/selfsacrificerune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/sentientmimic.png b/src/main/resources/assets/bloodmagic/textures/block/sentientmimic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/sentientmimic.png rename to src/main/resources/assets/bloodmagic/textures/block/sentientmimic.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/shardcluster.png b/src/main/resources/assets/bloodmagic/textures/block/shardcluster.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/shardcluster.png rename to src/main/resources/assets/bloodmagic/textures/block/shardcluster.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/shardclusterbrick.png b/src/main/resources/assets/bloodmagic/textures/block/shardclusterbrick.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/shardclusterbrick.png rename to src/main/resources/assets/bloodmagic/textures/block/shardclusterbrick.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/simpletranscircle.png b/src/main/resources/assets/bloodmagic/textures/block/simpletranscircle.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/simpletranscircle.png rename to src/main/resources/assets/bloodmagic/textures/block/simpletranscircle.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/solidclearmimic.png b/src/main/resources/assets/bloodmagic/textures/block/solidclearmimic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/solidclearmimic.png rename to src/main/resources/assets/bloodmagic/textures/block/solidclearmimic.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/solidlightmimic.png b/src/main/resources/assets/bloodmagic/textures/block/solidlightmimic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/solidlightmimic.png rename to src/main/resources/assets/bloodmagic/textures/block/solidlightmimic.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/solidopaquemimic.png b/src/main/resources/assets/bloodmagic/textures/block/solidopaquemimic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/solidopaquemimic.png rename to src/main/resources/assets/bloodmagic/textures/block/solidopaquemimic.png diff --git a/src/main/resources/assets/bloodmagic/textures/block/soul_forge.png b/src/main/resources/assets/bloodmagic/textures/block/soul_forge.png new file mode 100644 index 0000000000000000000000000000000000000000..1001bb27463956baead83f2e067d2348b998d009 GIT binary patch literal 1502 zcmbVMeQeZZ94;He1SS(PIRQiIz-&mb?e%VJ%MNn%?zWq|ZHyT^C(Da5W(nPZ;T(w)_!xE4UpWBI;U#x;CFgAjt03Re#o}{x; z0oVablehy726!$=QVuGc3?z6SgeOTCi+fowPC2p(!eggRj0^X8y(H-+JfuB=^~t)y z$vjACi>CG%*7Hy-!)kyt6s=TIsuNvM98wHL4=F0lvT(+7Q5KY1Ju_aRdjY$FCawm8 zS5qW-G{ubg0Qn#t$O3jU8|8Rg5Vbq(9LmvV%>yKnMFYyl2LM3E@WTI19cDU(#rxzx zeUo@)He-Bye+taQ{W$`%IXs#Gu8NjLZvze|4M_VCT=*UapVj|45y?we6Ljm*hW>Ouifs!Pb?|i4KJC$!IOl^SGz2h1^?a3N$jIWDc5a21;M_pui- zDt#XJXyKe>`_?7>)1FN0smmC@PRYC=AHE)YGlgpUsCyiFr7U-;V6Ow~XU>N%mlyrM zDLG}{bI0$*qV(HE2SaU*Llw6!_D+oM1bc4cS%;{m*}r7&|LtbqN;AX_Ke5kr3{)R$ zovFXWsvDQ9N6KGquf8zMzR=&Zw!&3pnfADLzO&8VedGAJRVg0WpHal+__xz5K0CN* z@fy}Ld<|~P&G!zsX1E&m_E6E0$k2{cgA1SCaCb5eb+wc~G0T(mVf>Hl^Ax%dELqj? E587xe-v9sr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/soulforge.png b/src/main/resources/assets/bloodmagic/textures/block/soulforge.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/soulforge.png rename to src/main/resources/assets/bloodmagic/textures/block/soulforge.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/spectralblock.png b/src/main/resources/assets/bloodmagic/textures/block/spectralblock.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/spectralblock.png rename to src/main/resources/assets/bloodmagic/textures/block/spectralblock.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/speedrune.png b/src/main/resources/assets/bloodmagic/textures/block/speedrune.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/speedrune.png rename to src/main/resources/assets/bloodmagic/textures/block/speedrune.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/stonebrickpath.png b/src/main/resources/assets/bloodmagic/textures/block/stonebrickpath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/stonebrickpath.png rename to src/main/resources/assets/bloodmagic/textures/block/stonebrickpath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/stonetilepath.png b/src/main/resources/assets/bloodmagic/textures/block/stonetilepath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/stonetilepath.png rename to src/main/resources/assets/bloodmagic/textures/block/stonetilepath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/teleposer_side.png b/src/main/resources/assets/bloodmagic/textures/block/teleposer_side.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/teleposer_side.png rename to src/main/resources/assets/bloodmagic/textures/block/teleposer_side.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/teleposer_top.png b/src/main/resources/assets/bloodmagic/textures/block/teleposer_top.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/teleposer_top.png rename to src/main/resources/assets/bloodmagic/textures/block/teleposer_top.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/waterritualstone.png b/src/main/resources/assets/bloodmagic/textures/block/waterritualstone.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/waterritualstone.png rename to src/main/resources/assets/bloodmagic/textures/block/waterritualstone.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/woodbrickpath.png b/src/main/resources/assets/bloodmagic/textures/block/woodbrickpath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/woodbrickpath.png rename to src/main/resources/assets/bloodmagic/textures/block/woodbrickpath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/woodtilepath.png b/src/main/resources/assets/bloodmagic/textures/block/woodtilepath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/woodtilepath.png rename to src/main/resources/assets/bloodmagic/textures/block/woodtilepath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/wornstonebrickpath.png b/src/main/resources/assets/bloodmagic/textures/block/wornstonebrickpath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/wornstonebrickpath.png rename to src/main/resources/assets/bloodmagic/textures/block/wornstonebrickpath.png diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/wornstonetilepath.png b/src/main/resources/assets/bloodmagic/textures/block/wornstonetilepath.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/blocks/wornstonetilepath.png rename to src/main/resources/assets/bloodmagic/textures/block/wornstonetilepath.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationcrystalawakened.png b/src/main/resources/assets/bloodmagic/textures/item/activationcrystalawakened.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/activationcrystalawakened.png rename to src/main/resources/assets/bloodmagic/textures/item/activationcrystalawakened.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationcrystalcreative.png b/src/main/resources/assets/bloodmagic/textures/item/activationcrystalcreative.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/activationcrystalcreative.png rename to src/main/resources/assets/bloodmagic/textures/item/activationcrystalcreative.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/activationcrystalweak.png b/src/main/resources/assets/bloodmagic/textures/item/activationcrystalweak.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/activationcrystalweak.png rename to src/main/resources/assets/bloodmagic/textures/item/activationcrystalweak.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/airscribetool.png b/src/main/resources/assets/bloodmagic/textures/item/airscribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/airscribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/airscribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/airsigil.png b/src/main/resources/assets/bloodmagic/textures/item/airsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/airsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/airsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/alchemic_liquid.png b/src/main/resources/assets/bloodmagic/textures/item/alchemic_liquid.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/alchemic_liquid.png rename to src/main/resources/assets/bloodmagic/textures/item/alchemic_liquid.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/alchemic_ribbon.png b/src/main/resources/assets/bloodmagic/textures/item/alchemic_ribbon.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/alchemic_ribbon.png rename to src/main/resources/assets/bloodmagic/textures/item/alchemic_ribbon.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/alchemic_vial.png b/src/main/resources/assets/bloodmagic/textures/item/alchemic_vial.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/alchemic_vial.png rename to src/main/resources/assets/bloodmagic/textures/item/alchemic_vial.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/altarmaker.png b/src/main/resources/assets/bloodmagic/textures/item/altarmaker.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/altarmaker.png rename to src/main/resources/assets/bloodmagic/textures/item/altarmaker.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ampouleempty.png b/src/main/resources/assets/bloodmagic/textures/item/ampouleempty.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ampouleempty.png rename to src/main/resources/assets/bloodmagic/textures/item/ampouleempty.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ampoulefull.png b/src/main/resources/assets/bloodmagic/textures/item/ampoulefull.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ampoulefull.png rename to src/main/resources/assets/bloodmagic/textures/item/ampoulefull.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/antiseptic.png b/src/main/resources/assets/bloodmagic/textures/item/antiseptic.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/antiseptic.png rename to src/main/resources/assets/bloodmagic/textures/item/antiseptic.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/apprenticebloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/apprenticebloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/apprenticebloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/apprenticebloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/arcaneashes.png b/src/main/resources/assets/bloodmagic/textures/item/arcaneashes.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/arcaneashes.png rename to src/main/resources/assets/bloodmagic/textures/item/arcaneashes.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/archmagebloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/archmagebloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/archmagebloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/archmagebloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul.png b/src/main/resources/assets/bloodmagic/textures/item/basemonstersoul.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basemonstersoul.png rename to src/main/resources/assets/bloodmagic/textures/item/basemonstersoul.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basemonstersoul_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/basemonstersoul_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/basiccuttingfluid.png b/src/main/resources/assets/bloodmagic/textures/item/basiccuttingfluid.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/basiccuttingfluid.png rename to src/main/resources/assets/bloodmagic/textures/item/basiccuttingfluid.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/blackpudding.png b/src/main/resources/assets/bloodmagic/textures/item/blackpudding.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/blackpudding.png rename to src/main/resources/assets/bloodmagic/textures/item/blackpudding.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/blanksigil.png b/src/main/resources/assets/bloodmagic/textures/item/blanksigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/blanksigil.png rename to src/main/resources/assets/bloodmagic/textures/item/blanksigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/blankslate.png b/src/main/resources/assets/bloodmagic/textures/item/blankslate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/blankslate.png rename to src/main/resources/assets/bloodmagic/textures/item/blankslate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bloodlightsigil.png b/src/main/resources/assets/bloodmagic/textures/item/bloodlightsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bloodlightsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/bloodlightsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bloodpack.png b/src/main/resources/assets/bloodmagic/textures/item/bloodpack.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bloodpack.png rename to src/main/resources/assets/bloodmagic/textures/item/bloodpack.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/bouncesigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bouncesigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/bouncesigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bouncesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/bouncesigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bouncesigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/bouncesigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundaxe_activated.png b/src/main/resources/assets/bloodmagic/textures/item/boundaxe_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/boundaxe_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/boundaxe_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundpickaxe_activated.png b/src/main/resources/assets/bloodmagic/textures/item/boundpickaxe_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/boundpickaxe_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/boundpickaxe_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundshovel_activated.png b/src/main/resources/assets/bloodmagic/textures/item/boundshovel_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/boundshovel_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/boundshovel_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundsword_activated.png b/src/main/resources/assets/bloodmagic/textures/item/boundsword_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/boundsword_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/boundsword_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/boundtool.png b/src/main/resources/assets/bloodmagic/textures/item/boundtool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/boundtool.png rename to src/main/resources/assets/bloodmagic/textures/item/boundtool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/bridgesigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bridgesigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/bridgesigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/bridgesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/bridgesigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/bridgesigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/bridgesigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ceremonialdagger.png b/src/main/resources/assets/bloodmagic/textures/item/ceremonialdagger.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ceremonialdagger.png rename to src/main/resources/assets/bloodmagic/textures/item/ceremonialdagger.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/clawsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/clawsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/clawsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/clawsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/clawsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/clawsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/clawsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/clawsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/coagulant.png b/src/main/resources/assets/bloodmagic/textures/item/coagulant.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/coagulant.png rename to src/main/resources/assets/bloodmagic/textures/item/coagulant.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/coalsand.png b/src/main/resources/assets/bloodmagic/textures/item/coalsand.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/coalsand.png rename to src/main/resources/assets/bloodmagic/textures/item/coalsand.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/componentframeparts.png b/src/main/resources/assets/bloodmagic/textures/item/componentframeparts.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/componentframeparts.png rename to src/main/resources/assets/bloodmagic/textures/item/componentframeparts.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/compressionsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/compressionsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/compressionsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/compressionsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/compressionsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/compressionsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/compressionsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/compressionsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/corrosivecrystal.png b/src/main/resources/assets/bloodmagic/textures/item/corrosivecrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/corrosivecrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/corrosivecrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png b/src/main/resources/assets/bloodmagic/textures/item/crucibleupgrade.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/crucibleupgrade.png rename to src/main/resources/assets/bloodmagic/textures/item/crucibleupgrade.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/daggerofsacrifice.png b/src/main/resources/assets/bloodmagic/textures/item/daggerofsacrifice.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/daggerofsacrifice.png rename to src/main/resources/assets/bloodmagic/textures/item/daggerofsacrifice.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/dawnscribetool.png b/src/main/resources/assets/bloodmagic/textures/item/dawnscribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/dawnscribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/dawnscribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/defaultcrystal.png b/src/main/resources/assets/bloodmagic/textures/item/defaultcrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/defaultcrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/defaultcrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonbloodshard.png b/src/main/resources/assets/bloodmagic/textures/item/demonbloodshard.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/demonbloodshard.png rename to src/main/resources/assets/bloodmagic/textures/item/demonbloodshard.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonicteleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/item/demonicteleposerfocus.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/demonicteleposerfocus.png rename to src/main/resources/assets/bloodmagic/textures/item/demonicteleposerfocus.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonslate.png b/src/main/resources/assets/bloodmagic/textures/item/demonslate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/demonslate.png rename to src/main/resources/assets/bloodmagic/textures/item/demonslate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/demonwillgauge.png b/src/main/resources/assets/bloodmagic/textures/item/demonwillgauge.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/demonwillgauge.png rename to src/main/resources/assets/bloodmagic/textures/item/demonwillgauge.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/destructivecrystal.png b/src/main/resources/assets/bloodmagic/textures/item/destructivecrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/destructivecrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/destructivecrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/divinationsigil.png b/src/main/resources/assets/bloodmagic/textures/item/divinationsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/divinationsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/divinationsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/duskscribetool.png b/src/main/resources/assets/bloodmagic/textures/item/duskscribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/duskscribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/duskscribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/earthscribetool.png b/src/main/resources/assets/bloodmagic/textures/item/earthscribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/earthscribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/earthscribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/elementalsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/elementalsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/elementalsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/elementalsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/elementalsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/elementalsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/elementalsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/elementalsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/enhancedteleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/item/enhancedteleposerfocus.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/enhancedteleposerfocus.png rename to src/main/resources/assets/bloodmagic/textures/item/enhancedteleposerfocus.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/etherealslate.png b/src/main/resources/assets/bloodmagic/textures/item/etherealslate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/etherealslate.png rename to src/main/resources/assets/bloodmagic/textures/item/etherealslate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/experiencebook.png b/src/main/resources/assets/bloodmagic/textures/item/experiencebook.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/experiencebook.png rename to src/main/resources/assets/bloodmagic/textures/item/experiencebook.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/explosivepowder.png b/src/main/resources/assets/bloodmagic/textures/item/explosivepowder.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/explosivepowder.png rename to src/main/resources/assets/bloodmagic/textures/item/explosivepowder.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/firescribetool.png b/src/main/resources/assets/bloodmagic/textures/item/firescribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/firescribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/firescribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/fluidrouterfilterexact.png b/src/main/resources/assets/bloodmagic/textures/item/fluidrouterfilterexact.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/fluidrouterfilterexact.png rename to src/main/resources/assets/bloodmagic/textures/item/fluidrouterfilterexact.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/goldsand.png b/src/main/resources/assets/bloodmagic/textures/item/goldsand.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/goldsand.png rename to src/main/resources/assets/bloodmagic/textures/item/goldsand.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/growthsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/growthsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/growthsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/growthsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/growthsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/growthsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/growthsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/growthsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/harvestgoddesssigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/harvestgoddesssigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/harvestgoddesssigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/harvestgoddesssigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/harvestgoddesssigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/hastesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/hastesigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/hastesigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/hastesigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/hastesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/hastesigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/hastesigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/hastesigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/icarusscroll_activated.png b/src/main/resources/assets/bloodmagic/textures/item/icarusscroll_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/icarusscroll_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/icarusscroll_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/icarusscroll_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/icarusscroll_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/icarusscroll_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/icarusscroll_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/icesigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/icesigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/icesigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/icesigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/icesigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/icesigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/icesigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/icesigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/information.png b/src/main/resources/assets/bloodmagic/textures/item/information.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/information.png rename to src/main/resources/assets/bloodmagic/textures/item/information.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/infusedslate.png b/src/main/resources/assets/bloodmagic/textures/item/infusedslate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/infusedslate.png rename to src/main/resources/assets/bloodmagic/textures/item/infusedslate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/inputroutingfocus.png b/src/main/resources/assets/bloodmagic/textures/item/inputroutingfocus.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/inputroutingfocus.png rename to src/main/resources/assets/bloodmagic/textures/item/inputroutingfocus.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ironsand.png b/src/main/resources/assets/bloodmagic/textures/item/ironsand.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ironsand.png rename to src/main/resources/assets/bloodmagic/textures/item/ironsand.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/item_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/item_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/item_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/item_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterexact.png b/src/main/resources/assets/bloodmagic/textures/item/itemrouterfilterexact.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterexact.png rename to src/main/resources/assets/bloodmagic/textures/item/itemrouterfilterexact.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterignorenbt.png b/src/main/resources/assets/bloodmagic/textures/item/itemrouterfilterignorenbt.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/itemrouterfilterignorenbt.png rename to src/main/resources/assets/bloodmagic/textures/item/itemrouterfilterignorenbt.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/itemrouterfiltermoditems.png b/src/main/resources/assets/bloodmagic/textures/item/itemrouterfiltermoditems.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/itemrouterfiltermoditems.png rename to src/main/resources/assets/bloodmagic/textures/item/itemrouterfiltermoditems.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/itemrouterfilteroredict.png b/src/main/resources/assets/bloodmagic/textures/item/itemrouterfilteroredict.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/itemrouterfilteroredict.png rename to src/main/resources/assets/bloodmagic/textures/item/itemrouterfilteroredict.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/lavacrystal.png b/src/main/resources/assets/bloodmagic/textures/item/lavacrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/lavacrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/lavacrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/lavasigil.png b/src/main/resources/assets/bloodmagic/textures/item/lavasigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/lavasigil.png rename to src/main/resources/assets/bloodmagic/textures/item/lavasigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/lifebucket.png b/src/main/resources/assets/bloodmagic/textures/item/lifebucket.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/lifebucket.png rename to src/main/resources/assets/bloodmagic/textures/item/lifebucket.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/livingboots.png b/src/main/resources/assets/bloodmagic/textures/item/livingboots.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/livingboots.png rename to src/main/resources/assets/bloodmagic/textures/item/livingboots.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/livinghelmet.png b/src/main/resources/assets/bloodmagic/textures/item/livinghelmet.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/livinghelmet.png rename to src/main/resources/assets/bloodmagic/textures/item/livinghelmet.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/livingleggings.png b/src/main/resources/assets/bloodmagic/textures/item/livingleggings.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/livingleggings.png rename to src/main/resources/assets/bloodmagic/textures/item/livingleggings.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/livingplate.png b/src/main/resources/assets/bloodmagic/textures/item/livingplate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/livingplate.png rename to src/main/resources/assets/bloodmagic/textures/item/livingplate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/magicianbloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/magicianbloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/magicianbloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/magicianbloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/mailorder.png b/src/main/resources/assets/bloodmagic/textures/item/mailorder.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/mailorder.png rename to src/main/resources/assets/bloodmagic/textures/item/mailorder.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/masterbloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/masterbloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/masterbloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/masterbloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/miningsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/miningsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/miningsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/miningsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/miningsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/miningsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/miningsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/miningsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/mundanelengtheningcatalyst.png b/src/main/resources/assets/bloodmagic/textures/item/mundanelengtheningcatalyst.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/mundanelengtheningcatalyst.png rename to src/main/resources/assets/bloodmagic/textures/item/mundanelengtheningcatalyst.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/mundanepowercatalyst.png b/src/main/resources/assets/bloodmagic/textures/item/mundanepowercatalyst.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/mundanepowercatalyst.png rename to src/main/resources/assets/bloodmagic/textures/item/mundanepowercatalyst.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/neurotoxin.png b/src/main/resources/assets/bloodmagic/textures/item/neurotoxin.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/neurotoxin.png rename to src/main/resources/assets/bloodmagic/textures/item/neurotoxin.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/noderouter.png b/src/main/resources/assets/bloodmagic/textures/item/noderouter.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/noderouter.png rename to src/main/resources/assets/bloodmagic/textures/item/noderouter.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/plantfibres.png b/src/main/resources/assets/bloodmagic/textures/item/plantfibres.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/plantfibres.png rename to src/main/resources/assets/bloodmagic/textures/item/plantfibres.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/plantoil.png b/src/main/resources/assets/bloodmagic/textures/item/plantoil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/plantoil.png rename to src/main/resources/assets/bloodmagic/textures/item/plantoil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/potionflask_outline.png b/src/main/resources/assets/bloodmagic/textures/item/potionflask_outline.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/potionflask_outline.png rename to src/main/resources/assets/bloodmagic/textures/item/potionflask_outline.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/potionflask_overlay.png b/src/main/resources/assets/bloodmagic/textures/item/potionflask_overlay.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/potionflask_overlay.png rename to src/main/resources/assets/bloodmagic/textures/item/potionflask_overlay.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/potionflask_underlay.png b/src/main/resources/assets/bloodmagic/textures/item/potionflask_underlay.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/potionflask_underlay.png rename to src/main/resources/assets/bloodmagic/textures/item/potionflask_underlay.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentaffinity.png b/src/main/resources/assets/bloodmagic/textures/item/reagentaffinity.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentaffinity.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentaffinity.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentair.png b/src/main/resources/assets/bloodmagic/textures/item/reagentair.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentair.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentair.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbinding.png b/src/main/resources/assets/bloodmagic/textures/item/reagentbinding.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentbinding.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentbinding.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbloodlight.png b/src/main/resources/assets/bloodmagic/textures/item/reagentbloodlight.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentbloodlight.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentbloodlight.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbounce.png b/src/main/resources/assets/bloodmagic/textures/item/reagentbounce.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentbounce.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentbounce.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentbridge.png b/src/main/resources/assets/bloodmagic/textures/item/reagentbridge.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentbridge.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentbridge.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentclaw.png b/src/main/resources/assets/bloodmagic/textures/item/reagentclaw.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentclaw.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentclaw.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentcompression.png b/src/main/resources/assets/bloodmagic/textures/item/reagentcompression.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentcompression.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentcompression.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentfastminer.png b/src/main/resources/assets/bloodmagic/textures/item/reagentfastminer.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentfastminer.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentfastminer.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentfrost.png b/src/main/resources/assets/bloodmagic/textures/item/reagentfrost.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentfrost.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentfrost.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentgrowth.png b/src/main/resources/assets/bloodmagic/textures/item/reagentgrowth.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentgrowth.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentgrowth.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagenthaste.png b/src/main/resources/assets/bloodmagic/textures/item/reagenthaste.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagenthaste.png rename to src/main/resources/assets/bloodmagic/textures/item/reagenthaste.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentholding.png b/src/main/resources/assets/bloodmagic/textures/item/reagentholding.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentholding.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentholding.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentlava.png b/src/main/resources/assets/bloodmagic/textures/item/reagentlava.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentlava.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentlava.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentmagnetism.png b/src/main/resources/assets/bloodmagic/textures/item/reagentmagnetism.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentmagnetism.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentmagnetism.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentseverance.png b/src/main/resources/assets/bloodmagic/textures/item/reagentseverance.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentseverance.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentseverance.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentsight.png b/src/main/resources/assets/bloodmagic/textures/item/reagentsight.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentsight.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentsight.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentsuppression.png b/src/main/resources/assets/bloodmagic/textures/item/reagentsuppression.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentsuppression.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentsuppression.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentteleposition.png b/src/main/resources/assets/bloodmagic/textures/item/reagentteleposition.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentteleposition.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentteleposition.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagenttransposition.png b/src/main/resources/assets/bloodmagic/textures/item/reagenttransposition.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagenttransposition.png rename to src/main/resources/assets/bloodmagic/textures/item/reagenttransposition.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentvoid.png b/src/main/resources/assets/bloodmagic/textures/item/reagentvoid.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentvoid.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentvoid.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentwater.png b/src/main/resources/assets/bloodmagic/textures/item/reagentwater.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentwater.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentwater.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reagentwind.png b/src/main/resources/assets/bloodmagic/textures/item/reagentwind.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reagentwind.png rename to src/main/resources/assets/bloodmagic/textures/item/reagentwind.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reinforcedslate.png b/src/main/resources/assets/bloodmagic/textures/item/reinforcedslate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reinforcedslate.png rename to src/main/resources/assets/bloodmagic/textures/item/reinforcedslate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/reinforcedteleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/item/reinforcedteleposerfocus.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/reinforcedteleposerfocus.png rename to src/main/resources/assets/bloodmagic/textures/item/reinforcedteleposerfocus.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png b/src/main/resources/assets/bloodmagic/textures/item/ritual_dismantler.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ritual_dismantler.png rename to src/main/resources/assets/bloodmagic/textures/item/ritual_dismantler.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ritualdiviner.png b/src/main/resources/assets/bloodmagic/textures/item/ritualdiviner.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ritualdiviner.png rename to src/main/resources/assets/bloodmagic/textures/item/ritualdiviner.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/ritualtinkerer.png b/src/main/resources/assets/bloodmagic/textures/item/ritualtinkerer.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/ritualtinkerer.png rename to src/main/resources/assets/bloodmagic/textures/item/ritualtinkerer.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sacrificeplate.png b/src/main/resources/assets/bloodmagic/textures/item/sacrificeplate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sacrificeplate.png rename to src/main/resources/assets/bloodmagic/textures/item/sacrificeplate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sacrificialdagger.png b/src/main/resources/assets/bloodmagic/textures/item/sacrificialdagger.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sacrificialdagger.png rename to src/main/resources/assets/bloodmagic/textures/item/sacrificialdagger.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/saltpeter.png b/src/main/resources/assets/bloodmagic/textures/item/saltpeter.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/saltpeter.png rename to src/main/resources/assets/bloodmagic/textures/item/saltpeter.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sanguinebook.png b/src/main/resources/assets/bloodmagic/textures/item/sanguinebook.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sanguinebook.png rename to src/main/resources/assets/bloodmagic/textures/item/sanguinebook.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/seersigil.png b/src/main/resources/assets/bloodmagic/textures/item/seersigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/seersigil.png rename to src/main/resources/assets/bloodmagic/textures/item/seersigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/selfsacrificeplate.png b/src/main/resources/assets/bloodmagic/textures/item/selfsacrificeplate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/selfsacrificeplate.png rename to src/main/resources/assets/bloodmagic/textures/item/selfsacrificeplate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_corrosive_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_corrosive_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_corrosive_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_corrosive_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_corrosive_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_destructive_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_destructive_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_destructive_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_destructive_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_destructive_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_steadfast_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_steadfast_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_steadfast_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_steadfast_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_steadfast_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_vengeful_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_vengeful_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_vengeful_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarmourgem_vengeful_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarmourgem_vengeful_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientarrow.png b/src/main/resources/assets/bloodmagic/textures/item/sentientarrow.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientarrow.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientarrow.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots.png b/src/main/resources/assets/bloodmagic/textures/item/sentientboots.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientboots.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientboots.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientboots_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientboots_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientboots_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientboots_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientboots_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientboots_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/sentientboots_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientboots_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientboots_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientboots_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/sentientboots_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientboots_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientboots_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_0.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_0.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_0.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_1.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_1.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_2.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_corrosive_pulling_2.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_corrosive_pulling_2.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_0.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_0.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_0.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_1.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_1.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_2.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_destructive_pulling_2.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_destructive_pulling_2.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_0.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_0.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_0.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_1.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_1.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_2.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_pulling_2.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_pulling_2.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_0.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_0.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_0.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_1.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_1.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_2.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_steadfast_pulling_2.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_steadfast_pulling_2.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_0.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_0.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_0.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_0.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_1.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_1.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_1.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_1.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_2.png b/src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_2.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientbow_vengeful_pulling_2.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientbow_vengeful_pulling_2.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet.png b/src/main/resources/assets/bloodmagic/textures/item/sentienthelmet.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentienthelmet.png rename to src/main/resources/assets/bloodmagic/textures/item/sentienthelmet.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentienthelmet_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/sentienthelmet_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings.png b/src/main/resources/assets/bloodmagic/textures/item/sentientleggings.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientleggings.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientleggings.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientleggings_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientleggings_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientleggings_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientleggings_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientleggings_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientleggings_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/sentientleggings_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientleggings_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientleggings_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientleggings_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/sentientleggings_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientleggings_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientleggings_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate.png b/src/main/resources/assets/bloodmagic/textures/item/sentientplate.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientplate.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientplate.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientplate_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientplate_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientplate_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/sentientplate_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientplate_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientplate_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/sentientplate_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientplate_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientplate_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sentientplate_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/sentientplate_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sentientplate_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/sentientplate_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/set_area.png b/src/main/resources/assets/bloodmagic/textures/item/set_area.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/set_area.png rename to src/main/resources/assets/bloodmagic/textures/item/set_area.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/set_will_types.png b/src/main/resources/assets/bloodmagic/textures/item/set_will_types.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/set_will_types.png rename to src/main/resources/assets/bloodmagic/textures/item/set_will_types.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sheatheditem.png b/src/main/resources/assets/bloodmagic/textures/item/sheatheditem.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sheatheditem.png rename to src/main/resources/assets/bloodmagic/textures/item/sheatheditem.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofholding.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofholding.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofholding.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofholding.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofmagnetism_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofmagnetism_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofmagnetism_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofmagnetism_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofmagnetism_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofseverance_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofseverance_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofseverance_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofseverance_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofseverance_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_activated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofsuppression_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofsuppression_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/sigilofsuppression_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigilofsuppression_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/sigilofsuppression_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sigiloverlay.png b/src/main/resources/assets/bloodmagic/textures/item/sigiloverlay.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sigiloverlay.png rename to src/main/resources/assets/bloodmagic/textures/item/sigiloverlay.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe.png b/src/main/resources/assets/bloodmagic/textures/item/soulaxe.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulaxe.png rename to src/main/resources/assets/bloodmagic/textures/item/soulaxe.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulaxe_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulaxe_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulaxe_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulaxe_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulaxe_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulaxe_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulaxe_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulaxe_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulaxe_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulaxe_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulaxe_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulaxe_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulaxe_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemcommon.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemcommon.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemcommon.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemcommon_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemcommon_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgrand.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgrand.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgrand.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgrand_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgrand_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgreater.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgreater.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgreater.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemgreater_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemgreater_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemlesser.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemlesser.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemlesser.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgemlesser_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgemlesser_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty.png b/src/main/resources/assets/bloodmagic/textures/item/soulgempetty.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgempetty.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgempetty.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgempetty_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgempetty_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgempetty_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulgempetty_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgempetty_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgempetty_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulgempetty_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgempetty_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgempetty_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulgempetty_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulgempetty_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulgempetty_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulgempetty_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe.png b/src/main/resources/assets/bloodmagic/textures/item/soulpickaxe.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulpickaxe.png rename to src/main/resources/assets/bloodmagic/textures/item/soulpickaxe.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulpickaxe_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulpickaxe_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel.png b/src/main/resources/assets/bloodmagic/textures/item/soulshovel.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulshovel.png rename to src/main/resources/assets/bloodmagic/textures/item/soulshovel.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulshovel_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulshovel_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulshovel_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulshovel_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulshovel_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulshovel_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulshovel_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulshovel_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulshovel_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulshovel_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulshovel_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulshovel_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulshovel_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare.png b/src/main/resources/assets/bloodmagic/textures/item/soulsnare.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsnare.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsnare.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_corrosive.png b/src/main/resources/assets/bloodmagic/textures/item/soulsnare_corrosive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsnare_corrosive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsnare_corrosive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_destructive.png b/src/main/resources/assets/bloodmagic/textures/item/soulsnare_destructive.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsnare_destructive.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsnare_destructive.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_steadfast.png b/src/main/resources/assets/bloodmagic/textures/item/soulsnare_steadfast.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsnare_steadfast.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsnare_steadfast.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsnare_vengeful.png b/src/main/resources/assets/bloodmagic/textures/item/soulsnare_vengeful.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsnare_vengeful.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsnare_vengeful.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_activated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_activated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_corrosive_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_corrosive_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_corrosive_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_corrosive_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_corrosive_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_activated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_destructive_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_destructive_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_destructive_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_destructive_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_destructive_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_activated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_steadfast_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_steadfast_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_steadfast_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_steadfast_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_steadfast_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_activated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_vengeful_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_vengeful_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/soulsword_vengeful_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/soulsword_vengeful_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/soulsword_vengeful_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/steadfastcrystal.png b/src/main/resources/assets/bloodmagic/textures/item/steadfastcrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/steadfastcrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/steadfastcrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/sulfur.png b/src/main/resources/assets/bloodmagic/textures/item/sulfur.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/sulfur.png rename to src/main/resources/assets/bloodmagic/textures/item/sulfur.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/teleposerfocus.png b/src/main/resources/assets/bloodmagic/textures/item/teleposerfocus.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/teleposerfocus.png rename to src/main/resources/assets/bloodmagic/textures/item/teleposerfocus.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/telepositionsigil.png b/src/main/resources/assets/bloodmagic/textures/item/telepositionsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/telepositionsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/telepositionsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/transcendentbloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/transcendentbloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/transcendentbloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/transcendentbloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/transpositionsigil.png b/src/main/resources/assets/bloodmagic/textures/item/transpositionsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/transpositionsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/transpositionsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/upgradetome.png b/src/main/resources/assets/bloodmagic/textures/item/upgradetome.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/upgradetome.png rename to src/main/resources/assets/bloodmagic/textures/item/upgradetome.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/upgradetrainer.png b/src/main/resources/assets/bloodmagic/textures/item/upgradetrainer.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/upgradetrainer.png rename to src/main/resources/assets/bloodmagic/textures/item/upgradetrainer.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/vengefulcrystal.png b/src/main/resources/assets/bloodmagic/textures/item/vengefulcrystal.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/vengefulcrystal.png rename to src/main/resources/assets/bloodmagic/textures/item/vengefulcrystal.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/voidsigil.png b/src/main/resources/assets/bloodmagic/textures/item/voidsigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/voidsigil.png rename to src/main/resources/assets/bloodmagic/textures/item/voidsigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/warriorsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/warriorsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/warriorsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/warriorsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/warriorsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/warriorsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/warriorsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/waterscribetool.png b/src/main/resources/assets/bloodmagic/textures/item/waterscribetool.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/waterscribetool.png rename to src/main/resources/assets/bloodmagic/textures/item/waterscribetool.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/watersigil.png b/src/main/resources/assets/bloodmagic/textures/item/watersigil.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/watersigil.png rename to src/main/resources/assets/bloodmagic/textures/item/watersigil.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/weakbloodorb.png b/src/main/resources/assets/bloodmagic/textures/item/weakbloodorb.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/weakbloodorb.png rename to src/main/resources/assets/bloodmagic/textures/item/weakbloodorb.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/weakbloodshard.png b/src/main/resources/assets/bloodmagic/textures/item/weakbloodshard.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/weakbloodshard.png rename to src/main/resources/assets/bloodmagic/textures/item/weakbloodshard.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/windsigil_activated.png b/src/main/resources/assets/bloodmagic/textures/item/windsigil_activated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/windsigil_activated.png rename to src/main/resources/assets/bloodmagic/textures/item/windsigil_activated.png diff --git a/src/main/resources/assets/bloodmagic/textures/items/windsigil_deactivated.png b/src/main/resources/assets/bloodmagic/textures/item/windsigil_deactivated.png similarity index 100% rename from src/main/resources/assets/bloodmagic/textures/items/windsigil_deactivated.png rename to src/main/resources/assets/bloodmagic/textures/item/windsigil_deactivated.png diff --git a/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/basearray.png b/src/main/resources/assets/bloodmagic/textures/models/alchemyarrays/basearray.png index cacd90470cd7d605931c0b2a6e6ecd15f0049286..1d3709bead01e5b15cf54428d95ddb7c6e5054ca 100644 GIT binary patch literal 35529 zcmV(#K;*xPP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3^wlH|D6W&d*(-x3Ib7`Pk^q*?Evm*3~WJ+iV& zRg$c`m8yuyNOw92yy4zA@p%6C|9X%A`Jev@`K;%0<=VmMS&N_XE?}bwQuIT#weSTL|?pFVFYioW#`TG8<{qf(GYAm^g zdhzv&XRYPt=N8YavY*R^rux~MYdm;i zNSVK6{>iW9v;7<;OW?xy=fdyzR^80s_vZIg``iEhH@Ec_lPw0vZ}JiTPCkD9^cV4{ z{rmg$`TZXkD!;z}=~#b$kNE!i_vzQi#6PX5{qf21_Z8)q?myl0Z>RdctG(~DUwmBs zD%^AV-qg>n?4NkyaJTl`3V$m9Wqz*v&&{89_H%O5>o_MGHTcUNB4_!AE3DAN8=n1r zhRG7I_{7Th7-vlTca5{S<4m6U<)0(Gv8Fq%)Hwc$tR#LNf2}3#&%O7@&Crnh6?kO~ zTr4P8KYxzj|MLIx=U*=LzUoW}XZy8RtSc(fEW?xYE3e`}!u#D*PW0GY9DZ%|@Bi~) z6DOGWHaBjtpW}0hk;5Odl{{y)KlA50KROob`d)x7;8fY0VVHSE{M96!ItdU6nGW2zj@ojQkgT^aGIS38iQ zo>RVZ&L!8}@|}B0MGY&Z7R_+4sa`eLQfqDXuDzvpwcJXpt+l)LJKpKQOy?VYyxV=> zz4M`+D|g=Ac}4Fdjx?^3M;UdragRO`pLxwZ%dE4_d-fGqIu?q&%Briad-W$gh|+UC z`6*9*+H*hsMbzH(UT=QOTi^EHZ~t{_-&6hbsr~ij{{5+i@2SOoQ0d@H{dH>my4Igd z1kFkI%s8=l1x~zr0tj^U%+40BD|&JRtvT>JXhn{!GJ7~Hcw(I3^@Nz;@aydUIJv() zx8rL6SLYW0dUA(H_y6PM4v+3HC-<-C_BW@tbOv*u*w(^hZ|a#)KVI;(9$VLq{`2=S z?)Pl(bOZC-#soc}O2^GQ__R91J4#;fY<&()SC8*vMd!=WO>T(GJfZi(EvC`OJG%Fp zM!7pnkJmBTvmP*k&zhySle3s-e|vmZdcyhg8;lye_4I&;T>0juSAOsDuE^nrt4vPq zIYQ(($2}h|&L^-Z^NEPY^R{O_0pVSl?PX=0Pi<5Ct53P|$gF`6kK08Y_q?B{d#Sf$ z)o)IZ4a@JWwRet@1MX!-9B!$To4#{NYw-R%&j-tXzqO7xwWB|?UeCMk{^oX9JuE;T_t;i$D-GUPCn8Ydi0y>HdSMZ}HwU)Wg0piWHEg-YSNQFx9K!D@Wa`Cg0j zt%$|*;*MHc-U9j>UR3(U=3I3=q2zuex$!NtJXgmYT@~d;PeOJw3l7~6YfUip-_^)yp& zxv;J|F1FPp3=2D#7pLXM&a>wJo)c|hS?gkPWw41{CiR1Bw8*Dr1Z%C)T1K3?@5Qm# zH{G*_w=e$Q2l`mwu%25}m3q9#XeEXFO>sU)&UdOc+=yKoNH&ifz+4L@Djs92gD_qgVLR!q~=*P9VTj5JbvvNLEkP&GWfx$!T$3E3$0F3n2%Pt#UuBV-OMwb`4xM_fy_i zhz_0_p>tZ?OyjN3g;`msd8wUS@U*bkjXSOrJvnc_RfHnMHIM5p*y71urC1-8fwSzG z=^CH$R%Kw~vBIM|mVY+G$G^4D`#a_ldEKV+LcH)I1>@Xsw$Bw);j{UWbc`4p<`D%$ zX7BXOGq9=sy$~=&2+o16U`Y$Rmca`cp9=72j~aTzzo6XreZB|oy1Etkz%|CR*qrpF z`rO?7J5uVJZH(?(ZC<^g6*$CG;Dxv^BqVVqcH+PSJc!J578O^2r=5P24*R~Udh6~6 zgyez)_EbmD=j6Zvw!q^zE$qPa9M9Dd$jtUP&bBmU2qb`H*KPJ$UtE~fR}d4h5^oxq z<~2Ewip%5--*{mtQ4vL~Bcguh!)Xm%V137mb3U2nWA(es=YunR3|h;p-h$ZDTIOj!iRx(4-^L(1j}Fv5FGEHcR!#wvsW8)3aJ?NM0lhW74d z7r623MUbz(>J#@i3f2r0@oUjh;dt-s`7S!vyUfE?4_AH0G*$+KO_%#(z%JAju!o^9 zNXAu=+_x_7J3vFh#0ahE4CjM@AV)p0&rS8XU$6oUx8UBxBi^V(i}Zpv*%`j4_}!Uw zvol;fKJFl(_`ruZ;S-!{;#^SBT)EnLV~BC01wSl{!MvR5K||trfTJ8)s}lr(Vum_! zz6T$Xap4Ou2(043hh_vLI^s4w6U9RpP~XW-AXqq798F$N+PLHis5#K+0PS59nd}u>!!9oVl zahxEyI&wbyWQ}Rgr4Q6CKM$yf^L;s^JVgMSLeMb><1T6nuW{qo#)vaM`N9@rUmE}6 ztl8kQ6i&PfAQx|fb)B^joa-9_e#j+SgGD(f-Ud{ACVj$NAcMS}9l=1Q7xedaB_QP# zbR}=pm0TEWcpuOYcaGv!Y_Tlp1Ri6)5VeODExe&1ECJ%c%-D2npA@D8tD#9)qzM!U z&th6|VE_bPwvV6#MnQ6W{jh@IX@vjqJ@wQUCLWvw5aI-}068D>$PqACTx$qekbE{L zBLDym2q~(NxldS7Y?!_iHwoC_v#(sb5ai;}Yd0(!&W_^2q6uyEzz-@EA!bb|J zFmNDMF*+L0seytT<`M@4vl<&ZO_|(+5BD2wb*%w^50&8bkr9Y*;(}}g?&%f%&dQ1~ zB>`xI8sJtiRoDo$1`R(E zTls!_-jPAo&&upCHs``>@eeCO#_qs{;0DLQfJCk{rJyjw!I8Y7;BT=07=;L5#(UHP z#%b`Af-Ay@zH(KFCWs7#4m`xK-GWT^3ABpr&jfHS$Ub`tt;Q%zsvk7II~RW?nc~S<{)$lF?}t2J3Kc z#{$>p%y&5A#l*10)cT-nm>xMP@duaDmu7MOh{S@x2aL zj_2n95@38icxha3q(Zl91NsLjcZWux3*$b8M`;D5NtgBFu+RuhGe9-6Nu21x zVFGGU)yTc0QJ9ZrK4g0LPs0`rZNSXKP+|jX!y#U5c^6~j!Qh3+$v6Np4-icthgr}o z;TRCi8>|LR@frpv5zA*K1aH6x1Cj>WeI}+Iv-C#9=eU6gt`)jUT@N+ZXC?ZU>=Gm|FJ`gn!-c!#3Q*FQ=Xggx^iNj!MW7U%inT$+Sqd%xNj1z|^ z=8XxFMMw^#Jlk4LQ+g*Lge$}hI`%f(#qRFC0c)PfM=tn@H{g5EQ7-IW)v9u?2N$W| zYhcPcRQ5rDagjHq7Fvt9<6ej7WfB}W|*rO;jEL>)6eIAl-po2=2>0|>j z0#kqz8vJ_PzPzC!GIQx&`oT{20)H7z|2EEu0RfWs3(4Br9aL-3PARYn95|8*EPe2) zDXxiCLpZtTV*vwhGy#ps1~+gTDkUljV8d@=MIJB%x*H%M!C)vV5FgBgsa?K2+*4a1 zw$;>4ph^83mApkrtOKjwOfd9I*NjSl76SemS-?tTVvhF`21rubQLW96iLnMGcU%${ z+{xV`?JHxOlSLC)a1Og;+%POqOw9Imbg%_>7JP-bN{GuPSAzj#o(;NP5IQh{*$T0y*HXuNe(e1X;Bq2b8{ zjrWBn0kl@Ex#^?A$kyPRPIlx$_dal?t3CM1ai9Q5wwQ;N z@rrQbHtSiCKtRDPTAX?Y#hF_$M9lSB%*iE}C>&b~BJ4*8+a?SdZY%?LQw-pa46KVB zaTI>zZ!dHa{{|~HTv=vRk1hkZ@$H*%jH8YYN>1Bl;|DrC3*L%Q!)q{rFW`P+COJv= z22vDJDI6_`Bc~HSj4DCi>o|fgH;wOFk>rVNJojs^=wk{`5kChb`iDTv*Brpxuy9Q?lMS=ft*G6bj*|%`}XkP_HuqQ5x>lULC-rs}C=E$c> z>~R7jJDz(aQ#VM-3a%YXbQy5O)?{plyi3{ct&)-lDTEPoj(W$igvn^y4aYQJq6*yaW1@nK=aQjC-CV+Hi1FM=XRHtO zlaq#$ilKLtg$prjBZF~H*^f`I_7Q_Fue|Py(s4U znyI>tgrb@+yK%=Sf__X|UDRl! z2k8~k9iUa9HSkbA3v4!j0Hb_XR0}RZ%8A0EDlhgX;oneTKG4AL2Ck1-6CFC>UqVeR z3?L~2dU0?sWI?YXRa{%J++zqAlcCbmZ-fJ0 zfbYY7`s3NI)E|kjggT!c$RZ~@P@+^(z@f3g6$5$Gvi4?3J~vNj)(@CoN*g%fPb zFooaro_4?!-_&JC_j<#G$hIrPCRr-fi|b)%-q_H;yG1qS75csnE^-E}QOi4enlafw zRPMiFa_ur6hAGR2>e=COUH7Q?#ut;wjwTrc%5-DKQ@Io8J9a1sApN7_1S%t6F*#hX5u>q%eBLib5PLTorxJ@{a}Hxee7mdEp&qKLANZ&j+sE zWfoD#^S~FvScu=|pa`>i7?+iT8Y;AWVZTjq7s(Hzedt6@ktGv&CRiY5HGk0BFd_*D z5cEVNeUK^^$O>9ZqC|-N?CIWgolnObK%LXln$PmJ;Sr0g4cBYkX0*pN5Nip9HeBf0 zETVZqV3uheEV{S@?DhJ|dvfux?*|!p00hlgHZnRu2a8SL1mxvFIxhH{c>k7;$gP#a zS3JJ?Yg2aCn6QmtZnke?Wm1Y6BaJYJ>uP50#hn-IXY;_XOb>7^%Bs4;t)@4!wcLW0i)q)wp_xRpt<6TUkNsA%ff@~Xft_{F@ zEkk})NVzSMMHQH1Ltps2&<;5fD?ne+4)JyCZHG<_W12Es+qVp@@te!dyU&Fyf0N;* zJI|1z*|6+nh^jo-x#7K$Cd0MwR3zd42q1Tj1K-o|}s@39cZ5OF76{;7q=9we-B6eYj4 z3|+CD&D7j|&u*=(B`eK1bVuzEJY_X9o8H%0*Zaz|-VJr2DVP%WhTTGQqP!Tr8Rg`V zjWewd1G#$93am7eb4>c;KU_ zd?Voo8r?14eoc$h8Y|;>z{?wb0Y2>eei7Vi78wwsorVtL{vZt)(B~|2v$jrGft$QM zSL>J&X_Xra-@(9B4IXC!ieQC~7}yhN6C82h*dKe3FWkG2IoSIzKw1{K2w2gmZ5>&cBi-VocU7Q)N3NSRpDlIR<Y9fXZs$>6Pxk7E)qiN7!QHm)H9ucBO0lzm)(OIm z+rU@_Z3yro0xK;MgUVFPSZbEG9T>Es&rFuzbleH#UH^v=VO%eE8Bl{8!kfEn%%DVX zC#3%P{xlHV4UWShHk=E70jFSO?!>0St{{65ZxgA8OUxAlzAYRwV+4yS9Gcz;dT>Nl zY~UHt&g-t2N)7XM&jgq@n90sb@Nk!wTX0kZ9!v}3aFT{EKlv+RU7em}9*P~GW^^%1-<&D}I4!G0pAJ4RY%cZe z-~@z=7nKhFUq)uI*{DduRc?z9z$=(&z!nHM=jYw1huNM%5t7bbY@Ov0sO%* z$#h}&Kx6KYA%>|-tsQZ)RHAI-a%zRsZ8D^mU6Wb?hR0=WuCHwM&PG_4S^luTpz9mh z73c_(WBCjw;kL?x_Vq9WTAW@#z^b-EXipwmWmmlpC@(a*+@9JZ1X4qJFo~@kV z9W=vGgTDD$^T@D%EJebZn1zaW1}%UZ;%CR;4f;Jx<2ZacHIxgw*Dp2_ws5X~S9Uk0 z1JHtwV(TDs`2}ZGAS{?iT#5gkCWJLhk8s_ZpxZQk0j$6<#7Yt?;NDRq+xVIUzaNll z`xJtL9O0iQ5Y3dxJ1ni^u(qQO_+yw1Z?gCSZ?d=kcp_vQj0iQEmNVh`L%*yU!}~x^ z%6yU8X)FWRY`{7Jw{g_S5=Xt;NFELqfwZi&q5TN6g^ufnoHf|$O7#I51O8;R!fyjFq$PpywBG|l}53c=Y>!Jw?O0pBE!wy zFKkhMAh^c1X&>1~3>m2Vy$)pDni>d?!8;I}@3T4-)4xsz(klk#2FVau;{* z>N0}2kjpz527wz`C66M@Rz|}JaGY>ssObIv$G8lqEysZ;VnZwd4|YI2J6XYTSU(vK zcK+U>t8PGU8tfR@892lB3HrLaV6ZoTj3+_~V6MpSkJ;xr(N z0SiVWdkrC4_HbM2m@pxHLdOtmg6hFdG~$DAKrLdi*`YXp(B8GZ>^d-z`$aA&`H!HY6*WJ z4MaK|yMo&EAeKED0n$#v>P%Pf4ucu2dN7YMywM^2>KPrpx`6{o@Cnm;54;q#HCTu~ zjT`RJBHLv7`r9m%O@{t1b3ThBvW8!F@)*$o`-f(Y!ucLZ1WIe_veg{CVTf$Rd#AZ% zHgRJB+k4WMcd@)pICU3?!-TRWCm=RliMRmwu?9F7i2Pc!2h#E_=1B1eX1lPta8Ijx zE&0yB#WbOd^*Lau4c};)ff^o=7ERLdoDEEdZ_Q4OXW=u`%`PA=)s~ZFoF9yG;yVtN z@0~l{fQuQ{!-sR+EuL6>#5+x>2d2fs^mpKcb|AcO3S^MEtb)UvuMsV*nP0Gf?A(Q| z5AZpg?qD#}WECu|+F6l=oln&!EGRHYr4AIK87jkL{MwGwb(kdwD*Qk=q)q822r+v{N_v$Xw2{ z-DDU=ldhYz3hj6d#C2oE-qi|Lpci@uyw!CZsd;qHPy;i$Ti&?#;*6fhw{Zsmwxkc-P&tj4p{Ko znw_ITD7vM%C%4AFEF&*CMNA`J2|w8_Kx}N>2^$ymBIm#syK+GPtJQC(&+etP)2DDD z1U99xW6;5P2m}n}dT}ZnAvH4)70=(TXe^U9M&yA$k$)pJ3ZJHQ&YF!SXG1=j=FjgEbwm1QJ9$ zuNN#7-Z7fi`nWZ-U=a8UG6+n!L=X%I;^r4Nv7y}RveY2=?5A4{{s>~u58E;Ca>W18 z8~Dw}Bml!@$mU+QeOQ2;6K(*na|uE~Y;oXY55$(ZX4^Ex?Hf=Q%76j%yi$OWk69gzi|oP+jYJ z@91#^%klGL-@er(7CE4OxZY+e`L^)a`r`NkI^k&zUlBM=5F7V&<||&@#JT&7o&odQ zVi1)-SO|Lt90}Eyr;g=`VmTi`y!FoquK}rb9RP-a-7;Tx8Py5g066gOc%L`z zg|KUAnTOMh+<>W0 zUSK6eVn=iWcvtKBH=7i=7{9p+yLAhuA~UPG6b+Tu^a zjM$O-Y4m+9Ud2|zwBe620OHwr1S}&LuieaM@17C*S^A#JaPJ0_V#h2}p92)qE+V5f z(6(3V3CgsP2?XiLgl? z+1Az9wj@s3bjHm`BiWW)f>=J0AyFu1dTY0o#zgn9`!aj>9})o;=5|y3Q4x?6%U17+MDo9l$v>e{IM4v`HPewkvC{^Ek6EZdstV>(iz) zKJ-nN%)w`+Vgm^xmwk~_#aCaHN@ET6V z9W6lOtn5hG(MlM9HKmc#jxghat>T$^*s@{3yxe_W7vMG;=>q;=!_v;<9uF?G?<^(? zXhBoDEYV#+eYO%_gh9Yz;90@cm{J=RA{M>ymI%^FW_rW1tY9$cVbm!bjKQ<=8>G=f zKP-Y}T0;qZvdPeLvsx~PhntUy^)72q$Gz(tt}Q<7z9RQ-k&7>9+4%7hoe%5p&YeYG zP~#T%Scn}V#Uqzm4)Z4XkLU3podKXPLPs9Cm|}IlzI~H1wef1R!{l#0U2D70%62&1 zQD;}wz681cnAFDdN(MCoiNN*II5iGR#0$oV)7HuNYf+y)PT<)kdKM+d-QbK#o!UUI zQ=*y5*RX`aRO|)V%Vx9>XidS=9Y8BG7dB`;*!nMOb&3XC+|wT@Sq`7e2PI>!4Q_u> z^2zVpZYZB~h?1>iOJfJI=CQtv+8iIL_Yfe31TrmyO-Xco+>ducN~&Uw-RI_X-{H%FLV=kZA&mlPI`J=hC1eJUs<n3C6*v_)pI~a% z;#oZjluq&7v8)|H10-PKWGQ1DeHz#qI91>|w6Y_BWQuj~o7oqqW()|9I%fpb))BTrrZp7va*Tj% zw6jg=(NZbGa+F3uBM_ot(-1oTZbt`bEyM8zdYi)M0z*dYVCeIJy#!4}aVEpGg#I)# z#6LfpYLxf>m9)o^m0?NhPTJQP%v|pw79|{?toijisci?b{yVPDb-B#OAo?=J5&u^Xr z6Jh_RMV`mdOwaNwJ%abi(2QN}=roJ?nO>ImG$RWjPJobb(Na$cyip+YHS7_(d;R2V zuGhqOW0Q8i#(5d}WE6A8PO#J+Q#yF5E$ef(1>8{74n4uQri8Z8glGFmNkec^q}{wjw-vD=BwHdXM}J%0$I zX-p%@Q_w~3_WIOjSTPi!*g*DAV&42aAM%N8EKU%_w(+&y7*@~Of3W8cU0|$@h`NbX z7gYDZTsiGafp;t&wJwGaxRfKMG)DVelM_llDevsaJj0DUw*99C@iBk5AnUV#mgCOc z`}4jF+FfY2FK^^+76e7c)E0wM)e^!k>Y4+)3x)(sVm@E&N3CF)6Xt#6T|tvWTQv937u6Xb!O3lyo3!<1uE(zE0%RdM`kJIg+DxuolSc zYvLY2Wtr*xG*4ci(#MNE70KV1m1hW0!jp_SuouYuX=WSkw~Y|4c%Q|V0|l|!@@xD7 z<8Rkbu~I{g)Bf8*b@TFt$!o5xcBf$+m}6&VU(s}$;`C;4R3$prD`Q4VQeXIO#!^*qL?~!ddh0&N1eqxMIWuYyD z$0Lsalor}?i?{id7Ft#MEiD}0t3wojN*e9A180^`Nh3!Dd_2B2jp=fbP}(JprVSOn|pxqE&i4qK@z4E@h zvhV1c{j#6NV5s%7S{tswy*#`4HUi^c%cVe)o#Tf$c+(E`$|hezymyqVCQD+_7o*2| zQOv*5PMuQ%oTc4V9h};7E_+&=N#R;Agx9fImf4&ORYi`n8*TBQJ#(iz`0U#BX}|l6 zDVd*oUSx#bM$&dUZ+uHbsXyhsmu2zCr=FJ;8@rtMF33HtFmUv zWF70cJg)og*Usowqb&fAtKjTWy_=?AS2|3O{dT22{^IYiBm?;ETAwTZrxkIp*!&0XvCF@% z8S3r)RY+y#CZGU@<&%E~7i1Xd`15o6kdb4Wdr}lcf2E0^Whf~2MV%DwKo-8W4 zqZfZgXR!fInoWTs#j(99hsAdt<82Z&eu^(aBWw5hoB+PLe|j|zm(|z&6~Walr}wYd zInSRf>A)+V_Isu8b+&*1<2t(^WY;iN*X0&w^Mx%=dw5N}Ln|<~&tVZMhD)$`+rtaL zTma(^nsj5@F7nLo>J>LQleQrjjx7jqI1b3VyK*>A3TOx;7^aGMPGC3ibI9HZi1Aqt z=fDVEYr$ImAJ^D$4iN!0%6g9TimYT0WG%*?xaPl=X7jDq!<6%Pxn{Hf=FtDWH2;33 zUvj-$s{Sh1>Hph`HV4H#S>_nO7T70+IqmnOzu%L zn^gCh(%}e^ce=YsBlxYTDS%XbBWtUV3D?`!>@tixW{i?ki0*RW)_`kH#YujB4S=#< z3wqISyOV8E>cVdb0RHxkGCyGBaqE2NJ=zsbe6$RVU|AZ%W-~wyJ2>qK zgqQ)Or`-V6F*X?%=5R;nkWLU=XiZ50BY@AcWvmjs_BcIB3li|)fWka?Tq13Bwb-My z2eZ8IWn)5^M~Cz{QPida@qvvg*U~x9^yg7LIKDm5Z}&sN+Q3;5@34oYmGhX+g>-H* zxMnqv*49$Xk=Uzk%;pCk=cOA>)*(*EuK-q1plC|B1lSSm_q@+k=CJv%@0k94jl5X? zhE8D-gueh37TUa3yY1Qpcp2qd(!8Z8SjX0k zjn{PuU6U!r4VxWPokh$}WdhLz&cOMCh!n63z-9|wnFdL0asW2Kb8YiYxFd^G&ON5% zC$*Ec1i`f))Cj%oX#XoAD>gh#3H!Ys@Q{*6#-7CnmcMPT@;B|W}|ut_}byf zTqVNXlf*XZFL&3kS$jK|fyuU!9lghAI;9CdGEb1)(s}=r~8^7!!VA&RlgRK zum>ydCjQACf~C*r({S;Wo}<}r^kjk{cZNiF*N%8~j>ypk?FBts!?xDi138`VmqmaD zRBCa!co=em0pBI+mrN_#bcm@t?x(@bYUnnSw0mUq=h@>}8s_!|oMSLvt5sk#w(Qx$ zd|IHuJr+kHF6Wl6!i7p#DMa@nG(2-Z^(Ee6=;$PUKT*!3Pbe|65wJ zh1?+AbaGb19yx6d&gQ2}H4I2%I`I`8k%J!ipkT3uqohwK=^ER({}_*9I~KceoQn2m zK1RVy>dGG!ra35mkH@$^Qv)B1y)k4C|9R5Sj1B|B{anbKb!@n~kueSq>45V%qr*mD zXLRgA{AhZsAM+NvvzW@B3mChzEiSedrH+Sp&T)4K3gSM-9c@c-V(BO3lRj2%SL#|! z+HYN=I+M6!w6SBy2M?iJ-DVC!+k;D^?ZsfnXocp_#FS+A2WRyem;(F5N{sKol;?rh z9(!WSnfACf7-yAVeEL%C41Uaq*0jUX3!4CTbWGSXvXAenqTaFV2(23_O7ISGv&|+n z>iNn0TKlq+ko_GTBMwhPndTl?cVaA|mOxp%1`Le*Y88}IL6OVp~ES8oKGsPe5VRsHYqzU zZ%-9+K2&}8OrdKJomC}rgw(E(UlC|n4nL$Hb zwqSydyPbPr19FX>iQpL9fgFHS9Vj26DR1e?X)b1h7kg({%dSM-9lrXG8~EX*&Ssb# zs_($dkE1#& z4uphhxUupH_=WU2NIYvhuCW`UZyy%%nUf&^Ud}@Ji6__)y}Em36ZBd36fGxZwH*=O zW;>XSJ-<`5oXl&k3)s2`yzHT_@%{|o=!ag{nUm&B#(Yg5V6XaREERPcm=O$|e$0oi ztjM0;8AvgTvr^OjP5mlIX?HyGS<@1oYJU(e5TCW$Q*8TYYZFLGug?0<HnaMd8xRgdRoc$^-f6cf zoU0+fc6sB2m;cCrdhUWRTinyGb4Bu389$yI!hSfiog>(03@;e%@%AAGVnB0l;y0Q7 z*Rj=40RgVEwe8xR!qay1@|$#Rj$(0UqR~D~xHbGv;1PY{N!6V_gGWa?obW7~`j+tP zNR=b-A$Fg)A@ABl{K;UK&f$y(b_4)|6z#AD`jBl)9;M#U(y{9Ks|WF8j|{fk{O~XsuV^1aJF)9cpg+XW+7J!2Af(>4Ojyq-!WhPCsUwZQ3vB zx3dczsHS4u9%z?=(}vThZ1vbW_|YNDL+VF|*a)=pW`7zgB>Z)rV+4YCC)|XO3XKg_ zKWeOnOb!o4Ad<~JC0Y<{CouT>c0747FlkBa73^9ziJ2U{(PWqH{EVQ?hnetx#qSKt zZfW89nL*i|5)kaQ&B>XP_K{}i!~D=qZvQjv(ndlqv};y>O4C0hSch{evfcAgeo=#Jf0zKB>Y=XI&j9Ev_n{Bm1E8CuHXQ&BHvYKpW+k}cj`er*pO1e# z0Q&j@x7*64J*eHK4Q-J*FPsHf!Kc9tC`7VPz=7ApxhNc(wG#&aY^4OxfKq~uqje7l zyqm}+%hbQAyK^@VhXZnJpIfpE4u|q-zH`=s(f@UKdp~?;1S@KgcZc1Tt04-=T4`qMG)m?1D4yX zn6?%xx^Np~%Fhd>JN8p*0OUUKMXTpUjXc0W@dbrxxvk_z{^s+dlzR6q!BS-zS0r5x%qix!DoVJ=-7GcZ~Z}WV54aUB;e1 z0au_l;-w+jk1J!1*R(!jk4Ih{nO%<7!ke1w@8JUhaHxGJpswLylzX>v``DW5ln+)1 z%-NYOh+1RS__6qXhtENZ){!2cx8QRM4EOUEAY0hMRNnNM0LjI9_W6xYus|=8Oq*?9 z`*A{OIVybEbb?9WlV^>pI?(Ld&-93E-wH08H=F%yuTQBk|IEof*-livHB=Scx(;@H z*C|+gjiEGG>a1VU0irr0x;?D3v&RQ^i$ehR8vD`B&PHT+Pgt~hf0sIc6WIN76iU?ZZMmyDGs6o}rgq_u zs#)Ze;$a8UbD^N7CvMrd&5HNqh|15Sp~4;(VoT%w89d>`yNsvXHOJv+(86_cp`_%& z=z)39+>^9E6;ny0p7-->BH!+XGygol=IVBK-uwAA1_%X+$L_Jae7uvbq{h0g{d6Zg zQTpuzm0BHKC0{M=l=u$^{&aTYV%L2T%-|KQJL@kG_~{$H{<~CLd*wY@b$x*brl9 zzfFricm(ILPUnw!3>*221?xVCGC${FkRL|0j{%;zyV@-(c3{c)9(@Lybv?Y}P@@lX zxdFCb&LS@ud9!rRqpy2Xp@j>@K1qX9d(2^|Kh4(mrhovr>3QwFcUV-*wl6xH93)9p zQj1Cu$vGn+f~2uWsf$kFB}VT|)-k{wD#nLT`hDT;M&wXKePG0{!L&N-iN*njggjn_O$>}AdP#f>m zL$`D6H)9aeQC_bXp56SSE?H%_khB|oIhTc_VZLD+&nR*)YUxwEQ&KxAv7~_c48L0g zg?ZsfqbqIEi}dpv6t}2#G9F!8{Z#KAQglD3Xh&+FSpFtTtld4~vXVIk$JYjXT~@hu5{k0{hyPX0j9fn$JQiF)kt;FQJDf4u=+01j|@? z&rtr%!yZdGYckln_nT{aaIB@3ozTUgO63q@AS{i>{Cw zubQ*Gm93r9Lsu)Uhw9oE5A7|)ELmivi6p(mK?f)+v>DP1<>2Th?j^-?)~`7D8*b)d zL7tJI?WI`s)HIRuPOer+L2f~AUap&7b{_mJ(nLr}S4(U0y9$bbbpbv}vDl)~&f+{g zo}QlEo&wxXt~NY;Vq#)Ey!<@;{9J&7%gx&nZRW-0=yn25$p>KNpYrOyR4mWM^cn+SsR&Gx2t`=4| zJ**tjm;XMfvxB?a-^X-!vx1w>_;#?g<^fEdjr{j}ZYis2{_`GKj5c;C=d(Lt>c3N3 zTKtpF+1=IQjKT3{OnIFF)<+#F)>~)L2C6X4?KGZ*6$Gy{BzikS;>nTeV6 z3yBKxSy=E2o^=JUgZK?iWhoYZZr*>jXgZjot({y^V0+m)S~_{U{p*sp9m+}zZ3c^t zPnefqNPu5Jl$TdXRE$^jUqtt;T-|`0!@ctHa`W?_U9q$fR|I{U0d=!Onb}zJI6K;$ zU4R!x983p@)(qYqpy#u8FdK1sS1U8LldHCqlY-tG$M+hWP_43-o{A z&woYy&z|lAYv+b`^;Z5rOzQtdC;3NVmB77DuHJteU(3qn&!;~o$-(YSR7m8R84x$K z_#=KdGY>1vvn2p>{By~|*38ic6gji}wb}mBZueg(GC!}drL~BFFqeR^xiwH^D-kYH z5n(}~$U;`;Lgwazf|f%6-n*NVHQLk6)#`=~&;hW{U~`?VGm`x;{p0v|dQV#`Sh;xl z!Da#f@oV!5i3mE$`&)4R*0DTEo-vza9R+ApFyVs-1ErB=E|Hao|+V_8P1km+=2KgV!_dnwLkGTFv68Ikx z|3|z2Bd-6E1pY_F|Ix1h-^4}qFPGcO5#T;g;807d_`L_tIG(x6Ed}Tl{+Cvj83S4f zot5<6Ac&X}{vQD)B+-FJe6+IKP5c?6bCg2Rv2e&I&~yQPQx7fggo3>&=r6R6^t40U zB4KE+`81!VPV&p_OC<+oXQ*U@6O4mAg|l9- zBN~6^@GzcaG?Ju(1KsP}A2QZh$YrLFZxB`Zc1Ta@^^}rQX@)!({je5ucU^dHfP2C9 zB?py@OSu<1Cr4?shI=f-1cP=9NNdJ*SX2a-e1C2prP}0qO06z!A^^Al#S3$Bj}L*V z)O&5^eGTa+a}i4x5Q<-Me}M~uM_wZ9w2+V{xJ@}_3c`Q~Un=cT;X+gpbj2r)9ZCZP zgV;9_n1&fMEQ~+vk%G3m7Ymb&-QnYE>UEu|6Mt`4?i($WLteL} zS)u6a6J=Wzsu60$)XJ?t&#Al_X z*#ESo-*_`w%x#WLd`Rx9Kf>8Ch8I!Lrt5Swm2ll_Q-#>o546Fg{rZ{U5za)3* z$CAr9{F1f&dhw#bvG1c+1`{l)bYkeONma$AAK5a?tnr}BG=bnSXrSSVxb~>hl1 zM-ek`bD%+mG2J^QB_%OPCHteMw6AxkdHQgN0pwK8|6<EPnShX^QGW&{}-8GTtKn$7u|QH&vtPu)hw#>Uz^$o(PA z8d8#}LqkWWk4@d*)7^bLvqNN^03slfo955R$dF6S|M;=edbh7nXOd1)Q8CVEijwL{ zZ@;O5%K6OwszlB*l!gIvooG>>9%&w36xZE0Ps+*3SzqyR>sQp0h4OZCdwY8>Z?bX8 zAeGZH9z>V4H+Wk+sI9GSyj7SitI6$PYat?@&-?;JPF(O|T&9~|(4haF`s+x0?AU!A+*&)mWCfGjg@$6(m&^0gQ zq!#%^|3DHJ^kJy5#HE#-eqw1L0et#V$VW&rJb5~xN9je6d`wuKOr{!zasY-vcP=c1 zr)j@aWSqA-`y-Ltnt+1}0wN{U<$e-Mt;L3&uh5=at83z`^J;N-%zK`3c5Zc|E`X!? z(PVv~R&c-L;!%!fOGTb8R1l)MPN(7Iu&{MmN9%Yr*2GUgJ-dp>uw2uwOv*Bja|+Mk zfz~fGtO{(N;YG%!S;uC>dm8aaC&!1od8wyI^W*#8>{J_72a7qkyJmm>e7)Vqng9Hw z*mN?<;Cz&5eRy^q7Zl9t_@pyMCxkwjC6)_yXJdE&QT3ZQZ~X80GKDkCoJjR_kugdB zs!X=pxpehj$jEt9eCWd`HIs#5yCs{h6n&Y!IO0GGywRO|MdW8S= zN{{gfzpcwPt(y_*2nk45bFkp9oBb=Nej6HU>ME|=C(@}Ji8D3BB}Z#PGFyxi9?LfT zT@;-64?VFpA7ZH9)L){vS-Bd60%k67+-Lq9g|~s7>d^f&?F;)l<`cs%1xA312<&Y6mHPa zzpoV5n$z1^>L1+g7FBx64PnW*^#vr?bM{V02Gpgk4W&qWo2#CCTlrJF)Wuh42GbQ+ zI@HUrS!`FYE8wflu3!aIx0%M7$(QZykKI6VsWR7F#DKN?=B3kvooLex$c z2Gf+@b|=ZyNIe<&vG*YtJVf=Io61o}u`Od0alFa_$B4uz7K?o0}8R(a}jIr?kZ_ z#1`de$)w6suK-KAd!A2X;n%NU0_iGG=x#{VIpecpw#!tIDs}w@!z@CgX-|D7(0oCeL@L0tsB~cl#0@L}V1Ybo(MQ&Ki zd!s?_RyWNH$R|CI1)r_6rTb#?R+rE(w9|b03fUor?ynr8ZoKDi)`s!(ESi=0i%m_> zx}~wPv2oNB&XJN@TNV zv*~7>I_IqTRO#B(dU-cqCpZ)pG^~q@iw&s;`I#aNY)LOZorBcb3-{vYm`6uPXQ z-8KRoYYObQ=H}-EOOun6OS-STfCLGhg`YMGgfob_LWy3}u|Z_aV-afXSlz6(t>ly% z1c7pLpSQNQkdneZ!^51#F6>mFx;X?aXp^z*7|tR1V&1=hznP@H`%{CSp5DHI)7&>1eQ9u>mzW@>)|dt&!SJ+leVDO`@a% z0s@zh_Ur4hawO=@@Ac`pvi7&DLywv-p~n@?+sB!1-@ZN8c+d5~)x~A~My`e9NCpbi zJ8%Wd>scH?Iq6l7qm_Z3hEo6!)r$>`jaieP>xa;!&NTOq!@Gxuu60Nj>YYohP|c?0 z@jc$|7by%Me25u)yb>-~Ab&0K407o;8+}WWI=uCW&WQKUFap0&s%8E8=mjPwnjsVl zMKbK&Ff^3ltj;9;s3j?lf(l_bA=0XJO8S3|qk$sTr53Ah3Tcl&@1g zF#VL079%Ru%IsRoW6-`)mv<2z$O0*yh!$~$Mnn*=v`q4Q!)$yT+}jg%dseN9L$H=O z(PDQ&F1>dxUYwQfc%_K1)N)LP62Vxc$?9$a}X=n;^-dyMA zCYnb-c<@5(W-L3_ql6N~;*X&^JAbj|Fr#=~Uinm22a*nf&P&QCksWh$@4Lsq5mYPs zBIW_9R;QR~hS;^-q~0o44}+_!ag`3^1uLuEu*w$X#UE(GsMEch)5wibU1=leI%;fS zKrg_3D-Fh-w&4JG@;!C5OVn_dj+R-Lb8^b>E=|`YIDDYUP6eLFqoG0O7Up*c=htsE z4%u7#-LFAptIgsMU1nOMup21Ft?xV5O)8xrO=0vo4vsvBTn;xkw|cSE)Kr^qJpvvG zr4#K0Rv3WN2rG)5=U`{|qFhR|1Hz)~PZyhX*0Y`d_>p@#R}2`1`U4!S=k* zA3sK8fgKg#Oj#1wKofh+3NSmh$@ggNFkb z`GW!Rci@g){9wSuvOm4oL=mj;w3HMF%PiMI__3_)0OiGCh37YmBUvDe>9uRUJv}{a zpWLt0d>xzE1Ykn%I%{b2&d!c;ZUF0D98+6{n*yg<+1Up;OPH?tO&wib|J#OdLVk%W zzW?6$yr<_*dLBUOg(AzQ?(RCjI4@tmyhk+j0YxzpJF5J>l7LVn-kN_sY0uM>v_NEn z$M$XO{sOLdwgi4FvqEleF2VdnPsS}e{73P7O&c5hpCR>JX@PF(3%cKnamAAq1}{Ew zfKNw8VSEXT-K~XQW(&rxyJd!f@?L@-N%dlPlNYO9XWIyVJ|6uA&f83ToKDNSAU@?2 zB3JlOKB&Az`=;juuXVmjP4!dvZuJ+?xnN56IT<#Mlp|5W=Oc7gRDjH zw`AzNc}bwNXw$(#Ww-ycXU}*^EpJ{MSDv*uEmizZ6K8>_EhV#*S5xauEtDv~Fh2h+ z`H=GG4PEy(E7el@Y3usrt4tBZD8Gg8?`q5$TLRl-c}ytx?@2PTz3;h46PSAvZ_88R zv-`1oZqk|Va{!lvlM}J;^0#D(J-UN7ZYal}Rln3*)MI&|tAKRi#+^Go!wn+hDt>8q z+iYFqO>N@i<0*!Y7J4%W7#(H@i)`df6653R`n&IYAU^z#GZfiB+UzoE{Ed_!VHQXK zx|$m>7R{!2ERe-rSW9UfNz^?Sq%UHbWRFI=H0Kd1FN%kk(^(i6QNjB3l8wf<{s;QdeXmk?ZH+&7Uls7gSoS_rtR+bwz~t_-Gb_B z?ya7>x*LzE!d^e@@Dt&A*j2Z8>=)0Td*kI0Q;^!wFn1)ZT zaZpfIwc@is8(Z|^vIpYIIKp)Ml2SErQ3ON~JOr}+2Q@TQcRtM{ftJO^-{nVUJ! z-8+>a#0&WO7#n|0l7s*+pju?iE1<8Y%uQC3;~O}ZeDiBg9;&-Ea6`D5t=81r+C_`; z0?6CcD`}n#S@&>0l!|^^#9HV%;+B_}myj+hDcKh0U*oc{u#o%A!^7jV$O#Tfqu}Wa z7ca6bC_QmlFaGq2Wor_E%W2>D)z#IaJ**MTGNpa2GYr8V5PIaqGyA@kP{kpG7m9gK zg{vm2(_}5tDY$w1-W$T@QhYHs0a2V^JqpETWu9#L=BlXyzyVDsQM`3a%EXLy1#je% z`HWnt*F}2z_LgR~iMh^1`rz|Jqob(P7s4cAbFZTi2K3iLMa~DWY1h?g85tdC<@!a7 zzE-;O#7pUg!}`m%)ST>W=}T;)A~G{f+_!@ZQ$$^+VuQyEi;FECT!S0Ua_^)Ddj%;I*kDLH)iQaAkMUHQp zYotn#x{Oj&Q!~e>Em1*q(p;*J#7O|o4n1;li7J)pW=VPd`t?)klbKe^72n08F6m7+ z<4u4}?E6)jhUjZ3X+O=!Ufh{Tb!alb{h1u)Z(4s8KSWbrSZLNCDM^U#~Od#oFe zJ=iU70B*kYr3suCUAmFVpFyb|$1{g@K~d4TJLi7M!eBkP)gOROm6d1bO8K=fWYSIx zEu^>^8I9fO8%`I zrCty0>?+td_Pr!O8YQu%rZ23n?k-voaECPLYw_{ppX*el#1h7N z;55v8q{ceR##88<{xZsa{0R^lc;Ko?6$35G{~?Q(BsC39^*bMf31Bfi4Rvj7=0y|o zO_<)bxe_D~W6jUaJ>5x3P0d^(3w@pmz_Qu7j&I){OuF$)Z$}W4|8j*Izh@x@t)?Ks$; zjQuWKzj~M>GtUj+n%XyBK#RXhX&c+#-flDw4=I&#Qwq-nPbjdH6cQ9n>YkM~{e%LL z=@c`xM_%Ot#E>$dt^9vFg~)pKK#EG#)2jkGImMga)d7QB#hPH~vI zg-#>OIC6Wt-(>t{k00PoqG`WR*CaU|;?u3ipFe*-E!XhUvZDxICRN>6TXZngs*aga1M zHwW@<9qqeuJo2!&S4oshz>?i;$hJTrE4eQ;p%;H-jRWa7#JE-J+_|$J6+4}sm9_6S zON!3I5Xlf>MjRm)rp%VQ&*KcOr(P*X)X)M0>cCfX{ zwvDA%3Z;+BIY`oYuXo~tP|g$?GfQIuDs7PLR-8oUN_c(FdS+3KmH z)<0}JBXEt?D(X^Q>qFb%QW?!E)0eZFD1ZN&(y|`av7Q|piAW=vAFI3Vrnyo)#!p;^ zeDiv2f9!r&;n}w;DCyq`Q((F0=U45qN%F8cCUpIk=rg_RbM0MSyGx?u*XD~In&Rf4 z7HZ38TCRa0tN)QFpzZ2hl>FlpNR=oX7#Qf9Z)g-#U~<>5m|I$2$rva~1Tj~}aW}A1 zry0GEmdeSsAJEsY@GTDD%{6Yf9{sutw1e$*eWPb6c)SeQqj=tN28T>YlZa<1&eGSL z5apj{F1hkdm#6=>pI{*eE;BBs2^aHGec75mrX!yR=%98;CffOMd#Kfj0NBYs@z*UV zI%T^N$?cT3QrNSoDn^`j@=hKOZaY3muv`6xEW2Qe9Az8~!x07QUAzQbOq9Q@q?po% z!JaWMC~wKhH~HdKs54hak&q;@%#b0|%QLq9RS@+`vnR^rsEiV&3M8)#jAh&rV{{ul%J|-WvIF}eEVlpl zF!KjGjf(CcKhVZhAr-94!NI|dsh%fC`xaEtgITd_m%qlG5-&?O4#S?j9Xr+89wq}W zetq2X!b0Kl^Q#xk6D6mX>BO+p_%hX#4wQAsg~_i}C2*VmU>mSozIT|;b7x2lbD z0>4LKw2L6}gV>5+ct!UDaYZ&*8j&gXIu4x4k){yT(QAw1Q4T{GkQAfi9C-WtP}GW6-qo2kq3W6}f#;AJCO(F)@H zydJc)w0WcGm}J2X<9j9z3Rx=yJ+|l|UlJ!fb)AdLm#0rI4erGH zZay5SJ|7r4Baa5*pJ|>GuKlE1Vywrq1MPgU*=hd%K0iOg8<*qP(vr#r4P$ZwoTpWv zdG77sieNgvG1Ud^=JTsWkW`o~A~L1(k#uT4i1uq(*63Xa78)aWasgxs?t1~x=2c!E zmwE6=5QQphMHoll<(pjXpRxgXT6fKjV3L|DIIq;%7(#16>5F!7=+GL?`uOogFj-{S z`&iV82y$xvr7=(JaSYXr^8`>>GNtA!uuyQy$oTh<>l+ws`ko$+@3!;TOgazjg7`CU zCXz8-v*jT`w(ojU0OGShJvo*h+&0)@k?k9a{YJNmPC*VN&y*zwuZi!omEB90^xiOu z7mJJn!eU&X*>2C;c`*v$3~SiP^fFDr!gNgX?Ck8z(#?nTF=fY(AGG|W5fv7GCLDd5 zw2#HAwx4ANYu)?BY=r7YX&zji-9*uH8Vf`tibu6S2*ssXlfxGL)L z^=LgDEvS|hczM_L=S5u3rE5O-#J(3#7 zwPAXnxufBOvLqAj(Bk)ZD*nFf62`@RJv;c7Q#U17-Uk9_v6}Te#!FJYgCoHPmcq^q z2)fHj1b#K+q(rzF6hLSd7InXV;K)^P;?>TK4~~t|Jg7^S@O&;s1Z@*TBf`EuXTki| znk8#`N?@xc9GkSna}GdKp{z&U^%5f4{YQluy!)OU28<5S{(3v~x}$($bbIV`{Ya@+Y$n4P=3d)Fud#OQoEg`exa)JU^bnD&I3> z*rEk(Pt*qzzp5B&$r5G-n0L$4TvzhyD!1jv;YpMuSQ$+34mM|@{{ep}zfC-?(sn!Jpw}ve7{bxX*Yv(t`4&%BEhu~=! z@T7p)p6AgDymQ?cHCQ8vGeNSud)i#6K8)7aa`58-0Mg9|no%LBAk}Ab z>JR2~q>Jp}N!C_--Iktqg8|WyPzrjioC5qBBpoP_zM*Y=A-wc1#Csu{PgIn>xEaJN zW{ZzkPJE%5n0CjS!$F(W{bawlYoJ|I1rHyeYwkG~rd6}$M)KZA)qijZ&Q~LUW!i(= z2w4P@52WyHLxO_|o0p>;Vby_l8nn(llo|mEi6uQrHC0stp{sP~E?)Rb1@iZI?;0DQ zq|=rvW&R}#4w{gPZ1*hm>`ZG6vnELS^IkX~`Ka;)7fvU-9(?w+|7%JQ?CqCsAC=*g zF^Mv1h&YbuQP_nf8{xy9QbGFP2M5KtKi#-aQ}iV+qyg3mXgP!}AI*j=vv4BTapjR#h?w$HI3WQZ3$#v+Uois(fgbIXNNfc+XzFM&sh z<`WiX{c-{zsml9((`_nQh~2=MY^&Lc2OaMI?j&J0x}w_e{0=_qRs z008V71K5zxh5`z;a!G3=-Ngp7EH{lI0w#_7OB28{tXBx2FK zNKDC(u!XpOk~ha6T1#@)8;ExRHpVXF4!jU|jcjh*s7q8LgS^zt%q9)qFY@AI-qPj; z^n%O}VLr;wFQrcgQu=yy^hGnr+Qz1&``YxkhC7f~d(`Dyq|R$(khVrNoTkx0q)m|G z;$l3XkKtJBzwYbpl?O!z-{CyXkL!$M1P?5Mty_BrXJ}ZHa&aLLPzJ#d`#)!qYxzew zJ#z&QvV51GKKWERK^0N^cHp*2>KZEXCzuyt9UStYKI0kiHaT+4D(B=*jhPcR$gcYD z6kfL|UP|y9lY!DKW-ds$xifvdMwT_U2)w~CkYm4KZEgKj#zargluhehTTl?9;tX6D zA0sfo_cMS)i1gNcynY8N2XWj|5Puu3ya^a@a{*;2>F-faPMq)TU_pg{2M%E9OMosm z@F6SZZI&VsZ#rNF`i04$&94kNOTj1+Kp)yb;PCWAjo8y%o6K^BE-FTCZbc11Wd+)-6J@ zp`pmzy}-zSQ_ozcj*QxsVVHySEx@0ERJ*Rip_Z(;)6jAfbvBFuh__98^m9u|vOboKau+odOZi%!>zQ(qT2YA0Hx+i56iX z;nLh+PUea|jv;Tn3Nq zS+%=M=q;saWE?^WnX-MV#!F5L;$vVofKy~wAV~Gy+qW}DuLKieG;{eqsPCE92g|rk z1~nCxm$Uz9$;#sB68!!$XPRi1Fl=A%1V)NV23Ys;J;7 zZV$jG<0XY^nG)h|%X7pTa%+~8L|%YXE8sYRTGZeSd5Bu)s83O{ZK}F9+IYz*h znwr}D&4ddP&F{J$iJ;JEnyRX*`c<+(x!e;3be9|iRfYz8d#4jTqL+AITn10s-dppN zV}N8k;Qi5(J>E1g-j^CW(?mB95}o4`5)$o;%#bM=?08%hmyua5f7TW$|F-k1w&G_k zIJbg-3PDLd@DKBd=pSoAN@7i*xaa5_2quAIFN`2?&1fFji86R-tF*e%v2otNf1kU} z`3W^7i+{IDHm?FCG8t|mBKzo)FWO|UX6NNeDX?QhmWpu5>w;hs7KX@97Y`5b>3C6L zVIANEsRF_~Pltxa$DKZxCd3UN4W2XYClg$&f+Sa&p;{v;PnBl(Zzyk3ZASp#31#eE zU87rYp_V8h`^heV{87Cw;w6$pPu9#sJ;I7$I|xn`=u6KQ930ecyU;doa&B7#(onh-+wFF?$(H}gU)-a<;p z`)AqqYzW%93r9i|@2exyoDmZZg8AB-lC_uL1FGSOStPbmxdlyv@z)zhByyNVYkyAa&^C=}rp-{x<}PwJN5nwHoWPW!{UX#RMdPJZ0{{37RFmq5#4KZ?Rq{7Yr(`DL7 z6O?LhcBlYIqxi4FAo=PH1kFrr%(nL{+-Hnv=8AEp2`J7=s03M*HP1hX2Gk0oVKfhR z01m$X?p|N^>^(-3gvId)Mu{B(ITA>g`vriW-|qDfo`|H~RrX8*2)N$g=U|HiSZzqz zduKUb^Rtb$^>s!!osWAf7nf5^t|&LlazD!e229ow-R)K8`XGfdKC`v)pklIu=NJEmJ@3Nc);`YJcPLqyZkLpUI4kok03mG(o4J(dgx3F}CTh=%!^ddFG`;YzWgjeCn-Q za}k#qg3?Cs(n1T`TB_&3&x{|4^#msqS$IM)CX`^q2R9oW+e8zizplPouc}^+w!1su z0rs&UF6P?4QamFx=!A_EaO2(<1WkCWuesJGISnbqf<&9wMD62T)?gz@;JISP&uZU8 z-lzY_pscqqnzVp4$Rjv0H?doD>dQt`?80K{1IY_sEcq08K_~z$NW}H-7r=j?l391y z_~r}JOrCE!c_b9D%UyHOmw%$N(FNi-P9R6)r!!_t@Qv~uUY>);3)!}c zt*Z4V`Ub9?Q-51802enlHWb9nxB6>Nw*6nBzNq`w+%baQ%&dYmC@A|l4e5TYVC;YF ze*PJ2eulfv*$>hN<0OCT~-ziMo3T*`levka@l%+}Vn`Ab=8 z=~&Y>*Ip3*d?jiF&}IW?h2n>CcyszQ)6*AOUdZpYSo`b}W$fs(EEGPoI>(48NR;7S z?VxRuSzTE4sPw+kKk^Ga{`kUuED+ELOqCHAzdcj?@htVSN@Pkcrks)p6hT4{*TcfW z;d(|=`f&X~$zn%NUO1?I(GWORcf^%tiBfv%t*dJDMYM-xV=mTVt2#S-k&@BvjVt9# zVo;N`XSA}iQbh$tlCr5M?O9EI;o;)q+l{6;hv(T~4MR`8KrAF<)o(bxa_k4>Wy!$v z8L~T1fKxxX<8v1WB7BBL(xGR_y1G#XFy&MIW6p;?S=E`v#amLWM6T;>rE#;54Fnr3 zKVCGtcWc2LY1ry%pTjy7{?MExTI6Y!ql`@ z;1>8fZZ1tG+r!KI!<`corix;Ljg~Zu&aT970oMF5n%bTRDLwW1wqZwT!{3qQ$+iW4 zEekFZiWb}D^OjEK0Y*e7A3k!hpk<8K{FuBh9xg`f;RuK$-P!V9_e#3?w&ODd*8_9` zU-I>`I{p=88iXx|7GIe53o z@n1l0$8;g4PMR|NtJ_s)7_~amk`_rtM0i@7nHhuy=|z2-#sWSO3{sC$G}$c&g&bLh z@UcN5U2@rB1M5x55^MMEXg~2c!$`J~@59>T{h;DPK4r~|7TGrr$Mt+xBClWzOlVhb zcDvv3Tf1#ffAOOFKzw2gnXrzsuWx;s=zUP{@Va9f?>v>J>0@#6&j5=Yje!~?mD!_- zSgYt=h7S`I!Rj()gW)cp#h4U&4I zIXF1HbzgH)JL1+lo?vbku>H!&$!fY|X!wXX(GX8xbq~hB;{g9!P3BH)zj#$D>yx$; zVTepj8LRd+5Pc02G%AgT6S1hNqT^vN$=}0ePN^n4E^eoH{ma2491UIG*MAX<)lmWF zZu2MkHab*TWQ0lL?u#<#PgAv);(?Lz9LNQ6!0|$&mb3~u&F|lV z37|H8pPQGbe=RIoU-!1E1{Dz820WY||rd=y4j)$mWToq%-T2nXbiDMo5D}y~zmbrX8bc89tF+ZKM|! zrO2*v(U>i}_1KrN`$rk>Mybr!ecjG`A1A(h2l8ybNc1r`U8E5$lkM1aqAb3DQ|8-O zgjDtyQ7T(W)>7Q>fW3bA^!F@&ql~IM*`dkM)9-J^-mgT=5vLb`w($Vc7v= zkuf?Ex4F>$#>|R9AYb>%j}k5bv9@$?G5&mm;mbStv7m{h{!pF6o?O~ucW5!2pK-D{ z(R{xcv3P}jgp`+-arjR!y~~i&Y~(dnCJDszY|>4TFlaRq>FjF_+H^Mdz>;M`!@Q9l z|8TE+N9-4q9Fq)1QW*V??}cZlX5rqey8`m?iAWEu4*8%`S=cDPx99Wv^`WxFwVTD3 z=2{sLgiY!D#q1pMZ#gD5L4A3jradqfoZPQUyJ5aG!Zoo`WQfJRQYlA#@N+q+$Hm7{ zN6IH4S0K`JO^sgyF-KJJfb4GFuF}a2E?8SP4-c$b674@Ci}+cDowoI~h!Xmg-X`S^ z4?lzD0lhTlJ8P0NK*HuJT1IIV5-)wEr;ic&5ZD0^5&tf%(*CXT=5LYCR`)!p$i*<* z(EV8VJ(tJONyq)|rH>J;`}uc*AonWj$h_W9lxZ~lf0pzwjYE(yb>#QE-2&ob&a=VC zBtw8JT+2UPX>6Res9_~hCtYlD?Mg0{5jZc?3X}}18K%VkA^Yr)tZapBDX1#To_Di; zU^a#a2*OL7e^~oExhs@y(M3hpsm9%nIHgo(iixow+Yv!GMKE%{n~di#4cK3X=$Lu4 z#mV2Km34_rX%rt*%-f1cKux-V*&jpQ1_@0?WTi(OzyfN7DJY$77L0u1ZC;$R->qN) zB{TY#p#sXZI(6tX;$T7%7FO*Y6H3EUohk9~7|`f@r9 zu>y$oZp( z%H>QtF$NGfZlXGMHX~bm)<7~_A}sbV1`E+=8a9!un0KGR)N|g3#{kG2}c6) z5f>?e^({&n9(6HyPx;KIQ031Jk{~~fB1e4=fSfPef?qY6xU0EXPG7qZ?JH%%yKi6j zxUzUB>gdLytVoq_<0nGNHYN{ycyEi!a*`O8n`33)A9T1eyLx1J#c{oNCkT{4TSrF_ zGJMEB^7DUB>Zt$vT}D7nIje-idZP^zXK)?lp~r`vYK~D8r&V0ttGn}n%_&#~AyIJ_ zyK)V4tw$Ht1o24`l?4aew^c1mf{hTJzI7eSj>M`@OJ!D%G@7yfV3P>Vd*%(?xc>d} zeo9Rj&|1Hc9e|*h@z^WrBg$;yEIc`qzLtDB3iRehzB|0ltMnrz|(uNiD2s55AX0pnCq*d$;E+-E`N1+j2hS z`i<;ca&Go1g^23#JPrtRn=z3y>0B7O;L$}ca4%Nu#5*K%68iuIt#SBosNRwNgfEEA z4iVTsNqB>?jNsuH0fS*EC#dkQJbV;Z0rQ+}nkkBGomS}pERyfZ7Gg}uPh}C1H7ov8 z2or}-1io(qVd&s@B!n5j1Mk-%j2`?h2|nWzLEYL)njl;>_ux>B;~p`%UW`ckobcOUhfg2v&UXEF+DP4hA_-|XjDhOVP+?0(y5QLZ#{U3v*q@IEw5_qa;C=iTcFy!Y2NqnEG z!H<|6^o%^^U7ek6Ts+}h1d(^Qx#4MJ&En(WY0sjhqM>aqXhVP?EQrdLOM1757Sen@ z_4OaW+ax|qq(T^nN8~|s*=&WvijYM)`x5cv^2Tr9%3phP54&?$J-><*{Jf2&6pwL; zPBlqTfL|?1UQ*!gwJSW-xWb`Hmf4-cW%zEk)A9T1Gq(qL0e~dhiwB3IZ zS`pbY?j}TpocYLFhQT50QK3PU;W&s^@X`D6eB*Hu3b?a@M^s20f{@MMeT8805Ud3$ z2R<@|okoy7wy{H;??t&0BR6T*V(7<0K0dz`@~W&%&u@LUHzQrvYc}Ck zW~Pe1KJ_XBcZM|$6!Q5~Zw>#*L~_8!R_(VQub*dNtV63ufV@VKDu0uCj+Ph(uEVVs z*>i8ELr7)F!W&r)O}!Ew+m<%Jgc4Eydg@wpLoMZ`SIGCr^C&g*45f{2rq*4 zjm(&2ZU!9eZKu?mU$Or4^P?;QoVc=5%J{?W;;Bv&I*}_=?N9A~Flk0iKWas^F^JID z#dgQ4@`MDcKesPXP*T36=i}v#Pfca~v+cidFgoL@dg;<#Ya5%K!0h+$jla88=ouK4 z)EJq=I@f)W=FXd6SvRT;thQaICI9^8i!Oc;Ir*FZyj|ouJZIwym$Y?nS=MU=diZr+ zGPIW(1nQdw{Zh|4#21qM@Lz3TJve~-&)lvGtTj)TxWzX2a6Q6E`5iv;SfGBWV2z%f zoK@OqF#)co*GNt6zO}XWr@OcW9ouy5iqUaDe_BSy#u~&>Q&D~5OuEh%Sex$EDuvIt zbwUprcY9s$o@*eukp7@*u~JQR>wd(|@9+M6Kv(7PV86tn`%HWB*Oy9P(tLh6NLL@b zqjBpF(okNWgJ1`JbmpI5*;$)m&&NX~;_ zQqq`4@Onf;$h%{b=Lq!>>UvS4KCG}^@-+|?{?MTg$ zOuBmYYRQepV^qvxxrkg{fOv2OW;m;BZhNwo?@dqdXx^Kep@q(%g}42lvWHQ8g%%`5 zCqu>Mp8rzG5$%yk)8ygjPl%2_(QBlu`{-46_LmI#@XGb`aI!O}A1GN`S?OCrpo%#5 zaR2eERzJ3Zb0*XTv51K0;5_IMbsjp`K6aL^#AT$?1r5Rw0@Bu<^*ON?5mC{}2SI!6 zl;q7`9R--*eSWWSka>$XB}>Z}2}wz6@M7ELT{ZHpr-v%8mYRWqkCT&A#PhdyuaSmE z%)9G?IRynaIz?R1;aywO<-`rfUTHR89v^Kn-_}DWvWM9 zx_LJW4R-lOZNja)tfHd2-b+6OG_!TZHYStITbm*&LrO~be%?RJasIra*wnfor?j-m z#^T7AUltw~=sHH|EqGDK`veI*9G&ae z`Pr3X^^cVv@{1PpOWCBdit# z;SvM1*U?8zx2JH$pzu1~+Su8ZPFmuEYj0IO_{GHZ7i$j#&+sbawbn>*6Ux5f;YIL* zys4VGAod`7U->Nk$SvOA-Bh!+%_=J^3;lKN#mkqO@7@_HMxV-{&wKNRHt7pz%L8V+ zZ$+lC&ITjvr4yt~e1?TRCm^AEOtldiLuflVI6QpsG3^+;KGUrPSMfPC`4yX-7$R|^ z{w^B{C7qGtgVP0fb`BnC$q)^D1?XAf8hCH@2tKMS}(;EZxRwkjcQ-{bRPXJvkz`eqL!Wo_=;mGb$>o z!P{9uL1E>)N2f!qM#?#rEX}l5Ja-c$`h!`hJoYi^!H5?(*=b8lOGvuPs;W_r`Gtj= zI=Z@(1>>~n*KRCbk4}wo!Iy0oJ*UpqKYNAsYP}A%Z}0-yyvlK-+TZDT$fvQp zSgp%-m5S3Gh+JQ6p)>7?uNWsL(?i1Nl`AF8QLKYBSj8NEFb<2^c3xazvb@jTBXL{npmnB1x6JMKRIfdWtcllx!J z)?VM-JXlGpePS@``r%L5;%4Q1$rp7=!-12PW$|vu>c*;iw3C**tnAfZU-VmxTdLXB zEGaG3x60N^e++2>%D7PG52!+dcQzLjpIy9@+l+22NQw)3HjSTFBbYLjL>mMU+@x&b z^16iE^7?`cs)K9K?ks*qqiB13JL@F8Qd3ix+?r5qFTVOx@$-n!D3i!VhJcgF7#AWV zH_aR*&Ze}R^g-e7#sZ&>jg5OfKJDw~+}vCa0RauoG%1@|$(i1~q=d(hTLBa3SwYOA zp}W4mUY;7XM+JL6npaNxt@gqS?#G`W?~6eq{v=O&(Rv3`llyEBkMGuaxLC{1=F-{w zv}eWF7>i$?^cO=xLjCA+Rkg*eIGhIJj6+03M{EN&H3|;+C-~Xf*sNP(nM7Q^OY|B! zIpsltR53QDbHcC1*Fy%Xy=^N(YJy9@ke0iwuCBsKk214ePFnovQvbdtZ2b82bmp}& z#(CejPWsRDq%xx{S<<7PJaDkYV+&IC@4%(J!pbPGd$RKO zxUW1FXZW`!huvm`;i`@k6MtOr&TFP;VBmyn4cz;qq}DMR$14Bo)vGH%fBw|7f>aGp zEwi8?#w*M`gsffwd2}jrMD?Jan>=iH#)FNmJ6o$CeIQPK`NcP3TTA+H73G^&8F;iU zcz-E#=x#7;C0QFPGRdiuuE1kCv8sSy$5_ui@+63$@4t4Bk&R8}yAc-$7nkxi#+Ih0 zh?a?mfGT>8Oij~XWo4;qXqcV_v@-ccp!j7bFN+=y`Z#1gn_a8}AOb!YnpVA1dT=_o*m=18vrUqzEpzsS z+o$RDAVEqlO}!Z3YBRcveq~hD)Wt4;0_5=P0;^1k_Gz&F z47y{MHuIWcyDd(H6kMY&+9|By+j*f8hlg!T3jIV8`7P%B4{j*#eT>5;HuvX;-hS~e zzpAax613Buey$};J(=zNcefBu+^1={rz`MINN_>02iFq$?AfwPNnMM&f8VAlf;_i) zXUFf>`|Iv|TenPxl-=D+5)u+ip2ueGUaXg%d{_TeN|$mKCBBMO$+cneJe3Bv7hemUzL~BOnhY# z7QTwYX?PLyULL!2>j-sN-;oV=&7gp%q2PEe+-8!CNoH#-a zGBSwYeA1RC-JeobgbaivdN-o6O139Jzg5sybfXb1I&f;oe6+B}&~uu-p~aOV0N4SW zmXn=bUaYUDhht`D#{G8}>mKnzm?}bz&~R#gmOytOVAj3WyK;Dks}t*fHhuZVDOSbB z#UOJ& zt8w6A#G9cHW6;4fZENc`T5vJA$6iD5NS}e$M)TQ)NLH`AG66fv(DZO{apg6~GD@<+ zzWCPFh1F`19e?y1DH?F&&#786$Xex#U5)%_o=^`pBD&!AZ*oB3KbBkZRVEg>}GkJPv z_+d$g^KiW#0kI2)Y)^VGK=@gZ`%?9$vkrt|1^+d-doEzRJ62`nwu4=sPUjype^+=($o3$ zd4+{EP({7GytrGlHZ&pAU<*XdQ!o8CuJp`7o0??VAenmEh;!oNt$W+6P(at`xYQo= zUsAyoneMStLl(S;V`)eueb+n&02P3k$mnRjn1z92d3O(wTl}nqj^+XDiP!yRGINW| z%f;Vs{k)&~>J^^CU=KmpX=Qxu$Cdj_O3S2-fDzzvtLM?z%bs)cn`%o=sf>+|PT1S? zPoQFXDn7v;>Z`3ydsEf^Y4LSpB7wlWiB4~-4Gith)@-p!9WVZ{_D!vF^;WxB|8w@I zyZHX6ow1lNdu{Jl?fRJ|Uc7km>h){o>w-y+^F2Ab@sA&$(bw1K<_$eTe@gQhFuQ?7m<;lYjPxw)zaZ_ElL zAH#t}ZQJBjFy+2{qa;Oh1<0^ItUlghM^|l75E}dt>93o4d3iY?323Iv#Jp&b>wI?6 z28seuA8x$^k(69blkT6jWcNc~yv7?NMfVQTL7LsiDC&O|OuR!O_nkEd-{pD&SbhLU zd3a7CTrfs&*E;3T2Di8dt}?veTlpf^Vs?8RA3DM- zD#va>sxI+ewQVmp-=8&f@76e<@rq@eP&BdaJ@xYp%Hl0nxnSA)+ETZ7ZT@aXl!um^ zPr9gY(<1fE9VowZbPrJc@q%#Cs%Tu}|9)y)s$U&DTHNt1>hj%#EfNR@E zOnS3nR2%;}j@&ZWmQQkTo}tsRL(xP`aP2JzXXnJhQah(u;Cj>y3a;IYe~st4bH{l9 z0>X75nRY*dd!ji;cQ3FuOJ+3aFu>EAVjBR)x#=!w;ox87mA06raP#*Bv9Y!{=l8~w zq$b2l`>_4u6XElWXQkvrM`(Ez3E0>wM!cV*VedPelTCPVrr~b}M^gMo1K#`fK9j3D zw2!R)i$6~Fs8S<&Bb!`X;bHIIN$>~=B-V!z6xvkasMK41_0Mt|M=hwi-cX+ z&$i)33@RVUFOxFy@bLWnbDQJL8AUOm)i@xrL0hVwKy*tgO$Pvrv9WP(F|;*M-*k+P zBVR1*K8|JwvcqWR$BBB`vV8MeGn69vH91MXrxD#h*BgLn12va#QbEFbm5603LgSiV zr~$(-S`mkD9Ht{R+fz?}e_~tdGjVn3C>~uhJfoQ!5xZ>iIGW2cTwE?M;pV`0_`5ag ze`Ig86Yx*{Lt_53yU%_6(B}O+cQaXKx?>Z??9eYKp^HBF?iPFf=;is*T5}Y>Ns9Ze z*}q@ykiM#OzIbi{DGegkHAM2`GRgPkwbEq*&?FZB=#jpaQY_=cva)jy_V#jDY1sam zwt-boF33g54b1Hgjz7UWtSfRGzkEbnSk&VL*W$yQ|;5(xX@yAl|m+0ZS-TC zKB8-YP-6K_a52N%(BmR>uEUI*e=6LG0=(HMmy%eeXEaR zoY9&9?&G7j49w0m1eoHYv76#I2cFaIQ7b(B@ZkbvO;`pIk12JH;rmfh@h2I?pT82? zGGkwQzA$#jVSD1FUU?kfn-4mMoo{M(c%@1rKWq#+RnCn8bt9*=B{f`jEM=AkOYPl0 zzthc+K^Z?>RR?7~AactfyE3{j|~|dqB=P&hA`HC#r#8=OPd^e}Mbn z?2VAy5snIdar4SQBQJ&VU4GhdesfG6GM2<|Qm&3hU)$6355`>OQ&LhqM+u)KBya%4 zQc$@ubV-*d6UQPa|Na=W%s;?H@^Gt(=W8En&6QnT3LV?#)>XZ|%jZX`XcfkZ1x)ZG zidutNw?b$b&bt72G3`i%yNkzO-KPch7k+dFGG^r-Q`=7y``WP`0iJ&Ipz6Y!^R7Rl zW62b*BnX(4|1NwqS6D^DG)^lp*MBmA7&{{CnFt&m4?xd{>`J-K^z`&-t_CvkD%GdD zySSMUe?KQC^sOc*C*8j)(5g5&@kKS9zs4&Q=|&ib?{f9OXd9K~@N`LF7xVv{wn?C} zkf5@U^A&Q$uWK8mu9y7)h)B)YIC*Vx#6+w-=rHheTN^aIG*tMqluS$lC)%baMjC70D#vyTH<8U@G(-}YuBz>L(i3B6|l4RFp4%;dub~)KVnk+)Z z_){N{<{3AK%QbXI|Ke_F{4RI!K&pv?1ae(IJ?KDEs=?=8hl1iWdq{sJ8!*^GU1dp*2~iPxkW@qqHqZETW&FA zK@|;+#FP|zD*Wk8^V&ci1A{Y=O>>I@{GibN`}gP<%P+HPy?GJV)Z2uofu}lR8X%B3 zx8%cf3JV{jL}4sIjZe6w7qIcm@AZ&RdjtCncUk4blvPwBn?8QbX})m!0n|n{6BCB0 zU|_N6c<$Z1_tU#d-zp|121N<72V3k>4e2R6LmK)Ri-t@0#hm)=(IyQl5#?S+ciG#w zGmC2zKYv=cr-*U$v<3c%&__gfd^NS*XGhCKpk{nr+H{)TtKR$}ucTb@%Qa~C>D185 z?tW`#l37&jazR$CUD!MPu7~QeBeJhs4avz%tXfFu&by=@rIC`7l2`fpCloFvsi>); z3weaC0`}MY(L*mPO_*yibhEXIeCF4bcslG_Yl=Sk3){aQL17UGT5;vqBQ3|+7-m^B zm)d>r1S*dFjUiKZGoJxI#P<9CYX0GJcb?%{w02zzIhNBL%PcF1$`5mMSE)RoLYJTl zp?KY`9zVA@HzytmwNp3J@dTO|50p(@+SLs_$&7LLSw(s`6QS4BR?Iq5M@cA-}cX ztfK*&Y4A+)ngJ~d(9zN9T)let#d1|v)GczwbZu;@@qZ);_AU83&@O-p&z9^fwbKF- zf=LxexA}5oxhmlT(3GU4_evpf@1TfJIWSPBo;g@kLE#>#3RgXD_PoC8zB%Ial0!&? zpV${4dxE4Ar@+X9%Kp+vW|PU3lg1d9xQ0P~vkym$a$&7Y9xsTHE?YA#9$hGp{Gh{w zlG}eQ6Y#Pk9K!OExcBvE$8Y6ZoV$HOEO796@!5vO<3;Y?cGN5XA(NDr!{a74cfI<} z^z;&bO;5k%@OR06Bgt43?M*mzaDoris<(wdpp~}q3=P#c^PQv~S@-SLH_Tw)E6uR7 z_yhoNJqHqZh?2GSD=HcqAU+LZ#Kgr_uU$*o+nRX5eY~OhA6cZ63ga(N`nHqvvrZ&f zKEL>1vk74cH!VgUl)@$lj-V5=xX16i;CegqVJsV>_R>bA>2lxXY zo-LndS`R*!6V!Pr%&O&-dbrk`f=# zm)$+Pfa?A{{@hOZ^htS2pw05!9aT+D1K4F^{mZb)5`O=-H|gw$ zMsj%O73}fnQmj*+*OZaV0oDCxcM4`b-n^fpAC_L-UY(ws4d_Ufyip}M^<}`aY&%)n zr*Ki~*?HGz&eIN{Aw`WYxn@5AnJw{&JdQ@FrmCk$C9U2> zwE>h_CI~Q2g_FQ}@!}pkQ8dXI@aH4#g6E%wicwyY@Q`;_AMvp2^WWniKFokD_jY%0 zcd2%?oWvhirP8lx9Tj zxhYx9wb!qPLssY%u=1H}cs~X*J1CoXabP)jp?0ATpRr#Y7hp*w}idim2$B4J^;!fE!x z_bO+Ka~_dj=XpT=(NC0U+*lY6(K!%*p`I>dYSZsh@f5G_RKMB=b;sP>JCWOuOT+WiCKw8gw%UaVgFyt{_ zxUH=_-P_x%YH7(9-b$uBtP6S;AjFsNoB8+N5|HQLT|e#O z=68<=3;Q216I_FjuNL+SW_Ngac<5{4NjJj2Z0B)rir-l4kY2Jc^sOCz1C-RYN}N)= z&eNGd*KYYunDRx5x4s=>MHH@F;Rao|r^g3GT@m+R$~ea?Rqg;otPjZKT>nAEXkgxz zD_4vzFJ0@6b$eFNB1p%9VcF6Rt^p|K=~d%0BBk0Kk-6Xi*`#vr5YAY3CAbzu2=CE3 zP}VmQ2XPrb>;?JKy zS$&%*q1CHP3KtvGd4BQjkXpU%JI%cEi~{3QMZ;;I(SY+iiZ_L8(M2d^$~UVXD)Wnt zjJ!(1B-OLH`vF?yn|sR0!2WQ6k`&;v$+em8l%0dcs-*_+!$;+^LpY6B&z$Av?kc+n zIg<}kQU;F~WC7BOT|pqeTY)cJ-fxc0=I)E=cYJ&2n``y@<3*z1kTTpKoGMPdh{{|2 zhaaHz%IbCn4LfmXXUBWgYGLSYSf%36gmy}#w3?-XH~U+*dh(0Br2>-*cU4BB`xkrr z`oemjnFZ~8nN~fy;9HX8wF_&+6R^7>_T7sjuOSW*+TJ*+4Xot$!S0fn*GNwfB;i+a z7OdrE*+AfD=H#e!i`N_;>=v!J`xpRS@@;5nXmQ7`Bh}%P)1-joi8JzL6&v z^ciS-9wPSg@@#58gWp3fARnk_be|vfFNJO{DTxo*=&))t@qBT0q^*3nqJi}-C~ujS zmDhCp!%3KqZ+p}`?8-;mYC&wag8xIz`4^y19SRDH69t_?`~5-srkem0PX@F%<&&L3 z)GGsqdrse(7dAB=1)Ifh${Pm?38VXqK9%06#NRmkb=-|x+I!yKryAv(AR8znZMp?T zfjAaZW3GKnc~JC5XwL;ddcHs^oO00t|C?x8c{wjovSB^r0Lx5z*Hb3bjv3_OgoLcBHVbz8glHU4zwHRoU>oOY7(m01KKA~>bq0(m6Ty*L>b}E&~E69 z2M{_pyPXk!`o*vN7FyGBrOes8YM>|B5T-#)6pncH_V@GAUU$O~VI|)@nvWFEs#8Y8 z3B(io*==ZGPz)xyb`O0oXnMQ^B#d2U8I_flMFc}=IJ|#9C=_`yeBfjXB2>TOWOZj_ z(9Ub!ALW3~;@z3W?oFMq{rdJL(DG;UEBzpe44HO9_m~KN5DH|~j4PSaS$!nwU$j&U zN=r#!fH#I7F;iune=$?xlPS&7bT7C3YrOkCT9|yE`2EPSetB-_3IA-7{jPkQqn4uj zYuVlTQt$p^r~bmC>gK1z2&PK2^-P(tajCV+Ftg>9AUXSpPIsk-`$uX+Bg-Gor#nAA zv9~Ij%HSM2AQR<^R+Q8meyK!?_U@0XV{BKW#EB4R^*$$)7Yn4t4Fc@!WxWUEq(Ryv zeN~YDRFL^6h}&Vh_!-d)??TIEn~sMoHtt�MC;NdgRFH$Oqrj$*Ga%r`MqHi_T(+u{=7D_-zHl$+vMjK>I|XG^1fS@QusS`_sww-48y#_I0o z9v_XO=Hr(fLp^1ZyhhM?& zE&9}U_by~Vnf#po z^uQez0Ah7F*avjUP-oFPO^qmU1j>>3?-LJ<`a#Lj5BE#c%r2lr?w`R}E0+m-T{p-# z%E%jbTO@<0Fz=@307jY0jSBzm73^LNN(Sb39<09!a=yQP1|ug~COm_x?%?EjmD9ge zduTTE^(8@gIoUi<1Sma;=uf(jJxxggaVEhfAP{7U5|8N)@AN9?Ve#R%^F&B%MvRKm zQSPb+ks!HT0PoK6yXwgz3jHJ%E+az)oiz*P!$SejMwdvhC1HrbuC;lnQNsQVbr@-a zZAQb}o^XTevhQ3$#X0A%OPhQU<@4X{fP>WC9uH?83iy$JxMye5UP@=FY(xPtaKqUu zDk4Jr`0?ZCy!?P)oopaJ`|Gqo@Wp%Ds5K&0Cg584ncCgOD#7YZSLmU`N}PWxD;JVy zb~Sstp#6cTSEb*&qoxC_=_$1TtMvATb@Ul}44`%>Krt||MqoM_4}srbJIn;WsujwT z*t#)z*ZK%Tx;DZGB*&v4JTL_PPU6Be9Owe@qdWDN=xXc7xyB<{3q5Z{FNspV-EgT5V1w@%a zcbfDw7$9;P8|iBHH--gA>|QO9W(Wwmz346X2?Jum=GUi()BDkoF3NYSqoR&;N=Xg% zt=@cjTS@T>!=rK(V^wm+KR-pHScmb}1C;0E9BGY)f4 zWtSC3X^P)QGfL|8hHZjI8M@#HHl!>dP92BlAx)i2p8y-6UT>#a z;PzzOS%?HI)6f&ZjAB~tqfojl{jQf-6J-~XU%B$Rv(vSLM(f#yoD-*nSZ?;0dd}#W zR;3ABDORP&fT4_pQKDe#*Nl*>Lw`_2NG3 znbz;l>cGpR%16-Ypr4Ukp6jWNi{VqOS&BDrvquc*5wDuNs6xm*t%yMda3J4U1g0g#)+{B~J_ zBO<;*rt2Nv?ikROXo8|RT;bYZHZD4C(^qIZym-h!Pv77-7mQa|hwh+-ugz<7=7-m| zp$`;WpZ*JC!-~7U8$Tvr9YA&|kOx)8%d*`}JD~-m2DR7W%W%1~ZpzcA!~3J)vq)Cj zZI(%pV|espSNW>K)dVm?g)d0GeEBjFOh+C@M8ahsU=JBzmR z=+DCkWJ5SrKD#%8nyuUjn20$q;@TuDh0OD#I&|Tp3*0o+i>4;$yXSx0epwhGd$_mS zMpsb>1%Vg*T74G<_C9l^hprDnMzkkB5uG}+vHNB58JHHQV(_qdbuMTV0$zogS&gNO z7|7!hzC$<@6BAzP^Eup6E2zoIjsx*T1~dY9hex03`ixf|Y7H}AHnAA9{v6Lay*>d1 zi%rLT710??(bJ};CT>}PjlR?88J*SPXl3}v3aN`SGR8l6A2gE6a)WZ%#z2HHA>MHc z_i4O-v$AFc9z&diA`&^iyAu0DL=5lmgC)V##QdEbtA}l;1gtg}orrY=>W9$?NPPS_ z>}^bB#nF)!fpFC~J%=_QB|b}L8pEj9R^;}w#b3A9x`LWhX6JJA3XhvGP&x;}Gpm;l z(Y}5?AKZhJsEy_AA#{4llI)o0xOKVz=Ducu`yzJw`yF>5^5|xzt|p%jg8M%gfCWK8 zuzF2rs@=?P93B=6IXQVN5VHk2*^rw+N4ZxJ6Im`BT3%N-xD93yJy&FJvJ(uNJOu>> zDK%rvhg(WU=DQj=ayW7Xa%8_^r5C$;6Z`re0i?Rnf1ghoph6EEkxIy2up3>2$c%#gQtp0C^9ORmn%-PrJ{B zT)^+5UukA={XP4;1l+GzzH ztfuQT9RnQC`d$MfXXiHjr9iZXNtZiXUKTiY&~{SL)r;Tfpaz^AymW&Cyy0h>u;DQ{ zBR?r$A03KAXyX^`3Q#d}N9_D}7b;Bs;jD5wOjXuuwMZ)LWb9|5Csz~|d7;tl?PiT zkfzH0>EDA6_tA%-9(MH=aNVlT&IMV5fm`DQoM+CQx%t<9kIg#(^Rf__1==$T+P2pJ zP7fhjTHun^kB^T>W9-QZ_D{N67c=wj!$tq+ypz9vam%E?8R^^uluJ0YzPC|P+q=$p zxGH-ne{{8>Ccri8WzTgkLy`)Iq);x4-e>@L<`$Y^8wC5s^`W(-+_`)0i10Bmpg}R% zBXZ4cAlSsb#-MbhrluDCJ2Fu5%4Px>Ea$E_b|5t5<~GvFZ2zJ>3K90}?vQJ4N`+=wdt+Zde z)6A?|G`d>KNF^((zwRHT`O@Al8hQeGJ#K73_xb7BUb-W8Z5@@Wjsk)(@dTrUwpZoB z2_Vwa{Ah0r4Ilk_-H#T?%&ePARZ1p9ZVzYJXME6%r47 zT?B4Ecg`0ufZK0E3YI&qot>n^>(_(!*DC|+JGp;h!$v<1013q|{a>F5TOB?8Xp4*#!6z7X%OTie?50%?~bV-MZyh~J0=`Xq_!B!8h)*nYrUuKhZ#w~-BiVBgg8z75wj`m(l9;FW<|4q1 zQG%2NCaTr-Kb4<8hZC0*|kWqjI5GZiqE5jV~f$sR$-8~6jvGRfar|)sd>UG3r zAT#%(7RgfEcD5~CIc4xCi#YZ1w-*D*Gp_O$P!&;g?;dmyCRaVJSX(2f0#fA9&0VqD z3E;&ve5o$Q6@8Xo`tWl1-A{nZCJBe_jHFeb#C3$6q|)DUA|fKCS!t zx}qvr6dmV3J!D6g=O zy&6Bri`aJhwOz;jlfbX`-4GXXBKzl&j@QVk`5pKx?teU2L5L6)nA*Uod9DTg>62hF zR8UdWa0$)E&?|!d^2Kgixyy*^9Cpd6bm8Sv~R#4@X(zLxCS2N_-D^L?jR@J0?IJ- zSa3+8vf%zlL z!IFiojtO%_q@E2+FU7G~pXW+lTN*V-hZUep&Mk&E6t(FAbvkhgsq0yT4ju+H_)zc^ zlO}QNGVqdnP;;_?S2V+)CbM{ARBU7>Dzo z=v}gF7EH!T41SA$gwRo4ykVcD%T-j77MBdqwVS+-xs~2k;r(Xxcj5j|j&(thH^vzqhb1x5 zH8kV`_fsDu19T=(Z%H}tRpD5KMSrsIPl}IcL+6hyE%mG*BB6k@%cMV`CPd1c|1+-E z43HWv6gD=T)L545>EM-`-fhSTe6xxUA)z9!nb~QG3%M)sn zJ!?6eZ?9A;`5u5r-6z^_Sa885)biuaGUG-D99V0oFU2 zLeC1~E=j7mXAmHcOq!KmbLc&rjsYc80<>9sF;v;@3FgCy_{vBD zKICp?$A4f(`^P!&DiA&*^^YN4_%P@Oj*%;2Buu&Vc{w@cP%=UL%!;JbL-?CYY`z>F z|AX%;di;^+fFCwvuux!1fLBWB8F_VCg8QojSa$RvC7zSL1FHo?Ph%{k!7R$>KmJX{ ztiAnPFYP>B+VOgkU-$|2(QhZiFb~+rPK4cO0iZ_r_q18SB2>wynZrVJb|N{u$(^}3 z{rhdeuvitr{>3~-O-nl?pp?bpJ?HDCp83UEXTf+y=*wNAhe0wCFHkRfEMpG6lf69| z+z9}>$z}>f4nb)ZwE6=;aLoVk;W{d%L%|Wdk}9Nj;XYx@y_Do+QM;ph1(qQ+UW4nv z0EITYDONc-Iqrx1n@ z5^thUU%a+SH4CPt2397#OL1hMQQy+=y~Ib48t-mccw>xsFuy-}NimYxK;KXq@EV*- zr#RsuL~#5)a3-_8+9}Hw=A~WfPh3Zm`A}3nO-diEjjts)V8Be}>Q(Z$k_eXUDi|y~ zFK(tz4ZKo$WDOH(-|Vxo+)1Abobr>CT3hx`NxUC#M_VgitHG0&gYzNB7c8 z2R@`e_D%V11`8#aoc{ek{v{03plo9DbWsy*Kbm03wHg{@F5!@m9)3Yq{wM)PmbJl7 zJJksU&YjdI1u{J0h`j~ZpzgI^Kx*&7Z!Njc{K*INMC|FTy(DUZ^qwC;1v1@z_5aLC z&74QD80G)#UJ6a$uVo^6bih77>8gvQ*7D=;B|nwe6pAX<_D zURO6>>gC5{+wg|+ki{#fR458oPe_tBUC%G&7Q-*0kp&GNKM7JNhZ3{^DSibL3xfYd zUta~>F6YjjGdg2{|5J*6zD!Q)MG+*_BL^t>m4apAIwf!Y3`JXVkDGABETRL}n8>@Y z5l;>);qCxxfxjo-fCCNB!~lSWmgp1k&0K?ngO`Rm=vg)KXQkMqSMEh?{#9@4>R?<3 zCZ$E!eF$yxql<=dW>j}#@6o{2ya4*S08?wg=AhF|v0iYvRA|)>6Kg?I$r{-YKX+Oc z>w@v*@DQGG#sU&jgHofXr)Ob|AZIMLmd8q)k|%Un-iSRXl2fX|4vGj!|DeS| zig0XKS2JSM$raP$EaWW+V0`}ZVPiaEBo=~)ApRA}gtu|JdJUJtQec=kWsm?Vl0*mT zdEyf-^muUskFlhhXT1d0MD@mvjCUi8*fZh?Vo^9!3kFn}{&8?}Dg`m@iwOd^v!n-w zA8`V!oy}00L;2p~r5xnc`{P~z9x@B<;E93{Z@^CSB5Z8`*;(a-`@Kg(DaERJ0=&{cv|b5Jt?-=_6$14}r;1MSa~xgisSI zmm&#v7YDXa6tRHG-m+C$s&BC!@bNTQ`F&WhNsR78(*8PR1Mx+rD%7Bo-{dz*d zC=`5&Dqdbxz5?EZ{aiWLl#JY;ZrS8t}GE0oEOw@VLAP$CHT4hIXMV{rr1 zw6y#-?5E$uWi^2HU;rO#-z8x7$GV&lWDeZAQ6;&0`+};qHAiLfUC-tqE-o%Un2SuA zfC{7wN1~Q)QZ(T}j;M}duu9IXuwBjiv7~|79TZTdoMiDYE%OGg9k2;?<9T zQ<$|6ohXNC#Db9zV9DSA-E0Ad=QeMTp1!^;81R425PT@PzmCpN@2);Q?|KG9xQXYb z^shOy+I46G=@$LSty*EKc+lmClcQq-u%w<=WGJ#kO+xKo!6bCoMH!L$^#-h(R_*DV z+y1QpSokSP8y_Q~>=Q6G+Y0s{u|rKIZvqYsAtns(WU)6`%{ftT(4;i#4WbTjywN*S z>qUu0m6y#WbhODfl{=IICR*t^2xWF6xt?|H@5ARrB;(bon_mzYH;}x&{CsNK(9n=C zGBVPZzn6tkL|)=mBwoENnA^}2kWy=IY@E~7+-^s+v^i5#q{i4OX3PU&yoN`a|MmnrYpMmkf^)$;IvcK^co}UkK#S?d@-`oe(~(W+1=H#>SSA zChg-GXz;gphi~154UdIFh(ahhh-}Zz(J}Yiw{I`D-;W0F7Eq9r-$)#(y+w)b;Qdut zwfJp675wDJ3*#pVIqhBQ-H5~RSd;^Aqc)!O0KmJ~c)Xt+;@JTNaR+qU-YEeNoo`h> zu6#1}MB`-i;X;z3D$At7hYP?|xUc=b+TQslH&+LUqJnQKwg;cDm)gcGE`e8cB+E3E z(Al1FN3mhTXX*X)>5V|n72PRcj>35}E+k%rh7;r{vC4E<{MVAiRA0qZVtuvmy zumh^6I>p7rz~IdDxLuVThl+>>{>a(y-TYfP-}b3JJh+2esBB|Nr=I*O4YETuciAd5 zlksbYQixR;kp&02*}!m6Wl#`gPTP_Fr(Bq=%m%Q{B+Sk_wx>&a{*I%drL}vyLe;=3 zMqz3j7WC1^ufiACySlm!BJD*u0uZ5)5X=WC@Zm2 zHM+04DFrha*3Bce?L+Q`(6@aa- z3d097!b6$H|83HH-9XPoFJ*>$K@7AF}=!p94Fa1<~IGH^CaK}ZZikd4M7B19j)u-Mc> zKNJUMCyb|m0~@itIeT?RSp`cO{@C5^xFm}^r!1@q1?+gjOy1%4D2T(SZ;xSUBJhi!YKfZ=OB-{HV#aOG zf8ZyopC0UVU2W#3p}dT6U@k9viC1pAcHm(-kmBHhw*qnHvM_y>j)%RcKp|)H{3L1p zEyDP*2M^9*Soqk9o(pu@I=hwalkXMGrfXaD9*&aA0aD*<0mdk;B6{>B;e{nf!v^cNe zY}s-8``YM}w)3xad^+-nz;>s@+jXzB^4hbWn7||6Bzk#Cw9MvE;8a z2_Aq4W};+^jh+0tfVTZ^qrsmq90(!Yw&Ky1a34IuLqZxq2}vErQMl>Pa215?sh~_e zvRjVsK!Kk@4!EI$<#9$CriIeZq906!F5u;&R~=Gj@6{cf-?h^>xTIBO&b59&E>b7( z)zMjgELVKTkuyq=;QZ?-Y2$WqSQ;*pR$DZ>ZWwMEQXruU^m=ypzS5VXN4rT>s|w}8 z=$4td6EWCihU?Sg5f=WTIBAh+$qz?wI=gjs2w}x55I1moNZd2rWY2Ko0+TcR^4Ti_ zh8Uv>+rT^K&-Yjh0x>sI(}XXAo&$dLH(VGxb;`EF;1I5;^~V1OK|5Wr%PI#J>SwG~Z$&Ej7*Qg{kvrgD+TqN8G6Bs*=>gS~&CA%hQTy2~A9IX9*?h8_-yZk{4x zP->#LJUQM1pLB*>@}9Cqve>|gZ%Y6^7UqfD^6w{N^(l4c4-rJs#wYthVRFzEv#bIR z66R@r%E&$hBV`x+RZ7JB-D1&50$_3GRD$zWMs>KnBkM$te53<CAh%hinvriUopI zIS?&|hRqHW8EzO&U|=}M%&;L=fsrBFQfLk*!#6IVvB{1z8E&Wp<@(qdHn;=jWcV2p z>VYo$R^Viz#E`=Wv~GEe6XOO$pxkaNO&QSy{~N*}_1sIDzBT^^I{3i}h7ICxSb=US z>*IaSc7tsj$myG%H#X=da05*$E3LC|NVv-k)Wj$Fl8PDnrA{h9Te9LSalg{Ri&UlRwKa^r5`<28}q zYgBUeL5~;sN9K_uD_(7!b8cq=NqcFpaVxaj9Ow5c;mLM|~3IrTx7=whGxEtFl z89+iDHx&#PMuWwsxiU%p0xmmXP*7xGvIE-3;K?ZPh7ss{4=&(octCGB1TnBwgVau9 zp2XZ_15$EB)luO9$X^YvlUSRqKtc=*Gdh4LgE62V&&L4t4G<*w{gd}7>t_A>?Y=#T N@9FC2vd$@?2>{9{pB4ZB diff --git a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang b/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang deleted file mode 100644 index 21cf0a86..00000000 --- a/src/main/resources/assets/bloodmagicguide/lang/de_DE.lang +++ /dev/null @@ -1,288 +0,0 @@ -# Book Information -guide.bloodmagic.title=Sanguine Scientiem -guide.bloodmagic.display=Sanguine Scientiem -guide.bloodmagic.author=Blood Magic -guide.bloodmagic.welcome=Blood Magic - -# Page Information -guide.bloodmagic.page.bloodAltar=Blutaltar Rezept -guide.bloodmagic.page.soulForge=Höllenfeuerschmiede Rezept -guide.bloodmagic.page.tier=Ausbaustufe: %d -guide.bloodmagic.page.lp=LP: %d -guide.bloodmagic.page.minimumWill=Minimaler Wille: %f -guide.bloodmagic.page.drainedWill=Verbrauchter Wille: %f -guide.bloodmagic.shapelessOrb=Formloses Blutkugel-Rezept -guide.bloodmagic.shapedOrb=Striktes Orb-Rezept -guide.bloodmagic.page.alchemyArray=Alchemische Anordnung - - -# Categories -guide.bloodmagic.category.architect=Der Architekt -guide.bloodmagic.category.ritual=Der Ritualmeister -guide.bloodmagic.category.demon=Das Dämonenkind -guide.bloodmagic.category.spell=Der Kriegsmagier -guide.bloodmagic.category.alchemy=Der Alchemist - -# Ritual Master Entries -guide.bloodmagic.entry.ritual.intro=Einführung -guide.bloodmagic.entry.ritual.basics=Grundlagen der Ritualmagie -guide.bloodmagic.entry.ritual.ritualStone=Ritualsteine -guide.bloodmagic.entry.ritual.masterRitualStone=Haupt-Ritualstein -guide.bloodmagic.entry.ritual.activationCrystal=Aktivierungskristalle -guide.bloodmagic.entry.ritual.diviner=Die Ritualrute -guide.bloodmagic.entry.ritual.fullSpring=Ritual der vollen Quelle -guide.bloodmagic.entry.ritual.lava=Gesang des Nethers -guide.bloodmagic.entry.ritual.greenGrove=Ritual des grünen Hains -guide.bloodmagic.entry.ritual.magnetism=Ritual des Magnetismus -guide.bloodmagic.entry.ritual.crusher=Ritual des Brechers -guide.bloodmagic.entry.ritual.highJump=Ritual des hohen Sprungs -guide.bloodmagic.entry.ritual.speed=Ritual der Geschwindigkeit -guide.bloodmagic.entry.ritual.wellOfSuffering=Quelle des Leidens -guide.bloodmagic.entry.ritual.featheredKnife=Ritual der gefederten Klinge -guide.bloodmagic.entry.ritual.regen=Ritual der Regeneration -guide.bloodmagic.entry.ritual.harvest=Ritual der Mondernte -guide.bloodmagic.entry.ritual.interdiction=Ritual der Verbietung -guide.bloodmagic.entry.ritual.containment=Ritual der Eindämmung -guide.bloodmagic.entry.ritual.suppression=Kuppel der Unterdrückung -guide.bloodmagic.entry.ritual.expulsion=Aura der Vertreibung -guide.bloodmagic.entry.ritual.zephyr=Ruf des Zephyrs -guide.bloodmagic.entry.ritual.laying=Füllung der Grube -guide.bloodmagic.entry.ritual.timberman=Kahlschlag des Holzfällers -guide.bloodmagic.entry.ritual.meteor=Zeichen des fallenden Turms -guide.bloodmagic.entry.ritual.downgrade=Sühne der belasteten Seele -guide.bloodmagic.entry.ritual.crystalSplit=Resonanz des facettierten Kristalls -guide.bloodmagic.entry.ritual.portal=Das Tor der Faltung (Englisch) -guide.bloodmagic.entry.ritual.altarBuilder=Die Zusammensetzung des hohen Altars (Englisch) -guide.bloodmagic.entry.ritual.pump=Die Hymne des Siphonierens (Englisch) -guide.bloodmagic.entry.ritual.cobble=Der gefrorene Vulkan (Englisch) -guide.bloodmagic.entry.ritual.ellipsoid=Fokus des Ellipsoids (Englisch) -guide.bloodmagic.entry.ritual.crystalHarvest=Bruch des frakturierten Kristalls (Englisch) -guide.bloodmagic.entry.ritual.forsakenSoul=Versammlung der verlassenen Seelen (Englisch) -guide.bloodmagic.entry.ritual.animalGrowth=Ritual des Schäfers (Englisch) -guide.bloodmagic.entry.ritual.livingEvolution=Ritual der lebenden Evolution (Englisch) -guide.bloodmagic.entry.ritual.upgradeRemove=Ritual der reinigenden Seele (Englisch) -guide.bloodmagic.entry.ritual.fullStomach=Ritual des gesättigten Magens (Englisch) -guide.bloodmagic.entry.ritual.eternalSoul=Ritual der ewigen Seele (Englisch) -guide.bloodmagic.entry.ritual.condor=Anbetung des Condors (Englisch) -guide.bloodmagic.entry.ritual.featheredEarth=Ritual der gefederten Erde (Englisch) -guide.bloodmagic.entry.ritual.grounding=Ritual der Erdung (Englisch) -guide.bloodmagic.entry.ritual.veilOfEvil=Schleier des Bösen (Englisch) -guide.bloodmagic.entry.ritual.wardOfSacrosanctity=Schutz der Unantastbarkeit (Englisch) - -# Ritual Master Entry Text -guide.bloodmagic.entry.ritual.intro.info=Guten Abend. Mein Name ist Magus Arcana. Ich habe über die Jahre viele Gestalten angenommen: ein Dieb und ein Wächter, ein Zauberer und ein Krieger, ein umherwandernder Nomade und sogar ein Politiker. Der Titel, den ich dieser Tage trage ist einer, der sich dem Verständnis der meisten Leute entzieht, bei dessen bloßer Erwähnung Bilder von Brutalität hervorkommen, welche in manchen Fällen wohl verdient, in vielen anderen jedoch schlicht fehlgeleitet sind. Natürlich rede ich davon, ein Blutmagier zu sein, doch meine Freunde nennen mich einfach Magus, während meine Feine mich als den Ritualmeister bezeichnen.\n\tMeine Schüler bedrängen mich nun schon seit Monaten, versuchen mich zu überzeugen, dass ich all meine Abenteuer niederschreibe, in die ich verwickelt war, um sie unter den aufstrebenden Magiern zu verteilen. Ich hatte mich geweigert, aber Tiberius hat es am besten in Worte gefasst: "Auch wenn du selbst nicht den Wert darin sehen kannst, ist es für spätere Generationen doch unbezahlbar, die Feinheiten eines Handwerks von jemanden zu hören, der dieses gemeistert hat. Es spielt keine Rolle wie genau es jemand anderes wiedergibt, wenn man nicht absolutes Vertrauen in die Quelle hat, könnte der Goldsand auch nichts weiter als Schwefel sein." Man konnte sehen, dass er sich zu der Zeit ein wenig mit Alchemie beschäftigt hat, aber da er seit langer Zeit mein erster Student war, tendiere ich dazu, seine Meinung zu respektieren.\n\tNun denn, angehender Blutmagier, der du das Arkane studierst, dass viele noch nicht vollständig begreifen, leihe mir deine Aufmerksamkeit für diese Worte, die es wert sind, befolgt zu werden: das Gebiet, dass du studierst hat viele Aspekte und ohne wohl überlegte Planung wirst du deine Werkzeuge als unzureichend empfinden. Deswegen solltest du sicher stellen, dass du dieses Buch oft zu rate ziehst - Ich habe einen Folianten mit vielen Verzauberungen versehen, sodass es, wann auch immer ich etwas in meiner Meister-Kopie schreiben sollte, sich die Worte für dich verändern werden.\n\tNun lehne dich zurück, entspanne dich und genieße die Lehren eines sehr alten Mannes. Du mögest mehr lernen, als du erhofft hast. -guide.bloodmagic.entry.ritual.basics.info=Moderne Rituale sind sehr verschieden von denen, die vor Jahrtausenden durchgeführt wurden. Es gab eine Zeit, in der die Leute Arkane Konstrukte aus Staub in den Boden zeichnen und so lange darum tanzen würden, bis sie bekommen haben, was sie wollten. Ich Erinnere mich sogar an eine Kräuterhexe, die Energie aus ihrem Garten gezogen hat. Ich habe sie ausgelacht, bis sie ihre Eule auf mich hetzte. \n\tDie Rituale, die Blutmagier nutzen benötigen die genaue Anordnung von gezeichneten Steinen, um vom Magier hineingepumpte Energie zu fokussieren und transformieren. Eines Tages wühlte mein Lehrling Tiberius durch meine alten Artefakte, die ich über die Jahre beschafft hatte und seitdem im Kleiderschrank seines nun neuen Zimmers lagen. Dort war eine Phiole flüssigem Etheriums, die ich seit Jahren nicht angefasst habe (Ich wollte darauf zurückkommen, allerdings hatte ich leider keine Zeit), sowie eine Kristallkugel, welche scheinbar immer "Dienstag" sagt, wenn man durch sie blickt. Als eine der Kisten mit der Aufschrift "Runenstaub" umgestoßen wurde, ist ein kleiner roter Edelstein herausgefallen und gegen Tiberius Fuß gestoßen. Sofort strahlte der Stein in einem grellen, rubinroten Licht das mit dem Staub in der Truhe, die er trug, reagierte.\n\tSelbstverständlich verursachte das eine Explosion. Die unfokussierte Energie, die Tiberius unvermeidbar durch den Edelstein freigesetzt hat, sprühte Funken auf den runischen Staub und die Steine um ihn herum und ohne eine Möglichkeit, die Energie einzudämmen, hat sie sich einfach ausgedehnt. Nach ein paar Tagen auf der Krankenstation begannen Tiberius und ich zu arbeiten. Durch eine Mischung aus mehreren schlaflosen Nächten und einer kräftigen Portion Koffein (ich muss mich wirklich bei Herr Spieler für die Kaffeeversorgung bedanken, ich begrüße Ihre Bemühungen für ein wacheres Morgen! Durch unser Experimentieren lernten wir, dass wir vier verschiedene Dinge brauchten: Wir brauchten einen Haufen Ritualsteine, die in einem bestimmten Muster um einen Bereich gelegt wurden, ein paar verschiedene Tinten, die auf die Ritualsteine aufgetragen wurden, um das Muster weiter zu spezifizieren, einen zentralen Ritualstein, der als zentraler Kraftkanal fungiert, und einen Kristall, der das Ritual aktiviert. Ich denke, es ist das Beste, wenn wir nacheinander darüber reden. -guide.bloodmagic.entry.ritual.ritualStone.info.1=Der Ritualstein dient als einfaches Behältnis für magische Energie, formt sie und leitet sie je nach Konfiguration des Steins weiter. Wenn du anfängst, gibt es fünf verschiedene Steine, zu denen du Zugang hast: Leer (der Grundstein ohne Markierungen), Wasser, Feuer, Luft und Erde. Jedes einzelne Ritual wird eine Reihe davon haben, und je nachdem, wie sie um den Meisterritualstein herum angeordnet sind, wird die Gesamtwirkung unterschiedlich sein. -guide.bloodmagic.entry.ritual.ritualStone.info.2=Um die richtigen Symbole auf die Ritualsteine zu schreiben, benötigst du einen Satz Beschriftungswerkzeuge. Seitdem habe ich eine Methode entwickelt, mit der man die richtigen Farben leichter auf die Ritualsteine auftragen und sie in die richtige Konfiguration bringen kann, aber wenn man dies manuell tun möchte, kann man diese Werkzeuge benutzen. Wenn du einen Ritualstein mit einem der Beschriftungswerkzeuge in der Hand aktivierst (Rechtsklick auf den Stein), tragst du etwas Tinte auf den Stein auf und änderst ihn in den gleichen Typ wie das Werkzeug. In den frühen Stufen habst du nur Zugang zu den vier Grundfarben, aber wenn Sie stärker werden, stehen dir mehr Werkzeuge zur Verfügung. -guide.bloodmagic.entry.ritual.masterRitualStone.info=Wie bei den meisten Arten der Magie wird die Wirkung des Rituals ohne eine leitende Kraft entweder unkontrollierbar werden oder einfach nicht funktionieren. Um die Rituale zu kontrollieren, ist also ein Haupt-Ritualstein erforderlich (ich kürze dies in meinen Notizen normalerweise mit "HRS" ab, aber es in der Öffentlichkeit zu sagen, ist etwas unangenehm. "Ich brauche mehr HRS bitte!"). Der HRS nimmt die Macht aus dem LP-Netzwerk des Besitzers auf und treibt sie durch die Ritualsteine und führt so das Ritual durch. Das LP-Netzwerk an einen großen Stein zu binden, den wir nicht in unseren Händen halten, erwies sich als etwas knifflig. Ich habe es einmal geschafft, indem ich auf den Stein in der Lotusstellung meditierte, meine Kraft durch den Stein konzentrierte und versuchte, die Ranken meines Netzwerks mit dem Inneren des Rituals zu verbinden. Obwohl ich es für ein paar Minuten zum Laufen gebracht habe, war alles, was mir wirklich zugesprochen wurde, eine nasse Hose, da sich Wasser auf den Ritualsteinen verdichtete. Ich habe gelernt, über keines meiner Experimente mehr zu meditieren. -guide.bloodmagic.entry.ritual.activationCrystal.info.1=Anstatt eine Stunde lang zu warten, um das Ritual durch meditieren zu aktivieren, nahmen wir den roten Edelstein, der ursprünglich aus der Schachtel fiel, und begannen ihn zu analysieren. Tiberius war sich sicher, dass er die Fähigkeit hatte, "Verbindungen zwischen dem körperlichen Bereich unserer Realität und der unkörperlichen Essenz, die das manifestierte LP-Netzwerk ist, herzustellen". Manchmal frage ich mich, ob es eine gute Idee war, ihn zu meinem Lehrling zu machen, aber in Zeiten wie diesen sehe ich sein Talent für die arkaneren Aspekte der Magie. Oh, ich sollte wohl schreiben, was er auf Deutsch meinte: Indem wir diesen Kristall benutzen, könnten wir unsere LP-Netzwerke mit dem Haupt-Ritualstein verbinden, um ihn mit Energie zu versorgen. -guide.bloodmagic.entry.ritual.activationCrystal.info.2=So hatten wir einen schwachen Aktivierungskristall und ein Mittel, um seine Struktur wiederherzustellen. Der Hauptbestandteil des Kristalls ist ein weiterer Kristall, der mit meinem LP-Netzwerk verbunden werden kann: ein Lavakristall. Dann kann der Blutaltar, indem er schnell einige Anweisungen auf die Oberfläche des Kristalls schreibt, den Rest der Arbeit erledigen, um ihn in einen Aktivierungskristall umzuwandeln. Natürlich muss dieser Kristall an das LP-Netzwerk des Benutzers gebunden sein, um zu funktionieren. Wenn die Steine des Rituals richtig um den HRS gelegt sind, sollte der Benutzer den Aktivierungskristall an den HRS berühren und genügend Energie ausstoßen, um das betreffende Ritual zu starten. Wenn du genug LP in deinem LP-Netzwerk hast, wird das Ritual aktiviert. Falls du nicht genug LP hast, oder die Steine nicht richtig ausgelegt sind, wird das Ritual einfach nicht aktiviert und es entstehen keine LP-Kosten. -guide.bloodmagic.entry.ritual.diviner.info.1=Nachdem ich die Größe und Auslegung vieler Rituale erkannt hatte, fand ich es etwas lästig, ständig meine Notizen zu konsultieren, um die Rituale aufzubauen. Deshalb habe ich daran gearbeitet, einen Apparat zu entwickeln, der es jedem erlaubt, die Steine durch einfache Gesten und Bewegungen einfach in die richtige Position zu bringen. Ich habe diesen Eintrag chronologisch weiter oben auf der Liste platziert, weil es für die Leute am besten ist, von diesem Gegenstand zu lernen, bevor sie mit der eigentlichen Konstruktion von Ritualen beginnen. Sonst finden sie vielleicht heraus, dass sie nicht alles haben, was sie brauchen, oder sie beschwören einen Meteoriten aus der Hölle statt einer frischen Flasche Quellwasser. -guide.bloodmagic.entry.ritual.diviner.info.2=Die Ritualrute ist im Wesentlichen eine Enzyklopädie für Rituale. Indem du durch die Rute blätterst (Shift-Linksklick und Shift-Rechtsklick), kannst du ein anderes Ritual aus seinem Wissensspeicher auswählen. Der Blick in die Ritualrute sagt dir auch einige einfache Informationen über das Ritual. Wenn du Ritualsteine bei dir trägst und den HRS mit der Ritualrute berührst (Rechtsklick), kannst du einen Stein für das Ritual platzieren, das du bauen willst. Wenn du das oft genug machst, wirst du ein vollendetes Ritual haben! -guide.bloodmagic.entry.ritual.fullSpring.info=Vor ein paar Jahren kam ein reisender Händler in das Dorf in der Nähe meines Hauses und verkaufte seine Waren an alle, die bereit waren, sich von ihrer Münze zu trennen. Zu dieser Zeit gab es eine Dürre und die Ernten starben, so dass der Händler einen silbernen Talisman mit einem blauen Edelstein in seinem Inneren hervorbrachte. "Das, meine Freunde", sagte er mit großem Eifer, "wird dafür sorgen, dass eure Flüsse nicht austrocknen! Mit Hilfe der Alchemie kann ich Wasser aus der Luft hervorbringen!" \n\tUnglücklicherweise für das Dorf schien es, dass der Edelstein ein einfaches Stück Saphir war, und bevor jemand merkte, dass sie ausgetrickst wurden, war er schon einige Meilen entfernt. Ich neige dazu, nicht in die Angelegenheiten des Dorfes einzugreifen, weil sie meine Magie nicht mögen, aber in diesem Fall habe ich eine Ausnahme gemacht. Nach einem netten Gespräch mit dem "Alchemisten" habe ich einige Stunden in der Nähe der Bewässerungskanäle meditiert. Durch die Kondensation des Wasserdampfes in der Luft gelang es mir, genügend Wasser zu erzeugen, um die Pflanzen bis zum nächsten Niederschlag zu bewässern. Das war nicht gerade eine effiziente Methode, und ich war für die nächsten Tage erschöpft, und ich benutzte etwas von dem Wasser aus dem Kanal, um mich zu rehydrieren. Durch die Zufuhr einer kleinen Energiemenge in das Ritual kondensiert es die Feuchtigkeit in der Luft um es herum, um eine Wasserquelle auf dem Haupt-Ritualstein zu erzeugen. Die Kosten für die Aktivierung des Rituals sind ziemlich gering, und der Unterhaltsaufwand ist umso geringer. Die Reichweite des Wassers kann durch den Einsatz des Ritual-Tüftlers erweitert und sogar an einem anderen Ort platziert werden, so dass man sich keine Gedanken darüber machen muss, wo ein Ritual platziert wird, wenn man sich um Ästhetik sorgt. Die Wunder der Magie! -guide.bloodmagic.entry.ritual.lava.info=Lava, vielleicht eine der rudimentärsten Energiequellen. Ich neige dazu, es nicht viel in meiner eigenen Forschung zu benutzen, weil es ein wenig schwierig sein kann, damit zu arbeiten - es ist nicht so, als ob man einen einfachen Eisenkübel benutzen könnte, um etwas aufzuheben! Einer der hiesigen Tüftler kam eines Tages bei mir vorbei und fragte mich, ob es irgendwelche Quellen in der Nähe gäbe, da er vor kurzem neue Ausrüstung gekauft hatte, für deren Betrieb Lava benötigt wird. Ich sagte, dass es einige gab, doch die meisten von ihnen waren bereits im Besitz, aber ich entschied mich, zu ihm zu kommen, um mir das Gerät anzusehen. \n\tEs war eine mindestens 5 Meter hohe und ebenso breite Schmelzanlage, die an mehrere Tanks angeschlossen war, die leer und karg standen. Obwohl ich mir nicht ganz sicher war, wie es funktioniert, konnte ich sagen, dass die rohe Hitze der Lava perfekt dafür sein würde - Elektrizität würde gut funktionieren, wenn sie richtig modifiziert würde, aber ich konnte erkennen, dass dies nicht von Immersive Industries war. \n\tNach einem kleinen Gespräch mit dem Tüftler wechselte das Geld den Besitzer und ich bat ihn, zurückzutreten, während ich meine Ritualsteine vorbereitete. Um das zu verwirklichen, was ich mir wünschte, nahm ich vier Feuersteine und legte sie in einem Kreuz um den Haupt-Ritualstein und schob sie dann mit meinem Aktivierungskristall fest, während ich mir den Vorgang in meinem Kopf vorstellte. In der Theorie sollte es einfach sein: Man nimmt einige Steine aus der Tiefe der Erde und komprimiert sie mit etwas Energie, wodurch sie unter dem starken Druck geschmolzen werden. Diese Lava könnte man aus dem Ritualstein herausholen und den Vorgang wiederholen. Für mein damaliges einfaches Netzwerk waren die Aktivierungskosten wegen des erforderlichen Anfangsdrucks ziemlich hoch, und der Abfluss für jede Lavaquelle war nicht etwas, auf das ich vorbereitet war. (20000 LP zu aktivieren, 500 LP pro Quellblock)\n\tIch taumelte mit einem Grinsen im Gesicht aus dem Gebäude: Die Tanks waren voller Lava, genug, um den Tüftler für ein paar Wochen im Geschäft zu halten, bis er sich eine dauerhaftere Lavaquelle beschaffen konnte. Ich habe allerdings dafür gesorgt, dass ich meine Ritualsteine wieder aufnehme, nachdem ich fertig war. \n\n------------------\n\tWenn keine Änderungen am Ritual vorgenommen werden, wird es versuchen, eine Quelle von Lava auf dem Block direkt über sich selbst zu platzieren, zu einem Preis von 500 LP pro Tick, wenn es Platz gibt, und Flüssigkeiten verdrängen, wenn sie fließen. Dieser Platzierungsbereich kann standardmäßig auf maximal 9 Blöcke in einem maximalen Abstand von 3 vom Ritual erweitert werden. Durch die Erweiterung des Rituals mit Rohem Willen werden die LP-Kosten im Verhältnis zu dem Willen, der sich in der Aura befindet, verringert, wobei der Verbrauch des Willens proportional zur Menge an LP ist, die eingespart wird. Die Verwendung dieses Willens kann außerdem die Fähigkeit verleihen, Lava direkt in das Innere eines Blocks zu bringen, wie zum Beispiel ein Tank, mit einer Rate, die mit normalen rituellen Operationen vergleichbar ist.\n\tKorrosiver Wille bewirkt, dass das Ritual Feuerimmunität umkehrt und alle Entitäten, die innerhalb eines bestimmten Bereichs gegen Feuer immun sind, gemäß der Menge an Willen in der Aura schwer beschädigt werden. Wenn Rachsüchtiger Wille auf das Ritual angewendet wird, wird ein flüchtiges Gas freigesetzt und bewirkt, dass alle Nicht-Spieler-Einheiten innerhalb seines spezifizierten Bereichs von Fire Fuse beeinflusst werden. Wenn der Timer des Schwächungszaubers auf 0 geht, wird das Wesen explodieren und sie mit explosiver Kraft in die Luft treiben. Zerstörerischer Wille erhöht die maximale Reichweite und Volumen, die das Ritual beeinflussen kann. Je mehr Wille Sie haben, desto mehr Lavablöcke können durch ein einziges Ritual gesetzt werden. Glücklicherweise entzieht das Ritual keinen Zerstörerischen Willen, aber wenn dein Wille fällt und die maximale Reichweite des Rituals geringer ist als die, auf die du es eingestellt hast, wird das Ritual überhaupt nicht funktionieren, bis es repariert ist. Letztlich gewährt Standhafter Wille allen Spielern innerhalb seiner Reichweite einen Feuerwiderstandsbuff, dessen Zeit und Willenskosten durch die Menge des Willens in der Aura beeinflusst werden. Vorsicht ist geboten, denn wenn du von Feuerresistenz betroffen bist, kannst du durch die korrosive Wirkung des Rituals beschädigt werden. -guide.bloodmagic.entry.ritual.greenGrove.info=Letzte Woche begann ich, Tiberius seine interdisziplinäre Magie beizubringen. Jeder Lehrling, den ich hatte, musste beim Erlernen der Blutmagie eine andere Form der Magie erlernen. Es spielt keine Rolle, welche sie wählen, solange sie nicht irgendeine Form von endlicher Ressource verbrauchen - ich habe eine Form der Magie des Ars-Clans aus dem fernen Osten verwendet, aber da die Quelle des Etheriums der Welt knapp wurde, ist sie längst ausgestorben. \n\tTiberius hat beschlossen, Thaumaturgie zu lernen, die die Magie der Welt benutzt, um deine Magie auszuführen. Dies ist ein gutes Gegengewicht zur Blutmagie, die die Magie des Lebens nutzt. Als solche verwenden diese Magien verschiedene Mittel, um die gleichen Aufgaben zu erfüllen. Um das zu demonstrieren, habe ich beschlossen, die Unterschiede zu Tiberius hervorzuheben, wenn es um das Wachstum der Pflanzen geht.\n\t Thaumaturgie benutzt einen Wachstumskatalysator, der von der Essentia Herba angetrieben wird," sage ich, während ich auf das Essentia Flussdiagramm zeige, das an der Klassenzimmerwand befestigt war. Sicher, Tiberius saß dort am einzigen Schreibtisch, aber manchmal muss ein Mann etwas Spaß haben. "Ein kleines Rinnsal von Aura und dieser Essenz stimuliert den photosynthetischen Prozess der Pflanze und ermutigt sie, durch mehr Sonnenenergie zu wachsen. Dieser Prozess erfordert, dass der Boden gut gedüngt ist, sonst kann die Ernte einfach verwelken und absterben.\n\tIch nehme nun vier Erd- und Wasserritualsteine und lege sie in einen Kreis um einen Haupt-Ritualstein. "Umgekehrt verwendet die Blutmagie einen anderen Prozess." Während ich spreche, aktiviere ich das Ritual und bedecke es mit einfachem Schmutz. "Indem man seine Lebenskraft oder die der Tiere nutzt, kann man die Pflanzen so düngen, dass sie nicht so viel Dünger benötigen. Im Wesentlichen ernährt es die Pflanzen, so dass sie immer eine hohe Konzentration an Nährstoffen haben."\n\tIch werfe ein paar Samen auf den Schmutz und bedecke sie leicht, entkorke und leere eine Ampulle mit Wasser aus meinem Gewand. "Dieser Prozess benötigt kein zusätzliches Sonnenlicht, da er eine andere Energiequelle nutzt. Obwohl es viel besser funktioniert, wenn es etwas Licht gibt - die Pflanze ist nicht gerade an diese Art von Bedingungen gewöhnt!"\n\tEin paar Triebe haben bereits ihre Blätter aus der Erde geschossen, während ich erklärt habe, scheinbar als Antwort winkend. Ich spürte die milde Belastung meines Körpers, als jedes neue Blatt sprießte, jedes Mal geringfügig, aber als es sich ansammelte, begann es sich zu sammeln. Als ich den Kurs beendet hatte, räumte ich den Dreck vom Experiment auf und beschloss, einen schönen Spaziergang ins Dorf zu machen: Ich hatte einen Scheffel Weizen, der verkauft werden musste. \n\t----------\n\tDas Ritual des Grünen Hains, wie der Name schon sagt, beschleunigt das Wachstum von Pflanzen, die in der Umgebung sind. Indem es das Blut des Spielers als reiches Düngemittel verwendet, wird es versuchen, alles zu züchten, was es als eine Pflanze betrachtet, wie Weizen und Karotten, und alles, was in seinem Bereich wächst, in regelmäßigen Abständen. Durch Standardoperationen wird das Ritual den 3x3-Bereich zwei Blöcke über sich selbst betrachten und versuchen, jeden Block mit einer Erfolgsrate von 30% pro Sekunde zu vergrößern. Wenn mit dem Ritual-Tüftler manipuliert, kann das Ritual maximal 81 Pflanzen gleichzeitig in einem Radius von 5 Blöcken um den HRS herum bearbeiten. Als weitere Anmerkung:\n\tWenn Dämonischer Wille ergänzt wird, gibt es mehrere Effekte, die erzielt werden können. Wenn Roher Wille verwendet wird, wird das Ritual alle Operationen mit einer beschleunigten Rate durchführen, wobei 0,05 Wille pro erfolgreichem Wachstum verbraucht wird und die Geschwindigkeit im Verhältnis dazu, wie viel Wille in der Aura ist, erhöht wird. \n\tWenn es mit Rachsüchtigem Willen angereichert wird, wird das Ritual 0,05 Wille pro erfolgreichem Wachstum verbrauchen und die Chance erhöhen, dass ein bestimmter operativer Tick auf der Pflanze erfolgreich sein wird. Standardmäßig ohne Willen ist es 30%%, wenn aber zum Beispiel 100 Rachsüchtiger Wille zur Verfügung steht, erhöht sich die Rate auf 80%%.\n\tZerstörerischer Wille erhöht die effektive maximale Reichweite des Rituals, was bedeutet, je mehr Wille du hast, desto mehr Ernten/Pflanzen kann ein einzelnes Ritual verarbeiten. Glücklicherweise entleert das Ritual keinen Zerstörerischen Willen, aber wenn dein Wille fällt und die maximale Reichweite des Rituals geringer ist als die, auf die du es eingestellt hast, wird das Ritual überhaupt nicht funktionieren, bis es wiederhergestellt ist.\n\tStandhafter Wille gewährt die Fähigkeit, einen Bereich um das Ritual herum festzulegen, der automatisch gepflügt und bewässert wird. Zusätzlich wird jedes Saatgut, das sich in diesem Bereich befindet, wenn möglich auf einem nahegelegenen Block gepflanzt. Das kostet eine kleine Menge von Standhaftem Willen, und seine Auswirkungen skalieren nicht mit Willen in der Aura.\n\tWenn korrosiver Wille im Ritual verwendet wird, kann sich die grundlegende Natur des Rituals verschieben. Wenn der neue Bereich richtig eingestellt ist, werden alle Mobs, die in den Einflussbereich des Rituals eintreten, mit dem "Blutegel"-Effekt versehen. Alle paar Ticks werden die Pflanzen in der Nähe der Mobs beschädigt und der Mob wird proportional beschädigt. Direktes Düngen mit Mobs kann sich als vorteilhaft erweisen! Alle 10 Sekunden, die der Schwächungszauber pro Mob angewendet wird, wird 0.2 korrosiver Wille verbraucht. -guide.bloodmagic.entry.ritual.magnetism.info=Das Ritual des Magnetismus ist das Brot und die Butter eines jeden, der Steinbrüche schätzt. Das Ritual erzeugt ein sich drehendes Magnetfeld, das die reichen Erze aus dem Boden unter ihm herauszieht und den Inhalt in seinem Bereich platziert. Dadurch wird kein Gestein verdrängt, so dass keine klaffenden Löcher im Land entstehen - vorausgesetzt, das Land besteht nicht nur aus Erz. Das Ritual funktioniert einmal alle 40 Ticks und kostet 50 LP pro erfolgreicher Operation. Der Standardradius dieses Rituals ist 3 Blöcke in jeder Kardinalrichtung, was eine Fläche von 7x7 Blöcken ergibt, die auf dem HRS zentriert ist. Da das Ritual derzeit keine Willensvergrößerungen hat, können Sie den Wirkungsradius für das Ritual nur erhöhen, indem Sie einen wertvollen Block direkt unter das MRS legen. Wird ein Eisenblock verwendet, wird der Radius 7. Wenn ein Goldblock verwendet wird, wird der Radius 15. Wenn schließlich ein Diamantblock verwendet wird, dehnt sich der Radius auf 31 aus, was bedeutet, dass alle Erze unterhalb des Rituals in einem 63x63 Bereich langsam in sein 3x3x3 Volumen über dem HRS gezogen werden. -guide.bloodmagic.entry.ritual.crusher.info=Das Ritual des Brechers ist ziemlich einfach. Das Ritual muss mit einer Art Inventar verbunden sein, das unverändert auf dem HRS sitzt. Während des Betriebs blickt das Ritual innerhalb seines Brechbereichs (standardmäßig der 3x3x3 Bereich unterhalb des Rituals) und bricht einen Block nach dem anderen alle 2 Sekunden zum Preis von 7 LP pro erfolgreicher Operation. Die zerbrochenen Blöcke werden dann in das verknüpfte Inventar übertragen - wenn es keinen Platz für die Gegenstände gibt, werden sie stattdessen auf die Truhe gespuckt.\n\tWenn es mit Rohem Willen versorgt ist, wird das Ritual schneller funktionieren, basierend auf der Gesamtmenge des Willens in der Aura. Während es beschleunigt wird, verbraucht es 0,05 Rohen Willen pro erfolgreicher Operation.\n\tZerstörerischer Wille bewirkt, dass Glück auf Blöcke angewendet wird, die durch das Ritual gebrochen werden. Derzeit variiert die Glücksstufe nicht und ist stattdessen Stufe 3, unabhängig von der Höhe des Willens. Das wird 0,2 Wille pro erfolgreicher Operation verbrauchen, unabhängig davon, ob es nützlich war oder nicht.\n\tStandhafter Wille wird stattdessen dazu führen, dass Blöcke mit dem Behutsamkeits-Effekt gebrochen werden. Das kostet 0,02 Will pro Operation und überschreibt den Effekt des Zerstörerischen Willens, wo immer es möglich ist.\n\tKorrosiver Wille bearbeitet Blöcke, die durch das Ritual gebrochen werden, mit irgendeiner Form von Schneidflüssigkeit. Das bedeutet, dass zum Beispiel, wenn es sich um einen Block Eisenerz handelt, das Ergebnis zwei Stücke Eisensand sind. Die aktuellen "Schneidflüssigkeiten", die das Ritual verwendet: Einfache Schneidelösung und Explosives Pulver. Das Ritual verbraucht eine andere Menge des Willens, basierend auf dem, was verwendet wurde, und wird den Willen nur verbrauchen, wenn der Effekt zutrifft. Dies überschreibt Behutsamkeit, wo es möglich ist. \n\tRachsüchtiger Wille bewirkt, dass bei einer erfolgreichen Operation der Inhalt des Inventars ähnlich dem Siegel der Kompression komprimiert wird: Wenn sich 65 Redstone-Staub in der Truhe befindet, wird ein Block von Redstone hergestellt und 56 Staub verbleiben. Der Wille wird nur verbraucht, wenn die Operation erfolgreich ist, und es kostet 0,2 Wille. -guide.bloodmagic.entry.ritual.highJump.info=Dieses Ritual nutzt einen gewaltigen Luftstoß, um all jene, die darauf laufen, in den Himmel zu katapultieren. Und wenn der Benutzer im Wirkungsbereich des Rituals landet, erleidet er keinen Fallschaden. Spieler, die sich in dieses Ritual einschleichen, sind nicht davon betroffen. Das Ritual kostet 5 LP pro Entität pro Tick erfolgreicher Operation, also wird es nichts kosten, wenn es keine Leute in die Luft wirft. -guide.bloodmagic.entry.ritual.speed.info=Wie der Name schon sagt, wird das Ritual der Geschwindigkeit für den Transport verschiedener Arten verwendet. Das Ritual kann in die Richtung einer der Himmelsrichtungen gelegt werden, und alle Entitäten innerhalb seiner Reichweite werden in die Richtung gestartet, in die das Ritual zeigt. Wenn man ein Ritual betrachtet, ist diese Richtung der Ort, an dem sich der Ritualstein der Abenddämmerung befindet. Standardmäßig hat das Ritual einen Radius von 2 Blöcken vom HRS, der jedoch bei Verwendung eines Ritual-Tüftlers erweitert oder verkleinert werden kann. Wenn das Ritual mit Rohem Willen getankt wird, wird die Geschwindigkeit des Rituals wesentlich erhöht, basierend auf dem Willen, der in der Aura ist. Zum Beispiel wird die Geschwindigkeit verdoppelt, wenn sich 100 Wille in der Aura befinden. Für jede erfolgreiche Operation wird 0,1 Wille verbraucht.\n\tRachsüchtiger Wille verhindert, dass das Ritual erwachsene Mobs bewegt, und Zerstörerischer Wille verhindert, dass das Ritual Kindermobs bewegt. Wenn einer von beiden verwendet wird, werden die Spieler auch daran gehindert, das Ritual anzuwenden. Wenn beide verwendet werden, ist der Effekt jedoch, dass nur Spieler das Ritual benutzen dürfen und Mobs nicht. Diese Augmentationen können effektiv zum Sortieren von Tierfarmen oder sogar zur Beseitigung der lästigen Kinderzombies in Ihrem Opferstall verwendet werden. Das Ritual wird 0,05 Wille für jeden Typ verbrauchen, der bei erfolgreicher Operation wirksam ist, also wenn ein Kind den rituellen Raum betritt, wenn Sie den Zerstörerischen Willen verwenden, wird es weder Wille noch LP kosten. -guide.bloodmagic.entry.ritual.wellOfSuffering.info=Für diejenigen unter euch, die es vorziehen, Mobs anstatt der eigenen Gesundheit zu benutzen, beschädigt die Quelle des Leidens alle lebenden Nichtspieler in einem Radius von 10 Blöcken und platziert die Gesundheit als LP in einen verbundenen Altar. Das Ritual sucht nach einem Blutaltar in seiner Reichweite, wobei 5 Blöcke horizontal und 10 Blöcke vertikal geprüft werden. Wenn es einen Altar findet, wird es seinen Standort intern speichern - wenn kein Altar in der Nähe ist, wird das Ritual nicht funktionieren. Das Ritual wird jeder Entität 1 HP Schaden und dem Altar 25 LP zufügen (100 für friedliche Tiere), was mit Opfer-Runen verstärkt werden kann. -guide.bloodmagic.entry.ritual.featheredKnife.info=Das Ritual der Federnden Klinge zapft den Körper des Benutzers an und lässt seine Lebenskraft abfließen, um einen Blutaltar in der Nähe zu füllen. Das Ritual sucht nach einem Blutaltar in seiner Reichweite, wobei 5 Blöcke horizontal und 10 Blöcke vertikal geprüft werden. Wenn es einen Altar findet, wird es seinen Standort intern speichern - wenn es keinen Altar in der Nähe gibt, wird das Ritual nicht funktionieren. Wenn ein Spieler dann in den Schadensbereich des Rituals eintritt, der standardmäßig einen Radius von 15 Blöcken horizontal und 20 Blöcken vertikal hat, wird das Ritual den Spieler für 1HP schädigen und dann diese Gesundheit direkt in den angeschlossenen Altar legen (unter Berücksichtigung von Blut-Runen). Es gibt einige Sicherheitsmechanismen auf dem Ritual, die dazu führen, sodass es bei einem Spieler mit weniger als 30%% seiner maximalen Gesundheit nicht funktioniert. Ohne Verstärkungen führt das Ritual jede Sekunde eine Operation durch.\n\t Es gibt ein paar nützliche Ergänzungen, die benutzt werden können, indem Dämonischer Wille verwendet wird. Wenn Roher Wille von dem Ritual verzehrt wird, wird das Ritual versuchen, Spieler innerhalb seiner Reichweite schneller zu schädigen, indem es zweimal pro Sekunde arbeitet. Das Ritual wird 0,05 Rohen Willen pro erfolgreicher Operation verbrauchen.\n\tWenn mehr als 10 Standhafter Wille in der Aura ist, so erhöht das Ritual seine Sicherheitsschwelle und funktioniert stattdessen nicht bei Spielern mit weniger als 70% Gesundheit. Dies verbraucht keinen Willen.\n\tWenn mehr als 10 Rachsüchtiger Wille in der Aura ist, wird das Ritual einige seiner Sicherheitseinschränkungen aufheben, was dazu führt, dass es bei Spielern funktioniert, bis sie nur noch 10%% ihrer maximalen Gesundheit haben. Wenn das Ritual auch Standhaften Willen hat, wird die Schwelle immer noch 70%% für den Besitzer des Rituals sein, nicht jedoch für andere Spieler. Diese Funktion verbraucht derzeit keinen Willen.\n\tWenn Zerstörerischer Wille auf das Ritual angewendet wird, wird das Ritual mit seiner HP-zu-LP-Umwandlung viel effizienter. Die Menge an LP, die dem Altar pro Lebenspunkt hinzugefügt wird, erhöht sich auf der Grundlage des Willens in der Aura, bis zu einem Maximum von +20%% für 100 Zerstörerischen Willen. Dieser Effekt stapelt sich multiplikativ mit Runen, Upgrades der Lebenden Rüstung und dem Bonus des Räucheraltars. Das verbraucht 0,05 Zerstörerischen Willen pro geopferter HP.\n\tWo wir bei Weihrauch sind: Wenn korrosiver Wille im Ritual verwendet wird, wird das Ritual die Wirkung des Räucheraltars auf dich respektieren. Wenn du nicht vom Soul Fray Debuff betroffen bist und du von einem Räucheraltar bevollmächtigt bist, wird das Ritual deine HP bis zur eingestellten Schwelle verbrauchen und die gesamte resultierende LP in den Altar pumpen. Es wird auch den Effekt des Weihrauchs von dir nehmen und dich mit Soul Fray belegen. Dieser Effekt stapelt sich mit dem des Zerstörerischen Willens. -guide.bloodmagic.entry.ritual.regen.info=Das Ritual der Regeneration ist wohl eines der besten Rituale für jeden potentiellen Blutmagier, der seine eigene Lebenskraft nutzen möchte, um seine Magie zu speisen, und wirft einen Schleier von Energie um sich herum, um Entitäten zu heilen, die sich in dessen Reichweite befinden. Alle 2,5 Sekunden wirft das Ritual Regeneration I auf lebende Wesen in seinem 15-Block-Radius und kostet 100 LP pro Spieler und 10 LP pro andere lebende Wesen für 2,5 Sekunden Regeneration.\n\tWenn korrosiver Wille benutzt wird, um das Ritual zu verstärken, wird ein zweiter, "vampirischer" Bereich verfügbar sein. Alle Nicht-Spieler-Einheiten in diesem Bereich werden zufällig beschädigt, um Spieler innerhalb des regulären Heilungsbereichs direkt zu heilen. Dies kostet 0,04 Wille zur Nutzung und überträgt 1HP pro operativem Tick. -guide.bloodmagic.entry.ritual.harvest.info=Dieses Ritual sucht jeden erntbaren Pflanzenblock innerhalb seiner Reichweite (Standard ist der 9x9x5 große Bereich über dem HRS) und versucht, ihn zu ernten, indem es alle Samen neu pflanzt, wenn die Pflanze Samen fallen lassen kann. Alle Gegenstände der Pflanze erscheinen dort, wo die Pflanze geerntet wurde. Das Ritual wird versuchen, Pflanzen einmal alle 5 Ticks zu ernten und wird 20 LP pro erfolgreicher Operation kosten.\n\tPflanzen, die geerntet werden können, sind unter anderem: Kürbisse, Weizen, Karotten, Kartoffeln, Netherwarzen, Kakteen, Zuckerrohr. Denke daran, dass das Ritual keine Annahmen über die Sache macht, die es erntet - Falls Pflanzen durch Mods hinzugefügt wurden, müssen diese einen harvesting handler mit der Mod registriert haben. -guide.bloodmagic.entry.ritual.interdiction.info=Basierend auf einem alten alchemistischen Mythos versucht das Ritual der Verbietung, alle Nicht-Spieler-Mobs gewaltsam aus dem Zentrum des Rituals zu entfernen. Standardmäßig werden alle Mobs, die sich innerhalb von zwei Blöcken des HRS befinden, durch Einstellen ihrer Geschwindigkeit vom HRS weggeschoben. Es ist zu beachten, dass Mobs in diesem Bereich nicht von Sturzschäden betroffen sind, aber dieses Sicherheitsnetz verschwindet, sobald sie weggeschoben werden. -guide.bloodmagic.entry.ritual.containment.info=Das Gegenteil von Verbietung, das Ritual der Eindämmung, versucht, Mobs in seinem Wirkungsbereich in den Raum über dem HRS zu ziehen und sie in der Luft aufzuhängen, wo sie sich nicht bewegen können. Der Standardbereich des Rituals ist ein horizontaler Radius von 3 Blöcken von der Unterseite des Hauptsteins bis zur Oberseite der obersten Runen, obwohl dieser Bereich natürlich geändert werden kann.\n\tDas Ritual kostet 1LP pro Mob, das jeden Tick gezogen wird. -guide.bloodmagic.entry.ritual.suppression.info=Die Kuppel der Verdrängung "verdrängt" alle Flüssigkeiten in einem bestimmten Radius, wodurch Flüssigkeiten in einer Halbkugel mit einem Radius von 10 Blöcken vorübergehend durch Luft ersetzt werden können. Wenn das Ritual abgeschaltet wird, kehrt diese Flüssigkeit in den Zustand zurück, in dem sie vorher war. Dies kostet 2LP pro Tick. -guide.bloodmagic.entry.ritual.expulsion.info=Wenn du auf einem Server spielst, kannst du mit einer Situation konfrontiert werden, in der du unerwünschte Spielerbesuche bekommst. Manchmal sind Kraftfelder und riesige blutige Rotoren nicht genug Abschreckung und sie schaffen es immer noch, in deine Basis zu gelangen. Wenn ein Spieler, der nicht der Besitzer ist, den Bereich des Rituals betritt (Standard 12 Blöcke Radius), teleportiert das Ritual den Spieler zufällig innerhalb eines Radius von 100 Blöcken. Wenn es allerdings eine Truhe auf dem HRS mit einem gebundenen Gegenstand des Spielers gibt, wird dieser Spieler von der Teleportation ausgenommen und es verhält sich effektiv wie eine weiße Liste.\n\tDas Ritual kostet 2000LP für jede erfolgrreiche Teleportation. -guide.bloodmagic.entry.ritual.zephyr.info=Nach dem Vorbild eines alten Schwerts aus Legenden nutzt der Ruf des Zephyr die Kraft des Windes, um die Gegenstände, die sich um ihn herum befinden, zu sammeln und sie in die verbundene Truhe zu legen (Standard ist direkt über dem HRS). Dies geschieht sofort, was bedeutet, dass die Gegenstände direkt in das Inventar teleportiert werden - kein Grund zur Sorge um seltsame Sog-Effekte!\n\tDer standardmäßige Gegenstandsradius ist 5 Blöcke um den HRS. -guide.bloodmagic.entry.ritual.laying.info=Wie viele wissen, kann das Platzieren von Blöcken bei verschiedenen Automatisierungsaufgaben wichtig sein. Dieses Ritual nimmt die Gegenstände/Blöcke aus der verbundenen Truhe (standardmäßig auf der Oberseite des HRS) und platziert die Blöcke innerhalb des Rituals, das einen Radius von 2 auf der gleichen Ebene wie das MRS hat. Dies kann nützlich sein, wenn Sie versuchen, Setzlinge für eine Baumfarm auszulegen oder wenn es andere Blöcke gibt, die platziert werden müssen. Das Ritual verbraucht 50 LP pro erfolgreicher Operation. -guide.bloodmagic.entry.ritual.timberman.info=Hast du genug Holz? Dieses Ritual hält dich bedeckt. Der Kahlschlag des Holzfällers hält eine spektrale Entität fest, die die LP des Besitzers benutzt, um die Blätter und Stämme aller Bäume in ihrem Bereich zu sammeln und die Erträge in die verbundene Truhe zu platzieren. Es wird versucht, alle "Bäume" in einem horizontalen Radius von 10 Blöcken und bis zu 30 Blöcken über dem HRS (standardmäßig) zu finden und 10LP pro gefälltem Block zu verwenden. -guide.bloodmagic.entry.ritual.meteor.info=In jeder Hinsicht ist dies eines der mächtigsten Rituale im Spiel. Die Aktivierung kostet eine Million LP und kann nur einmal verwendet werden, bevor sie wieder aktiviert werden muss. Das Ritual, sobald bestimmte Opfer gebracht werden, zieht einen Meteor aus dem Weltraum und lässt ihn zu Boden stürzen, was zu einer großen Explosion führt, sobald er auf etwas Festes trifft. Weil diese Meteore nicht aus der Ãœberwelt sind, können sie eine reiche Erzdichte enthalten, die es sonst nirgendwo gibt. Dies ist durch das Modpack oder den Benutzer konfigurierbar. -guide.bloodmagic.entry.ritual.downgrade.info=Um mehr Macht zu erlangen, muss man manchmal etwas dafür opfern. Die Buße der belasteten Seele tut genau das - indem man einem unsichtbaren Wesen ein paar Gegenstände opfert, kann die Wirksamkeit eines Aspekts der Lebenden Rüstung verringert und eine Erhöhung der Anzahl der Upgrade-Punkte als Ausgleich erhalten werden. Wenn das das Ritual konstruiert wird, muss eine Gegenstandsrahmen an den obersten leeren Ritualstein gehängt werden, der dem Haupt-Ritualstein zugewandt ist, und eine Art Inventar (siehe: Truhe) auf dem Ritualstein der Abenddämmerung platziert werden. Um eine Herabstufung der lebenden Rüstung zu erhalten, muss zunächst der Schlüsselgegenstand in den Gegenstandsrahmen und die Verbrauchsmaterialien in die Truhe gelegt werden. Sobald das Ritual aktiviert ist, kannst du jederzeit auf dem Haupt-ritualstein schleichen und die Herabstufung erwerben.\n\tIm Falle der Herabstufung der abgeschreckten lebenden Rüstung ist ihr Kernstück eine Wasserflasche (im Gegenstandsrahmen platziert) und das Rezept ist Drachenatem (in der Truhe platziert). Um das Rezept für die Herabstufungen zu sehen, kannst du sie in JEI nachschlagen - überprüfe die Verwendung des Haupt-Ritualsteins und du wirst die Rezepte für Sühne (Ritual) sehen. Das Rezept für die maximale Herabstufung kann auch einfach in JEI überprüft und dann die Verwendung des Schlüsselgegenstands überprüfen - dieser ist immer der gleiche für die spezifische Herabstufung. -guide.bloodmagic.entry.ritual.crystalSplit.info=Sobald sich der Dämonische Wille herauskristallisiert hat, gibt es keine Möglichkeit, ihn in seine vielen Aspekte aufzuteilen - so habe ich bisher gedacht. Die "Resonanz des facettierten Kristalls" arbeitet, indem sie die vielen Aspekte innerhalb einer aspektlosen (oder rohen) Kristallgruppe unter Verwendung der verschiedenen elementaren Ritualsteine trennt. Um das Ritual nutzen zu können, muss eine aspektlose Kristallgruppe zwei Blöcke über dem Haupt-Ritualstein platziert werden. Mit anderen Worten: Es kann ein Kristallisierer auf dem HRS und eine Kristallgruppe darauf platziert werden und es sollte gut funktionieren. Als nächstes müssen Sie sicherstellen, dass es keine Blöcke direkt über den vier elementaren Ritualsteinen gibt, und dann warten, bis die Kristallgruppe wächst.\n\tNachdem insgesamt fünf oder mehr Spitzen gewachsen sind, wird das Ritual diese Spitzen abspalten und jeweils eine Spitze aus Korrosivem, Standhaftem, Rachsüchtigem und Zerstörerischem Willen auf den elementaren Ritualsteinen erschaffen. Wenn die aspektlose Kristallgruppe weiter wachsen darf und diese neuen Kristalle intakt bleiben, wird der Prozess wiederholt und es werden weitere Türme hinzugefügt.\n\tDer Mechanismus für diesen Prozess ist ganz einfach. Wenn der Rohe Kristall dämonischen Willens mindestens fünf Spitzen hat, bricht das Ritual vier dieser Spitzen ab und verwandelt den Willen in seine unkörperlichere Form. Dieser Wille wird dann in den letzten Turm des Clusters geworfen, was die verschiedenen Aspekte des Willens in lokalisierte Klumpen des jeweiligen Aspekts zwingt. Dieser Wille wird dann in den rituellen Steinen gesammelt, die als Grundlage dienen, auf der die neuen, aspektierten Kristallgruppen wachsen können. - -# Architect Entries -guide.bloodmagic.entry.architect.intro=Vorwort -guide.bloodmagic.entry.architect.bloodaltar=Der Blutaltar -guide.bloodmagic.entry.architect.ash=Arkane Asche -guide.bloodmagic.entry.architect.divination=Wahrheitssiegel -guide.bloodmagic.entry.architect.soulnetwork=Seelennetzwerk -guide.bloodmagic.entry.architect.weakorb=Schwache Blutkugel -guide.bloodmagic.entry.architect.incense=Räucheraltar -guide.bloodmagic.entry.architect.bloodrune=Altaraufrüstung -guide.bloodmagic.entry.architect.inspectoris=Inspectoris Scandalum (Blockleser) -guide.bloodmagic.entry.architect.runeSpeed=Geschwindigkeitsrune -guide.bloodmagic.entry.architect.water=Wassersiegel -guide.bloodmagic.entry.architect.lava=Lavasiegel -guide.bloodmagic.entry.architect.lavaCrystal=Lavakristall -guide.bloodmagic.entry.architect.apprenticeorb=Blutkugel des Lehrlings -guide.bloodmagic.entry.architect.dagger=Opferdolch -guide.bloodmagic.entry.architect.runeSacrifice=Rune der Opferung -guide.bloodmagic.entry.architect.runeSelfSacrifice=Rune der Selbstopferung -guide.bloodmagic.entry.architect.holding=Siegel der Aufbewahrung -guide.bloodmagic.entry.architect.air=Luftsiegel -guide.bloodmagic.entry.architect.void=Siegel der Leere -guide.bloodmagic.entry.architect.greenGrove=Siegel des grünen Hains -guide.bloodmagic.entry.architect.fastMiner=Siegel der Eile -guide.bloodmagic.entry.architect.seer=Siegel des Sehers -guide.bloodmagic.entry.architect.magicianOrb=Blutkugel des Magiers -guide.bloodmagic.entry.architect.capacity=Rune der Kapazität -guide.bloodmagic.entry.architect.displacement=Rune der Verlagerung -guide.bloodmagic.entry.architect.affinity=Siegel der Elementaren Affinität -guide.bloodmagic.entry.architect.lamp=Siegel der Blutlampe -guide.bloodmagic.entry.architect.magnetism=Siegel des Magnetismus -guide.bloodmagic.entry.architect.peritia=Peritia-Foliant -guide.bloodmagic.entry.architect.livingArmour=Lebende Rüstung -guide.bloodmagic.entry.architect.upgradeTome=Thesen zur Verbesserung lebender Rüstung -guide.bloodmagic.entry.architect.teleposer=Teleposer -guide.bloodmagic.entry.architect.boundBlade=Gebundene Klinge -guide.bloodmagic.entry.architect.boundTool=Gebundene Werkzeuge -guide.bloodmagic.entry.architect.weakShard=Schwache Blutscherbe -guide.bloodmagic.entry.architect.masterOrb=Blutkugel des Meisters -guide.bloodmagic.entry.architect.runeOrb=Orbrune -guide.bloodmagic.entry.architect.suppression=Siegel der Verdrängung -guide.bloodmagic.entry.architect.haste=Siegel der Hast -guide.bloodmagic.entry.architect.severance=Siegel des Endertrennens -guide.bloodmagic.entry.architect.teleposition=Telepositionssiegel -guide.bloodmagic.entry.architect.compression=Siegel der Kompression -guide.bloodmagic.entry.architect.bridge=Siegel der Phantombrücke -guide.bloodmagic.entry.architect.mimic=Mimikblöcke -guide.bloodmagic.entry.architect.downgrade=Thesen zur Schwächung lebender Rüstung - -guide.bloodmagic.entry.architect.augmentedCapacity=Rune der erweiterten Kapazität -guide.bloodmagic.entry.architect.charging=Aufladungsrune -guide.bloodmagic.entry.architect.acceleration=Beschleunigungsrune - -# //--// needs a better string. Literal translation loses its rhyme and just sounds silly. This one is simply "An Altar from the depths" -guide.bloodmagic.entry.architect.tier3=Ein Altar aus den Tiefen (Stufe 3) - -# Architect Entry Texts -guide.bloodmagic.entry.architect.intro.info=Hallo, alle zusammen. Mein Name ist Tiberius. Wahrscheinlich kannst du an diesem Eintrag erkennen, dass das Buch nicht ganz vollständig ist, und du hast Recht. Durch die Updates 1.7.10 -> 1.8.9 und 1.9.4 (und höher) hat sich sehr viel geändert. Deshalb mussten die Bücher neu geschrieben werden. Da der ultimative Plan für diese Dokumente ist, jedes Buch in Form eines Forschungsjournals / tatsächlichen Buches zu haben, wird es eine Weile dauern, bis diese Dokumente ausgearbeitet sind. Daher werde ich dieses Buch regelmäßig aktualisieren, um die notwendigen Lücken zu schließen. Es wird als geschmackloser Müll anfangen (Ja.... nicht die appetitlichste Illustration für Dokumente, aber was auch immer!), aber langsam wird es in eine Geschichte über einen Haufen Blutmagier auf einer Entdeckungsreise verwandelt werden.\n\tAber genug davon, ich muss in den Charakter kommen. Mein Name ist Tiberius, und ich bin ein Blutmagier, auch bekannt als der Architekt. Dieses Buch enthält alle meine Forschungen über das ätherische Phänomen "Seelennetzwerk" sowie die physikalischen Eigenschaften einiger der wichtigsten Geräte, an die jeder Blutmagier im Training gewöhnt sein sollte. Von der Kunst, die Struktur eines mächtigen Blutaltars zu entwerfen, über die Feinheiten, Lebenskraft zu opfern, um die Macht eines Magiers zu erhöhen, bis hin zu den Kräften, die durch arkane Glyphen und Siegel gewonnen wurden, habe ich neue Wege entdeckt, überarbeitet und erschaffen, um sich selbst zu neuen Höhen zu trainieren.\n\tAlso trete ein, Blutmagier, denn ein neues Universum erwartet dich...\n\t Ja, Magus sagt, dass ich ein wenig grandios werden kann, aber was kannst man da schon machen? -guide.bloodmagic.entry.architect.bloodaltar.info.1=Der Blutaltar ist eines der zentralsten Geräte in der Mod. Es gibt zwei Hauptanwendungen für den Altar: entweder um bestimmte Gegenstände herzustellen, die für den Fortschritt durch die Mod notwendig sind, oder um die Blutkugel aufzufüllen. Bei beiden Aktionen muss der Spieler das Becken mit Lebensessenz füllen, die aus zwei verschiedenen Quellen gewonnen werden kann: Monstern und friedlichen Kreaturen und der eigenen Gesundheit des Spielers. -guide.bloodmagic.entry.architect.bloodaltar.info.2=Um deine eigene Lebensessenz in das Becken zu bringen, musst du dir einen Opferdolch basteln und es mit der rechten Maustaste neben dem Altar klicken. Dies nimmt ein Herz der Gesundheit und fügt einem nicht aufgerüsteten Altar insgesamt 200 LP hinzu. "LP" steht für "Life Points" oder Lebenspunkte, das ist ein Maß dafür, wie viel Lebenskraft für eine Operation verwendet wird - nein, es ist nicht wie YuGi-Oh. Der Blutaltar hat eine Kapazität von 10.000 LP. Wenn du dann mit der rechten Maustaste auf den Altar klickst, kannst du einen Gegenstand in das Becken legen, und wenn es sich um einen gültigen Gegenstand handelt, wird der Altar den Herstellungsprozess starten.\n\tDer Altar fertigt einen Gegenstand, indem er die LP im Becken verbraucht, wenn der Altar eine ausreichend hohe Ausbaustufe besitzt. Wenn genügend LP vorhanden sind, wird der Altar mit jedem Tick ein wenig LP aus dem Becken ablassen und den Fortschritt der Herstellung erhöhen, indem er rote Partikel aussendet. Wenn sich keine LP mehr im Becken befindet, gibt der Altar graue Partikel ab und der Herstellungsprozess verliert an Fortschritt, was überhaupt nicht gut ist! Schließlich, wenn der Altar eine Blutkugel füllt, wird der Altar violette Partikel emittieren, um anzuzeigen, dass er LP aus dem Becken absaugt.\n\tTatsächlich gibt es insgesamt drei Tanks im Blutaltar: den Haupttank, der eine Standardkapazität von 10 kLP hat, wie zuvor angegeben, sowie einen Eingangstank und einen Ausgangstank, die beide 10% der Gesamtkapazität des Haupttanks haben. Standardmäßig alle 20 Ticks werden die LP im Eingangstank mit 20LP/s in den Haupttank und die LP im Haupttank mit 20LP/s in den Ausgangstank übertragen. Wie der Name schon sagt, nimmt der Eingangstank die LP auf, die in den Altar gepumpt wird und als Puffer dient, um die Ãœbertragungsgeschwindigkeit von außen zu begrenzen, und der Ausgangstank kann mit Hilfe von Rohren aus dem Altar gezogen werden. -guide.bloodmagic.entry.architect.ash.info=Obwohl nicht unbedingt Teil des Gesamtthemas dieses Buches, ist Arcane Ash notwendig, um durch die Mod zu kommen und einige der leistungsfähigeren Geräte zu bekommen. Diese Asche wird mit der Höllenfeuer-Schmiede und Dämonischen Willen hergestellt, wenn du also neu in diesem Konzept bist, konsultiere bitte das "Dämonenkind". Im Wesentlichen ist dies eine Möglichkeit, Gegenstände aus zwei getrennten Gegenständen herzustellen: einem Reagenz, das als Katalysator dient, und einem sekundären Gegenstand.\n\tDie Asche hat insgesamt zwanzig Verwendungen, bevor du eine weitere herstellen musst. Wenn du mit der rechten Maustaste auf den Boden (oder eine Wand, obwohl sie nur eine Richtung darstellt) klickst, zeichnest du einen einfachen Kreis aus Asche ein. Wenn du die Asche erneut mit einem Gegenstand anklickst, wird dieser "in die Asche gelegt" - vorausgesetzt, dieser Gegenstand ist ein gültiger Katalysator, ändert der Kreis seine Form, um anzuzeigen, dass er für den nächsten Gegenstand bereit ist. Wenn sie sich nicht ändert, dann hast du etwas falsch gemacht.\n\t Sobald sie sich verändert hat, kannst du das zweite Element hinein legen. Wenn dieses Element mit dem ersten Element übereinstimmt, beginnt sich der Kreis zu drehen und führt je nach dem Rezept, an dem er arbeitet, verschiedene Aktionen aus. Nach einer Weile, wenn es richtig ausgeführt wird, wird ein Gegenstand herauskommen. Alle Rezepte für das Arkane Asche-Handwerk (ich nenne es Herstellung mit der Alchemischen Anordung) können in JEI gefunden werden, indem man die Verwendungen für Arkane Asche überprüft - der erste Gegenstand ist der Katalysator, und der zweite Gegenstand ist der sekundäre Gegenstand. -guide.bloodmagic.entry.architect.divination.info=Das Siegel der Weissagung ist eines der nützlichsten Werkzeuge in der Mod, das dir viele Werte vermitteln kann, die dein Leben einfacher machen. Dieses Siegel wird aus einem Stück Redstone und eine leeren Tafel (hergestellt im Blutaltar) mit einer Alchemischen Anordnung hergestellt.\n\tWenn du mit dem Siegel in der Hand auf einen Blutaltar rechts klickst, kannst du die aktuelle Stufe, die Menge der LP im Hauptbecken sowie die maximale Kapazität des Blutaltars sehen. Wenn du erneut mit dem Siegel auf den Altar klickst, wird der vorherige Text des Siegels überschrieben, was bedeutet, dass es keinen Spam in deinem Chat geben wird. Wenn du mit dem Siegel mit der rechten Maustaste in die Luft klickst, wird dir das Siegel die aktuelle Menge an LP in deinem LP-Netzwerk anzeigen. Obwohl dies zunächst eher alltäglich ist, wird diese Funktion allein es sehr wahrscheinlich machen, dass du dieses Siegel immer bei dir behalten wollen wirst. -guide.bloodmagic.entry.architect.soulnetwork.info=Das Seelennetzwerk (allgemein als LP-Netzwerk abgekürzt) ist der Begriff für die Verbindungen zwischen dem Spieler und allen Gegenständen und Strukturen, mit denen er seine Seele verbunden hat. Wenn ein Blutmagier mächtiger wird, nimmt die Kraft seiner Seele zu und verdickt diese Bindungen. Diese Verbindungen sind ätherische Stränge der Seele, und nur die mächtigsten der Blutmagier sind in der Lage, diese in ihrer physischen Form zu sehen. Bis jetzt hat noch kein Magier diese Fähigkeit erreicht.... \n\tIm Spiel ist das Seelen-Netzwerk direkt an den Spieler gebunden. Die Daten werden innerhalb der Welt gespeichert, und jeder Spieler hat nur ein einziges Netzwerk - die in das Netzwerk eingesetzten LP werden nicht in einem Element gespeichert, sondern in einem einzigen Pool platziert und gezogen.\n\tUm Dinge an dein Netzwerk zu binden, ist der gängigste Weg, einfach mit der rechten Maustaste auf ein Element zu klicken, das ein Netzwerk verwendet, um sich selbst zu aktivieren. Sobald der Gegenstand gebunden ist, zeigt er an, dass er sich im Besitz von Ihnen befindet und nie mehr losgebunden werden kann (mit der aktuellen Technologie). Wenn dieser Gegenstand verwendet wird und ihm LP-Kosten zugeschrieben werden, werden die LP aus dem Netz des Eigentümers genommen. Wenn nicht genügend LP in diesem Netzwerk vorhanden ist, wird die fehlende LP direkt der Gesundheit des Benutzers (nicht dem des Besitzers) entnommen. Man sollte die Verwendung solcher Gegenstände mit Vorsicht genießen, wenn nur eine geringe Menge an LP vorhanden ist - es könnte tödlich enden. -guide.bloodmagic.entry.architect.weakorb.info.1=Was nützt ein Magier ohne Machtquelle? Eine Blutkugel ist ein Gerät, das physische LP verbraucht und in das LP-Netzwerk des Besitzers überträgt. Obwohl es sich selbst nicht um eine Batterie handelt, dient es als Leitung, um die Energiereserven des Blutmagiers aufzufüllen. -guide.bloodmagic.entry.architect.weakorb.info.2=Die Schwache Blutkugel ist die erste solche Kugel, die du machen kannst. Indem du einen Diamanten in einen Blutaltar mit 2 kLP einsetzt, kannst du diese Kugel erschaffen. Wenn die Kugel gebunden und in einen Altar gelegt wird, in dem sich eine LP befindet, wird sie aus dem Becken gesaugt und die LP direkt in das Netzwerk übertragen. Jede Kugel hat eine maximale Kapazität, die nur durch fortgeschrittene Runen auf dem Altar erweitert werden kann. Für die Schwache Blutkugel beträgt diese maximale Kapazität 5 kLP.\n\tBlutkugeln können auch direkt vom Spieler gefüllt werden, indem man einfach mit der rechten Maustaste darauf klickt - das überträgt ein Herz der Gesundheit in die Kugel und gibt dir 200LP. Das kann nicht über die maximale Kapazität der Kugel hinausgehen. Eine Blutkugel kann nur durch ihre Altarebene oder höher gefüllt werden; das bedeutet, dass, wenn du eine T3-Kugel hast, sie in einen Altar gefüllt werden muss, der größer oder gleich T3 ist. Ein einfacher T1-Altar würde in dieser Situation nicht ausreichen. -guide.bloodmagic.entry.architect.incense.info.1=Man wird schnell feststellen, dass die Geschwindigkeit der LP-Generierung zunehmend belastend werden kann. Sicher, indem du dem Blutaltar spezielle Runen hinzufügst, kannst du den Ertrag der Selbstopferung erhöhen, aber das kann trotzdem ein langsamer Prozess sein. Wenn es nur einen Weg gäbe, um die Menge an LP, die du von dir selbst bekommen kannst, weiter zu erhöhen?\n\tHier kommt der Räucheraltar ins Spiel. Der Räucheraltar fungiert als zentraler Punkt für eine ruhige Gegend und beruhigt die Seele selbst mit den sanften Wellen, die aus dem Becken kommen. Du hast zwar keine Ahnung, woher dieser Geruch kommt, aber wass kann schon schief gehen?\n\tDas Ziel dieses Blocks ist es, einen Bereich der Ruhe zu schaffen, um zu erhöhen, wie viel LP du von einem Herz deiner Gesundheit bekommst.Wenn du in der Nähe des Blocks (etwa fünf Blöcke) bist, werden Feuerpartikel ausgesendet, um zu zeigen, dass er funktioniert - wenn du von dieser Ruhe betroffen bist, wird sich dein Opferdolch verwandeln, um anzuzeigen, dass du eine erhöhte Ausbeute am Blutaltar hast. Dieser Vorgang dauert etwa 5 Sekunden, und du erkennst, dass du fertig bist, daran dass die Feuerpartikel nicht mehr auftreten. Bei deiner nächsten Opferung am Blutaltar wirst du 90%% deiner maximalen Gesundheit auf einmal opfern und LP in den Altar pumpen, proportional zur Menge der geopferten Gesundheit, multipliziert mit einem Bonus, der davon abhängt, wie ruhig die Umgebung ist: dieser Bonus ist standardmäßig +20%%.\n\tAls Nebenbemerkung kann das Siegel der Weissagung auf dem Räucheraltar verwendet werden, um die Menge der Ruhe sowie die Menge eines Bonus zu bestimmen, die der aktuelle Altar gibt. -guide.bloodmagic.entry.architect.incense.info.2=Natürlich sind nur 20%% schön und gut, aber es kann durch die Erweiterung des Einflussbereichs des Räucheraltars noch erhöht werden. Wenn man eine Reihe von drei Holzpfadblöcken zwei Blöcke vom Räucheraltar entfernt in jede der Himmelsrichtungen platziert (wobei darauf zu achten ist, dass sich alle Pfadblöcke auf der gleichen y-Ebene befinden, bis zu fünf Blöcke nach oben oder unten vom Räucheraltar), kann man einen Bereich definieren. Jeder Block, der sich in diesem Bereich befindet (ein Block, der horizontal den gleichen Abstand zum Räucheraltar hat, wie die Pfadblöcke horizontal und auf der gleichen Ebene oder bis zu zwei Blöcke höher von den Pfadblöcken), kann zur Ruhe des Räucheraltars beitragen. Eine weitere Zeile mit Pfadblöcken kann nach der gleichen Regel hinter dieser ersten Zeile eingefügt werden: Die neue Zeile muss sich alle auf der gleichen y-Ebene befinden, und die gesamte Zeile muss innerhalb von 5 Blöcken vertikal von der vorherigen Zeile mit Pfadblöcken liegen. Das bedeutet, dass Grundrisse wie Pyramiden, umgekehrte Pyramiden oder fortgeschrittenere Treppenstrukturen möglich sind.\n\tAlle Pfadblöcke haben einen maximalen Abstand zum Räucheraltar, um wirksam zu sein. Die Holzpfadblöcke können bis zu drei Reihen vom Räucheraltar aus arbeiten. Steinpfade arbeiten bis zu fünf, abgenutzte Steinpfade sieben und Obsidianpfade neun Blöcke vom Ursprung entfernt. An einem bestimmten Punkt musst du also bessere Pfadblöcke verwenden, um deinen Ruhebereich zu erweitern, aber du kannst höhere Pfadblöcke anstelle von niedrigeren Pfadblöcken verwenden, nur nicht umgekehrt. Nur bestimmte Blöcke können die Ruhe eines Gebietes beeinflussen, und es gibt verschiedene Arten von Ruheblöcken. Wenn du eine Nutzpflanze wie z.B. Kartoffeln in das Gebiet legst, erzeugst du ein wenig Ruhe (mit der Kategorie Nutzpflanzen). Wenn du jedoch wieder eine andere Ernte wie Kartoffeln oder sogar Karotten hinzufügst, wirst du weniger Ruhe bekommen. Wenn du etwas aus einer anderen Ruhekategorie hinzufügst, bekommst du den vollen Effekt. Aber das Hinzufügen von mehr Material mit der gleichen Kategorie hat eine abnehmende Wirkung. Deshalb ist es am besten, so viele verschiedene Arten von Ruhe wie möglich zu verwenden, um aus einem bestimmten Gebiet die größtmögliche Ruhe herauszuholen: Pflanzen, Baumstämme, Blätter, Lava, Netherrack, Ackerland, Wasser, Lebensessenz und andere sortierte Dinge. -guide.bloodmagic.entry.architect.bloodrune.info.1=Während du dich durch die Mod arbeitest, wirst du langsam lernen, dass der schlichte Blutaltar vor dir nicht stark genug ist, um deine wahren Ambitionen zu erfüllen. Indem man spezielle Blöcke, die als Blutrunen bekannt sind, um den Altar legt, kann man die Stärke des Altars beträchtlich erhöhen, indem man höhere Stufen von Rezepten freischaltet und gleichzeitig die Fähigkeiten des Altars selbst erhöht.\n\tUm den Altar auf seine zweite Stufe aufzurüsten, muss man 8 Blutrunen um den Altar und eine Stufe tiefer legen. Wenn du über die genaue Konfiguration verwirrt bist, kann dir der Gegenstand "Inspectoris Scandalum" die genaue Platzierung der Blöcke, die für die nächste Ebene benötigt werden, zeigen. Jede der Runen in einem Blutaltar kann gegen jede Upgrade-Rune getauscht werden (die einzige Ausnahme ist, dass man die Eck-Runen auf Stufe 2 nicht als Upgrade-Runen verwenden kann - ab T3 kann man diese verwenden). Es gibt Runen, die die Geschwindigkeit des Herstellens, die Kapazität des Altars sowie die Effizienz des Opferns am Altar beeinflussen. Diese Runen sind in ihren jeweiligen Einträgen zu finden. -guide.bloodmagic.entry.architect.inspectoris.info.1=Wörtlich "Blockleser" in Latein, soll dieser Gegenstand mehr Informationen über die komplexeren Blöcke in der Mod geben, wenn die Blöcke in der Welt sind. Derzeit ist die einzige Implementierung für diesen Gegenstand der Blutaltar, und durch einfaches Klicken mit der rechten Maustaste auf einen Blutaltar in der Welt wird er dir zeigen, welche Blöcke in der Welt für die nächste Altarebene erforderlich sind. Wenn du dann mit der rechten Maustaste auf den Altar klickst, zeigt der Altar Geisterblöcke in der Welt an, die genau zeigen, wo die Blutrunen und die Säulen benötigt werden, um diese Ebene zu erreichen. Wenn man die angezeigte Schicht auf 1 setzt, wird das Hologramm entfernt. -guide.bloodmagic.entry.architect.runeSpeed.info.1=Die Geschwindigkeitsrune übt einen Druck auf das Becken des Altars aus und zwingt den Umwandlungsprozess, so dass das Herstellen viel schneller geht. Jede Geschwindigkeitsrune erhöht den Verbrauch des Altars um +20% pro Rune, wodurch die Geschwindigkeit des Altars effektiv erhöht wird. Dies beeinflusst auch die Geschwindigkeit, mit der die Blutkugeln vom Altar gefüllt werden. -guide.bloodmagic.entry.architect.water.info.1=Das Wassersiegel ist, wie der Name schon sagt, in der Lage, Feuchtigkeit aus der Luft zu sammeln, um an der Kontaktstelle am Boden eine Wasserquelle zu schaffen. Außerdem kann man durch Anklicken einer Maschine, die eine Flüssigkeit aufnimmt, bis zu 1000mB Wasser in die Maschine einfüllen, und das zu den gleichen Kosten, als ob man sie auf den Boden stellen würde. In jeder Hinsicht wirkt es wie ein unendlicher Eimer Wasser - es funktioniert jedoch nicht, wenn man es in eine Maschine legt. 50LP pro Anwendung. -guide.bloodmagic.entry.architect.lava.info.1=Das Yang zum Yin des Wassersiegels, dieses Siegel erwärmt den Fels in der Umgebung und sammelt ihn an einer Stelle und bildet eine Quelle der Lava, wo das Siegel Kontakt aufnimmt. Ein ähnlicher Prozess findet statt, wenn man mit einer Flüssigkeit aufnehmenden Maschine interagiert und bis zu 1000mB Lava im Inneren der Maschine für die gleichen Kosten erzeugt. Aus irgendeinem Grund verbrennt die Hand nicht, wenn man es benutzt, aber es bedeutet nicht, dass es eine kluge Wahl ist, darin zu baden! 1000LP pro Anwendung. -guide.bloodmagic.entry.architect.lavaCrystal.info.1=Der Lavakristall ist ein Stein, in dessen Mitte sich ein Stück Lava befindet, das seine Wärme nicht verliert. Wenn es als Brennstoffquelle in einem Ofen platziert wird, "brennt" es für eine Menge, die ausreicht, um einen einzelnen Gegenstand in einem Standard-Ofen zum Preis von 50 LP aus dem Netz des Eigentümers zu kochen. Wenn das Netzwerk nicht genügend Energie hat (oder wenn es keinen Besitzer gibt), wird der Kristall einfach nicht brennen und dem Besitzer aufgrund der Belastung Ãœbelkeit zufügen.\n\tDieser Kristall wird für jede Festbrennstoffverbrennungsmaschine funktionieren, die jeden Brennstoff akzeptiert. -guide.bloodmagic.entry.architect.apprenticeorb.info.1=Während du die verschiedenen Geräte benutzt, wirst du schnell feststellen, dass deine maximale Kapazität von 5kLP in deinem LP-Netzwerk schnell erschöpft sein wird. Hier wirst du anfangen, nach einem stärkeren Orb für dein Netzwerk zu suchen.\n\tDie Blutkugel des Lehrlings benötigt einen Stufe-2-Altar und hat eine maximale Kapazität von 25kLP. Es erlaubt außerdem, mächtigere Gegenstände und Runen zu erstellen. -guide.bloodmagic.entry.architect.dagger.info.1=Nach einer Weile der Stärkung durch Selbstopferung, kannst du versuchen, das Blut der Mobs zu opfern. Das Opfermesser, wenn es auf einen Nicht-Boss und Nicht-Spieler neben einem Blutaltar angewendet wird, tötet das Wesen mit einem Schlag und pumpt das ganze Blut in den Altar, wobei es je nach Qualität des Mobs in eine Lebenselixier umgewandelt wird. Normalerweise neigen feindliche Mobs dazu, viel mehr LP zu geben als friedliche Mobs. -guide.bloodmagic.entry.architect.runeSacrifice.info.1=Die Rune der Opferung, wie der Name schon sagt, erhöht den Ertrag aller Aktivitäten, die die Gesundheit der Mobs als Gegenleistung für LP opfern. Jede Rune bietet eine +10%%ige Ertragssteigerung, additiv. -guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=Ähnlich wie bei der Rune der Opferung erhöht die Rune der Selbstopferung den Ertrag der vom Spieler bereitgestellten LP. Jede Rune bietet eine +10%%ige Ertragssteigerung, additiv. -guide.bloodmagic.entry.architect.holding.info.1=Wie du feststellen wirst, gibt es eine Menge nützlicher Zeichen, die verfügbar sind - einige sind umschaltbar, andere aktiv. Dadurch wird das Inventar schnell verstopft. Dieses Siegel kann bis zu fünf weitere Siegel (nein, es kann keine anderen Siegel der Aufbewahrung halten) in seinem internen Inventar halten. Durch Drücken der "Aufbewahrungstaste", Standard 'H', kann die Benutzeroberfläche des Siegels geöffnet werden, um die gehaltenen Siegel neu anzuordnen. Wenn man das Scrollrad verschiebt und benutzt, während es ausgerüstet ist, fährt man durch die enthaltenen Siegel. Sobald du auf dem Siegel landest, das du benutzen willst, kannst du das Siegel so benutzen, als ob es das ausgewählte wäre! Natürlich kannst du mehrere Siegel der Aufbewahrung haben, jedes mit seinem eigenen Inventar. Um festzustellen, welches auf einen Blick welches ist, kann das Siegel mit Hilfe des Alchemietisches eingefärbt werden. Um dies zu tun, wird das Siegel entweder mit einem Farbstoff oder mit einem Namensschild in der gewünschten Farbe im Format 0xZZZZZZ für den Namen im Alchemietisch platziert. -guide.bloodmagic.entry.architect.air.info.1=Das Luftsiegel nutzt eine rudimentäre Form der Spaltung, um durch die Spuren von Wasserdampf in der Luft einen gleichmäßigen Luftstrom hinter dem Benutzer zu erzeugen und ihn nach vorne zu treiben. Im Wesentlichen kann man mit diesem Siegel eine beträchtliche Strecke vorwärts starten. Es ist zu beachten, dass das Siegel die Fallhöhe des Benutzers nur dann aufhebt, wenn es benutzt wird, d.h. dass man die Landung in Bodennähe halten will! -guide.bloodmagic.entry.architect.void.info.1=Wie der Name schon sagt, erzeugt das Siegel der Leere an der Kontaktstelle ein Vakuum, das die Flüssigkeitsquelle, an der es verwendet wird, aufsaugt und die Quelle vollständig zerstört. Dies ist wahrscheinlich am besten in Verbindung mit dem Wassersiegel oder dem Lavasiegel zu verwenden. -guide.bloodmagic.entry.architect.greenGrove.info.1=Durch die Verwendung von Blut als einfacher Wachstumskatalysator wird das Siegel des Grünen Hains die Wachstumsgeschwindigkeit von Pflanzen in der näheren Umgebung erhöhen, während es aktiviert ist. Um das Siegel zu aktivieren, klickt man mit der rechten Maustaste darauf, um zwischen aktiviert und deaktiviert zu wechseln (leicht erkennbar am Tooltip oder an den leuchtenden Symbolen auf dem Siegel). Man beachte, dass das Siegel alle paar Sekunden ein wenig LP vom Benutzer absaugen wird, um das beschleunigte Wachstum zu fördern. Es kann auch für den Anbau von hohem Gras oder anderen Nutzpflanzen verwendet werden, genauso wie Knochenmehl. -guide.bloodmagic.entry.architect.fastMiner.info.1=Wie jeder gute Blutmagier wissen sollte, hat Blut einen hohen Anteil an Eisen in sich. Wenn man geschickt genug ist, kann man Blut manipulieren, während es noch im Körper ist - es sollte jedoch beachtet werden, dass nur die fortgeschrittensten Blutmagier das Blut derjenigen verdrehen können, die nicht willens sind.\n\tIm Prinzip verwendet man es, um die Funktionen des eigenen Körpers zu beschleunigen. Durch die Magnetisierung des Eisens im Blut des Benutzers erhöht das Siegel der Eile die Geschwindigkeit des Abbaus drastisch, indem es Eile II anwendet, während es aktiviert ist. Dieser Magnetismus ist zu schwach, um Dinge außerhalb des eigenen Körpers zu beeinflussen, aber er reicht aus, um Obsidian mit beachtlicher Geschwindigkeit abzubauen. -guide.bloodmagic.entry.architect.seer.info.1=Wenn man am Blutaltar herumbastelt, kann man sich manchmal in den verborgenen Feinheiten seines Wirkens verlieren, die das Siegel der Weissagung nicht zu erahnen scheint. Hier kommt das Siegel des Sehers ins Spiel. Im Wesentlichen ein Upgrade zum Wahrsager-Siegel, bietet dieses Siegel zusätzliche Informationen über verschiedene Eigenschaften des Altars. Diese reichen von der Geschwindigkeit des Altars über die aktuelle LP bis hin zum aktuellen Fortschritt des gefertigten Gegenstandes. Es gibt auch Informationen über das LP-Netzwerk des Spielers. -guide.bloodmagic.entry.architect.magicianOrb.info.1=Eine neue Stufe, eine neues Blutkugel. Dieses Mal musst du, um im Mod weiter zu kommen, die Blutkugel des Magiers selbst herstellen. Im Standardrezept kann man sehen, dass es 25kLP braucht, um es zu fertigen, aber die maximale Kapazität des Blutaltars ist 10kLP. Das bedeutet, dass du für eine erfolgreiche Herstellung LP in den Altar einfügen musst, während er gerade das Orb herstellt. Bereite dich darauf vor, denn es kann eine schwierige Aufgabe sein, wenn du nicht alles hast, was du brauchst! -guide.bloodmagic.entry.architect.capacity.info.1=Man ist sich nicht ganz sicher, wie es funktioniert, aber die Rune der Kapazität erhöht die Kapazität des Blutaltars zusätzlich um 2 kLP. Vielleicht gibt es eine Art Resonanzeffekt, der das Volumen der LP verringert, so dass man mehr in das statische Becken packen kann? Es gibt dir eine Idee, wie du es weiter verbessern kannst, aber....\n\tEs sollte wiederholt werden, dass die Größe der Eingangs- und Ausgangspuffer 10% der maximalen Kapazität des Haupttanks beträgt, also werden diese Runen auch die Pufferkapazitäten erhöhen. -guide.bloodmagic.entry.architect.displacement.info.1=Standardmäßig ist die Ãœbertragung von LP zwischen Puffer- und Haupttank auf 20LP/s begrenzt. Für Systeme, die LP entfernen und dem Altar wieder hinzufügen wollen, ist diese Geschwindigkeit ein träges Kriechen. Da kommt diese Rune ins Spiel. Die Rune der Verlagerung erhöht die Menge an LP, die pro Operation übertragen wird. Jede Rune multipliziert die Transferrate mit 1,2x und stapelt multiplikativ. Eine Rune wäre also 24LP pro Operation, zwei Runen wären 28,8LP pro Operation und drei Runen 34,56LP. Wenn du 20 Runen auf einem Altar hast, überträgt dieser bis zu 767 LP pro Operation - das würde einen vollen Altar in nur 13 Sekunden leeren. -guide.bloodmagic.entry.architect.affinity.info.1=Auf den ersten Blick gewährt das Siegel der Elementaffinität einfach Immunität gegen Feuer, Ertrinken und Schäden aus der Höhe, wenn es aktiviert ist. Die Bedienung ist jedoch viel nuancierter. Dieses Siegel erzeugt eine dünne Luftbarriere um den Benutzer herum, indem es den Schweiß (und bei Bedarf Blut) des Benutzers verwendet und den Körper von den harten Elementen fernhält. Diese Luftbarriere wirkt als Puffer zwischen der Haut und dem Feuer oder der Lava und zirkuliert bei Bedarf, um eine Ãœberhitzung zu verhindern. Es füllt auch die Lunge unter Wasser, um den Druck des Körpers und des umgebenden Wassers auszugleichen. Bei einem Sturz aus großer Höhe verschiebt sich die Luft schließlich unter die Füße und dämpft den Sturz. -guide.bloodmagic.entry.architect.lamp.info.1=Es gibt eine ganze Reihe von "Unreinheiten" im Körper und im Blut eines Menschen. Indem du einige Edelgase erntest und sie mit einer Wärmequelle umhüllst, kannst du eine Lichtkugel erzeugen, die über eine große Entfernung geschleudert werden kann und an der Oberfläche haften bleibt, auf die sie auftrifft.\n\tDas Siegel der Blutlampe hat zwei Verwendungszwecke: du kannst entweder direkt auf einen Block klicken und eine Lichtquelle platzieren oder ein Projektil abfeuern, das eine Lichtquelle an der Kontaktstelle erzeugen wird. Diese Lichtquellen können wie Fackeln in einem Schlag zerbrochen werden. -guide.bloodmagic.entry.architect.magnetism.info.1=Dieses Siegel magnetisiert das Eisen im Blutkreislauf des Benutzers, um kleine Gegenstände in Richtung des Siegels zu ziehen, was eine schnelle und schmerzfreie Aufnahme ermöglicht. Im Wesentlichen wirkt dies wie ein Gegenstandsmagnet, aber anstatt Gegenstände in Richtung des Spielers zu "saugen", veranlasst es den Spieler, den Gegenstand aus der Ferne aufzunehmen, so dass Gegenstände nicht überall herumfliegen müssen. Zum Glück ist der Magnetismus so abgestimmt, dass er keine lebenden Objekte anzieht, so dass man keine Creeper findet, die einen plötzlich mit Mach 3 umarmen wollen. - -guide.bloodmagic.entry.architect.peritia.info.1=Bestimmte Aktionen in der Welt beeindrucken den Menschen: Das Töten von Monstern, Bergbauelementen und das Schmelzen von Barren oder Nahrungsmitteln kann zu Erfahrungen führen, die sich über einen längeren Zeitraum angesammelt haben. Durch einige arkane Mechanismen, einige Strukturen und Geräte können dir diese Erfahrungen tatsächlich entzogen werden, um ihre eigenen Prozesse zu fördern. Es kann daher nützlich sein, diese Erfahrungen in irgendeinem Medium zu speichern. Obwohl einige Behälter Erfahrung als physische Substanz speichern, erlaubt der Peritia-Foliant der Person, ihre Erfahrungen in das Buch zu schreiben - indem er in den Band schreibt, werden die Seiten mit deinen Gedanken und vergangenen Handlungen durchdrungen und sie für den späteren Gebrauch gespeichert. Wenn du dann diese Erfahrungen zurückgewinnen möchtest, kannst du deine Hand auf die Seite halten und sie zurücksaugen; dies wird die Schrift von der Seite entfernen und diese Aktionen zurück in dein Gedächtnis übertragen.\n\tNun für den tatsächlichen Gebrauch; indem du auf den Wälzer in deiner Hand klickst, kannst du einen Erfahrungslevel im Buch speichern (oder auf den Anfang des Levels, wenn du Teilerfahrung hast). Mit einem Rechtsklick auf den Wälzer kannst du das nächste Level erreichen, wenn genügend Erfahrung im Buch gespeichert ist. Die Gesamterfahrung sowie die entsprechende gespeicherte Stufe wird im Tooltip des Folianten angezeigt. -guide.bloodmagic.entry.architect.livingArmour.info.1=Jeder Person in Minecraft, besonders in den neueren Versionen der Welt, wird bewusst, dass eine gute Rüstung einen Unterschied zwischen Leben und Tod bedeutet. Normalerweise wählt man bei der Auswahl einer Rüstung einen statischen Satz von Vorteilen - bietet diese Rüstung mehr Schutz? Bekomme ich die Fähigkeit, zu fliegen, wenn ich das trage? Kann ich wirklich hoch springen oder mich schnell bewegen? Das sind alles gültige Optionen für eine Rüstung, aber man kann nie ein Set bekommen, das genau auf seine Bedürfnisse zugeschnitten ist. Zumindest das dachten die Leute. Ein Set Lebendiger Rüstung ist eine konstruierte Lebensform, die mit einer einfachen Eisenrüstung integriert ist. Wenn es getragen wird, geht es eine symbiotische Beziehung mit dem Benutzer ein - wenn man sich bewegt, bewegt es sich. Wenn man angreift, greift es an. Wenn man isst, spürt es das und kompensiert es. Und genau wie ein normaler menschlicher Körper beginnt es zu wachsen und zu stärken, je nachdem, was man tut, indem man es durch seine Handlungen trainiert.\n\tLass mich ein Beispiel nennen: Wenn du eine neue Rüstung ausrüstest und viel herumläufst, wirst du feststellen, dass du ein Upgrade auf der Brustplatte namens "Schnelle Füße" erhältst - dieses Upgrade bietet eine stufenweise Erhöhung deiner Geschwindigkeit, während die folgenden Stufen einen größeren Schub bringen. Du wirst auch feststellen, dass die "Upgrade-Punkte" jetzt "3/100" lauten - jedes Upgrade erfordert eine Anzahl von Upgrade-Punkten, und die Brustplatte hat eine maximale Anzahl von Punkten, die sie halten kann. Wenn ein Upgrade, das du erhalten kannst, nicht mit der Anzahl der kostenlosen Upgrade-Punkte erhältlich ist, die du hast, kann es nicht erworben werden. Behalte im Hinterkopf, dass die Lebende Rüstung nur trainiert wird, wenn du eine vollständige Rüstung anhast, und die Effekte der Rüstung nur wirksam werden, wenn eine vollständige Rüstung verwendet wird.\n\tDie maximale Anzahl von Aufrüstungspunkten kann auf verschiedene Weisen verändert werden. Eine von ihnen ist es, alchemistische Zubereitungen zu kreieren, die die Bindungen zwischen dem Benutzer und der Lebenden Rüstung stärken und die Anzahl der Punkte, die man auf einer bestimmten Ausrüstung haben kann, enorm erhöhen. Ein Beispiel ist der "Trank der Engelsmacht", der die maximale Punktzahl auf 200 erhöht. Informationen über diese Gebräue und wie man sie herstellt, können in "Der Alchemist" gefunden werden. -guide.bloodmagic.entry.architect.upgradeTome.info.1=Manchmal ist man mit den Aufrüstungen, die man für die Lebende Rüstung erhalten hat, nicht zufrieden. Mit dem Ritual "Klang der reinigenden Seele" (weitere Informationen unter "Der Ritualmeister") können alle Aufrüstungen von der Rüstung entfernt und in Form von "Thesen der Lebenden Rüstung" erhalten werden. Klicke mit der rechten Maustaste darauf, während du einen kompletten Satz Lebende Rüstung trägst (und Platz für die Aufrüstung hast), um die Eigenschaft zu deiner Rüstung hinzuzufügen. Diese Thesen können auch in einem Amboss kombiniert werden - wenn man zwei der exakt gleichen Thesen (gleiches Upgrade, gleiche Stufe) in einem Amboss kombiniert, kann man eine einzelne These erhalten, die eine Stufe höher ist. Wenn du also Schnelle Füße II mit einem anderen Schnelle Füße II kombinierst, erhälst du Schnelle Füße III. Diese These kann dann in gleicher Weise auf die Rüstung aufgebracht werden. -guide.bloodmagic.entry.architect.teleposer.info.1=Der Teleposer ist ein Gerät, das nicht nur Objekte, sondern auch Entitäten teleportiert. Um einen Teleposer einzurichten, benötigst du mindestens zwei Teleposer und einen Telepositionsfokus. Einer der Teleposer fungiert als das Ziel und der andere als der Anfang. Um das einzurichten, musst du zuerst den Fokus an dich binden, indem du mit der rechten Maustaste darauf klickst. Dann klickst du mit der rechten Maustaste auf den Ziel-Teleposer, um seine Position (und Dimension) zu speichern, und fügst dann den Fokus in den beginnenden Teleposer ein, indem du mit der rechten Maustaste auf den Teleposer ohne Fokus in deiner Hand klickst und den Fokus in das GUI platzierst.\n\tMit einem starken Redstonesignal kann ein Teleposer aktiviert werden, wodurch die Teleposer alle Entitäten und Blöcke tauschen, vorausgesetzt, dass ein Teleposer an der Zielposition existiert.\n\tDu kannst entweder einen Teleposer haben, der einen Fokus hat, beide Teleposer haben Fokusse, die miteinander verbunden sind, oder du kannst einen Teleposer haben, der mit einem anderen Teleposer verbunden ist, der nicht mit ersteren verbunden ist, also abhängig davon, wie du sie einrichtest, kannst du sehr komplizierte Systeme haben.\n\tBeachte, dass der Teleposer derzeit nur die Blöcke und Entitäten vertauscht, die sich direkt über dem Block befinden, und die Größe hängt vom Fokus ab - der T1-Fokus vertauscht nur den Block über dem Teleposer, der T2-Fokus vertauscht einen 3x3x3-Bereich über dem Teleposer usw. -guide.bloodmagic.entry.architect.boundBlade.info.1=The Bound Blade is an artifact from the past, a blade that is created by binding an entity to a sword in the same process that creates the Living Armour. It should be noted that this, as well as the Bound Tools, will change in later versions of the mod.\n\tThe sword has an active and inactive mode, which can be toggled by shift-right clicking. The sword does not deal any damage at all when inactive, but while active there will be a small LP drain over time. Likewise, when you damage a mob you will drain LP from your network. Sure, you have a lot of damage, but it may kill you!\n\tWhen a monster is killed, the monster has a chance to drop a Weak Blood Shard. These shards are used in order to upgrade your Blood Altar to a T4 altar. -guide.bloodmagic.entry.architect.boundTool.info.1=Ähnlich wie bei der Gebundenen Klinge werden diese gebundenen Werkzeuge (Spitzhacke, Axt und Schaufel) irgendwann modifiziert, um besser in die Mod zu passen. Wie bei der Klinge haben die Werkzeuge einen aktiven und einen inaktiven Modus, zwischen denen man durch Klicken mit der rechten Maustaste umschalten kann.\n\tEtwas, das diese Werkzeuge haben, ist etwas, das man "Beast Mode" nennt. Wenn du die rechte Maustaste gedrückt hältst, kannst du das Werkzeug aufladen und einen mächtigen Spalt freisetzen, der sofort die Blöcke zerbricht, die von dem gegebenen Werkzeug gebrochen werden können - wenn es vollständig aufgeladen ist, ist das ein 11x11x11 Würfel über dir zu einem Preis von 10kLP. Sei vorsichtig mit diesem mächtigen Werkzeug, da es dein letztes sein kann! -guide.bloodmagic.entry.architect.weakShard.info.1=Alles, was Leben hat, kann die ätherischen Verbindungen haben, die als das Seelen-Netzwerk bekannt sind. Wie aus euren Erfahrungen hervorgeht, können auch nicht-lebende Dinge ein Seelen-Netzwerk haben, wie Siegel und Rituale; aber diese Verbindungen sind die stärksten in den Geschöpfen und natürlich den Menschen. Wenn du ein Monster mit einer Gebundenen Klinge angreifst, wird ihr Seelen-Netzwerk vorübergehend hart und ein Stück davon wird nach dem Tod bleiben. Dieses Stück hat die Form eines Schwachen Blutsplitters, so benannt nach der Tatsache, dass sein rötlicher Farbton der Farbe der Schwachen Blutkugel entspricht. An diesem Punkt ist es nicht klar, ob es stärkere Formen von Blutsplittern gibt, aber man kann sagen, dass dies sehr hilfreich wäre, um die Macht des eigenen Seelen-Netzwerks zu erhöhen. -guide.bloodmagic.entry.architect.masterOrb.info.1=Eine der Anwendungen für diese erhöhte Affinität zum Seelennetzwerk ist die Verwendung des Schwachen Blutsplitters in einer neuen Blutkugel: der Blutkugel des Meisters. Diese Kugel hat eine maximale Kapazität von 1 Million LP und ermöglicht so dem Besitzer den Zugriff auf mächtigere Gegenstände und Rituale. Vielleicht sind Meteore doch in Reichweite... -guide.bloodmagic.entry.architect.runeOrb.info.1=Diese Rune kann zunächst als etwas nutzlos angesehen werden. Durch die Verdickung der Verbindungen zwischen der Blutkugel im Altar und dem Seelennetzwerk erhöht die Rune der Kugel die maximale Kapazität einer Blutkugel, die von einem Blutaltar gefüllt wird, um +2%% pro Rune. Für so etwas wie die Schwache Blutkugel ist das nur eine Kapazität von +100LP, für die Blutkugel des Meisters ist das jedoch eine bemerkenswerte Kapazität von +20kLP pro Rune. Wenn du eine hochrangige Blutkugel und Platz für ein paar zusätzliche Runen auf deinem Altar hast, kann das etwas sein, das dein Netzwerk abrunden wird. -guide.bloodmagic.entry.architect.suppression.info.1=Das Siegel der Verdrängung verwendet die Technologie, die in einem Teleposer verwendet wird, um Flüssigkeiten, die sich in seiner Nähe befinden, vorübergehend zu verdrängen. Dazu werden die Flüssigkeiten in einer Kugel um den Benutzer herum in eine verstecktes Taschendimension teleposiert und die Flüssigkeit durch Luft ersetzt. Da das Feld des Teleposers überladen wird, ist die Teleposition vorübergehend - wenn der Benutzer den Bereich, in dem die Flüssigkeit entfernt wurde, verlässt oder das Siegel deaktiviert, springt die Flüssigkeit an die Stelle zurück, an der sie vorher war, als ob nichts geschehen wäre, vorausgesetzt, es gibt dort keine neu platzierten Blöcke. Dies ermöglicht einen ausgefallenen Transport zu Fuß, unter Wasser zu gehen, anstatt durch das Wasser zu schwimmen oder sogar die roten Seen des Nethers zu teilen. -guide.bloodmagic.entry.architect.haste.info.1=Zucker und Koffein sind interessante Chemikalien, die der menschliche Körper verarbeiten kann. Das eine dient als Energiereservoir, das schnell verbrannt wird, während der andere die Wachsamkeit erhöht und den Zugang zu Energie auf andere Weise ermöglicht. Indem diese chemischen Prozesse nachgeahmt werden, um mehr chemische Energie freizusetzen, ermöglicht das Siegel der Hast dem Benutzer, seine Bewegungsfähigkeit zu erhöhen. \n\tWährend es aktiviert ist, kann der Benutzer viel schneller laufen und deutlich höher springen. Darüber hinaus bietet das Siegel auch "Step Assist", das es dem Benutzer ermöglicht, einen Block hohe Grate zu überwinden, ohne zu springen. Es ist wie ein automatisches Springen, nur weniger schlecht. -guide.bloodmagic.entry.architect.severance.info.1=Teleportation ist eine dieser seltsamen Mächte, die die Menschen nicht vollständig erklären können. In den meisten Fällen kann die Teleportation als eine temporäre Verwerfung in der Raumzeit beschrieben werden, die zwei Orte im Raum miteinander verbindet, so dass das betreffende Objekt einfach auf die andere Seite "treten" kann. Das Siegel der Endertrennung versucht, diese Verzerrung zu stoppen, die die Teleportation erfordert, und verhindert, dass Kreaturen sich teleportieren, wenn sie in der Nähe des Benutzers sind. Dies stoppt nicht einige der größeren Teleportationsmittel wie Portale, aber es wird Endermen daran hindern, ihre Kräfte zu nutzen, sich in der Nähe des Nutzers zu teleportieren. -guide.bloodmagic.entry.architect.teleposition.info.1=Das Telepositionssiegel hat einen Teleposer und Fokus in seiner Struktur. Wenn du mit der rechten Maustaste auf einen Teleposer mit diesem Siegel klickst, kannst du die Koordinaten und Abmessungen an das Siegel binden. Wenn du nun mit der rechten Maustaste auf das Siegel klickst, wird es dich direkt zum Teleposer teleportieren (falls dieser vorhanden ist). Leider scheint es nicht möglich zu sein, eine Rückfahrt zu machen.... -guide.bloodmagic.entry.architect.compression.info.1=Ein Bergarbeiter wird schnell feststellen, dass sein Inventar während einer langen Expedition mit Redstone Staub, Lapis und anderen Materialien gefüllt wird. Die meisten von ihnen haben Rezepte, die sie zu Speicherblöcken wie Redstone-Blöcken und Diamantblöcken komprimieren, aber sie benötigen normalerweise eine Werkbank, um sie zu kombinieren. Dieses Siegel faltet ein kleines Kompressionsfeld im Inventar des Benutzers, wenn es aktiviert wird, und komprimiert Gegenstände auf die niedrigste Anzahl von Slots, die für das Inventar benötigt werden. Das heißt, wenn du 63 Redstone Staub hast, wird es nichts bewirken. Wenn du jedoch 64 Staub hast, werden 9 von ihnen zu einem Block aus Redstone komprimiert. Das ist zwar technisch nicht die ideale Situation, wenn du genau einen Stapel Redstone-Staub hast, aber es garantiert, dass du nicht durch volle Taschen im Staub zurückbleiben. Wenn andere Mods vorhanden sind, funktioniert dies auch für andere Rezepte. -guide.bloodmagic.entry.architect.bridge.info.1=Wenn aktiviert und während der Benutzer auf festem Boden steht, verfestigt das Siegel der Phantombrücke die Luft unter dem Benutzer, so dass er sie betreten kann, wodurch im Wesentlichen eine Phantombrücke entsteht. Wenn du in der Luft kriechst, bildet sich die Brücke direkt unter dir, so dass du dich in der Luft fangen kannst, falls du fällst. Obwohl eine gewisse Kalibrierung notwendig ist, um es sowohl für die vertikale als auch für die horizontale Bewegung bei schnellen Bewegungen effektiver zu machen (da die Entstehung der Brücke verzögert wird), ist es ein ausgefallener Weg, um effektiv zu verschiedenen Bereichen zu fliegen. -guide.bloodmagic.entry.architect.mimic.info.1=Mimics sind arkane Konstrukte, die dazu bestimmt sind, das nachzuahmen, worauf sie eingestellt sind. Wenn die Mimik mit irgendeiner Form von Block in Kontakt kommt, verschieben ihre Moleküle ihre Orientierung, um die Form, das Aussehen und das Gefühl des Blocks anzunehmen. Allerdings werden nicht alle Eigenschaften kopiert: Ein normaler Mimikblock, der mit Glowstone in Berührung kommt, gibt beispielsweise kein Licht ab.\n\tBei normalem Gebrauch gibt es zwei Möglichkeiten, einen Mimikblock zu benutzen. Der erste ist, den Mimikblock zu platzieren und dann mit der rechten Maustaste mit dem Block, der kopiert werden soll, auf die Mimik zu klicken. Dadurch wird der Block innerhalb der Mimik platziert und die Mimik nimmt die "Standard"-form des Blocks an. Wenn also ein Mimikblock mit einer Treppe angeklickt wird, wird sich die Mimik immer auf die gleiche Weise orientieren.\n\tDie zweite Methode ist, den Mimikblock in der Hand zu halten und auf den zu ersetzenden Block zu klicken. Dadurch wird der Block durch die Mimik ersetzt und die Mimik hat genau die gleiche Ausrichtung wie der ersetzte Block. Das kann man bei Treppen und Truhen sehen, aber auch bei anderen orientierungsabhängigen Blöcken wie z.B. Holzstämmen.\n\tEs gibt einige verschiedene Varianten der Mimikblöcke. Der Opake Mimikblock ist die Standardmimik, das die Form und die allgemeinen Eigenschaften von Blöcken annehmen kann - Licht kann sich jedoch nicht durch diese hindurchbewegen, daher sollte man mit Glas vorsichtig sein. Der ätherische opake Mimikblock kann ohne Probleme durchlaufen werden, da dieser keine Hitbox hat, die perfekt für versteckte Türen ist. Klare Mimikblöcke funktionieren genauso wie ihre undurchsichtigen Varianten, lassen aber Licht durch sie hindurch, auch wenn es völlig fest erscheint. Schließlich ist der Leuchtende Mimikblock undurchsichtig und fest, aber egal, was sich darin befindet, er strahlt ein starkes Licht aus. Keine dunklen Bereiche mehr in deiner Basis ohne Fackel-Spam! Es gibt eine spezielle Variante der Mimik, vor der du dich in Acht nehmen solltest: der Empfindsame Mimikblock. Wenn ein Spieler zu nahe an einen von diesen in der Welt kommt, wird dieser aufstehen und mit einem hohen Grad an Grausamkeit angreifen. Diese sind in verschiedenen Bereichen vorzufinden, aber sie sind besonders von Verliesen angetan. Wenn man eine Truhe nachahmt, sollte man jedoch vorsichtig sein: Sie beißen....\n\t***Nur Kreativmodus***\n\tEs gibt einige interessante Funktionen, die du jedem Mimikblock hinzufügen kannst, wenn du dich im Kreativmodus befindest. Wenn du mit der rechten Maustaste auf eine platzierte Mimik mit einem Trank oder einer Trankflasche klickst, kannst du die Mimik so einstellen, dass sie Tränke um sie herum erzeugt, wenn ein Spieler in der Nähe ist. Wenn es eine normale Mimik ist und du auf die Ost- oder Westseite klickst, kannst du den Radius, in dem der Trank entsteht, vergrößern oder verkleinern. Wenn du auf die Nord- oder Südseite klickst, kannst du den Radius vergrößern oder verkleinern, den die Mimik vor dem Erstellen der Tränke nach Spielern um sie herum sucht. Wenn es sich um einen empfindsamen Mimikblock handelt, kannst du überall auf den Mimikblock klicken, um den Erkennungsradius für Spieler zu vergrößern oder zu verkleinern - wenn sich ein Spieler in diesem Bereich befindet und den Block sehen kann, wird die Mimik erstellt und den Spieler anfallen.\n\tEine weitere Sache ist, dass, wenn der Block auf die Mimik gesetzt wird, während der platzierende Spieler im Kreativmodus ist, wird der Block, der nachgeahmt wird, NICHT fallen gelassen, wenn die Mimik zerstört wird.\n\tZu guter Letzt wird die Mimik, falls sie auf irgendeinem Inventar oder eine Kiste gesetzt wird, diese Kiste bzw. das Inventar samt Inhalt fallen lassen, sobald sie besiegt wurde - eine reguläre Mimik wird stattdessen den Inhalt auf dem Boden verteilen, falls sie zerstört werden sollte. -guide.bloodmagic.entry.architect.downgrade.info=Bitte lese den Eintrag "Sühne der belasteten Seele" in "Der Ritualmeister" für eine detaillierte Erklärung darüber, was diese sind und wie man sie erhält. - -guide.bloodmagic.entry.architect.augmentedCapacity.info=Die Rune der erweiterten Kapazität funktioniert ähnlich wie die Rune der Kapazität in dem Sinne, dass sie die Kapazität des Blutaltars erhöht. Allerdings werden mehrere Runen auf dem gleichen Altar miteinander in Resonanz treten, was die Kapazität exponentiell erhöht, je mehr es gibt. Eine Rune allein wird die Kapazität des Altars um +10%% erhöhen, aber das funktioniert multiplikativ mit anderen Runen mit erhöhter Kapazität: Wenn es zwei Runen gibt, ist es eine Zunahme um +21%%, drei Runen um +33,1%%, usw.\n\tUnglücklicherweise ist dieser multiplikative Effekt nicht mit der Rune der Kapazität stapelbar, was bedeutet, dass man immer noch nur den Bonus von +2kLP pro Rune erhält. -guide.bloodmagic.entry.architect.charging.info=Die Aufladungsrune ist eine jener Schönheiten, die den Betrieb des Blutaltars vollständig in etwas verwandeln wird, das als nützlicher für die Herstellung aus einem Guss angesehen werden kann. Durch das langsame Absaugen der LP vom Blutaltar beginnt die Aufladungsrune mit der Speicherung von "Aufladung", einem internen Wert des Blutaltars, der mit dem Siegel des Sehers sichtbar ist. Wenn der Blutaltar genügend Ladung hat, wenn er etwas zum Herstellen bekommt, wird er die erforderliche Ladung sofort verwenden und den Gegenstand sofort herstellen. Wenn nicht genügend Ladung vorhanden ist, wird die Ladung verwendet, um den Fortschritt des Gegenstands in einem Verhältnis von 1:1 Ladung:LP zu erhöhen. Die maximale Ladungsmenge, die im Blutaltar gespeichert werden kann, ist eine Funktion der Anzahl der Ladungsrunen, die er mit der aktuellen Kapazität des Altars multipliziert hat (die Kapazität des Altars tritt nur in Kraft, wenn sie größer als 20k ist). Die Rate, die er auflädt, hängt auch direkt von der Geschwindigkeit des Altars ab, mal der Anzahl der Aufladungsrunen, die er hat, und er wird LP alle 20 Ticks (eine Sekunde) in Charge umwandeln. Wenn ihr also einen Blut-Altar mit dieser Rune entwerfen wollt, dann müsst ihr alle synergistischen Beziehungen, die sie hat, sorgfältig abwägen. -guide.bloodmagic.entry.architect.acceleration.info=Im Gegensatz zu den meisten Runen funktioniert die Beschleunigungsrune nur dann am besten, wenn sie mit anderen Runen gepaart wird, und ihre Wirkung nimmt nur begrenzt zu. Was diese Rune tut, ist, dass sie die Anzahl der Verarbeitungs-Ticks erhöht, die in einem bestimmten Zeitraum auftreten können, insbesondere wenn es um die Rune der Verlagerung und die Aufladungsrune geht. Für jede hinzugefügte Rune verringert sich die Anzahl der Ticks vor dem nächsten Verarbeitungs-Tick um eins. Zum Beispiel verdrängt die Rune der Verdrängung standardmäßig Flüssigkeiten mit einer Geschwindigkeit von einer Operation pro 20 Ticks - bei 10 Beschleunigungsrunen würde dies mit einer Geschwindigkeit von einer Operation pro 10 Ticks geschehen.\n\tDie maximale Anzahl der Beschleunigungsrunen, die derzeit von Bedeutung sind, ist natürlich 19 - wenn du so viele hast, werden die Rune der Verdrängung und die Aufladungsrune beide ihre Effekte jeden Tick aktivieren. Noice! - -guide.bloodmagic.entry.architect.tier3.info=Es ist bekannt, dass ein Altar der Stufe 3 erfordert, dass man vier Säulen mit Glowstoneblöcken aus dem Nether bedeckt. Was nicht durchweg verstanden wird, ist, dass man stattdessen Seelaternen verwenden kann. Wenn du dich also sehr weit weg vom Nether befindest, aber Zugang zu den Ozean-Tempeln hast, kannst du andere Wege nutzen, um dich in der Blutmagie weiterzuentwickeln. - -# Demon Kin Entries -guide.bloodmagic.entry.demon.intro=Bella Highborn -guide.bloodmagic.entry.demon.snare=Dämonischer Wille und Fallen -guide.bloodmagic.entry.demon.forge=Höllenfeuerschmiede -guide.bloodmagic.entry.demon.petty=Winziges Juwel des Tartaros -guide.bloodmagic.entry.demon.sword=Empfindsames Schwert -guide.bloodmagic.entry.demon.lesser=Kleines Juwel des Tartaros -guide.bloodmagic.entry.demon.reactions=Unerwartete Reaktionen -guide.bloodmagic.entry.demon.sentientGem=Empfindsame Rüstung -guide.bloodmagic.entry.demon.routing=Gegenstands-Routing -guide.bloodmagic.entry.demon.aura=Dämonische Willensaura -guide.bloodmagic.entry.demon.types=Verschiedene Typen von Wille -guide.bloodmagic.entry.demon.crucible=Dämonenschmelztiegel -guide.bloodmagic.entry.demon.crystallizer=Dämonenkristallisierer -guide.bloodmagic.entry.demon.cluster=Dämonische Kristallgruppen -guide.bloodmagic.entry.demon.pylon=Dämonenpylon -guide.bloodmagic.entry.demon.gauge=Dämonischer Auramesser - -# Demon Kin Entry Texts -guide.bloodmagic.entry.demon.intro.info=Mein Name ist Bella Highborn, und ich bin bekannt als das Dämonenkind. Vor einigen Monaten wurde mein Dorf von einer Welle von Dämonen angegriffen, die alle anderen Menschen töteten und dabei jedes einzelne Gebäude zerstörten. Ich erinnere mich nicht viel von dem Angriff, außer den Schmerzensschreien, da jede Person, die ich kannte, diese Welt für eine glücklichere verließ. Glücklicherweise hörten mich die Dämonen nicht, als ich mich unter die Obstkörbe im Keller der Kirche von Intactilis kauerte und verzweifelt versuchte, meine Schreie davon abzuhalten, sich dem Chor anderer Stimmen anzuschließen. Es gab einen schrecklichen Moment, als ich versehentlich den Räucheraltar der Kirche niedergerissen habe und ein Dämon in das Heiligtum kam, unbeirrt von dem, was wir für einen heiligen Ort hielten. Es war ein riesiges vierbeiniges Monster, mit geschwungenen Stoßzähnen, die an einem hervorstehenden Mund vorbei hingen, wobei der Speichel auf gezackte Schwerter tropfte, die seine Krallen ersetzten. Es hat sich im Raum umgesehen und ich schwöre, dass wir uns für eine Sekunde gegenseitig in die Augen gesehen haben, aber dann ist es einfach weggegangen, als ob es nichts gehört oder gesehen hätte. Alles danach war verschwommen. Es war ein ganzer Tag, bevor jemand kam, um zu sehen, was passiert ist. Eine Handelskarawane sah den Rauch in der Ferne und beschloss, den langen Weg an den Dämonen vorbei zu gehen. Viele der Händler wollten mich nicht einmal anschauen, weil sie befürchteten, dass es ein schlechtes Omen war, weil ich es allein schaffte, unbeschadet zu überleben. Aber zwei Brüder beschlossen, Mitleid mit mir zu haben und den Rest der Karawane davon zu überzeugen, mich mitfahren zu lassen. Ich musste den Zauberstab und das Medaillon der Priesterin verkaufen, aber ich schaffte es, einen sicheren Weg in ein Dorf zu finden, das weit genug vom Pfad der Zerstörung der Dämonen entfernt war. -guide.bloodmagic.entry.demon.snare.info.1=Magus sagte mir eines Tages, dass jedes Lebewesen eine Seele hat: Menschen, Hühner, Schafe und sogar Creeper haben diese Lebenskraft, die dem Körper den Willen zum Leben geben würde. Es scheint, dass Magus in seiner Zeit viele Experimente gemacht hat und sogar von einem mächtigen Magier gehört hat, der diese Seelen in leere Gefäße wie Zombies verwandeln könnte. Aber das ließ mich fragen: Wenn Zombies und Skelette keine Seelen hatten, warum hatten sie dann den Willen zu leben? Was animierte sie, damit sie versuchen würden, jedes Lebewesen zu jagen und zu töten?\n\tEs kam alles zu Dämonischen Willen zurück, jedes einzelne Mal. Alles "Lebende" musste einen Willen haben, um zu überleben, aber es bedeutete nicht, dass es ihr eigener sein musste. Als ich das zu Magus brachte, dachte er ein wenig darüber nach, brachte dann eine Tafel und Kreide heraus (von wo, wer weiß) und begann, einige Notizen über andere Formen der Magie zu zeichnen. "In der Thaumaturgie", sagte er, während er die Form eines Strohmannes skizzierte, "sind Golems animierte Wesen, die beauftragt sind, viele alltägliche Operationen durchzuführen. Sie leben, atmen und können sogar sterben, wenn sie bei ihren Herren in Ungnade fallen. In der gegenwärtigen Iteration der Thaumaturgie, und ja, es gab im Laufe der Jahrhunderte mehrere Versionen dieser Kunst, würde der Magier dessen Willen in die unbelebte Schöpfung einfließen lassen und sie zum Leben erwecken.\n\t "Dies, Bella, ist wie Golems arbeiten: durch eine Einprägung von Willen."\n\tAlso wenn ein Golem durch die Einprägung des Willens einer anderen Entität in dessen leere Hülle leben kann, vielleicht bringt eine andere Entität die Körper der Toten als Skelette und Zombies zurück ins Leben. An diesem Punkt zitterte ich und erinnerte mich kurz daran, was in meinem alten Dorf geschah. Nur ein Dämon kann etwas so Grausames tun. Aber um diese Hypothese zu testen, brauchte ich mehr Beweise. -guide.bloodmagic.entry.demon.snare.info.2=Mit etwas Anleitung von Magus und Tiberius, als er mir eine Hand von seiner eigenen Arbeit geben konnte, machte ich mir eine rudimentäre Schlinge aus Eisen, Schnur und ein wenig Redstone. Tiberius, der die Thaumaturgie als disziplinübergreifende Magie seiner Wahl vertieft studierte, sagte, dass die Falle in der Lage sein sollte, den Willen einer Entität zu stören, die ein animiertes Objekt kontrolliert. "Ich habe damit herumgealbert, als ich mit Golems spielte", sagte er lächelnd. Wir alle wussten, wie gut das ausgegangen ist. "Redstone schien die Verbindung zwischen meinen Golems und meinem Willen, sie zu bewegen, zu stören. Theoretisch, wenn etwas die Zombies oder Skelette kontrolliert, solltest du in der Lage sein, den Willen abzuschneiden."\n\tEr sagte, dass alles, was ich tun musste, war, es zu werfen - wenn es funktionierte, sollte etwas weißer Staub für eine gewisse Zeit aus dem Wesen strömen. "Also musst du es töten, wenn das passiert, damit wirklich etwas passiert. Aber die Schlinge könnte nur zu 25%% der Zeit funktionieren, also sei ein wenig großzügig mit ihnen!", nachdem ich sechzehn von ihnen hergestellt hatte, ging ich während der Nacht mit meinem Schwert aus. Es war ziemlich heikel: Ich musste mehrere Zombies ausfindig machen, mich ducken und ihnen ausweichen, während ich ein paar Fallen auf sie warf. Sobald die weißen Partikel von ihnen abgelöst wurden, tötete ich sie schnell und nahm die Ãœberreste ihrer Körper auf. Eine kleine Menge einer blauen viskosen Flüssigkeit schien in dem körnigen Staub zu liegen, der mir zu mir rufen zu schien. Ich hob es auf, und es schien, als käme eine jenseitige "Präsenz" aus der Flüssigkeit. Als ich die Proben schnell verstaute, entschied ich mich, sie tiefer zu betrachten, als ich nach Hause kam. Es schien, dass die Größe und Form jedes "Dämonischen Willens" variierte, als ob die Qualität des Willens von der Quelle abhängt. Mit einer völlig willkürlichen Maßeinheit scheint der Wille, den ich von den Fallen bekommen habe, zwischen null und fünf "Willensqualität" zu liegen. Ich bin mir noch nicht sicher, wofür ich diese Substanz verwenden kann, aber sie ist trotzdem sehr faszinierend. Ich kann nicht sagen, ob dies der Abdruck des Willens eines Dämons ist, oder nur ein zufälliger Kristall, der in ihren Körpern gefunden wurde. Mehr Forschung ist notwendig. -guide.bloodmagic.entry.demon.forge.info.1=Ich habe mehrere Wochen damit verbracht, den Nutzen und die Eigenschaften des dämonischen Willens zu erforschen. In den letzten Tagen gab es einige Erfolge, aber nur selten. Tiberius fragte mich neulich, ob er eine Probe des dämonischen Willens für ein paar seiner anderen Experimente nehmen könnte: Er erwähnte, dass es das sein könnte, was er brauchte, um einen neuen Blutaltar zu bauen, um das ramponierte Becken zu ersetzen, das wir in Magus' Keller benutzten, da der Versuch, dieses alte Ding mit nur Stein zu replizieren, nie den richtigen Behälter für unsere Blutmagie zu schaffen schien.... Mit anderen Worten, er denkt, es könnte helfen. Es war keine komplette Verschwendung. Ich habe verschiedene Alchemie-Lehrbücher zu "Äquivalente Umwandlung" und den vielen verschiedenen Möglichkeiten, Materie zu manipulieren, konsultiert. Ich sprach auch mit ein paar Alchemisten, die vorbeikamen, und sie gaben mir ein paar Tipps, wie man Materie und Energie dekonstruieren kann, um sie genauer zu studieren. (Als Nebenbemerkung muss ich sagen, dass ich die dunkelviolette Rüstung liebte, die ein Alchemist trug - schon beim Betrachten fühlte ich mich, als würde ich von einem dichten Gegenstand angezogen. Von Tiberius mal ganz abgesehen!) Durch die Verwendung dieser einfachen Anordnungen mit den kleinen Proben, die ich hatte, konnte ich sehen, dass es Möglichkeiten gab, die Energiequelle im Inneren des dämonischen Willens anzuzapfen. Ich brauchte nur die richtige Konfiguration. -guide.bloodmagic.entry.demon.forge.info.2=Gerade heute habe ich es geschafft, eine Struktur zu entwickeln, von der ich glaubte, dass sie Elemente mit diesem rohen Willen zusammenfügen würde. Als "Höllenfeuerschmiede" bezeichnet, verwendet die Struktur eine einfache, in das Glas geschnitzte Alchemische Anordnung, um bis zu vier Gegenstände miteinander zu verschmelzen und sie mit dämonischem Willen zu injizieren. Das Stück dämonischen Willens wird auf der rechten Seite platziert und die vier Zutaten werden um den Kreis gelegt. Es scheint, dass es viele verschiedene "Rezepte" in dieser Schmiede gibt, aber es gibt einige Bedingungen für diese. Für den Anfang gibt es ein Minimum an dämonischen Willen, der in der Probe sein muss, damit sich die Gegenstände verbinden können - wenn es nicht genug Willen in der Struktur gibt, scheint nichts zu passieren. Zunächst scheint es, dass, obgleich es eine minimale Menge des Willens benötigt, die meisten Rezepte nicht den gesamten Willen der Probe verwenden. Einige Rezepte benötigen eine große Menge an dämonischem Willen, um den Prozess zu starten, aber nur ein wenig wird in der Herstellung verwendet, wenn überhaupt. Einige Rezepte scheinen in großen Mengen sehr einfach zu erstellen zu sein, aber andere... nicht so sehr. -guide.bloodmagic.entry.demon.petty.info.1=Ich ging auf eines meiner nun allnächtlichen Abenteuer, um etwas dämonischen Willen zu sammeln, als ich anfing, eines der größten Probleme mit der Sammelmethode zu erkennen: meine Tasche wurde immer voller von all den Proben! Aus irgendeinem Grund, vielleicht weil die ultimative Quelle des dämonischen Willens für jede Probe anders ist, würde der Wille nicht in eine überschaubare Form komprimiert. Zumindest die physische Manifestation des Willens. Also ging ich zur Arbeit mit der Höllenfeuerschmiede, die sich in meiner Ecke des Hauses befand, schob einige von Tiberius' weniger unangenehmen Experimenten beiseite und besorgte einige Rohstoffe für mein eigenes Studium. Eines Tages werde ich Tiberius eine eigene Schmiede machen, da ich es satt habe, den ganzen Staub, der meinen Arbeitsplatz bedeckt, von seinen "arkanen Experimenten" loszuwerden. Es ist mir egal, dass du "versuchst, die Kluft zwischen den ätherischen Strängen des Seelen-Netzwerks und der physischen Konstruktion der Schiefertafeln zu überbrücken", hol deine verdammte Asche aus meinen Sachen! -guide.bloodmagic.entry.demon.petty.info.2=Wie auch immer, es dauerte eine Weile, um Materialien zu finden, die am ehesten mit dem dämonischen Willen in Resonanz kamen, um ihn besser zu speichern. Lapis scheint der am leichtesten verfügbare Leiter dieser Energie zu sein, der als Weg für den zu kanalisierenden Willen dient. Nachdem ich etwas Redstone als Abschirmung gegen elektrische Felder in der Luft hinzugefügt hatte (zwei Energien zusammengenommen scheinen katastrophale Auswirkungen zu haben, zumindest sagte Magus das), Gold als Dämpfungsmittel und Glas als einfaches Gehäuse, gelang es mir, einen sehr einfaches "Juwel des Tartaros" zu schaffen. Das heißt "ein Juwel aus der Unterwelt, Tartaros." Nach weiteren Tests fand ich heraus, dass dieses Juwel bis zu einer Willensqualität von 64 halten könnte. Als ich danach versuchte, den dämonischen Willen aufzuheben, schien dieser direkt in den Edelstein zu gehen, wenn er nicht voll war - danach schien der Wille einfach... zu verschwinden. Praktisch für meinen Rucksack, aber sonst ein Rätsel. Ich erfuhr auch, dass, wenn ich den Edelstein in meiner Hand halte und mich konzentriere (Rechtsklick), ungefähr 10% der maximalen Kapazität des Edelsteins in andere Edelsteine fließen würde, die ich auf meiner Person hatte. Ich denke, diese letzte Eigenschaft ist sehr hilfreich, besonders wenn wir andere, mächtigere Juwele entdecken sollten. -guide.bloodmagic.entry.demon.sword.info.1=Meine Fallen haben sich wieder verheddert.\n\tEs scheint keine Rolle zu spielen, wie sehr ich versuche, das Design zu verbessern, die rudimentäre Schlinge scheint nie perfekt zu funktionieren. Es verheddert sich nur die meiste Zeit, und wenn ich es endlich schaffe, einen Zombie damit zu treffen, ist es wahrscheinlicher, dass es nicht funktioniert als dass es tut, was es soll. Um mich davon abzuhalten, mir selbst die Haare auszureißen, ging ich wieder zur Schmiede und machte mich sofort an die Arbeit.\n\tNun, nicht sofort, schließlich musste ich zuerst noch die Asche entfernen. -guide.bloodmagic.entry.demon.sword.info.2=Ich fusionierte die Fähigkeit des Winzigen Juwels des Tartaros, dämonischen Willen zu halten mit einem eisernen Schwert und schuf eine Klinge, die.... sehr stumpf war und kaum mehr Schaden anrichtete als meine Faust. Ich war eigentlich sehr enttäuscht über das Ergebnis, denn es dauerte eine lange Zeit, mit der Schmiede herumzuexperimentieren, sodass sie durch die Belastung, ein Winziges Tatarisches Juwel als Energiequelle zu nutzen, nicht überhitzte.\n\tDoch sobald ich mein Tartarisches Juwel aufhob, begann das Schwert mit einer neuen Energie zu leuchten. Es scheint, dass je höher die Menge des dämonischen Willens, die ich an meiner Person habe, desto mehr Schaden ich mit dem Schwert anzurichten scheine und desto mehr Dämonischer Wille kann von den Kreaturen absorbiert werden. Wann immer du kein Juwel hast, ist die Quantität des Willens sehr.... gering.\n\tNach einem kleinen Test kam ich zu einer anderen Erkenntnis: Je nachdem, was ich töte, bekomme ich unterschiedliche Mengen von Willen. Es scheint proportional zur Menge der maximalen Gesundheit, die das Monster hat - eine Spinne, da sie eine maximale Gesundheit von 8 Herzen hat, gibt 80%% des Willens eines Zombie, der 10 Herzen hat. Das liegt wahrscheinlich daran, dass diese Monster mehr Willen benötigen, um zu animieren. Ich sollte das für spätere Erkenntnisse beachten. -guide.bloodmagic.entry.demon.lesser.info.1=Ich habe mich heute mit Tiberius unterhalten und einige seiner Projekte besprochen. Ich muss sagen, wenn wir über seine Forschung sprechen, scheint es, dass er immer weiter und weiter und weiter geht! Wie auch immer, eine der jüngsten Erfindungen, über die er sprechen wollte, waren seine Siegel: Bis jetzt ist es ihm gelungen, ein Wassersiegel und ein Lavasiegel zu erschaffen, wobei er die Höllenfeuerschmiede benutzte, die ich schließlich für ihn konstruiert habe, um sie zu erschaffen. Ich war mir nicht ganz sicher, wie er sie tatsächlich hergestellt hat - ich wusste, dass er experimentierte, indem er einige Zutaten nahm und sie in der Schmiede mit dem Tartarischen Juwel als Katalysator kombinierte, aber ich habe ihn noch nicht aktiv experimentieren sehen. Nun, ich habe endlich einen Einblick bekommen, wofür er diese verdammte Asche benutzt.\n\tMal sehen, ob ich genau nachahmen kann, was er gesagt hat. Ahem. "Durch die Verwendung des Dämonenwillens, der in diesen Edelsteinen enthalten ist, um die Inhaltsstoffe umzuwandeln, entsteht eine Reaktion zwischen Dingen, die normalerweise nichts tun, wenn sie kombiniert werden. Indem ich diese erzwungene Synergie nutze, bin ich in der Lage, mehrere arkane Symbole in Muster einzuschreiben, die die Energie zu lenken, die ich selbst hinzufüge, um die gewünschte Aufgabe zu erfüllen." Obgleich es niedergeschrieben nicht sehr anschaulich ist, stell dir sich vor, wie ich das sage, während ich eine Brille den Nasenrücken hochschiebe. Ich bin mir nicht sicher, ob er normalerweise so ist, aber ich schwöre, er wird komplett... wissenschaftlich, wenn er mir die Dinge erklärt. Nach der zugegebenermaßen auffälligen Demonstration kam er dann zum Kern der Diskussion. "Wenn ich versuche, diesen Prozess mit einigen fortschrittlicheren Materialien zu replizieren, scheint es, dass die Reagenzien... explodieren, wenn sie der Alchemischen Anordnung hinzugefügt werden. Sie scheinen sehr instabil zu sein. Ich denken, dass die Zutaten nicht richtig miteinander verschmolzen werden - vielleicht ist nicht genug Energie in der Schmiede, um sie richtig zu verschmelzen."\n\tNachdem ich ein paar Minuten darüber nachgedacht habe, machte ich an die Arbeit - wie ich in einem früheren Eintrag erwähnt habe, dachte ich, dass ein stärkeres Juwel erforderlich wäre, aber ich habe immer noch nicht genau herausgefunden, wie ich das auf elegante Weise machen könnte. Also beschloss ich, dass ein brachialer Ansatz dafür ausreichen würde! -guide.bloodmagic.entry.demon.lesser.info.2=Ich nahm einen Block Lapis, einen Block Redstone und einen Diamanten sowie einen leeres winziges Tartarisches Juwel, das ich herumliegen hatte - Teil eines vergangenen Experiments, das.... nicht gerade gut lief. Alles, was ich dazu sagen kann, ist, dass ich überrascht bin, dass Magus Löcher in einer festen Betonwand einfach verschwinden lassen kann. Dann kombinierte ich diese vier Gegenstände in der Höllenfeuerschmiede mit einem gefüllten winzigen Juwel, um als Energiequelle zu dienen - ein Minimum von 60 Wille scheint erforderlich zu sein. Nach ein wenig Mühe, eine optimale Anordnung zu finden, setzte ich sie dann zusammen und beobachtete, wie das leere Tartarische Juwel innerhalb der Schmiede zu wachsen begann.\n\tNur nebenbei, ich versuchte, einen Block Gold statt einen Diamanten zu nutzen, um das Juwel wachsen zu lassen, jedoch scheint es, dass eine weitere Kristallstruktur vorteilhafter ist.\n\tDieses neue, "Geringe Juwel des Tataros" scheint eine wesentlich höhere Kapazität zu besitzen, indem es fähig ist, bis zu 256 Rohen Willen halten zu können. Hoffentlich ist das genug, um Tiberius' Bedarf an großen Mengen an Willen für eine Weile zu stillen. Aber leider scheint es, dass ich dieses Juwel auffüllen muss. Eine weitere lange Nacht liegt vor mir! -guide.bloodmagic.entry.demon.reactions.info=Ich bin heute in einem Krankenbett aufgewacht und habe Schmerzen. Ich öffnete die Augen und sah das dumpfe Magenta, das die Decke des "Mächtige Flüche"-Flügels des Krankenhauses in Veteres bildete, der unserem Dorf am nächsten gelgenen Stadt. Ich war nicht gerade beunruhigt über diese Information: es hat mich so verwirrt, dass ich irgendwie hier gelandet bin, während ich scheinbar nur mit Kratzern und blauen Flecken bedeckt war, plus einem einfachen Gips auf meinem linken Bein. Jemand muss einen "Ossa Fracta"-Fluch auf mich geworfen haben oder so, denn es könnte nur ein einfacher gebrochener Knochen sein! Als Magus mit einer der Schwestern mit einem ernsten Gesicht reinkam, wusste ich, dass es etwas drastischeres war. Anscheinend habe ich einen kleinen Rückschlag mit einem meiner Experimente mit dem neuen Geringen Tatarischen Juwel erlitten und eine kleine, aber kräftige Explosion ausgelöst. So viel konnte ich leicht verstehen, aber das war es nicht: Die Mischung aus Obsidian, Eisen und Diamant, die ich benutzte, beschichtete meinen linken Unterschenkel und bildete eine starre Schale, die nicht entfernt werden konnte. Der Gips, den ich auf meinem Bein hatte, war eigentlich kein Gips, sondern eine Art Runenmatrix, die die hellblaue Schale bedeckte. Ich fragte, was Magus dachte, obwohl ich mir ziemlich sicher war, was passiert war. "Ich glaube", sagte er und blickte auf die Krankenschwester, die ihm aufmerksam zuhörte, bevor sie mich ansah, "dass es einfach eine Art Rückstand ist, der auf Diamanten basiert, was der Hauptgrund dafür ist, dass wir ihn nicht entfernen können. Es ist auch mit etwas... jenseitiger Energie verwebt, was der Hauptgrund dafür ist, dass du hier bist, anstatt in einem Bett in der örtlichen Klinik - das Konglomerat ist seit dem Eldritch-Vorfall ziemlich streng in Bezug auf unbekannte Energie, die direkt mit Menschen in Verbindung ist, also mussten wir sicherstellen, dass es keine Probleme gab. "Ich sehe..." Normalerweise kümmert sich Magus nicht viel um Formalitäten wie z.B. sicherzustellen, dass das Konglomerat über unbekannte Energien informiert ist - ich experimentiere schon eine ganze Weile mit Dämonischen Willen, und es ist nicht so, dass das Konglomerat an unsere Tür klopft, um diese Magie registrieren zu lassen. Ich werde hier nicht viel ins Detail gehen, da ich nicht sehr versiert in der Politik bin, aber ich weiß, dass Magus nur sparsam daran teilnimmt. Das bedeutete, dass die Macht dieses Willens Magus sehr beunruhigte, vielleicht durch einige seiner vergangenen Erfahrungen...?\n\t "Ah gut, genug davon im Moment", sagte Magus und krempelte die Ärmel seiner Roben hoch. "Ich habe versucht, die Schale zu brechen, als ich sie zum ersten Mal sah, offensichtlich nachdem ich überprüft hatte, was sie war. Letztes Mal hatte es keine Wirkung, aber jetzt..." Es gab eine glühende Hitze auf meinem linken Bein, begleitet von einem blendenden roten Licht, als Magus seine Hände auf die blaue Schale schröpfte. Nach einem Moment, der sich wie eine Ewigkeit anfühlte, aber nur ein paar Sekunden gedauert haben muss, begann die Schale zu reißen und zu brechen und zerfiel. Ehrlich gesagt, es war irgendwie enttäuschend. versuchte ich aufzustehen, aber Magus schob mich mit einem kleinen Stoß zurück ins Bett. "Bella, du musst bleiben und dich ausruhen. Du kannst später mit deiner Forschung an den Juwelen fortfahren." Ich war zunächst verärgert, aber das ging schnell vorbei, da ich viel Zeit zum Nachdenken hatte. Der einzige Grund, warum Magus nicht in der Lage war, genau das Gleiche vorher zu tun, war wahrscheinlich, dass ich nach der Explosion immer noch mein Tartarisches Juwel bei mir hatte. Was auch immer mit meinem Bein geschah, musste direkt an den Dämonischen Willen gebunden sein, und sobald mein Juwel genommen wurde, konnte die Schale entfernt werden. Es brachte mich zum Nachdenken... -guide.bloodmagic.entry.demon.sentientGem.info.1=Nach ein paar Tagen "dringend nötiger Bettruhe", die von Magus vorgeschrieben und durchgesetzt wurde, beschloss ich, ein wenig zu recherchieren, vor allem über die empfindsame Ausrüstung, die ich bisher gemacht habe. Es gibt einfach so viel, dass ich nicht über das empfindsame Schwert und den Dämonenwillen im Allgemeinen Bescheid weiß. Sicher, wir wissen etwas von der Theorie, aber wenn man bedenkt, dass Magus und ich diejenigen waren, die die Theorie entwickelt haben, ist es schwer zu sagen, was genau sie ist. Magus sagte mir, dass er immer, wenn er einen Lehrling nimmt, darauf besteht, dass sie neben der Forschung, die er betreibt, eine andere Form der Magie lernen müssen. Tiberius bot mir an, Botanik zu lernen, aber ich spottete über die Idee - ein paar Blumen werden mir nicht viel helfen, wenn ich gegen Dämonen kämpfen muss! -guide.bloodmagic.entry.demon.sentientGem.info.2=Das Juwel der Empfindsamen Rüstung ist ein umschaltbarer Gegenstand, mit dem du deine empfindsame Rüstung an- und ablegen kannst. Wenn du mit der rechten Maustaste auf das Juwel klickst, während du mindestens 16 Dämonenwille in deinem Inventar hast, wird deine Rüstung durch einen Satz empfindsame Rüstung ersetzt, die alle Verzauberungen der ersetzten Rüstung kopiert - wenn du das Juwel wieder deaktivierst, erhältst du deine ursprüngliche Rüstung zurück. Das funktioniert auch, wenn du überhaupt keine Rüstung anhast. Die empfindsame Rüstung wirkt anfangs wie eine einfache eiserne Rüstung, die keine zusätzlichen Fähigkeiten außer Schutz bietet. Ähnlich wie andere empfindsame Werkzeuge bietet die Rüstung jedoch mehr Schutz, wenn du mehr Dämonenwille in deinem Besitz hast. Dies macht den Schutz wirklich mächtig, wenn man eine große Menge an Dämonenwille angesammelt hat. Der Nachteil dabei ist, dass jeder Treffer, den du nimmst, ein kleines Stück Dämonenwille aus deinen tatarischen Juwelen extrahiert, und wenn du zu niedrig wirst, wird deine Rüstung wieder in ihre ursprüngliche Form zurückkehren. Könnte unangenehm werden! -guide.bloodmagic.entry.demon.routing.info=Der Gegenstandstransport in der Blutmagie kommt von der Verbindung von Strängen des Dämonischen Willens zwischen Verteilerknoten, die als Leitungen dienen, um Gegenstände von einem Inventar in ein anderes zu transferieren. Lassen Sie uns zunächst erklären, wie jedes einzelne Element funktioniert: Jedes Verteilersystem benötigt einen Haupt-Verteilerknoten, der als Gehirn des Systems fungiert. Ein Eingangsknoten gibt Elemente in das System ein, und ein Ausgangsknoten gibt Elemente aus Ihrem System aus, und ein normaler Verteilerknoten hat keine spezielle Funktion.\n\tUm ein Netzwerk zu erstellen, musst du Knoten durch Shift-Klicken mit dem Knoten-Router miteinander verbinden. Solange ein Knoten irgendeinen Weg zu einem anderen Knoten verfolgen kann (und wenn er mit einem Haupt-Verteilerknoten verbunden ist), können sie miteinander kommunizieren.\n\tAllgemein kann gesagt werden, dass Gegenstände aus einem Inventar neben einem Eingangsknoten gezogen und in ein Inventar neben einem Ausgangsknoten gelegt werden. Um festzulegen, was wohin geht, sollte ein Filter verwendet werden. Durch Klicken auf eine der Schaltflächen in der Schnittstelle des Knotens kann ausgewählt werden, was in der angegebenen Richtung in das Inventar gelangt (N steht für Norden usw.). Wenn ein Gegenstandsfilter in den linken Schlitz des Knotens gesetzt wird, kann die Anzahl und Art der Elemente angeben werden, mit denen der Knoten auf Grundlage des Filters interagieren kann. Wenn ein Filter auf einen Eingabefilter gesetzt wird, können nur solche Gegenstände aus dem Bestand gezogen (es wird mindestens der angegebene Betrag zurückbehalten, wenn eine Menge angegeben ist). Wenn ein Filter auf einen Ausgabefilter gesetzt wird, kann nur diese Art von Gegenständen in das Inventar gelegt werden, bis zu einem Maximum der angegebenen Menge.\n\tEs gibt vier verschiedene Filterarten:\n\tPräzise - Der Gegenstand muss genau übereinstimmen, einschließlich NBT und Metadaten\n\tMod - Der Gegenstand passt, wenn er von einem der gefilterten Mods stammt.\n\tIgnoriere NBT - Der Gegenstandsfilter berücksichtigt keine NBT-Daten\n\tOre Dictionary - Jeder Gegenstand, der mit einer Ore Dictionary-Referenz der Filter übereinstimmt, ist erlaubt.\n\tDu solltest zwei Nummern sehen, wenn du den Filter in einen Knoten einsetzt: Die Menge und die Priorität. Wenn du auf einen der Gegenstände im Filter klickst, erscheint der Name des ausgewählten Gegenstands und darunter dessen Anzahl. Durch Setzen dieser Nummer kann dem Filter mitgeteilt werden, wie viele dieser Gegenstände im angeschlossenen Inventar auf Lager gehalten werden (entweder bis zu diesem Betrag, wenn es sich um einen Ausgabeknoten handelt, oder um den Betrag, der im Inventar verbleibt, wenn es sich um einen Eingabeknoten handelt). Wenn der Betrag des Filters auf 0 gesetzt ist, wird jede Menge für diesen bestimmten Filter erlaubt. Eingabeknoten ziehen so viel wie möglich aus dem Inventar, und Ausgabeknoten entziehen so viel wie möglich.\n\tDie zweite Zahl ist die Priorität des Knotens, geändert durch die Pfeiltasten daneben. Diese Nummer ist für jede Seite des Knotens unterschiedlich. Der Knoten, der die NIEDRIGSTE NUMMER im Netzwerk hat, wird zuerst verwendet. -guide.bloodmagic.entry.demon.aura.info=Wenn ein Wesen normal getötet wird, verdunstet es mit der Zeit und kehrt zu dessen Schöpfer zurück. Wenn es mit einer Schlinge gefangen wird, wird es aus dem Ätherischen in diese Ebene gezogen und steckt irgendwie fest. Wir haben dessen Programmierung im Grunde gebrochen, und es hat alle Aktionen eingefroren. Wenn wir es verbrennen, kehrt es in einen ätherischen Zustand zurück und kann den normalen Betrieb wieder aufnehmen. Wenn dieser Wille in die Luft gespritzt wird, können wir ihn auf verschiedene Weise nutzen. Einige von ihnen sind einfacher Natur, während andere ziemlich mächtig sind. Jedes Stück hat seinen eigenen gespeicherten Willen, wobei jede Art von Willen einzeln gespeichert ist (mehr dazu in einem anderen Abschnitt). Dieser Wille kann von anderen Blöcken und Gegenständen aufgerufen und manipuliert werden. -guide.bloodmagic.entry.demon.types.info=Bis jetzt ist die einzige Art von Dämonenwille, die wir besprochen haben, der rohe Wille. Wie der Name schon sagt, ist es die roheste und unverfälschteste Form des Willens, die es gibt, aber das bedeutet nicht, dass es rein ist. Tatsächlich nimmt Dämonischer Wille viele verschiedene Formen an: Roh ist der Typ, mit dem wir es normalerweise zu tun haben, aber es gibt auch korrosiv, zerstörerisch, rachsüchtig und standhaft. Der rohe Wille besteht aus einer Mischung aller vier dieser Typen und vielleicht mit anderen, noch unentdeckten Typen, aber wenn man sie einmal in diese verschiedenen Willenstypen aufgeteilt hat, scheint es unmöglich, sie zu rekombinieren.\n\tEs ist noch nicht klar, ob diese verschiedenen Typen von Willen aus verschiedenen Quellen stammen, aber wir kennen den Prozess der Erzeugung dieser verschiedenen Typen von Willen. Das Ritual "Resonanz des facettierten Kristalls" kann einen rohen Willenskristall in seine reinen Teile zerlegen, mehr dazu im entsprechenden Eintrag in "Der Ritualmeister". Ein Gerät, um rohe Willenskristalle zu erhalten, ist der Dämonenkristallisierer, dessen Eintrag weiter unten zu finden ist. Es mag mehr Arten von Willen geben, aber sie sind entweder nicht rein genug oder können einfach nicht in dieser Form erschaffen werden.\n\tKorrosiv repräsentiert den Wunsch, alle Dinge um sich herum zu zerstören, entweder mit Säure oder durch zermalmende Kraft. Wer diesen Willen beherrscht, kann lähmende Status-Effekte ausüben und ist immun gegen schreckliche Gifte.\n\tRachsüchtig kann als das Verlangen angsehen werden, ein Ziel ohne Ermüdung zu jagen. Normalerweise kann dies entweder als eine erhöhte Geschwindigkeit des Körpers gesehen werden, die Beute zu suchen, oder um sicherzustellen, dass ein Ziel nicht in der Lage ist, zu entkommen, während es ständig angegriffen wird.\n\tZerstörerisch, wie du wahrscheinlich ahnst, ist pure Kraft. Wenn dieser Wille richtig eingesetzt wird, können Angriffsstärke und allgemeine körperliche Fähigkeiten gewonnen werden. Es kann auch verwendet werden, um Dinge zu zerquetschen und zu zerschlagen, wenn es in anderen Anwendungen verwendet wird.\n\tStandhaft ist das Verlangen, sich von Schaden zu schützen. In den meisten Fällen sind die Herren dieses Willens das defensive Bollwerk der Gruppe, das in der Lage ist, mächtigen Angriffen standzuhalten und sie nicht einmal zu spüren. Wenn du am Leben bleiben musst, durch Rüstung oder durch Rituale, ist dies eine Wahl, die in Betracht gezogen werden sollte. -guide.bloodmagic.entry.demon.crucible.info=Der Dämonenschmelztiegel ist ein Gerät, das in der Lage ist, den Dämonenwille in einem tartarischen Juwel und anderen Gegenständen zu verbrennen, um ihn in die Aura des Chunks, in dem er sich befindet, zu injizieren. Es gibt verschiedene Möglichkeiten, den Tiegel zu benutzen: Eine der einfachsten Möglichkeiten ist es, ein tartarisches Juwel in den Tiegel zu legen, indem man mit der rechten Maustaste darauf klickt und ein solches Juwel in der Hand hält. Der Tiegel entleert dann den Willen aus dem Juwel, bis entweder die Aura mit dieser Art von Willen gesättigt ist (standardmäßig maximal 100) oder bis das Juwel leer ist.\n\tEin anderer Modus ist, das enthaltene Juwel zu benutzen, um den Willen aus der Aura zu ziehen - dies geschieht, indem man ein starkes Redstonesignal an den Tiegel anlegt und dann wird das enthaltene Juwel versuchen, so viel Willen wie möglich zu entziehen.\n\tZu guter Letzt kann ein einzelnes Stück dämonischen Willens verbrannt werden, solange die Aura genügent Platz bietet. Ein Beispiel dafür ist ein Willenskristall, der einen Wert von 50 hat. -guide.bloodmagic.entry.demon.crystallizer.info=Wie zuvor besprochen, ist die Dämonen-Aura die ätherische Manifestation des Dämonenwillens, und die Substanz, die man erhält, wenn man einen Mob tötet, ist dessen physische Manifestation. Der Dämonenkristallisierer fungiert als Ankerpunkt für den Dämonenwillen in der Aura, sodass sich dieser daran physisch manifestieren kann und verwandelt den ätherischen Willen wieder in eine physische Form als Kristalle.\n\tSicher wundert es dich, warum man den Willen nicht einfach aus einem tartarischen Juwel in einen Kristall formen kann. Denn indem wir den Willen in seine ätherische Form transformieren, reinigen wir ihn und erlauben dem Willen, seinen normalen Betrieb wieder aufzunehmen - denke daran, dass wir die Programmierung des Willens einfrieren, wenn wir ein Monster mit Dämonenwillen töten, so dass es nicht tun kann, wozu es ausgesandt wurde. Durch die Umwandlung in die ätherische Form in der Aura wird der Wille aktiver, und das ist der Wille, der vom Kristallisierer ergriffen wird. Schaut es einfach nicht komisch an.\n\tDamit der Dämonenkristallisierer funktioniert, muss er in einem Chunk mit einem hohen Anteil an Dämonen-Willen (80) eines bestimmten Typs stehen. Nach einer gewissen Zeit wird er den Willen der Aura verbrauchen, um eine Gruppe Dämonenkristalle mit einem einzigen Turm zu erschaffen. Es gibt zwei Möglichkeiten, wie der Kristallisierer wirken kann: Er kann einen Kristall aus einem bestimmten Willenstyp (korrosiv, zerstörerisch, rachsüchtig und unerschütterlich) bilden, wenn es genug Willen dieses bestimmten Typs gibt, oder er wird den rohen Willen aus der Aura nehmen, um einen Kristall zu erschaffen. In früheren Inkarnationen des Geräts war es möglich, rohen Willen aus der Aura in andersartige Kristalle zu verwandeln. Das ist jedoch nicht mehr der Fall: Ihr könnt immer noch neue Türme eines bestimmten, angestrebten Willens erschaffen, wenn es genug davon in der Aura gibt, aber ihr müsst andere Mittel suchen, um die vielen Aspekte vom rohen Willen zu trennen. Siehe den Eintrag "Resonanz des facettierten Kristalls" in "Der Ritualmeister" für weitere Details. -guide.bloodmagic.entry.demon.cluster.info=Der Dämonen-Kristallhaufen kann entweder von einem Dämonen-Kristallisator oder in der Höllenfeuer-Schmiede mit Dämonen-Will-Kristallen erschaffen werden. Handwerkliche Cluster können auf jeder festen Oberfläche, wie z.B. dem Boden, den Wänden und den Decken platziert werden. Es gibt maximal sieben Türme auf dem Kristall, wenn er ausgewachsen ist, und wenn er mit einer Spitzhacke gebrochen wird, wird er die Türme als Dämonen-Will-Kristalle fallen lassen. Wenn du jedoch mit der rechten Maustaste auf den Cluster klickst, wenn du ein Tartarisches Juwel mit mehr als 1024 rohem Willen in ihm hast, kannst du einen einzelnen Turm aus dem Cluster abbrechen, ohne den Cluster selbst zu brechen; dies wird niemals den Hauptturm aus dem Cluster brechen.\n\tWenn der Cluster zu seinen eigenen Geräten zurückkehrt, wird er einen Willen des gleichen Typs aus der Aura absaugen, um sich langsam zu entwickeln. Es gibt zwei Rituale, die benutzt werden, um diese Kristalle zu züchten und zu ernten: die "Versammlung der Verlassenen Seelen" und der "Riss des gebrochenen Kristalls ". Um herauszufinden, wie man sie benutzt, finde diese in "Der Ritualmeister". -guide.bloodmagic.entry.demon.pylon.info=Wie ihr vielleicht wisst, bleibt die Dämonen-Aura in ihrem eigenen Chunk, wenn es keine äußeren Einflüsse gibt. Nun, das ist einer dieser Einflüsse. Der Dämonenpylon fungiert als Leuchtfeuer für den Willen in der Aura und zieht den Willen aus den benachbarten Chunks (die Chunks, die in den vier Himmelsrichtungen direkt daneben liegen, nicht diagonal) in seinen Chunk. Der Pylon wird versuchen, den Willen in seinem Chunk mit seinem Nachbarn auszugleichen, so dass der Chunk des Pylons für jeden Willenstyp so viel Willen hat wie sein höchster Nachbar. Dieser Prozess geschieht jedoch nur in eine Richtung: Wenn der benachbarte Teil weniger Wille hat als der Teil des Pylons, wird der Wille nicht auf die Nachbarn übertragen. -guide.bloodmagic.entry.demon.gauge.info=Um zu sagen, wie viel Wille du in einem bestimmten Chunk hast, brauchst du einen Dämonischen Auramesser. Wenn sich dieser in deinem Inventar befindet, zeigt die Anzeige den Willen in dem Chunk an, welcher auf fünf Balken oben links auf dem Bildschirm abgebildet wird. Wie viel es genau ist, kann an der Verschiebung erkannt werden; rechts neben den Balken erscheinen Zahlen, die den Betrag auf die nächste ganze Zahl gerundet darstellen. - - - -# Alchemy Entries -guide.bloodmagic.entry.alchemy.intro=Einführung -guide.bloodmagic.entry.alchemy.ash=Arkane Asche -guide.bloodmagic.entry.alchemy.speed=Bewegungs-Anordnung -guide.bloodmagic.entry.alchemy.updraft=Aufwind-Anordnung -guide.bloodmagic.entry.alchemy.bounce=Abprall-Anordnung -guide.bloodmagic.entry.alchemy.turret=Skelettgeschütz-Anordnung -guide.bloodmagic.entry.alchemy.buff=Effekt-Anordnungen -guide.bloodmagic.entry.alchemy.fastMiner=Anordnung der Eile -guide.bloodmagic.entry.alchemy.furnace=Anordnung des Brennenden Ofens -guide.bloodmagic.entry.alchemy.teleport=Teleportations-Anordnung -guide.bloodmagic.entry.alchemy.standardTurret=Geschütz-Anordnung -guide.bloodmagic.entry.alchemy.laputa=Splitter von Laputa - - -# Alchemy Entry Texts -guide.bloodmagic.entry.alchemy.intro.info=Mein Name ist Vlad Highborn, und ich bin ein Blutmagier. Ich habe die komplizierte Funktionsweise der Alchemie und den Prozess des "Äquivalenten Austausches" studiert, der alle Aspekte der Magie regelt. Grundsätzlich kann man nichts aus dem Nichts erschaffen, obwohl viele es bei der Suche nach einem bestimmten Stein versucht haben. Das ist offensichtlich nicht gut ausgegangen, denn auch heute werden viele Leute durch eine Fälschung getäuscht. Natürlich reicht es nicht aus zu sagen, dass ich Alchemist bin, denn eines der wichtigsten Dinge, die ich tue, ist das Studium der Blutmagie mit dem Ritualmeister und dem Architekten, die beide diese Titel durch ihre eigenen Verdienste erworben haben. Magus und Tiberius waren im Laufe der Jahre damit beschäftigt, ihre eigenen Werke aufzunehmen, obwohl ich nicht glaube, dass Magus alles in einem Buch niedergeschrieben hat - ich habe noch keinen wirklichen Beweis gefunden. Von den Anwendungen der Arkanen Asche bis hin zu den komplizierten Funktionen des Alchemietisches findest du alles, was du über einige der komplexeren Elemente der Welt wissen musst. Nicht alles, was du wissen musst, ist in diesem Buch - für ein vollständiges Verständnis über Blutmagie musst du die anderen Einträge in diesem ganzen Band lesen. Du wirst keine Lügen zwischen diesen Seiten finden. -guide.bloodmagic.entry.alchemy.ash.info=Arkane Asche ist notwendig, um Alchemische Anordnungen zu erzeugen, mächtige Kreise, die verschiedene Effekte erzeugen können. Diese Asche wird mit der Höllenfeuerschmiede und Dämonenwilen hergestellt, wenn dir dieses Konzept also neu ist, konsultiere bitte das "Dämonenkind". Die Asche hat insgesamt zwanzig Verwendungen, bevor du eine weitere herstellen musst. Wenn du mit der rechten Maustaste auf den Boden (oder eine Wand, obwohl sie nur eine Richtung darstellt) klickst, schreibst du einen einfachen Kreis aus Asche ein. Wenn du die Asche erneut mit einem Gegenstand anklickst, wird dieser "in die Asche gelegt" - vorausgesetzt, dass dieser Gegenstand gültig ist, ändert sich die Form des Kreises, um anzuzeigen, dass er für den nächsten Gegenstand bereit ist. Wenn es sich nicht ändert, dann hast du etwas falsch gemacht. Sobald es sich verändert hat, kannst du den zweiten Gegenstand hineinlegen. Wenn dieser Gegenstand mit dem ersten übereinstimmt, beginnt sich der Kreis zu drehen und führt je nach dem Rezept, an dem er arbeitet, verschiedene Aktionen aus. Jeder Effekt, der nicht der Herstellung eines neuen Gegenstands dient, der mit diesen Arrays durchgeführt werden kann, kann in diesem Buch gefunden werden, und selbst wenn sich das Rezept durch Dritte ändert, wird es hier aktualisiert angezeigt. Die angezeigten Artikel sind die Reihenfolge, in der sie platziert werden müssen. -guide.bloodmagic.entry.alchemy.speed.info=Die Bewegungs-Anordnung erzeugt in dessen Zentrum einen kleinen Luftwirbel und nutzt eine kleine Menge an Energie, um diesen aufzuheizen. Danach, wenn ein Tier oder eine andere Art von Wesen in seinen Wirkungsbereich kommt, wird es in der Richtung, in die es durch die Kraft der Luft gebracht wurde, nach vorne geschleudert. Außerdem beseitigt das Array bei einem Sturz aus großer Höhe den Sturzschaden, der entstanden wäre. Sei einfach auf eine leichte Bewegung vorbereitet. Die Bewegungsrichtung ist in Richtung des Pfeils auf der Anordnung. Es sollte auch beachtet werden, dass du eine viel größere Distanz gewinnen wirst, wenn du auf das Array fällst oder springst, als wenn du einfach in sein Gebiet gehst. Das hat mit den Turbulenzen deiner Bewegungen zu tun, die eine viel größere Reaktion hervorrufen. -guide.bloodmagic.entry.alchemy.updraft.info=Mit den gleichen Prinzipien wie das Movement Array, lässt diese Anordnung eine Entität, die darauf trifft, in die Luft steigen. Natürlich muss jeder Benutzer vorsichtig sein, denn der Weg nach unten kann etwas beschwerlich sein! -guide.bloodmagic.entry.alchemy.bounce.info=Durch die Verwendung einer Wärmequelle in der Nähe des Zentrums, die nach unten gedrückt wird, versucht diese Anordnung, den Untergrund zu erweichen. Danach wandelt es Kohlenstoff und Wasserstoff in ein gummiartiges Material im Inneren der Erde um. Diese Kombination führt dazu, dass jede Entität, auf der Oberfläche aufprallt und der Sturzschaden beseitigt wird, der sonst entstehen würde. Dieses Aufprallen kann durch einfaches Schleichen gestoppt werden und dämpft dennoch den Sturz. -guide.bloodmagic.entry.alchemy.turret.info=Durch die Verwendung des Dämonenwillens, der immer noch ein Mob kontrolliert, kannst du den Verstand eines Skeletts übernehmen, um es dazu zu bringen, deine Befehle auszuführen. Wenn sich ein Skelett innerhalb des Bereichs dieser Anordnung befindet, wird es als Wachposten fungieren und feindliche Monster in der Nähe angreifen. Leider ist dieser Anordnung immer noch sehr experimentell, so dass es möglicherweise nicht sehr gut oder konsequent funktioniert. -guide.bloodmagic.entry.alchemy.buff.info=Durch rigorose Studien erkennt man, dass Alchemische Anordnungen ein breites Anwendungsspektrum haben. Bis jetzt ist es dir gelungen, mächtige Gegenstände durch Herstellung mit Alchemischen Anordnungen zu erschaffen, sowie ein paar Anordnungen, die funktionelle Vorteile wie schnelle Bewegung und schwache Formen der Teleportation bieten. Eine der Anwendungen, die du bisher noch nicht genutzt hast, ist die Bereitstellung mächtiger Stärkungszauber durch ein aktives Array.\n\t "Sträkungsanordnungen" sind die allgemeine Bezeichnung für Alchemische Anordnungen, die den Spielern in ihrem Wirkungsbereich einige Stärkungszauber bieten. Diese Wirkungsbereiche haben tendenziell einen sehr großen Radius, der nicht manipulierbar ist (im Gegensatz zu Ritualen). Da Alchemische Anordnungen jedoch kein Konzept eines Seelen-Netzwerks haben, müssen sie ihre Wirkung auf andere Weise entfalten: hauptsächlich durch direkte Blutopfer. Vereinfacht ausgedrückt bedeutet dies, dass die Anordnung, wenn es einen Stärkungszauber anwendet, dem Spieler, auf den es gewirkt wird, Schaden zufügt (HP nimmt). Aufgrund der direkten Natur dieser Opfer ist die HP -> Stärkungszauber-Konvertierung für Spieler im frühen Spiel viel günstiger als ähnliche Buffs im Mod. Wenn zum Beispiel ein Stärkungszauber von einem Siegel 100 LP für 10 Sekunden Aktivierung kostet, kann ein stärkerer Stärkungszauber von dem Array für 30 Sekunden für 1 HP angewendet werden (das sind 100 LP in einem T1-Altar ohne Runen). Dies kann in den frühen Stufen als viel effizienter angesehen werden, während es in den späteren Stufen nicht so effizient ist. Wegen des stationären Charakters der Arrays werden sie jedoch einen stärkeren Effekt haben als ihre Siegelgegenstücke, so dass man sie vielleicht noch im späten Spiel verwenden möchte. -guide.bloodmagic.entry.alchemy.fastMiner.info=Wenn es darum geht, ein großes Stück Land auszuheben, ist es manchmal am besten, es einfach von Hand zu machen. Für diese Gelegenheiten ist diese Anordnung genau das Richtige für dich. Die Anordnung wendet einen Eile III Stärkungszauber auf Spieler innerhalb eines Radius von 10 Blöcken an und kostet den Benutzer 1 HP pro 30 Sekunden. Da es sich um einen allgemeinen Eile-Effekt handelt, erhöht es auch dein Angriffstempo im Wirkungsbereich, obwohl du vorsichtig sein musst, da auch andere Spieler davon profitieren werden! -guide.bloodmagic.entry.alchemy.furnace.info=Eines der vielen Probleme, auf die du zu Beginn deines Abenteuers stoßen könntest, ist die Unfähigkeit, deine Öfen in Betrieb zu halten. Ein angezündeter Ofen kann den Unterschied zwischen einem vollen Magen und starken Waffen oder dem Verhungern in einer Höhle bedeuten. Die Anordnung des Brennenden Ofens, wie der Name schon sagt, wird eine dringend benötigte Wärmequelle für jeden Ofen in der Nähe sein. Indem die Anordnung direkt neben einem gewöhnlichen Ofen platziert wird (es können mehrere sein), wird diese dem Ofen Brennstoff liefern, wenn ein Vorgang abgeschlossen werden kann - nichts wird passieren, wenn es neben einem leeren oder vollen Ofen steht, hauptsächlich zu deinem Schutz. \n\tNatürlich kommt das nicht ohne seine Kosten: wenn sich eine Person in der Nähe aufhält (innerhalb eines Radius von 10 Blöcken), wird die Anordnung ein halbes Herz für bis zu zwei Prozesse im Ofen verbrauchen. Dies wird hilfreich sein, um entweder einen schnellen Biss zu bekommen oder einen vollen Erzstapel zu schmelzen, aber leider hast du keine Möglichkeit gefunden, der Anordnung irgendwelche Sicherheitsmaßnahmen hinzuzufügen... -guide.bloodmagic.entry.alchemy.teleport.info=Das Teleportations-Anordnung dient als Möglichkeit, sofort von einem Ort zum anderen zu reisen, mit einigen spezifischen Einschränkungen. Wenn ein Spieler oder eine andere Entität auf die Anordnung tritt, sucht diese bis zu 20 Blöcke entfernt in der Richtung, in die es zeigt, nach einer anderen Alchemischen Anordnung (die nicht aktiv sein muss). Wenn es der Anordnung gelingt, ein Ziel zu finden, wird sie die Entität sofort zur gefundenen Anordnung teleportieren, sogar durch Wände hindurch. Das Studium dieses Arrays hat gezeigt, dass es weitere Einschränkungen gibt: Wegen der Natur des Biegens des Raum-Zeit-Gefüges wird eine Teleportations-Anordnung nicht etwas teleportieren, das innerhalb von 2 Sekunden teleportiert wurde. Dies soll allen Komponenten Zeit geben, sich in gewünschter Weise neu zu ordnen. -guide.bloodmagic.entry.alchemy.standardTurret.info=Die Macht, spitze Gegenstände auf weit entfernte Monster zu werfen, kann nicht hoch genug eingeschätzt werden. Die Geschütz-Anordnung ist in der Lage, ein feindliches Monster in der Nähe zu spüren und durch die Verwendung komplexer alchemistischer Mechanismen einen Pfeil zurückzuziehen und abzufeuern, um sein Ziel zu treffen. Die Anordnung sucht nach einem Inventar direkt darunter. Findet sie entweder einen normalen oder einen getränkten Pfeil, wird er aus dem Inventar abgezogen und auf einen Mob geschossen, der sich in einem Radius von 32 Blöcken befindet. \n\t(Aufgrund einer dummen Minecraft-Physik, bei der Pfeile von Wesen abprallen, die zu nahe am Entstehungsort sind, wird der Turm auch nur auf einen Mob feuern, der mehr als 3 Blocks entfernt ist. Denke daran!) -guide.bloodmagic.entry.alchemy.laputa.info=Es gibt eine Geschichte über ein verlorenes Königreich, das so fortgeschrittene Magie hatte, dass es durch die Wolken fliegen konnte. Obwohl dieses Königreich inzwischen zu Staub zerfallen ist, haben es einige Zeichnungen dieser Burg am Himmel geschafft, exquisite Details über die Mechanismen zu liefern, die sie zu der Legende werden ließen, die sie ist. \n\tDer Splitter von Laputa wandelt die Lebensessenz, die sich in der Erde befindet, in eine mehr aviäre Form um, wodurch die Umgebung in der Luft schwebt. Während das zugrundeliegende Prinzip einfach ist, verursachen die Variationen der Lebensessenz in der Erde ein wenig Inkonsistenz in der Art und Weise, wie viel Land bewegt wird. Das Array bewegt die Erde in einem kugelförmigen Radius zwischen 4 und 8 Blöcken über sich selbst um einen zufälligen Versatz zwischen einem und 5 Blöcken plus dem doppelten Radius des Effekts. Es sollte beachtet werden, dass, sobald der Effekt beginnt, alle Elemente, die zur Aktivierung des Arrays verwendet werden, verloren gehen. diff --git a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang b/src/main/resources/assets/bloodmagicguide/lang/en_US.lang deleted file mode 100644 index eb1d180a..00000000 --- a/src/main/resources/assets/bloodmagicguide/lang/en_US.lang +++ /dev/null @@ -1,304 +0,0 @@ -# Book Information -guide.bloodmagic.title=Sanguine Scientiem -guide.bloodmagic.display=Sanguine Scientiem -guide.bloodmagic.author=Blood Magic -guide.bloodmagic.welcome=Blood Magic - -# Page Information -guide.bloodmagic.page.bloodAltar=Blood Altar Recipe -guide.bloodmagic.page.soulForge=Hellfire Forge Recipe -guide.bloodmagic.page.tier=Tier: %d -guide.bloodmagic.page.lp=LP: %d -guide.bloodmagic.page.minimumWill=Minimum Will: %f -guide.bloodmagic.page.drainedWill=Drained Will: %f -guide.bloodmagic.shapelessOrb=Shapeless Orb Recipe -guide.bloodmagic.shapedOrb=Shaped Orb Recipe -guide.bloodmagic.page.alchemyArray=Alchemy Array - - -# Categories -guide.bloodmagic.category.architect=The Architect -guide.bloodmagic.category.ritual=The Ritual Master -guide.bloodmagic.category.demon=The Demon Kin -guide.bloodmagic.category.spell=The Battle Mage -guide.bloodmagic.category.alchemy=The Alchemist - -# Ritual Master Entries -guide.bloodmagic.entry.ritual.intro=Introduction -guide.bloodmagic.entry.ritual.basics=The Basics of Rituals -guide.bloodmagic.entry.ritual.ritualStone=Ritual Stones -guide.bloodmagic.entry.ritual.masterRitualStone=Master Ritual Stone -guide.bloodmagic.entry.ritual.activationCrystal=Activation Crystals -guide.bloodmagic.entry.ritual.diviner=The Ritual Diviner -guide.bloodmagic.entry.ritual.fullSpring=Ritual of the Full Spring -guide.bloodmagic.entry.ritual.lava=Serenade of the Nether -guide.bloodmagic.entry.ritual.greenGrove=Ritual of the Green Grove -guide.bloodmagic.entry.ritual.magnetism=Ritual of Magnetism -guide.bloodmagic.entry.ritual.crusher=Ritual of the Crusher -guide.bloodmagic.entry.ritual.highJump=Ritual of the High Jump -guide.bloodmagic.entry.ritual.speed=Ritual of Speed -guide.bloodmagic.entry.ritual.wellOfSuffering=Well of Suffering -guide.bloodmagic.entry.ritual.featheredKnife=Ritual of the Feathered Knife -guide.bloodmagic.entry.ritual.regen=Ritual of Regeneration -guide.bloodmagic.entry.ritual.harvest=Reap of the Harvest Moon -guide.bloodmagic.entry.ritual.interdiction=Ritual of Interdiction -guide.bloodmagic.entry.ritual.containment=Ritual of Containment -guide.bloodmagic.entry.ritual.suppression=Dome of Suppression -guide.bloodmagic.entry.ritual.expulsion=Aura of Expulsion -guide.bloodmagic.entry.ritual.zephyr=Call of the Zephyr -guide.bloodmagic.entry.ritual.laying=Laying of the Filler -guide.bloodmagic.entry.ritual.timberman=Crash of the Timberman -guide.bloodmagic.entry.ritual.meteor=Mark of the Falling Tower -guide.bloodmagic.entry.ritual.downgrade=Penance of the Leadened Soul -guide.bloodmagic.entry.ritual.crystalSplit=Resonance of the Faceted Crystal -guide.bloodmagic.entry.ritual.portal=The Gate of the Fold -guide.bloodmagic.entry.ritual.altarBuilder=The Assembly of the High Altar -guide.bloodmagic.entry.ritual.pump=Hymn of Syphoning -guide.bloodmagic.entry.ritual.cobble=Le Vulcanos Frigius -guide.bloodmagic.entry.ritual.ellipsoid=Focus of the Ellipsoid -guide.bloodmagic.entry.ritual.crystalHarvest=Crack of the Fractured Crystal -guide.bloodmagic.entry.ritual.forsakenSoul=Gathering of the Forsaken Souls -guide.bloodmagic.entry.ritual.animalGrowth=Ritual of the Shephard -guide.bloodmagic.entry.ritual.livingEvolution=Ritual of the Living Evolution -guide.bloodmagic.entry.ritual.upgradeRemove=Ritual of the Cleansing Soul -guide.bloodmagic.entry.ritual.fullStomach=Ritual of the Satiated Stomach -guide.bloodmagic.entry.ritual.eternalSoul=Ritual of the Eternal Soul -guide.bloodmagic.entry.ritual.condor=Reverence of the Condor -guide.bloodmagic.entry.ritual.featheredEarth=Ritual of the Feathered Earth -guide.bloodmagic.entry.ritual.grounding=Ritual of Grounding -guide.bloodmagic.entry.ritual.veilOfEvil=Veil of Evil -guide.bloodmagic.entry.ritual.wardOfSacrosanctity=Ward of Sacrosanctity - -# Ritual Master Entry Text -guide.bloodmagic.entry.ritual.intro.info=Good evening. My name is Magus Arcana. I have had many guises over the years: a thief and a vigilante, a wizard and a warrior, a roaming nomad and even a politician. The title that I hold nowadays is one that many cannot comprehend, that at the very mention of it brings forth images of brutality that in some cases have been earned but in many others are misguided. I am of course talking about being a Blood Mage, though my friends simply call me Magus whereas my enemies refer to me as The Ritual Master.\n\tMy students have been pestering me for many months now, attempting to get me to document all of the myriad adventures that I have had in some form of book for me to distribute among any aspiring mages. I had been resistant, but it was Tiberius who put it best: "Although you may not see the value of it yourself, hearing the intricacies of any sort of craft from a man who has achieved mastership of the field will prove invaluable for future generations. It doesn't matter how accurately someone else retells it, if you don't have the utmost confidence in a source the gold sand could be nothing more than sulfur." You could tell he was delving into a bit of alchemy at that point, but since he was my first student for a long time I tend to value his opinion.\n\tSo, aspiring Blood Mage, training in the arcane that many yet do not fully understand, lend me your ears for these are words worth heeding: the field that you are studying has many aspects, and without careful consideration you may find your tools lacking. Therefore make sure to review this book often - I have put many enchantments on the tome that you carry with you so that whenever I write in my master copy the words will change for you.\n\tSo sit back, relax, and enjoy the teachings of a very old man. You may learn more than you've bargained for. -guide.bloodmagic.entry.ritual.basics.info=Modern day rituals are a lot different from those that were conducted centuries past. There was a time when people would inscribe arcane constructs out of dust on the ground and dance around until they got what they wanted. I even remember one hermit witch who gathered energy from her garden. I laughed at it all until she sicced her pet owl on me. \n\tThe rituals that Blood Mages use require the precise alignment of marked stones to focus and transform the power that a mage pumps into it. One day, my apprentice Tiberius was rummaging through some of the old artifacts that I had procured over the years in the closet of his new room. There was a vial of liquid Etherium that I haven't touched in ages (I was meaning to get back to that, but I haven't had any time) as well as a crystal ball that always seemed to say "Tuesday" when you peered through the glass. When one of the boxes that was labeled "Runic Dust" was knocked over a small red gem tumbled out and knocked against Tiberius's foot. Immediately a bright ruby light emanated from it and reacted with the dust in the box that he was carrying.\n\tNaturally, an explosion occurred. The unfocused energy that Tiberius inadvertently released through the gem sparked the runic dust and stones around him, and without a means of containing the power it simply was pushed outwards. After a few days in the medical ward, Tiberius and I started to get to work.\n\tThrough a mixture of several sleepless nights and a hardy helping of caffeine (I've really got to thank Mister Player for the coffee supply, I salute your efforts for a more awake tomorrow!) we eventually perfected the key ingredients for all rituals.\n\tThrough our experimentation, we learned that we needed four different things: we needed a bunch of ritual stones placed around an area in a set pattern, a few different inks that are applied to the ritual stones to help further specify the pattern, a central ritual stone that acts as a central conduit of power, and a crystal that activates the ritual. I think it's best to talk about these one by one. -guide.bloodmagic.entry.ritual.ritualStone.info.1=The Ritual Stone acts as a simple receptacle for magical energy, shaping it and further redirecting it in different ways depending on how the stone is configured. When you start off, there are five different stones that you have access to: Blank (the base stone that does not have any markings applied), Water, Fire, Air, and Earth. Every single ritual will have a number of these, and depending on how they are arranged around the Master Ritual Stone the overall effect will be different. -guide.bloodmagic.entry.ritual.ritualStone.info.2=In order to inscribe the correct symbols onto the ritual stones you must have a set of inscription tools. I have since developed a method for people to more easily apply the correct inks to the ritual stones while placing them in the correct configuration, but if one were to wish to do this manually they can use these tools. When you activate a ritual stone with one of the inscription tools in your hand (right clicking on the stone) you will apply some ink to the stone, changing it to the same type as the tool. In early tiers, you only have access to the base four colours, however once you become more powerful you will have more tools at your disposal. -guide.bloodmagic.entry.ritual.masterRitualStone.info=As with most magics, without a guiding force the effect of the ritual will either become uncontrollable or simply will not work at all. Thus, in order to control the rituals a Master Ritual Stone is required (I usually abbreviate this to "MRS" in my notes, but saying it in public is a little awkward. "I need more mrs please!"). The MRS takes in power from the owner's Soul Network and pushes it through the ritual stones, thus performing the ritual. \n\tAttaching the Soul Network to a large stone that we don't hold in our hands proved to be a bit tricky. I managed to do this one time by meditating on top of the stone in the lotus position, focusing my power through the stone and trying to link the tendrils of my network into the inner workings of the ritual. Although I got it working for a few minutes, all I was really awarded was a pair of wet pants as water condensed onto the ritual stones. I've learned to not meditate on any of my experiments again. -guide.bloodmagic.entry.ritual.activationCrystal.info.1=Instead of waiting an hour at a time to meditate a ritual active, we took the red gem that fell out of the box originally and started to analyze it. Tiberius was certain that it had the ability to "establish links between the corporeal realm of our reality and the incorporeal essence that is the manifested Soul Network." Sometimes I wonder if it was a good idea to have him become my apprentice, but it is times like these that I see his knack for the more arcane aspects of magic. Oh, I should probably write what he meant in English: by using this crystal, we could link our soul networks to the Master Ritual Stone in order to supply it with energy. -guide.bloodmagic.entry.ritual.activationCrystal.info.2=Thus we had ourselves a Weak Activation Crystal and a means in which to recreate its structure. The main ingredient for the crystal is another crystal that can be linked to my Soul Network: a Lava Crystal. Then, by quickly inscribing some instructions onto the crystal's surface the Blood Altar can do the rest of the work to transmute it into an activation crystal. Naturally, this crystal has to be bound to the user's soul network in order to function. When the ritual's stones are laid correctly around the MRS, the user should touch the activation crystal to the MRS and push out enough energy to jump start the ritual in question. If you have enough LP inside of your Soul Network the ritual will activate. If you do not, or if the stones are not laid out correctly, the ritual will simply not activate and no LP cost is incurred. -guide.bloodmagic.entry.ritual.diviner.info.1=After discerning the size and layout of many rituals I started to find it a little bothersome to continually consult my notes in order to build the rituals. That is why I worked to create a device that would allow anyone to simply place down the stones in the correct position through simple gestures and movements. I've placed this entry further up the list chronologically because it is best for people to learn of this item before starting with the actual construction of rituals. Otherwise they may find out that they don't have everything they need, or will summon a meteor from hell instead of a fresh bottle of spring water. -guide.bloodmagic.entry.ritual.diviner.info.2=The Ritual Diviner is essentially an encyclopaedia for rituals. By cycling through the diviner (shift-left click and shift-right click) you can select a different ritual from its store of knowledge. Gazing into the diviner will also tell you some simple information about the ritual. If you have Ritual Stones on your person and you touch the diviner onto the MRS (right click) you can place a stone for the ritual you want to construct. Doing this enough times will net you a completed ritual! -guide.bloodmagic.entry.ritual.fullSpring.info=A few years ago a travelling merchant stopped by the village near my house, peddling his wares to all who were willing to part with their coin. There was a drought at the time and the crops were dying, so the merchant brought forth a silver talisman with a blue gem set inside of it. "This, my friends," he said with great zeal, "will make sure that your rivers will not dry out! By using alchemy I can bring forth water from the very air!"\n\tUnfortunately for the village it seemed that the gem was a simple piece of sapphire, and before anyone realized that they were tricked he was already several miles away. I tend to not intervene in the affairs of the village because they tend not to like my magic, but in this case I made an exception. After I had a lovely chat with the "alchemist," I spent a few hours meditating near the irrigation channels. By condensing the water vapour in the air I managed to create enough water to keep the crops watered until the next downfall. This wasn't exactly an efficient method and I was drained for the next few days, using some of the water from the channel to rehydrate myself.\n\tRemembering this, I employed the same principles to create the Ritual of the Full Spring. By channeling a small amount of energy into the ritual, it condenses the moisture in the air around it to produce a source of water on top of the master ritual stone. The cost to activate the ritual is fairly insignificant, and the maintenance even more so. \n\tThe water's range can be expanded by using the ritual tinkerer and even placed in a different location, so one does not need to worry about where a ritual is placed if they are worrying about aesthetics. The miracles of magic! -guide.bloodmagic.entry.ritual.lava.info=Lava, perhaps one of the most rudimentary power sources. I tend not to use it much in my own research because it can be a little difficult to work with - it's not like you can use a simple iron bucket to pick some up! \n\tOne of the local tinkerers came by my house one day asking me if there were any sources nearby since they recently acquired some new hardware that they needed to power. I said that there were a few but most of them were already owned, but I decided to come to his place to look at the contraption.\n\tIt was a smeltery at least 5 metres high and just as wide, hooked up to several tanks that stood empty and barren. Although I wasn't entirely sure on how it operated I could tell that the raw heat of lava would be perfect for it - electricity would work well if it was modified correctly, but I could tell this wasn't from Immersive Industries. \n\tAfter a small chat with the tinkerer money changed hands and I asked him to stand back as I prepared my ritual stones. To enact what I wished I took four fire stones and arranged them in a cross around the master ritual stone and then pushed hard with my activation crystal while imagining the process in my head. In theory, it should be simple: take some rocks from deep in the earth and compress them with some energy, causing them to melt under the intense pressure and turn molten. This lava could them be retrieved off of the ritual stone and the process can be repeated.\n\tWhile simple in theory, in practice it was a little difficult. For my simple network at the time, the activation cost was quite steep because of the initial pressure required, and the drain for each source of lava was not something I was prepared for. (20000 LP to activate, 500 LP per source block)\n\tI staggered out of the building with a grin on my face, however: the tanks were full of lava, enough to keep the tinkerer in business for a couple fortnights until he could procure a more permanent source of lava. I made sure to pick up my ritual stones after I finished, though. \n\t----------\n\tWith no modifications to the ritual, the ritual will attempt to place a source of lava on the block directly above itself at a cost of 500 LP every tick if there is room, displacing liquids if they are flowing. This placement range, by default, can be expanded to a maximum of 9 blocks at a maximum distance of 3 away from the ritual.\n\tBy augmenting the ritual with Raw Will, the LP cost will decrease in proportion to the Will that is in the Aura, consuming Will proportional to the amount of LP that is saved. Using this Will can also grant the ability to place lava directly into a block's internal tanks, at a rate comparable to normal ritual operations.\n\tCorrosive Will causes the ritual to invert the invincibility granted from fire immunity, causing all entities that are immune to fire within a set area to be damaged severely based on the amount of Will in the Aura. Those that are not immune to fire are unhurt by this effect.\n\tWhen Vengeful Will is applied to the ritual, a volatile gas is released and causes all non-player entities within its specified range to be affected by Fire Fuse. When the timer of the debuff goes to 0, the entity will explode, forcefully propelling them into the air with explosive force.\n\tDestructive Will increases the maximum range and volume that the ritual may influence. The more Will you have, the more lava blocks that can be placed by a single ritual. Thankfully, the ritual does not drain any Destructive Will, however if your Will drops and the ritual's maximum range is lower than what you set it at, the ritual will not work at all until fixed.\n\tFinally, Steadfast Will grants all players within its range a Fire Resistance buff, whose time applied and cost in Will is affected by the amount of Will in the Aura. Careful note should be taken, because if you are affected by Fire Resistance you can be damaged by the ritual's Corrosive effect. -guide.bloodmagic.entry.ritual.greenGrove.info=Last week I started to teach Tiberius his cross-disciplinary magic. Every apprentice that I have had has had to learn another form of magic while learning Blood Magic. It doesn't matter much which one they choose as long as it does not consume some form of finite resource - I used to employ a form of magic from the Ars clan from the far East, but since the world's source of Etherium was consumed into scarcity it died out long ago. \n\tTiberius decided to learn Thaumaturgy, which employs using the magic of the world to perform your magic. This is a good counterbalance to Blood Magic, which uses the magic of life. As such, these magics use different means to perform the same tasks. To demonstrate I decided to highlight the differences to Tiberius when it comes to crop growth.\n\t"Thaumaturgy uses a growth catalyst that is fueled by the essentia Herba," I state while pointing towards the Essentia Flowchart that was pinned to the classroom wall. Sure, Tiberius was sitting at the only desk there, but sometimes a guy has to have some fun. "A small trickle of Aura and this essentia stimulates the photosynthetic process of the plant, encouraging it to grow by giving it more solar energy. This process requires that the soil is well fertilized, or else the crop can simply wither and die."\n\tI then take four earth and water ritual stones and place them in a circle around a master ritual stone. "Conversely, Blood Magic uses a different process." While speaking, I activate the ritual and cover it with some simple dirt. "By using your life force or the energy of animals, you can fertilize the plants in such a way that they don't need as much fertilizer. In essence, it force-feeds the plants so that they always have a high concentration of nutrients."\n\tI throw a few seeds onto the dirt and cover them slightly, uncorking and emptying a vial of water from inside my robes. "This process doesn't need any extra sunlight, because it uses a different source of energy. Though it does work much better when there is some light - the plant isn't exactly used to these sorts of conditions!"\n\tA few shoots have already poked their leaves out of the dirt while I was explaining, seemingly waving in response. I felt the mild strain on my body as each new leaf sprouted, minor each time but when accumulated it started to stack up. Once I finished the class I cleared up the dirt from the experiment and decided to have a nice stroll to the village: I had a bushel of wheat that needed selling. \n\t----------\n\tThe Ritual of the Green Grove, as the name may suggest, accelerates the rate of growth of plants that are nearby. By using the player's blood as a rich fertilizer, it will attempt to grow anything that it deems as a plant, such as wheat and carrots, growing anything within its range periodically. Through default operations, the ritual will look at the 3x3 area two blocks above itself and attempt to grow each block with a 30%% success rate every second. If manipulated with the Ritual Tinkerer, the ritual can handle a maximum of 81 crops at a time within a 5 block radius of the MRS. As another note\n\tWhen augmented with Demon Will, there are several effects that can be obtained. If Raw Will is used, the ritual will perform all operations at an accelerated rate, consuming 0.05 Will per successful growth and increasing its speed relative to how much Will is in the Aura.\n\tIf infused with Vengeful Will, the ritual will consume 0.05 Will per successful growth and will increase the chance that a given operational tick will be successful on the plant. By default without Will it is 30%%, but for instance if you have 100 Vengeful Will the rate will increase to 80%%.\n\tDestructive Will increases the effective maximum range of the ritual, meaning the more Will you have the more crops/plants a single ritual can handle. Thankfully, the ritual does not drain any Destructive Will, however if your Will drops and the ritual's maximum range is lower than what you set it at, the ritual will not work at all until fixed.\n\tSteadfast Will grants the ability to set an area around the ritual that will be automatically tilled and hydrated. Additionally, any seed that is within this range will be planted on a nearby block if possible. This costs a small amount of Steadfast Will, and its effects do not scale with Will in the Aura.\n\tWhen Corrosive Will is used in the ritual, the fundamental nature of the ritual may shift. When supplied and the new range is properly set, any mobs that enter in the ritual's area of influence will have the "Leech" effect applied. Every few ticks, the plants near the mobs will be damaged and the mob will be damaged proportionally. Fertilizing with mobs directly can prove beneficial! Every 10 seconds that the debuff is applied per mob, 0.2 Corrosive Will will be consumed. -guide.bloodmagic.entry.ritual.magnetism.info=The Ritual of Magnetism is the bread and butter of anyone who enjoys quarries. The ritual creates a revolving magnetic field, pulling up the rich ores from the ground underneath it and placing the contents in its area. This does not displace any rock, so no gaping holes will appear in the land - assuming that the land isn't made up entirely of ore. The ritual operates once every 40 ticks and costs 50LP per successful operation.\n\tThe default radius that this ritual operates is 3 blocks in each cardinal direction, giving an area of 7x7 blocks centered on the MRS. Because the ritual currently does not have any Will augments, you can only increase the radius of effect for the ritual by placing a valuable block directly underneath the MRS. If an iron block is used the radius becomes 7. If a gold block is used, the radius becomes 15. Finally, if a diamond block is used the radius expands to 31, meaning any ores below the ritual in a 63x63 area will be slowly pulled up into its 3x3x3 volume above the MRS. -guide.bloodmagic.entry.ritual.crusher.info=The Ritual of the Crusher's operation is rather simple. The ritual needs to have some form of inventory linked to it, which when unaltered simply sits on top of the MRS. While in operation, the ritual will look inside of its crushing range (by default the 3x3x3 area below the ritual) and break one block at a time at a rate of once every 2 seconds at the cost of 7 LP per successful operation. The broken blocks will then be transferred to the linked inventory - if there is no room for the items, they will instead be spewed on top of the chest.\n\tWhen fueled with Raw Will, the ritual will work at a faster rate based on the total amount of Will in the Aura. While sped up, it will consume 0.05 Raw Will per successful operation.\n\tDestructive Will causes blocks that are broken by the ritual to have Fortune applied to it. Currently the fortune level does not vary and is instead level 3 regardless of the Will amount. This will consume 0.2 Will per successful operation, regardless of whether it was useful.\n\tSteadfast Will will instead cause blocks to be broken with the Silk Touch effect. This costs 0.02 Will per operation, and will override the Destructive effect where possible.\n\tCorrosive Will makes it so that blocks that are broken by the ritual will be processed with some form of cutting fluid. This means that for instance if it is an iron block the result will be two pieces of iron sand. The current "cutting fluids" that the ritual uses are: Basic Cutting Fluid and Explosive Powder. The ritual consumes a different amount of Will based on what was used, and will only consume the Will if the effect applies. This overrides Silk Touch where applicable.\n\tVengeful Will causes it so that when a successful operation takes place the inventory has its contents compressed similar to the Sigil of Compression: if there is 65 redstone dust inside of the chest, one block of redstone will be crafted and 56 dust will remain. Will is only consumed when this is successful, and it costs 0.2 Will. -guide.bloodmagic.entry.ritual.highJump.info=This ritual uses a huge burst of air to propel all those who walk on top of it into the sky. What is more, if the user lands in the ritual's area of effect they will not suffer any fall damage. Players who sneak inside this ritual also are not affected.\n\tThe ritual costs 5LP per entity per tick of successful operation, so it won't cost anything if it doesn't fling people in the air. -guide.bloodmagic.entry.ritual.speed.info=As the name may suggest, the Ritual of Speed is used for transportation of various sorts. The ritual may be placed in the direction of any of the cardinal directions and any entities within its range will be launched in the direction that the ritual is pointing. When looking at a ritual, this direction is where the dusk ritual stone is. By default, the ritual has a radius of 2 blocks from the MRS, though this can be expanded or contracted when using a ritual tinkerer. This will apply a speed of 3 blocks/tick in the direction of the ritual and 1.2 blocks/tick vertically.\n\tIf the ritual is fueled with Raw Will, the speed of the ritual is increased substantially based on the Will that is in the Aura. For instance, the speed will be doubled if there is 100 Will inside of the Aura. For each successful operation, 0.1 Will is consumed.\n\tVengeful Will prevents the ritual from moving adult mobs, and Destructive Will prevents the ritual from moving child mobs. If either one of these are used, players are also prevented from using the ritual. If both of them are used, however, the effect is that only players may use the ritual and mobs cannot. These augmentations can be used effectively for sorting animal farms or even getting rid of those pesky child zombies in your sacrificial pen. The ritual will consume 0.05 Will for each type that is in effect on successful operation, so if a child enters the ritual space when you use Destructive Will it will not cost Will or LP. -guide.bloodmagic.entry.ritual.wellOfSuffering.info=For those of you who prefer to use mobs instead of your own health, the Well of Suffering damages all living non-player entities in a 10 block radius and places the health in a connected altar. The ritual will look for a blood altar within its range, checking 5 blocks horizontally and 10 blocks vertically unaltered. When it finds an altar, it will store its location internally - if there isn't an altar nearby, the ritual will not work. The ritual will deal 1 HP per entity and place 25 LP into the altar (100 for peaceful animals), which can be augmented with Sacrifice runes. -guide.bloodmagic.entry.ritual.featheredKnife.info=The Ritual of the Feathered Knife taps into the user's body, draining away their life force in order to fill a blood altar nearby. The ritual will look for a blood altar within its range, checking 5 blocks horizontally and 10 blocks vertically unaltered. When it finds an altar, it will store its location internally - if there isn't an altar nearby, the ritual will not work. When a player then enters within the ritual's damage range, which by default is a radius of 15 blocks horizontally and 20 blocks vertically, the ritual will damage the player for 1HP and then place that health into the connected altar directly (respecting blood runes). There are some safety mechanisms on the ritual, which cause it to not work on a player with less than 30%% of their max health. Unaugmented, the ritual does this once every second.\n\tThere are a few useful augmentations that you can use if you use Demon Will. If Raw Will is consumed by the ritual, the ritual will attempt to damage players within its range at a faster rate, operating twice per second. The ritual will consume 0.05 Raw Will per successful operation.\n\tIf you have more than 10 Steadfast Will in the Aura, the ritual will increase its safety threshold and instead will not work on players with less than 70%% health. This function currently does not consume Will.\n\tIf you have more than 10 Vengeful Will in the Aura, the ritual will remove some of its safety limitations, causing it to work on players until they only have 10%% of their maximum health left. If the ritual also has Steadfast Will augmented onto it the threshold will still be 70%% for the owner of the ritual only. This function currently does not consume Will.\n\tWhen Destructive Will is applied to the ritual, the ritual becomes a lot more efficient with its HP to LP conversion. The amount of LP that is added to the altar per health point increases based on the Will in the Aura, up to a maximum of +20%% for 100 Destructive Will. This effect stacks multiplicatively with runes, Living Armour Upgrades, and Incense. This consumes 0.05 Destructive Will per HP sacrificed.\n\tSpeaking of incense, if Corrosive Will is used in the ritual the ritual will respect the effects of incense on you. If you do not have the Soul Fray debuff on and you are empowered by an Incense Altar, the ritual will consume all of your HP up to the set threshold and pump all of the resultant LP into the altar. It will also remove the incense that you incurred and apply Soul Fray onto you. This effect stacks with the Destructive Will buff. -guide.bloodmagic.entry.ritual.regen.info=Arguably one of the best rituals for any potential Blood Mage who wishes to use his own life force to fuel his magic, the Ritual of Regeneration casts a veil of energy around itself, healing entities that find themselves within its range. Every 2.5 seconds the ritual will cast Regeneration I on living entities in its 15 block radius, costing 100LP per player and 10LP per other living entities for the 2.5 seconds of regen. \n\tIf Corrosive Will is used to augment the ritual a second range will be available, a "vampiric range". Any non-player entities within this range will be randomly damaged in order to directly heal players within the regular healing range. This costs 0.04 Will to use and will transfer 1HP per operational tick. -guide.bloodmagic.entry.ritual.harvest.info=This ritual will seek any harvestable plant block within its range (default is the 9x9x5 high area above the MRS) and try to harvest it, replanting any seeds if the plant can drop seeds. All of the drops from the plant will appear where the plant was harvested. The ritual will attempt to harvest plants once every 5 ticks and will cost 20LP per successful operation.\n\tPlants that can be harvested include, but are not limited to: pumpkins, wheat, carrots, potatos, nether wart, cactus, reeds. Keep in mind that the ritual makes no assumptions about the thing it is harvesting - it can only harvest mod-added crops if the mod in question registers a harvesting handler with the mod. -guide.bloodmagic.entry.ritual.interdiction.info=Based on an archaic alchemical device of legend, the Ritual of Interdiction attempts to forcibly push all non-player mobs away from the center of the ritual. By default, all mobs that are within two blocks of the MRS are pushed away from the MRS by setting their velocity. It should be noted that mobs within this range are not affected by fall damage, though that safety net wears off as soon as they are pushed away. -guide.bloodmagic.entry.ritual.containment.info=The opposite of Interdiction, the Ritual of Containment attempts to pull mobs within its area of effect towards the space above the MRS, suspending them in the air where they cannot move. The default range of the ritual is a 3 block horizontal radius from the bottom of the master stone to the top of the top-most runes, though this range can of course be altered.\n\tThis ritual costs 1LP per mob pulled every tick. -guide.bloodmagic.entry.ritual.suppression.info=The Dome of Suppression "suppresses" all liquids in a set radius, able to temporarily replace fluids in a hemisphere with a 10 block radius with air. If the ritual is turned off, this fluid will return in the same state it was before. This costs 2LP per operational tick. -guide.bloodmagic.entry.ritual.expulsion.info=If you play on a server you can face a situation where you have unwanted player visitors. Sometimes force fields and giant bloody rotors are not enough of a deterrent and they still manage to get into your base. This ritual attempts to alleviate this through the use of teleportation magic!\n\tIf a player that is not the owner enters the range of the ritual (default 12 block radius) the ritual will teleport the player randomly within a radius of 100 blocks away. However, if there is a chest on top of the MRS with a bound item from a player that player will be exempted from the teleportation, acting effectively like a whitelist.\n\tThe ritual costs 2000LP per successful teleportation. -guide.bloodmagic.entry.ritual.zephyr.info=Modelled after an ancient sword of proverb, the Call of the Zephyr uses the power of wind to collect the items that are around it and place them inside of the linked chest (default is right above the MRS). This is done instantly, meaning that the items are teleported directly into the inventory - no need to worry about weird suction effects!\n\tThe default item radius is 5 blocks away from the MRS. -guide.bloodmagic.entry.ritual.laying.info=As many are aware, being able to place blocks can be important in various automation tasks. This ritual takes the items/blocks from the connected chest (defaults to on top of the MRS) and places the blocks within the ritual, which is a radius of 2 on the same level as the MRS. This can be useful if you are trying to lay out saplings for a tree farm or if there are other blocks that must be placed. The ritual takes 50LP per successful operation. -guide.bloodmagic.entry.ritual.timberman.info=Got wood? This ritual has you covered. The Crash of the Timberman tethers a spectral entity using the LP of the owner to harvest the leaves and logs of all trees within its range and places the results inside of the connected chest. It will try to find all "trees" in a 10 block horizontal radius and up to 30 blocks above the MRS (by default) and use 10LP per felled block. -guide.bloodmagic.entry.ritual.meteor.info=For all intents and purposes, this is one of the most powerful rituals currently in the game. It costs one million LP to activate and can only be used once before needing to be reactivated. The ritual, once specific sacrifices are made, pulls a meteor from outer space and causes it to plummet towards the ground, causing a large explosion once it hits something solid. Because these meteors are not from the Overworld, they can hold a rich ore density never seen anywhere else.\n\tSacrifices can include: an iron block, a gold block, a diamond. This is configurable by the modpack or user. -guide.bloodmagic.entry.ritual.downgrade.info=In order to gain more power, sometimes you have to sacrifice something in return. The Penance of the Leadened Soul does just that - by sacrificing a few items to an unseen entity, you may reduce the effectiveness of some aspect of your Living Armour and get an increase in the number of upgrade points as compensation. When you construct the ritual you have to place an item frame on the top-most Blank ritual stone facing towards the Master Ritual stone, and some sort of inventory (see: chest) on top of the Dusk ritual stone. To acquire a Living Armour Downgrade, you then have to place the key item in the item frame and the consumables in the chest. Once the ritual is activated, you can sneak on top of the Master Ritual Stone at any time and acquire the downgrade.\n\tIn the case of the Quenched Living Armour Downgrade, its key item is a water bottle (placed in the item frame) and the recipe is Dragon's Breath (placed in the chest). The key item is never consumed, but the recipe is.\n\tIn order to view the recipe for the downgrades you can look them up in JEI - check the usage of the Master Ritual Stone and you will see the recipes for the Penance ritual. Also you can just check the recipe for the max level downgrade in JEI and then check the usage of the key item - the key item is always the same for the specific downgrade. -guide.bloodmagic.entry.ritual.crystalSplit.info=Once Demon Will has crystalized, there is no way to split it into its many aspects - or so I've thought until now. The "Resonance of the Faceted Crystal" works by separating the many aspects inside of an unaspected (or raw) crystal cluster by using the different aspected ritual stones. \n\tIn order to use the ritual, an unaspected crystal cluster has to be placed two blocks above the Master Ritual Stone. In other words, you can place a crystallizer on top of the MRS and a crystal cluster on top of that and it should work well. Next, you must make sure that there are no blocks directly above the four elemental-based ritual stones, and then wait for the crystal cluster to grow. \n\tAfter the cluster has grown a total of five or more spires, the ritual will split these spires off and create one spire each of Corrosive, Steadfast, Vengeful, and Destructive Will on top of the aspected ritual stones. If the unaspected cluster is allowed to grow further and these new clusters remain intact, the process will repeat and more spires will be added. \n\tThe mechanism for this process is quite simple. When the Raw Will crystal has at least five spires, the ritual breaks off four of these spires and converts the Will into its more incorporeal form. This Will is then pushed threw the final spire of the cluster, which forces the different aspects of the Will into more localized clumps of the particular aspect. This Will is then gathered into the ritual stones, which act as bases for which the new aspected crystal clusters can grow from. -guide.bloodmagic.entry.ritual.portal.info=##REQ-LORE##\n\t The Gate of the Fold is a ritual made for interdimensional teleportation without the need of additional interaction. Upon activation, all blocks that touch its ritual stones are used as a key pattern to link portals together. If another Gate of the Fold with the same key exists, the rituals will be linked together and walking through instantly teleports to its twin. Only up to 2 portals with the same key can exist at the same time.\n\t Activation Cost: 50,000LP\n\t Teleportation Cost: 1,000LP (same dimension) / 10,000LP (different dimensions) -guide.bloodmagic.entry.ritual.altarBuilder.info=##REQ-LORE##\n\t The Assembly of the High Altar is a ritual to quickly construct a new altar ziggurat from the blocks in the attached inventory (usually a chest on top of the MRS).\n\tActivation Cost: 450LP\n\tCost per component placed: 75LP -guide.bloodmagic.entry.ritual.pump.info=##REQ-LORE##\n\t The Hymn of Syphoning is used to syphon liquids in world around or below the ritual into an appropiate container (for example a Blood Tank) above the MRS. Liquids in world are replaced with Stone, preventing flowing liquids that could cause performance issues.\n\tActivation Cost: 500LP\n\tCost per operation: 250LP -guide.bloodmagic.entry.ritual.cobble.info=##REQ-LORE##\n\t Got tired of making one of these primitive buildings to generate cobblestone? Got tired of having OSHA on you or accidentally extinguishing your lava source? This ritual is for you. Generate insurmountable masses of cobblestone in a fast and efficient way with future-proof blood instead of using dangerous and limited lava (unless you generate lava from blood, that is). \n\n\t This ritual generates (by default) cobblestone on top of itself which can then be mined for personal use. \n\t Activation Cost: 500LP\n\t Cost per block: 25LP -guide.bloodmagic.entry.ritual.ellipsoid.info=##REQ-LORE##\n\t The Focus of the Ellipsoid creates a hollow sphere (by default) from materials in an inventory connected to the MRS (usually a chest on top of the MRS).\n\t Activiation Cost: 20,000LP\n\t Cost per block placed: 5LP -guide.bloodmagic.entry.ritual.crystalHarvest.info=##REQ-LORE##\n\t The Crack of the Fractured Crystal breaks off all but one spire of all Demon Will Crystal Clusters in range and drops them on the ground. Combined with the ritual "Call of the Zephyr", those items cann be collected and placed into an inventory for later use.\n\t Activation Cost: 40,000LP \n\t Cost per operation: 50LP -guide.bloodmagic.entry.ritual.forsakenSoul.info=##REQ-LORE##\n\t The Gathering of the Forsaken Souls speeds up Demon Crystal growth for crystal clusters above the ritual (by default). It does not generate will on its own though and still requires the crystal clusters to have Demon Crystallizers below them. In order to do that, it utilizes a mechanic known as "uniqueness" of mobs. The more different mobs die, the more efficent the crystal growth will be. It does not itself generate Demonic Will Aura though, so you need to supply it by either feeding back crystals or putting a Tartaric Gem with will into a Demon Crucible. This should eliminate the need for going out to farm demonic will unless you fail to supply mobs to feed it and/or run out of will.\n\t Activiation Cost: 40,000LP\n\t Cost per damage tick and mob: 2LP -guide.bloodmagic.entry.ritual.animalGrowth.info=##REQ-LORE##\n\t The Ritual of the Shephard increases the speed at which animals grow significantly.\n\t It also increases the rate of breeding if supplied with Vengeful Will or make the animals capable of searching hostile mobs and explode on them if supplied with Destructive Will. In either case, if supplied with Steadfast Will, it will automatically feed the animals with food from an inventory above the MRS (by default).\n\t Activation Cost: 10,000LP\n\t Cost per operation and animal: 2LP -guide.bloodmagic.entry.ritual.livingEvolution.info=##REQ-LORE##\n\t The Ritual of the Living Evolution increases the maximum amount of upgrade points for the Living Armor set to 300. To use it, simply activate the ritual and then step on the MRS with an equipped set of Living Armor.\n\t Activiation Cost: 50,000LP -guide.bloodmagic.entry.ritual.upgradeRemove.info=##REQ-LORE##\n\t The Ritual of the Cleansing Soul removes all upgrades and downgrades from a set of Living Armor. To use it, simply activate the ritual and then step on the MRS with an equipped set of Living Armor.\n\t Activiation Cost: 50,000LP -guide.bloodmagic.entry.ritual.fullStomach.info=##REQ-LORE##\n\t The Ritual of the Satiated Stomach feeds players in its area with food from a chest above the MRS. The food is fed in an efficient manner unless the food provides more than max saturation in which case it is fed anyways.\n\t Activation Cost: 100,000\n\tCost per operation: 20LP -guide.bloodmagic.entry.ritual.eternalSoul.info=##REQ-LORE##\n\t The Cry of the Eternal Soul is capable of feeding LP from the Soul Network back into an altar. This falls under the usual restrictions of pumping (liquid) Life Essence into an altar. Every point of LP transferred into the altar costs 2 LP from the network.\n\t Activiation Cost: 2,000,000LP\n\t Cost per operation: 2*transferLP -guide.bloodmagic.entry.ritual.condor.info=##REQ-LORE##\n\t The Reverence of the Condor allows flight for players in a local area around the ritual.\n\t Activation Cost: 1,000,000LP\n\t Cost per operation: 2LP -guide.bloodmagic.entry.ritual.featheredEarth.info=##REQ-LORE##\n\t The Ritual of the Feathered Earth constantly reduces the fall height to 0, effectivly eliminating fall damage.\n\t Activation Cost: 5,000LP\n\tCost per second: 20LP -guide.bloodmagic.entry.ritual.grounding.info=##REQ-LORE##\n\t The Ritual of Grounding manipulates the gravity in its area. By default, it drags mobs to the ground and prevents jumping.\n\t Supplying the ritual with Raw Will makes it affect players in addition to mobs.\n\t Corrosive Will simply disables gravity all together.\n\t Destructive Will vastly increases fall damage of affected entities.\n\t Steadfast Will allows the ritual to affect bosses.\n\t Vengeful Will alone amplifies the grounding effect, in combination with Corrosive Will, however, it transforms the ritual to provide levitation instead. Vengeful Will also increases the effect of Heavy Heart, increasing fall damage even more.\n\t Activiation Cost: 5,000LP\n\tCost per second: 20LP -guide.bloodmagic.entry.ritual.veilOfEvil.info=##REQ-LORE##\n\t The Veil of Evil casts a magical shroud over its area, allowing mobs to form where they usually would not. Spawns following vanilla rules will be forced to spawn. Spawns that are denied will follow vanilla spawning rules. -guide.bloodmagic.entry.ritual.wardOfSacrosanctity.info=##REQ-LORE##\n\t The Ward of Sacrosanctity provides a powerful ward, preventing mobs from forming even though they usually would. Spawns following vanilla rules will be prevented from spawning. Spawns that are forced or allowed will follow vanilla spawning rules. - -# Architect Entries -guide.bloodmagic.entry.architect.intro=Foreword -guide.bloodmagic.entry.architect.bloodaltar=The Blood Altar -guide.bloodmagic.entry.architect.ash=Arcane Ash -guide.bloodmagic.entry.architect.divination=Divination Sigil -guide.bloodmagic.entry.architect.soulnetwork=Soul Network -guide.bloodmagic.entry.architect.weakorb=Weak Blood Orb -guide.bloodmagic.entry.architect.incense=Incense Altar -guide.bloodmagic.entry.architect.bloodrune=Upgrading your Altar -guide.bloodmagic.entry.architect.inspectoris=Inspectoris Scandalum (Block Reader) -guide.bloodmagic.entry.architect.runeSpeed=Speed Rune -guide.bloodmagic.entry.architect.water=Water Sigil -guide.bloodmagic.entry.architect.lava=Lava Sigil -guide.bloodmagic.entry.architect.lavaCrystal=Lava Crystal -guide.bloodmagic.entry.architect.apprenticeorb=Apprentice Blood Orb -guide.bloodmagic.entry.architect.dagger=Dagger of Sacrifice -guide.bloodmagic.entry.architect.runeSacrifice=Rune of Sacrifice -guide.bloodmagic.entry.architect.runeSelfSacrifice=Rune of Self Sacrifice -guide.bloodmagic.entry.architect.holding=Sigil of Holding -guide.bloodmagic.entry.architect.air=Air Sigil -guide.bloodmagic.entry.architect.void=Void Sigil -guide.bloodmagic.entry.architect.greenGrove=Sigil of the Green Grove -guide.bloodmagic.entry.architect.fastMiner=Sigil of the Fast Miner -guide.bloodmagic.entry.architect.seer=Seer's Sigil -guide.bloodmagic.entry.architect.magicianOrb=Magician Blood Orb -guide.bloodmagic.entry.architect.capacity=Rune of Capacity -guide.bloodmagic.entry.architect.displacement=Displacement Rune -guide.bloodmagic.entry.architect.affinity=Sigil of Elemental Affinity -guide.bloodmagic.entry.architect.lamp=Sigil of the Blood Lamp -guide.bloodmagic.entry.architect.magnetism=Sigil of Magnetism -guide.bloodmagic.entry.architect.peritia=Tome of Peritia -guide.bloodmagic.entry.architect.livingArmour=Living Armour -guide.bloodmagic.entry.architect.upgradeTome=Living Armour Upgrade Tomes -guide.bloodmagic.entry.architect.teleposer=Teleposer -guide.bloodmagic.entry.architect.boundBlade=Bound Blade -guide.bloodmagic.entry.architect.boundTool=Bound Tools -guide.bloodmagic.entry.architect.weakShard=Weak Blood Shard -guide.bloodmagic.entry.architect.masterOrb=Master Blood Orb -guide.bloodmagic.entry.architect.runeOrb=Rune of the Orb -guide.bloodmagic.entry.architect.suppression=Sigil of Suppression -guide.bloodmagic.entry.architect.haste=Sigil of Haste -guide.bloodmagic.entry.architect.severance=Sigil of Ender Severance -guide.bloodmagic.entry.architect.teleposition=Teleposition Sigil -guide.bloodmagic.entry.architect.compression=Sigil of Compression -guide.bloodmagic.entry.architect.bridge=Sigil of the Phantom Bridge -guide.bloodmagic.entry.architect.mimic=Mimics -guide.bloodmagic.entry.architect.downgrade=Living Armour Downgrades - -guide.bloodmagic.entry.architect.augmentedCapacity=Rune of Augmented Capacity -guide.bloodmagic.entry.architect.charging=Charging Rune -guide.bloodmagic.entry.architect.acceleration=Rune of Acceleration - -guide.bloodmagic.entry.architect.tier3=Tier 3 Under da Sea - -# Architect Entry Texts -guide.bloodmagic.entry.architect.intro.info=Hello, everyone. My name is Tiberius. You can probably tell by this entry that the book is not exactly complete, and you would be right. Because of the 1.7.10 -> 1.8.9 and 1.9.4 (and above) updates, a lot of stuff has changed in the mod. As such, the books have had to be rewritten. Because the ultimate plan for these documents is to have each book in the form of a research journal / actual book, these documents will take a while to flesh out. As such, I am going to be updating this book periodically in order to fill in the necessary gaps. It will start as flavourless garbage to start with (Yeah... not the most appetizing of illustrations to go with for documents, but whatever!), but slowly it will be morphed into a story about a bunch of blood magi on a journey through discovery.\n\tBut enough about that, I need to get into character. *Cough cough*\n\tMy name is Tiberius, and I am a Blood Mage, and also otherwise known as The Architect. This book contains all of my research regarding the ethereal phenomenon called the "Soul Network," as well as the physical properties of some of the most central devices that any Blood Mage in training should be accustomed to. From the art of laying out the structure of a powerful Blood Altar, to the intricacies of sacrificing life force to increase a mage's power, and further to the powers gained through arcane glyphs and sigils, I have discovered, revised, and created new ways into train one's self to new heights.\n\tSo enter, Mage, for a new realm awaits you!\n\t...Yeah, Magus says that I can get a little grandiose, but what can you do? -guide.bloodmagic.entry.architect.bloodaltar.info.1=The Blood Altar is one of the most central devices in the mod. There are two main uses for the altar: either for crafting certain items essential for progressing through the mod, or for filling up one's Blood Orb. Both of these actions require the player to fill up the basin with Life Essence, which can be extracted from two different sources: monsters and peaceful creatures, and the player's own health. -guide.bloodmagic.entry.architect.bloodaltar.info.2=To add your own Life Essence into the basin, you need to craft yourself a Sacrificial Dagger and right click it while next to the altar. This will take a heart of health and add a total of 200LP to the unupgraded altar. "LP" is Life Points, which is a measure of how much life force is used in a task - no, it is not like YuGi-Oh. The Blood Altar has a capacity of 10,000LP. If you then right-click on the altar, you can place an item into the basin, and if it is a valid item the altar will start the crafting process.\n\tThe altar crafts an item by consuming the LP in the basin if the altar is a high enough tier. If there is enough LP, the altar will drain a bit of LP from the basin each tick and increase the progress of the crafting, emitting red particles. If there is no longer any LP in the basin, the altar will emit gray particles and the crafting will start to lose progress, which is not good at all! Finally, if the altar is filling up a Blood Orb, the altar will emit purple particles to indicate it is syphoning LP from the basin.\n\tThere are actually a total of three tanks in the Blood Altar: the main tank, which has a default capacity of 10 kLP as previously indicated, as well as an input tank and an output tank which both have 10%% of the total capacity of the main tank. Every 20 ticks by default, the LP in the input tank will transfer to the main tank at 20LP/s, and the LP in the main tank will transfer to the output tank at 20LP/s. As the names suggest, the input tank accepts the LP that is pumped into the altar acting as a buffer to limit the speed of transferring from outside sources, and the output tank can be pulled from using pipes out of the altar. -guide.bloodmagic.entry.architect.ash.info=Although not strictly part of the overall theme of this book, Arcane Ash is necessary in order to progress through the mod and get some of the more powerful devices available. This ash is crafted using the Hellfire Forge and Demon Will, so if you are new to this concept please consult the "Demon Kin." In essence, this is a way to craft items out of two separate items: a reagent of some sort to act as a catalyst, and a secondary item. \n\tThe ash has a total of twenty uses before you need to craft another. When you right click on the ground (or a wall, though it will only render one direction), you will inscribe a simple circle out of ash. If you click on the ash again with an item, it will be "placed inside of the ash" - assuming that this item is a valid catalyst, the circle will change shape to represent that it is ready for the next item. If it doesn't change shape, then you did something wrong.\n\tOnce it has changed shape, you can then place in the secondary item. If this item matches with the first item, the circle will start rotating and performing different actions depending on the recipe it is working on. After a while, if properly executed, an item will pop out.\n\tAll of the recipes for the Arcane Ash crafting (I call it Alchemy Array Crafting) can be found in JEI by checking the uses for Arcane Ash - the first item shown is the catalyst, and the second item is the secondary item. -guide.bloodmagic.entry.architect.divination.info=The Divination Sigil is one of the most useful tools in the mod, able to tell you many values that will make your life easier. This sigil is crafted using a piece of redstone and a blank slate (crafted in the Blood Altar) using an alchemy array.\n\tWhen you right click a Blood Altar with the sigil, you can see the current tier, amount of LP inside of the main basin, as well as the max capacity of the Blood Altar. Spam-clicking the altar with the sigil will overwrite the previous text from the sigil, meaning that there will not be any spam in your chat.\n\tIf you right click in the air with the sigil, the sigil will tell you the current amount of LP that is in your Soul Network. Although this is rather mundane to start with, this function alone will make it very likely that you will want to keep this sigil on you at all times. -guide.bloodmagic.entry.architect.soulnetwork.info=The Soul Network (commonly abbreviated as SN) is the term for the connections between the player and all of the items and structures that they have linked their soul to. When a blood mage becomes more powerful, the strength of their soul increases and thickens these bonds. These connections are ethereal strands of the soul, and only the most powerful of Blood Magi are able to see these in their physical form. To date, no mage has attained this ability...\n\tIn-game, the Soul Network is tied directly to the player. The data is stored inside of the world, and every player has only a single network - the LP placed into the network is not stored in any item, but is instead placed and drawn from a single pool. \n\tTo bind things to your network, the most common way is to simply right click an item that uses a network to power itself. Once bound, the item will indicate that it is owned by you and it can never be unbound (with current technology). If this item is used and it has an LP cost attributed to it, it will take the LP from the owner's network. If there is not enough LP in this network, it will take the missing LP directly from the user's health (not the owner's). Be careful when using items when you have a low amount of LP - it could end up being deadly. -guide.bloodmagic.entry.architect.weakorb.info.1=What good is any mage without a power source? A Blood Orb is a device that consumes physical LP and transfers it into the owner's Soul Network. Although not a battery itself, it does act as a conduit in order to fill up the power reserves of the blood mage. -guide.bloodmagic.entry.architect.weakorb.info.2=The Weak Blood Orb is the first such orb that you can make. By infusing a diamond inside of a Blood Altar with 2 kLP, you can create this orb. When bound and placed inside of an altar with some LP in it, the orb will syphon from the basin and transfer that LP directly into the network. Each orb has a maximum capacity that can only be extended by advanced runes on the altar. For the Weak Blood Orb, this maximum capacity is 5 kLP.\n\tBlood Orbs can also be filled directly from the player by simply right-clicking with them - this will transfer a heart of health into the orb and give you 200LP. This cannot increase past the orb's maximum capacity.\n\tA Blood Orb can only be filled by its tier of altar or higher; this means that if you have a T3 orb, it has to be filled in an altar that is greater than or equal to T3. A simple T1 altar would not do in this situation. -guide.bloodmagic.entry.architect.incense.info.1=One will quickly find that the speed of LP generation can become increasingly burdensome. Sure, by adding special runes to the Blood Altar you are able to increase the yield of self-sacrificing, but this can be a slow process all the same. If only there was a way to further increase how much LP you can get from yourself?\n\tEnter the Incense Altar. The Incense Altar acts as a central point for a tranquil area, calming the soul itself with the gentle wafts that emanate from the basin. Where this scent comes from you aren't entirely sure, but what could possibly go wrong?\n\tThe goal of this block is to create an area of tranquility to increase how much LP you get from a heart of health. When you are near the block (about five blocks) fire particles will be emitted to show that it is working - when you are affected by this tranquility, your Sacrificial Dagger will transform to indicate that you have an increased yield at the Blood Altar. This process takes about 5 seconds, and you will know you are finished when the fire particles stop appearing. At this point, if you use your Sacrificial Dagger at the Blood Altar you will sacrifice 90%% of your maximum health all at once and pump LP into the altar proportional to the amount of health sacrificed multiplied by a bonus based on how tranquil the surrounding area is: this bonus is +20%% by default.\n\tAs a side note, the Divination Sigil can be used on the Incense Altar to determine the amount of Tranquility as well as how much of a bonus the current altar gives. -guide.bloodmagic.entry.architect.incense.info.2=Of course just an additional 20%% is all well and good, but it can be further expanded by expanding the range of influence of the Incense Altar. If you place a row of three Wooden Path blocks two blocks away from the incense altar in each of the cardinal directions (making sure that all path blocks are on the same y-level, up to five blocks up or down from the incense altar) you can define an area. Any block placed within this area (a block that is the same distance horizontally away from the Incense Altar as the path blocks are horizontally, and on the same level or up to two blocks higher vertically from the path blocks) can add to the Tranquility of the Incense Altar. Another row of path blocks can be added past this initial row following the same rule: the new row must all be on the same y-level as each other, and the entire row has to be within 5 blocks vertically from the previous row of path blocks. This means that layouts such as pyramids, inverted pyramids, or more advanced staircase structures are possible.\n\tAll path blocks have a maximum distance that they can be from the Incense Altar in order to take effect. The Wooden Path blocks are able to work up to a total of three rows from the Incense Altar. Stone paths work up to five, worn stone paths seven and obsidian paths to nine blocks from the origin. So at a certain point you have to use better path blocks to extend your tranquility area, however you can use higher tiered path blocks in place of lower tiered path blocks, just not the other way around.\n\tBack to Tranquility. Only certain blocks are able to affect the Tranquility of an area, and there are different types of Tranquility blocks. If you place a crop such as potatoes in the area, you add a bit of Tranquility (using the Crops category). However, if you add another crop like potatoes again or even carrots, you will get less tranquility. Adding something from a different Tranquility category, you get the full effect. But adding more stuff using the same category has diminishing returns. Therefore in order to get the most Tranquility out of a certain area, it is most optimal to mix and match using as many different types of Tranquility as possible.\n\tSome things that add Tranquility are: Crops, logs, leaves, lava, netherrack, farmland, water, Life Essence, and other assorted things. -guide.bloodmagic.entry.architect.bloodrune.info.1=As you go through the mod you'll slowly learn that the humble blood altar before you is not powerful enough for you to fulfil your true ambitions. By placing special blocks known as Blood Runes around the altar you are able to expand the altar's strength significantly, unlocking higher tiers of recipes as well as allowing you to augment the abilities of the altar itself.\n\tTo upgrade the altar to its second tier, you need to place 8 blood runes around the altar and one level lower. If you are confused about the precise configuration, the item "Inspectoris Scandalum" can tell you the precise placement for the blocks required for the next tier.\n\tAlthough a blank rune is fine for simply getting your altar upgrade and running to a higher tier, it is advantageous to use upgrade runes for your altar. Each of the runes in a blood altar may be swapped out for any upgrade rune (the only exception to this is that at Tier 2 you cannot use the corner runes as upgrade runes - T3 onwards you can use these). There are runes that affect the speed of crafting, the capacity of the altar, as well as the efficiency of sacrificing at the altar. These runes can be found in their respective entries. -guide.bloodmagic.entry.architect.inspectoris.info.1=Literally "Block Reader" in Latin, this item's purpose is to give you more information about the more complex blocks in the mod when the blocks are in the world. Currently the only implementation for this item is the Blood Altar, and by simply shift-right clicking on a Blood Altar in the world it will tell you what blocks are required in the world for the next altar tier.\n\tIf this method doesn't suit you, you may shift-right click the item in the air to cycle through the tiers. If you then shift-right click on the altar, the altar will display ghost blocks in the world, showing exactly where the blood runes and the pillars are required in order to achieve that tier. If you set the displayed tier to 1, it will remove the hologram. -guide.bloodmagic.entry.architect.runeSpeed.info.1=The speed rune applies a pressure to the altar's basin, forcing the transmutation process so that crafting is a lot quicker. Each speed rune increases the consumption of the altar by +20%% per rune, effectively increasing the speed of the altar. This also affects the speed at which the blood orbs are filled by the altar at the same rate per rune. -guide.bloodmagic.entry.architect.water.info.1=The Water Sigil, as the name suggests, is able to gather moisture from the air to create a source of water at the point of contact on the ground. What is more, by clicking on a machine that accepts a fluid, you can insert up to 1000mB of water into the machine for the same cost as if you put it on the ground. For all intents and purposes, it acts as an infinite bucket of water - it won't work if you place it inside of a machine, however. 50LP per use. -guide.bloodmagic.entry.architect.lava.info.1=The Yang to the Water Sigil's Yin, this sigil heats up the rock in the local area and gathers it in one place, forming a source of lava where the sigil makes contact. A similar process occurs when you interact on a fluid-accepting machine, generating up to 1000mB of lava inside of the machine for the same cost. For some reason your hand is not burnt when you use it, however it doesn't mean that it is a wise choice to take a bath in it! 1000LP per use. -guide.bloodmagic.entry.architect.lavaCrystal.info.1=The lava crystal is a stone that has a piece of lava encased in the center of it that does not lose its heat. When placed as a fuel source inside of a furnace, it will "burn" for an amount that is enough to cook a single item in a standard furnace at the cost of 50LP from the owner's network. If the network does not have enough power in it (or if there is no owner) the crystal will simply not burn and will inflict nausea on the owner due to the strain.\n\tThis crystal will work for any solid fuel burning machine that accepts any fuel. -guide.bloodmagic.entry.architect.apprenticeorb.info.1=While out using the various devices, you will quickly realise that your 5kLP maximum capacity in your Soul Network will quickly run out. This is where you will start looking for a more powerful orb for your network.\n\tThe Apprentice Blood Orb requires a Tier 2 altar, and has a maximum capacity of 25kLP. It also allows you to create more powerful items and runes. -guide.bloodmagic.entry.architect.dagger.info.1=After a while of strengthening yourself through the use of self-sacrifice, you may be keen to attempt to try sacrificing the blood of mobs. The Dagger of Sacrifice, when used on a non-boss, non-player entity next to a Blood Altar, will kill the entity in one hit and pump all of the blood into the altar, converting it into life essence depending on the quality of the mob. Normally, hostile mobs will tend to give much more LP than peaceful mobs. -guide.bloodmagic.entry.architect.runeSacrifice.info.1=The Rune of Sacrifice, as the name may imply, increases the yield of all activities that sacrifice the health of mobs in return for LP. Each rune provides a +10%% increase in yield, additively. -guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=Similar to the Rune of Sacrifice, the Rune of Self Sacrifice increases the yield of LP provided from the player. Each rune provides a +10%% increase in yield, additively. -guide.bloodmagic.entry.architect.holding.info.1=As you will start to realize, there are a lot of useful sigils that are available - some toggleable, others active use. Because of this your inventory will quickly become clogged up. This need is filled by the Sigil of Holding.\n\tThis sigil can hold up to five other sigils (no, it cannot hold other Sigils of Holding) in its internal inventory. By pressing the "Holding" key, default 'H', you can open up the sigil's GUI to rearrange the sigils that are held. If you shift and use the scroll-wheel while it is equipped, you will cycle through the contained sigils. Once you land on the sigil that you want to use, you can use the sigil as if it was the one selected! \n\tNaturally, you can have multiple Sigils of Holding, each with their own inventory. To help determine which one is which at a glance, you can dye the sigil using the Alchemy Table. To do this, either place the Sigil of Holding in the Alchemy Table with a dye, or the sigil with a name tag with the colour that you want in 0xZZZZZZ format for the name. -guide.bloodmagic.entry.architect.air.info.1=The Air Sigil uses a rudimentary form of fission to generate a steady stream of air behind the user by the traces of water vapour in the air, propelling them forward. In essence, by using this sigil you can be launched forward a considerable distance. It should be noted that the sigil will only cancel the user's fall distance when used, so if you want to stick the landing you have to use it close to the ground! -guide.bloodmagic.entry.architect.void.info.1=As the name suggests, the Void Sigil will create a vacuum at the point of contact which will suck up the liquid source that it is used on, completely destroying the source. This is probably best used in conjunction with the Water Sigil or the Lava Sigil. -guide.bloodmagic.entry.architect.greenGrove.info.1=By using your blood as a simple growth catalyst of sorts, the Sigil of the Green Grove will increase the growth speed of any plants in a nearby area while activated. To activate the sigil, shift-right click it to toggle between activated and deactivated (easily seen by the tooltip or by the glowing symbols on the sigil). Keep in mind that every few seconds the sigil will syphon a bit of LP from the user to fuel the accelerated growth.\n\tIf used directly on a plant, the sigil will apply a bone-meal effect. This can be used to grow tall grass or other crops, just the same as bone-meal. -guide.bloodmagic.entry.architect.fastMiner.info.1=As any good Blood Mage should be aware of, blood has a high amount of iron within it. If skilled enough, one can manipulate blood while it is still within the body - it should be noted, however, that only the most advanced Blood Mages can twist the blood of those that are unwilling.\n\tOne of the principle uses is to accelerate the functions of one's own body. By magnetising the iron in the user's blood, the Sigil of the Fast Miner increases the speed of mining dramatically, applying Haste II while activated. This magnetism is too weak to affect things outside of one's own body, however it is sufficient enough to mine obsidian at a considerable speed. -guide.bloodmagic.entry.architect.seer.info.1=When tinkering around with the Blood Altar, you can sometimes get lost in the hidden intricacies of its operation that the Divination Sigil seems to be unable to divine. This is where the Seer's Sigil comes into play. Essentially an upgrade to the Divination Sigil, this sigil provides additional information about different stats of the altar. These range from the speed of the altar, the current LP, as well as the current progress of the crafted item. It also gives info about the player's soul network. -guide.bloodmagic.entry.architect.magicianOrb.info.1=Another tier, another Blood Orb. This time, in order to progress further in the mod you will have to craft yourself the Magician Blood Orb. In the default recipe you can see that it takes 25kLP in order to craft, however the maximum capacity of the Blood Altar is 10kLP. This means that for a successful craft to occur you will need to add LP into the Altar while it is in the process of crafting the orb. Be prepared, since it can be a difficult task if you do not have everything you need! -guide.bloodmagic.entry.architect.capacity.info.1=You are not exactly sure how it works the way it does, but the Rune of Capacity increases the capacity of the Blood Altar by 2kLP additively. Perhaps there is some sort of resonance effect that decreases the volume of the LP, therefore allowing you to pack more into the static basin? It does give you an idea on how to improve it further, though...\n\tIt should be reiterated that the size of the input and output buffers are 10%% of the maximum capacity of the main tank, so these runes will increase the buffer capacities as well. -guide.bloodmagic.entry.architect.displacement.info.1=By default, the transfer of LP between the buffer and main tanks is limited to 20LP/s. For systems that want to remove and re-add LP to the altar this speed is a sluggish crawl. That is where this rune comes into play.\n\tThe Displacement Rune increases the amount of LP transferred per operation. Each rune multiplies the transfer rate by 1.2x, stacking multiplicatively. So one rune would be 24LP per operation, two runes would be 28.8LP per operation, and three runes 34.56LP. If you have 20 runes on an altar, this jumps all the way up to 767LP per operation - that would clear a full altar in only 13 seconds. -guide.bloodmagic.entry.architect.affinity.info.1=At first glance, the Sigil of Elemental Affinity simply grants immunity to fire, drowning, and damage from heights while activated. Its operation is a lot more nuanced, however. This sigil creates a thin barrier of air around the user by using the sweat (and when required, blood) from the user, keeping the body away from the harsh elements. \n\tThis air barrier acts as a buffer between the skin and the fire or lava, circulating when required to prevent overheating. It also fills the lungs while under water to equalize the pressure of the body and the surrounding water. Finally, when falling from a large height, the air will shift to below the person's feet, acting as a cushion to dampen the fall. -guide.bloodmagic.entry.architect.lamp.info.1=There are quite a few "impurities" within the body and a person's blood. By harvesting some noble gases and encasing them with a source of heat, you can generate a ball of light that can be flung a large distance, sticking to the surface that it impacts with.\n\tThe Sigil of the Blood Lamp has two uses: you can either directly click a block and place a light source or fire a projectile that will generate a source of light at the point of contact. These light sources can be broken just like torches in one hit. -guide.bloodmagic.entry.architect.magnetism.info.1=This sigil magnetizes the iron in the blood stream of the user to attract small objects towards the sigil, allowing a quick and painless pickup. In essence this acts as an item magnet, but instead of actually "vacuuming" up items towards the player, it causes the player to pick up the item from a distance, so items don't need to fly around the place. Thankfully the magnetism is tuned so that it does not attract living objects, so you won't find creepers suddenly wanting to hug you at Mach 3. - -guide.bloodmagic.entry.architect.peritia.info.1=In the world, certain actions impress experiences on a person: slaying monsters, mining elements, and smelting ingots or food can give experience that is accumulated over a period of time. Through some arcane mechanisms, some structures and devices actually drains these experiences from you in order to fuel their own processes. It can therefore be useful to store these experiences in some medium.\n\tAlthough some containers store experience as a physical substance, the Tome of Peritia allows the person to transcribe their experiences into the book - by writing in the tome, the pages are imbued with your thoughts and past actions, storing them away for later use. If you then want to acquire these experiences back, you can hold your hand to the page and syphon them back; this will remove the writing from the page and transmit those actions back to your memory.\n\tNow for the actual usage; by shift-right clicking the tome in your hand, you can store a level of experience into the book (or down to the level if you have a partial level). Right clicking with the tome will grant you up to the next level if there is enough experience stored in the book. The total experience, as well as the equivalent level stored, is displayed on the tooltip of the tome. -guide.bloodmagic.entry.architect.livingArmour.info.1=Any person in Minecraft, especially with the newer incarnations of the world, will know that a good set of armour means difference between life and death. Usually when you pick a set of armour you choose a static set of benefits - does this armour offer more protection? Do I get flight when I wear this? Can I jump really high, or move really fast? These are all valid options on a set of armour, but you can never get a set that is tailored exactly to your needs. At least that is what they thought.\n\tA set of Living Armour is an engineered lifeform that is integrated with a simple set of iron armour. When worn, it enters a symbiotic relationship with the user - when you move, it moves. When you attack, it attacks. When you eat, it senses this and compensates. And just like a normal human body, it will start to grow and strengthen depending on what you do, being trained by your actions. \n\tLet's give an example. If you equip a new set of armour on and run around a lot, you will notice that you will receive an upgrade on the chest plate called "Quick Feet" - this upgrade provides an incremental increase to your speed at level 1, while subsequent levels provide a larger boost. You will also notice that the "Upgrade Points" now read "3/100" - each upgrade requires a number of upgrade points to be applied, and the chest plate has a maximum number of points that it can hold. If an upgrade that you can get is not obtainable with the number of free upgrade points you have it cannot be gained. \n\tKeep in mind that the Living Armour will only be trained when you have a full set of armour on, and the armour's effects will only take effect when a full set of armour is used.\n\tThe maximum number of upgrade points can be modified by a few different means. One of them is to create alchemical concoctions that will strengthen the bonds between the user and the Living Armour, vastly increasing the number of points you can have on a given set of equipment. One such example is the "Draft of Angelus," which increases the maximum number of points to 200. Information about these brews, as well as how to create them, can be found in "The Alchemist". -guide.bloodmagic.entry.architect.upgradeTome.info.1=Sometimes you may not be happy with the upgrades that you have gotten on your Living Armour. By using the ritual "Sound of the Cleansing Soul" (more information can be found in "The Ritual Master"), you can remove all of the upgrades from the armour and receive them in the form of "Upgrade Tomes". If you right-click these while wearing a full set of Living Armour (and while you have space for the upgrade) you can add the upgrade to your armour. \n\tThese tomes may also be combined in an anvil - if you combine two of the exact same upgrade tomes (same upgrade, same level) together in an anvil, you can get a single tome that is one level higher. So if you combine Quick Feet II with another Quick Feet II, you will get Quick Feet III. This can then be applied to the armour in the same way. -guide.bloodmagic.entry.architect.teleposer.info.1=The Teleposer is a device that teleports not just entities but blocks as well. In order to set up a Teleposer, you need at least two Teleposers and one Teleposition focus. One of the Teleposers acts as the Destination, and the other acts as the Beginning.\n\tTo set this up, you need to first bind the focus to you by right clicking it. You then right click the focus onto the Destination Teleposer to save its location (and dimension) and then insert the focus into the Beginning Teleposer by right clicking the Teleposer without a focus in your hand and placing the focus inside of the GUI.\n\tPowering the Beginning Teleposer (the one with the focus) with a strong redstone signal will cause the Teleposers to swap the entities and blocks (including any content in the tiles such as chest inventories) between the Teleposers, assuming that there is a Teleposer at the Destination. \n\tYou can either have one Teleposer have a focus, have both of the Teleposers have foci that are linked to each other, or you can have one Teleposer linked to another Teleposer that is not linked to it, so depending on how you set them up you can have very intricate systems.\n\tKeep in mind that currently the Teleposer will only swap the blocks and entities that are right above the block, and the size depends on the focus - the T1 focus only swaps the block on top of the Teleposer, the T2 focus swaps a 3x3x3 area above the Teleposer, etc. -guide.bloodmagic.entry.architect.boundBlade.info.1=The Bound Blade is an artifact from the past, a blade that is created by binding an entity to a sword in the same process that creates the Living Armour. It should be noted that this, as well as the Bound Tools, will change in later versions of the mod.\n\tThe sword has an active and inactive mode, which can be toggled by shift-right clicking. The sword does not deal any damage at all when inactive, but while active there will be a small LP drain over time. Likewise, when you damage a mob you will drain LP from your network. Sure, you have a lot of damage, but it may kill you!\n\tWhen a monster is killed, the monster has a chance to drop a Weak Blood Shard. These shards are used in order to upgrade your Blood Altar to a T4 altar. -guide.bloodmagic.entry.architect.boundTool.info.1=Similar to the Bound Blade, these Bound Tools (pickaxe, axe, and shovel) will eventually be modified to fit better in the mod. Like the Blade, the tools have an active and inactive mode that can be toggled between by shift-right clicking them. \n\tSomething that these tools have is something called "Beast Mode". If you hold right click, you can charge up the tool and unleash a powerful cleave that will instantly break the blocks that can be broken by the given tool - when fully charged, this is an 11x11x11 cube above you at a cost of 10kLP. Be careful with this powerful tool, since it may be your last! -guide.bloodmagic.entry.architect.weakShard.info.1=Everything that has life can have the ethereal connections that is known as the Soul Network. As seen in your experiences, non-living things can also have a Soul Network attached to them, such as sigils and rituals; however, these connections are the strongest in creatures and, naturally, humans. \n\tWhen you attack a monster with a Bound Blade, their Soul Network temporarily hardens and a piece of it will remain after death. This piece takes the form of a Weak Blood Shard, so named after the fact its reddish hue matches the colour of the Weak Blood Orb. At this point, it is not clear if there are stronger forms of blood shards, but you can tell that this would be very helpful in increasing the power of your own Soul Network -guide.bloodmagic.entry.architect.masterOrb.info.1=One of the uses for this increased affinity for the Soul Network is to use the Weak Blood Shard in a new blood orb: the Master Blood Orb. This orb has a maximum capacity of 1 million LP, and thus allows the wielder of the orb to access more powerful items and rituals. Perhaps meteors are not out of your reach... -guide.bloodmagic.entry.architect.runeOrb.info.1=Initially, this rune can be seen as somewhat useless. By thickening the ties between the blood orb in the altar and the Soul Network, the Rune of the Orb increases the maximum capacity of a blood orb filled by a Blood Altar by +2%% per rune, additively. For something like the Weak Blood Orb, this is just +100LP capacity, however for the Master Blood Orb this is a remarkable +20kLP capacity per rune. If you have a high tier blood orb and a few extra runes to spare on your altar, this may be something to round out your network. -guide.bloodmagic.entry.architect.suppression.info.1=The Sigil of Suppression uses the technology that is used in a Teleposer in order to temporarily displace fluids that are near it when active. This is done by teleposing the liquids in a sphere around the user to a hidden pocket dimension, replacing the liquid with air. Unfortunately, because you are overcharging the field used by the Teleposer, the teleposition is temporary - if the user walks away from the area that the liquid was teleposed away from or deactivates the sigil, the liquids will pop back where they were before as if nothing has happened, assuming that there are no newly-placed blocks there. This allows for fancy transportation when on foot, walking under the water instead of swimming through it or even parting the red seas of the Nether. -guide.bloodmagic.entry.architect.haste.info.1=Sugar and caffeine are interesting chemicals that the human body can process. One acts as a reservoir of energy that is quickly burned, whereas the other increases your wakefulness and allows you to access energy in other means. By mimicking these chemical processes to unleash more chemical energy, the Sigil of Haste allows the user to increase their movement abilities. \n\tWhile activated, the user can run a lot faster and is able to jump significantly higher. What is more, the sigil also offers "Step Assist," which allows the user to step up one block high ridges without needing to jump. It's like auto-jump, but less sucky. -guide.bloodmagic.entry.architect.severance.info.1=Teleportation is one of those odd powers that people can't fully explain. In most instances, teleportation can be described as a temporary warp in space-time, linking two places in space together so that the object in question can simply "step" through to the other side. The Sigil of Ender Severance attempts to stop this warping that teleportation requires, preventing creatures from teleporting when they are around the user. This does not stop some of the larger means of teleportation such as portals, but it will prevent Endermen from using their powers to warp around the user. -guide.bloodmagic.entry.architect.teleposition.info.1=The Teleposition Sigil has a contained Teleposer and focus in its structure. If you right click a Teleposer with this sigil, you can bind the coordinates and dimension to the sigil. Now, whenever you right click the sigil it will telepose you directly to the Teleposer (if it is there). Unfortunately, it doesn't seem like you are able to do a return trip... -guide.bloodmagic.entry.architect.compression.info.1=A miner will quickly find that during a long expedition their inventory will become filled with redstone dust, lapis, and several other materials. Most of these have recipes that will compress them down to storage blocks such as redstone blocks and blocks of diamonds, however they normally require a crafting table in order to combine them. \n\tThis sigil creases a miniature field of compression in the inventory of the user when activated, compressing items down to the lowest number of slots needed for the inventory. What this means is that if you have 63 redstone dust it will not do anything. However, if you have 64 dust it will compress 9 of them into a block of redstone. While this is technically not the ideal situation if you have exactly a stack of redstone dust, it will guarantee that you aren't left in the dust due to full pockets. If other mods are present this will work for other crafting recipes as well. -guide.bloodmagic.entry.architect.bridge.info.1=When activated and while the user is on solid ground, the Sigil of the Phantom Bridge solidifies the air beneath the user so that they may walk on it, essentially creating a Phantom Bridge. When you are shifting in the air, the bridge will instead form directly underneath you, allowing you to catch yourself in the air if you were falling. Although some calibration is needed in order to make it more effective for vertical travel as well as horizontal travel when moving quickly (due to lag messing up the creation of the bridge), it is a fancy way to effectively fly to different areas. -guide.bloodmagic.entry.architect.mimic.info.1=Mimics are arcane constructs that are designed to mimic whatever they are set to. When the mimic comes into contact with some form of block, its molecules shift their orientation in order to take on the shape, look, and feel of the block. Not all of the properties are copied, however: for instance, a normal mimic block when coming into contact with glowstone will not emit any form of light. \n\tWith normal use, there are two ways to use a mimic block. The first is placing the mimic block down and then right-clicking the mimic with the block that you want it to copy. This will place the block inside of the mimic and have the mimic take on the -default- shape of the block. So if a mimic is clicked with a stair, the mimic will always orient themselves in the same way.\n\tThe second method is to hold the mimic block in your hand and shift-click the block you want to replace. This will replace the block with the mimic and the mimic will have the exact same orientation that the replaced block had. This can be seen with stairs and chests, as well as other orientation-dependent blocks such as logs.\n\tThere are a few different variants of the normal mimics. The Opaque Mimic is the default mimic, able to take on the form and general properties of blocks - light cannot travel through these, however, so care should be taken with glass. The Ethereal Opaque Mimic can be walked through without any trouble because it has no hitbox, which is perfect for hidden doorways. Clear Mimic blocks work the same as their opaque variants, however they allow light through them even if it appears completely solid. Finally, the Lighted Mimic block is opaque and solid, but no matter what is placed inside of it, it will emit a strong light. No more dark areas in your base without torch spam!\n\tThere is one special variant of the mimic that you have to be wary of: the Sentient Mimic. If a player comes too close to one of these in the world, it will get up from where it is and attack you with a high degree of ferocity. These can be found in a variety of areas, but they are especially fond of dungeons. If one is mimicking a chest, however, be careful: they bite.\n\t***Creative Usage Only***\n\tThere are a few interesting features you can add to any mimic block when you are in creative mode. If you right click on a set mimic with a potion or potion flask, you can set the mimic to spawn potions around it if a player is nearby. If it is a regular mimic and you click on the east or west side, you can increase or decrease the radius that the potion will spawn in. If you click on the north or south side, you can increase or decrease the radius that the mimic will check for players around it before spawning the potions. Finally, clicking on the top or bottom of the block will increase or decrease the potion spawning interval, which is the number of ticks between dropped potions.\n\tIf the mimic is a sentient mimic, you can click the mimic anywhere to increase or decrease the detection radius for players - if a player is within this area and they can see the block, the mimic will spawn and jump at the player. \n\tAnother thing is that if the block is placed on the mimic while the placer is in creative, the block that is being mimicked will NOT drop when the mimic is destroyed.\n\tFinally, if the mimic is placed on any inventory or chest, the sentient mimic will place the chest on the ground with its contents once defeated - the regular mimic will instead just spew the contents everywhere when broken. -guide.bloodmagic.entry.architect.downgrade.info=Please see the entry "Penance of the Leadened Soul" in "The Ritual Master" for a detailed explanation about what these are as well as how to obtain them. - -guide.bloodmagic.entry.architect.augmentedCapacity.info=The Rune of Augmented Capacity functions similar to the Rune of Capacity in the sense that it increases the capacity of the Blood Altar. However, multiple runes on the same altar will begin to resonate with each other, increasing the capacity exponentially the more there are. One rune by itself will apply a +10%% increase to the capacity of the altar, however this functions multiplicatively with other Runes of Augmented Capacity: if there are two runes, it is a +21%% increase, three runes is +33.1%% increase, etc.\n\tUnfortunately, this multiplicative effect does not stack with the Rune of Capacity, meaning you will still only get the +2kLP bonus per rune. -guide.bloodmagic.entry.architect.charging.info=The Charging Rune is one of those beauties that will completely change the operation of the Blood Altar to something that can be seen as more useful for one-stop crafting. By syphoning off the LP from the Blood Altar slowly, the Charging rune begins storing "Charge," an internal value of the Blood Altar that can be seen using the Sigil of Sight. If the Blood Altar has enough Charge when it gets something to craft, it will use the required Charge up immediately and craft the item instantaneously. If there is not enough Charge, the Charge is all used to increase the progress of the item at a 1:1 Charge:LP ratio. \n\tThe maximum amount of Charge that can be stored in the Blood Altar is a function of the number of Charging Runes that it has multiplied by the current capacity of the altar (the capacity of the altar only comes into effect if it is greater than 20k). The rate that it charges is also related directly to the speed of the altar times the number of Charging Runes it has, and it will convert LP into Charge once every 20 ticks (one second). So if you were to design a Blood Altar with this rune, careful consideration will have to be made for all of the synergistic relationships that it has. -guide.bloodmagic.entry.architect.acceleration.info=Unlike most runes, the Rune of Acceleration works best only when paired with other runes, and its effects only increase to a limited amount. What this rune does is it increases the number of processing ticks that can occur in a given period of time, specifically when it comes to the Displacement Rune and Charging Rune. For each rune added, the number of ticks before the next processing tick decreases by one. For instance, by default the Displacement Rune displaces liquids at a rate of one operation per 20 ticks - with 10 Runes of Acceleration, this would occur at a rate of one operation per 10 ticks.\n\tObviously the maximum number of Acceleration Runes that presently matter is 19 - if you have this many, the Displacement Rune and Charging Rune will both activate their effects each tick. Noice! - -guide.bloodmagic.entry.architect.tier3.info=It is well known that a Tier 3 altar requires you to cap four pillars with glowstone blocks from the Nether. What is not as thoroughly understood is that you can actually use Sea Lanterns instead. So if you find yourself very far away from going to the Nether but have access to ocean temples, you can use other ways to advance yourself in Blood Magic. - -# Demon Kin Entries -guide.bloodmagic.entry.demon.intro=Bella Highborn -guide.bloodmagic.entry.demon.snare=Demon Will and Snares -guide.bloodmagic.entry.demon.forge=Hellfire Forge -guide.bloodmagic.entry.demon.petty=Petty Tartaric Gem -guide.bloodmagic.entry.demon.sword=Sentient Sword -guide.bloodmagic.entry.demon.lesser=Lesser Tartaric Gem -guide.bloodmagic.entry.demon.reactions=Unexpected Reactions -guide.bloodmagic.entry.demon.sentientGem=Sentient Armour -guide.bloodmagic.entry.demon.routing=Item Routing -guide.bloodmagic.entry.demon.aura=Demon Will Aura -guide.bloodmagic.entry.demon.types=Different Will Types -guide.bloodmagic.entry.demon.crucible=Demon Crucible -guide.bloodmagic.entry.demon.crystallizer=Demon Crystallizer -guide.bloodmagic.entry.demon.cluster=Demon Crystal Cluster -guide.bloodmagic.entry.demon.pylon=Demon Pylon -guide.bloodmagic.entry.demon.gauge=Demon Will Aura Gauge - -# Demon Kin Entry Texts -guide.bloodmagic.entry.demon.intro.info=My name is Bella Highborn, and I am known as the Demon Kin. Several months ago my village was attacked by a wave of demons, killing all other people while destroying every single building. I don't remember much from the attack, other than the screams of pain as each and every person I knew left this world for a happier one. Thankfully the demons did not hear me as I cowered underneath the fruit baskets in the basement of the church of Intactilis, trying desperately to keep my screams from joining the chorus of other voices. \nThere was one horrible moment when I accidentally knocked down the incense altar of the church and a demon came bounding into the sanctuary, unperturbed by what we assumed was a sacred place. It was a huge four-legged monster, with curved tusks hanging past a jutting mouth, saliva dripping onto serrated swords taking the place of his claws. It took a look around the room and I swear it locked eyes with me for a solid second, but then it just simply left as if it neither heard nor saw anything. Everything afterwards was a blur. \nIt was a full day before anyone came to see what happened. A trading caravan saw the smoke in the distance and decided to take the long way around past the demons. Many of the traders didn't even want to look at me, fearing that because I alone managed to survive unscathed it was a bad omen. But two brothers decided to take pity on me and try to convince the rest of the caravan to consider having me ride along. It took me selling the priestess's wand and locket, but I managed to buy safe passage to a village far enough away from the demons' path of destruction. -guide.bloodmagic.entry.demon.snare.info.1=Magus was telling me one day that every living being has a soul: humans, chicken, sheep, and even creepers have this life force that would give the body the will to live. It seems that Magus has done a lot of experiments in his time, and has even heard of a powerful mage that could take these souls and transfuse them into empty vessels such as zombies. But that made me wonder: if zombies and skeletons did not have souls, how is it that they had a will to live? What animated them so that they would try to hunt down any living creature and try to kill them? \n\tIt all came back to will, each and every single time. Anything "living" had to have a will in order to survive, but it didn't mean that it had to be their own. When I brought this up to Magus he pondered a little, and then brought out a blackboard and chalk (from where, who knows) and started to sketch some notes about other forms of magic. "In Thaumaturgy," he said while sketching out the form of a straw man, "golems are animated beings that are tasked to perform many mundane operations. They live, breathe, and can even die if they fall out of favour with their masters. In the current iteration of Thaumaturgy, and yes there have been several versions of this art over the centuries, the magician would imbue their will into their inanimate creation and bring them to life.\n\t"That, Bella, is how golems operate: by an imbuement of will."\n\tSo if a golem could live by another entity imbuing its will into an empty shell, maybe some other entity is imbuing its will into the bodies of the dead, bringing zombies and skeletons into existence. At this point I shivered, remembering briefly what happened in my old village. Only a demon could do something so cruel. But to test this hypothesis, I needed more proof. -guide.bloodmagic.entry.demon.snare.info.2=With some direction from Magus, and Tiberius when he could lend a hand from his own work, I made myself a rudimentary snare out of some iron, string, and a bit of redstone. Tiberius, who studied Thaumaturgy in-depth as his cross-discipline magic of choice, said that the snare should be able to disrupt the will of an entity that is controlling an animated object. "I was messing around with this when playing around with golems," he said with a smile. We all knew how well that turned out. "Redstone seemed to disrupt the connection between my golems and my will for them to move. In theory, if something is controlling the zombies or skeletons, you should be able to cut off the will."\n\tHe said that all I needed to do was to throw it - if it worked, some white dust should stream off of the entity for a period of time. "So you have to kill it after this happens in order for anything to really happen. But the snare might only work 25%% of the time, so be slightly liberal with them!"\n\tAfter crafting sixteen of them, I went out with my sword during the night. It was quite tricky, actually: I had to track down several zombies, ducking and dodging their lumbering swipes while chucking a few snares at them. Once the white particles came off of them, I killed them swiftly and picked up what was left of their bodies. A small amount of a blue viscous fluid seemed to lay in the gritty dust, beckoning to me. I picked it up, and it seemed like there was some otherworldly "presence" coming from the fluid. Quickly stowing the samples away, I elected to look at them more deeply when I got back home. \n\tIt seemed that the size and shape of each "Demonic Will" varied, as if the quality of the will depended on the source. Using a completely arbitrary unit of measurement, the Will that I got from the snares seem to range from zero to five "Will Quality". I am not sure what I can use this substance for yet, but it is very intriguing none the less. I can't tell if this is the imprint of the will of some sort of demon, or just a random crystal found in their bodies. More research is needed. -guide.bloodmagic.entry.demon.forge.info.1=I have spent several weeks researching the uses and properties of demonic will. There has been some success these past few days, however it has been infrequent. Tiberius asked me the other day if he could take a sample of demonic will for a few of his other experiments: he mentioned that it might be what he needed to construct a new blood altar to replace the beat-up basin that we were using in Magus's basement, since trying to replicate that old thing with just stone never seemed to create the right... receptacle for our blood magic. In other words, he thinks it may help.\n\tIt hasn't been a complete waste, however! I consulted several different alchemy textbooks discussing "Equivalent Exchange" and the many different ways to manipulate matter. I also talked to a couple of alchemists that were passing by, and they gave me a few tips on how to deconstruct matter and energy in order to study it more closely. (As a side note, I must say I loved the dark purple armour that one alchemist was wearing - just looking at it made me feel like I was being pulled by a dense object. Not talking about Tiberius, either!) From using those simple arrays with the little samples that I had, I managed to see that there were ways to actually tap into the power source inside of the demonic will. I just needed the right configuration. -guide.bloodmagic.entry.demon.forge.info.2=Just today, I managed to get a structure that I believed would fuse together items using this raw will. Dubbed the "Hellfire Forge", the structure uses a simple alchemy array carved into the glass on the top of it to fuse up to four items together while injecting it with demonic will. The piece of demonic will is placed on the right-hand side and the four ingredients are placed around the circle. It appears that there are many different "recipes" available in this forge, but there are some gating effects on these. \n\tFor starters, there is a minimum amount of demonic will that has to be in the sample in order for the items to combine - if there isn't enough will in the structure, nothing seems to happen. Next, it seems that although there is a minimum amount of will needed, most of the recipes don't drain the entire sample of its will. Some recipes need a vast amount of demonic will in order to start the process, but only a little bit is used in the crafting, if any at all. Some recipes seem to be very easy to create in large quantities, but others... not so much. -guide.bloodmagic.entry.demon.petty.info.1=I went out on one of my now-daily nighttime adventures in order to harvest some demonic will when I began to realize one of the major problems with the collection method: my bag kept on getting full from all of the samples! For some reason, perhaps because the ultimate source of the demonic will is different for each sample, the will would not compress into a more manageable form. At least the physical manifestation of the will. \n\tThus, I went to work with the hellfire forge that was nestled in my corner of the house, pushing aside some of Tiberius's least unpleasant experiments and getting some raw materials for my own study. One of these days I am going to make Tiberius his own forge, since I am tired of trying to get rid of all of the dust that coats my workplace from his "arcane experiments". I don't care that you are "trying to bridge the gap between the ethereal strands of the Soul Network and the physical construction of the slates", get your damned ash out of my stuff! -guide.bloodmagic.entry.demon.petty.info.2=Anyway, it did take a while in order to find materials that were most likely to resonate with the demonic will in order to store it in a better manner. Lapis seems to be the most readily available conductor of this energy, acting as a pathway for the will to be channeled. After adding some redstone to act as a shielding from electric fields in the air (adding two energies together seem to cause disastrous effects, at least that is what Magus said), gold as a dampening agent, and glass as a simple housing, I managed to create a very simple "Tartaric Gem". This means "a gem from the underworld, Tartarus."\n\tAfter further tests, I found out that this gem could hold up to a will quality of 64. (When I presented these findings to Magus, he remarked that it seemed like a nice, round number.) When I tried to pick up demonic will afterwards, it seemed to go directly into the gem unless full - after that, the will just seemed to... disappear. Convenient for my backpack, but otherwise a mystery. I also learned that if I hold the gem in my hand and focused (right clicked), about 10%% of the maximum capacity of the gem would flow into other gems I had on my person. I think this last feature is very helpful, especially if we were to find other, more powerful tartaric gems. -guide.bloodmagic.entry.demon.sword.info.1=My snares got tangled again.\n\tIt doesn't seem to matter how much I try to improve the design of them, the rudimentary snare never seems to work perfectly. It just gets tangled most of the time, and when I finally do manage to hit a zombie with it it's more likely to not work than work. In order to stop myself from pulling my own hair out, I went to the forge again and got to work right away.\n\tWell, not right away, since I had to first clean the ash off the top of it again. -guide.bloodmagic.entry.demon.sword.info.2=I infused the demon will-holding capabilities of the petty tartaric gem with an iron sword, and managed to create a blade that... was very dull and hardly did more damage than my fist. I was actually very disappointed with the outcome, because it took a long time of fiddling with the forge so that it would not overheat from the strain of using a petty tartaric gem as its power source.\n\tHowever, as soon as I picked up my Tartaric gem, the sword started to glow with a new energy. It seems that the higher the amount of demonic Will I have on my person, the more damage I seem to do with the sword as well as the more demon will that drops. Whenever you don't have a gem, the Will amount is very... miniscule.\n\tAfter a bit of testing I came to another realization: depending on what I kill, I receive different amounts of Will. It seems proportional to the amount of maximum health that the monster has - a spider, since it has a max health of 8 hearts gives 80%% the Will of a zombie, which has 10 hearts. This is probably because these monsters require more Will to animate. I should keep this in mind for later. -guide.bloodmagic.entry.demon.lesser.info.1=I was chatting with Tiberius today, discussing some of the projects that he is working on. I must say, when we start talking about his research it seems that he just keeps going on and on and on! Anyway, one of the recent inventions he wanted to talk about was his sigils: so far he managed to create a Water Sigil and a Lava Sigil, using the Hellfire Forge I finally constructed for him as a means to create them. I wasn't entirely sure how he actually made them - I knew he experimented by taking some ingredients and combining them inside of the forge using the tartaric gem as a catalyst, but I haven't actually seen him actively experimenting yet. Well, I got some insight finally as to what he uses that blasted ash for.\n\tLet's see if I can mimic what he said properly. Ahem. "By using the Demon Will contained inside of these gems to transmute the ingredients, a reaction occurs between things that normally don't do anything when combined. By harnessing this forced synergy, I am able to inscribe several arcane symbols in patterns that will direct the energy that I add myself to perform the desired task." Although it doesn't show well in writing, picture me saying this while pushing glasses up the bridge of my nose. I'm not sure if he's normally like this, but I swear he gets all... science-y when he explains things to me.\n\tAt any rate, he showed me how he created a Water Sigil by demonstrating it to me. After the, admittedly flashy, demonstration, he then got to the meat of the discussion. "When I try to replicate this process with some more advanced materials, it seems that the reagents tend to... explode when added to the alchemy array. They seem very unstable. My thinking is that the ingredients aren't getting properly fused together - perhaps there is not enough energy in the forge to fuse them properly."\n\tAfter thinking about this for a few minutes, I got to work - as I mentioned in a previous entry, I figured that a more powerful Tartaric gem would be required, but I still haven't figured out exactly how I could do this in an elegant way. So, I decided that a brute-force approach would be sufficient for this! -guide.bloodmagic.entry.demon.lesser.info.2=I took a block of lapis, block of redstone, and a diamond as well as an empty petty Tartaric gem that I had lying around - part of a past experiment that... didn't exactly go very well. All I can say about it is that I am surprised Magus can make holes in a solid concrete wall simply disappear. I then combined these four items in the Hellfire forge with a filled petty Tartaric gem to act as a power source - a minimum of 60 Will seems to be needed. After a bit of effort trying to find an optimal arrangement, I then set them together and watched as the empty Tartaric gem started to grow inside of the forge.\n\tJust as a side note, I tried using a block of gold instead of a diamond to grow the gem, but it seems that having another crystal structure was more beneficial.\n\tThis new, "Lesser Tartaric gem" seems to have a much larger capacity, able to hold a total of 256 raw Will. Hopefully this is enough to sate Tiberius's need for large amounts of Will for a while. But alas it seems that I will need to fill up this gem. Another long night is ahead of me! -guide.bloodmagic.entry.demon.reactions.info=I woke up in a hospital bed today, aching something fierce. I opened my eyes and saw the dull magenta that made up the ceiling of the "Intense Curse" wing of the hospital in Veteres, which is the closest major city to our village. I wasn't exactly worried by this information: it more so puzzled me that I somehow ended up here while seemingly only covered in scrapes and bruises, plus a simple cast on my left leg. Someone must have cast an "Ossa Fracta" curse on me or something, since all it could be was a simple broken bone! \n\tWhen Magus came in with one of the nurses with a solemn face, I knew it was something more drastic. Apparently, one of my experiments with the new Lesser Tartaric gem rebounded and created a small but forceful explosion. That much I could understand easily enough, but that wasn't it: the mixture of obsidian, iron and diamond that I used coated my lower left leg, forming into a rigid shell that couldn't be removed. The cast that I had on my leg wasn't actually a cast, but some form of runic matrix covering the light-blue shell. \n\tCalmly, I asked what Magus thought, even though I was pretty sure what had occurred. "I think," he said, giving a side-long glance towards the nurse that was listening intently before looking back at me, "that it is simply some sort of residue that is diamond-based, which is the main reason we can't remove it. It is also laced with a bit of... otherworldly energy, which is the main reason that you are here instead of a bed at the local clinic - the Conglomerate is rather stringent about unknown energy directly contacting people, ever since the Eldritch Incident, so we had to make sure that there wasn't any issues."\n\t"I see..." Normally Magus doesn't bother much with formalities such as making sure that the Conglomerate is informed about unknown energies - I've been experimenting with Demon Will for quite a while, and it isn't like the Conglomerate came knocking on our door to have this magic registered. I won't go into much detail here, since I am not well versed in politics, but I know that Magus partakes in it only sparingly. This meant that the power from this Will concerned Magus a lot, perhaps through some of his past dealings...?\n\t"Ah well, enough about that for now," Magus said, rolling up the sleeves of his robes. "I tried to break the shell when I first saw it, obviously after checking what it was. It didn't have an effect last time, but now..."\n\tThere was a searing heat on my left leg, accompanied by a blinding red light as Magus cupped his hands on top of the blue shell. After what felt like an eternity, but what must have been only a couple of seconds, the shell started to crack and fracture, falling apart. Honestly, it was kind of anticlimactic. \n\tI tried to get up, but Magus pushed me back into the bed with a small shove. "Bella, you need to stay and rest. You can work with your research on the gems later." I was initially annoyed, but that soon passed as I had a lot of time to think. The only reason that Magus wasn't able to do the exact same thing earlier was probably because I still had my Tartaric gem on my person after the explosion. So whatever happened to my leg had to be directly tied to the demon Will, and as soon as my gem was taken the shell was able to be removed. It got me thinking... -guide.bloodmagic.entry.demon.sentientGem.info.1=After a few days of some "well needed bed rest," prescribed and enforced by Magus, I decided to do a bit of research primarily on the sentient equipment that I have made so far. There is just so much that I do not know about the sentient sword as well as Demon Will in general. Sure, we know some of the theory, but considering that Magus and I were the ones that developed the theory in the first place it is hard to tell how accurate it is.\n\tFor this, I needed to get creative. Magus told me that whenever he takes an apprentice, he insists that they must learn another form of magic alongside the research that he is doing. Tiberius offered for me to learn Botany, but I scoffed at the idea - a bunch of flowers weren't going to help me much when fighting demons! -guide.bloodmagic.entry.demon.sentientGem.info.2=The Sentient Armour Gem is a toggleable item that is used to equip and unequip your Sentient Armour. When you right-click with the gem while you have a minimum of 16 Demon Will in your inventory, your armour will be replaced with a set of Sentient Armour that copies all of the enchants from the armour that you replaced - when you activate the gem again, your original armour is returned to you. This also works when you have no armour on at all to begin with.\n\tThe Sentient Armour initially acts as a simple set of iron armour, yielding no additional abilities besides protection. Similarly to other sentient tools, however, the armour provides more protection when you have more Demon Will in your possession. This makes the protection provided really powerful when you have a large quantity of Demon Will accumulated. The downside to this is that every hit you take will syphon a small bit of Demon Will from your Tartaric gems, and if you get too low your armour will revert back to its original form. Could be bad! -guide.bloodmagic.entry.demon.routing.info=Item transport in Blood Magic comes from linking strands of Demonic Will between routing nodes, which act as conduits in order to transfer items from one inventory to another. To start off with, let us explain how each individual item works.\n\tEvery single routing system needs a Master Routing node, which acts as the brains of the system. An Input Routing node inputs items into your system, and an Output Routing node outputs items from your system, and a regular routing node doesn't have any special function.\n\tTo form a network, you need to shift-click a node with your Node Router and then shift click another node that you want to connect. This links the two nodes together. As long as a node can trace some form of route to another node (and if it is connected to a Master Routing node) they can "talk" to each other.\n\tAs a rule of thumb, items are pulled from an inventory next to an input node and are pushed into an inventory next to an output node. In order to set what goes where, a filter should be used. By clicking on one of the buttons in the node's interface you can select what goes into the inventory in the given direction (N indicates North, etc). If you place an Item Filter into the left-most slot of the node you can specify the quantities and types of items that the node may interact with based on the filter. If you set a filter on an input filter, you can only pull those types of items from the inventory (keeping at least the given amount if you specify a quantity). If you set a filter on an output filter, you can only push those types of items into the inventory, up to a max of the quantity specified.\n\tThere are four types of filters: \n\tPrecise - The item needs to be matched exactly, including NBT and metadata\n\tMod Item - The item matches if it is from one of the filered mods.\n\tIgnore NBT - The item filter does not take into account any NBT\n\tOre Dictionary - Any item that matches one of the ore dictionary references of the filters are allowed.\n\tThere are two numbers that you will be able to see when you insert the filter into the routing node: the quantity and the priority. When you click on one of the items in the filter, the name of the item you have selected will appear and right below that is the quantity of items. By setting this number you can tell the filter how many of this type of item it will keep in stock in the connected inventory (either filling to that amount if it is an output node or making sure it keeps that amount left in the inventory if it is an input node). If you decrease the filter's amount to 0, you can set so that the filter allows "Everything," as in any amount, for that particular filter. Input nodes will pull as much as it can from the inventory, and output nodes will push as much as possible.\n\tThe second number is the priority of the node, altered by the arrow buttons next to it. This number is different for each side of the node. The node that has the LOWER NUMBER in the network will be used first. -guide.bloodmagic.entry.demon.aura.info=When an entity is killed normally, it evaporates over time and returns to the creator. When captured in a snare, it is pulled into this plane from the ethereal and is sort of stuck. We have, for all intents and purposes, broken its programming and it has frozen all action. When we burn it, it returns to an ethereal state and is able to resume normal operations. If this Will is injected into the air, we can then harness it in a variety of ways. Some of them are mundane in nature, whereas others are quite powerful.\n\tDemon Will when injected into the air stays within the chunk that it was put in without migrating. Each chunk has their own stored Will, with each type of Will stored individually (more on that in a different section). This Will can be accessed and manipulated by other blocks and items. -guide.bloodmagic.entry.demon.types.info=So far, the only type of Demon Will that we have discussed is raw Will. As the name suggests, it is the most raw and unadulterated form of Will there is, but this does not mean that it is pure. In fact, Demon Will takes on many different forms: Raw is the type we deal with normally, but there is also Corrosive, Destructive, Vengeful, and Steadfast. Raw Will is composed of a mixture of all four of these types, and perhaps mixed with other as of yet undiscovered types, but once split into these different Will types it seems impossible to recombine them.\n\tIt is not clear yet whether these different types of Will come from different sources, however we do know the process of generating these different types of Will. The Ritual "Resonance of the Faceted Crystal" can split a Raw Will Crystal into its pure parts, more on that in the corresponding entry in "The Ritual Master". A device able to obtain Raw Will Crystals is the Demon Crystallizer, whose entry can be found further down.\n\tEach of these four types of Will represent different aspects of one's desire. There may be more types of Will, however they are either not pure enough or simply cannot be created in this form.\n\tCorrosive represents the desire to break down all things around oneself, either with acid or by crushing force. One who can master this Will can wield debilitating status effects and are immune to horrible poisons.\n\tVengeful can be viewed as the desire to seek a target without tiring. Usually, this can be seen either as an increased speed of the body to seek their prey or to make sure that a target is not able to get away as you continually attack them.\n\tDestructive, as you can probably tell, is pure force. Attack strength and overall physical prowess can be gained if this Will is properly harnessed. It can also be used to crush and smash things when used in other applications.\n\tSteadfast is seen as the desire to prevent damage to oneself. In most cases, masters of this Will are the defensive bulwark of the party, able to withstand powerful attacks and not even feel it. If you need to stay alive, through your armour or by rituals, this is one choice that should be considered. -guide.bloodmagic.entry.demon.crucible.info=The Demon Crucible is a device that is able to burn the Demon Will inside of a Tartaric Gem and other items in order to inject it into the Aura of the chunk that it is in. There are a few different ways to use the crucible: one of the simplest ways is to place a Tartaric Gem inside of the crucible by right clicking on it with a gem in your hand. The crucible will then in that case drain the Will from the gem until either the Aura is saturated with that type of Will (a max of 100 by default) or until the gem is empty.\n\tAnother mode is to use the contained Tartaric Gem to drain the Will from the Aura - this is done by applying a strong redstone signal to the crucible and then the contained gem will attempt to drain as much Will as possible.\n\tFinally, a discrete piece of Will can be burned in the crucible if there is enough room in the Aura of that type. One example of this is a Demon Will Crystal, which has a value of 50. -guide.bloodmagic.entry.demon.crystallizer.info=As discussed previously, Demon Aura is the ethereal manifestation of Demon Will, and the substance obtained when killing a mob is its physical manifestation. The Demon Crystallizer acts as an anchoring point for Demon Will in the Aura to latch on to, transforming the ethereal Will back into a physical form once again in the form of a crystal.\n\tYou may be curious why you do not just take the Will from a Tartaric Gem directly and form a crystal from it. That is because by transforming the Will to its ethereal form we purify it and allow the Will to attempt to resume its normal operations - keep in mind that when we kill a monster with Demon Will attached to them, we freeze the programming of the Will so that it cannot do what it was sent out to do. By converting it into the ethereal form in the Aura, the Will becomes more active, and that is the Will that is grabbed by the crystallizer. Just don't look at it funny.\n\tIn order for the Demon Crystallizer to work it must be in a chunk with a high amount of Demon Will (80) of a particular type, and after a certain amount of time it will consume the Will from the Aura in order to create a Demon Crystal Cluster with a single spire. There are two ways for the Crystallizer to work: it can form a crystal from an aspected type of Will (Corrosive, Destructive, Vengeful, and Steadfast) if there is enough Will of that particular type, or it will take Raw Will from the Aura to create a crystal. \n\tIn previous incarnations of the device it was possible to transform Raw Will from the Aura into differently aspected crystals. However, that is no longer the case: you can still create new spires of a certain aspected Will if there is enough of it in the Aura, however you will need to look into other means to separate the many aspects from Raw Will. See the entry on "Resonance of the Faceted Crystal" in The Ritual Master for more details. -guide.bloodmagic.entry.demon.cluster.info=The Demon Crystal Cluster can either be created by a Demon Crystallizer or by crafting one in the Hellfire Forge with Demon Will Crystals. Crafted clusters can be placed on any solid surface, such as the floor, walls, and ceilings. There are a max of seven spires on the crystal when fully grown, and when broken with a pickaxe it will drop the spires as Demon Will Crystals. However, if you right-click the cluster when you have a Tartaric Gem with more than 1024 Raw Will inside of it, you can break off a single spire from the cluster without breaking the cluster itself; this will never break the main spire from the cluster.\n\tWhen left to its own devices, the cluster will syphon some Will of the same type from the Aura to grow itself slowly. This process is a bit slow, but there is a minor net gain.\n\tThere are two rituals that are used to grow and harvest these crystals: the "Gathering of the Forsaken Souls" and the "Crack of the fractured Crystal". In order to find out how to use them, please refer to The Ritual Master. -guide.bloodmagic.entry.demon.pylon.info=As you may know, Demon Aura remains in its own chunk if there are not any outside influences. Well, this is one of those influences. The Demon Pylon acts as a beacon for Will in the Aura, pulling the Will from neighbouring chunks (those chunks that are directly next to it in the four cardinal directions, not diagonal) into its chunk. The Pylon will attempt to equalize the Will in its chunk with its neighbour so that the Pylon's chunk has as much Will as its highest neighbour for each Will type. This process only happens one way, however: if the neighbouring chunk has less Will in it than the Pylon's chunk, the Will will not transfer the other direction. -guide.bloodmagic.entry.demon.gauge.info=In order to tell how much Will you have in a given chunk you need to have a Demon Will Gauge. When in your inventory, the gauge will display the Will in the chunk that you have in five bars in the top-left corner of the screen. You can tell how much there is exactly by shifting; numbers will appear to the right of the bars to give the amount rounded to the nearest whole number. - - - -# Alchemy Entries -guide.bloodmagic.entry.alchemy.intro=Introduction -guide.bloodmagic.entry.alchemy.ash=Arcane Ash -guide.bloodmagic.entry.alchemy.speed=Movement Array -guide.bloodmagic.entry.alchemy.updraft=Updraft Array -guide.bloodmagic.entry.alchemy.bounce=Bouncing Array -guide.bloodmagic.entry.alchemy.turret=Skeleton Turret Array -guide.bloodmagic.entry.alchemy.buff=Buff Arrays -guide.bloodmagic.entry.alchemy.fastMiner=Fast Miner Array -guide.bloodmagic.entry.alchemy.furnace=Burning Furnace Array -guide.bloodmagic.entry.alchemy.teleport=Teleportation Array -guide.bloodmagic.entry.alchemy.standardTurret=Turret Array -guide.bloodmagic.entry.alchemy.laputa=Shard of Laputa - - -# Alchemy Entry Texts -guide.bloodmagic.entry.alchemy.intro.info=My name is Vlad Highborn, and I am a Blood Mage. I have studied the intricate workings of alchemy and the process of "Equivalent Exchange," which governs all aspects of magic. Basically, you cannot create something from nothing, although many have tried when searching for a particular stone. That obviously didn't end well, because people are clamoring for a fake variant even today. Of course simply saying that I am an alchemist isn't enough, because one of the main things I do is study Blood Magic with The Ritual Master and The Architect, both of whom have achieved those titles by their own merits. Magus and Tiberius have been busy recording their own works over the years, although I don't think Magus has everything written down in a book - I have yet to find any actual proof.\n\tMy book deals with all things alchemical in Blood Magic. From the uses of Arcane Ash to the intricate workings of the Alchemy Table, you will find everything you need to know about some of the more complex elements in the world. Not everything you need to know is in this book - for a full understanding about Blood Magic, you will need to read the other entries in this entire tome.\n\tBut for now, I hope you enjoy my research notes. You shan't find any lies between these covers. -guide.bloodmagic.entry.alchemy.ash.info=Arcane Ash is necessary in order to create alchemy arrays, powerful circles that are able to provide various effects. This ash is crafted using the Hellfire Forge and Demon Will, so if you are new to this concept please consult the "Demon Kin." \n\tThe ash has a total of twenty uses before you need to craft another. When you right click on the ground (or a wall, though it will only render one direction), you will inscribe a simple circle out of ash. If you click on the ash again with an item, it will be "placed inside of the ash" - assuming that this item is valid, the circle will change shape to represent that it is ready for the next item. If it doesn't change shape, then you did something wrong.\n\tOnce it has changed shape, you can then place in the secondary item. If this item matches with the first item, the circle will start rotating and performing different actions depending on the recipe it is working on. \n\tEvery non-crafting effect that can be performed using these arrays can be found in this book, and even if the recipe changes through 3rd party means it will show updated here. The items shown are the order they need to be placed in. -guide.bloodmagic.entry.alchemy.speed.info=The Movement Array creates a small vortex of air at its center and uses a small amount of energy to heat it up. After that, once an animal or any other type of entity walks into its area of effect, they will be launched forward in the direction that it was placed in by the force of the air. What is more, if fallen onto from a large height, the array will eliminate the fall damage that would have incurred. Just be prepared for some mild motion afterward. \n\tThe direction of motion is in the direction of the arrow on the array.\n\tIt should also be noted that you will gain a much greater distance if you fall or jump onto the array than if you simply walked into its area. This has to do with the turbulence from your movements causing a much greater reaction. -guide.bloodmagic.entry.alchemy.updraft.info=Using the exact same principles as the Movement Array, this array launches the entity that steps on top of it vertically in the air. Naturally, any user would have to be careful because the way down may be a little arduous! -guide.bloodmagic.entry.alchemy.bounce.info=By using a source of heat near its center that is pushed downward, the array attempts to soften the ground underneath it. After it has done this, it then converts carbon and hydrogen into a rubbery material inside of the earth. This combination causes any entity to impact the surface to bounce in the air and eliminating the fall damage that would otherwise be sustained. This bouncing can be stopped by simply shifting, and it will still cushion your fall. -guide.bloodmagic.entry.alchemy.turret.info=By utilizing the Demon Will that is still controlling a mob, you can take over the mind of a skeleton in order to make it do your bidding. If a skeleton finds itself inside of the area of this array, it will act as a sentry and attack hostile monsters nearby. Unfortunately this array is still highly experimental, so it may not work very well or consistently. -guide.bloodmagic.entry.alchemy.buff.info=Through rigorous study, you realize that alchemical arrays have a wide range of applications. So far, you have managed to create powerful items through crafting arrays, as well as a couple of arrays that provide functional benefits such as rapid movement and weak forms of teleportation. However, one of the uses that you have yet to tap into is providing powerful buffs through an active array.\n\t"Buff Arrays" are the general term for alchemy arrays that provide some buff to players within its area of effect. These areas of effect tends to have a very large radius which cannot be manipulated (unlike Rituals). However, because alchemy arrays have no concept of a Soul Network, they have to power their effects through other means: mainly through direct blood offerings. In simplified terms, this means that whenever the array will apply a buff, it will damage (take HP) from the player that it is cast on. \n\tBecause of the direct nature of these sacrifices, the HP -> buff conversion is a lot more favourable for players in the early game compared to similar buffs in the mod. For instance, if a buff from a sigil cost 100 LP for 10 seconds of activation, a more powerful buff can be applied by the array for 30 seconds for 1 HP (which is 100 LP in a T1 altar with no runes). This can be seen as a lot more efficient in the early tiers, while during the later tiers it is not as efficient of an effect. However, because of the stationary nature of the arrays, they will tend to provide a stronger effect than their sigil counter parts, so people may wish to still use it in the late-game. -guide.bloodmagic.entry.alchemy.fastMiner.info=When tasked with carving out a large area of land, sometimes it is best to just do it by hand. For those occasions, this array is for you. The array applies a Haste III buff to players within a 10 block radius, costing the user 1 HP per 30 seconds. Because it is a general Haste buff, it will also increase your attack speed while in its area of effect, though you will have to be careful since other players will benefit from this too! -guide.bloodmagic.entry.alchemy.furnace.info=One of the many problems that you may encounter in the beginning of your adventure is the inability to keep your furnace lit. A lit furnace can mean the difference between having a full stomach and strong weapons or starving in a cave. \n\tThe Burning Furnace array, as the name implies, will provide a much needed heat source for any nearby furnace. By placing the array directly adjacent to a vanilla furnace (it can be next to multiple), it will provide fuel to the furnace if an operation is able to be completed - nothing will happen if it is next to an empty or a full furnace, mainly for your protection. \n\tThis does not come for free, however: when a person is nearby (within a 10 block radius), it will take away half a heart of health in order to cook up to two things in the furnace. This will be helpful to either get a quick bite or to smelt a full stack of ore, but unfortunately you haven't found a way to add any safety measures to the array... -guide.bloodmagic.entry.alchemy.teleport.info=The Teleportation Array acts as a way to travel instantly from one location to another with a few specific limitations. When a player or other entity steps onto the array, the array will search up to 20 blocks away in the direction it is facing for another alchemy array (which does not need to be active). If the array manages to successfully find a destination, it will then teleport the entity to its found array instantly, even through walls. \n\tStudying this array has shown that there are further limitations added to it: because of the nature of bending the fabric of space-time, a Teleportation Array will not teleport something that has teleported within 2 seconds. This is to allow time for all components to rearrange themselves in a desirable manner. -guide.bloodmagic.entry.alchemy.standardTurret.info=The power of flinging pointy objects at far away monsters cannot be overstated. The Turret Array is able to sense a nearby hostile monster and by utilizing complex alchemical mechanisms it is able to draw back and fire an arrow in order to strike its target. \n\tThe array searches for an inventory directly beneath it. If it finds either a normal or tipped arrow it will syphon from its container and fire at a mob that is within a 32 block radius. \n\t(Due to some silly Minecraft physics that has arrows bounce off of entities that are too close to where they spawn, the turret will also only fire on a mob that is greater than 3 blocks away. Keep that in mind!) -guide.bloodmagic.entry.alchemy.laputa.info=There exists a story of a lost kingdom that had such advanced magic that it could fly through the clouds. Although this kingdom has since crumbled to dust, a few drawings of this castle in the sky has managed to provide exquisite detail as to the mechanisms that allowed it to become the legend that it is. \n\tThe Shard of Laputa converts the life essence that is found within the earth into a more avian form, causing the surrounding area to levitate in the air. While the underlying principle is simple, the variations of the life essence in the earth cause a bit of inconsistency in how much land is moved. The array will move the earth in a spherical radius between 4 and 8 blocks up above itself a random offset between one and 5 blocks plus twice the radius of the effect. \n\tIt should be noted that as soon as the effect starts, all items used to activate the array will be lost. diff --git a/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang b/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang deleted file mode 100644 index 236db6e7..00000000 --- a/src/main/resources/assets/bloodmagicguide/lang/ru_RU.lang +++ /dev/null @@ -1,239 +0,0 @@ -# Book Information -guide.bloodmagic.title=Ðаука крови -guide.bloodmagic.display=Ðаука крови -guide.bloodmagic.author=Blood Magic -guide.bloodmagic.welcome=Blood Magic - -# Page Information -guide.bloodmagic.page.bloodAltar=Рецепт Кровавого ÐÐ»Ñ‚Ð°Ñ€Ñ -guide.bloodmagic.page.soulForge=Рецепт Кузницы ÐдÑкого Пламени -guide.bloodmagic.shapelessOrb=БеÑформенный рецепт шара -guide.bloodmagic.shapedOrb=Форменный рецепт шара - - -# Categories -guide.bloodmagic.category.architect=Ðрхитектор -guide.bloodmagic.category.ritual=Ритуал МаÑтер -guide.bloodmagic.category.demon=Демон Кин -guide.bloodmagic.category.spell=Боевой Маг -guide.bloodmagic.category.alchemy=Ðлхимик - -# Ritual Master Entries -guide.bloodmagic.entry.ritual.intro=Ð’Ñтупление - -# Ritual Master Entry Text -guide.bloodmagic.entry.ritual.intro.info=Добрый вечер. ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚ ÐœÐ°Ð³ÑƒÑ Ðркана. За Ñти годы у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð»Ð¾ много обликов: вор и дружинник, волшебник и воин, бродÑчий кочевник и даже политик. Ðазвание, которое Ñ Ð´ÐµÑ€Ð¶Ñƒ в наÑтоÑщее времÑ, - Ñто то, что многие не могут понÑÑ‚ÑŒ, что при Ñамом упоминании о нем возникают образы жеÑтокоÑти, которые в некоторых ÑлучаÑÑ… были заÑлужены, но во многих других введены в заблуждение. Я, конечно, говорю о том, чтобы быть Кровавым Магом, Ñ…Ð¾Ñ‚Ñ Ð¼Ð¾Ð¸ Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¿Ñ€Ð¾Ñто называют Ð¼ÐµÐ½Ñ ÐœÐ°Ð³Ð¾Ð¼, тогда как мои враги называют Ð¼ÐµÐ½Ñ ÐœÐ°Ñтером Ритуала.\n\tМои ученики приÑтавали ко мне уже много меÑÑцев, пытаÑÑÑŒ заÑтавить Ð¼ÐµÐ½Ñ Ð·Ð°Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ вÑе беÑчиÑленные приключениÑ, которые у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð»Ð¸, в какой-то форме книги, которую Ñ Ð¼Ð¾Ð³ бы раÑпроÑтранÑÑ‚ÑŒ Ñреди любых начинающих магов. Я был наÑтойчив, но Ñто был Тиберий, который выразил Ñто лучше вÑего: Â«Ð¥Ð¾Ñ‚Ñ Ð²Ñ‹, возможно, и Ñами не Ñможете оценить его ценноÑÑ‚ÑŒ, уÑлышать тонкоÑти любого рода ремеÑла от человека, который доÑтиг маÑтерÑтва в Ñтой облаÑти, окажетÑÑ Ð½ÐµÐ¾Ñ†ÐµÐ½Ð¸Ð¼Ñ‹Ð¼ Ð´Ð»Ñ Ð±ÑƒÐ´ÑƒÑ‰Ð¸Ñ… поколений. «Ðеважно, наÑколько точно кто-то другой переÑказывает Ñто, еÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ полной уверенноÑти в иÑточнике, золотой пеÑок может быть не чем иным, как Ñерой». Ð’Ñ‹ могли бы Ñказать, что в тот момент он углублÑлÑÑ Ð² алхимию, но так как он долгое Ð²Ñ€ÐµÐ¼Ñ Ð±Ñ‹Ð» моим первым учеником, Ñ Ñклонен ценить его мнение.\n\tТак, начинающий кровавый маг, тренирующийÑÑ Ð² тайне, который многие еще делают не до конца понимаю, подайте мне уши, потому что Ñти Ñлова заÑлуживают вниманиÑ: облаÑÑ‚ÑŒ, которую вы изучаете, имеет много аÑпектов, и без тщательного раÑÑÐ¼Ð¾Ñ‚Ñ€ÐµÐ½Ð¸Ñ Ð²Ñ‹ можете обнаружить, что ваши инÑтрументы не хватает. ПоÑтому не забывайте чаÑто читать Ñту книгу - Ñ Ð²Ð»Ð¾Ð¶Ð¸Ð» много чар в книгу, которую вы ноÑите Ñ Ñобой, чтобы вÑÑкий раз, когда Ñ Ð¿Ð¸ÑˆÑƒ в Ñвоей оÑновной копии, Ñлова менÑлиÑÑŒ Ð´Ð»Ñ Ð²Ð°Ñ.\n\tТак что ÑÑдьте, раÑÑлабьтеÑÑŒ и наÑлаждайтеÑÑŒ учением очень Ñтарого человека. Ð’Ñ‹ можете узнать больше, чем вы раÑÑчитывали. -guide.bloodmagic.entry.ritual.basics.info=Современные ритуалы Ð´Ð½Ñ Ñильно отличаютÑÑ Ð¾Ñ‚ тех, которые проводилиÑÑŒ в прошлом. Было времÑ, когда люди пиÑали на земле тайные конÑтрукции из пыли и танцевали, пока не получили то, что хотели. Я даже помню одну ведьму-отшельницу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñобирала Ñнергию из ее Ñада. Я ÑмеÑлаÑÑŒ над вÑем Ñтим, пока она не накурила на Ð¼ÐµÐ½Ñ Ñвою любимую Ñову. \n\tРитуалы, которые иÑпользуют Маги Крови, требуют точного Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹Ñ… камней, чтобы ÑфокуÑировать и преобразовать Ñилу, которую маг накачивает в него. Однажды мой ученик Тиберий копалÑÑ Ð² некоторых Ñтарых артефактах, которые Ñ Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÐ» за Ñти годы в шкафу его новой комнаты. Был флакон Ñ Ð¶Ð¸Ð´ÐºÐ¸Ð¼ Этериумом, которого Ñ Ð½Ðµ трогал целую вечноÑÑ‚ÑŒ (Ñ Ñ…Ð¾Ñ‚ÐµÐ» вернутьÑÑ Ðº Ñтому, но у Ð¼ÐµÐ½Ñ Ð½Ðµ было времени), а также хруÑтальный шар, который, казалоÑÑŒ, вÑегда говорил «вторник», когда вы вглÑделÑÑ Ð² Ñтекло. Когда одна из коробок Ñ Ð½Ð°Ð´Ð¿Ð¸Ñью «РуничеÑÐºÐ°Ñ Ð¿Ñ‹Ð»ÑŒÂ» была опрокинута на маленькую краÑную жемчужину, она упала на ногу ТибериÑ. Сразу же от него иÑходил Ñркий рубиновый Ñвет, который реагировал Ñ Ð¿Ñ‹Ð»ÑŒÑŽ в коробке, которую он неÑ.\n\tЕÑтеÑтвенно, произошел взрыв. ÐеÑфокуÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÑнергиÑ, которую Тиберий непреднамеренно выÑвободил через драгоценный камень, зажгла руничеÑкую пыль и камни вокруг него, и без ÑредÑтв ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñилы ее проÑто вытолкнули наружу. ПоÑле неÑкольких дней в медицинÑком отделении мы Ñ Ð¢Ð¸Ð±ÐµÑ€Ð¸ÐµÐ¼ приÑтупили к работе.\n\tÐ‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñочетанию неÑкольких беÑÑонных ночей и крепкой порции кофеина (Ñ Ð´ÐµÐ¹Ñтвительно должен поблагодарить МиÑтера Плейера за поÑтавку кофе, Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвую ваши уÑÐ¸Ð»Ð¸Ñ Ð¿Ð¾ более бодрÑтвующему завтра!), Ð’ итоге мы уÑовершенÑтвовали ключевые ингредиенты Ð´Ð»Ñ Ð²Ñех ритуалов.\n\tÐ’ результате наших ÑкÑпериментов мы узнали, что нам нужны четыре разные вещи: нам нужна куча ритуальных камней, помещенных вокруг облаÑти по заданному шаблону, неÑколько разных чернил, которые наноÑÑÑ‚ÑÑ Ð½Ð° ритуальные камни, чтобы помочь в дальнейшем определить образец, центральный ритуал камень, который дейÑтвует как центральный канал влаÑти, и криÑталл, который активирует ритуал. Я думаю, что лучше поговорить об Ñтом один за другим. -guide.bloodmagic.entry.ritual.ritualStone.info.1=Ритуальный Камень дейÑтвует как проÑÑ‚Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ Ð´Ð»Ñ Ð¼Ð°Ð³Ð¸Ñ‡ÐµÑкой Ñнергии, формирует ее и дополнительно перенаправлÑет по-разному в завиÑимоÑти от конфигурации камнÑ. Когда вы начинаете, еÑÑ‚ÑŒ пÑÑ‚ÑŒ различных камней, к которым у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп: ПуÑтой (базовый камень, на который не нанеÑена маркировка), Вода, Огонь, Воздух и ЗемлÑ. Каждый ритуал будет иметь неÑколько из них, и в завиÑимоÑти от того, как они раÑположены вокруг МаÑтерÑкого ритуального камнÑ, общий Ñффект будет разным. -guide.bloodmagic.entry.ritual.ritualStone.info.2=Чтобы впиÑать правильные Ñимволы в ритуальные камни, у Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть набор инÑтрументов Ð´Ð»Ñ Ð½Ð°Ð´Ð¿Ð¸Ñи. С тех пор Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð» метод, позволÑющий людÑм легче наноÑить правильные чернила на ритуальные камни, Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð¸Ñ… в правильную конфигурацию, но еÑли кто-то захочет Ñделать Ñто вручную, они могут иÑпользовать Ñти инÑтрументы. Когда вы активируете ритуальный камень Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ одного из инÑтрументов Ð´Ð»Ñ Ð½Ð°Ð´Ð¿Ð¸Ñи в руке (щелкнув правой кнопкой мыши по камню), вы нанеÑете немного чернил на камень, изменив его на тот же тип, что и инÑтрумент. Ðа ранних уровнÑÑ… у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп только к четырем базовым цветам, однако, как только вы Ñтанете более могущеÑтвенным, в вашем раÑпорÑжении будет больше инÑтрументов. -guide.bloodmagic.entry.ritual.masterRitualStone.info=Как и в Ñлучае большинÑтва магии, без направлÑющей Ñилы Ñффект ритуала либо Ñтанет неуправлÑемым, либо проÑто не будет работать вообще. Таким образом, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы контролировать ритуалы, требуетÑÑ ÐœÐ°ÑтерÑкий ритуальный камень (Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ Ñокращаю Ñто до «MRS» в Ñвоих заметках, но говорить Ñто публично немного неловко. «Мне нужно больше миÑÑиÑ, пожалуйÑта!»). MRS получает влаÑÑ‚ÑŒ от Сети Души владельца и проталкивает ее через ритуальные камни, таким образом выполнÑÑ Ñ€Ð¸Ñ‚ÑƒÐ°Ð». \n\tПриÑоединение Сети Души к большому камню, который мы не держим в руках, оказалоÑÑŒ немного Ñложным. Мне удалоÑÑŒ Ñделать Ñто один раз, Ð¼ÐµÐ´Ð¸Ñ‚Ð¸Ñ€ÑƒÑ Ð½Ð° вершине ÐºÐ°Ð¼Ð½Ñ Ð² позе лотоÑа, ÑоÑÑ€ÐµÐ´Ð¾Ñ‚Ð°Ñ‡Ð¸Ð²Ð°Ñ Ñвою Ñилу через камень и пытаÑÑÑŒ ÑвÑзать уÑики моей Ñети Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ работой ритуала. Ð¥Ð¾Ñ‚Ñ Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð» неÑколько минут, вÑе, что Ñ Ð±Ñ‹Ð» дейÑтвительно награжден, - Ñто пара мокрых штанов, когда вода ринулаÑÑŒ на ритуальные камни. Я научилÑÑ Ð½Ðµ медитировать ни на одном из моих ÑкÑпериментов Ñнова. -guide.bloodmagic.entry.ritual.activationCrystal.info.1=ВмеÑто того чтобы ждать Ñ‡Ð°Ñ Ð·Ð° тем, чтобы медитировать ритуальный актив, мы взÑли краÑный драгоценный камень, который изначально выпал из коробки, и начали его анализировать. Тиберий был уверен, что у него была ÑпоÑобноÑÑ‚ÑŒ «уÑтановить ÑвÑзи между телеÑным царÑтвом нашей реальноÑти и беÑтелеÑной ÑущноÑтью, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ñвленной Сетью Души». Иногда Ñ Ð·Ð°Ð´Ð°ÑŽÑÑŒ вопроÑом, было ли хорошей идеей, чтобы он Ñтал моим учеником, но в такие времена Ñ Ð²Ð¸Ð¶Ñƒ его ловкоÑÑ‚ÑŒ в более загадочных аÑпектах магии. О, Ñ, наверное, должен напиÑать, что он имел в виду на английÑком: иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот криÑталл, мы могли бы ÑвÑзать наши Ñети душ Ñ ÐšÐ°Ð¼Ð½ÐµÐ¼ МаÑтера Ритуала, чтобы Ñнабдить его Ñнергией. -guide.bloodmagic.entry.ritual.activationCrystal.info.2=Таким образом, мы получили Ñлабый активационный криÑталл и ÑредÑтво Ð´Ð»Ñ Ð²Ð¾ÑÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ Ñтруктуры. ОÑновным компонентом криÑталла ÑвлÑетÑÑ ÐµÑ‰Ðµ один криÑталл, который может быть ÑвÑзан Ñ Ð¼Ð¾ÐµÐ¹ Ñетью душ: криÑталл лавы. Затем, быÑтро впиÑав некоторые инÑтрукции на поверхноÑÑ‚ÑŒ криÑталла, Ðлтарь Крови может выполнить оÑтавшуюÑÑ Ñ‡Ð°ÑÑ‚ÑŒ работы по превращению его в активационный криÑталл. ЕÑтеÑтвенно, Ñтот криÑталл должен быть ÑвÑзан Ñ Ð´ÑƒÑˆÐµÐ²Ð½Ð¾Ð¹ Ñетью пользователÑ, чтобы функционировать. Когда камни ритуала правильно уложены вокруг MRS, пользователь должен прикоÑнутьÑÑ Ðº криÑталлу активации к MRS и вытолкнуть доÑтаточно Ñнергии, чтобы начать Ñтот ритуал. ЕÑли у Ð²Ð°Ñ Ð´Ð¾Ñтаточно LP внутри вашей Soul Network, ритуал активируетÑÑ. ЕÑли вы Ñтого не Ñделаете, или еÑли камни не выложены правильно, ритуал проÑто не будет активирован, и никаких затрат на LP не будет. -guide.bloodmagic.entry.ritual.diviner.info.1=Изучив размер и раÑположение многих ритуалов, Ñ Ð½Ð°Ñ‡Ð°Ð» находить, что немного Ñкучно поÑтоÑнно проÑматривать Ñвои запиÑи, чтобы ÑоÑтавить ритуалы. Вот почему Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð» над Ñозданием уÑтройÑтва, которое позволÑло бы кому-либо проÑто помеÑтить камни в правильное положение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ проÑÑ‚Ñ‹Ñ… жеÑтов и движений. Я размеÑтил Ñту запиÑÑŒ дальше в хронологичеÑком порÑдке, потому что людÑм лучше вÑего изучить Ñтот предмет, прежде чем начинать Ñ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑкого поÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð¾Ð². Ð’ противном Ñлучае они могут узнать, что у них нет вÑего, что им нужно, или вызовут метеор из ада вмеÑто Ñвежей бутылки родниковой воды. -guide.bloodmagic.entry.ritual.diviner.info.2=Ritual Diviner - Ñто ÑÐ½Ñ†Ð¸ÐºÐ»Ð¾Ð¿ÐµÐ´Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð¾Ð². ÐŸÐµÑ€ÐµÐ±Ð¸Ñ€Ð°Ñ Ð¿Ñ€Ð¾Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒ (щелчок левой кнопкой мыши и щелчок правой кнопкой мыши), вы можете выбрать другой ритуал из хранилища знаний. ВзглÑд на Ð¿Ñ€Ð¾Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»Ñ Ñ‚Ð°ÐºÐ¶Ðµ раÑÑкажет вам проÑтую информацию о ритуале. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ ритуальные камни на вашем лице, и вы каÑаетеÑÑŒ предÑÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° MRS (щелчок правой кнопкой мыши), вы можете помеÑтить камень Ð´Ð»Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°, который вы хотите поÑтроить. Ð”ÐµÐ»Ð°Ñ Ñто доÑтаточно раз, вы получите завершенный ритуал! -guide.bloodmagic.entry.ritual.fullSpring.info=ÐеÑколько лет назад торговец оÑтановилÑÑ Ð²Ð¾Ð·Ð»Ðµ деревни возле моего дома, Ð¿Ñ€Ð¾Ð´Ð°Ð²Ð°Ñ Ñвои товары вÑем, кто хотел раÑÑтатьÑÑ Ñо Ñвоей монетой. Ð’ то Ð²Ñ€ÐµÐ¼Ñ Ð±Ñ‹Ð»Ð° заÑуха, и поÑевы умирали, поÑтому торговец Ð¿Ñ€Ð¸Ð½ÐµÑ ÑеребрÑный талиÑман Ñ Ð³Ð¾Ð»ÑƒÐ±Ñ‹Ð¼ камнем внутри. «Это, Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¼Ð¾Ð¸, - Ñказал он Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ уÑердием, - позаботитÑÑ Ð¾ том, чтобы ваши реки не выÑохли! ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð°Ð»Ñ…Ð¸Ð¼Ð¸ÑŽ, Ñ Ð¼Ð¾Ð³Ñƒ вывеÑти воду из Ñамого воздуха!»\n\tК неÑчаÑтью Ð´Ð»Ñ Ð´ÐµÑ€ÐµÐ²Ð½Ð¸, казалоÑÑŒ, что Ñтот драгоценный камень был проÑтым куÑочком Ñапфира, и, прежде чем кто-то понÑл, что их обманули, он уже был в неÑкольких милÑÑ… отÑюда. Я Ñклонен не вмешиватьÑÑ Ð² дела деревни, потому что им не нравитÑÑ Ð¼Ð¾Ñ Ð¼Ð°Ð³Ð¸Ñ, но в Ñтом Ñлучае Ñ Ñделал иÑключение. ПоÑле того, как Ñ Ð¼Ð¸Ð»Ð¾ поболтал Ñ Â«Ð°Ð»Ñ…Ð¸Ð¼Ð¸ÐºÐ¾Ð¼Â», Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ» неÑколько чаÑов, размышлÑÑ Ð²Ð¾Ð·Ð»Ðµ ирригационных каналов. КонденÑировав водÑной пар в воздухе, мне удалоÑÑŒ Ñоздать доÑтаточно воды, чтобы поливать урожай до Ñледующего падениÑ. Это был не ÑовÑем Ñффективный метод, и в течение Ñледующих неÑкольких дней Ð¼ÐµÐ½Ñ Ð¸Ñтощали, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ‡Ð°ÑÑ‚ÑŒ воды из канала Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ð´Ñ€Ð°Ñ‚Ð°Ñ†Ð¸Ð¸.\n\tÐŸÐ¾Ð¼Ð½Ñ Ð¾Ð± Ñтом, Ñ Ð¸Ñпользовал те же принципы Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð Ð¸Ñ‚ÑƒÐ°Ð»Ð° Полной ВеÑны. ÐаправлÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¾Ðµ количеÑтво Ñнергии в ритуал, он конденÑирует влагу в воздухе вокруг него, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¸Ñточник воды поверх оÑновного ритуального камнÑ. СтоимоÑÑ‚ÑŒ активации ритуала довольно незначительна, а обÑлуживание тем более. \n\tДиапазон воды может быть раÑширен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ритуальной повозки и даже помещен в другое меÑто, поÑтому вам не нужно беÑпокоитьÑÑ Ð¾ том, где находитÑÑ Ñ€Ð¸Ñ‚ÑƒÐ°Ð», еÑли они беÑпокоÑÑ‚ÑÑ Ð¾Ð± ÑÑтетике. ЧудеÑа магии! -guide.bloodmagic.entry.ritual.lava.info=Лава, пожалуй, один из Ñамых Ñлементарных иÑточников Ñнергии. Я не очень чаÑто иÑпользую его в Ñвоих ÑобÑтвенных иÑÑледованиÑÑ…, потому что Ñ Ð½Ð¸Ð¼ может быть немного Ñложно работать - Ñто не то, что вы можете иÑпользовать проÑтое железное ведро, чтобы взÑÑ‚ÑŒ его! \n\tОдин один из меÑтных тинкеров пришел ко мне домой однажды и ÑпроÑил, еÑÑ‚ÑŒ ли поблизоÑти какие-нибудь иÑточники, поÑкольку недавно они приобрели какое-то новое оборудование, необходимое Ð´Ð»Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ. Я Ñказал, что их было неÑколько, но большинÑтво из них уже были в ÑобÑтвенноÑти, но Ñ Ñ€ÐµÑˆÐ¸Ð» приехать к нему, чтобы оÑмотреть уÑтройÑтво. \n\t Это был плавильный завод выÑотой не менее 5 метров и такой же ширины, подключенный к неÑкольким танки, которые ÑтоÑли пуÑтыми и беÑплодными. Ð¥Ð¾Ñ‚Ñ Ñ Ð½Ðµ был полноÑтью уверен в том, как он работает, Ñ Ð¼Ð¾Ð³ Ñказать, что Ð´Ð»Ñ Ñтого идеально подойдет Ñырое тепло лавы - ÑлектричеÑтво будет работать хорошо, еÑли его правильно модифицировать, но Ñ Ð¼Ð¾Ð³ Ñказать, что Ñто не от Immersive Industries. \n\tПоÑле небольшого разговора Ñ Ñ‚Ð¸Ð½ÐºÐµÑ€Ð¾Ð¼ деньги перешли к другому, и Ñ Ð¿Ð¾Ð¿Ñ€Ð¾Ñил его отойти в Ñторону, пока Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð¸Ð» Ñвои ритуальные камни. Чтобы иÑполнить то, что Ñ Ñ…Ð¾Ñ‚ÐµÐ», Ñ Ð²Ð·Ñл четыре огненных ÐºÐ°Ð¼Ð½Ñ Ð¸ раÑположил их в креÑте вокруг оÑновного ритуального камнÑ, а затем Ñильно толкнул Ñвоим криÑталлом активации, Ð²Ð¾Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ð² Ñвоей голове. ТеоретичеÑки Ñто должно быть проÑто: взÑÑ‚ÑŒ неÑколько камней из глубины земли и Ñжать их Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ Ñнергией, заÑтавлÑÑ Ð¸Ñ… плавитьÑÑ Ð¿Ð¾Ð´ Ñильным давлением и превращатьÑÑ Ð² раÑплавленный. Эту лаву можно было бы извлечь из ритуального камнÑ, и Ñтот процеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ повторить. Ð¥Ð¾Ñ‚Ñ Ñ‚ÐµÐ¾Ñ€ÐµÑ‚Ð¸Ñ‡ÐµÑки Ñто было проÑто, на практике Ñто было немного Ñложно. Ð”Ð»Ñ Ð¼Ð¾ÐµÐ¹ проÑтой Ñети в то Ð²Ñ€ÐµÐ¼Ñ ÑтоимоÑÑ‚ÑŒ активации была довольно выÑокой из-за первоначального требуемого давлениÑ, и Ñ Ð½Ðµ был готов к Ñтоку каждого иÑточника лавы. (20000 LP, чтобы активировать, 500 LP за иÑходный блок) \n\tЯ вышел из Ð·Ð´Ð°Ð½Ð¸Ñ Ñ ÑƒÑмешкой на моем лице, однако: танки были полны лавы, Ñтого доÑтаточно, чтобы держать тинкера в бизнеÑе на пару недель, пока он может обеÑпечить более поÑтоÑнный иÑточник лавы. Я вÑе же Ñобрал Ñвои ритуальные камни поÑле того, как закончил. \n\t ---------- \n\tБез изменений в ритуале, ритуал будет пытатьÑÑ Ð¿Ð¾Ð¼ÐµÑтить иÑточник лавы в блок непоÑредÑтвенно над Ñобой по цене 500 LP за каждый тик, еÑли еÑÑ‚ÑŒ Ñто меÑто, вытеÑнÑющее жидкоÑти, еÑли они текут. Этот диапазон Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию может быть раÑширен до 9 блоков на макÑимальном раÑÑтоÑнии 3 от ритуала. \n\tПри раÑширении ритуала Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Raw Will ÑтоимоÑÑ‚ÑŒ LP будет уменьшатьÑÑ Ð¿Ñ€Ð¾Ð¿Ð¾Ñ€Ñ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ воле, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ð² ауре, поглощающей волю, пропорционально количеÑтву Ñохраненного LP. ИÑпользование Ñтой воли может также предоÑтавить возможноÑÑ‚ÑŒ помещать лаву непоÑредÑтвенно во внутренние резервуары блока Ñо ÑкороÑтью, Ñравнимой Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼Ð¸ ритуальными операциÑми. \n\tCorrosive Will заÑтавлÑет ритуал инвертировать непобедимоÑÑ‚ÑŒ, обеÑпечиваемую иммунитетом к огню, в результате чего вÑе ÑущноÑти, обладающие иммунитетом ÑтрелÑÑ‚ÑŒ в пределах заданной облаÑти, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ Ñерьезно повреждена в завиÑимоÑти от количеÑтва Воли в Ðуре. Те, кто не невоÑприимчив к огню, не поÑтрадают от Ñтого Ñффекта. \n\tПри мÑтительном желании, примененном к ритуалу, выделÑетÑÑ Ð»ÐµÑ‚ÑƒÑ‡Ð¸Ð¹ газ, из-за которого Огненный предохранитель воздейÑтвует на вÑех неигровых ÑущноÑтей в пределах указанного диапазона. Когда таймер дебаффа ÑтановитÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ 0, ÑущноÑÑ‚ÑŒ взорветÑÑ, Ñилой взорвав их в воздух Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ взрывной Ñилы. \n\tDestructive Will увеличивает макÑимальную дальноÑÑ‚ÑŒ и объем, на которые может влиÑÑ‚ÑŒ ритуал. Чем больше у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚, тем больше лавовых блоков можно размеÑтить за один ритуал. К ÑчаÑтью, ритуал не иÑтощает никакой Разрушительной Воли, однако, еÑли ваша Ð’Ð¾Ð»Ñ Ð¿Ð°Ð´Ð°ÐµÑ‚ и макÑимальный диапазон ритуала ниже того, на котором вы его уÑтановили, ритуал не будет работать вообще до тех пор, пока не будет иÑправлен. \n\tÐаконец, Steadfast Will предоÑтавит вÑем игрокам в пределах его диапазона бафф огнеÑтойкоÑти, Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ ÑтоимоÑÑ‚ÑŒ которого в Воли завиÑÑÑ‚ от количеÑтва Воли в Ðуре. Ðеобходимо Ñоблюдать оÑторожноÑÑ‚ÑŒ, потому что еÑли вы подвержены воздейÑтвию огнеÑтойкоÑти, вы можете быть повреждены Ñффектом ритуала. -guide.bloodmagic.entry.ritual.greenGrove.info=Ðа прошлой неделе Ñ Ð½Ð°Ñ‡Ð°Ð» учить Ð¢Ð¸Ð±ÐµÑ€Ð¸Ñ Ñвоей междиÑциплинарной магии. Каждый мой ученик должен был изучать другую форму магии, Ð¸Ð·ÑƒÑ‡Ð°Ñ Ð¼Ð°Ð³Ð¸ÑŽ крови. Ðеважно, какой из них они выберут, пока он не потреблÑет какую-то форму ограниченного реÑурÑа - Ñ Ð¸Ñпользовал магию из клана ÐÑ€Ñ Ñ Ð”Ð°Ð»ÑŒÐ½ÐµÐ³Ð¾ ВоÑтока, но так как мировой иÑточник Ð­Ñ‚ÐµÑ€Ð¸Ñ Ð±Ñ‹Ð» поглощен в дефицит Ñто вымерло давно. \n\tТиберий решил изучить Тауматургию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ñпользует магию мира, чтобы выполнить Ñвою магию. Это хороший Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ð²ÐµÑ Ð¼Ð°Ð³Ð¸Ð¸ крови, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ñпользует магию жизни. Таким образом, Ñти магичеÑкие ÑредÑтва иÑпользуют разные ÑредÑтва Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¸Ñ… и тех же задач. Чтобы продемонÑтрировать, Ñ Ñ€ÐµÑˆÐ¸Ð» выделить Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ñ Ð¢Ð¸Ð±ÐµÑ€Ð¸ÑƒÑом, когда речь заходит о роÑте урожаÑ. \n\t "Ð¢Ð°ÑƒÐ¼Ð°Ñ‚ÑƒÑ€Ð³Ð¸Ñ Ð¸Ñпользует катализатор роÑта, который питаетÑÑ Ð¾Ñ‚ ÐÑпекты Herba", - заÑвлÑÑŽ Ñ, ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ Ð½Ð° блок-Ñхему Essentia, прикрепленную к клаÑÑной комнате. Ñтены. Конечно, Тиберий Ñидел за единÑтвенным Ñтолом там, но иногда парню нужно повеÑелитьÑÑ. «ÐÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ñтруйка ауры и Ñтой ÑÑÑенции Ñтимулирует процеÑÑ Ñ„Ð¾Ñ‚Ð¾Ñинтеза раÑтениÑ, Ð¿Ð¾Ð±ÑƒÐ¶Ð´Ð°Ñ ÐµÐ³Ð¾ раÑти, Ð´Ð°Ð²Ð°Ñ ÐµÐ¼Ñƒ больше Ñолнечной Ñнергии. Этот процеÑÑ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚, чтобы почва была хорошо удобрена, иначе урожай может проÑто заÑохнуть и умереть». \ Затем Ñ Ð±ÐµÑ€Ñƒ четыре ритуальных ÐºÐ°Ð¼Ð½Ñ Ð·ÐµÐ¼Ð»Ð¸ и воды и помещаю их в круг вокруг оÑновного ритуального камнÑ. «И наоборот, Blood Magic иÑпользует другой процеÑÑ». Во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð·Ð³Ð¾Ð²Ð¾Ñ€Ð° Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€ÑƒÑŽ ритуал и покрываю его проÑтой грÑзью. «ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñвою жизненную Ñилу или Ñнергию животных, вы можете удобрÑÑ‚ÑŒ раÑÑ‚ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ð¼ образом, чтобы они не нуждалиÑÑŒ в таком большом количеÑтве удобрений. По Ñути, они наÑильÑтвенно кормÑÑ‚ раÑтениÑ, чтобы они вÑегда имели выÑокую концентрацию питательных вещеÑтв». . "\n\tЯ броÑаю неÑколько ÑемÑн в грÑзь и Ñлегка прикрываю их, Ð¾Ñ‚ÐºÑƒÐ¿Ð¾Ñ€Ð¸Ð²Ð°Ñ Ð¸ опорожнÑÑ Ñ„Ð»Ð°ÐºÐ¾Ð½ Ñ Ð²Ð¾Ð´Ð¾Ð¹ из моей мантии. «Этот процеÑÑ Ð½Ðµ нуждаетÑÑ Ð² дополнительном Ñолнечном Ñвете, потому что он иÑпользует другой иÑточник Ñнергии. Ð¥Ð¾Ñ‚Ñ Ð¾Ð½ работает намного лучше, когда еÑÑ‚ÑŒ немного Ñвета - раÑтение точно не привыкло к такого рода уÑловиÑм!» \n\tA неÑколько побегов уже выÑунули Ñвои лиÑÑ‚ÑŒÑ Ð¸Ð· грÑзи, пока Ñ Ð¾Ð±ÑŠÑÑнÑл, по-видимому, Ð¼Ð°Ñ…Ð°Ñ Ð² ответ. Я чувÑтвовал легкую нагрузку на Ñвое тело, когда каждый новый лиÑÑ‚ прораÑтал, каждый раз незначительный, но при накоплении он начинал ÑкладыватьÑÑ. Закончив урок, Ñ Ð¾Ñ‡Ð¸Ñтил ÑкÑперимент от грÑзи и решил прогулÑÑ‚ÑŒÑÑ Ð´Ð¾ деревни: у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð» бушель пшеницы, который нужно было продать. \n\t ---------- \n\tРитуал Зеленой рощи, как Ñледует из названиÑ, уÑкорÑет темпы роÑта находÑщихÑÑ Ð¿Ð¾Ð±Ð»Ð¸Ð·Ð¾Ñти раÑтений. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÑ€Ð¾Ð²ÑŒ игрока в качеÑтве богатого удобрениÑ, он будет пытатьÑÑ Ð²Ñ‹Ñ€Ð°Ñтить вÑе, что он Ñчитает раÑтением, например, пшеницу и морковь, периодичеÑки Ð²Ñ‹Ñ€Ð°Ñ‰Ð¸Ð²Ð°Ñ Ñ‡Ñ‚Ð¾-либо в пределах Ñвоего диапазона. С помощью операций по умолчанию ритуал будет Ñмотреть на облаÑÑ‚ÑŒ 3Ñ…3 на два блока выше ÑÐµÐ±Ñ Ð¸ пытатьÑÑ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ‚ÑŒ каждый блок Ñ Ð²ÐµÑ€Ð¾ÑтноÑтью уÑпеха 30 %% каждую Ñекунду. При манипулировании Ñ Ritual Tinkerer, ритуал может обрабатывать макÑимум 81 урожай за один раз в радиуÑе 5 блоков от MRS. Как еще одно примечание \n\t, когда оно дополнено волей демонов, еÑÑ‚ÑŒ неÑколько Ñффектов, которые можно получить. ЕÑли иÑпользуетÑÑ ÐÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð’Ð¾Ð»Ñ, ритуал будет выполнÑÑ‚ÑŒ вÑе операции Ñ ÑƒÑкоренной ÑкороÑтью, потреблÑÑ 0,05 Воли за каждый уÑпешный роÑÑ‚ и ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ Ñвою ÑкороÑÑ‚ÑŒ отноÑительно количеÑтва Воли в Ðуре. \n\tЕÑли вливаетÑÑ Ð² ÐœÑтительную Волю, ритуал будет поглощать 0.05 Ð’Ð¾Ð»Ñ Ð·Ð° уÑпешный роÑÑ‚ и увеличит вероÑтноÑÑ‚ÑŒ того, что данный рабочий тик будет уÑпешным на заводе. По умолчанию без Воли Ñто ÑоÑтавлÑет 30 %%, но, например, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ 100 ÐœÑтительного ВолÑ, показатель увеличитÑÑ Ð´Ð¾ 80 %%. \n\tDestructive Ð’Ð¾Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ макÑимальный Ñффективный диапазон ритуала, то еÑÑ‚ÑŒ чем больше у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚, тем больше культур / раÑтений, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ может ÑправитьÑÑ Ð¾Ð´Ð¸Ð½ ритуал. К ÑчаÑтью, ритуал не иÑтощает никакой разрушительной воли, однако, еÑли ваша Ð²Ð¾Ð»Ñ Ð¿Ð°Ð´Ð°ÐµÑ‚ и макÑимальный диапазон ритуала ниже того, на котором вы его уÑтановили, ритуал не будет работать вообще до тех пор, пока не будет иÑправлен. \n\tSteadfast ПредоÑтавит возможноÑÑ‚ÑŒ уÑтановить облаÑÑ‚ÑŒ вокруг ритуала, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ автоматичеÑки обрабатыватьÑÑ Ð¸ увлажнÑÑ‚ÑŒÑÑ. Кроме того, любое ÑемÑ, которое находитÑÑ Ð² Ñтом диапазоне, будет поÑеÑно в ÑоÑеднем блоке, еÑли Ñто возможно. Это Ñтоит небольшого количеÑтва УÑтойчивой Воли, и ее Ñффекты не маÑштабируютÑÑ Ñ Ð’Ð¾Ð»Ð¸ в Ðуре. \n\t Когда ÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð¹Ð½Ð°Ñ Ð’Ð¾Ð»Ñ Ð¸ÑпользуетÑÑ Ð² ритуале, Ñ„ÑƒÐ½Ð´Ð°Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ñ€Ð¾Ð´Ð° ритуала может изменитьÑÑ. При поÑтавке и правильной наÑтройке нового диапазона на вÑех мобов, попадающих в зону влиÑÐ½Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°, будет применÑÑ‚ÑŒÑÑ Ñффект «ПиÑвка». Каждые неÑколько тиков раÑÑ‚ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð»Ðµ мобов будут повреждены, а моб будет поврежден пропорционально. Оплодотворение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мобов может оказатьÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ‹Ð¼! Каждые 10 Ñекунд Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´ÐµÐ±Ð°Ñ„Ñ„Ð° на моба будет поглощатьÑÑ 0,2 ед. -guide.bloodmagic.entry.ritual.magnetism.info=Ритуал магнетизма хлеб Ñ Ð¼Ð°Ñлом, кто пользуетÑÑ ÐºÐ°Ñ€ÑŒÐµÑ€Ð°Ð¼Ð¸. Ритуал Ñоздает вращающееÑÑ Ð¼Ð°Ð³Ð½Ð¸Ñ‚Ð½Ð¾Ðµ поле, подтÑгивание богатые руды Ñ Ð·ÐµÐ¼Ð»Ð¸ под ним и размещением Ñодержимого в Ñвоей облаÑти. Это не вытеÑнÑет какой-либо камень, так что никакие зиÑющие отверÑÑ‚Ð¸Ñ Ð½Ðµ будут поÑвлÑÑ‚ÑŒÑÑ Ð½Ð° земле - при уÑловии, что Ð·ÐµÐ¼Ð»Ñ Ð½Ðµ полноÑтью ÑоÑтоит из ротовой полоÑти. Ритуал дейÑтвует один раз каждые 40 тиков и раÑходы 50LP через уÑпешную операцию.\n\tÐ Ð°Ð´Ð¸ÑƒÑ Ð¿Ð¾ умолчанию, которым управлÑет Ñтот ритуал, ÑоÑтавлÑет 3 блока в каждом кардинальном направлении, Ð´Ð°Ð²Ð°Ñ Ð¿Ð»Ð¾Ñ‰Ð°Ð´ÑŒ 7x7 блоков Ñ Ñ†ÐµÐ½Ñ‚Ñ€Ð¾Ð¼ в MRS. ПоÑкольку у ритуала в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÑ‚ никаких дополнений к Воли, вы можете только увеличить Ñ€Ð°Ð´Ð¸ÑƒÑ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°, помеÑтив ценный блок непоÑредÑтвенно под MRS. ЕÑли иÑпользуетÑÑ Ð¶ÐµÐ»ÐµÐ·Ð½Ñ‹Ð¹ блок, Ñ€Ð°Ð´Ð¸ÑƒÑ ÑтановитÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ 7. ЕÑли иÑпользуетÑÑ Ð·Ð¾Ð»Ð¾Ñ‚Ð¾Ð¹ блок, Ñ€Ð°Ð´Ð¸ÑƒÑ ÑтановитÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ 15. Ðаконец, еÑли иÑпользуетÑÑ Ð°Ð»Ð¼Ð°Ð·Ð½Ñ‹Ð¹ блок, Ñ€Ð°Ð´Ð¸ÑƒÑ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ð´Ð¾ 31, что означает, что Ð»ÑŽÐ±Ð°Ñ Ñ€ÑƒÐ´Ð° ниже ритуала в облаÑти 63x63 будет медленно подтÑнулÑÑ Ðº Ñвоему объему 3x3x3 выше MRS. -guide.bloodmagic.entry.ritual.crusher.info=Ритуал дейÑÑ‚Ð²Ð¸Ñ Ð´Ñ€Ð¾Ð±Ð¸Ð»ÐºÐ¸ довольно проÑÑ‚. Ритуал должен иметь какую-то форму инвентарÑ, ÑвÑзанную Ñ Ð½Ð¸Ð¼, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð² неизмененном виде проÑто раÑполагаетÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… MRS. Во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ритуал будет Ñмотреть в пределах Ñвоего диапазона Ð´Ñ€Ð¾Ð±Ð»ÐµÐ½Ð¸Ñ (по умолчанию облаÑÑ‚ÑŒ 3x3x3 ниже ритуала) и разбивать по одному блоку за раз Ñо ÑкороÑтью один раз каждые 2 Ñекунды за Ñчет 7 LP за уÑпешную операцию. Затем разбитые блоки будут перенеÑены в ÑвÑзанный инвентарь - еÑли нет меÑта Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð², они вмеÑто Ñтого будут извергатьÑÑ Ñверху Ñундука.\n\tПри заправке Ñырой волей ритуал будет работать быÑтрее, в завиÑимоÑти от общего количеÑтва воли в ауре. При уÑкорении он будет потреблÑÑ‚ÑŒ 0,05 необработанной воли за каждую уÑпешную операцию.\n\tÐ Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ к тому, что блоки, разбитые ритуалом, применÑÑŽÑ‚ к нему Фортуну. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑоÑтоÑÐ½Ð¸Ñ Ð½Ðµ менÑетÑÑ Ð¸ ÑоÑтавлÑет 3 ÑƒÑ€Ð¾Ð²Ð½Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо от количеÑтва Воли. Это будет потреблÑÑ‚ÑŒ 0,2 Воли за уÑпешную операцию, незавиÑимо от того, была ли она полезной.\n\tВмеÑто Ñтого, Steadfast Will будет разрушать блоки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñффекта Silk Touch. Это будет Ñтоить 0,02 Воли за операцию, и будет перекрывать Ñффект РазрушениÑ, где Ñто возможно.\n\tÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð¹Ð½Ð°Ñ Ð²Ð¾Ð»Ñ Ð´ÐµÐ»Ð°ÐµÑ‚ так, чтобы блоки, разбитые ритуалом, обрабатывалиÑÑŒ какой-либо формой Ñмазочно-охлаждающей жидкоÑти. Это означает, что, например, еÑли Ñто железный блок, результатом будет два куÑка железного пеÑка. Текущие «Ñмазочно-охлаждающие жидкоÑти», которые иÑпользуютÑÑ Ð² ритуале: Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñмазочно-Ð¾Ñ…Ð»Ð°Ð¶Ð´Ð°ÑŽÑ‰Ð°Ñ Ð¶Ð¸Ð´ÐºÐ¾ÑÑ‚ÑŒ и взрывчатый порошок. Ритуал потреблÑет различное количеÑтво Воли в завиÑимоÑти от того, что было иÑпользовано, и будет потреблÑÑ‚ÑŒ Волю только в том Ñлучае, еÑли применÑетÑÑ Ñффект. Это отменÑет Silk Touch, где Ñто применимо.\n\tÐœÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ к тому, что при уÑпешной операции инвентарь Ñжимает Ñодержимое, аналогично Ñимволу ÑжатиÑ: еÑли внутри Ñундука 65 пыль краÑного камнÑ, то будет Ñоздан один блок краÑного ÐºÐ°Ð¼Ð½Ñ Ð¸ оÑтанетÑÑ 56 пыли. Ð’Ð¾Ð»Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ тогда, когда Ñто уÑпешно, и Ñтоит 0,2 воли. -guide.bloodmagic.entry.ritual.highJump.info=Этот ритуал иÑпользует огромный взрыв воздуха, чтобы поднÑÑ‚ÑŒ вÑех тех, кто идет по нему, в небо. Более того, еÑли пользователь приземлитÑÑ Ð² зоне дейÑÑ‚Ð²Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°, он не получит никакого урона от падениÑ. Игроки, которые крадутÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Ñтого ритуала, также не затрагиваютÑÑ.\n\tРитуал Ñтоит 5LP за единицу за такт уÑпешной операции, поÑтому ничего не будет Ñтоить, еÑли он не броÑит людей в воздух. -guide.bloodmagic.entry.ritual.speed.info=Как Ñледует из названиÑ, Ритуал СкороÑти иÑпользуетÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпортировки различных видов. Ритуал может быть размещен в направлении любого из оÑновных направлений, и любые объекты в пределах его диапазона будут запущены в направлении, указанном ритуалом. При взглÑде на ритуал, Ñто направление, где находитÑÑ Ñумеречный ритуал. По умолчанию ритуал имеет Ñ€Ð°Ð´Ð¸ÑƒÑ 2 блока от MRS, Ñ…Ð¾Ñ‚Ñ ÐµÐ³Ð¾ можно раÑширить или Ñократить при иÑпользовании ритуала. Это будет применÑÑ‚ÑŒ ÑкороÑÑ‚ÑŒ 3 блока / тик в направлении ритуала и 1,2 блока / тик по вертикали.\n\tЕÑли ритуал заправлен Сырой Волей, ÑкороÑÑ‚ÑŒ ритуала ÑущеÑтвенно увеличиваетÑÑ Ð½Ð° оÑнове Воли, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² Ðуре. Ðапример, ÑкороÑÑ‚ÑŒ будет удвоена, еÑли внутри Ðуры будет 100 Воли. Ðа каждую уÑпешную операцию раÑходуетÑÑ 0,1 Воли.\n\tÐœÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ñ Ð½Ðµ позволÑет ритуалу перемещать взроÑлых мобов, а ДеÑÑ‚Ñ€ÑƒÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð²Ð¾Ð»Ñ Ð½Ðµ дает ритуалу перемещать детÑких мобов. ЕÑли один из них иÑпользуетÑÑ, игрокам также запрещаетÑÑ Ð¸Ñпользовать ритуал. Однако, еÑли они оба иÑпользуютÑÑ, Ñффект ÑоÑтоит в том, что только игроки могут иÑпользовать ритуал, а мобы - нет. Эти Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ Ñффективно иÑпользоватьÑÑ Ð´Ð»Ñ Ñортировки ферм животных или даже Ð¸Ð·Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñтих надоедливых детÑких зомби в вашей жертвенной ручке. Ритуал будет потреблÑÑ‚ÑŒ 0,05 Воли Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ типа, который дейÑтвует при уÑпешной операции, поÑтому, еÑли ребенок входит в ритуальное проÑтранÑтво, когда вы иÑпользуете Разрушительную волю, Ñто не будет Ñтоить Уилла или LP. -guide.bloodmagic.entry.ritual.wellOfSuffering.info=Ð”Ð»Ñ Ñ‚ÐµÑ… из ваÑ, кто предпочитает иÑпользовать мобов вмеÑто ÑобÑтвенного здоровьÑ, колодец Ñтраданий наноÑит урон вÑем живым ÑущеÑтвам, не ÑвлÑющимÑÑ Ð¸Ð³Ñ€Ð¾ÐºÐ°Ð¼Ð¸, в радиуÑе 10 блоков и помещает здоровье в подключенный алтарь. Ритуал будет иÑкать алтарь крови в пределах его диапазона, проверÑÑ 5 блоков по горизонтали и 10 блоков по вертикали без изменений. Когда он находит алтарь, он ÑохранÑет Ñвое меÑтоположение внутри - еÑли поблизоÑти нет алтарÑ, ритуал не будет работать. Ритуал будет давать 1 HP за единицу и помещать 25 алмазов в алтарь (100 Ð´Ð»Ñ Ð¼Ð¸Ñ€Ð½Ñ‹Ñ… животных), который может быть увеличен рунами ЖертвоприношениÑ. -guide.bloodmagic.entry.ritual.featheredKnife.info=Ритуал Пернатого Ðожа врезаетÑÑ Ð² тело пользователÑ, иÑÑ‚Ð¾Ñ‰Ð°Ñ ÐµÐ³Ð¾ жизненную Ñилу, чтобы заполнить кровавый алтарь поблизоÑти. Ритуал будет иÑкать алтарь крови в пределах его диапазона, проверÑÑ 5 блоков по горизонтали и 10 блоков по вертикали без изменений. Когда он находит алтарь, он ÑохранÑет Ñвое меÑтоположение внутри - еÑли поблизоÑти нет алтарÑ, ритуал не будет работать. Когда игрок входит в диапазон урона ритуала, который по умолчанию равен радиуÑу 15 блоков по горизонтали и 20 блоков по вертикали, ритуал наноÑит игроку урон в течение 1HP, а затем помещает Ñто здоровье непоÑредÑтвенно в подключенный алтарь (Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ кровавых рун). Ð’ ритуале еÑÑ‚ÑŒ неÑколько механизмов безопаÑноÑти, которые не позволÑÑŽÑ‚ игроку, чье здоровье ÑоÑтавлÑет менее 30%. Ðе подвергаÑÑÑŒ Ñомнению, ритуал делает Ñто раз в Ñекунду. \n\tЕÑÑ‚ÑŒ неÑколько полезных дополнений, которые вы можете иÑпользовать, еÑли будете иÑпользовать Волю Демона. ЕÑли ÑÑ‹Ñ€Ð°Ñ Ð²Ð¾Ð»Ñ Ð¿Ð¾Ð³Ð»Ð¾Ñ‰Ð°ÐµÑ‚ÑÑ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð¾Ð¼, ритуал будет пытатьÑÑ Ð½Ð°Ð½Ð¾Ñить урон игрокам в пределах Ñвоего диапазона Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ ÑкороÑтью, Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ Ð´Ð²Ð° раза в Ñекунду. Ритуал потреблÑет 0,05 необработанной воли за каждую уÑпешную операцию. \n\tЕÑли у Ð²Ð°Ñ Ð² ауре более 10 Ñтойких волей, ритуал повыÑит Ñвой порог безопаÑноÑти и вмеÑто Ñтого не будет работать Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°Ð¼Ð¸, чье здоровье ÑоÑтавлÑет менее 70%. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ потреблÑет Воли. \n\tЕÑли у Ð²Ð°Ñ Ð² Ðуре более 10 ÐœÑтительных желаний, ритуал Ñнимает некоторые Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти, заÑтавлÑÑ ÐµÐ³Ð¾ работать на игроков, пока у них не будет только 10 %% от их макÑимального здоровьÑ. оÑтавил. ЕÑли в ритуале также еÑÑ‚ÑŒ Steadfast Will, порог вÑе равно будет 70 %% только Ð´Ð»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° ритуала. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð² наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ потреблÑет Воли. \n\t Когда ДемонÑÑ‚Ñ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð’Ð¾Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑетÑÑ Ðº ритуалу, ритуал ÑтановитÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ более Ñффективным Ñ ÐµÐ³Ð¾ преобразованием HP в LP. КоличеÑтво LP, которое добавлÑетÑÑ Ðº алтарю за единицу здоровьÑ, увеличиваетÑÑ Ð² завиÑимоÑти от Воли в Ðуре, макÑимум до + 20 %% за 100 Разрушительного ВолÑ. Этот Ñффект ÑкладываетÑÑ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¿Ð»Ð¸ÐºÐ°Ñ‚Ð¸Ð²Ð½Ð¾ Ñ Ñ€ÑƒÐ½Ð°Ð¼Ð¸, УлучшениÑми Живой Брони и БлаговониÑми. Это потреблÑет 0,05 Разрушительной Воли за принеÑенное в жертву HP. \n\t Ð“Ð¾Ð²Ð¾Ñ€Ñ Ð¾ благовониÑÑ…, еÑли в обрÑде иÑпользуетÑÑ ÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð²Ð½Ð°Ñ Ð’Ð¾Ð»Ñ, ритуал будет уважать воздейÑтвие благовоний на ваÑ. ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ дебаффа Soul Fray, и вы наделены Ñилой ÐÐ»Ñ‚Ð°Ñ€Ñ Ð‘Ð»Ð°Ð³Ð¾Ð²Ð¾Ð½Ð¸Ð¹, ритуал израÑходует вÑе ваши HP до уÑтановленного порога и накачает вÑе получившиеÑÑ LP в алтарь. Это также удалит благовониÑ, которые вы понеÑли, и нанеÑет на Ð²Ð°Ñ Soul Fray. Этот Ñффект накладываетÑÑ Ð½Ð° бафф Â«Ð Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ñ». -guide.bloodmagic.entry.ritual.regen.info=Возможно, один из лучших ритуалов Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ потенциального Кровавого Мага, который хочет иÑпользовать Ñвою ÑобÑтвенную жизненную Ñилу Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñ‚ÐºÐ¸ Ñвоей магии, Ритуал Регенерации Ñоздает вокруг ÑÐµÐ±Ñ Ð·Ð°Ð²ÐµÑу Ñнергии, иÑцелÑющие ÑущноÑти, находÑщиеÑÑ Ð² его пределах. Каждые 2,5 Ñекунды ритуал разыгрывает Регенерацию I на живых ÑущеÑтвах в радиуÑе 15 блоков, ÑтоимоÑÑ‚ÑŒ 100 фунтов на игрока и 10 фунтов на других живых ÑущеÑтв в течение 2,5 Ñекунд регенерации. \n\tЕÑли Corrosive Will иÑпользуетÑÑ Ð´Ð»Ñ ÑƒÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð°, будет доÑтупен второй диапазон, «вампиричеÑкий диапазон». Любые неигровые ÑущеÑтва в Ñтом диапазоне будут Ñлучайным образом повреждены, чтобы непоÑредÑтвенно иÑцелить игроков в обычном диапазоне иÑцелениÑ. Это Ñтоит 0,04 воли Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ будет переводить 1HP за операционный тик. -guide.bloodmagic.entry.ritual.harvest.info=Этот ритуал будет иÑкать любой Ñобираемый раÑтительный блок в пределах его диапазона (по умолчанию облаÑÑ‚ÑŒ 9x9x5 выше MRS) и попытатьÑÑ Ñобрать его, переÑÐ°Ð¶Ð¸Ð²Ð°Ñ Ð»ÑŽÐ±Ñ‹Ðµ Ñемена, еÑли раÑтение может пропуÑтить Ñемена. Ð’Ñе капли Ñ Ñ€Ð°ÑÑ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑвÑÑ‚ÑÑ Ñ‚Ð°Ð¼, где было Ñобрано раÑтение. Ритуал будет пытатьÑÑ Ñобирать раÑÑ‚ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½ раз в 5 тиков и будет Ñтоить 20 фунтов Ñтерлингов за уÑпешную операцию.\n\tРаÑтениÑ, которые можно Ñобирать, включают, но не ограничиваютÑÑ Ð¸Ð¼Ð¸: тыквы, пшеницу, морковь, картофель, бородавку, кактуÑ, троÑтник. Имейте в виду, что ритуал не делает никаких предположений отноÑительно того, что он Ñобирает - он может Ñобирать урожай только Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼ модом, еÑли данный мод региÑтрирует обработчик уборки Ñ Ð¼Ð¾Ð´Ð¾Ð¼. -guide.bloodmagic.entry.ritual.interdiction.info=ОÑнованный на архаичеÑком алхимичеÑком уÑтройÑтве легенды, Ритуал Запрета пытаетÑÑ Ð½Ð°Ñильно оттолкнуть вÑех неигровых мобов от центра ритуала. По умолчанию вÑе мобы, которые находÑÑ‚ÑÑ Ð² двух блоках MRS, отталкиваютÑÑ Ð¾Ñ‚ MRS, уÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð¸Ñ… ÑкороÑÑ‚ÑŒ. Следует отметить, что мобы в Ñтом диапазоне не подвержены урону от падениÑ, Ñ…Ð¾Ñ‚Ñ Ñта Ð·Ð°Ñ‰Ð¸Ñ‚Ð½Ð°Ñ Ñетка ÑтираетÑÑ, как только их отталкивают. -guide.bloodmagic.entry.ritual.containment.info=Ð’ противоположноÑÑ‚ÑŒ Запрету, Ритуал ÑÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ‹Ñ‚Ð°ÐµÑ‚ÑÑ Ð¿Ð¾Ð´Ñ‚Ñнуть мобов в пределах его зоны дейÑÑ‚Ð²Ð¸Ñ Ðº проÑтранÑтву над MRS, Ð¿Ð¾Ð´Ð²ÐµÑˆÐ¸Ð²Ð°Ñ Ð¸Ñ… в воздухе, где они не могут двигатьÑÑ. Диапазон ритуала по умолчанию - горизонтальный Ñ€Ð°Ð´Ð¸ÑƒÑ Ð² 3 блока от нижней чаÑти маÑтер-ÐºÐ°Ð¼Ð½Ñ Ð´Ð¾ верхней чаÑти Ñамых верхних рун, Ñ…Ð¾Ñ‚Ñ Ñтот диапазон, конечно, можно изменить.\n\tЭтот ритуал Ñтоит 1LP за моба, потÑнувшего каждый тик. -guide.bloodmagic.entry.ritual.suppression.info=Купол Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Â«Ð¿Ð¾Ð´Ð°Ð²Ð»Ñет» вÑе жидкоÑти в заданном радиуÑе, ÑпоÑобные временно заменить жидкоÑти в полушарии Ñ Ñ€Ð°Ð´Ð¸ÑƒÑом 10 блоков воздухом. ЕÑли ритуал выключен, Ñта жидкоÑÑ‚ÑŒ вернетÑÑ Ð² то же ÑоÑтоÑние, в котором она была раньше. Это Ñтоит 2LP за операционный такт. -guide.bloodmagic.entry.ritual.expulsion.info=ЕÑли вы играете на Ñервере, вы можете ÑтолкнутьÑÑ Ñ Ñитуацией, когда у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ нежелательные поÑетители. Иногда Ñиловые Ð¿Ð¾Ð»Ñ Ð¸ гигантÑкие кровавые роторы не ÑвлÑÑŽÑ‚ÑÑ Ð´Ð¾Ñтаточным Ñдерживающим фактором, и им вÑе же удаетÑÑ Ð¿Ñ€Ð¾Ð½Ð¸ÐºÐ½ÑƒÑ‚ÑŒ на вашу базу. Этот ритуал пытаетÑÑ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð¸Ñ‚ÑŒ Ñто Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ магии телепортации!\n\tЕÑли игрок, не ÑвлÑющийÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼, входит в зону дейÑÑ‚Ð²Ð¸Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð° (по умолчанию Ñ€Ð°Ð´Ð¸ÑƒÑ 12 блоков), ритуал Ñлучайным образом телепортирует игрока в радиуÑе 100 блоков. Однако, еÑли на MRS еÑÑ‚ÑŒ Ñундук Ñ Ð¿Ñ€Ð¸Ð²Ñзанным предметом от игрока, Ñтот игрок будет оÑвобожден от телепортации, дейÑÑ‚Ð²ÑƒÑ Ñффективно как белый ÑпиÑок.\n\tРитуал Ñтоит 2000LP за уÑпешную телепортацию. -guide.bloodmagic.entry.ritual.zephyr.info=Созданный по образцу древнего меча поÑловицы, Зов Зефира иÑпользует Ñилу ветра, чтобы Ñобрать предметы, которые находÑÑ‚ÑÑ Ð²Ð¾ÐºÑ€ÑƒÐ³ него, и помеÑтить их в ÑвÑзанный Ñундук (по умолчанию прÑмо над MRS). Это делаетÑÑ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ð¾, что означает, что предметы телепортируютÑÑ Ð¿Ñ€Ñмо в инвентарь - не нужно беÑпокоитьÑÑ Ð¾ Ñтранных Ñффектах вÑаÑываниÑ!\n\tÐ Ð°Ð´Ð¸ÑƒÑ Ñлемента по умолчанию ÑоÑтавлÑет 5 блоков от MRS. -guide.bloodmagic.entry.ritual.laying.info=Как извеÑтно многим, возможноÑÑ‚ÑŒ размещать блоки может быть важной в различных задачах автоматизации. Этот ритуал берет предметы / блоки из подключенного Ñундука (по умолчанию Ñверху MRS) и помещает блоки в ритуал, Ñ€Ð°Ð´Ð¸ÑƒÑ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ равен 2 на том же уровне, что и MRS. Это может быть полезно, еÑли вы пытаетеÑÑŒ выложить Ñаженцы Ð´Ð»Ñ Ñ„ÐµÑ€Ð¼Ñ‹ деревьев или еÑли еÑÑ‚ÑŒ другие блоки, которые необходимо размеÑтить. Ритуал берет 50LP за уÑпешную операцию. -guide.bloodmagic.entry.ritual.timberman.info=ЕÑÑ‚ÑŒ дерево? Этот ритуал покрыл тебÑ. Crash of the Timberman привÑзывает Ñпектральную ÑущноÑÑ‚ÑŒ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ LP владельца, чтобы Ñобрать лиÑÑ‚ÑŒÑ Ð¸ бревна вÑех деревьев в пределах Ñвоего диапазона и помещает результаты в подключенный Ñундук. Он попытаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ вÑе «деревьÑ» в горизонтальном радиуÑе 10 блоков и до 30 блоков выше MRS (по умолчанию) и иÑпользовать 10LP на Ñрубленный блок. -guide.bloodmagic.entry.ritual.meteor.info=Ð”Ð»Ñ Ð²Ñех намерений и целей, Ñто один из Ñамых мощных ритуалов в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð² игре. ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñтоит один миллион LP и может быть иÑпользована только один раз перед повторной активацией. Ритуал, когда ÑовершаютÑÑ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ðµ жертвы, вытÑгивает метеор из коÑмоÑа и заÑтавлÑет его резко упаÑÑ‚ÑŒ к земле, Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ взрыв, когда он попадает во что-то твердое. ПоÑкольку Ñти метеоры не из Мира, они могут Ñодержать богатую плотноÑÑ‚ÑŒ руды, которую никогда не видели больше нигде.\n\tÐ–ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ включать в ÑебÑ: железный блок, золотой блок, алмаз. Это наÑтраиваетÑÑ Ð¼Ð¾Ð´Ð¿Ð°ÐºÐ¾Ð¼ или пользователем. -guide.bloodmagic.entry.ritual.downgrade.info=Чтобы получить больше Ñилы, иногда приходитÑÑ Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ñ‚ÑŒ чем-то взамен. ПокаÑние ОÑвобожденной Души делает именно Ñто - Ð¶ÐµÑ€Ñ‚Ð²ÑƒÑ Ð½ÐµÑколькими предметами невидимой ÑущноÑти, вы можете Ñнизить ÑффективноÑÑ‚ÑŒ какого-либо аÑпекта вашей Живой Брони и увеличить количеÑтво очков ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð² качеÑтве компенÑации. Когда вы Ñоздаете ритуал, вы должны размеÑтить рамку предмета на Ñамом верхнем ПуÑтом ритуальном камне, обращенном к Камню Главного Ритуала, и какой-то инвентарь (Ñм. Сундук) на вершине ÐšÐ°Ð¼Ð½Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ заката. Чтобы получить Понижение ÑƒÑ€Ð¾Ð²Ð½Ñ Ð–Ð¸Ð²Ð¾Ð¹ Брони, вы должны помеÑтить ключевой предмет в раму предмета и раÑходные материалы в Ñундук. Как только ритуал активирован, вы можете в любой момент прокраÑÑ‚ÑŒÑÑ Ð½Ð° МаÑтер ритуальный камень и получить понижение рейтинга.\n\tÐ’ Ñлучае Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Â«Ð—Ð°ÐºÐ°Ð»ÐµÐ½Ð½Ð°Ñ Ð¶Ð¸Ð²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ» его ключевым предметом ÑвлÑетÑÑ Ð±ÑƒÑ‚Ñ‹Ð»ÐºÐ° Ñ Ð²Ð¾Ð´Ð¾Ð¹ (помещаетÑÑ Ð² рамку предмета), а рецептом ÑвлÑетÑÑ Â«Ð”Ñ‹Ñ…Ð°Ð½Ð¸Ðµ дракона» (помещаетÑÑ Ð² Ñундук). Ключевой предмет никогда не раÑходуетÑÑ, но рецепт еÑÑ‚ÑŒ.\n\tЧтобы проÑмотреть рецепт понижениÑ, вы можете поÑмотреть их в JEI - проверьте иÑпользование Master Ritual Stone, и вы увидите рецепты Ð´Ð»Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð° ПокаÑниÑ. Также вы можете проÑто проверить рецепт Ð´Ð»Ñ Ð¼Ð°ÐºÑимального ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð² JEI, а затем проверить иÑпользование ключевого Ñлемента - ключевой Ñлемент вÑегда одинаков Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ рейтинга. -guide.bloodmagic.entry.ritual.crystalSplit.info=ПоÑле того, как Ð’Ð¾Ð»Ñ Ð”ÐµÐ¼Ð¾Ð½Ð° криÑталлизовалаÑÑŒ, невозможно разделить ее на множеÑтво аÑпектов - или Ñ Ñ‚Ð°Ðº думал до Ñих пор. Â«Ð ÐµÐ·Ð¾Ð½Ð°Ð½Ñ Ð¾Ð³Ñ€Ð°Ð½ÐµÐ½Ð½Ð¾Ð³Ð¾ криÑталла» работает путем Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтва аÑпектов внутри неведомого (или необработанного) клаÑтера криÑталлов Ñ Ð¸Ñпользованием различных аÑпектированных ритуальных камней. \n\tЧтобы иÑпользовать ритуал, неожиданный клаÑтер криÑталлов должен быть размещен в двух кварталах над Камнем МаÑтера Ритуала. Другими Ñловами, вы можете помеÑтить криÑталлизатор поверх MRS и клаÑтер криÑталлов поверх него, и он должен хорошо работать. Затем вы должны убедитьÑÑ, что нет никаких блоков непоÑредÑтвенно над Ñ‡ÐµÑ‚Ñ‹Ñ€ÑŒÐ¼Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ камнÑми на оÑнове Ñлементов, а затем дождатьÑÑ Ñ€Ð¾Ñта клаÑтера криÑталлов. \n\tПоÑле того, как клаÑтер Ð²Ñ‹Ñ€Ð¾Ñ Ð² общей ÑложноÑти пÑÑ‚ÑŒ или более духа, ритуал отделилаÑÑŒ и Ñоздать Ñти шпили коррозионного каждый один дух, твердо, мÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸ Ñ€Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»ÑŽ аÑпектированного ритуала на вершине камней. Unaspected, еÑли клаÑтер имеет право раÑти и дальше, и Ñти новые клаÑтеры оÑтаютÑÑ Ð½ÐµÑ‚Ñ€Ð¾Ð½ÑƒÑ‚Ñ‹Ð¼Ð¸, процеÑÑ Ð±ÑƒÐ´ÐµÑ‚ повторÑÑ‚ÑŒÑÑ ÑˆÐ¿Ð¸Ð»Ñми и больше будет добавлен. \n\tМеханизм Ñтого процеÑÑа довольно проÑÑ‚. Когда у криÑталла Ðеобработанной Воли еÑÑ‚ÑŒ по крайней мере пÑÑ‚ÑŒ шпилей, ритуал разрывает четыре из Ñтих шпилей и преобразует Волю в ее более беÑтелеÑную форму. Затем Ñта Ð’Ð¾Ð»Ñ Ð¾Ñ‚Ð±Ñ€Ð°Ñывает поÑледний шпиль ÑкоплениÑ, что заÑтавлÑет различные аÑпекты Воли превращатьÑÑ Ð² более локализованные ÑÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ аÑпекта. Затем Ñта Ð’Ð¾Ð»Ñ ÑобираетÑÑ Ð² ритуальные камни, которые Ñлужат оÑновой, из которой могут выраÑтать новые аÑпектированные криÑталличеÑкие клаÑтеры. -guide.bloodmagic.entry.ritual.portal.info=##REQ-LORE##\n\t Врата Сгиба - Ñто ритуал, предназначенный Ð´Ð»Ñ Ð¼ÐµÐ¶Ð¿Ñ€Ð¾ÑтранÑтвенной телепортации без необходимоÑти дополнительного взаимодейÑтвиÑ. ПоÑле активации вÑе блоки, которые каÑаютÑÑ ÐµÐ³Ð¾ ритуальных камней, иÑпользуютÑÑ Ð² качеÑтве ключевого шаблона Ð´Ð»Ñ ÑвÑзи порталов вмеÑте. ЕÑли ÑущеÑтвуют другие Ворота Сгиба Ñ Ñ‚ÐµÐ¼ же ключом, ритуалы будут ÑвÑзаны вмеÑте и мгновенно пройдут через телепортацию к Ñвоему близнецу. Одновременно могут ÑущеÑтвовать только до 2 порталов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ ключом.\n\t СтоимоÑÑ‚ÑŒ активации: 50,000LP\n\t СтоимоÑÑ‚ÑŒ телепортации: 1,000LP (одинаковое измерение) / 10,000LP (разные размеры) -guide.bloodmagic.entry.ritual.altarBuilder.info=##REQ-LORE##\n\t Сборка Ð’Ñ‹Ñокого ÐÐ»Ñ‚Ð°Ñ€Ñ - Ñто ритуал, позволÑющий быÑтро поÑтроить новый алтарь-зиккурат из блоков в прилагаемом инвентаре (обычно Ñто Ñундук Ñверху MRS).\n\tСтоимоÑÑ‚ÑŒ активации: 450LP\n\tСтоимоÑÑ‚ÑŒ за размещенный компонент: 75LP -guide.bloodmagic.entry.ritual.pump.info=##REQ-LORE##\n\t Гимн Ð¡Ð¸Ñ„Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей в мире вокруг или под ритуалом в подходÑщий контейнер (например, в Кровавый Бак) над MRS. ЖидкоÑти в мире заменены каменными, Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°Ñ Ñ‚ÐµÐºÑƒÑ‡Ð¸Ðµ жидкоÑти, которые могут вызвать проблемы Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью.\n\tСтоимоÑÑ‚ÑŒ активации: 500LP\n\tСтоимоÑÑ‚ÑŒ за операцию: 250LP -guide.bloodmagic.entry.ritual.cobble.info=##REQ-LORE##\n\t УÑтали от ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из Ñтих примитивных зданий Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ булыжника? Ð’Ñ‹ уÑтали от Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ OSHA на Ð²Ð°Ñ Ð¸Ð»Ð¸ Ñлучайно погаÑили ваш иÑточник лавы? Этот ритуал Ð´Ð»Ñ Ð²Ð°Ñ. Генерируйте непреодолимые маÑÑÑ‹ булыжника быÑтрым и Ñффективным ÑпоÑобом Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ крови, пригодной Ð´Ð»Ñ Ð±ÑƒÐ´ÑƒÑ‰ÐµÐ³Ð¾, вмеÑто иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ð°Ñной и ограниченной лавы (еÑли только вы не генерируете лаву из крови). \n\n\t Этот ритуал генерирует (по умолчанию) булыжник поверх Ñамого ÑебÑ, который затем может быть добыт Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ иÑпользованиÑ. \n\t СтоимоÑÑ‚ÑŒ активации: 500LP\n\t СтоимоÑÑ‚ÑŒ за блок: 25LP -guide.bloodmagic.entry.ritual.ellipsoid.info=##REQ-LORE##\n\t Ð¤Ð¾ÐºÑƒÑ ÑллипÑоида Ñоздает полую Ñферу (по умолчанию) из материалов в инвентаре, подключенном к MRS (обычно Ñундук поверх MRS).\n\t СтоимоÑÑ‚ÑŒ активации: 20,000LP\n\t СтоимоÑÑ‚ÑŒ за размещенный блок: 5LP -guide.bloodmagic.entry.ritual.crystalHarvest.info=##REQ-LORE##\n\t Трещина Ñломанного криÑталла разрывает вÑе, кроме одного ÑˆÐ¿Ð¸Ð»Ñ Ð²Ñех клаÑтеров КриÑталла Воли Демона, и броÑает их на землю. Ð’ Ñочетании Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»Ð¾Ð¼ «Зов Зефира» Ñти предметы не могут быть Ñобраны и помещены в инвентарь Ð´Ð»Ñ Ð¿Ð¾Ñледующего иÑпользованиÑ.\n\t СтоимоÑÑ‚ÑŒ активации: 40,000LP \n\t СтоимоÑÑ‚ÑŒ за операцию: 50LP -guide.bloodmagic.entry.ritual.forsakenSoul.info=##REQ-LORE##\n\t Сбор ОтрекшихÑÑ Ð”ÑƒÑˆ уÑкорÑет роÑÑ‚ КриÑталлов Демонов Ð´Ð»Ñ ÐºÐ»Ð°Ñтеров криÑталлов выше ритуала (по умолчанию). Он не генерирует волю Ñам по Ñебе, но требует, чтобы под клаÑтерами криÑталлов были КриÑталлизаторы Демонов. Чтобы Ñделать Ñто, он иÑпользует механику, извеÑтную как «уникальноÑть» мобов. Чем больше мобов погибнет, тем Ñффективнее будет роÑÑ‚ криÑталлов. Сама она не генерирует Ðуру ДемоничеÑкой Воли, поÑтому вам нужно Ñнабдить ее либо путем подачи обратно криÑталлов, либо путем Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¢Ð°Ñ€Ñ‚Ð°Ñ€Ð½Ð¾Ð³Ð¾ ÐšÐ°Ð¼Ð½Ñ Ñ Ð²Ð¾Ð»ÐµÐ¹ в Тигель Демона. Это должно иÑключить необходимоÑÑ‚ÑŒ выходить на ферму демоничеÑкой воли, еÑли только вы не предоÑтавите мобов, чтобы накормить ее и / или иÑчерпать волю.\n\t СтоимоÑÑ‚ÑŒ активации: 40,000LP\n\t СтоимоÑÑ‚ÑŒ за тик урона и моб: 2LP -guide.bloodmagic.entry.ritual.animalGrowth.info=##REQ-LORE##\n\t Ритуал Шефарда значительно увеличивает ÑкороÑÑ‚ÑŒ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ животные раÑтут.\n\t Это также увеличивает ÑкороÑÑ‚ÑŒ размножениÑ, еÑли поÑтавлÑетÑÑ Ñ Vengeful Will или делает животных ÑпоÑобными иÑкать враждебных мобов и взрыватьÑÑ Ð½Ð° них, еÑли Ñнабжено Destructive Will. Ð’ любом Ñлучае, еÑли поÑтавлÑетÑÑ Ñ Steadfast Will, он автоматичеÑки будет кормить животных едой из Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð²Ñ‹ÑˆÐµ MRS (по умолчанию).\n\t СтоимоÑÑ‚ÑŒ активации: 10,000LP\n\t СтоимоÑÑ‚ÑŒ за операцию и животное: 2LP -guide.bloodmagic.entry.ritual.livingEvolution.info=##REQ-LORE##\n\t Ритуал Живой Эволюции увеличивает макÑимальное количеÑтво очков ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð–Ð¸Ð²Ð¾Ð¹ Брони до 300. Чтобы иÑпользовать его, проÑто активируйте ритуал, а затем наÑтупите на MRS Ñ Ñкипированным набором Живой Брони.\n\t СтоимоÑÑ‚ÑŒ активации: 50,000LP -guide.bloodmagic.entry.ritual.upgradeRemove.info=##REQ-LORE##\n\t Ритуал Очищающей Души удалÑет вÑе ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¸ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· набора Живой Брони. Чтобы иÑпользовать его, проÑто активируйте ритуал, а затем наÑтупите на MRS Ñ Ñкипированным набором Living Armor.\n\t СтоимоÑÑ‚ÑŒ активации: 50,000LP -guide.bloodmagic.entry.ritual.fullStomach.info=##REQ-LORE##\n\t Ритуал наÑыщенного желудка кормит игроков в Ñтой облаÑти едой из Ñундука над MRS. Пищу кормÑÑ‚ Ñффективным ÑпоÑобом, еÑли пища не обеÑпечивает более макÑимального наÑыщениÑ, и в Ñтом Ñлучае ее вÑе равно кормÑÑ‚.\n\t СтоимоÑÑ‚ÑŒ активации: 100 000\n\tСтоимоÑÑ‚ÑŒ за операцию: 20LP -guide.bloodmagic.entry.ritual.eternalSoul.info=##REQ-LORE##\n\t Крик Вечной Души ÑпоÑобен кормить LP из Сети Души обратно в алтарь. Это подпадает под обычные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð°ÐºÐ°Ñ‡ÐºÐ¸ (жидкой) жизненной ÑущноÑти в алтарь. ÐšÐ°Ð¶Ð´Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° LP, Ð¿ÐµÑ€ÐµÐ´Ð°Ð½Ð½Ð°Ñ Ð² алтарь, Ñтоит 2 LP от Ñети.\n\t СтоимоÑÑ‚ÑŒ активации: 2,000,000LP\n\t СтоимоÑÑ‚ÑŒ за операцию: 2 LP -guide.bloodmagic.entry.ritual.condor.info=##REQ-LORE##\n\t Уважение к Кондору позволÑет игрокам Ñовершать полеты в окреÑтноÑÑ‚ÑÑ… ритуала.\n\t СтоимоÑÑ‚ÑŒ активации: 1,000,000LP\n\t СтоимоÑÑ‚ÑŒ за операцию: 2LP -guide.bloodmagic.entry.ritual.featheredEarth.info=##REQ-LORE##\n\t Ритуал Пернатой Земли поÑтоÑнно уменьшает выÑоту Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ 0, Ñффективно уÑтранÑÑ ÑƒÑ€Ð¾Ð½ от падениÑ.\n\t СтоимоÑÑ‚ÑŒ активации: 5,000LP\n\tСтоимоÑÑ‚ÑŒ за Ñекунду: 20LP -guide.bloodmagic.entry.ritual.grounding.info=##REQ-LORE##\n\ŧ Ритуал Ð—Ð°Ð·ÐµÐ¼Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑƒÐ»Ð¸Ñ€ÑƒÐµÑ‚ гравитацией в Ñвоей облаÑти. По умолчанию он перетаÑкивает мобов на землю и предотвращает прыжки.\n\t Снабжение ритуала Ñырой волей влиÑет на игроков в дополнение к мобам.\n\t Ð Ð°Ð·ÑŠÐµÐ´Ð°ÑŽÑ‰Ð°Ñ Ð²Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ñто отключает гравитацию вÑе вмеÑте.\n\t Ð Ð°Ð·Ñ€ÑƒÑˆÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²Ð¾Ð»Ñ Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ увеличивает урон от падений пораженных ÑущеÑтв.\n\t ÐÐµÐ¿Ð¾ÐºÐ¾Ð»ÐµÐ±Ð¸Ð¼Ð°Ñ Ð²Ð¾Ð»Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет ритуалу воздейÑтвовать на боÑÑов.\n\t Одна лишь ÐœÑÑ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð’Ð¾Ð»Ñ ÑƒÑиливает Ñффект Ð·Ð°Ð·ÐµÐ¼Ð»ÐµÐ½Ð¸Ñ Ð² Ñочетании Ñ ÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ð¹Ð½Ð¾Ð¹ волей, однако вмеÑто Ñтого она транÑформирует ритуал, чтобы обеÑпечить левитацию. Vengeful Will также увеличивает Ñффект Heavy Heart, еще больше ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ ÑƒÑ€Ð¾Ð½ от падениÑ.\n\t СтоимоÑÑ‚ÑŒ активации: 5,000LP\n\tСтоимоÑÑ‚ÑŒ за Ñекунду: 20LP - -# Architect Entries -guide.bloodmagic.entry.architect.intro=ПредиÑловие -guide.bloodmagic.entry.architect.bloodaltar=Кровавый алтарь -guide.bloodmagic.entry.architect.ash=Тайный пепел -guide.bloodmagic.entry.architect.divination=Символ Ð³Ð°Ð´Ð°Ð½Ð¸Ñ -guide.bloodmagic.entry.architect.soulnetwork=Душа Сеть -guide.bloodmagic.entry.architect.weakorb=Ð¡Ð»Ð°Ð±Ð°Ñ ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ð¡Ñ„ÐµÑ€Ð° -guide.bloodmagic.entry.architect.incense=Ðлтарь ладана -guide.bloodmagic.entry.architect.bloodrune=Обновление вашего ÐÐ»Ñ‚Ð°Ñ€Ñ -guide.bloodmagic.entry.architect.inspectoris=ИнÑпектор блок (блок Ñчитывание) -guide.bloodmagic.entry.architect.runeSpeed=СкороÑÑ‚Ð½Ð°Ñ Ñ€ÑƒÐ½Ð° -guide.bloodmagic.entry.architect.water=Сигил воды -guide.bloodmagic.entry.architect.lava=Сигил лавы -guide.bloodmagic.entry.architect.lavaCrystal=КриÑталл лавы -guide.bloodmagic.entry.architect.apprenticeorb=Ученик Кровавого Шара -guide.bloodmagic.entry.architect.dagger=Кинжал Ð–ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ -guide.bloodmagic.entry.architect.runeSacrifice=Руна Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ -guide.bloodmagic.entry.architect.runeSelfSacrifice=Руна ÑÐ°Ð¼Ð¾Ð¿Ð¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ -guide.bloodmagic.entry.architect.holding=Сигил ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ -guide.bloodmagic.entry.architect.air=Сигил воздуха -guide.bloodmagic.entry.architect.void=Сигил пуÑтоты -guide.bloodmagic.entry.architect.greenGrove=Сигил зеленой рощи -guide.bloodmagic.entry.architect.fastMiner=Sigil of the Fast Miner -guide.bloodmagic.entry.architect.seer=Сигил провидца -guide.bloodmagic.entry.architect.magicianOrb=Маги Кровавый Шар -guide.bloodmagic.entry.architect.capacity=Руна ЕмкоÑти -guide.bloodmagic.entry.architect.displacement=Руна ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ -guide.bloodmagic.entry.architect.affinity=Sigil of Elemental Affinity -guide.bloodmagic.entry.architect.lamp=Сигил кровавого Ñветильника -guide.bloodmagic.entry.architect.magnetism=Сигил магнетизм -guide.bloodmagic.entry.architect.peritia=Фолиант ÑкÑпертизы -guide.bloodmagic.entry.architect.livingArmour=Ð–Ð¸Ð²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ -guide.bloodmagic.entry.architect.upgradeTome=Ð–Ð¸Ð²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ Томов -guide.bloodmagic.entry.architect.teleposer=Телепортер -guide.bloodmagic.entry.architect.boundBlade=СвÑзанный клинок -guide.bloodmagic.entry.architect.boundTool=СвÑзанные инÑтрументы -guide.bloodmagic.entry.architect.weakShard=Слабый кровавый оÑколок -guide.bloodmagic.entry.architect.masterOrb=МаÑтер крови Ñфере -guide.bloodmagic.entry.architect.runeOrb=Руна Ñфера -guide.bloodmagic.entry.architect.suppression=Сигил ÐŸÐ¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ -guide.bloodmagic.entry.architect.haste=Cигил уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ -guide.bloodmagic.entry.architect.severance=Sigil of Ender Severance -guide.bloodmagic.entry.architect.teleposition=Сигил телепозиции -guide.bloodmagic.entry.architect.compression=Сигил ÑÐ¶Ð°Ñ‚Ð¸Ñ -guide.bloodmagic.entry.architect.bridge=Сигил призрачного моÑта -guide.bloodmagic.entry.architect.mimic=Mimics подражает -guide.bloodmagic.entry.architect.downgrade=Понижение живой брони - -guide.bloodmagic.entry.architect.augmentedCapacity=Руна дополненной ÑпоÑобноÑти -guide.bloodmagic.entry.architect.charging=ЗарÑÐ´Ð½Ð°Ñ Ñ€ÑƒÐ½Ð° -guide.bloodmagic.entry.architect.acceleration=Руна уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ - -guide.bloodmagic.entry.architect.tier3=Уровень 3 под морем - -# Architect Entry Texts -guide.bloodmagic.entry.architect.intro.info=ЗдравÑтвуйте вÑе. ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚ Тиберий. По Ñтой запиÑи вы, вероÑтно, можете Ñказать, что книга не ÑовÑем завершена, и вы были бы правы. Из-за обновлений 1.7.10 -> 1.8.9 и 1.9.4 (и выше) в моде многое изменилоÑÑŒ. Таким образом, книги должны были быть перепиÑаны. ПоÑкольку окончательный план Ð´Ð»Ñ Ñтих документов ÑоÑтоит в том, чтобы ÐºÐ°Ð¶Ð´Ð°Ñ ÐºÐ½Ð¸Ð³Ð° имела форму иÑÑледовательÑкого журнала / фактичеÑкой книги, Ñти документы потребуют времени, чтобы конкретизировать. ПоÑтому Ñ Ð±ÑƒÐ´Ñƒ периодичеÑки обновлÑÑ‚ÑŒ Ñту книгу, чтобы заполнить необходимые пробелы. Это начнетÑÑ ÐºÐ°Ðº муÑор без запаха, чтобы начать Ñ (Да ... не Ñамые аппетитные иллюÑтрации, чтобы пойти Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸, но безотноÑительно!), Ðо поÑтепенно Ñто превратитÑÑ Ð² иÑторию о куче кровавых магов во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÑƒÑ‚ÐµÑˆÐµÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾ открытие.\n\tÐо хватит об Ñтом, мне нужно войти в характер. * Кашель *\n\tÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚ Тиберий, и Ñ ÐœÐ°Ð³ крови, и также извеÑтный как Ðрхитектор. Эта книга Ñодержит вÑе мои иÑÑледованиÑ, каÑающиеÑÑ Ñфирного феномена, называемого «Сетью Души», а также физичеÑких ÑвойÑтв некоторых из Ñамых центральных уÑтройÑтв, к которым должен привыкнуть любой Кровавый Маг. Я обнаружил, переÑмотрел и Ñоздал новые пути в иÑкуÑÑтве ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтруктуры мощного Кровавого ÐлтарÑ, в хитроÑплетениÑÑ… жертвенной жизненной Ñилы, чтобы увеличить Ñилу мага, и в дальнейшем к Ñилам, полученным Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñ‚Ð°Ð¹Ð½Ñ‹Ð¼ глифам и Ñимволам. тренировать ÑÐµÐ±Ñ Ðº новым выÑотам.\n\tТак что входите, Маг, ибо новое царÑтво ждет ваÑ!\n\t... Да, Маг говорит, что Ñ Ð¼Ð¾Ð³Ñƒ Ñтать немного грандиозным, но что Ñ‚Ñ‹ можешь Ñделать? -guide.bloodmagic.entry.architect.bloodaltar.info.1=Кровавый Ðлтарь - одно из Ñамых центральных уÑтройÑтв в моде. У Ð°Ð»Ñ‚Ð°Ñ€Ñ ÐµÑÑ‚ÑŒ два оÑновных ÑпоÑоба иÑпользованиÑ: либо Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… предметов, необходимых Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð°, либо Ð´Ð»Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñвоей Кровавой Сферы. Оба Ñтих дейÑÑ‚Ð²Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ от игрока Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±Ð°ÑÑейна Жизненной СущноÑтью, которую можно извлечь из двух разных иÑточников: монÑтров и мирных ÑущеÑтв, а также из ÑобÑтвенного Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¸Ð³Ñ€Ð¾ÐºÐ°. -guide.bloodmagic.entry.architect.bloodaltar.info.2=Чтобы добавить Ñвою ÑобÑтвенную СущноÑÑ‚ÑŒ Жизни в баÑÑейн, вам нужно изготовить Ñебе Жертвенный Кинжал и щелкнуть по нему правой кнопкой мыши Ñ€Ñдом Ñ Ð°Ð»Ñ‚Ð°Ñ€ÐµÐ¼. Это обретет душевное здоровье и добавит 200 фунтов к алтарю без улучшений. «LP» - Ñто «Очки жизни», которые показывают, Ñколько жизненной Ñилы иÑпользуетÑÑ Ð² задании - нет, Ñто не похоже на YuGi-Oh. Кровавый Ðлтарь имеет вмеÑтимоÑÑ‚ÑŒ 10000 латов. ЕÑли вы затем щелкните правой кнопкой мыши на алтаре, вы можете помеÑтить предмет в баÑÑейн, и, еÑли Ñто дейÑтвительный предмет, алтарь начнет процеÑÑ Ð¸Ð·Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ.\n\tÐлтарь обрабатывает предмет, потреблÑÑ Ð›ÐŸ в тазу, еÑли алтарь доÑтаточно выÑокого уровнÑ. ЕÑли будет доÑтаточно LP, алтарь будет отводить немного LP из баÑÑейна каждый тик и увеличивать ход крафта, иÑпуÑÐºÐ°Ñ ÐºÑ€Ð°Ñные чаÑтицы. ЕÑли в баÑÑейне больше нет LP, алтарь иÑпуÑтит Ñерые чаÑтицы, и ремеÑло начнет терÑÑ‚ÑŒ прогреÑÑ, что ÑовÑем не хорошо! Ðаконец, еÑли алтарь заполнÑет Сферу Крови, алтарь будет иÑпуÑкать пурпурные чаÑтицы, чтобы указать, что он Ñифонирует LP из баÑÑейна.\n\tÐа Ñамом деле в Ðлтаре Крови находитÑÑ Ñ‚Ñ€Ð¸ танка: оÑновной танк, емкоÑÑ‚ÑŒ которого по умолчанию ÑоÑтавлÑет 10 кПа, как указано ранее, а также входной и выходной баки, каждый из которых имеет 10 %% от общей вмеÑтимоÑти. оÑновной танк. Каждые 20 тиков по умолчанию LP во входном баке будет передаватьÑÑ Ð² оÑновной бак Ñо ÑкороÑтью 20 л / Ñ, а LP в оÑновном баке будет передаватьÑÑ Ð² выходной бак Ñо ÑкороÑтью 20 л / Ñ. Как Ñледует из названий, входной резервуар принимает LP, который закачиваетÑÑ Ð² алтарь, выÑÑ‚ÑƒÐ¿Ð°Ñ Ð² качеÑтве буфера Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти передачи из внешних иÑточников, и выходной резервуар можно извлечь из труб из алтарÑ. -guide.bloodmagic.entry.architect.ash.info=Ð¥Ð¾Ñ‚Ñ Arcane Ash не ÑвлÑетÑÑ Ñ‡Ð°Ñтью общей темы Ñтой книги, он необходим Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы пройти через мод и получить доÑтуп к некоторым из более мощных уÑтройÑтв. Этот пепел Ñоздан Ñ Ð¸Ñпользованием Кузницы ÐдÑкого Пламени и Воли Демона, поÑтому, еÑли вы новичок в Ñтой концепции, обратитеÑÑŒ к «Кин Демона». По Ñути, Ñто ÑпоÑоб Ð¸Ð·Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð² из двух отдельных предметов: какого-то реагента, который дейÑтвует как катализатор, и вторичного предмета. \n\tПепел имеет в общей ÑложноÑти двадцать применений, прежде чем вам понадобитÑÑ Ñоздать еще один. Когда вы щелкнете правой кнопкой мыши по земле (или Ñтене, Ñ…Ð¾Ñ‚Ñ Ð¾Ð½Ð° будет отображать только одно направление), вы начертите проÑтой круг из пепла. ЕÑли Ñнова щелкнуть по пеплу Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ð¾Ð¼, он будет «помещен в пепел» - при уÑловии, что Ñтот предмет ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным катализатором, круг изменит форму, чтобы показать, что он готов к Ñледующему предмету. ЕÑли Ñто не менÑет форму, значит, вы Ñделали что-то не так.\n\tКак только он изменил форму, вы можете помеÑтить его в дополнительный предмет. ЕÑли Ñтот Ñлемент Ñовпадает Ñ Ð¿ÐµÑ€Ð²Ñ‹Ð¼, круг начнет вращатьÑÑ Ð¸ выполнÑÑ‚ÑŒ различные дейÑÑ‚Ð²Ð¸Ñ Ð² завиÑимоÑти от рецепта, над которым он работает. Через некоторое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸ правильном выполнении Ñлемент выÑкочит.\n\tÐ’Ñе рецепты Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Â«Ð§Ð°Ñ€Ð¾Ð´ÐµÐ¹Ñкий пепел» (Ñ Ð½Ð°Ð·Ñ‹Ð²Ð°ÑŽ Ñто «Создание алхимичеÑкого маÑÑива») можно найти в JEI, проверив иÑпользование «ЧародейÑкого пепла» - первый показанный предмет - катализатор, а второй - вторичный предмет. -guide.bloodmagic.entry.architect.divination.info=Символ Ð³Ð°Ð´Ð°Ð½Ð¸Ñ - один из Ñамых полезных инÑтрументов в моде, ÑпоÑобный раÑÑказать вам о многих ценноÑÑ‚ÑÑ…, которые Ñделают вашу жизнь проще. Этот Ñимвол изготовлен Ñ Ð¸Ñпользованием куÑочка краÑного ÐºÐ°Ð¼Ð½Ñ Ð¸ чиÑтого лиÑта (Ñозданного в Ðлтаре Крови) Ñ Ð¸Ñпользованием набора алхимии.\n\tКогда вы щелкнете правой кнопкой мыши на Ðлтаре Крови Ñ Ñимволом, вы увидите текущий уровень, количеÑтво ЛП внутри оÑновного баÑÑейна, а также макÑимальную емкоÑÑ‚ÑŒ Кровавого ÐлтарÑ. Ðажатие Ñпама на алтарь Ñ Ñимволом перезапишет предыдущий текÑÑ‚ Ñ Ñимвола, означаÑ, что в вашем чате не будет никакого Ñпама.\n\tЕÑли вы щелкнете правой кнопкой мыши в Ñфире Ñ Ñимволом, он Ñообщит вам текущее количеÑтво LP, которое находитÑÑ Ð² вашей Душа Сеть. Ð¥Ð¾Ñ‚Ñ Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Ñто довольно обыденно, одна только Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ вероÑтно, что вы захотите вÑегда держать Ñтот Ñимвол на Ñебе. -guide.bloodmagic.entry.architect.soulnetwork.info=Сеть Души (обычно Ñокращенно SN) - Ñто термин, обозначающий ÑвÑзи между игроком и вÑеми предметами и Ñтруктурами, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ он ÑвÑзал Ñвою душу. Когда маг крови ÑтановитÑÑ Ð±Ð¾Ð»ÐµÐµ могущеÑтвенным, Ñила их души увеличиваетÑÑ Ð¸ укреплÑет Ñти ÑвÑзи. Эти ÑвÑзи ÑвлÑÑŽÑ‚ÑÑ Ñфирными нитÑми души, и только Ñамые могущеÑтвенные из Кровавых Волхвов ÑпоÑобны увидеть их в их физичеÑкой форме. Ðа ÑегоднÑшний день ни один маг не доÑтиг Ñтой ÑпоÑобноÑти ...\n\tÐ’ игре Сеть Души привÑзана непоÑредÑтвенно к игроку. Данные хранÑÑ‚ÑÑ Ð² мире, и у каждого игрока еÑÑ‚ÑŒ только одна Ñеть - LP, помещенный в Ñеть, не хранитÑÑ Ð½Ð¸ в одном Ñлементе, а вмеÑто Ñтого помещаетÑÑ Ð¸ беретÑÑ Ð¸Ð· одного пула. \n\tЧтобы ÑвÑзать вещи Ñ Ð²Ð°ÑˆÐµÐ¹ Ñетью, наиболее раÑпроÑтраненный ÑпоÑоб - проÑто щелкнуть правой кнопкой мыши Ñлемент, который иÑпользует Ñеть Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ. ПоÑле привÑзки предмет будет указывать, что он принадлежит вам, и он никогда не может быть оÑвобожден (Ñ Ð¸Ñпользованием текущей технологии). ЕÑли Ñтот предмет иÑпользуетÑÑ Ð¸ ему припиÑана ÑтоимоÑÑ‚ÑŒ ЛП, он получит ЛП из Ñети владельца. ЕÑли в Ñтой Ñети недоÑтаточно LP, недоÑтающий LP будет извлечен непоÑредÑтвенно из ÑоÑтоÑÐ½Ð¸Ñ Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (а не владельца). Будьте оÑторожны при иÑпользовании предметов, когда у Ð²Ð°Ñ Ð¼Ð°Ð»Ð¾ LP - Ñто может закончитьÑÑ Ñмертельным иÑходом. -guide.bloodmagic.entry.architect.weakorb.info.1=Что хорошего в Ñтом маге без иÑточника Ñнергии? Blood Orb - Ñто уÑтройÑтво, которое потреблÑет физичеÑкий LP и передает его в Душа Сеть владельца. Ð¥Ð¾Ñ‚Ñ Ñто и не Ñама батареÑ, она дейÑтвует как канал, чтобы воÑполнить резервы Ñнергии мага крови. -guide.bloodmagic.entry.architect.weakorb.info.2=Ð¡Ð»Ð°Ð±Ð°Ñ Ð¡Ñ„ÐµÑ€Ð° Крови - Ñто Ð¿ÐµÑ€Ð²Ð°Ñ Ñ‚Ð°ÐºÐ°Ñ Ñфера, которую вы можете Ñоздать. Ð’Ð»Ð¸Ð²Ð°Ñ Ð°Ð»Ð¼Ð°Ð· внутри ÐÐ»Ñ‚Ð°Ñ€Ñ ÐšÑ€Ð¾Ð²Ð¸ Ñ 2 кПа, вы можете Ñоздать Ñтот шар. Будучи ÑвÑзанным и помещенным в алтарь Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом ЛП в нем, Ñфера будет откачивать из баÑÑейна и передавать Ñтот ЛП непоÑредÑтвенно в Ñеть. ÐšÐ°Ð¶Ð´Ð°Ñ Ñфера имеет макÑимальную вмеÑтимоÑÑ‚ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть раÑширена только продвинутыми рунами на алтаре. Ð”Ð»Ñ Weak Blood Orb Ñта макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð¼ÐµÑтимоÑÑ‚ÑŒ ÑоÑтавлÑет 5 LP.\n\tКровавые шары также можно заполнить непоÑредÑтвенно от игрока, проÑто щелкнув по ним правой кнопкой мыши - Ñто перенеÑет Ñердце Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ð² шар и даÑÑ‚ вам 200LP. Это не может превышать макÑимальную емкоÑÑ‚ÑŒ шара.\n\tÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ñфера может быть заполнена только уровнем Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð¸Ð»Ð¸ выше; Ñто означает, что еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ шар T3, он должен быть заполнен в алтаре, который больше или равен T3. ПроÑтой алтарь Т1 не подойдет в Ñтой Ñитуации. -guide.bloodmagic.entry.architect.incense.info.1=БыÑтро обнаружитÑÑ, что ÑкороÑÑ‚ÑŒ генерации LP может Ñтать вÑе более обременительной. Конечно, добавлÑÑ Ñпециальные руны к Кровавому Ðлтару, вы можете увеличить количеÑтво Ñамоотверженных жертв, но Ñто вÑе равно может быть медленным процеÑÑом. ЕÑли бы только был ÑпоÑоб еще больше увеличить, Ñколько LP вы можете получить от ÑебÑ?\n\tВойдите в алтарь ладана. Ðлтарь ладана дейÑтвует как Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ð´Ð»Ñ Ñпокойной облаÑти, уÑÐ¿Ð¾ÐºÐ°Ð¸Ð²Ð°Ñ Ð´ÑƒÑˆÑƒ нежными волнами, которые иÑходÑÑ‚ из баÑÑейна. Откуда иÑходит Ñтот запах, вы не ÑовÑем уверены, но что может пойти не так?\n\tЦель Ñтого блока - Ñоздать зону ÑпокойÑтвиÑ, чтобы увеличить количеÑтво LP, которое вы получаете из Ñердца здоровьÑ. Когда вы находитеÑÑŒ Ñ€Ñдом Ñ Ð±Ð»Ð¾ÐºÐ¾Ð¼ (около пÑти блоков), огненные чаÑтицы будут излучатьÑÑ, чтобы показать, что он работает - когда на Ð²Ð°Ñ Ð²Ð¾Ð·Ð´ÐµÐ¹Ñтвует Ñто ÑпокойÑтвие, ваш Жертвенный Кинжал изменитÑÑ, показываÑ, что у Ð²Ð°Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½ урожай на Ðлтаре Крови. Этот процеÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ‚ около 5 Ñекунд, и вы узнаете, что закончили, когда чаÑтицы Ð¾Ð³Ð½Ñ Ð¿ÐµÑ€ÐµÑтают поÑвлÑÑ‚ÑŒÑÑ. Ð’ Ñтот момент, еÑли вы иÑпользуете Ñвой Жертвенный Кинжал на Кровавом Ðлтаре, вы пожертвуете 90 %% от вашего макÑимального Ð·Ð´Ð¾Ñ€Ð¾Ð²ÑŒÑ Ñразу и накачаете LP в алтарь пропорционально количеÑтву пожертвованного здоровьÑ, умноженному на бонуÑ, оÑнованный на том, наÑколько Ñпокойным окружающий Площадь: по умолчанию Ñтот Ð±Ð¾Ð½ÑƒÑ + 20%.\n\tÐ’ качеÑтве дополнительного примечаниÑ, Символ Ð“Ð°Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть иÑпользован на Ðлтаре Ладана Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва СпокойÑтвиÑ, а также того, Ñколько бонуÑа дает текущий алтарь. -guide.bloodmagic.entry.architect.incense.info.2=Конечно, только дополнительные 20% - Ñто хорошо, но Ñто может быть раÑширено за Ñчет раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° влиÑÐ½Ð¸Ñ ÐÐ»Ñ‚Ð°Ñ€Ñ Ð‘Ð»Ð°Ð³Ð¾Ð²Ð¾Ð½Ð¸Ð¹. ЕÑли вы размеÑтите Ñ€Ñд из трех блоков «ДеревÑÐ½Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ°Â» в двух кварталах от Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð»Ð°Ð´Ð°Ð½Ð° в каждом из оÑновных направлений (убедитеÑÑŒ, что вÑе блоки дорожек находÑÑ‚ÑÑ Ð½Ð° одном и том же уровне y, до пÑти блоков вверх или вниз от Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð»Ð°Ð´Ð°Ð½Ð°) Ð’Ñ‹ можете определить облаÑÑ‚ÑŒ. Любой блок, размещенный в Ñтой облаÑти (блок, который находитÑÑ Ð½Ð° том же раÑÑтоÑнии по горизонтали от ÐÐ»Ñ‚Ð°Ñ€Ñ Ð±Ð»Ð°Ð³Ð¾Ð²Ð¾Ð½Ð¸Ð¹, что и блоки пути по горизонтали, и на том же уровне или на два ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ñ‹ÑˆÐµ по вертикали от блоков пути), может добавить к СпокойÑтвию Ðлтарь ладана. ПоÑле Ñтой начальной Ñтроки можно добавить еще один Ñ€Ñд блоков пути, ÑÐ»ÐµÐ´ÑƒÑ Ñ‚Ð¾Ð¼Ñƒ же правилу: вÑе новые Ñтроки должны находитьÑÑ Ð½Ð° одном уровне y друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼, а вÑÑ Ñтрока должна находитьÑÑ Ð² пределах 5 блоков вертикально от предыдущей Ñтроки пути. блоки. Это означает, что возможны такие макеты, как пирамиды, перевернутые пирамиды или более Ñложные конÑтрукции леÑтниц. \n\tÐ’Ñе блоки пути имеют макÑимальное раÑÑтоÑние, которое они могут иметь от ÐÐ»Ñ‚Ð°Ñ€Ñ Ð»Ð°Ð´Ð°Ð½Ð°, чтобы иметь Ñффект. Блоки «ДеревÑÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð¾Ð¿Ð°Â» могут работать в трех Ñ€Ñдах от ÐÐ»Ñ‚Ð°Ñ€Ñ Ð»Ð°Ð´Ð°Ð½Ð°. Каменные дорожки работают до пÑти, изношенные каменные дорожки - Ñемь, а обÑидиановые - до девÑти кварталов от иÑточника. Таким образом, в определенный момент вы должны иÑпользовать более качеÑтвенные блоки пути, чтобы раÑширить зону ÑпокойÑтвиÑ, однако вы можете иÑпользовать блоки более выÑокого ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿ÑƒÑ‚Ð¸ вмеÑто блоков более низкого ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿ÑƒÑ‚Ð¸, а не наоборот.\n\tВернутьÑÑ Ðº ÑпокойÑтвию. Только определенные блоки могут влиÑÑ‚ÑŒ на СпокойÑтвие облаÑти, и еÑÑ‚ÑŒ различные типы блоков СпокойÑтвиÑ. ЕÑли вы помеÑтите урожай, такой как картофель, в облаÑÑ‚ÑŒ, вы добавите немного СпокойÑÑ‚Ð²Ð¸Ñ (иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸ÑŽ «Зерновые культуры»). Однако, еÑли вы добавите еще одну культуру, например, картофель или даже морковь, вы получите меньше ÑпокойÑтвиÑ. ДобавлÑÑ Ñ‡Ñ‚Ð¾-то из другой категории Tranquility, вы получаете полный Ñффект. Ðо добавление большего количеÑтва материала Ñ Ð¸Ñпользованием той же категории имеет убывающую отдачу. ПоÑтому, чтобы получить наибольшее ÑпокойÑтвие из определенной облаÑти, наиболее оптимально Ñмешивать и Ñочетать, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°Ðº можно больше разных типов ÑпокойÑтвиÑ..\n\tÐекоторые вещи, которые добавлÑÑŽÑ‚ СпокойÑтвие: Урожай, бревна, лиÑÑ‚ÑŒÑ, лава, пуÑтошь, ÑельхозугодьÑ, вода, ÑущноÑÑ‚ÑŒ жизни и другие разные вещи. -guide.bloodmagic.entry.architect.bloodrune.info.1=ÐŸÑ€Ð¾Ñ…Ð¾Ð´Ñ Ð¼Ð¾Ð´, вы поÑтепенно узнаете, что Ñкромный кровавый алтарь перед вами недоÑтаточно Ñилен, чтобы вы могли выполнить Ñвои иÑтинные амбиции. Ð Ð°Ð·Ð¼ÐµÑ‰Ð°Ñ Ñпециальные блоки, извеÑтные как Кровавые Руны, вокруг алтарÑ, вы можете значительно увеличить Ñилу алтарÑ, Ð¾Ñ‚ÐºÑ€Ñ‹Ð²Ð°Ñ Ð±Ð¾Ð»ÐµÐµ выÑокие уровни рецептов, а также ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ ÑпоÑобноÑти Ñамого алтарÑ.\n\tЧтобы улучшить алтарь до его второго уровнÑ, вам нужно размеÑтить 8 алтуров крови вокруг Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð¸ на один уровень ниже. ЕÑли вы не уверены в точной конфигурации, пункт «Inspectoris Scandalum» может подÑказать вам точное размещение блоков, необходимых Ð´Ð»Ñ Ñледующего уровнÑ.\n\tÐ¥Ð¾Ñ‚Ñ Ð¿ÑƒÑтые руны хороши Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы проÑто получить обновление Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð¸ перейти на более выÑокий уровень, полезно иÑпользовать руны Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñвоего алтарÑ. ÐšÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· рун в кровавом алтаре может быть заменена на любую руну ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ (единÑтвенное иÑключение - Ñто то, что на Уровне 2 вы не можете иÑпользовать угловые руны в качеÑтве рун Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ - T3 и далее вы можете иÑпользовать их). ЕÑÑ‚ÑŒ руны, которые влиÑÑŽÑ‚ на ÑкороÑÑ‚ÑŒ изготовлениÑ, мощноÑÑ‚ÑŒ алтарÑ, а также ÑффективноÑÑ‚ÑŒ Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð¿Ñ€Ð¸Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñƒ алтарÑ. Эти руны можно найти в ÑоответÑтвующих запиÑÑÑ…. -guide.bloodmagic.entry.architect.inspectoris.info.1=Буквально «Блок чтение» на латыни, цель Ñтого предмета - дать вам больше информации о более Ñложных блоках в моде, когда блоки находÑÑ‚ÑÑ Ð² мире. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ ÐµÐ´Ð¸Ð½Ñтвенной реализацией Ñтого предмета ÑвлÑетÑÑ ÐšÑ€Ð¾Ð²Ð°Ð²Ñ‹Ð¹ Ðлтарь, и, проÑто щелкнув правой кнопкой мыши на Кровавом Ðлтаре в мире, он Ñкажет вам, какие блоки требуютÑÑ Ð² мире Ð´Ð»Ñ Ñледующего ÑƒÑ€Ð¾Ð²Ð½Ñ ÐлтарÑ.\n\tЕÑли Ñтот метод вам не подходит, вы можете щелкнуть правой кнопкой мыши на Ñлементе в воздухе, чтобы переключитьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ уровнÑми. ЕÑли вы затем щелкните правой кнопкой мыши на алтаре, на алтаре поÑвÑÑ‚ÑÑ Ð¿Ñ€Ð¸Ð·Ñ€Ð°Ñ‡Ð½Ñ‹Ðµ блоки в мире, показывающие, где именно находÑÑ‚ÑÑ Ñ€ÑƒÐ½Ñ‹ крови и Ñтолбы, необходимые Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñтого уровнÑ. ЕÑли вы уÑтановите отображаемый уровень на 1, голограмма будет удалена. -guide.bloodmagic.entry.architect.runeSpeed.info.1=СкороÑÑ‚Ð½Ð°Ñ Ñ€ÑƒÐ½Ð° оказывает давление на таз алтарÑ, форÑÐ¸Ñ€ÑƒÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñ‚Ñ€Ð°Ð½Ñмутации, так что крафт намного быÑтрее. ÐšÐ°Ð¶Ð´Ð°Ñ Ñ€ÑƒÐ½Ð° ÑкороÑти увеличивает потребление Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð½Ð° + 20 %% за руну, Ñффективно ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ алтарÑ. Это также влиÑет на ÑкороÑÑ‚ÑŒ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ шары крови заполнÑÑŽÑ‚ÑÑ Ð°Ð»Ñ‚Ð°Ñ€ÐµÐ¼ Ñ Ñ‚Ð¾Ð¹ же ÑкороÑтью на руну. -guide.bloodmagic.entry.architect.water.info.1=Сигил воды, как Ñледует из названиÑ, ÑпоÑобен Ñобирать влагу из воздуха, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¸Ñточник воды в точке ÑоприкоÑÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹. Более того, щелкнув по машине, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°ÐµÑ‚ жидкоÑÑ‚ÑŒ, вы можете вÑтавить в машину до 1000mB воды за ту же цену, как еÑли бы вы положили ее на землю. Ð”Ð»Ñ Ð²Ñех намерений и целей он дейÑтвует как беÑконечное ведро воды - однако, он не будет работать, еÑли вы помеÑтите его внутрь машины. 50LP за иÑпользование. -guide.bloodmagic.entry.architect.lava.info.1=Инь, Ян, чтобы Ñигилы вода, Ñто запечатанное нагревает камень в локальной облаÑти и Ñобирает ее в одном меÑте, Ð¾Ð±Ñ€Ð°Ð·ÑƒÑ Ð¸Ñточник Ñтирки, где незапечатанный замыкающий контакт. Ðналогичный процеÑÑ Ð¿Ñ€Ð¾Ð¸Ñходит, когда вы взаимодейÑтвуете на машине флюид прием, генерировать до 1000mB лавы внутри машины по той же цене. По какой-то причине ваша рука не ÑжигаетÑÑ, когда вы иÑпользуете его, однако Ñто не означает, что Ñто мудрый выбор, чтобы принÑÑ‚ÑŒ ванну в нем! 1000LP Ð´Ð»Ñ Ð¸ÑпользованиÑ. -guide.bloodmagic.entry.architect.lavaCrystal.info.1=КриÑталл лавы - Ñто камень, в центре которого находитÑÑ ÐºÑƒÑочек лавы, не терÑющий тепла. При размещении в качеÑтве иÑточника топлива внутри печи, оно «Ñгорает» на количеÑтво, доÑтаточное Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ предмета в Ñтандартной печи по цене 50 LP из Ñети владельца. ЕÑли в Ñети недоÑтаточно Ñнергии (или нет владельца), криÑталл проÑто не Ñгорит и вызовет тошноту у владельца из-за нагрузки.\n\tЭтот криÑталл будет работать на любой машине, работающей на твердом топливе, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°ÐµÑ‚ любое топливо. -guide.bloodmagic.entry.architect.apprenticeorb.info.1=При иÑпользовании различных уÑтройÑтв вы быÑтро поймете, что ваша макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ 5 LP в вашей Душа Сеть быÑтро иÑÑÑкнет. ЗдеÑÑŒ вы начнете иÑкать более мощный шар Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ Ñети.\n\tÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ñфера Ученика требует Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð£Ñ€Ð¾Ð²Ð½Ñ 2 и имеет макÑимальную вмеÑтимоÑÑ‚ÑŒ 25 LP. Это также позволÑет Ñоздавать более мощные предметы и руны. -guide.bloodmagic.entry.architect.dagger.info.1=Через некоторое Ð²Ñ€ÐµÐ¼Ñ ÑƒÐºÑ€ÐµÐ¿Ð»ÐµÐ½Ð¸Ñ ÑÐµÐ±Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÐ°Ð¼Ð¾Ð¿Ð¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹ можете попытатьÑÑ Ð¿Ð¾Ð¶ÐµÑ€Ñ‚Ð²Ð¾Ð²Ð°Ñ‚ÑŒ кровью мобов. Dagger of Sacrifice, когда он иÑпользуетÑÑ Ð½Ð° не-боÑÑе, не игроке Ñ€Ñдом Ñ ÐšÑ€Ð¾Ð²Ð°Ð²Ñ‹Ð¼ Ðлтарем, убьет ÑущеÑтво одним ударом и накачает вÑÑŽ кровь в алтарь, Ð¿Ñ€ÐµÐ²Ñ€Ð°Ñ‰Ð°Ñ ÐµÐµ в ÑущноÑÑ‚ÑŒ жизни в завиÑимоÑти от качеÑтва толпа. Обычно, враждебные мобы будут давать гораздо больше LP, чем мирные мобы. -guide.bloodmagic.entry.architect.runeSacrifice.info.1=Руна жертвоприношениÑ, как Ñледует из названиÑ, увеличивает урожайноÑÑ‚ÑŒ вÑех видов деÑтельноÑти, которые приноÑÑÑ‚ в жертву здоровье мобов в обмен на LP. ÐšÐ°Ð¶Ð´Ð°Ñ Ñ€ÑƒÐ½Ð° обеÑпечивает + 10% -ное увеличение урожаÑ, в добавок. -guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=Как и в Ñлучае Ñ Rune of Sacrifice, Rune of Self Sacrifice увеличивает доходноÑÑ‚ÑŒ LP от игрока. ÐšÐ°Ð¶Ð´Ð°Ñ Ñ€ÑƒÐ½Ð° обеÑпечивает + 10% -ное увеличение урожаÑ, в добавок. -guide.bloodmagic.entry.architect.holding.info.1=Как вы начнете понимать, еÑÑ‚ÑŒ много полезных Ñимволов, некоторые из которых можно переключать, другие активно иÑпользовать. Из-за Ñтого ваш инвентарь быÑтро забьетÑÑ. Эта потребноÑÑ‚ÑŒ заполнÑетÑÑ Ð¡Ð¸Ð³Ð¸Ð»Ð¾Ð¹ Холдинга.\n\tЭтот Ñимвол может Ñодержать до пÑти других Ñимволов (нет, он не может Ñодержать других Ñимволов холдинга) во внутреннем инвентаре. Ðажав клавишу «Удержание», по умолчанию «H», вы можете открыть графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñигил, чтобы изменить раÑположение удерживаемых Ñигил. ЕÑли вы перемещаете и иÑпользуете колеÑо прокрутки, пока оно уÑтановлено, вы будете перебирать ÑодержащиеÑÑ Ð² нем Ñигилы. Как только вы приземлитеÑÑŒ на тот Ñимвол, который хотите иÑпользовать, вы можете иÑпользовать Ñтот Ñимвол, как еÑли бы он был выбран! \n\tЕÑтеÑтвенно, у Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть неÑколько Сигил Холдинга, каждый Ñо Ñвоим инвентарем. Чтобы определить, какой из них Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ взглÑда, вы можете покраÑить Ñимвол, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñƒ Ðлхимии. Чтобы Ñделать Ñто, помеÑтите Сигилу Ð”ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð² ÐлхимичеÑкую Таблицу Ñ ÐºÑ€Ð°Ñителем или Сигилу Ñ Ñ‚ÐµÐ³Ð¾Ð¼ имени нужного цвета в формате 0xZZZZZZ Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸. -guide.bloodmagic.entry.architect.air.info.1=Воздух Ñигил иÑпользует Ñлементарную форму делениÑ, чтобы генерировать Ñтабильный поток воздуха за пользователем по Ñледам водÑного пара в воздухе, Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð³Ð°Ñ Ð¸Ñ… вперед. Ð’ ÑущноÑти, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтого незапечатанный, вы можете быть запущен вперед на значительное раÑÑтоÑние. Следует отметить, что запечатано только отменить раÑÑтоÑние Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸ иÑпользовании, так что еÑли вы хотите придерживатьÑÑ Ð¿Ð¾Ñадок вы должны иÑпользовать его близко к земле! -guide.bloodmagic.entry.architect.void.info.1=Как Ñледует из названиÑ, пуÑтота Ñигил будет Ñоздавать вакуум в точке контакта, который будет вÑаÑывать жидкий иÑточник, который иÑпользуетÑÑ Ð½Ð°, полноÑтью уничтожить иÑточник. Это, вероÑтно, лучше вÑего иÑпользовать в Ñочетании Ñ Ñ‡Ð¸Ñтой Ñигилой Water или Ñигилами. -guide.bloodmagic.entry.architect.greenGrove.info.1=ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñвою кровь в качеÑтве проÑтого катализатора роÑта Ñортов, Ñигил Зеленой Рощи увеличит ÑкороÑÑ‚ÑŒ роÑта любых раÑтений в ÑоÑеднем районе, а активируетÑÑ. Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы активировать запечатанный, Ñдвиг-щелчок правой кнопкой Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ активируетÑÑ Ð¸ деактивируетÑÑ (легко видеть по подÑказке или ÑветÑщимиÑÑ Ñимволами на незакрытых). Имейте в виду, что каждые неÑколько Ñекунд запечатанные будет перекачать немного LP от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ðº топливу уÑкоренного роÑта.\n\tЕÑли иÑпользуютÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно на плоÑкоÑти, Ñигил применит коÑÑ‚ÑŒ еды Ñффекта. Это может быть иÑпользовано Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ñ‰Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ñокой травы или других культур, так же, как коÑти еда. -guide.bloodmagic.entry.architect.fastMiner.info.1=Как должен знать любой хороший маг крови, в крови много железа. ЕÑли вы доÑтаточно опытны, вы можете манипулировать кровью, пока она еще находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ тела - однако Ñледует отметить, что только Ñамые продвинутые Маги Крови могут Ñкручивать кровь тех, кто не желает.\n\tОдин из принципов, который иÑпользует Ñтот принцип, заключаетÑÑ Ð² уÑкорении функций ÑобÑтвенного тела. ÐÐ°Ð¼Ð°Ð³Ð½Ð¸Ñ‡Ð¸Ð²Ð°Ñ Ð¶ÐµÐ»ÐµÐ·Ð¾ в крови пользователÑ, Sigil of the Fast Miner резко увеличивает ÑкороÑÑ‚ÑŒ майнинга, применÑÑ Haste II во Ð²Ñ€ÐµÐ¼Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸. Этот магнетизм Ñлишком Ñлаб, чтобы воздейÑтвовать на вещи вне ÑобÑтвенного тела, однако его доÑтаточно Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы добывать обÑидиан Ñо значительной ÑкороÑтью. -guide.bloodmagic.entry.architect.seer.info.1=Ð Ð°Ð±Ð¾Ñ‚Ð°Ñ Ñ ÐšÑ€Ð¾Ð²Ð°Ð²Ñ‹Ð¼ Ðлтарем, вы иногда можете заблудитьÑÑ Ð² Ñкрытых тонкоÑÑ‚ÑÑ… его дейÑтвиÑ, которые, по-видимому, Гадательный Символ не может угадать. ЗдеÑÑŒ в игру вÑтупает Сигил Провидца. По Ñути, Ñто повышение до ГаданиÑ, Ñтот Ñимвол предоÑтавлÑет дополнительную информацию о различных характериÑтиках алтарÑ. Они варьируютÑÑ Ð¾Ñ‚ ÑкороÑти алтарÑ, текущего LP, а также текущего прогреÑÑа Ñозданного предмета. Это также дает информацию о душевной Ñети игрока. -guide.bloodmagic.entry.architect.magicianOrb.info.1=Еще один уровень, еще одна ÐšÑ€Ð¾Ð²Ð°Ð²Ð°Ñ Ñфера. Ðа Ñтот раз, чтобы продвинутьÑÑ Ð´Ð°Ð»ÑŒÑˆÐµ в моде, вам нужно будет Ñоздать Ñебе Магию Кровавого Шара. Ð’ рецепте по умолчанию вы можете видеть, что Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÑ€Ð°Ñ„Ñ‚Ð° требуетÑÑ 25kLP, однако макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð¼ÐµÑтимоÑÑ‚ÑŒ ÐÐ»Ñ‚Ð°Ñ€Ñ ÐšÑ€Ð¾Ð²Ð¸ ÑоÑтавлÑет 10kLP. Это означает, что Ð´Ð»Ñ ÑƒÑпешного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»Ñ Ð²Ð°Ð¼ нужно будет добавить LP в Ðлтарь, пока он находитÑÑ Ð² процеÑÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑˆÐ°Ñ€Ð°. Будьте готовы, так как Ñто может быть трудной задачей, еÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ вÑего, что вам нужно! -guide.bloodmagic.entry.architect.capacity.info.1=Ð’Ñ‹ не ÑовÑем уверены, как Ñто работает так, как работает, но Руна СпоÑобноÑти увеличивает ÑпоÑобноÑÑ‚ÑŒ Кровавого ÐÐ»Ñ‚Ð°Ñ€Ñ Ð½Ð° 2kLP аддитивно. Возможно, ÑущеÑтвует какой-то резонанÑный Ñффект, который уменьшает объем LP, поÑтому позволÑет вам больше упаковывать в ÑтатичеÑкий таз? Это дает вам предÑтавление о том, как улучшить его, Ñ…Ð¾Ñ‚Ñ ...\n\tСледует повторить, что размер входного и выходного буферов ÑоÑтавлÑет 10 %% от макÑимальной емкоÑти оÑновного резервуара, поÑтому Ñти руны также увеличат буферные емкоÑти. -guide.bloodmagic.entry.architect.displacement.info.1=По умолчанию передача LP между буфером и оÑновными резервуарами ограничена 20LP / Ñ. Ð”Ð»Ñ ÑиÑтем, которые хотÑÑ‚ удалить и повторно добавить LP к алтарю, Ñта ÑкороÑÑ‚ÑŒ ÑвлÑетÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ‹Ð¼ Ñканированием. Вот где Ñта руна вÑтупает в игру.\n\tРуна ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ количеÑтво ЛП, передаваемых за операцию. ÐšÐ°Ð¶Ð´Ð°Ñ Ñ€ÑƒÐ½Ð° умножает ÑкороÑÑ‚ÑŒ передачи в 1,2 раза, умножаÑÑÑŒ на Ñтопку. Таким образом, одна руна будет 24LP на операцию, две руны будут 28.8LP на операцию и три руны 34.56LP. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ 20 рун на алтаре, Ñто прыгает до 767LP за операцию - Ñто очиÑтит полный алтарь вÑего за 13 Ñекунд. -guide.bloodmagic.entry.architect.affinity.info.1=Ðа первый взглÑд, Символ СродÑтва Стихий проÑто дает иммунитет к огню, утоплению и урону Ñ Ð²Ñ‹Ñоты при активации. Однако, его работа намного более тонкаÑ. Этот Ñимвол Ñоздает тонкий барьер воздуха вокруг пользователÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ñ‚ (и, при необходимоÑти, кровь) от пользователÑ, ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ñ‚ÐµÐ»Ð¾ вдали от резких Ñлементов. \n\tЭтот воздушный барьер дейÑтвует как буфер между кожей и огнем или лавой, Ñ†Ð¸Ñ€ÐºÑƒÐ»Ð¸Ñ€ÑƒÑ Ð¿Ñ€Ð¸ необходимоÑти Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ³Ñ€ÐµÐ²Ð°. Он также заполнÑет легкие, находÑÑÑŒ под водой, чтобы выровнÑÑ‚ÑŒ давление тела и окружающей воды. Ðаконец, при падении Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ выÑоты воздух ÑмещаетÑÑ Ð½Ð¸Ð¶Ðµ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð½Ð¾Ð³ человека, выÑÑ‚ÑƒÐ¿Ð°Ñ Ð² качеÑтве подушки Ð´Ð»Ñ ÑмÑÐ³Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ. -guide.bloodmagic.entry.architect.lamp.info.1=Ð’ теле и крови человека довольно много «примеÑей». Ð¡Ð¾Ð±Ð¸Ñ€Ð°Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ благородные газы и Ð·Ð°ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ñ… в иÑточник тепла, вы можете Ñоздать шар Ñвета, который можно отброÑить на большое раÑÑтоÑние, Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ñ Ðº поверхноÑти, на которую он ударÑет.\n\tСигил Кровавой Светильника имеет два назначениÑ: вы можете либо щелкнуть по блоку напрÑмую и помеÑтить иÑточник Ñвета, либо выÑтрелить ÑнарÑдом, который будет генерировать иÑточник Ñвета в точке контакта. Эти иÑточники Ñвета могут быть разбиты так же, как факелы за один удар. -guide.bloodmagic.entry.architect.magnetism.info.1=Этот Ñимвол намагничивает железо в потоке крови пользователÑ, притÑÐ³Ð¸Ð²Ð°Ñ Ðº нему мелкие предметы, обеÑÐ¿ÐµÑ‡Ð¸Ð²Ð°Ñ Ð±Ñ‹Ñтрый и безболезненный захват. По Ñути, Ñто дейÑтвует как магнит предмета, но вмеÑто того, чтобы фактичеÑки «пылеÑоÑить» предметы по отношению к игроку, он заÑтавлÑет игрока подбирать предмет Ñ Ñ€Ð°ÑÑтоÑниÑ, поÑтому предметы не должны летать вокруг меÑта. К ÑчаÑтью, магнетизм наÑтроен так, что он не притÑгивает к Ñебе живые объекты, поÑтому вы не найдете лианы, внезапно желающие обнÑÑ‚ÑŒ Ð²Ð°Ñ Ð½Ð° Mach 3. - -guide.bloodmagic.entry.architect.peritia.info.1=Ð’ мире определенные дейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´ÑÑ‚ впечатление на человека: убийÑтво монÑтров, добыча Ñлементов, плавка Ñлитков или пищи может дать опыт, накопленный за определенный период времени. Через некоторые тайные механизмы некоторые Ñтруктуры и уÑтройÑтва фактичеÑки иÑтощают Ñтот опыт у ваÑ, чтобы подпитывать Ñвои ÑобÑтвенные процеÑÑÑ‹. ПоÑтому может быть полезно хранить Ñтот опыт в некоторой Ñреде.\n\tÐ¥Ð¾Ñ‚Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ контейнеры хранÑÑ‚ опыт как физичеÑкую ÑубÑтанцию, «Фолиант Перитии» позволÑет человеку транÑкрибировать Ñвои Ð¿ÐµÑ€ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² книгу - напиÑав в томе, Ñтраницы наполнены вашими мыÑлÑми и прошлыми дейÑтвиÑми, ÑохранÑÑ Ð¸Ñ… Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ³Ð¾ иÑпользованиÑ. ЕÑли затем вы захотите получить Ñтот опыт обратно, вы можете поднеÑти руку к Ñтранице и откачать их обратно; Ñто удалит запиÑÑŒ Ñо Ñтраницы и передаÑÑ‚ Ñти дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ в вашу памÑÑ‚ÑŒ. \n\tÐ¡ÐµÐ¹Ñ‡Ð°Ñ Ð´Ð»Ñ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑкого иÑпользованиÑ; щелкнув правой кнопкой мыши на томе в Ñвоей руке, вы можете Ñохранить уровень опыта в книге (или до уровнÑ, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ чаÑтичный уровень). ЕÑли щелкнуть правой кнопкой мыши на томе, вы перейдете на Ñледующий уровень, еÑли в книге доÑтаточно опыта. Общий опыт, а также Ñохраненный Ñквивалентный уровень отображаютÑÑ Ð²Ð¾ вÑплывающей подÑказке в томе. -guide.bloodmagic.entry.architect.livingArmour.info.1=Любой человек в Minecraft, оÑобенно Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ воплощениÑми мира, будет знать, что хороший набор доÑпехов означает разницу между жизнью и Ñмертью. Обычно, когда вы выбираете набор брони, вы выбираете ÑтатичеÑкий набор преимущеÑтв - обеÑпечивает ли Ñта Ð±Ñ€Ð¾Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆÑƒÑŽ защиту? Получу ли Ñ Ñ€ÐµÐ¹Ñ, когда ношу Ñто? Могу ли Ñ Ð¿Ñ€Ñ‹Ð³Ð½ÑƒÑ‚ÑŒ очень выÑоко или двигатьÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ быÑтро? Ð’Ñе Ñто допуÑтимые параметры Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° брони, но вы никогда не Ñможете получить набор, который точно ÑоответÑтвует вашим потребноÑÑ‚Ñм. По крайней мере, так они думали.\n\tÐабор Living Armor - Ñто ÑÐ¿Ñ€Ð¾ÐµÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° жизни, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð° Ñ Ð¿Ñ€Ð¾Ñтым набором железной брони. При ношении он вÑтупает в ÑимбиотичеÑкие Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ - когда вы двигаетеÑÑŒ, он движетÑÑ. Когда вы атакуете, он атакует. Когда вы едите, он Ñто чувÑтвует и компенÑирует. И так же, как нормальное человечеÑкое тело, оно начнет раÑти и укреплÑÑ‚ÑŒÑÑ Ð² завиÑимоÑти от того, что вы делаете, будучи обученным вашими дейÑтвиÑми. \n\tДавайте приведем пример. ЕÑли вы наденете новый комплект брони и будете много бегать, вы заметите, что вы получите апгрейд на нагрудную плиту под названием «БыÑтрые ноги» - Ñто апгрейд обеÑпечивает поÑтепенное увеличение вашей ÑкороÑти на уровне 1, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº поÑледующие уровни обеÑпечить больший импульÑ. Ð’Ñ‹ также заметите, что «Точки обновлениÑ» теперь читаютÑÑ ÐºÐ°Ðº «3/100» - каждое обновление требует Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ð³Ð¾ количеÑтва точек обновлениÑ, а на Ñундуке еÑÑ‚ÑŒ макÑимальное количеÑтво очков, которое она может удержать. ЕÑли обновление, которое вы можете получить, невозможно получить Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом имеющихÑÑ Ñƒ Ð²Ð°Ñ Ð±ÐµÑплатных точек обновлениÑ, его невозможно получить. \n\tИмейте в виду, что Живую Броню можно тренировать только тогда, когда у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ полный комплект брони, а Ñффекты брони будут дейÑтвовать только тогда, когда иÑпользуетÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ.\n\tМакÑимальное количеÑтво точек Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ изменить неÑколькими различными ÑпоÑобами. Одним из них ÑвлÑетÑÑ Ñоздание алхимичеÑких ÑмеÑей, которые укрепÑÑ‚ ÑвÑзи между пользователем и Живой Броней, значительно ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво очков, которое вы можете получить на данном наборе ÑнарÑжениÑ. Одним из таких примеров ÑвлÑетÑÑ Â«Ð§ÐµÑ€Ð½Ð¾Ð²Ð¸Ðº Ðнгела», который увеличивает макÑимальное количеÑтво очков до 200. Информацию об Ñтих варевах, а также о том, как их Ñоздавать, можно найти в «Ðлхимике». -guide.bloodmagic.entry.architect.upgradeTome.info.1=Иногда вы можете быть недовольны улучшениÑми, которые вы получили в Ñвоей Живой Броне. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ€Ð¸Ñ‚ÑƒÐ°Ð» «Звук Очищающей Души» (дополнительную информацию можно найти в «Ритуальном МаÑтере»), вы можете удалить вÑе ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ñ Ð´Ð¾Ñпехов и получить их в виде «Ðпгрейдовых фолиантов». ЕÑли вы щелкнете по ним правой кнопкой мыши, Ð½Ð°Ð´ÐµÐ²Ð°Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¹ комплект Living Armor (и когда у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ меÑто Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ), вы можете добавить обновление к Ñвоей броне. \n\tЭти тома также могут быть объединены в наковальне - еÑли вы комбинируете два одинаковых тома Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (одно и то же улучшение, тот же уровень) вмеÑте в наковальне, вы можете получить один том на один уровень выше. Таким образом, еÑли вы объедините Quick Feet II Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ Quick Feet II, вы получите Quick Feet III. Это может быть применено к броне таким же образом. -guide.bloodmagic.entry.architect.teleposer.info.1=Teleposer - Ñто уÑтройÑтво, которое телепортирует не только объекты, но и блоки. Чтобы наÑтроить Teleposer, вам нужно как минимум два Teleposers и один Teleposition focus. Один из Teleposers дейÑтвует как Ðазначение, а другой дейÑтвует как Ðачало.\n\tЧтобы наÑтроить Ñто, вам нужно Ñначала привÑзать Ñ„Ð¾ÐºÑƒÑ Ðº Ñебе, щелкнув по нему правой кнопкой мыши. Затем вы щелкаете правой кнопкой мыши по фокуÑу на Teleposer назначениÑ, чтобы Ñохранить его меÑтоположение (и размер), а затем вÑтавлÑете Ñ„Ð¾ÐºÑƒÑ Ð² Beginning Teleposer, Ñ‰ÐµÐ»ÐºÐ°Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ кнопкой мыши Teleposer без фокуÑа в руке и Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ñ„Ð¾ÐºÑƒÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ GUI.\n\tВключение начинающего телепортера (тот, который в фокуÑе) Ñ Ñильным Ñигналом краÑного ÐºÐ°Ð¼Ð½Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÑ‚ к тому, что телепродавцы поменÑÑŽÑ‚ÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸ и блоками (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð»ÑŽÐ±Ð¾Ð¹ контент в тайлах, таких как инвентарь Ñундуков) между телепозиционерами, предполагаÑ, что в телепоÑтере еÑÑ‚ÑŒ МеÑто назначениÑ. \n\tУ Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть один Teleposer Ñ Ñ„Ð¾ÐºÑƒÑом, у обоих Teleposrs еÑÑ‚ÑŒ фокуÑÑ‹, которые ÑвÑзаны друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼, или вы можете иметь один Teleposer, ÑвÑзанный Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ Teleposer, который не ÑвÑзан Ñ Ð½Ð¸Ð¼, поÑтому в завиÑимоÑти от того, как вы их наÑтроили, вы можете может иметь очень Ñложные ÑиÑтемы.\n\tИмейте в виду, что в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Teleposer будет менÑÑ‚ÑŒ меÑтами только те блоки и объекты, которые находÑÑ‚ÑÑ Ð¿Ñ€Ñмо над блоком, а размер завиÑит от фокуÑа - Ñ„Ð¾ÐºÑƒÑ T1 менÑет меÑтами только блок поверх Teleposer, Ñ„Ð¾ÐºÑƒÑ T2 менÑет облаÑÑ‚ÑŒ 3x3x3 выше Телепортер и др. -guide.bloodmagic.entry.architect.boundBlade.info.1=СвÑзанный Клинок - Ñто артефакт из прошлого, клинок, Ñозданный путем привÑзки ÑущеÑтва к мечу в том же процеÑÑе, что и Ð–Ð¸Ð²Ð°Ñ Ð‘Ñ€Ð¾Ð½Ñ. Следует отметить, что Ñто, как и Bound Tools, изменитÑÑ Ð² более поздних верÑиÑÑ… мода.\n\tМеч имеет активный и неактивный режим, который можно переключать, Ñ‰ÐµÐ»ÐºÐ°Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ кнопкой мыши. Меч не наноÑит никакого урона вообще, когда неактивен, но когда он активен, Ñо временем произойдет небольшой раÑход ЛП. Точно так же, когда вы наноÑите урон мобу, вы вытÑгиваете LP из Ñвоей Ñети. Конечно, у Ð²Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾ урона, но Ñто может Ð²Ð°Ñ ÑƒÐ±Ð¸Ñ‚ÑŒ!\n\tКогда монÑÑ‚Ñ€ убит, у него еÑÑ‚ÑŒ ÑˆÐ°Ð½Ñ ÑброÑить оÑколок Ñлабой крови. Эти оÑколки иÑпользуютÑÑ Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÐÐ»Ñ‚Ð°Ñ€Ñ ÐšÑ€Ð¾Ð²Ð¸ до Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð¢4. -guide.bloodmagic.entry.architect.boundTool.info.1=Подобно Bound Blade, Ñти Bound Tools (кирка, топор и лопата) в конечном итоге будут модифицированы Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑоответÑÑ‚Ð²Ð¸Ñ Ð¼Ð¾Ð´Ñƒ. Как и Blade, инÑтрументы имеют активный и неактивный режим, который можно переключать, Ñ‰ÐµÐ»ÐºÐ°Ñ Ð¸Ñ… правой кнопкой мыши. \n\tТо, что еÑÑ‚ÑŒ в Ñтих инÑтрументах, называетÑÑ Â«Ð ÐµÐ¶Ð¸Ð¼ зверÑ». ЕÑли вы удерживаете правой кнопкой мыши, вы можете зарÑдить инÑтрумент и выÑвободить мощное раÑщепление, которое мгновенно Ñломает блоки, которые могут быть разбиты данным инÑтрументом - при полной зарÑдке Ñто куб размером 11x11x11 над вами по цене 10kLP. Будьте оÑторожны Ñ Ñтим мощным инÑтрументом, так как он может быть вашим поÑледним! -guide.bloodmagic.entry.architect.weakShard.info.1=Ð’Ñе, что имеет жизнь, может иметь Ñфирные ÑвÑзи, извеÑтные как Сеть Души. Как видно из вашего опыта, к неживым вещам также может быть приÑоединена Сеть Души, Ñ‚Ð°ÐºÐ°Ñ ÐºÐ°Ðº Ñигилы и ритуалы; однако Ñти ÑвÑзи наиболее Ñильны у ÑущеÑтв и, еÑтеÑтвенно, у людей. \n\tКогда вы атакуете монÑтра Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Bound Blade, их Ñеть душ временно затвердевает, и чаÑÑ‚ÑŒ ее оÑтанетÑÑ Ð¿Ð¾Ñле Ñмерти. Эта чаÑÑ‚ÑŒ принимает форму оÑколка Ñлабой крови, названного так в Ñилу того, что ее краÑноватый оттенок ÑоответÑтвует цвету шара Ñлабой крови. Ðа данный момент неÑÑно, ÑущеÑтвуют ли более Ñильные формы кровÑных оÑколков, но вы можете Ñказать, что Ñто было бы очень полезно Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ñ‰Ð½Ð¾Ñти вашей ÑобÑтвенной Сети Души. -guide.bloodmagic.entry.architect.masterOrb.info.1=Одно из применений Ñтого увеличенного ÑродÑтва к Сети Души - иÑпользование Слабого Кровавого ОÑколка в новом кровавом шаре: МаÑтер Кровавого Шара. Этот шар имеет макÑимальную вмеÑтимоÑÑ‚ÑŒ 1 миллион LP, и, таким образом, владелец шара может получить доÑтуп к более мощным предметам и ритуалам. Возможно, метеоры не за пределами вашей доÑÑгаемоÑти ... -guide.bloodmagic.entry.architect.runeOrb.info.1=Изначально Ñту руну можно Ñчитать неÑколько беÑполезной. УкреплÑÑ ÑвÑзи между Ñферой крови в алтаре и Сетью Души, Руна Сферы увеличивает макÑимальную вмеÑтимоÑÑ‚ÑŒ шара крови, заполненного Кровавым Ðлтарем, на + 2 %% за каждую руну. Ð”Ð»Ñ Ñ‡ÐµÐ³Ð¾-то вроде Слабой Сферы Крови Ñто вÑего лишь емкоÑÑ‚ÑŒ + 100LP, однако Ð´Ð»Ñ Master Blood Orb Ñто Ð·Ð°Ð¼ÐµÑ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ + 20kLP на руну. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ выÑокоуровневый шар крови и неÑколько дополнительных рун, которые вы можете ÑÑкономить на Ñвоем алтаре, Ñто может быть чем-то, что может обогатить вашу Ñеть. -guide.bloodmagic.entry.architect.suppression.info.1=Символ Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñпользует технологию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользуетÑÑ Ð² Teleposer Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей, которые находÑÑ‚ÑÑ Ñ€Ñдом Ñ Ð½Ð¸Ð¼, когда активны. Это делаетÑÑ Ð¿ÑƒÑ‚ÐµÐ¼ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñтей в Ñфере вокруг Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ðº Ñкрытому карманному размеру, заменÑÑ Ð¶Ð¸Ð´ÐºÐ¾ÑÑ‚ÑŒ воздухом. К Ñожалению, из-за того, что вы перезарÑжаете поле, иÑпользуемое Teleposer, Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð° - еÑли пользователь уходит из облаÑти, в которой была удалена жидкоÑÑ‚ÑŒ, или деактивирует Ñигил, жидкоÑти будут возвращатьÑÑ Ñ‚ÑƒÐ´Ð°, где они были раньше, как будто ничего произошло, еÑли предположить, что там нет новых блоков. Это позволÑет Ñовершить необычную транÑпортировку пешком, гулÑÑ Ð¿Ð¾Ð´ водой вмеÑто того, чтобы плыть через нее или даже раÑÑтаватьÑÑ Ñ ÐºÑ€Ð°Ñными морÑми ПуÑтоты. -guide.bloodmagic.entry.architect.haste.info.1=Сахар и кофеин - интереÑные химичеÑкие вещеÑтва, которые человечеÑкий организм может перерабатывать. Один дейÑтвует как резервуар Ñнергии, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ñтро Ñгорает, тогда как другой увеличивает ваше бодрÑтвование и позволÑет вам получить доÑтуп к Ñнергии другими ÑпоÑобами. ÐŸÐ¾Ð´Ñ€Ð°Ð¶Ð°Ñ Ñтим химичеÑким процеÑÑам, чтобы выÑвободить больше химичеÑкой Ñнергии, Sigil of Haste позволÑет пользователю увеличить Ñвои ÑпоÑобноÑти к движению. \n\tПри активации пользователь может работать намного быÑтрее и может прыгать значительно выше. Более того, Ñигил также предлагает «Step Assist», который позволÑет пользователю поднÑÑ‚ÑŒÑÑ Ð½Ð° один блок выÑокими гребнÑми без необходимоÑти прыгать. Это как автоматичеÑкий прыжок, но менее отÑтойный. -guide.bloodmagic.entry.architect.severance.info.1=Ð¢ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ - одна из тех Ñтранных ÑпоÑобноÑтей, которые люди не могут полноÑтью объÑÑнить. Ð’ большинÑтве Ñлучаев Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть опиÑана как Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´ÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð² проÑтранÑтве-времени, ÑвÑÐ·Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð´Ð²Ð° меÑта в проÑтранÑтве так, что раÑÑматриваемый объект может проÑто «перешагнуть» на другую Ñторону. Sigil of Ender Severance пытаетÑÑ Ð¾Ñтановить Ñту деформацию, необходимую Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ð¸, Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°Ñ Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸ÑŽ ÑущеÑтв, когда они находÑÑ‚ÑÑ Ñ€Ñдом Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼. Это не оÑтановит некоторые из более крупных ÑредÑтв телепортации, таких как порталы, но предотвратит иÑпользование Эндерманом Ñвоих ÑпоÑобноÑтей Ð´Ð»Ñ Ð´ÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ вокруг пользователÑ. -guide.bloodmagic.entry.architect.teleposition.info.1=Символ Телепозиции имеет в Ñвоем ÑоÑтаве Teleposer и фокуÑ. ЕÑли вы щелкните правой кнопкой мыши на Teleposer Ñ Ñтим Ñимволом, вы можете привÑзать координаты и размер к Ñимволу. Теперь, когда вы щелкнете правой кнопкой мыши по Ñимволу, он будет телепортировать Ð²Ð°Ñ Ð¿Ñ€Ñмо в Teleposer (еÑли он там еÑÑ‚ÑŒ). К Ñожалению, не похоже, что вы можете Ñовершить обратную поездку ... -guide.bloodmagic.entry.architect.compression.info.1=Шахтер быÑтро обнаружит, что во Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ ÑкÑпедиции их инвентарь будет заполнен краÑнокаменной пылью, лÑпиÑом и неÑколькими другими материалами. У большинÑтва из них еÑÑ‚ÑŒ рецепты, которые Ñжимают их до блоков хранениÑ, таких как блоки из краÑного ÐºÐ°Ð¼Ð½Ñ Ð¸ блоки Ñ Ð±Ñ€Ð¸Ð»Ð»Ð¸Ð°Ð½Ñ‚Ð°Ð¼Ð¸, однако Ð´Ð»Ñ Ð¸Ñ… Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ требуетÑÑ Ñтол Ð´Ð»Ñ ÐºÑ€Ð°Ñ„Ñ‚Ð°. \n\tЭтот Ñимвол Ñоздает миниатюрное поле ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð² инвентаре Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸ активации, ÑÐ¶Ð¸Ð¼Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¼ÐµÑ‚Ñ‹ до минимального количеÑтва Ñлотов, необходимых Ð´Ð»Ñ Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ. Это означает, что еÑли у Ð²Ð°Ñ 63 краÑных камнÑ, Ñто ничего не даÑÑ‚. Однако, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ 64 пыли, он Ñожмет 9 из них в блок из краÑного камнÑ. Ð¥Ð¾Ñ‚Ñ Ñто техничеÑки не Ð¸Ð´ÐµÐ°Ð»ÑŒÐ½Ð°Ñ ÑитуациÑ, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ ровно куча краÑной пыли, Ñто гарантирует, что вы не оÑтанетеÑÑŒ в пыли из-за полных карманов. ЕÑли приÑутÑтвуют другие моды, Ñто будет работать и Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… рецептов крафта. -guide.bloodmagic.entry.architect.bridge.info.1=Когда активировано и когда пользователь находитÑÑ Ð½Ð° твердой поверхноÑти, Сигилла Фантомного МоÑта затвердевает в воздухе под пользователем, так что они могут идти по нему, ÑоздаваÑ, по ÑущеÑтву, Фантомный МоÑÑ‚. Когда вы перемещаетеÑÑŒ в воздухе, моÑÑ‚ будет формироватьÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно под вами, позволÑÑ Ð²Ð°Ð¼ поймать ÑÐµÐ±Ñ Ð² воздухе, еÑли вы упадете. Ð¥Ð¾Ñ‚Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÐºÐ°Ð»Ð¸Ð±Ñ€Ð¾Ð²ÐºÐ° необходима Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Ñделать ее более Ñффективной Ð´Ð»Ñ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ перемещениÑ, а также горизонтального Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ быÑтром движении (из-за запаздываниÑ, мешающего Ñозданию моÑта), Ñто Ñффективный ÑпоÑоб Ñффективно летать в разные районы. -guide.bloodmagic.entry.architect.mimic.info.1=Мимики - Ñто тайные конÑтрукции, которые предназначены Ð´Ð»Ñ Ð¸Ð¼Ð¸Ñ‚Ð°Ñ†Ð¸Ð¸ того, на что они наÑтроены. Когда мимика вÑтупает в контакт Ñ ÐºÐ°ÐºÐ¾Ð¹-либо формой блока, его молекулы изменÑÑŽÑ‚ Ñвою ориентацию, чтобы принÑÑ‚ÑŒ форму, внешний вид и ощущение блока. Однако не вÑе ÑвойÑтва копируютÑÑ: например, нормальный мимичеÑкий блок при контакте Ñо ÑветÑщимÑÑ ÐºÐ°Ð¼Ð½ÐµÐ¼ не будет излучать никакой формы Ñвета. \n\tПри обычном иÑпользовании, еÑÑ‚ÑŒ два ÑпоÑоба иÑпользовать блок мнемоÑхемы. Первый - помеÑтить блок мнемоники вниз, а затем щелкнуть правой кнопкой мыши на мнемоÑхеме Ñ Ð±Ð»Ð¾ÐºÐ¾Ð¼, который вы хотите Ñкопировать. Это помеÑтит блок в мнемоÑхему и придаÑÑ‚ ей форму -default-. Таким образом, еÑли щелкнуть по леÑтнице мимику, она вÑегда будет ориентироватьÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾.\n\tВторой ÑпоÑоб заключаетÑÑ Ð² том, чтобы держать блок мимики в руке и нажимать клавишу Shift, щелкнув блок, который вы хотите заменить. Это заменит блок на мнемоÑхему, и мимик будет иметь ту же ориентацию, что и замененный блок. Это можно увидеть по леÑтницам и Ñундукам, а также по другим завиÑимым от ориентации блокам, таким как бревна.\n\tЕÑÑ‚ÑŒ неÑколько разных вариантов нормальной мимики. Ðепрозрачный мимик - Ñто имитатор по умолчанию, ÑпоÑобный принимать форму и общие ÑвойÑтва блоков - однако Ñвет не может проходить через них, поÑтому Ñледует Ñоблюдать оÑторожноÑÑ‚ÑŒ Ñо Ñтеклом. Ð’ Ethereal Opaque Mimic можно пройти без каких-либо проблем, поÑкольку у него нет хитбокÑа, который идеально подходит Ð´Ð»Ñ Ñкрытых дверных проемов. Блоки Clear Mimic работают так же, как и их непрозрачные варианты, однако они пропуÑкают Ñвет через них, даже еÑли он кажетÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñтью Ñплошным. Ðаконец, блок Lighted Mimic непрозрачен и Ñплошен, но незавиÑимо от того, что находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ него, он будет излучать Ñильный Ñвет. Ðет больше темных облаÑтей на вашей базе без факела Ñпам!\n\tЕÑÑ‚ÑŒ один оÑобый вариант подражаниÑ, к которому вы должны отноÑитьÑÑ Ñ Ð¾ÑторожноÑтью: чувÑтвующий подражатель. ЕÑли игрок подходит Ñлишком близко к одному из них в мире, он вÑтанет оттуда, где находитÑÑ, и нападет на Ð²Ð°Ñ Ñ Ð²Ñ‹Ñокой Ñтепенью ÑвирепоÑти. Их можно найти в Ñамых разных меÑтах, но оÑобенно они любÑÑ‚ подземельÑ. Однако еÑли имитировать Ñундук, будьте оÑторожны: они куÑаютÑÑ.\n\t*** Только Ð´Ð»Ñ Ñ‚Ð²Ð¾Ñ€Ñ‡ÐµÑкого иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ***\n\tЕÑÑ‚ÑŒ неÑколько интереÑных функций, которые вы можете добавить к любому блоку мнемоÑхемы, когда находитеÑÑŒ в творчеÑком режиме. ЕÑли вы щелкнете правой кнопкой мыши на мимике Ñ Ð·ÐµÐ»ÑŒÐµÐ¼ или флÑжкой Ñ Ð·ÐµÐ»ÑŒÐµÐ¼, вы можете уÑтановить мимику так, чтобы вокруг нее поÑвлÑлиÑÑŒ зельÑ, еÑли Ñ€Ñдом находитÑÑ Ð¸Ð³Ñ€Ð¾Ðº. ЕÑли Ñто Ð¾Ð±Ñ‹Ñ‡Ð½Ð°Ñ Ð¼Ð¸Ð¼Ð¸ÐºÐ°, и вы нажимаете на воÑточную или западную Ñторону, вы можете увеличивать или уменьшать радиуÑ, в котором будет поÑвлÑÑ‚ÑŒÑÑ Ð·ÐµÐ»ÑŒÐµ. ЕÑли вы нажмете на Ñеверную или южную Ñторону, вы можете увеличить или уменьшить радиуÑ, который имитирует проверим игроков вокруг него до поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð·ÐµÐ»Ð¸Ð¹. Ðаконец, нажатие на верхнюю или нижнюю чаÑÑ‚ÑŒ блока увеличит или уменьшит интервал Ð¿Ð¾Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·ÐµÐ»ÑŒÑ, который предÑтавлÑет Ñобой чиÑло тактов между опущенными зельÑми. \n\tЕÑли мимика ÑвлÑетÑÑ Ñ€Ð°Ð·ÑƒÐ¼Ð½Ð¾Ð¹ мимикой, вы можете нажать на мимику в любом меÑте, чтобы увеличить или уменьшить Ñ€Ð°Ð´Ð¸ÑƒÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð² - еÑли игрок находитÑÑ Ð² Ñтой облаÑти, и они могут видеть блок, мимика будет поÑвлÑÑ‚ÑŒÑÑ Ð¸ прыгать на игрока. \n\tДругое дело, что еÑли блок размещен на мнемоÑхеме, когда роÑÑыпь находитÑÑ Ð² креативе, то блок, который имитируетÑÑ, ÐЕ будет выпадать при уничтожении мимики. \n\t Ðаконец, еÑли мимик помещен в любой инвентарь или Ñундук, разумный мимик положит Ñундук на землю Ñ ÐµÐ³Ð¾ Ñодержимым поÑле Ð¿Ð¾Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ - вмеÑто Ñтого обычный мимик будет проÑто извергать Ñодержимое повÑюду, когда разбит. -guide.bloodmagic.entry.architect.downgrade.info=ПожалуйÑта, ознакомьтеÑÑŒ Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¾Ð¼ «ПокаÑние отмершей души» в «Ритуальном маÑтере», где подробно объÑÑнÑÑŽÑ‚ÑÑ, что Ñто такое, а также как их получить. - -guide.bloodmagic.entry.architect.augmentedCapacity.info=Руна дополненной ÑпоÑобноÑти функционирует аналогично Руне вмеÑтимоÑти в том ÑмыÑле, что она увеличивает емкоÑÑ‚ÑŒ Кровавого ÐлтарÑ. Тем не менее, неÑколько рун на одном алтаре начнут резонировать друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼, ÑкÑпоненциально ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ Ð²Ð¼ÐµÑтимоÑÑ‚ÑŒ. Одна руна Ñама по Ñебе увеличивает емкоÑÑ‚ÑŒ Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð½Ð° + 10%, однако она мультипликативно работает Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ рунами увеличенной вмеÑтимоÑти: еÑли еÑÑ‚ÑŒ две руны, Ñто увеличение на + 21%, три руны +33,1. %% увеличение и Ñ‚. д.\n\tК Ñожалению, Ñтот мультипликативный Ñффект не ÑкладываетÑÑ Ñ Ð ÑƒÐ½Ð¾Ð¹ ЕмкоÑти, то еÑÑ‚ÑŒ вы вÑе равно получите Ð±Ð¾Ð½ÑƒÑ + 2kLP за руну. -guide.bloodmagic.entry.architect.charging.info=ЗарÑÐ´Ð¾Ñ‡Ð½Ð°Ñ Ñ€ÑƒÐ½Ð° - одна из тех краÑавиц, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью изменит дейÑтвие Кровавого ÐÐ»Ñ‚Ð°Ñ€Ñ Ð½Ð° что-то, что может быть Ñочтено более полезным Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ оÑтановки. Медленно ÑÐ¸Ñ„Ð¾Ð½Ð¸Ñ€ÑƒÑ LP Ñ ÐšÑ€Ð¾Ð²Ð°Ð²Ð¾Ð³Ð¾ ÐлтарÑ, Руна ЗарÑдки начинает хранить «ЗарÑд», внутреннее значение Кровавого ÐлтарÑ, которое можно увидеть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Sigil of Sight. ЕÑли у Кровавого ÐÐ»Ñ‚Ð°Ñ€Ñ Ð´Ð¾Ñтаточно ЗарÑда, когда он получает что-то Ð´Ð»Ñ Ð¸Ð·Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, он немедленно иÑпользует требуемую ЗарÑдку и мгновенно Ñоздает предмет. ЕÑли зарÑда недоÑтаточно, веÑÑŒ зарÑд иÑпользуетÑÑ Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑÑа предмета в Ñоотношении зарÑд: LP 1: 1. \n\tМакÑимальное количеÑтво ЗарÑда, которое может быть Ñохранено в Ðлтаре Крови, ÑвлÑетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ количеÑтва ЗарÑжающих Рун, которое оно умножило на текущую емкоÑÑ‚ÑŒ Ð°Ð»Ñ‚Ð°Ñ€Ñ (емкоÑÑ‚ÑŒ Ð°Ð»Ñ‚Ð°Ñ€Ñ Ð²Ñтупает в Ñилу, только еÑли она превышает 20k) , СкороÑÑ‚ÑŒ, которую он зарÑжает, также напрÑмую ÑвÑзана Ñо ÑкороÑтью алтарÑ, умноженной на количеÑтво зарÑженных рун, и он будет конвертировать LP в зарÑд каждые 20 тиков (одна Ñекунда). Так что, еÑли бы вы разработали Ðлтарь Крови Ñ Ñтой руной, нужно будет тщательно раÑÑмотреть вÑе его ÑинергетичеÑкие отношениÑ. -guide.bloodmagic.entry.architect.acceleration.info=Ð’ отличие от большинÑтва рун, Руна уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð»ÑƒÑ‡ÑˆÐµ вÑего работает только в Ñочетании Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ рунами, и ее Ñффекты только увеличиваютÑÑ Ð´Ð¾ ограниченного количеÑтва. Эта руна увеличивает количеÑтво тактов обработки, которые могут произойти за определенный период времени, оÑобенно когда речь идет о Руне Ð¡Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ Руне ЗарÑдки. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ добавленной руны количеÑтво тактов перед Ñледующим тактом обработки уменьшаетÑÑ Ð½Ð° единицу. Ðапример, по умолчанию Руна ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ‚ÐµÑнÑет жидкоÑти Ñо ÑкороÑтью одной операции на 20 тиков - при 10 Рунах уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ñто проиÑходит Ñо ÑкороÑтью одной операции на 10 тиков.\n\tОчевидно, что макÑимальное количеÑтво рун уÑкорениÑ, которые в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð¼ÐµÑŽÑ‚ значение, ÑоÑтавлÑет 19 - еÑли у Ð²Ð°Ñ Ð¸Ñ… Ñтолько, Руна ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ Руна зарÑдки будут активировать Ñвои Ñффекты каждый тик. Noice! - -guide.bloodmagic.entry.architect.tier3.info=Хорошо извеÑтно, что алтарь Ð£Ñ€Ð¾Ð²Ð½Ñ 3 требует, чтобы вы закрыли четыре колонны блоками ÑветÑщихÑÑ ÐºÐ°Ð¼Ð½ÐµÐ¹ из ПуÑтоты. Что не так хорошо понÑто, так Ñто то, что вы можете вмеÑто Ñтого иÑпользовать МорÑкие Фонари. ПоÑтому, еÑли вы оказалиÑÑŒ очень далеко от перехода в ПуÑтоту, но у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ доÑтуп к океанÑким храмам, вы можете иÑпользовать другие ÑпоÑобы Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð² Магии Крови. - -# Demon Kin Entries -# TODO - -# Demon Kin Entry Texts -guide.bloodmagic.entry.demon.intro.info=ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚ Белла Хайборн, и Ñ Ð¸Ð·Ð²ÐµÑтна как Король Демонов. ÐеÑколько меÑÑцев назад на мою деревню напала волна демонов, убив вÑех оÑтальных людей и уничтожив вÑе зданиÑ. Я мало что помню о нападении,кроме криков боли, когда каждый человек, которого Ñ Ð·Ð½Ð°Ð», покидал Ñтот мир ради более ÑчаÑтливого. К ÑчаÑтью, демоны не уÑлышали менÑ, когда Ñ Ð·Ð°Ð±Ð¸Ð»Ð°ÑÑŒ под корзины Ñ Ñ„Ñ€ÑƒÐºÑ‚Ð°Ð¼Ð¸ в подвале церкви ИнтактилиÑ, отчаÑнно пытаÑÑÑŒ не дать Ñвоим крикам приÑоединитьÑÑ Ðº хору других голоÑов. \nБыл один ужаÑный момент, когда Ñ Ñлучайно опрокинула алтарь Ñ Ð±Ð»Ð°Ð³Ð¾Ð²Ð¾Ð½Ð¸Ñми в церкви, и демон ворвалÑÑ Ð² ÑвÑтилище, невозмутимый тем, что мы Ñчитали ÑвÑщенным меÑтом. Это было огромное четвероногое чудовище Ñ ÐºÑ€Ð¸Ð²Ñ‹Ð¼Ð¸ клыками, ÑвиÑающими из выÑтупающей паÑти, Ñлюна капала на зазубренные мечи вмеÑто когтей. Он оглÑдел комнату и, клÑнуÑÑŒ, на Ñекунду вÑтретилÑÑ Ñо мной взглÑдом, но потом проÑто ушел, Ñловно ничего не видел и не Ñлышал. Потом вÑе было как в тумане. \nПрошел целый день, прежде чем кто-то пришел поÑмотреть, что ÑлучилоÑÑŒ. Торговый караван увидел вдалеке дым и решил пройти длинным путем мимо демонов. Многие из торговцев даже не хотели Ñмотреть на менÑ, опаÑаÑÑÑŒ, что Ñто дурное предзнаменование, потому что только мне удалоÑÑŒ оÑтатьÑÑ Ð½ÐµÐ²Ñ€ÐµÐ´Ð¸Ð¼Ñ‹Ð¼. Ðо два брата решили ÑжалитьÑÑ Ð½Ð°Ð´Ð¾ мной и попытатьÑÑ ÑƒÐ±ÐµÐ´Ð¸Ñ‚ÑŒ оÑтальных членов каравана взÑÑ‚ÑŒ Ð¼ÐµÐ½Ñ Ñ Ñобой. Мне пришлоÑÑŒ продать жезл жрицы и заперетьÑÑ, но мне удалоÑÑŒ купить безопаÑный проход в деревню доÑтаточно далеко от пути демонов разрушениÑ. -guide.bloodmagic.entry.demon.snare.info.1=Однажды маг Ñказал мне, что у каждого живого ÑущеÑтва еÑÑ‚ÑŒ душа: люди, куры, овцы и даже ползучие раÑÑ‚ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°Ð´Ð°ÑŽÑ‚ жизненной Ñилой, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð´Ð°ÐµÑ‚ телу волю к жизни. КажетÑÑ, что маг в Ñвое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ» много ÑкÑпериментов и даже Ñлышал о могущеÑтвенном маге, который мог взÑÑ‚ÑŒ Ñти души и перелить их в пуÑтые ÑоÑуды, такие как зомби. Ðо Ñто заÑтавило Ð¼ÐµÐ½Ñ Ð·Ð°Ð´ÑƒÐ¼Ð°Ñ‚ÑŒÑÑ: еÑли у зомби и Ñкелетов не было души, как же у них была Ð²Ð¾Ð»Ñ Ðº жизни? Что заÑтавило их попытатьÑÑ Ð²Ñ‹Ñледить любое живое ÑущеÑтво и убить его? \n\tÐ’Ñе Ñто возвращалоÑÑŒ к Уиллу, каждый раз. Ð’Ñе "живое" должно иметь волю, чтобы выжить, но Ñто не значит, что оно должно быть их ÑобÑтвенным. Когда Ñ Ñ€Ð°ÑÑказал об Ñтом магу, он немного поразмыÑлил, а потом доÑтал доÑку и мел (откуда, кто знает) и начал набраÑывать какие-то заметки о других видах магии. - Ð’ Тавматургии, - Ñказал он, риÑÑƒÑ Ñ„Ð¸Ð³ÑƒÑ€Ñƒ Ñоломенного человека, - големы-Ñто живые ÑущеÑтва, которым поручено выполнÑÑ‚ÑŒ многие мирÑкие операции. Они живут, дышат и даже могут умереть, еÑли окажутÑÑ Ð² немилоÑти у Ñвоих хозÑев. Ð’ нынешней итерации Тауматургии, и да, на протÑжении веков ÑущеÑтвовало неÑколько верÑий Ñтого иÑкуÑÑтва, маг наполнÑл Ñвоей волей их неодушевленное творение и оживлÑл их.\n\t- Вот так, Белла, дейÑтвуют големы: Ñилой воли."\n\tТак что, еÑли голем может жить за Ñчет другого ÑущеÑтва, вкладывающего Ñвою волю в пуÑтую оболочку, возможно, какое-то другое ÑущеÑтво вкладывает Ñвою волю в тела мертвых, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð·Ð¾Ð¼Ð±Ð¸ и Ñкелеты. Тут Ñ Ð²Ð·Ð´Ñ€Ð¾Ð³Ð½ÑƒÐ», вÑпомнив, что произошло в моей Ñтарой деревне. Только демон ÑпоÑобен на такую жеÑтокоÑÑ‚ÑŒ. Ðо чтобы проверить Ñту гипотезу, мне нужно было больше доказательÑтв. -guide.bloodmagic.entry.demon.snare.info.2=По указанию мага и ТибериÑ, когда он мог протÑнуть руку помощи, Ñ Ñделал Ñебе рудиментарную ловушку из железа, веревки и куÑка краÑного камнÑ. Тиберий, глубоко изучавший Тавматургию как магию выбора между диÑциплинами, Ñказал, что Ñилок должен быть ÑпоÑобен нарушить волю ÑущеÑтва, управлÑющего одушевленным объектом. -Я возилÑÑ Ñ Ñтим, когда играл Ñ Ð³Ð¾Ð»ÐµÐ¼Ð°Ð¼Ð¸, - Ñказал он Ñ ÑƒÐ»Ñ‹Ð±ÐºÐ¾Ð¹. Мы вÑе знали, как хорошо вÑе обернулоÑÑŒ. - РедÑтоун, казалоÑÑŒ, нарушил ÑвÑзь между моими големами и моей волей к движению. ТеоретичеÑки, еÑли что-то управлÑет зомби или Ñкелетами, вы должны быть в ÑоÑтоÑнии отрезать волю."\n\tОн Ñказал, что вÑе, что мне нужно Ñделать, Ñто броÑить его - еÑли Ñто Ñработает, какаÑ-то Ð±ÐµÐ»Ð°Ñ Ð¿Ñ‹Ð»ÑŒ должна ÑтруитьÑÑ Ð¾Ñ‚ ÑущеÑтва в течение некоторого времени. "ПоÑтому вы должны убить его поÑле того, как Ñто произойдет, чтобы что-то дейÑтвительно произошло. Ðо ловушка может работать только в 25% Ñлучаев, поÑтому будьте немного либеральны Ñ Ð½Ð¸Ð¼Ð¸!"\n\tСотворив шеÑтнадцать из них, Ñ Ð²Ñ‹ÑˆÐµÐ» ночью Ñ Ð¼ÐµÑ‡Ð¾Ð¼. Ðа Ñамом деле Ñто было довольно Ñложно: мне пришлоÑÑŒ выÑледить неÑкольких зомби, нырÑÑ Ð¸ уворачиваÑÑÑŒ от их неуклюжих ударов, броÑÐ°Ñ Ð² них неÑколько Ñилков. Как только белые чаÑтицы отделилиÑÑŒ от них, Ñ Ð±Ñ‹Ñтро убил их и подобрал то, что оÑталоÑÑŒ от их тел. Ðебольшое количеÑтво голубой вÑзкой жидкоÑти, казалоÑÑŒ, лежало в пеÑчаной пыли, ÐœÐ°Ð½Ñ Ð¼ÐµÐ½Ñ. Я поднÑл его, и мне показалоÑÑŒ, что из жидкоÑти иÑходит какое-то потуÑтороннее "приÑутÑтвие". БыÑтро убрав образцы, Ñ Ñ€ÐµÑˆÐ¸Ð» взглÑнуть на них более глубоко, когда вернуÑÑŒ домой. \n\tКазалоÑÑŒ, что размер и форма каждой "демоничеÑкой воли" варьировалиÑÑŒ, как будто качеÑтво воли завиÑело от иÑточника. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñовершенно произвольную единицу измерениÑ, волÑ, которую Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ð» от Ñилков, кажетÑÑ, колеблетÑÑ Ð¾Ñ‚ Ð½ÑƒÐ»Ñ Ð´Ð¾ пÑти "волевых качеÑтв". Я не уверен, Ð´Ð»Ñ Ñ‡ÐµÐ³Ð¾ Ñ Ð¼Ð¾Ð³Ñƒ иÑпользовать Ñто вещеÑтво, но тем не менее Ñто очень интригующе. Я не могу Ñказать, отпечаток ли Ñто воли какого-то демона, или проÑто Ñлучайный криÑталл, найденный в их телах. Ðеобходимы дополнительные иÑÑледованиÑ. -guide.bloodmagic.entry.demon.forge.info.1=Я провел неÑколько недель, иÑÑÐ»ÐµÐ´ÑƒÑ Ð¸Ñпользование и ÑвойÑтва демоничеÑкой воли. Ð’ поÑледние неÑколько дней был некоторый уÑпех, однако он был нечаÑтым. Тиберий ÑпроÑил Ð¼ÐµÐ½Ñ Ð½Ð° днÑÑ…, может ли он взÑÑ‚ÑŒ образец демоничеÑкой воли Ð´Ð»Ñ Ð½ÐµÑкольких других Ñвоих ÑкÑпериментов: он упомÑнул, что Ñто может быть то, что ему нужно, чтобы поÑтроить новый кровавый алтарь, чтобы заменить побитый баÑÑейн, который мы иÑпользовали в подвале Мага, так как попытка воÑпроизвеÑти Ñту Ñтарую вещь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ только камнÑ, казалоÑÑŒ, никогда не Ñоздавала правильную... вмеÑтилище нашей магии крови. Другими Ñловами, он думает, что Ñто может помочь.\n\tОднако Ñто не было полной потерей! Я проÑмотрел неÑколько учебников по алхимии, в которых обÑуждалÑÑ "Ñквивалентный обмен" и множеÑтво различных ÑпоÑобов Ð¼Ð°Ð½Ð¸Ð¿ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸ÐµÐ¹. Я также поговорил Ñ Ð´Ð²ÑƒÐ¼Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸ÐºÐ°Ð¼Ð¸, которые проходили мимо, и они дали мне неÑколько Ñоветов о том, как деконÑтруировать материю и Ñнергию, чтобы изучить ее более внимательно. (КÑтати, Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° Ñказать, что мне нравилаÑÑŒ темно - Ñ„Ð¸Ð¾Ð»ÐµÑ‚Ð¾Ð²Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ, которую ноÑил один алхимик-проÑто глÑÐ´Ñ Ð½Ð° нее, Ñ Ñ‡ÑƒÐ²Ñтвовала, что Ð¼ÐµÐ½Ñ Ñ‚Ñнет какой-то плотный предмет. Ðе Ð³Ð¾Ð²Ð¾Ñ€Ñ ÑƒÐ¶Ðµ о Тиберии! ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñти проÑтые маÑÑивы Ñ Ð¼Ð°Ð»ÐµÐ½ÑŒÐºÐ¸Ð¼Ð¸ образцами, которые у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð»Ð¸, Ñ Ñмог увидеть, что еÑÑ‚ÑŒ ÑпоÑобы фактичеÑки подключитьÑÑ Ðº иÑточнику Ñнергии внутри демоничеÑкой воли. Мне проÑто нужна была Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ. -guide.bloodmagic.entry.demon.forge.info.2=Только ÑÐµÐ³Ð¾Ð´Ð½Ñ Ð¼Ð½Ðµ удалоÑÑŒ получить Ñтруктуру, котораÑ, как Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°Ð», объединит Ñлементы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту Ñырую волю. ÐÐ°Ð·Ð²Ð°Ð½Ð½Ð°Ñ "кузницей адÑкого огнÑ", Ñтруктура иÑпользует проÑтой маÑÑив алхимии, вырезанный в Ñтекле на его вершине, чтобы Ñплавить до четырех предметов вмеÑте, впрыÑÐºÐ¸Ð²Ð°Ñ ÐµÐ³Ð¾ Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑкой волей. ЧаÑÑ‚ÑŒ демоничеÑкой воли помещаетÑÑ Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¹ Ñтороны, а четыре ингредиента помещаютÑÑ Ð¿Ð¾ кругу. Похоже, что в Ñтой кузнице еÑÑ‚ÑŒ много разных "рецептов", но на них еÑÑ‚ÑŒ некоторые Ñффекты ÑтробированиÑ. \n\tÐ”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°, ÑущеÑтвует минимальное количеÑтво демоничеÑкой воли, которое должно быть в образце, чтобы Ñлементы объединÑлиÑÑŒ - еÑли в Ñтруктуре недоÑтаточно воли, ничего не проиÑходит. Далее, кажетÑÑ, что, Ñ…Ð¾Ñ‚Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ðµ количеÑтво воли, большинÑтво рецептов не иÑтощают веÑÑŒ образец Ñвоей воли. Ðекоторые рецепты требуют огромного количеÑтва демоничеÑкой воли Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы начать процеÑÑ, но только немного иÑпользуетÑÑ Ð² крафте, еÑли таковые вообще еÑÑ‚ÑŒ. Ðекоторые рецепты кажутÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ легкими Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² больших количеÑтвах, но другие... не Ñтолько. -guide.bloodmagic.entry.demon.petty.info.1=Я отправилÑÑ Ð² одно из Ñвоих ежедневных ночных приключений, чтобы Ñобрать немного демоничеÑкой воли, когда Ñ Ð½Ð°Ñ‡Ð°Ð» оÑознавать одну из главных проблем Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð¼ Ñбора: Ð¼Ð¾Ñ Ñумка продолжала наполнÑÑ‚ÑŒÑÑ Ð¾Ñ‚ вÑех образцов! По какой-то причине, возможно, потому, что конечный иÑточник демоничеÑкой воли различен Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ образца, Ð²Ð¾Ð»Ñ Ð½Ðµ будет ÑжиматьÑÑ Ð² более управлÑемую форму. По крайней мере, физичеÑкое проÑвление воли. \n\tТаким образом, Ñ Ð½Ð°Ñ‡Ð°Ð» работать Ñ Ð³Ð¾Ñ€Ð½Ð¾Ð¼ адÑкого огнÑ, который был раÑположен в моем углу дома, Ð¾Ñ‚Ð¾Ð´Ð²Ð¸Ð³Ð°Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ из наименее неприÑтных ÑкÑпериментов Ð¢Ð¸Ð±ÐµÑ€Ð¸Ñ Ð¸ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ Ñырье Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ ÑобÑтвенного иÑÑледованиÑ. Ðа днÑÑ… Ñ ÑобираюÑÑŒ Ñделать Ð¢Ð¸Ð±ÐµÑ€Ð¸Ñ ÐµÐ³Ð¾ ÑобÑтвенной кузницей, так как Ñ ÑƒÑтал пытатьÑÑ Ð¸Ð·Ð±Ð°Ð²Ð¸Ñ‚ÑŒÑÑ Ð¾Ñ‚ вÑей пыли, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾ÐºÑ€Ñ‹Ð²Ð°ÐµÑ‚ мое рабочее меÑто от его "тайных ÑкÑпериментов". Мне вÑе равно, что вы "пытаетеÑÑŒ преодолеть разрыв между Ñфирными нитÑми Ñети души и физичеÑкой конÑтрукцией Ñланцев", уберите Ñвой проклÑтый пепел из моих вещей! -guide.bloodmagic.entry.demon.petty.info.2=Как бы то ни было, потребовалоÑÑŒ времÑ, чтобы найти материалы, которые, Ñкорее вÑего, резонировали бы Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑкой волей, чтобы лучше хранить их. ЛÑпиÑ, по-видимому, Ñамый доÑтупный проводник Ñтой Ñнергии, дейÑтвующий как путь Ð´Ð»Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾Ð»Ð¸. Добавив немного редÑтона в качеÑтве защиты от ÑлектричеÑких полей в воздухе (Ñложение двух Ñнергий вмеÑте, кажетÑÑ, вызывает катаÑтрофичеÑкие поÑледÑтвиÑ, по крайней мере, так Ñказал МагуÑ), золото в качеÑтве демпфирующего агента и Ñтекло в качеÑтве проÑтого корпуÑа, мне удалоÑÑŒ Ñоздать очень проÑтой "винный камень". Это означает " Драгоценный камень из подземного мира, Тартар."\n\tПоÑле дальнейших теÑтов Ñ ÑƒÐ·Ð½Ð°Ð», что Ñтот камень может выдержать качеÑтво воли 64. (Когда Ñ Ð¿Ñ€ÐµÐ´Ñтавил Ñти результаты МагуÑу, он заметил, что Ñто похоже на хорошее круглое чиÑло.) Когда Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°Ð»ÑÑ Ð²Ð¿Ð¾ÑледÑтвии забрать демоничеÑкую волю, она, казалоÑÑŒ,шла прÑмо в камень, еÑли не была полной - поÑле Ñтого они проÑто казалиÑÑŒ... иÑчезнуть. Удобно Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ рюкзака, но в оÑтальном загадка. Я также узнал, что еÑли Ñ Ð´ÐµÑ€Ð¶Ñƒ камень в руке и фокуÑируюÑÑŒ (щелкнув правой кнопкой мыши), около 10% макÑимальной емкоÑти ÐºÐ°Ð¼Ð½Ñ Ð±ÑƒÐ´ÐµÑ‚ перетекать в другие камни, которые у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð»Ð¸ на моем лице. Я думаю, что Ñта поÑледнÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ полезна, оÑобенно еÑли мы найдем другие, более мощные татарÑкие камни. -guide.bloodmagic.entry.demon.sword.info.1=Мои Ñилки Ñнова запуталиÑÑŒ.\n\tКажетÑÑ, не имеет значениÑ, наÑколько Ñ ÑтараюÑÑŒ улучшить их дизайн, Ñ€ÑƒÐ´Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð½Ð°Ñ Ð»Ð¾Ð²ÑƒÑˆÐºÐ° никогда не работает идеально. Он проÑто запутываетÑÑ Ð±Ð¾Ð»ÑŒÑˆÑƒÑŽ чаÑÑ‚ÑŒ времени, и когда мне наконец удаетÑÑ ÑƒÐ´Ð°Ñ€Ð¸Ñ‚ÑŒ им зомби, Ñто Ñкорее не Ñработает, чем Ñработает. Чтобы не рвать на Ñебе волоÑÑ‹, Ñ Ñнова пошел в кузницу и Ñразу принÑлÑÑ Ð·Ð° работу.\n\tÐу, не Ñразу, так как Ñначала Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ был Ñнова очиÑтить пепел Ñверху. -guide.bloodmagic.entry.demon.sword.info.2=Я вливал железный меч в демоничеÑкие Ñилы воли мелкого татарÑкого Ñамоцвета,и мне удалоÑÑŒ Ñоздать клинок... был очень тупым и едва ли причинил больше вреда, чем мой кулак. Ðа Ñамом деле Ñ Ð±Ñ‹Ð» очень разочарован результатом, потому что потребовалоÑÑŒ много времени, чтобы возитьÑÑ Ñ Ð³Ð¾Ñ€Ð½Ð¾Ð¼, чтобы оно не перегрелоÑÑŒ от напрÑÐ¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании мелкого татарÑкого ÐºÐ°Ð¼Ð½Ñ Ð² качеÑтве иÑточника Ñнергии.\n\tОднако, как только Ñ Ð¿Ð¾Ð´Ð½Ñл Ñвой татарÑкий камень, меч начал ÑветитьÑÑ Ð½Ð¾Ð²Ð¾Ð¹ Ñнергией. КажетÑÑ, чем больше демоничеÑкой воли у Ð¼ÐµÐ½Ñ Ð½Ð° душе, тем больше вреда Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½ÑÑŽ мечом, а также тем больше демоничеÑкой воли падает. ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ камнÑ, то будет очень... мизерный.поÑле небольшого иÑÐ¿Ñ‹Ñ‚Ð°Ð½Ð¸Ñ Ñ Ð¿Ñ€Ð¸ÑˆÐµÐ» к другому пониманию: в завиÑимоÑти от того, кого Ñ ÑƒÐ±Ð¸Ð²Ð°ÑŽ, Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÑŽ разное количеÑтво воли. КажетÑÑ, пропорционально количеÑтву макÑимального здоровьÑ, которое имеет монÑÑ‚Ñ€-паук, так как у него макÑимальное здоровье 8 Ñердец дает 80% воли зомби, у которого 10 Ñердец. Это, вероÑтно, потому, что Ñти монÑтры требуют больше воли, чтобы оживить. Я должен иметь Ñто в виду на потом. -guide.bloodmagic.entry.demon.lesser.info.1=Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ñ Ð±ÐµÑедовал Ñ Ð¢Ð¸Ð±ÐµÑ€Ð¸ÐµÐ¼, обÑуждал некоторые проекты, над которыми он работает. Должен Ñказать, когда мы начинаем говорить о его иÑÑледованиÑÑ…, кажетÑÑ, что он вÑе продолжает и продолжает! Как бы то ни было, одним из недавних изобретений, о которых он хотел поговорить, были его Ñигилы: до Ñих пор ему удавалоÑÑŒ Ñоздавать водный и лавовый Ñигилы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð°Ð´Ñкую кузницу, которую Ñ, наконец, поÑтроил Ð´Ð»Ñ Ð½ÐµÐ³Ð¾, как ÑредÑтво Ð´Ð»Ñ Ð¸Ñ… ÑозданиÑ. Я не был до конца уверен, как он их делал - Ñ Ð·Ð½Ð°Ð», что он ÑкÑпериментировал, ÑÐ¾Ð±Ð¸Ñ€Ð°Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ ингредиенты и ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€ÑƒÑ Ð¸Ñ… внутри кузницы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ‚Ð°Ñ‚Ð°Ñ€Ñкий камень в качеÑтве катализатора, но Ñ ÐµÑ‰Ðµ не видел, чтобы он активно ÑкÑпериментировал. Ðу, Ñ Ð½Ð°ÐºÐ¾Ð½ÐµÑ†-то понÑл, Ð´Ð»Ñ Ñ‡ÐµÐ³Ð¾ он иÑпользует Ñтот чертов пепел.\n\tПоÑмотрим, Ñмогу ли Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ то, что он Ñказал. Гм. - ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ð¾Ð»ÑŽ демона, заключенную в Ñтих камнÑÑ…, чтобы преобразовать ингредиенты, проиÑходит Ñ€ÐµÐ°ÐºÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ вещами, которые обычно ничего не делают, когда объединÑÑŽÑ‚ÑÑ. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту вынужденную Ñинергию, Ñ Ð¼Ð¾Ð³Ñƒ впиÑать неÑколько тайных Ñимволов в узоры, которые направÑÑ‚ Ñнергию, которую Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑŽ Ñебе Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð¹ задачи."Ð¥Ð¾Ñ‚Ñ Ñто не очень хорошо видно в пиÑьменной форме, предÑтавьте, что Ñ Ð³Ð¾Ð²Ð¾Ñ€ÑŽ Ñто, Ñдвинув очки на переноÑицу. Я не уверен, что он обычно такой, но Ñ ÐºÐ»ÑнуÑÑŒ, он получает вÑе... наукой, когда он мне вÑе объÑÑнÑет.\n\tВо вÑÑком Ñлучае, он показал мне, как он Ñоздал водный знак, продемонÑтрировав его мне. ПоÑле, по общему признанию, Ñркой демонÑтрации, он перешел к Ñути диÑкуÑÑии. "Когда Ñ Ð¿Ñ‹Ñ‚Ð°ÑŽÑÑŒ воÑпроизвеÑти Ñтот процеÑÑ Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ более продвинутыми материалами, кажетÑÑ, что реагенты имеют тенденцию... взрываетÑÑ Ð¿Ñ€Ð¸ добавлении в маÑÑив алхимии. Они кажутÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ неÑтабильными. Я думаю, что ингредиенты не ÑплавлÑÑŽÑ‚ÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ‹Ð¼ образом - возможно, в кузнице недоÑтаточно Ñнергии, чтобы Ñплавить их должным образом."\n\tПодумав об Ñтом неÑколько минут, Ñ Ð¿Ñ€Ð¸Ñтупил к работе - как Ñ ÑƒÐ¶Ðµ упоминал в предыдущей запиÑи, Ñ Ñ€ÐµÑˆÐ¸Ð», что потребуетÑÑ Ð±Ð¾Ð»ÐµÐµ мощный татарÑкий камень, но Ñ Ð²Ñе еще не понÑл, как Ñ Ð¼Ð¾Ð³Ñƒ Ñделать Ñто Ñлегантным ÑпоÑобом. Итак, Ñ Ñ€ÐµÑˆÐ¸Ð», что Ð´Ð»Ñ Ñтого будет доÑтаточно подхода грубой Ñилы! -guide.bloodmagic.entry.demon.lesser.info.2=Я взÑл блок ЛÑпиÑа, блок краÑного ÐºÐ°Ð¼Ð½Ñ Ð¸ бриллиант, а также пуÑтой мелкий татарÑкий камень, который лежал вокруг - чаÑÑ‚ÑŒ прошлого ÑкÑперимента... вÑе прошло не очень хорошо. Ð’Ñе, что Ñ Ð¼Ð¾Ð³Ñƒ Ñказать об Ñтом, Ñто то, что Ñ ÑƒÐ´Ð¸Ð²Ð»ÐµÐ½, что маг может Ñделать отверÑÑ‚Ð¸Ñ Ð² твердой бетонной Ñтене проÑто иÑчезнуть. Затем Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½Ð¸Ð» Ñти четыре предмета в кузнице адÑкого Ð¾Ð³Ð½Ñ Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ñ‹Ð¼ мелким татарÑким камнем, чтобы дейÑтвовать как иÑточник Ñнергии-кажетÑÑ, требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ 60 воли. ПоÑле некоторого уÑилиÑ, пытаÑÑÑŒ найти оптимальное раÑположение, Ñ Ñобрал их вмеÑте и наблюдал, как пуÑтой камень начал раÑти внутри кузницы.\n\tПроÑто в качеÑтве примечаниÑ, Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚Ð°Ð»ÑÑ Ð¸Ñпользовать блок золота вмеÑто алмаза, чтобы выраÑтить драгоценный камень, но, похоже, что наличие другой криÑталличеÑкой Ñтруктуры было более полезным.\n\tЭтот новый, "меньший татарÑкий камень", похоже, имеет гораздо большую емкоÑÑ‚ÑŒ, ÑпоÑобную вмеÑтить в общей ÑложноÑти 256 Ñырых Воль. ÐадеюÑÑŒ, Ñтого доÑтаточно, чтобы удовлетворить потребноÑÑ‚ÑŒ Ð¢Ð¸Ð±ÐµÑ€Ð¸Ñ Ð² большом количеÑтве воли на некоторое времÑ. Ðо, увы, похоже, мне придетÑÑ Ð¿Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ Ñтот драгоценный камень. Еще одна Ð´Ð¾Ð»Ð³Ð°Ñ Ð½Ð¾Ñ‡ÑŒ впереди! -guide.bloodmagic.entry.demon.reactions.info=Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ñ Ð¿Ñ€Ð¾ÑнулаÑÑŒ на больничной койке, иÑÐ¿Ñ‹Ñ‚Ñ‹Ð²Ð°Ñ Ñильную боль. Я открыл глаза и увидел туÑкло-пурпурный потолок крыла больницы "интенÑивное проклÑтие" в ВетереÑе, ближайшем к нашей деревне крупном городе. ÐœÐµÐ½Ñ Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ оÑобенно беÑпокоила: она наÑтолько озадачила менÑ, что Ñ ÐºÐ°ÐºÐ¸Ð¼-то образом оказалÑÑ Ð·Ð´ÐµÑÑŒ, покрытый только царапинами и ÑинÑками, Ð¿Ð»ÑŽÑ Ð¿Ñ€Ð¾Ñтой Ð³Ð¸Ð¿Ñ Ð½Ð° левой ноге. Кто-то, должно быть, наложил на Ð¼ÐµÐ½Ñ Ð¿Ñ€Ð¾ÐºÐ»Ñтие "Ossa Fracta" или что-то в Ñтом роде, так как Ñто могла быть проÑто ÑÐ»Ð¾Ð¼Ð°Ð½Ð½Ð°Ñ ÐºÐ¾ÑÑ‚ÑŒ! \n\tКогда ÐœÐ°Ð³ÑƒÑ Ð²Ð¾ÑˆÐµÐ» Ñ Ð¾Ð´Ð½Ð¾Ð¹ из медÑеÑтер Ñ Ñерьезным лицом, Ñ Ð·Ð½Ð°Ð», что Ñто было что-то более радикальное. Очевидно, один из моих ÑкÑпериментов Ñ Ð½Ð¾Ð²Ñ‹Ð¼ камнем малого ÐºÐ°Ð¼Ð½Ñ Ð¾Ñ‚Ñкочил и вызвал небольшой, но мощный взрыв. Это Ñ Ð¼Ð¾Ð³ понÑÑ‚ÑŒ доÑтаточно легко, но Ñто было не так: ÑмеÑÑŒ обÑидиана, железа и Ðлмаза, которую Ñ Ð¸Ñпользовал, покрывала мою нижнюю левую ногу, Ð¾Ð±Ñ€Ð°Ð·ÑƒÑ Ð¶ÐµÑткую оболочку, которую Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ð»Ð¾ удалить. ГипÑ, который был у Ð¼ÐµÐ½Ñ Ð½Ð° ноге, на Ñамом деле не был гипÑом, а какой-то формой руничеÑкой матрицы, покрывающей Ñветло-голубую оболочку. \n\tЯ Ñпокойно ÑпроÑил, что думает МагуÑ, Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹Ð» Ñовершенно уверен в том, что произошло. -Я думаю,-Ñказал он, иÑкоÑа взглÑнув на медÑеÑтру, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ð½Ð¸Ð¼Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾ Ñлушала, прежде чем Ñнова поÑмотреть на менÑ,-что Ñто проÑто какой-то оÑадок на оÑнове алмазов, и Ñто Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°, по которой мы не можем его удалить. Он также пронизан немного... потуÑтороннÑÑ ÑнергиÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвлÑетÑÑ Ð¾Ñновной причиной того, что вы здеÑÑŒ вмеÑто кровати в меÑтной клинике - конгломерат довольно Ñтрог в отношении неизвеÑтной Ñнергии, непоÑредÑтвенно контактирующей Ñ Ð»ÑŽÐ´ÑŒÐ¼Ð¸, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð¸Ð½Ñ†Ð¸Ð´ÐµÐ½Ñ‚Ð° Eldritch, поÑтому мы должны были убедитьÑÑ, что не было никаких проблем."\n\t- Понимаю...- Обычно маг не утруждает ÑÐµÐ±Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ формальноÑÑ‚Ñми, как получение информации от конгломерата о неизвеÑтных ÑнергиÑÑ… - Ñ Ð´Ð¾Ð²Ð¾Ð»ÑŒÐ½Ð¾ долго ÑкÑпериментировал Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑкой волей, и Ñто не похоже на то, что конгломерат поÑтучал в нашу дверь, чтобы зарегиÑтрировать Ñту магию. Я не буду вдаватьÑÑ Ð² подробноÑти, так как Ñ Ð½Ðµ очень хорошо разбираюÑÑŒ в политике, но Ñ Ð·Ð½Ð°ÑŽ, что маг учаÑтвует в ней очень редко. Это означало, что Ñила Ñтой воли Ñильно беÑпокоила МагуÑа, возможно, из-за некоторых его прошлых Ñделок...?\n\t- Ðу ладно, пока хватит об Ñтом, - Ñказал маг, Ð·Ð°ÐºÐ°Ñ‚Ñ‹Ð²Ð°Ñ Ñ€ÑƒÐºÐ°Ð²Ð° мантии. -Я пыталÑÑ Ñ€Ð°Ð·Ð±Ð¸Ñ‚ÑŒ Ñкорлупу, когда впервые увидел ее, очевидно, проверив, что Ñто такое. Ð’ прошлый раз Ñто не подейÑтвовало, но теперь подейÑтвовало..."\n\tÐа моей левой ноге был обжигающий жар, Ñопровождаемый оÑлепительным краÑным Ñветом, когда ÐœÐ°Ð³Ð½ÑƒÑ Ñложил ладони на голубой раковине. КазалоÑÑŒ, прошла Ñ†ÐµÐ»Ð°Ñ Ð²ÐµÑ‡Ð½Ð¾ÑÑ‚ÑŒ, но, должно быть, прошло вÑего неÑколько Ñекунд, прежде чем оболочка начала треÑкатьÑÑ Ð¸ раÑÑыпатьÑÑ Ð½Ð° чаÑти. ЧеÑтно говорÑ, Ñто было немного разочаровывающе. \n\tЯ попыталÑÑ Ð²Ñтать, но Халдей толкнул Ð¼ÐµÐ½Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ в кровать. - Белла, тебе нужно оÑтатьÑÑ Ð¸ отдохнуть. Ð’Ñ‹ можете поработать Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ иÑÑледованиÑми о драгоценных камнÑÑ… позже."Сначала Ñ Ð±Ñ‹Ð» раздражен, но вÑкоре Ñто прошло, так как у Ð¼ÐµÐ½Ñ Ð±Ñ‹Ð»Ð¾ много времени, чтобы подумать. ЕдинÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°, по которой ÐœÐ°Ð³ÑƒÑ Ð½Ðµ Ñмог Ñделать то же Ñамое раньше, вероÑтно, потому, что у Ð¼ÐµÐ½Ñ Ð²Ñе еще был мой татарÑкий камень поÑле взрыва. ПоÑтому, что бы ни ÑлучилоÑÑŒ Ñ Ð¼Ð¾ÐµÐ¹ ногой, Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° была быть напрÑмую ÑвÑзана Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¾Ð¼ Уиллом, и как только мой камень был взÑÑ‚, раковину можно было ÑнÑÑ‚ÑŒ. Это заÑтавило Ð¼ÐµÐ½Ñ Ð·Ð°Ð´ÑƒÐ¼Ð°Ñ‚ÑŒÑÑ... -guide.bloodmagic.entry.demon.sentientGem.info.1=ПоÑле неÑкольких дней "хорошо необходимого поÑтельного режима", предпиÑанного и навÑзанного магом, Ñ Ñ€ÐµÑˆÐ¸Ð» провеÑти небольшое иÑÑледование в первую очередь на разумном оборудовании, которое Ñ Ñделал до Ñих пор. ЕÑÑ‚ÑŒ только так много, что Ñ Ð½Ðµ знаю о разумном мече, а также демон будет в целом. Конечно, мы знаем кое-что из теории, но, учитываÑ, что маг и Ñ Ð±Ñ‹Ð»Ð¸ теми, кто разработал теорию в первую очередь, трудно Ñказать, наÑколько она точна.\n\tÐ”Ð»Ñ Ñтого мне нужно было проÑвить творчеÑкий подход. Маг Ñказал мне, что вÑÑкий раз, когда он берет ученика, он наÑтаивает, что они должны изучать другую форму магии нарÑду Ñ Ð¸ÑÑледованиÑми, которые он проводит. Тиберий предложил мне изучать ботанику, но Ñ Ð¿Ð¾ÑмеÑлаÑÑŒ над Ñтой идеей - букет цветов не очень-то поможет мне в борьбе Ñ Ð´ÐµÐ¼Ð¾Ð½Ð°Ð¼Ð¸! -guide.bloodmagic.entry.demon.sentientGem.info.2=Sentient Armour Gem-Ñто переключаемый предмет, который иÑпользуетÑÑ Ð´Ð»Ñ Ð¾ÑÐ½Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸ оÑÐ½Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ¹ чувÑтвительной брони. Когда вы щелкнете Правой Кнопкой Мыши Ñ Ð´Ñ€Ð°Ð³Ð¾Ñ†ÐµÐ½Ð½Ñ‹Ð¼ камнем, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ минимум 16 демонов в инвентаре, ваша Ð±Ñ€Ð¾Ð½Ñ Ð±ÑƒÐ´ÐµÑ‚ заменена набором разумных доÑпехов, который копирует вÑе Ð·Ð°ÐºÐ»Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸Ð· брони, которую вы заменили - когда вы активируете драгоценный камень Ñнова, ваша Ð¾Ñ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ÑÑ Ðº вам. Это также работает, когда у Ð²Ð°Ñ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ нет брони.\n\tÐ Ð°Ð·ÑƒÐ¼Ð½Ð°Ñ Ð±Ñ€Ð¾Ð½Ñ Ð¿ÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾ дейÑтвует как проÑтой набор железных доÑпехов, не Ð´Ð°Ð²Ð°Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ… дополнительных ÑпоÑобноÑтей, кроме защиты. Однако, как и другие разумные инÑтрументы, Ð±Ñ€Ð¾Ð½Ñ Ð¾Ð±ÐµÑпечивает большую защиту, когда у Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ демоничеÑкой воли. Это делает защиту, предоÑтавлÑемую дейÑтвительно мощным, когда у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ большое количеÑтво демона будет накоплено. ÐедоÑтатком Ñтого ÑвлÑетÑÑ Ñ‚Ð¾, что каждый удар будут Ñифон маленький куÑочек демон из винной камней, и еÑли вы получаете Ñлишком низок броню вернетÑÑ Ðº Ñвоей первоначальной форме. Может быть плохо! -guide.bloodmagic.entry.demon.routing.info=ТранÑпортировка предметов в магии крови проиÑходит от ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð¸Ñ‚ÐµÐ¹ демоничеÑкой воли между узлами маршрутизации, которые дейÑтвуют как каналы Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ предметов из одного Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð² другой. Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° давайте объÑÑним, как работает каждый отдельный Ñлемент.\n\tÐšÐ°Ð¶Ð´Ð°Ñ ÑиÑтема маршрутизации нуждаетÑÑ Ð² Главном узле маршрутизации, который дейÑтвует как мозг ÑиÑтемы. Входной узел маршрутизации вводит Ñлементы в ÑиÑтему, а выходной узел маршрутизации выводит Ñлементы из ÑиÑтемы, а обычный узел маршрутизации не имеет Ñпециальной функции.\n\tЧтобы Ñформировать Ñеть, необходимо щелкнуть узел Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ узла, а затем щелкнуть другой узел, который требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ. Это ÑвÑзывает два узла вмеÑте. Пока узел может отÑлеживать некоторую форму маршрута к другому узлу (и еÑли он подключен к главному узлу маршрутизации), они могут "разговаривать" друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼.\n\tКак правило, Ñлементы извлекаютÑÑ Ð¸Ð· Ð¸Ð½Ð²ÐµÐ½Ñ‚Ð°Ñ€Ñ Ñ€Ñдом Ñ Ð²Ñ…Ð¾Ð´Ð½Ñ‹Ð¼ узлом и помещаютÑÑ Ð² инвентарь Ñ€Ñдом Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼ узлом. Чтобы уÑтановить, что куда идет, Ñледует иÑпользовать фильтр. Ðажав на одну из кнопок в интерфейÑе узла, вы можете выбрать, что входит в инвентарь в заданном направлении (N указывает на Ñевер и Ñ‚. д.). ЕÑли помеÑтить фильтр Ñлементов в Ñамый левый Ñлот узла, можно указать количеÑтва и типы Ñлементов, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ узел может взаимодейÑтвовать на оÑнове фильтра. При уÑтановке фильтра на входном фильтре можно извлекать только Ñти типы номенклатур из запаÑов (ÑохранÑÑ, по крайней мере, заданную Ñумму, еÑли указано количеÑтво). ЕÑли фильтр уÑтановлен на фильтре вывода, можно только перемеÑтить Ñти типы номенклатур в запаÑ, не более указанного количеÑтва.\n\tСущеÑтвует четыре типа фильтров: \n\tТочный-Ñлемент должен быть точно ÑопоÑтавлен, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ NBT и метаданные\n\tMod Item-предмет ÑоответÑтвует, еÑли он из одного из отфильтрованных модов.\n\tИгнорировать NBT - фильтр Ñлементов не учитывает NBT\n\tРудный Ñловарь - допуÑкаетÑÑ Ð»ÑŽÐ±Ð¾Ð¹ Ñлемент, ÑоответÑтвующий одной из ÑÑылок Рудного ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð².\n\tЕÑÑ‚ÑŒ два чиÑла, которые вы Ñможете увидеть при вÑтавке фильтра в узел маршрутизации: количеÑтво и приоритет. При нажатии на один из Ñлементов в фильтре поÑвитÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ выбранного Ñлемента, а прÑмо под ним-количеÑтво Ñлементов. УÑтановив Ñтот номер, вы можете указать фильтру, Ñколько из Ñтого типа номенклатуры он будет хранить на Ñкладе в подключенном инвентаре (либо заполнÑÑ Ñту Ñумму, еÑли Ñто выходной узел, либо убедившиÑÑŒ, что он ÑохранÑет Ñту Ñумму, оÑтавленную в инвентаре, еÑли Ñто входной узел). ЕÑли вы уменьшите количеÑтво фильтра до 0, вы можете уÑтановить так, чтобы фильтр разрешал "вÑе", как в любом количеÑтве, Ð´Ð»Ñ Ñтого конкретного фильтра. Входные узлы будут вытÑгивать как можно больше из инвентарÑ, а выходные узлы будут толкать как можно больше.\n\tВторое чиÑло-Ñто приоритет узла, изменÑемый кнопками Ñо Ñтрелками Ñ€Ñдом Ñ Ð½Ð¸Ð¼. Это чиÑло отличаетÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтороны узла. Сначала будет иÑпользоватьÑÑ ÑƒÐ·ÐµÐ» Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ номером в Ñети. -guide.bloodmagic.entry.demon.aura.info=Когда ÑущноÑÑ‚ÑŒ убита нормально, она Ñо временем иÑпарÑетÑÑ Ð¸ возвращаетÑÑ Ðº Творцу. Когда он попадает в ловушку, он втÑгиваетÑÑ Ð² Ñтот план из Ñфирного и как бы заÑтревает. У Ð½Ð°Ñ ÐµÑÑ‚ÑŒ, Ð´Ð»Ñ Ð²Ñех намерений и целей, нарушена его программированиÑ, и он заморозил вÑе дейÑтвиÑ. Когда мы Ñжигаем его, он возвращаетÑÑ Ð² Ñфирное ÑоÑтоÑние и может возобновить нормальные операции. ЕÑли Ñто впрыÑкиваетÑÑ Ð² воздух, то мы можем иÑпользовать его в различных направлениÑÑ…. Ðекоторые из них мирÑкие по Ñвоей природе, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº другие довольно могущеÑтвенны.\n\tДемон будет при инъекции в воздух оÑтаетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ куÑка, который он был введен без миграции. Каждый куÑок имеет Ñвою ÑобÑтвенную Ñохраненную волю, причем каждый тип воли хранитÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ (подробнее об Ñтом в другом разделе). Это будет доÑтупно и управлÑÑ‚ÑŒÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ блоками и Ñлементами. -guide.bloodmagic.entry.demon.types.info=До Ñих пор единÑтвенный тип демоничеÑкой Воли, который мы обÑуждали, - Ñто Ð½ÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð²Ð¾Ð»Ñ. Как Ñледует из названиÑ, Ñто ÑÐ°Ð¼Ð°Ñ Ð³Ñ€ÑƒÐ±Ð°Ñ Ð¸ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÐ»ÑŒÐ½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° воли, но Ñто не значит, что она чиÑта. Ðа Ñамом деле, Ð²Ð¾Ð»Ñ Ð´ÐµÐ¼Ð¾Ð½Ð° принимает много различных форм: Ñырой-Ñто тип, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ мы имеем дело обычно, но еÑÑ‚ÑŒ также разъедающий, разрушительный, мÑтительный и Ñтойкий. ÐÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð²Ð¾Ð»Ñ ÑоÑтоит из ÑмеÑи вÑех четырех Ñтих типов и, возможно, Ñмешана Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸, еще не открытыми типами, но поÑле Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð° Ñти различные типы воли кажетÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ð¼ их рекомбинировать.\n\tПока неÑÑно, проиÑходÑÑ‚ ли Ñти разные типы воли из разных иÑточников, однако мы знаем процеÑÑ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ Ñтих разных типов воли. Ритуальный " Ñ€ÐµÐ·Ð¾Ð½Ð°Ð½Ñ Ð³Ñ€Ð°Ð½ÐµÐ½Ð¾Ð³Ð¾ криÑталла "может раÑколоть необработанный КриÑталл воли на его чиÑтые чаÑти, подробнее об Ñтом в ÑоответÑтвующей запиÑи в"ритуальном МаÑтере". УÑтройÑтво, ÑпоÑобное получать необработанные криÑталлы воли, - Ñто криÑталлизатор демона, вход в который находитÑÑ Ð½Ð¸Ð¶Ðµ.\n\tКаждый из Ñтих четырех типов воли предÑтавлÑет различные аÑпекты желаниÑ. Могут быть и другие типы воли, однако они либо недоÑтаточно чиÑÑ‚Ñ‹, либо проÑто не могут быть Ñозданы в Ñтой форме.\n\tÐšÐ¾Ñ€Ñ€Ð¾Ð·Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑтавлÑет Ñобой желание разрушить вÑе вокруг ÑебÑ, либо киÑлотой, либо Ñокрушительной Ñилой. Тот, кто может овладеть Ñтой волей, может обладать оÑлаблÑющими ÑтатуÑными Ñффектами и невоÑприимчив к ужаÑным Ñдам.мÑтительноÑÑ‚ÑŒ можно раÑÑматривать как желание без уÑтали иÑкать цель. Обычно Ñто можно раÑÑматривать либо как увеличение ÑкороÑти тела, чтобы иÑкать Ñвою добычу, либо чтобы убедитьÑÑ, что цель не в ÑоÑтоÑнии уйти, как вы поÑтоÑнно атакуете их.\n\tРазрушение, как вы, вероÑтно, можете Ñказать, Ñто чиÑÑ‚Ð°Ñ Ñила. Сила атаки и Ð¾Ð±Ñ‰Ð°Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð´Ð¾Ð±Ð»ÐµÑÑ‚ÑŒ могут быть получены, еÑли Ñта Ð²Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹Ð¼ образом обуздана. Его можно также иÑпользовать Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы задавить и поломать вещи при иÑпользовании в других применениÑÑ….\n\tСтойкоÑÑ‚ÑŒ раÑÑматриваетÑÑ ÐºÐ°Ðº желание предотвратить вред Ñебе. Ð’ большинÑтве Ñлучаев хозÑева Ñтой воли ÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ð¾Ñ€Ð¾Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ оплотом партии, ÑпоÑобным противоÑтоÑÑ‚ÑŒ мощным атакам и даже не чувÑтвовать их. ЕÑли вам нужно оÑтатьÑÑ Ð² живых, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ доÑпехов или ритуалов, Ñто один из вариантов, который Ñледует раÑÑмотреть. -guide.bloodmagic.entry.demon.crucible.info=Тигель демона-Ñто уÑтройÑтво, которое ÑпоÑобно Ñжечь волю демона внутри ÐºÐ°Ð¼Ð½Ñ Ð¸ других предметов, чтобы ввеÑти его в ауру куÑка, в котором он находитÑÑ. ЕÑÑ‚ÑŒ неÑколько различных ÑпоÑобов иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¸Ð³Ð»Ñ: один из Ñамых проÑÑ‚Ñ‹Ñ… ÑпоÑобов-помеÑтить камень внутри тиглÑ, щелкнув по нему правой кнопкой мыши Ñ ÐºÐ°Ð¼Ð½ÐµÐ¼ в руке. Ð’ Ñтом Ñлучае тигель будет Ñливать волю из драгоценного ÐºÐ°Ð¼Ð½Ñ Ð´Ð¾ тех пор, пока аура не будет наÑыщена Ñтим типом воли (макÑимум 100 по умолчанию) или пока драгоценный камень не опуÑтеет.\n\tДругой ÑпоÑоб - иÑпользовать ÑодержащийÑÑ Ð² камне винный камень, чтобы Ñлить волю из ауры-Ñто делаетÑÑ Ð¿ÑƒÑ‚ÐµÐ¼ подачи Ñильного Ñигнала краÑного ÐºÐ°Ð¼Ð½Ñ Ð² тигель, а затем ÑодержащийÑÑ ÐºÐ°Ð¼ÐµÐ½ÑŒ попытаетÑÑ Ñлить как можно больше воли.\n\tÐаконец, отдельный куÑочек воли может быть Ñожжен в тигле, еÑли в ауре такого типа доÑтаточно меÑта. Одним из примеров Ñтого ÑвлÑетÑÑ ÐšÑ€Ð¸Ñталл воли демона, который имеет значение 50. -guide.bloodmagic.entry.demon.crystallizer.info=Как уже говорилоÑÑŒ ранее, аура демона-Ñто Ñфирное проÑвление воли демона, а вещеÑтво, получаемое при убийÑтве толпы, - ее физичеÑкое проÑвление. КриÑталлизатор демона дейÑтвует как Ð¯ÐºÐ¾Ñ€Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° Ð´Ð»Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑкой воли в ауре, чтобы зацепитьÑÑ, ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·ÑƒÑ Ñфирную волю обратно в физичеÑкую форму Ñнова в форме криÑталла.\n\tВам может быть интереÑно, почему вы проÑто не берете волю из татарÑкого ÐºÐ°Ð¼Ð½Ñ Ð½Ð°Ð¿Ñ€Ñмую и не формируете из нее КриÑталл. Это проиÑходит потому, что, транÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€ÑƒÑ Ð²Ð¾Ð»ÑŽ в ее Ñфирную форму, мы очищаем ее и позволÑем воле попытатьÑÑ Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Ñвои обычные дейÑÑ‚Ð²Ð¸Ñ - имейте в виду, что когда мы убиваем монÑтра Ñ Ð´ÐµÐ¼Ð¾Ð½Ð¸Ñ‡ÐµÑкой волей, прикрепленной к ним, мы замораживаем Программирование воли, чтобы она не могла делать то, Ð´Ð»Ñ Ñ‡ÐµÐ³Ð¾ она была поÑлана. ÐŸÑ€ÐµÐ¾Ð±Ñ€Ð°Ð·ÑƒÑ ÐµÐ³Ð¾ в Ñфирную форму в ауре, Ð²Ð¾Ð»Ñ ÑтановитÑÑ Ð±Ð¾Ð»ÐµÐµ активной, и Ñто та волÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñхвачена криÑталлизатором. Только не Ñмотри на Ñто Ñмешно.\n\tÐ”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы криÑталлизатор демона работал, он должен быть в куÑке Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом демоничеÑкой воли (80) определенного типа, и через определенное количеÑтво времени он будет потреблÑÑ‚ÑŒ волю из ауры, чтобы Ñоздать клаÑтер криÑталлов демона Ñ Ð¾Ð´Ð½Ð¸Ð¼ шпилем. ЕÑÑ‚ÑŒ два ÑпоÑоба работы криÑталлизатора: он может Ñформировать КриÑталл из определенного типа воли (агреÑÑивной, разрушительной, мÑтительной и Ñтойкой), еÑли будет доÑтаточно воли Ñтого конкретного типа, или он возьмет Ñырую волю из ауры, чтобы Ñоздать КриÑталл. \n\tÐ’ предыдущих воплощениÑÑ… уÑтройÑтва было возможно транÑформировать Ñырую волю из ауры в криÑталлы Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ направлениÑми. Однако Ñто уже не так: вы вÑе еще можете Ñоздавать новые шпили определенной уÑтремленной воли, еÑли ее доÑтаточно в ауре, однако вам нужно будет иÑкать другие ÑредÑтва, чтобы отделить многие аÑпекты от Ñырой воли. Более подробно Ñмотрите запиÑÑŒ "Ñ€ÐµÐ·Ð¾Ð½Ð°Ð½Ñ Ð³Ñ€Ð°Ð½ÐµÐ½Ð¾Ð³Ð¾ КриÑталла" в ритуальном МаÑтере. -guide.bloodmagic.entry.demon.cluster.info=КлаÑтер криÑталлов демона может быть Ñоздан либо КриÑталлизатором демона, либо путем ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в кузнице адÑкого Ð¾Ð³Ð½Ñ Ñ ÐºÑ€Ð¸Ñталлами демона воли. Обработанные клаÑтеры могут быть размещены на любой твердой поверхноÑти, такой как пол, Ñтены и потолки. Ðа криÑталле еÑÑ‚ÑŒ макÑимум Ñемь шпилей, когда он полноÑтью выроÑ, и когда он Ñломан киркой, он уронит шпили, как демон криÑталлы. Однако, еÑли вы щелкните правой кнопкой мыши клаÑтер, когда у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ Виннокаменный камень Ñ Ð±Ð¾Ð»ÐµÐµ чем 1024 необработанной волей внутри него, вы можете Ñломать один шпиль из клаÑтера, не Ð½Ð°Ñ€ÑƒÑˆÐ°Ñ Ñам клаÑтер; Ñто никогда не Ñломает главный шпиль клаÑтера.\n\tПредоÑтавленный Ñамому Ñебе, клаÑтер будет Ñифонировать некую волю того же типа из ауры, чтобы раÑти медленно. Этот процеÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ медленный, но еÑÑ‚ÑŒ небольшой чиÑтый выигрыш.\n\tЕÑÑ‚ÑŒ два ритуала, которые иÑпользуютÑÑ Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ñ‰Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñбора Ñтих криÑталлов:" Ñбор покинутых душ "и"трещина разбитого КриÑталла". Чтобы узнать, как их иÑпользовать, обратитеÑÑŒ к маÑтеру ритуала. -guide.bloodmagic.entry.demon.pylon.info=Как вы, возможно, знаете, аура демона оÑтаетÑÑ Ð² Ñвоем ÑобÑтвенном куÑке, еÑли нет никаких внешних влиÑний. Ðу, Ñто одно из таких влиÑний. Пилон демона дейÑтвует как маÑк Ð´Ð»Ñ Ð’Ð¾Ð»Ð¸ в ауре, вытÑÐ³Ð¸Ð²Ð°Ñ Ð²Ð¾Ð»ÑŽ из ÑоÑедних куÑков (тех куÑков, которые находÑÑ‚ÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно Ñ€Ñдом Ñ Ð½Ð¸Ð¼ в четырех кардинальных направлениÑÑ…, а не по диагонали) в Ñвой куÑок. Пилон попытаетÑÑ ÑƒÑ€Ð°Ð²Ð½ÑÑ‚ÑŒ волю в Ñвоем куÑке Ñо Ñвоим ÑоÑедом так, чтобы у куÑка пилона было Ñтолько же воли, Ñколько у его выÑшего ÑоÑеда Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ типа. Однако Ñтот процеÑÑ Ð¿Ñ€Ð¾Ð¸Ñходит только в одном направлении: еÑли в ÑоÑеднем куÑке меньше воли, чем в куÑке пилона, Ð’Ð¾Ð»Ñ Ð½Ðµ будет передавать другое направление. -guide.bloodmagic.entry.demon.gauge.info=Чтобы Ñказать, Ñколько у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ в данном куÑке, вам нужно, чтобы демон измерил. Когда в вашем инвентаре, датчик будет отображать волю в куÑке, который у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ в пÑти барах в левом верхнем углу Ñкрана. Ð’Ñ‹ можете Ñказать, Ñколько точно, Ñдвинув; чиÑла поÑвÑÑ‚ÑÑ Ñправа от баров, чтобы дать Ñумму, округленную до ближайшего целого чиÑла. - - - -# Alchemy Entries -guide.bloodmagic.entry.alchemy.intro=Ð’Ñтупление -guide.bloodmagic.entry.alchemy.ash=Тайный пепел -guide.bloodmagic.entry.alchemy.speed=Движение МаÑÑив -guide.bloodmagic.entry.alchemy.updraft=МаÑÑив обновлений -guide.bloodmagic.entry.alchemy.bounce=Прыгающий маÑÑив -guide.bloodmagic.entry.alchemy.turret=Револьверный Ñкелет маÑÑива -guide.bloodmagic.entry.alchemy.buff=ОÑлаблÑющие маÑÑивы -guide.bloodmagic.entry.alchemy.fastMiner=МаÑÑив Fast Miner -guide.bloodmagic.entry.alchemy.furnace=Сжигание печи маÑÑив -guide.bloodmagic.entry.alchemy.teleport=МаÑÑив Ñ‚ÐµÐ»ÐµÐ¿Ð¾Ñ€Ñ‚Ð°Ñ†Ð¸Ñ -guide.bloodmagic.entry.alchemy.standardTurret=МаÑÑив турель -guide.bloodmagic.entry.alchemy.laputa=ОÑколок Лапута - - -# Alchemy Entry Texts -guide.bloodmagic.entry.alchemy.intro.info=ÐœÐµÐ½Ñ Ð·Ð¾Ð²ÑƒÑ‚ Влад Хайборн, и Ñ Ð¼Ð°Ð³ крови. Я изучал Ñложную работу алхимии и процеÑÑ "Ñквивалентного обмена", который управлÑет вÑеми аÑпектами магии. Ð’ принципе, вы не можете Ñоздать что-то из ничего, Ñ…Ð¾Ñ‚Ñ Ð¼Ð½Ð¾Ð³Ð¸Ðµ пыталиÑÑŒ при поиÑке определенного камнÑ. Это, очевидно, не закончилоÑÑŒ хорошо, потому что люди требуют поддельного варианта даже ÑегоднÑ. Конечно, проÑто Ñказать, что Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸Ðº, недоÑтаточно, потому что одна из главных вещей, которую Ñ Ð´ÐµÐ»Ð°ÑŽ, Ñто изучаю магию крови Ñ Ñ€Ð¸Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ð¼ маÑтером и архитектором, оба из которых доÑтигли Ñтих титулов по Ñвоим ÑобÑтвенным заÑлугам. Маг и Тиберий были занÑÑ‚Ñ‹ запиÑью Ñвоих ÑобÑтвенных работ на протÑжении многих лет, Ñ…Ð¾Ñ‚Ñ Ñ Ð½Ðµ думаю, что у мага вÑе запиÑано в книге - Ñ ÐµÑ‰Ðµ не нашел никаких фактичеÑких доказательÑтв.Ð¼Ð¾Ñ ÐºÐ½Ð¸Ð³Ð° поÑвÑщена вÑем алхимичеÑким вещам в магии крови. От иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð¹Ð½Ð¾Ð³Ð¾ пепла до Ñложной работы таблицы алхимии, вы найдете вÑе, что вам нужно знать о некоторых из более Ñложных Ñлементов в мире. Ðе вÑе, что вам нужно знать, еÑÑ‚ÑŒ в Ñтой книге - Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¼Ð°Ð³Ð¸Ð¸ крови вам нужно будет прочитать другие запиÑи во вÑем Ñтом томе.\n\tBut а пока, надеюÑÑŒ, вам понравÑÑ‚ÑÑ Ð¼Ð¾Ð¸ запиÑи. Ты не найдешь никакой лжи между Ñтими покрывалами. -guide.bloodmagic.entry.alchemy.ash.info=Arcane Ash необходим Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Ñоздавать алхимичеÑкие маÑÑивы, мощные круги, которые ÑпоÑобны обеÑпечить различные Ñффекты. Этот пепел изготовлен Ñ Ð¸Ñпользованием Hellfire Forge и Demon Will, поÑтому, еÑли вы новичок в Ñтой концепции, обратитеÑÑŒ к "Королю демонов"." \n\tПепел имеет в общей ÑложноÑти двадцать применений, прежде чем вам нужно Ñоздать другой. Когда вы щелкните правой кнопкой мыши по земле (или Ñтене, Ñ…Ð¾Ñ‚Ñ Ð¾Ð½Ð° будет отображать только одно направление), вы напишете проÑтой круг из пепла. ЕÑли вы Ñнова нажмете на золу Ñ Ñлементом, он будет" помещен внутри золы " - предполагаÑ, что Ñтот Ñлемент дейÑтвителен, круг изменит форму, чтобы предÑтавить, что он готов к Ñледующему Ñлементу. ЕÑли он не менÑет форму, значит, вы Ñделали что-то не так.\n\tПоÑле того, как он изменил форму, вы можете помеÑтить во вторичный Ñлемент. ЕÑли Ñтот Ñлемент Ñовпадает Ñ Ð¿ÐµÑ€Ð²Ñ‹Ð¼ Ñлементом, круг начнет вращатьÑÑ Ð¸ выполнÑÑ‚ÑŒ различные дейÑÑ‚Ð²Ð¸Ñ Ð² завиÑимоÑти от рецепта, над которым он работает. \n\tКаждый не-крафтовый Ñффект, который можно выполнить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñтих маÑÑивов, можно найти в Ñтой книге, и даже еÑли рецепт изменитÑÑ Ñ‡ÐµÑ€ÐµÐ· 3rd party, он будет отображатьÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼ здеÑÑŒ. Показанные Ñлементы-Ñто порÑдок, в котором они должны быть размещены. -guide.bloodmagic.entry.alchemy.speed.info=МаÑÑив Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñоздает небольшой вихрь воздуха в его центре и иÑпользует небольшое количеÑтво Ñнергии Ð´Ð»Ñ ÐµÐ³Ð¾ нагрева. ПоÑле Ñтого, как только животное или любой другой тип ÑущеÑтва войдет в зону его дейÑтвиÑ, они будут запущены вперед в том направлении, в котором он был помещен Ñилой воздуха. Более того, еÑли упаÑÑ‚ÑŒ Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ выÑоты, маÑÑив уÑтранит урон от падениÑ, который был бы нанеÑен. ПроÑто будьте готовы к некоторым мÑгким движением опоÑлÑ. \n\tÐаправление движениÑ-в направлении Ñтрелки на маÑÑиве.\n\tСледует также отметить, что вы получите гораздо большее раÑÑтоÑние, еÑли упадете или прыгнете на маÑÑив, чем еÑли бы вы проÑто вошли в его облаÑÑ‚ÑŒ. Это ÑвÑзано Ñ Ñ‚ÑƒÑ€Ð±ÑƒÐ»ÐµÐ½Ñ‚Ð½Ð¾Ñтью ваших движений, вызывающей гораздо большую реакцию. -guide.bloodmagic.entry.alchemy.updraft.info=ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ‚Ðµ же принципы, что и маÑÑив Movement, Ñтот маÑÑив запуÑкает объект, который Ñтупает поверх него вертикально в воздухе. ЕÑтеÑтвенно, любой пользователь должен быть оÑторожен, потому что путь вниз может быть немного трудным! -guide.bloodmagic.entry.alchemy.bounce.info=ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ñточник тепла вблизи Ñвоего центра, который толкаетÑÑ Ð²Ð½Ð¸Ð·, маÑÑив пытаетÑÑ ÑмÑгчить землю под ним. ПоÑле Ñтого он преобразует углерод и водород в резиновый материал внутри Земли. Эта ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ñет любую ÑущноÑÑ‚ÑŒ ударить поверхноÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы отÑкочить в воздухе и иÑключать повреждение Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ðµ в противном Ñлучае было бы терпеть. Этот отÑкок может быть оÑтановлен проÑтым перемещением, и он вÑе равно ÑмÑгчит ваше падение. -guide.bloodmagic.entry.alchemy.turret.info=ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð²Ð¾Ð»ÑŽ демона, который вÑе еще контролирует толпу, вы можете захватить разум Ñкелета, чтобы заÑтавить его выполнÑÑ‚ÑŒ ваши приказы. ЕÑли Ñкелет окажетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ облаÑти Ñтого маÑÑива, он будет дейÑтвовать как чаÑовой и атаковать враждебных монÑтров поблизоÑти. К Ñожалению, Ñтот маÑÑив вÑе еще очень ÑкÑпериментален, поÑтому он может работать не очень хорошо или поÑледовательно. -guide.bloodmagic.entry.alchemy.buff.info=Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ñ‚Ñ‰Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¼Ñƒ изучению вы понимаете, что алхимичеÑкие маÑÑивы имеют широкий Ñпектр приложений. До Ñих пор вам удавалоÑÑŒ Ñоздавать мощные предметы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ крафтовых маÑÑивов, а также неÑкольких маÑÑивов, которые обеÑпечивают функциональные преимущеÑтва, такие как быÑтрое движение и Ñлабые формы телепортации. Однако одно из применений, которое вам еще предÑтоит иÑпользовать, - Ñто предоÑтавление мощных буферов через активный маÑÑив.\n\t"Бафф-маÑÑивы" - Ñто общий термин Ð´Ð»Ñ Ð°Ð»Ñ…Ð¸Ð¼Ð¸Ñ‡ÐµÑких маÑÑивов, которые предоÑтавлÑÑŽÑ‚ некоторый бафф игрокам в пределах Ñвоей облаÑти дейÑтвиÑ. Эти зоны влиÑÐ½Ð¸Ñ Ð¸Ð¼ÐµÑŽÑ‚ тенденцию иметь очень большой радиуÑ, которым Ð½ÐµÐ»ÑŒÐ·Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ (в отличие от ритуалов). Однако, поÑкольку алхимичеÑкие маÑÑивы не имеют понÑÑ‚Ð¸Ñ Ð¾ Ñети душ, они должны питать Ñвои Ñффекты другими ÑредÑтвами: в оÑновном через прÑмые кровавые подношениÑ.Проще говорÑ, Ñто означает, что вÑÑкий раз, когда маÑÑив будет применÑÑ‚ÑŒ бафф, он повредит (возьмет HP) у игрока, на которого он брошен. \n\tИз-за прÑмого характера Ñтих жертв преобразование HP - > buff намного более благоприÑтно Ð´Ð»Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ¾Ð² в ранней игре по Ñравнению Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ баффами в моде. Ðапример, еÑли бафф из Ñигила Ñтоит 100 ЛП за 10 Ñекунд активации, более мощный бафф может быть применен маÑÑивом за 30 Ñекунд за 1 ЛП (что ÑоÑтавлÑет 100 ЛП в алтаре T1 без рун). Это можно раÑÑматривать как намного более Ñффективное на ранних уровнÑÑ…, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº на более поздних уровнÑÑ… Ñто не так Ñффективно. Однако, из-за Ñтационарной природы маÑÑивов, они, как правило, обеÑпечивают более Ñильный Ñффект, чем их Ñигил-Ñчетчики, поÑтому люди могут захотеть иÑпользовать его в конце игры. -guide.bloodmagic.entry.alchemy.fastMiner.info=Когда поÑтавлена задача вырезать большую площадь земли, иногда лучше вÑего проÑто Ñделать Ñто вручную. Ð”Ð»Ñ Ñ‚Ð°ÐºÐ¸Ñ… Ñлучаев, Ñтот маÑÑив Ð´Ð»Ñ Ð²Ð°Ñ. МаÑÑив применÑет Haste III buff к игрокам в радиуÑе 10 блоков, что Ñтоит пользователю 1 HP за 30 Ñекунд. Потому что Ñто Ð¾Ð±Ñ‰Ð°Ñ Ñпешка бафф, он также увеличит ÑкороÑÑ‚ÑŒ атаки в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº в Ñвоей облаÑти Ñффекта, Ñ…Ð¾Ñ‚Ñ Ð²Ð°Ð¼ придетÑÑ Ð±Ñ‹Ñ‚ÑŒ оÑторожным, так как другие игроки тоже выиграют от Ñтого! -guide.bloodmagic.entry.alchemy.furnace.info=Одна из многих проблем, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы можете ÑтолкнутьÑÑ Ð² начале Ñвоего приключениÑ, - Ñто неÑпоÑобноÑÑ‚ÑŒ поддерживать огонь в печи. ГорÑÑ‰Ð°Ñ Ð¿ÐµÑ‡ÑŒ может означать разницу между полным желудком и Ñильным оружием или голодом в пещере. \n\tГорÑщий маÑÑив печи, как Ñледует из названиÑ, обеÑпечит Ñтоль необходимый иÑточник тепла Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ близлежащей печи. Ð Ð°Ð·Ð¼ÐµÑ‰Ð°Ñ Ð¼Ð°ÑÑив непоÑредÑтвенно Ñ€Ñдом Ñ Ð²Ð°Ð½Ð¸Ð»ÑŒÐ½Ð¾Ð¹ печью (он может быть Ñ€Ñдом Ñ Ð½ÐµÑколькими), он обеÑпечит топливо Ð´Ð»Ñ Ð¿ÐµÑ‡Ð¸, еÑли Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть завершена - ничего не произойдет, еÑли она находитÑÑ Ñ€Ñдом Ñ Ð¿ÑƒÑтой или полной печью, в оÑновном Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ защиты. \n\tОднако Ñто не беÑплатно: когда человек находитÑÑ Ñ€Ñдом (в радиуÑе 10 кварталов), он заберет половину Ñердца здоровьÑ, чтобы приготовить до двух вещей в печи. Это будет полезно либо быÑтро перекуÑить, либо раÑплавить полный штабель руды, но, к Ñожалению, вы не нашли ÑпоÑоба добавить какие-либо меры безопаÑноÑти в маÑÑив... -guide.bloodmagic.entry.alchemy.teleport.info=МаÑÑив телепортации дейÑтвует как ÑпоÑоб мгновенно перемещатьÑÑ Ð¸Ð· одного меÑта в другое Ñ Ð½ÐµÑколькими конкретными ограничениÑми. Когда игрок или другой объект входит в маÑÑив, маÑÑив будет иÑкать до 20 блоков в направлении, в котором он ÑталкиваетÑÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ маÑÑивом алхимии (который не должен быть активным). ЕÑли маÑÑиву удаÑÑ‚ÑÑ ÑƒÑпешно найти пункт назначениÑ, он телепортирует объект в найденный маÑÑив мгновенно, даже через Ñтены. \n\tИзучение Ñтого маÑÑива показало, что к нему добавлÑÑŽÑ‚ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ ограничениÑ: из-за природы изгиба ткани проÑтранÑтва-времени маÑÑив телепортации не будет телепортировать то, что телепортировалоÑÑŒ в течение 2 Ñекунд. Это должно дать Ð²Ñ€ÐµÐ¼Ñ Ð²Ñем компонентам переÑтроитьÑÑ Ð¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ образом. -guide.bloodmagic.entry.alchemy.standardTurret.info=Ðевозможно переоценить Ñилу Ð¼ÐµÑ‚Ð°Ð½Ð¸Ñ Ð¾Ñтрых предметов в далеких монÑтров. Ð‘Ð°ÑˆÐµÐ½Ð½Ð°Ñ Ñ€ÐµÑˆÐµÑ‚ÐºÐ° ÑпоÑобна ощутить близкого враждебного монÑтра и, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñложные алхимичеÑкие механизмы, ÑпоÑобна отÑтупить и выÑтрелить Ñтрелой, чтобы поразить Ñвою цель. \ n \ t маÑÑив ищет инвентарь непоÑредÑтвенно под ним. ЕÑли он найдет нормальную или наклоненную Ñтрелку, он будет Ñифон из Ñвоего контейнера и ÑтрелÑÑ‚ÑŒ в толпу, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² радиуÑе 32 блока. \n\t(Из-за какой-то глупой физики Minecraft, в которой Ñтрелки отÑкакивают от объектов, которые Ñлишком близки к тому, где они поÑвлÑÑŽÑ‚ÑÑ, Ð±Ð°ÑˆÐ½Ñ Ñ‚Ð°ÐºÐ¶Ðµ будет ÑтрелÑÑ‚ÑŒ только по толпе, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ, чем в 3 кварталах. Имейте Ñто в виду!) -guide.bloodmagic.entry.alchemy.laputa.info=СущеÑтвует иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾ потерÑнном королевÑтве, которое обладало такой развитой магией, что могло летать Ñквозь облака. Ð¥Ð¾Ñ‚Ñ Ñто королевÑтво Ñ Ñ‚ÐµÑ… пор раÑÑыпалоÑÑŒ в пыль, неÑколько риÑунков Ñтого замка в небе Ñумели предоÑтавить изыÑканные детали механизмов, которые позволили ему Ñтать легендой, что Ñто так. \n\tОÑколок Лапуты превращает ÑущноÑÑ‚ÑŒ жизни, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Земли, в более птичью форму, заÑтавлÑÑ Ð¾ÐºÑ€ÑƒÐ¶Ð°ÑŽÑ‰ÑƒÑŽ облаÑÑ‚ÑŒ левитировать в воздухе. Ð¥Ð¾Ñ‚Ñ Ð¾Ñновной принцип проÑÑ‚, вариации жизненной ÑущноÑти Земли вызывают некоторую непоÑледовательноÑÑ‚ÑŒ в том, Ñколько Земли перемещаетÑÑ. МаÑÑив будет перемещать землю в ÑферичеÑком радиуÑе между 4 и 8 блоками над Ñобой Ñлучайное Ñмещение между одним и 5 блоками Ð¿Ð»ÑŽÑ Ð´Ð²Ð°Ð¶Ð´Ñ‹ Ñ€Ð°Ð´Ð¸ÑƒÑ Ñффекта. \n\tСледует отметить, что как только начнетÑÑ Ñффект, вÑе Ñлементы, иÑпользуемые Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ маÑÑива, будут потерÑны. diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang deleted file mode 100644 index 37b61615..00000000 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_CN.lang +++ /dev/null @@ -1,270 +0,0 @@ -# Book Information -guide.bloodmagic.title=血染知书 -guide.bloodmagic.display=血染知书 -guide.bloodmagic.author=血魔法 -guide.bloodmagic.welcome=血魔法 - -# Page Information -guide.bloodmagic.page.bloodAltar=血之祭å›åˆæˆ -guide.bloodmagic.page.soulForge=狱ç«ç†”炉åˆæˆ -guide.bloodmagic.page.tier=层级:%d -guide.bloodmagic.page.lp=LP: %d -guide.bloodmagic.page.minimumWill=å¯åŠ¨æ‰€éœ€æ„志:%f -guide.bloodmagic.page.drainedWill=åˆæˆæ¶ˆè€—æ„志:%f -guide.bloodmagic.shapelessOrb=æ— åºå®ç åˆæˆ -guide.bloodmagic.shapedOrb=有åºå®ç åˆæˆ -guide.bloodmagic.page.alchemyArray=炼金法阵 - - -# Categories -guide.bloodmagic.category.architect=缔造者 -guide.bloodmagic.category.ritual=仪å¼å¤§å¸ˆ -guide.bloodmagic.category.demon=æ¶é­”ä¹‹å­ -guide.bloodmagic.category.spell=战法师 -guide.bloodmagic.category.alchemy=炼金术士 - -# Ritual Master Entries -guide.bloodmagic.entry.ritual.intro=åº -guide.bloodmagic.entry.ritual.basics=仪å¼å…¥é—¨ -guide.bloodmagic.entry.ritual.ritualStone=仪å¼çŸ³ -guide.bloodmagic.entry.ritual.masterRitualStone=主仪å¼çŸ³ -guide.bloodmagic.entry.ritual.activationCrystal=激活水晶 -guide.bloodmagic.entry.ritual.diviner=仪å¼æŽ¨æµ‹æ– -guide.bloodmagic.entry.ritual.fullSpring=æ¶Œæ³‰ä»ªå¼ -guide.bloodmagic.entry.ritual.lava=下界夜曲 -guide.bloodmagic.entry.ritual.greenGrove=ç»¿ä¸›ä»ªå¼ -guide.bloodmagic.entry.ritual.magnetism=ç£åŠ›ä»ªå¼ -guide.bloodmagic.entry.ritual.crusher=æŒ–æŽ˜ä»ªå¼ -guide.bloodmagic.entry.ritual.highJump=é«˜è·³ä»ªå¼ -guide.bloodmagic.entry.ritual.speed=é€Ÿç§»ä»ªå¼ -guide.bloodmagic.entry.ritual.wellOfSuffering=苦难之井 -guide.bloodmagic.entry.ritual.featheredKnife=ç¾½åˆ€ä»ªå¼ -guide.bloodmagic.entry.ritual.regen=é‡ç”Ÿä»ªå¼ -guide.bloodmagic.entry.ritual.harvest=满月收割 -guide.bloodmagic.entry.ritual.interdiction=ç¦æ­¢ä»ªå¼ -guide.bloodmagic.entry.ritual.containment=ç‰µåˆ¶ä»ªå¼ -guide.bloodmagic.entry.ritual.suppression=æŠ‘æ¶²ä»ªå¼ -guide.bloodmagic.entry.ritual.expulsion=驱é€æ°›åœº -guide.bloodmagic.entry.ritual.zephyr=和风之唤 -guide.bloodmagic.entry.ritual.laying=é“ºè®¾ä»ªå¼ -guide.bloodmagic.entry.ritual.timberman=ä¼æž—ä»ªå¼ -guide.bloodmagic.entry.ritual.meteor=å æ˜Ÿæ ‡ä½ -guide.bloodmagic.entry.ritual.downgrade=沉é‡çµé­‚çš„å¿æ‚” -guide.bloodmagic.entry.ritual.crystalSplit=结晶共鸣 - -# Ritual Master Entry Text -guide.bloodmagic.entry.ritual.intro.info=晚上好,我就是马格斯·阿尔å¡çº³ã€‚在外人看æ¥æˆ‘有很多身份:盗贼ã€è‡ªè­¦å›¢ã€å·«å¸ˆã€æˆ˜å£«ã€åŸæ¸¸è¯—人ã€ç”šè‡³æ”¿æ²»å®¶ã€‚而现在,åªæœ‰å°‘数人清楚地知é“我的头衔——åªéœ€æåŠä¸€ä¸‹ï¼Œé‚£è‡†æƒ³ä¸­çš„残暴图景就å¯ä»¥ä»¤äººé—»é£Žä¸§èƒ†â€”—纵使这个说法有一åŠæ˜¯è¯¯å¯¼ï¼Œä½†è¿™ä¸ªè¯´æ³•æœ‰ä¸€åŠçš„确是真相。诚然,我说的便是作为èŒä¸šå­˜åœ¨çš„血法师。我的朋å‹ä¸€èˆ¬éƒ½ç›´å‘¼æˆ‘çš„å,而我的敌人一般称我为仪å¼å¤§å¸ˆã€‚\n\t/cut现在呢,我的学生们,为了让我把毕生所学传播给下一代有志者们,缠在我身边已有数月了。我一直在åšå®ˆç§˜å¯†ï¼Œä½†æ比略对此的评论更为精辟:“尽管你自己还看ä¸åˆ°ä½ è‡ªå·±çš„潜力,但ä¸è®ºæ˜¯åœ¨ä»€ä¹ˆé­”法领域中,那些已臻化境的大师们的故事总是对下一代人有好处的。然而,é‡çŽ°å¥‡è¿¹çš„细节其实并没有那么é‡è¦ã€‚若是没有对魔法能é‡çš„ç»å¯¹è‡ªä¿¡ï¼Œå³ä¾¿æ˜¯é‡‘沙,也ä¸è¿‡æ˜¯ä¸€å †ç¡«ç£ºç²‰è€Œå·²ã€‚â€å½“然你å¯ä»¥è®¤ä¸º/cutä»–å·²ç»è§¦ç¢°åˆ°äº†ç‚¼é‡‘术的真谛,但他毕竟是我的第一个学生,我有时候也会认真æ€è€ƒä»–的想法。\n\t所以呢,那些ä»åœ¨è‹¦è‹¦å¯»æ‰¾å‰è¿›çš„é“路的年轻血法师们,且å¬æˆ‘一言:血魔法的领域之广阔ä¸æ˜¯å¸¸äººå¯ä»¥ç†è§£çš„,若ä¸åŠ æ€è€ƒåœ°å‰è¿›ï¼Œå¾ˆå¿«ä½ å°±ä¼šé‡åˆ°ç“¶é¢ˆã€‚因此,请务必时常翻阅这本书——这本书上有我的魔法,åªè¦æˆ‘写下æ¥æ–°çš„内容,你们就能立刻看到。\n\t/cut诸ä½è¯·å。ä¸è¦ç´§å¼ ï¼Œè¯•ç€åŽ»æ„Ÿå—è€ä¸€è¾ˆè¡€æ³•å¸ˆçš„教诲。或许会比你讨价还价求到的东西还è¦æœ‰ç”¨ã€‚ -guide.bloodmagic.entry.ritual.basics.info=现在的魔法仪å¼å·²ç»å’Œå‡ ç™¾å¹´å‰å¤§ä¸ä¸€æ ·äº†ã€‚曾几何时,人们用粉末在地上组æˆé­”法阵,并在æ—边起舞,直到获得想è¦çš„东西。我甚至记得有一ä½ä»Žå¥¹è‡ªå®¶èŠ±å›­ä¸­æ”¶é›†é­”法能é‡çš„éšå£«ã€‚我一直都在嘲笑这ç§é­”法,直到她把她的猫头鹰丢过æ¥ç›‘视我。\n\t而血魔法师的仪å¼å‘¢ï¼Œéœ€è¦ç”¨åˆ°ä¸€ç§å¸¦ç‰¹æ®Šæ ‡è®°çš„石头,并且需è¦æŒ‰æŒ‡å®šæ–¹å¼ç²¾ç¡®æ‘†æ”¾ï¼Œæ–¹èƒ½è½¬åŒ–注入的能é‡ã€‚有一/cut天,我的学徒æ比略在他的新房间里翻找我过去的仪å¼èµ„料。那里有一ç½ä»Žæœªå¼€å°è¿‡çš„液æ€Etherium(我好åƒè¯´è¿‡å¾ˆå¤šæ¬¡è¦æŠŠå®ƒå–回æ¥ä½†æ¯æ¬¡è¯´å®Œå°±å¿˜äº†ï¼‰ï¼Œä»¥åŠä¸€ä¸ªé€è¿‡é•œç‰‡çœ‹æ—¶æ€»åƒæ˜¯åœ¨è¯´â€œæ˜ŸæœŸäºŒâ€çš„水晶çƒã€‚当有一个标有“符文尘埃â€çš„ç®±å­è¢«æ‰“ç¿»åŽï¼Œä¸€é¢—å°å°çš„红色å®çŸ³æ»šäº†å‡ºæ¥ï¼Œæ»šåˆ°äº†æ比略的脚下。霎那间,它å‘出的明亮的红å®çŸ³çš„光芒和他抱ç€çš„ç®±å­é‡Œçš„粉末å‘生了å应。\n\t/cut——自然地,瞬间爆炸。æ比略ä¸å°å¿ƒé‡Šæ”¾å‡ºçš„没有èšç„¦çš„能é‡æ¿€æ´»äº†ç¬¦æ–‡å°˜åŸƒå’Œå‘¨å›´çš„仪å¼çŸ³ï¼Œåœ¨æ²¡æœ‰å®¹çº³èƒ½é‡çš„装置的情况下,它们åªèƒ½å‘外扩散。在几天的治疗åŽï¼Œæ比略和我åˆå¼€å§‹äº†å·¥ä½œã€‚\n\t在ç»åŽ†äº†æ•°ä¸ªä¸çœ ä¹‹å¤œï¼Œå’Œé«˜æ•ˆçš„咖啡因的帮助下(啊,感谢Player先生的咖啡,感谢他给我带æ¥çš„更加精神的明天ï¼ï¼‰ï¼Œæˆ‘们终于找出了所有仪å¼æ‰€éœ€çš„关键æ料。\n\t/cutæ ¹æ®å®žéªŒï¼Œæˆ‘们需è¦è‡³å°‘å››ç§æ料:按照一定样å¼æ‘†æ”¾çš„仪å¼çŸ³ï¼›è‹¥å¹²ç§ä¸åŒçš„墨水,用于刻画仪å¼ç»†èŠ‚;置于仪å¼ä¸­å¤®çš„特殊仪å¼çŸ³ï¼Œç”¨äºŽä¼ é€’能é‡ï¼›ä»¥åŠç”¨äºŽæ¿€æ´»ä»ªå¼çš„水晶。我觉得有必è¦å°†å„个仪å¼å…¨éƒ¨è¯¦ç»†åœ°è§£è¯´ä¸€é。 -guide.bloodmagic.entry.ritual.ritualStone.info.1=仪å¼çŸ³ä¾¿æ˜¯é­”法能é‡çš„容器:根æ®çŸ³å¤´çš„ä¸åŒï¼Œå¯å°†èƒ½é‡å¡‘造为å„ç§å½¢çŠ¶ï¼Œæˆ–导å‘ä¸åŒçš„地方。仪å¼çŸ³åˆ†äº”ç§ï¼šç©ºç™½ï¼ˆæ²¡æœ‰ä»»ä½•é“­æ–‡ï¼‰ã€æ°´ã€ç«ã€é£Žå’ŒåœŸã€‚æ¯ä¸ªä»ªå¼éƒ½ä¼šç”¨åˆ°è‹¥å¹²ä¸åŒç§ç±»çš„仪å¼çŸ³ï¼Œæ¯ä¸ªä»ªå¼æ‰€éœ€çš„布局也ä¸å°½ç›¸åŒã€‚ -guide.bloodmagic.entry.ritual.ritualStone.info.2=为仪å¼çŸ³ç”»ä¸Šæ­£ç¡®çš„铭文需è¦ä¸€äº›å·¥å…·ã€‚我早已研究出一ç§å¿«é€Ÿå»ºé€ æ­£ç¡®ä»ªå¼çš„办法,但如果有人想自己动手æ­å»ºçš„è¯è¿˜æ˜¯å¯ä»¥ç”¨è¿™äº›å·¥å…·çš„。手æŒåˆé€‚的工具å³å‡»ä»ªå¼çŸ³ä¾¿å¯ä¸ºå…¶ç”»ä¸Šé“­æ–‡ã€‚一开始你åªèƒ½åˆ¶ä½œå‡ºå…¶ä¸­å››ç§å·¥å…·ï¼Œéšç€ä¿®è¡Œçš„深入你会得到更高级的工具的制作方法的。 -guide.bloodmagic.entry.ritual.masterRitualStone.info=和大部分魔法一样,仪å¼éœ€è¦å¼•å¯¼ï¼Œå¦åˆ™å…¶åŠ›é‡ä¼šå˜å¾—无法控制,或者仪å¼æœ¬èº«ä¼šå½»åº•å¤±æ•ˆã€‚有鉴于此,仪å¼éœ€è¦ç”±ä¸»ä»ªå¼çŸ³æŽ§åˆ¶ï¼ˆæˆ‘的笔记中通常会以缩写"MRS"表记,但也åªèƒ½è¿™æ ·å†™å†™è€Œå·²ã€‚试想:你喊一声“麻烦一下,我需è¦æ›´å¤šçš„MRSâ€...然åŽå°´å°¬ç—‡å°±çŠ¯äº†ã€‚)主仪å¼çŸ³ä¼šä»Žå…¶ä¸»äººçš„çµé­‚网络中抽å–能é‡ï¼Œå¹¶æ‰©æ•£è‡³æ¯ä¸€å—仪å¼çŸ³ä¸Šï¼Œä»Žè€Œå¯åŠ¨ä»ªå¼ã€‚\n\t把çµé­‚网络和一å—大石头绑一å—有点麻烦。我曾ç»æˆåŠŸ/cut过一次:在主仪å¼çŸ³é¡¶ä¸Šç›˜è…¿æ‰“å,将能é‡èšé›†äºŽçŸ³å¤´ä¸Šå¹¶å°½åŠ›å°†çµé­‚网络和仪å¼è¿žåœ¨ä¸€èµ·ã€‚虽说æˆåŠŸæŒç»­äº†å‡ åˆ†é’Ÿï¼Œä½†æˆ‘的裤å­å´å› ä¸ºæ°´åœ¨ä»ªå¼çŸ³ä¸Šå†·å‡è€Œæ¹¿é€äº†ã€‚于是我得到了一个教训:ä¸è¦è¯•å›¾åœ¨å®žéªŒä¸­è¿›è¡Œä»»ä½•å†¥æƒ³ã€‚ -guide.bloodmagic.entry.ritual.activationCrystal.info.1=于是我们åœæ­¢äº†å†¥æƒ³ï¼Œè½¬è€ŒåŽ»ç ”究那颗从箱å­é‡Œæ»šå‡ºçš„红色å®çŸ³ã€‚æ比略确信它有“将我们所在的肉体世界和主宰çµé­‚网络的精神世界连接在一起â€çš„能力。我一直在想到底è¦ä¸è¦æ”¶ä»–作学徒,但我的确能看出他对于那些晦涩难懂的魔法的ç†è§£ã€‚啊,我想我有必è¦ç¿»è¯‘一下,他想表达的是:我们å¯ä»¥ç”¨è¿™æ°´æ™¶å°†çµé­‚网络和主仪å¼çŸ³è¿žåœ¨ä¸€èµ·ï¼Œä»¥ç»™ä»ªå¼æ供能é‡ã€‚ -guide.bloodmagic.entry.ritual.activationCrystal.info.2=于是我们得到了虚弱激活水晶,以åŠå¤åˆ¶å®ƒçš„办法。它的原料是å¦ä¸€ç§å¯ä»¥ä¸Žçµé­‚网络链接的水晶:熔岩水晶。åªéœ€è¦è¿…速在上é¢åˆ»å¥½å¿…须的图案,血之祭å›å°±å¯ä»¥å°†å®ƒå˜æˆæ¿€æ´»æ°´æ™¶ã€‚自然地,它也需è¦å’Œä½¿ç”¨è€…çš„çµé­‚网络绑定。在仪å¼æ­£ç¡®æ‘†æ”¾åŽï¼Œåªéœ€æ‰‹æŒç†”岩水晶å³å‡»ä¸»ä»ªå¼çŸ³å°±å¯ä»¥å¼€å§‹äº†ã€‚当然,这需è¦æœ‰è¶³å¤Ÿå¤šçš„LP作为支撑。如果没有足够多的LP,仪å¼ä¸ä¼šå‘动,也ä¸ä¼šå› æ­¤æ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.diviner.info.1=在ä¸æ–­å‘现新的仪å¼è¿‡ç¨‹ä¸­ï¼Œæˆ‘愈å‘感到建造仪å¼çš„枯燥。这也是为什么我制作出这样一个工具的原因——这样所有人都å¯ä»¥é€šè¿‡ç®€å•çš„手势和动作æ¥å¿«é€Ÿéƒ¨ç½²ä»ªå¼äº†ã€‚按时间顺åºæ¥è¯´è¿™ä¸ªåº”该放在诸仪å¼çš„åŽé¢æ¥è®²ï¼Œä½†æˆ‘决定æ到å‰é¢ï¼Œå› ä¸ºæˆ‘觉得先学习这个的使用会更好。没人会想在临阵时æ‰å‘现仪å¼çŸ³æ²¡å¸¦å¤Ÿï¼ŒæŠ‘或原本åªæ˜¯æƒ³å˜å‡ºä¸€ç“¶æ°´ç»“æžœå´å¬å”¤äº†é™¨çŸ³å§ã€‚ -guide.bloodmagic.entry.ritual.diviner.info.2=仪å¼æŽ¨æµ‹æ–的本质是本仪å¼çš„百科全书。你å¯ä»¥é€šè¿‡ä¸€äº›æ“作(按ä½Shift左击或å³å‡»ï¼‰æ¥åœ¨ä¸åŒä»ªå¼é—´åˆ‡æ¢ï¼Œä»”细看的è¯ä½ è¿˜ä¼šå¾—知一些基础信æ¯ã€‚在你带ç€ä»ªå¼çŸ³çš„时候,手æŒæŽ¨æµ‹æ–å³å‡»ä¸»ä»ªå¼çŸ³ï¼Œä¾¿å¯åœ¨æ­£ç¡®ä½ç½®æ”¾ç½®ä¸€å—仪å¼çŸ³ã€‚åªéœ€è¦ä¸æ–­å³å‡»å°±å¯ä»¥å®Œæˆä»ªå¼äº†ï¼ -guide.bloodmagic.entry.ritual.fullSpring.info=几年å‰ï¼Œæœ‰ä¸€ä¸ªæ—…行商人路过我附近的一个æ‘å­ï¼Œå¹¶å‘众人兜售他的å„ç§å°ä¸œè¥¿ã€‚那个æ‘å­å¤§æ¦‚有很长时间没下雨了,庄稼也快旱死了,商人è§æ­¤ä¾¿æŽå‡ºäº†ä¸€ä¸ªé•¶æœ‰è“色å®çŸ³çš„银制护符。“看这个ï¼â€ï¼Œä»–的声音中带ç€å‡ åˆ†æ¿€åŠ¨ï¼Œâ€œè¿™ä¸ªä¸œè¥¿å¯ä»¥è®©æ²³æµæ°¸ä¸å¹²æ¶¸ï¼æˆ‘å¯ä»¥ç”¨ç‚¼é‡‘术从空气中å˜å‡ºæ°´ï¼â€\n\t然而æ‘民们觉得那å®çŸ³å¥½åƒåªæ˜¯æ™®é€šçš„è“å®çŸ³è€Œå·²ã€‚等他们å应过æ¥ä¸Šå½“å—骗时那/cut个商人已ç»æ¶ˆå¤±å¾—无影无踪了。我起åˆå¹¶ä¸æ‰“算干涉此事——因为他们似乎并ä¸å–œæ¬¢æˆ‘的魔法——但这次我破了个例。在和“炼金术士â€è¿›è¡Œäº†æ„‰å¿«çš„交æµåŽï¼Œæˆ‘在çŒæº‰æ¸ æ—打å了数å°æ—¶ã€‚我æˆåŠŸé€šè¿‡å†·å´ç©ºæ°”中水蒸气的办法给庄稼们带æ¥äº†è¶³å¤Ÿå¤šçš„水——足够撑到下一个旱季。自然这个方法并ä¸é è°±ï¼Œå› ä¸ºæˆ‘自己已ç»è¢«æ‰“å给榨干了,ä¸å¾—ä¸é è‡ªå·±é€ å‡ºæ¥çš„æ°´æ¥é‡æ–°è°ƒæ•´ã€‚\n\t/cut我å†æ¬¡æƒ³èµ·äº†è¿™ä¸ªäº‹ï¼Œå¹¶æŒ‰ç…§åŒæ ·çš„方法制作了涌泉仪å¼ã€‚给仪å¼çŒæ³¨å°‘é‡èƒ½é‡ï¼Œä»ªå¼ä¾¿å¯å°†é™„近空气中的水分èšé›†èµ·æ¥ï¼Œå¹¶åœ¨ä¸»ä»ªå¼çŸ³ä¸Šæ–¹äº§ç”Ÿä¸€ä¸ªæ°´æºã€‚激活仪å¼éœ€è¦çš„能é‡å¹¶ä¸å¤šï¼Œç»´æŒå…¶è¿è½¬çš„能é‡æ›´æ˜¯å¯ä»¥å¿½ç•¥ä¸è®¡ã€‚\n\t水的范围和放置的ä½ç½®éƒ½æ˜¯å¯ä»¥ç”¨ä»ªå¼è°ƒæ•´é’³è°ƒæ•´çš„,所以那些对美观表示担忧的魔法师们ä¸è¦æ‹…心了。这便是魔法的力é‡ï¼ -guide.bloodmagic.entry.ritual.lava.info=熔岩——æ怕是最普通的能é‡æ¥æºäº†å§ã€‚我平日的研究中很少使用熔岩,因为它其实并éžæ˜¯æ™®é€šçš„é“桶就能装起æ¥çš„东西ï¼\n\t有一天,当地的一åé“匠找到我,并å‘我打å¬é™„近的能é‡æºçš„事情。他说他们最近新造了一个大家伙,需è¦å¤§é‡èƒ½é‡æ¥è¿è½¬ã€‚我回答é“,“有倒是有,但它们并éžæ— ä¸»ä¹‹ç‰©ã€‚â€æˆ‘决定去亲眼看一下这个所谓的大家伙到底是何方神圣。\n\t/cut那是...一个至少五公尺(5米)è§æ–¹çš„冶炼炉,上é¢è¿˜è¿žç€å‡ ä¸ªç©ºç©ºå¦‚也的储ç½ã€‚虽然我ä¸çŸ¥é“这玩æ„儿到底是怎么工作的,但我的直觉告诉我,熔岩的热é‡ç”¨åœ¨è¿™é‡Œæ­£åˆé€‚——电力是ç»å¯¹ä¸è¡Œçš„,ç»å¯¹ä¸è¡Œã€‚除此之外,我åªçŸ¥é“è¿™ä¸æ˜¯æ²‰æµ¸å·¥ä¸šå…¬å¸çš„产å“。\n\t在ç»è¿‡çŸ­æš‚的讨价还价åŽï¼Œé“匠付了一笔费用,我便开始å«ä»–们ç¨å¾®è®©å¼€ä¸€ä¸‹ï¼Œä»¥ä¾¿å‡†å¤‡æ­å»ºä»ªå¼ã€‚按我的想法,我将/cutå››å—ç«ä¹‹ä»ªå¼çŸ³å’Œä¸»ä»ªå¼çŸ³æ‘†æˆå字,脑海中ä¸æ–­æƒ³è±¡æ•´ä¸ªè¿‡ç¨‹çš„åŒæ—¶ï¼Œæˆ‘用力将激活水晶推å‘了主仪å¼çŸ³ã€‚ç†è®ºä¸Šè¿™ä¸ªè¿‡ç¨‹åº”该å分简å•ï¼šä»ªå¼ä¸æ–­åœ°å°†å¤§åœ°æ·±å¤„的石头挖出æ¥ï¼Œåœ¨å·¨å¤§çš„压力下熔èžæˆç†”岩。这样制æˆçš„熔岩å¯ä»¥ç›´æŽ¥ä»Žä»ªå¼çŸ³ä¸­æå–出æ¥ï¼Œç„¶åŽä»ªå¼æœ¬èº«è¿˜å¯ä»¥è‡ªç»´æŒè¿™ç§ç±»ä¼¼æŒ¤åŽ‹çš„过程。\n\t然而这åªæ˜¯ç†è®ºã€‚说起æ¥å®¹æ˜“åšèµ·æ¥éš¾ï¼šå½“时我使用的简/cut易网络完全ä¸é€‚åˆæ‹¿æ¥ä¸ºè¿™ä¸ªä»ªå¼ä¾›åº”魔力,ä¸ä»…挤压熔岩需è¦çš„压力巨大(需è¦20000LPå¯åŠ¨ä»ªå¼ï¼‰ï¼ŒæŠ½å–熔岩的开支也ä¸å°ï¼ˆæ¯äº§ç”Ÿä¸€æ ¼ç†”岩需è¦500LP)。\n\t我摇摇晃晃地走出了é“匠们的基地,脸上带ç€ä¸€ä¸æ¬£æ…°ã€‚那些储ç½é‡Œçš„熔岩足够é“匠们用到他们找到新的岩浆æ¥æºäº†ã€‚当然,我也没忘记带走我的仪å¼çŸ³ã€‚\n\t---------------\n\t/cut在没有外力影å“下,这个仪å¼ä¼šä¸æ–­å°è¯•åœ¨ä¸»ä»ªå¼çŸ³ä¸Šæ–¹ç”Ÿæˆä¸€æ ¼ç†”岩,并消耗500LP。一般情况下,熔岩生æˆçš„范围å¯ä»¥æ‰©å±•åˆ°ä»ªå¼æœ¬èº«ä¸‰æ ¼å¼€å¤–。\n\t在原生æ„å¿—çš„å½±å“下,LP消耗和大气中æ„志的浓度æˆå比,åŒæ—¶ä¼šä¸æ–­æ¶ˆè€—æ„志,æ„志的消耗速度与节约的LPæ•°é‡æˆæ­£æ¯”。使用原生æ„志还å¯ä»¥è®©ä»ªå¼è‡ªåŠ¨å°†ç†”岩放置进å„å¼æ¶²ä½“容器中,速度大抵ä¿æŒä¸å˜ã€‚\n\t/cutè…蚀æ„志会å转ç«ç„°å…疫的效果。æ¢è¨€ä¹‹ï¼Œé‚£äº›å¹³æ—¶å¯¹ç«ç„°å…疫的生物,在这个仪å¼çš„å½±å“下会失去ç«ç„°å…疫的属性;而那些无法抵抗ç«ç„°çš„生物则会对ç«ç„°å…疫。\n\tå¤ä»‡æ„志会令此仪å¼é‡Šæ”¾å‡ºä¸€ç§æŒ¥å‘性气体,这ç§æ°”体会影å“任何ä¸æ˜¯çŽ©å®¶çš„生物。在这ç§æ°”体的作用范围内的生物都会获得“缓燃引线â€çš„效果。当这个效果的倒计时归零时,这个生物会爆炸,强行将生物赶回空气当中。\n\t/cutç ´åæ„å¿—å¯ä»¥å¼ºåŒ–这个仪å¼çš„å„ç§å±žæ€§ã€‚大气中这ç§æ„å¿—çš„å«é‡è¶Šå¤šï¼Œä»ªå¼èƒ½æ”¾ç½®çš„岩浆æºæ•°é‡ä¹Ÿå°±è¶Šå¤šã€‚更喜人的是这个仪å¼å¹¶ä¸ä¼šæ¶ˆè€—ç ´åæ„志。然而,当大气中的æ„å¿—æ•°é‡ä¸‹é™ï¼Œè€Œä¸”仪å¼çš„最大范围å°äºŽä½ è®¾å®šçš„范围时,仪å¼å°±ä¼šåœæ­¢å·¥ä½œï¼Œå¿…须进行手动修å¤ã€‚\n\t最åŽï¼Œåšæ¯…æ„志会令仪å¼èŒƒå›´å†…的玩家获得ç«ç„°æŠ—性,时效和空气中æ„志的浓度æˆæ­£æ¯”。å¦å¤–有一点è¦æ³¨æ„,è…蚀æ„/cutå¿—çš„å转效果会抵消掉åšæ¯…æ„志所带æ¥çš„ç«ç„°æŠ—性。 -guide.bloodmagic.entry.ritual.greenGrove.info=上星期我开始为æ比略讲授跨领域的魔法。除了血之魔法外,我的æ¯ä¸ªå­¦å¾’都学过一些其它形å¼çš„魔法。其实,学什么魔法都没有关系,åªè¦å®ƒä¸æµªè´¹èµ„æºå°±å¥½â€”—我曾ç»ä½¿ç”¨è¿‡æ¥è‡ªé¥è¿œçš„东方的Ars部è½çš„魔法,但是因为Etherium之æºå‡ ä¹Žè¢«æ¦¨å¹²äº†ï¼Œæ‰€ä»¥è¿™ä¸ªè®¡åˆ’也就夭折了。\n\tæ比略决定学习神秘学,一门利用世界本身的魔法æ¥åˆ›é€ å±žäºŽè‡ªå·±çš„魔法的魔法。它/cut正好和血之魔法相抗衡——åŽè€…使用的是生命本身具有的魔法。为了解释清楚,我决定用作物生长为例å­ï¼Œå±•ç¤ºä¸¤é—¨é­”法之间的差别。\n\t“在神秘学中,魔法师会使用以Herbaæºè´¨ç‚¼æˆçš„生长催化剂,â€æˆ‘一边这样说ç€ï¼Œä¸€è¾¹æŒ‡ç€æ•™å®¤å¢™ä¸ŠæŒ‚ç€çš„一幅æºè´¨åˆæˆå›¾ï¼›è¯šç„¶è¿™èŠ‚课其实åªæœ‰æ比略一个学生,但人总还是需è¦ç‚¹ä¹è¶£çš„,“一å°è‚¡çµæ°”å’Œæºè´¨æ··åˆåœ¨ä¸€èµ·å¯ä»¥åˆºæ¿€æ¤ç‰©çš„/cutå…‰åˆä½œç”¨ï¼Œä»Žè€Œä»¤æ¤ç‰©å¸æ”¶æ›´å¤šçš„光能,以此加速其生长。然而,这需è¦ä¿è¯ä½œç‰©ç”Ÿé•¿åœ¨è‚¥æ²ƒçš„土地上,å¦åˆ™ä½œç‰©æœ€ç»ˆåªèƒ½æž¯èŽæ­»äº¡ã€‚“\n\t然åŽæˆ‘找æ¥äº†åœŸä»ªå¼çŸ³å’Œæ°´ä»ªå¼çŸ³å„å››å—,摆出一个圆形,并在圆心处放置主仪å¼çŸ³ã€‚“血魔法与之正好相å,â€æˆ‘一边说ç€ï¼Œä¸€è¾¹æ¿€æ´»äº†ä¸»ä»ªå¼çŸ³ï¼Œå¹¶åœ¨ä¸Šé¢ç›–上了一层泥土。“你å¯ä»¥ç”¨ä½ è‡ªå·±çš„生命力,或者别的动物的生命力,æ¥åŠ é€Ÿä½œ/cut物的生长,从而节约一般肥料的使用。本质上æ¥è®²ï¼Œè¿™ä¸ªä»ªå¼ä¼šä¸æ–­ç»™äºˆæ¤ç‰©å…»åˆ†ï¼Œä»Žè€Œä½¿å…¶å…»åˆ†ä¿æŒåœ¨ä¸€ä¸ªè¾ƒé«˜æ°´å¹³ã€‚â€\n\t我å‘土中撒了几粒ç§å­ï¼Œå°å¿ƒç¿¼ç¿¼åœ°ç”¨åœŸç›–好,然åŽä»Žè´´èº«æ³•è¢ä¸­æŽå‡ºä¸€ä¸ªæ°´ç“¶ï¼Œæ‹”开瓶塞然åŽå°†æ°´æ´’在了泥土上。“这个过程ä¸éœ€è¦é˜³å…‰ï¼Œå› ä¸ºå®ƒç”¨åˆ°äº†å¦ä¸€ç§å½¢å¼çš„能é‡ã€‚尽管如此,阳光还是很有用的——毕竟作物一开始ä¸æ˜¯è¿™æ ·ç”Ÿ/cut长的嘛ï¼â€\n\t在我解释的时候,有几点绿色的东西就已ç»å†’出了土堆。æ¯æœ‰ä¸€ç‰‡æ–°å¶é•¿å‡ºï¼Œæˆ‘都会感å—到一ä¸åŽ‹åŠ›ï¼Œè™½ç„¶ä¸å¤§ï¼Œä½†ä¼šä¸æ–­ç§¯ç´¯ã€‚下课åŽï¼Œæˆ‘开始清ç†å®žéªŒç”¨çš„土堆,然åŽå†³å®šåŽ»æ‘å­é‡Œèµ°ä¸€åœˆï¼šæˆ‘现在有几斗å°éº¦è¦å–。\n\t---------------\n\t绿丛仪å¼ï¼Œæ­£å¦‚å…¶å,以血法师之血为养料,加速仪å¼é™„近之æ¤ç‰©ï¼Œè¯¸å¦‚å°éº¦ã€èƒ¡èåœä¹‹ç±»ï¼Œ/cut的生长。默认,仪å¼åªåœ¨3x3范围内寻找åˆé€‚的目标,æ¯ç§’大概åªæœ‰30%%的概率æˆåŠŸå‚¬ç”Ÿã€‚用仪å¼è°ƒæ•´é’³è°ƒæ•´åŽå¯å¯»æ‰¾5x5范围内的至多81棵作物。\n\tå¦å¤–,æ¶é­”æ„志对这个仪å¼ä¹Ÿæœ‰æ•ˆæžœã€‚原生æ„志会加快其工作速度,效果å–决于浓度,但æ¯æ¬¡å‚¬ç”Ÿä¼šå¤šæ¶ˆè€—0.05点æ„志。\n\t若辅以å¤ä»‡æ„志,仪å¼ä¾æ—§ä¼šåœ¨æ¯æ¬¡å‚¬ç”Ÿæ—¶å¤šæ¶ˆè€—0.05点æ„志,但会增加催生æˆåŠŸçš„概率。/cut之å‰æ到默认概率是30%%,但若是你有100点å¤ä»‡æ„志,这个概率会上å‡è‡³80%%。\n\tç ´åæ„å¿—å¯ä»¥æ高仪å¼çš„工作范围,这æ„味ç€ä½ çš„一个仪å¼å¯ä»¥è¦†ç›–到更多的作物上。而且这个仪å¼ä¸ä¼šæ¶ˆè€—ç ´åæ„å¿—ï¼ç„¶è€Œï¼Œè‹¥æ˜¯æ„志的浓度下é™ï¼Œè€Œä½ è®¾å®šçš„范围比仪å¼æœ€å¤§çš„工作范围还大,那仪å¼å°±ä¼šåœæ­¢å·¥ä½œï¼Œéœ€è¦æ‰‹åŠ¨ä¿®å¤ã€‚\n\t/cutåšæ¯…æ„志会让仪å¼åœ¨å‚¬ç†Ÿä½œç‰©çš„åŒæ—¶ä¿è¯è€•åœ°å·²ç»è¿‡ç¿»æ•´ä¸”ä¿æŒæ¹¿æ¶¦ã€‚å¦å¤–,若是仪å¼çš„工作范围内有掉在地上的ç§å­ï¼Œåšæ¯…æ„志会让仪å¼è‡ªåŠ¨ç”¨é‚£äº›ç§å­æ¥è¡¥ç§ã€‚自然地,这个效果会消耗æ„志,但消耗速度是固定的。\n\tè…蚀æ„志的效果则完全å转了这个仪å¼çš„工作原ç†â€”—æ¤ç‰©ä¼šåœ¨è¿™ç§æ„å¿—çš„å½±å“下转而去主动å¸è¡€ï¼Œå°±åƒæ°´è›­é‚£æ ·ã€‚具体æ¥è¯´ï¼šæ¯ä¸€åˆ»ï¼Œè‹¥æ¤ç‰©é™„/cut近若有怪物,那么æ¤ç‰©å’Œæ€ªç‰©éƒ½ä¼šå—到伤害,且两者伤害æˆæ­£æ¯”。事实上直接用怪物当作æ¤ç‰©çš„养料是有效的ï¼å¦å¤–,æ¯ä¸ªæ€ªç‰©ä¸Šæ¯æœ‰10秒中的负é¢æ•ˆæžœï¼Œå°±ä¼šæ¶ˆè€—0.2点è…蚀æ„志。 -guide.bloodmagic.entry.ritual.magnetism.info=ç£åŠ›ä»ªå¼å¯è°“是采石场必备。这个仪å¼ä¼šåˆ¶é€ å‡ºä¸€æ—‹è½¬çš„ç£åœºï¼Œå°†æ·±åŸ‹åœ°ä¸‹çš„丰富矿è—å¸åˆ°åœ°é¢ä¸Šã€‚这个仪å¼å¹¶ä¸ä¼šå¸èµ°çŸ³å¤´ï¼Œæ‰€ä»¥åœ°é¢ä¸Šä¹Ÿä¸ä¼šå› æ­¤å‡ºçŽ°å¤§æ´žï¼Œå‰æ是地下并éžå…¨æ˜¯çŸ¿çŸ³ã€‚这个仪å¼æ¯2秒就会试ç€å¸ä¸€ä¸ªçŸ¿çŸ³ï¼Œæ¯æˆåŠŸå¸å–一个矿石便消耗50LP。\n\t/cut默认,这个仪å¼çš„工作范围是以主仪å¼çŸ³ä¸ºä¸­å¿ƒçš„7x7正方形区域(å³åŠå¾„为3)。目å‰ï¼Œæ„志还ä¸èƒ½å½±å“这个仪å¼çš„工作,所以你åªèƒ½é€šè¿‡åœ¨ä¸»ä»ªå¼çŸ³æ­£ä¸‹æ–¹æ”¾ç½®æŸç§ä»·å€¼é«˜æ˜‚çš„æ–¹å—æ¥æ高其工作范围。一个é“å—å¯ä»¥è®©åŠå¾„增加到7。金å—则是增加到15。钻石效果最好,å¯ä»¥å°†å…¶å·¥ä½œèŒƒå›´æ‹“展为63x63,届时你åªéœ€è¦çœ‹ç€ä»ªå¼æ…¢æ‚ æ‚ åœ°æŠŠçŸ¿çŸ³å¸åˆ°ä¸»ä»ªå¼çŸ³ä¸Šæ–¹3x3的空间里就好了。 -guide.bloodmagic.entry.ritual.crusher.info=挖掘仪å¼çš„è¿è¡Œå分简å•ï¼šåªéœ€è¦å°†ç®±å­ä¹‹ç±»çš„东西放在主仪å¼çŸ³æ­£ä¸Šæ–¹ï¼Œå®ƒå°±å¯ä»¥æ¶ˆè€—LP并ä¸æ–­æŒ–掘主仪å¼çŸ³æ­£ä¸‹æ–¹3x3x3范围内的方å—了。仪å¼æ¯2秒会å°è¯•æŒ–掘,如果æˆåŠŸï¼Œä¼šæ¶ˆè€—7LP。挖下æ¥çš„æ–¹å—会放进与仪å¼é“¾æŽ¥çš„容器中,如果容器已满,就会掉在那个容器的上é¢ã€‚\n\t若以原生æ„志驱动仪å¼ï¼Œä»ªå¼å°†ä¼šå·¥ä½œå¾—更快,但æ¯æ¬¡æˆåŠŸæŒ–掘时都会多消耗0.05点原生æ„志。\n\t/cutç ´åæ„志会令仪å¼åœ¨æŒ–掘方å—时拥有时è¿çš„效果。目å‰æ¥çœ‹ï¼Œä¸è®ºæ供多少æ„志,时è¿çš„等级永远是三,并且æ¯æ¬¡æˆåŠŸæŒ–掘都会多消耗0.2点此ç§æ„志。\n\tåšæ¯…æ„志会令仪å¼åœ¨æŒ–掘方å—时拥有精准采集的效果。æ¯æ¬¡æˆåŠŸæŒ–掘都会多消耗0.2点此ç§æ„志。\n\tè…蚀æ„志会令仪å¼åœ¨æŒ–掘方å—æ—¶ç»è¿‡æŸç§æ¶²ä½“的浸洗。/cutè¿™ç§æ¶²ä½“带有粉碎的效果,æ¢è¨€ä¹‹â€”—此时你挖掘的é“矿时会å˜æˆä¸¤å †é“砂。目å‰è¿™ç§æ¶²ä½“å¯ä»¥æ˜¯åŸºç¡€åˆ‡å‰Šæ²¹æˆ–爆炸ç«è¯ã€‚æ ¹æ®æ‰€æœ‰æ¶²ä½“çš„ä¸åŒï¼Œä»ªå¼æ¶ˆè€—çš„æ„å¿—æ•°é‡ä¹Ÿä¸åŒã€‚这个效果会覆盖精准采集的效果。\n\t/cutå¤ä»‡æ„志的效果和压挤å°è®°å·®ä¸å¤šï¼Œå³ä¼šåŽ‹ç¼©æŒ–下æ¥çš„东西。举例:箱å­é‡ŒçŽ°åœ¨æœ‰65红石,一次挖掘åŽä¼šå°†å…¶ä¸­9个红石压缩为一红石å—,留下56红/cut石。仅当压缩æˆåŠŸæ—¶ä»ªå¼æ‰ä¼šæ¶ˆè€—0.2点å¤ä»‡æ„志。 -guide.bloodmagic.entry.ritual.highJump.info=这个仪å¼ä¼šç”¨å¼ºå¤§çš„æ°”æµå°†èµ°åœ¨ä¸Šé¢çš„人é€ä¸Šå¤©ã€‚å¦å¤–,这个仪å¼è¿˜ä¼šä»¤æ‘”下æ¥çš„人å…å—掉è½ä¼¤å®³ã€‚潜行å³å¯è§„é¿ä»ªå¼çš„效果。\n\tæ¯æ¬¡æˆåŠŸäº§ç”Ÿæ°”æµæ—¶ï¼Œä»ªå¼éƒ½ä¼šä»¥5LP/tick的速度消耗LP;若没能产生气æµï¼Œåˆ™ä¸ä¼šæ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.speed.info=仪å¼å¦‚å…¶å,速移仪å¼å¯ç”¨æ¥åŠ é€Ÿç§»åŠ¨ã€‚仪å¼æœ¬èº«å¯ä»¥æŒ‡å‘ä»»æ„æ–¹å‘,而在仪å¼çš„生效范围内的实体都会æœä»ªå¼æ‰€æŒ‡çš„æ–¹å‘加速。仪å¼çš„指å‘由那å—薄暮仪å¼çŸ³çš„ä½ç½®ç¡®å®šã€‚默认,工作范围是åŠå¾„二格è§æ–¹ï¼Œä½†å¯ä»¥ç”¨ä»ªå¼è°ƒæ•´é’³è°ƒæ•´ã€‚水平方å‘上的速度加æˆæ˜¯3æ–¹å—/tick,垂直方å‘上则是1.2æ–¹å—/tick。\n\t以原生æ„志驱动的速移仪å¼ä¼šä½¿ç”Ÿç‰©èŽ·å¾—更快的速度。/cut当周围充满原生æ„志(å³100点)时,速度会翻一番。æ¯æ¬¡åŠ æˆéƒ½ä¼šæ¶ˆè€—0.1点æ„志。\n\tå¤ä»‡æ„志将会迫使仪å¼å¯¹æˆå¹´åŠ¨ç‰©æ— æ•ˆï¼Œè€Œç ´åæ„志会迫使仪å¼å¯¹å¹¼å¹´åŠ¨ç‰©æ— æ•ˆã€‚å¤ä»‡å’Œç ´åæ„志都会令仪å¼å¯¹çŽ©å®¶æ— æ•ˆã€‚è‹¥åŒæ—¶ä½¿ç”¨è¿™ä¸¤ç§æ„志,则仪å¼åªä¼šå¯¹çŽ©å®¶æœ‰æ•ˆã€‚这些特性对于动物农场,甚至是过滤å°åƒµå°¸éƒ½æ˜¯å分有用的。仪å¼åªæœ‰åœ¨æˆåŠŸåŠ é€Ÿæ—¶æ¶ˆè€—0.05点æ„志。æ¢è¨€ä¹‹ï¼Œ/cut对于幼年动物æ¥è¯´ï¼Œä»ªå¼ä¸ä¼šæ¶ˆè€—ç ´åæ„志,也ä¸ä¼šæ¶ˆè€—LP——因为这时的仪å¼ä¸ä¼šå¯¹å¹¼å¹´åŠ¨ç‰©æœ‰æ•ˆã€‚ -guide.bloodmagic.entry.ritual.wellOfSuffering.info=对于那些ä¸æƒ³ç”¨è‡ªå·±çš„è¡€æ¥è¡¥å……LP供应的血法师,苦难之井便是他们的选择:这个仪å¼ä¼šå°†æ–¹åœ†å格范围内的éžçŽ©å®¶å®žä½“的生命èšé›†åˆ°è¡€ä¹‹ç¥­å›é‡Œã€‚苦难之井åªä¼šåœ¨ä¸Šä¸‹åæ ¼ã€æ°´å¹³æ–¹å‘上方圆五格的范围内寻找血之祭å›ã€‚如果找ä¸å¥—祭å›ï¼Œä»ªå¼ä¸ä¼šå·¥ä½œã€‚仪å¼æ¯æ¶ˆè€—1LP便å¯ä»Žæ€ªç‰©ä¸ŠæŠ½å‡º25LP;若是针对éžæ•Œå¯¹çš„生物,则å¯æŠ½å‡º100LP;具体数é‡ä¼šå—到献祭符文的增幅的影å“。 -guide.bloodmagic.entry.ritual.featheredKnife.info=羽刀仪å¼åƒæ˜¯ä¸€æŠŠç›´æ’使用者身上的刀,抽å–其血液,并为附近的血之祭å›è¡¥å……能é‡ã€‚一般,羽刀仪å¼é¦–先会在以主仪å¼çŸ³ä¸ºä¸­å¿ƒçš„11x11x21的范围内寻找一座祭å›â€”—若找ä¸åˆ°ç¥­å›ï¼Œä»ªå¼ä¸ä¼šå·¥ä½œï¼›æ‰¾åˆ°ç¥­å›åŽä»ªå¼ä¼šè®°ä¸‹è¿™ä¸ªç¥­å›çš„ä½ç½®ã€‚当有玩家进入仪å¼çš„范围(默认为31x31x41)åŽï¼Œä»ªå¼ä¼šæ¯ç§’对玩家造æˆä¸€ç‚¹ä¼¤å®³ï¼Œå¹¶å°†å…¶è½¬åŒ–为LPé€å…¥ç¥­å›ä¸­ã€‚这个过程会å—到血之符文的影å“。伤害玩家的速度å¯/cut以调整。ä¸è¦æ‹…心,这个仪å¼ä¹Ÿæœ‰å®‰å…¨ä¿æŠ¤æœºåˆ¶ï¼šå®ƒä¸ä¼šæ”»å‡»é‚£äº›åªå‰©ä¸‹ç™¾åˆ†ä¹‹ä¸‰åä¸åˆ°çš„生命值的玩家。\n\t有数ç§æ¶é­”æ„å¿—å¯ä»¥å½±å“这个仪å¼çš„工作。比如,原生æ„志——它å¯ä»¥æ高仪å¼çš„工作速度,准确地说是一秒攻击玩家两次。但æ¯æ¬¡æ”»å‡»æ—¶ä¼šå¤šæ¶ˆè€—0.05点原生æ„志。\n\t若周围的çµåŸŸä¸­æœ‰è‡³å°‘å点åšæ¯…æ„志,仪å¼ä¼šå°†å®‰å…¨é˜ˆå€¼/cut从百分之三åæ高到百分之七å。这层ä¿æŠ¤ä¸ä¼šå¤šæ¶ˆè€—æ„志。\n\t若周围的çµåŸŸä¸­æœ‰è‡³å°‘å点å¤ä»‡æ„志,仪å¼ä¼šé€æ­¥é™ä½Žå®‰å…¨é˜ˆå€¼è‡³ç™¾åˆ†ä¹‹å。若åŒæ—¶æœ‰è‡³å°‘å点åšæ¯…æ„志,那么åŽè€…的百分之七å的阈值将åªå¯¹ä»ªå¼çš„主人有效果。和åšæ¯…æ„志一样,这个效果ä¸ä¼šå¤šæ¶ˆè€—æ„志。\n\t/cut若仪å¼é™„è¿‘çš„çµåŸŸä¸­æœ‰ç ´åæ„志,这个仪å¼çš„生命值转LP的效率会有所æ高。转化率的增幅与破åæ„å¿—çš„å«é‡æˆæ­£æ¯”,最高为五分之一,对应100点破åæ„志。这个效果å¯ä»¥ä¸Žç¬¦æ–‡ã€æŸçµæŠ¤ç”²å‡çº§å’Œç†é¦™å åŠ ã€‚æ¯è½¬åŒ–一点HP,会多消耗0.05点破åæ„志。\n\t说到ç†é¦™â€”—è…蚀æ„志会令ç†é¦™çš„效果与此仪å¼å åŠ ã€‚若你身上没有“魂飞魄散â€æ•ˆæžœï¼Œå¹¶ä¸”你正好处在ç†é¦™çš„效果/cut范围内,你的生命值会被直接扣至安全阈值,并将转化出的LP一次性注入祭å›ä¸­ï¼Œå¹¶ç»™äºˆä½ é­‚飞魄散的效果。此效果å¯ä¸Žç ´åæ„å¿—å åŠ ã€‚ -guide.bloodmagic.entry.ritual.regen.info=虽然ä»æœ‰äº‰è®®ï¼Œä½†è¿™é‡ç”Ÿä»ªå¼å¯¹äºŽé‚£äº›æƒ³ç”¨è‡ªå·±çš„è¡€æ¥é©±åŠ¨é­”法的血法师们æ¥è¯´ï¼Œä»ç„¶æ˜¯ä¸€ä¸ªä¸é”™çš„选择,因为它会利用血法师的魔法在仪å¼èŒƒå›´å†…产生治疗光环的效果,藉由此治愈仪å¼èŒƒå›´å†…的生物,包括血法师他们自己。仪å¼æ¯2.5秒会给15格范围内的生物附加生命回å¤I的效果;对于玩家æ¥è¯´å®ƒä¼šæ¶ˆè€—100LP,对于其它生物æ¥è¯´æ˜¯10LP。\n\t/cutè…蚀æ„志会给仪å¼å†åŠ ä¸Šä¸€ä¸ªâ€œå¸è¡€é¬¼èŒƒå›´â€ã€‚此时,仪å¼ä¼šå¯¹æ‰€æœ‰éžçŽ©å®¶ç”Ÿç‰©éšæœºé€ æˆä¼¤å®³ï¼Œå¹¶è—‰ç”±æ­¤æ²»ç–—玩家。æ¯ä¸€ä¸ªå·¥ä½œçš„tick中它都会消耗0.04点è…蚀æ„志并将1点生命值转移到玩家身上。 -guide.bloodmagic.entry.ritual.harvest.info=这个仪å¼å¯ä»¥æ”¶èŽ·é»˜è®¤ä»¥ä»ªå¼çŸ³ä¸Šæ–¹9x9x5范围内的所有作物,并将收获到的ç§å­è¡¥ç§å›žåŽ»ã€‚所有收获到的物å“都会掉è½åœ¨åŽŸåœ°ã€‚仪å¼å·¥ä½œé¢‘率为5tickå°è¯•ä¸€æ¬¡ï¼Œæ¯æ¬¡æˆåŠŸæ”¶èŽ·éƒ½ä¼šæ¶ˆè€—20LP。\n\tå¯ä»¥æ”¶èŽ·çš„作物包括但ä¸é™äºŽï¼šå—ç“œã€å°éº¦ã€èƒ¡èåœã€åœŸè±†ã€åœ°ç‹±ç–£ã€ä»™äººæŽŒã€ç”˜è”—等。时刻记ä½ï¼Œè¿™ä¸ªä»ªå¼å¹¶ä¸ä¼šå¯¹å®ƒæ­£åœ¨æ”¶å‰²çš„作物作任何å‡è®¾â€”—åªè¦å®ƒè¢«è®¤ä¸ºæ˜¯ä¸€/cutç§å¯ä»¥æ”¶å‰²çš„作物,这个仪å¼å°±å¯ä»¥æ”¶å‰²ã€‚(译注:更精确地说,是指有对应的HarvestHandler支æŒçš„作物。) -guide.bloodmagic.entry.ritual.interdiction.info=在传说中的å¤ä»£ç‚¼é‡‘术设备的基础上,我们研å‘出了这个仪å¼ï¼Œå¯å°†ä»»ä½•ä¸æ˜¯çŽ©å®¶çš„生物赶出仪å¼æ‰€è¦†ç›–的范围。默认,任何è·ç¦»æ­¤ä»ªå¼çš„主仪å¼çŸ³ä¸è¶…过两格的éžçŽ©å®¶ç”Ÿç‰©çš„移动速度都会被此仪å¼å¹²æ¶‰åˆ°ã€‚è¦æ³¨æ„的是,尽管仪å¼èŒƒå›´å†…的生物ä¸ä¼šè¢«æŽ‰è½ä¼¤å®³å½±å“,但一旦超出了仪å¼çš„覆盖范围,ä¿æŠ¤å°±ä¼šå¤±æ•ˆã€‚ -guide.bloodmagic.entry.ritual.containment.info=å’Œç¦æ­¢ä»ªå¼æ­£å¥½ç›¸å,牵制仪å¼ä¼šè¯•å›¾å°†æ‰€æœ‰ç”Ÿç‰©å…¨éƒ¨æ‹‰è¿›ä»ªå¼ä¸Šæ–¹çš„范围中,并困ä½å®ƒä»¬ï¼Œä½¿å…¶æ— æ³•ç§»åŠ¨ã€‚默认范围是水平方å‘上3æ ¼è§æ–¹ï¼Œä»Žæœ€ä½Žçš„仪å¼çŸ³åˆ°æœ€é«˜çš„仪å¼çŸ³ä¸ºæ­¢ã€‚这个范围å¯ä»¥è°ƒæ•´ã€‚\n\t/cut默认,仪å¼çš„消耗是æ¯ä¸ªç”Ÿç‰©æ¯tick1LP。没有在拉生物时ä¸ä¼šæ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.suppression.info=抑液仪å¼ä¼šåŽ‹åˆ¶å…¶å½±å“范围内的所有液体——æ¢è¨€ä¹‹ï¼Œå°†èŒƒå›´å†…的液体全替æ¢ä¸ºç©ºæ°”。它的工作范围大约是åŠå¾„10格的上åŠçƒã€‚工作时,LP消耗速度为2LP/tick。仪å¼åœæ­¢å·¥ä½œæ—¶ä¼šå°†æ‰€æœ‰è¢«æ›¿æ¢çš„液体全部放置回去。 -guide.bloodmagic.entry.ritual.expulsion.info=å‡å¦‚你在玩æœåŠ¡å™¨æ—¶ï¼Œä½ å‘现,出于ç§ç§ç†ç”±ï¼Œä½ éœ€è¦æ‹’ç»æŸäº›çŽ©å®¶çš„造访,然åŽä½ å‘现力场护盾和æ€äººä¸çœ¨çœ¼çš„巨型转å­æ ¹æœ¬ä¸èƒ½é˜»æŒ¡ä»–们。那么就是这个仪å¼å‡ºåœºçš„时刻了ï¼åœ¨ä¼ é€é­”法的帮助下这个仪å¼ä¼šå¤§å¤§ç¼“解你的问题ï¼\n\t若有玩家进入此仪å¼çš„范围内,并且这个玩家并ä¸æ˜¯ä»ªå¼çš„主人,那么这个玩家就会被éšæœºä¼ é€åˆ°åŠå¾„100格的范围中的æŸä¸ªåœ°æ–¹ã€‚当然这个仪/cutå¼è¿˜æœ‰ä¸€ç§ç±»ä¼¼ç™½åå•çš„功能:在主仪å¼çŸ³ä¸Šæ”¾ä¸€ä¸ªç®±å­ï¼Œç„¶åŽå°†é‚£äº›ä¸Žä¸æƒ³è¢«ä¼ é€çš„玩家绑定的物å“放进箱å­é‡Œï¼Œè¿™äº›çŽ©å®¶å°±ä¸ä¼šè¢«ä¼ é€èµ°äº†ã€‚\n\tæ¯ä¼ é€æˆåŠŸä¸€æ¬¡ä¼šæ¶ˆè€—2000LP。 -guide.bloodmagic.entry.ritual.zephyr.info=和风之唤——以一把å¤å‰‘çš„å字命å——å¯ä»¥è—‰ç”±é£Žçš„力é‡å°†é™„近的物å“å·èµ·æ¥å¹¶é€å…¥ä¸Žä¹‹é“¾æŽ¥çš„ç®±å­é‡Œï¼ˆé»˜è®¤ï¼Œåªéœ€è¦æŠŠç®±å­æ”¾åœ¨ä¸»ä»ªå¼çŸ³æ­£ä¸Šæ–¹å³å¯ï¼‰ã€‚这个过程大概一瞬间就å¯ä»¥å®Œæˆï¼Œæ‰€ä»¥ä½ ä¸ç”¨æ‹…心有什么奇怪的å¸åŠ›é—®é¢˜ï¼\n\t默认的工作范围是主仪å¼çŸ³æ–¹åœ†5格之内的方形。 -guide.bloodmagic.entry.ritual.laying.info=很多时候,自动化任务需è¦æŸç§è‡ªåŠ¨æ”¾ç½®æ–¹å—的手段。这个仪å¼ä¾¿å¯ä»¥ä»Žé™„è¿‘çš„ç®±å­ä¸­ï¼ˆé»˜è®¤ï¼Œæ˜¯ä¸»ä»ªå¼çŸ³æ­£ä¸Šæ–¹ï¼‰å–出方å—并放置在仪å¼çš„内部。具体æ¥è¯´ï¼Œæ˜¯æ”¾ç½®åœ¨è·ç¦»ä¸»ä»ªå¼çŸ³ä¸¤æ ¼è¿œçš„地方,且高度相åŒã€‚å分适åˆåœ¨å»ºé€ æ ‘场时用于自动ç§æ ‘苗。æ¯æ”¾ç½®ä¸€ä¸ªæ–¹å—消耗50LP。 -guide.bloodmagic.entry.ritual.timberman.info=ç§äº†ä¸€å †æ ‘?想必你需è¦è¿™ä¸ªä»ªå¼ã€‚ä¼æž—仪å¼ä¼šå°†ä»ªå¼æŒæœ‰è€…çš„LP用æ¥é©±ä½¿ä¸€ä¸ªæ— å½¢çš„å¹½çµï¼Œä»¥ç ä¼é™„近的树木,并将ç ä¸‹æ¥çš„木头放入附近的箱å­é‡Œã€‚默认,它的工作范围是主仪å¼çŸ³å¾€ä¸Š30格,æ¯ä¸ªæ°´å¹³æ–¹å‘上å„延伸10格形æˆçš„长方体。æ¯ç æŽ‰ä¸€å—木头需è¦æ¶ˆè€—10LP。 -guide.bloodmagic.entry.ritual.meteor.info=就目å‰æ¥è¯´ï¼Œè¿™ä¸ªä»ªå¼æ˜¯æ‰€æœ‰ä»ªå¼ä¸­æœ€å¼ºå¤§çš„仪å¼ä¹‹ä¸€ã€‚激活此仪å¼éœ€è¦æ¶ˆè€—一百万LP,并且还有一段冷å´æ—¶é—´ã€‚然而它的效果也å分强大——åªéœ€æä¾›åˆé€‚的祭å“,它就å¯ä»¥ä»Žå®‡å®™ä¸­å¬å”¤ä¸€é¢—陨石并直接砸å‘地é¢ã€‚诚然,这样一个大家伙会在地é¢ä¸Šé€ æˆå¤§çˆ†ç‚¸ï¼Œä½†å› ä¸ºå®ƒæ¥è‡ªå®‡å®™ä¸­ï¼Œæ‰€ä»¥å¯èƒ½ä¼šåŒ…å«å¤§é‡ç¨€æœ‰çŸ¿çŸ³ã€‚ \n\t/cutå¯ç”¨çš„祭å“包括é“å—ã€é‡‘å—和钻石。(事实上,å¯ç”¨çš„祭å“是å¯ä»¥è¢«æ•´åˆä½œè€…或用户控制的) -guide.bloodmagic.entry.ritual.downgrade.info=为了获得更强大的力é‡ï¼Œä½ æˆ–许需è¦çŒ®ç¥­æŸç§ä¸œè¥¿ä½œä¸ºäº¤æ¢ã€‚而这“沉é‡çµé­‚çš„å¿æ‚”â€çš„任务正是如此——将一些物å“献祭给一个虚无缥缈的实体,你便å¯ä»¥ä»¥æŸçµæŠ¤ç”²çš„属性下é™ä¸ºä»£ä»·ï¼Œæ¥æ¢å–更多的å‡çº§ç‚¹æ•°ã€‚仪å¼è½æˆåŽï¼Œä½ éœ€è¦åœ¨æœ€é«˜çš„空白仪å¼çŸ³æŒ‚一个é¢æœä¸»ä»ªå¼çŸ³çš„物å“展示框,然åŽåœ¨è–„暮仪å¼çŸ³ä¸Šæ”¾ä¸€ä¸ªèƒ½è£…东西的方å—(例如箱å­ï¼‰ã€‚è¦çŒ®ç¥­çš„物å“需è¦æ”¾å…¥é‚£ä¸ªè£…东西的地方,而核心物å“/cut应挂入物å“展示框内。仪å¼æ¿€æ´»åŽï¼Œä½ ä¾¿å¯ä»¥è¹²åœ¨ä¸»ä»ªå¼çŸ³ä¸Šå¹¶èŽ·å¾—é™çº§åŽçš„物å“。\n\t举例,对于淬ç«é™çº§æ¥è¯´ï¼Œæ ¸å¿ƒç‰©å“是个水瓶,需è¦çŒ®ç¥­çš„物å“是龙æ¯ã€‚\n\t所有å¯ç”¨çš„é™çº§éƒ½å¯ä»¥é€šè¿‡JEI查询到——查询主仪å¼çŸ³çš„用途å³å¯ã€‚å¦å¤–,对于一个特定的é™çº§æ¥è¯´ï¼Œæ ¸å¿ƒç‰©å“是一定的,所以你也å¯ä»¥é€‰æ‹©æŸ¥è¯¢æŸä¸ªç‰©å“æ¥å®šä½æŸä¸ªé™çº§æ‰€éœ€çš„祭å“。 -guide.bloodmagic.entry.ritual.crystalSplit.info=晶化æ¶é­”æ„志一旦形æˆï¼Œå°±ä¸èƒ½å†é‡æ–°åˆ†è§£æˆå…¶ä»–类型的æ„志——至少我之å‰æ˜¯è¿™ä¹ˆè®¤ä¸ºçš„。“结晶共鸣â€ä»ªå¼å¯ä»¥åˆ©ç”¨å››å…ƒç´ ä»ªå¼çŸ³ï¼Œä»ŽåŽŸç”Ÿæ¶é­”æ„志中分离出å„ç§å…¶ä»–类型的æ¶é­”æ„志。\n\t首先è¦åœ¨ä¸»ä»ªå¼çŸ³ä¸Šæ–¹ä¸¤æ ¼å¤„放置原生æ„志晶簇。你å¯ä»¥åœ¨ä¸»ä»ªå¼çŸ³ä¸Šæ”¾ä¸€åº§ç»“晶å›ï¼Œç»“晶å›ä¸Šæ”¾ç½®æ¶é­”晶簇,这样就å¯ä»¥äº†ã€‚然åŽï¼Œç¡®ä¿å››ç§å…ƒç´ çš„仪å¼çŸ³ä¸Šä¸èƒ½æœ‰æ–¹å—/cuté®æŒ¡ï¼Œç¡®è®¤å®ŒåŽå°±å¯ä»¥ç­‰å¾…结晶生长了。\n\t晶簇长出五瓣åŽï¼Œè¿™ä¸ªä»ªå¼å°±ä¼šå°†å››ç“£æ™¶ç°‡åˆ†ç¦»å‡ºåŽ»ï¼Œæ­¤æ—¶å››å…ƒç´ ä»ªå¼çŸ³ä¸Šä¼šé•¿å‡ºè…蚀ã€åšæ¯…ã€æ¶æ„和破åå››ç§ç±»åž‹çš„æ¶é­”晶簇å„一瓣。若中间的原生晶簇ä»èƒ½ç»§ç»­ç”Ÿé•¿ï¼Œä¸”周围的四ç§å…¶ä»–类型的晶簇ä»ç„¶ä¿æŒå®Œæ•´ï¼Œé‚£ä¹ˆè¿™ä¸ªè¿‡ç¨‹å°±ä¼šæŒç»­ä¸‹åŽ»ã€‚\n\t这个过程的工作原ç†å¾ˆç®€å•ï¼Œ/cut原生æ„志晶簇有五瓣或者更多瓣的时候,仪å¼ä¼šæ”¶å‰²å…¶ä¸­çš„四瓣,转化为更无形的存在。然åŽï¼Œæ–°äº§ç”Ÿçš„æ„志就会被推出原生æ¶é­”晶簇的范围,迫使类型相近的æ„å¿—èšé›†åœ¨ä¸€èµ·ã€‚ä¸åŒç±»åž‹çš„æ„志最终会在仪å¼çŸ³ä¸Šé›†ç»“,而仪å¼çŸ³æœ¬èº«ä¹Ÿæ˜¯å¯ä¾›æŸç§éžåŽŸç”Ÿæ„志生长的基础。 - -# Architect Entries -guide.bloodmagic.entry.architect.intro=å‰è¨€ -guide.bloodmagic.entry.architect.bloodaltar=è¡€ä¹‹ç¥­å› -guide.bloodmagic.entry.architect.ash=å¥¥æœ¯ç²‰ç° -guide.bloodmagic.entry.architect.divination=å åœå°è®° -guide.bloodmagic.entry.architect.soulnetwork=çµé­‚网络 -guide.bloodmagic.entry.architect.weakorb=虚弱气血å®ç  -guide.bloodmagic.entry.architect.incense=ç†é¦™ç¥­å› -guide.bloodmagic.entry.architect.bloodrune=祭å›å‡çº§ -guide.bloodmagic.entry.architect.inspectoris=指示之书 -guide.bloodmagic.entry.architect.runeSpeed=速度符文 -guide.bloodmagic.entry.architect.water=水之å°è®° -guide.bloodmagic.entry.architect.lava=熔岩å°è®° -guide.bloodmagic.entry.architect.lavaCrystal=熔岩水晶 -guide.bloodmagic.entry.architect.apprenticeorb=学徒气血å®ç  -guide.bloodmagic.entry.architect.dagger=牺牲匕首 -guide.bloodmagic.entry.architect.runeSacrifice=献祭符文 -guide.bloodmagic.entry.architect.runeSelfSacrifice=牺牲符文 -guide.bloodmagic.entry.architect.holding=集æŒå°è®° -guide.bloodmagic.entry.architect.air=风之å°è®° -guide.bloodmagic.entry.architect.void=虚空å°è®° -guide.bloodmagic.entry.architect.greenGrove=绿丛å°è®° -guide.bloodmagic.entry.architect.fastMiner=速掘å°è®° -guide.bloodmagic.entry.architect.seer=è§è§£å°è®° -guide.bloodmagic.entry.architect.magicianOrb=法师气血å®ç  -guide.bloodmagic.entry.architect.capacity=增容符文 -guide.bloodmagic.entry.architect.displacement=转ä½ç¬¦æ–‡ -guide.bloodmagic.entry.architect.affinity=元素å°è®° -guide.bloodmagic.entry.architect.lamp=血光å°è®° -guide.bloodmagic.entry.architect.magnetism=ç£å¼•å°è®° -guide.bloodmagic.entry.architect.peritia=ç»éªŒä¹‹ä¹¦ -guide.bloodmagic.entry.architect.livingArmour=æŸçµæŠ¤ç”² -guide.bloodmagic.entry.architect.upgradeTome=æŸçµæŠ¤ç”²å‡çº§ä¹‹ä¹¦ -guide.bloodmagic.entry.architect.teleposer=ä¼ é€å™¨ -guide.bloodmagic.entry.architect.boundBlade=æŸç¼šä¹‹å‰‘ -guide.bloodmagic.entry.architect.boundTool=æŸç¼šå·¥å…· -guide.bloodmagic.entry.architect.weakShard=虚弱气血碎片 -guide.bloodmagic.entry.architect.masterOrb=导师气血å®ç  -guide.bloodmagic.entry.architect.runeOrb=å®ç ç¬¦æ–‡ -guide.bloodmagic.entry.architect.suppression=抑液å°è®° -guide.bloodmagic.entry.architect.haste=急速å°è®° -guide.bloodmagic.entry.architect.severance=ç»å½±å°è®° -guide.bloodmagic.entry.architect.teleposition=ä¼ é€å°è®° -guide.bloodmagic.entry.architect.compression=压挤å°è®° -guide.bloodmagic.entry.architect.bridge=影桥å°è®° -guide.bloodmagic.entry.architect.mimic=æ‹Ÿæ€ -guide.bloodmagic.entry.architect.downgrade=æŸçµæŠ¤ç”²é™çº§ - -guide.bloodmagic.entry.architect.augmentedCapacity=超容符文 -guide.bloodmagic.entry.architect.charging=充能符文 -guide.bloodmagic.entry.architect.acceleration=促进符文 - -guide.bloodmagic.entry.architect.tier3=æµ·æ´‹ä¹‹ä¸‹çš„ä¸‰çº§ç¥­å› - -# Architect Entry Texts -guide.bloodmagic.entry.architect.intro.info=大家好,我å«æ比略。你或许已ç»å‘现这本书并ä¸å®Œæ•´äº†ï¼Œä½†å¾ˆä¸å¹¸ä½ æ˜¯å¯¹çš„。因为1.7.10->1.8.9->1.9.4åŠä»¥ä¸Šçš„更新,血魔法也å‘生了巨大的å˜åŒ–。因此,这本书ä¸å¾—ä¸é‡å†™ã€‚这本书的最终目标是一本研究笔记,或者说是一本真正的书,所以è·ç¦»è¿™æœ¬ä¹¦çœŸæ­£å®Œæˆè¿˜æœ‰ä¸€æ®µè·ç¦»ã€‚有鉴于此,我会定期填补这本书中的空白。当然了,一开始这本书里将全是读起æ¥å‘³åŒåš¼èœ¡çš„文字(嘛...肯定ä¸æ˜¯é‚£ç§å¼•äººå…¥èƒœçš„å­—/cut啦,好啦ä¸è¦åœ¨æ„细节),但这个情况会éšç€æ—¶é—´çš„推移而得到改善的,等待ç€ä½ çš„将会是一部血法师们的心路历程。\n\t但ä¸å¥½æ„æ€æˆ‘想我得赶紧é‡æ–°åˆ‡å…¥è§’色当中去了。*咳嗽声*\n\t我åæ比略,一å血法师,åŒæ—¶ä¹Ÿä»¥â€œç¼”造者â€çš„åå­—é—»å于世。这本书中包å«äº†æˆ‘对å为“çµé­‚网络â€çš„自然现象的研究,以åŠæˆ‘对血魔法师需/cutè¦é€‚应的一些设备的物ç†ç‰¹æ€§çš„æ述。从æ­å»ºå¼ºå¤§çš„血之祭å›çš„技艺,到为增强法力而进行的生命献祭的ç§ç§ç»†èŠ‚,å†åˆ°å„ç§æ‹¥æœ‰å¼ºå¤§åŠ›é‡çš„魔法符文和å°è®°ï¼Œæˆ‘ä¸æ–­åœ°å‘现新的魔法,ä¸æ–­åœ°æ€»ç»“并找到强化自己的全新方å¼ã€‚\n\tæ¥å§ï¼Œæ–°å…¥é—¨çš„魔法师们,全新的领域在等待ç€ä½ ï¼\n\t...啊马格斯说我有时候有点浮夸,但那åˆå¦‚何? -guide.bloodmagic.entry.architect.bloodaltar.info.1=血之祭å›ä¾¿æ˜¯è¡€é­”法中最核心的设备之一。它有两个主è¦ç”¨é€”:åˆæˆæŸäº›ç‰©å“,或将生命æºè´¨è½¬ç§»åˆ°å®ç ä¸­åŽ»ã€‚然而这两个用途都需è¦æ¶ˆè€—祭å›ä¸­çš„生命æºè´¨ã€‚自然地,也有两ç§è¡¥å……生命æºè´¨çš„æ–¹å¼ï¼šä»¥çŽ©å®¶çš„è¡€æ供生命æºè´¨ï¼Œæˆ–以别的动物或怪物的血æ供生命æºè´¨ã€‚ -guide.bloodmagic.entry.architect.bloodaltar.info.2=你需è¦ä¸€æŠŠç‰ºç‰²åŒ•é¦–æ‰èƒ½å°†ä½ çš„血转化为生命æºè´¨å¹¶æ³¨å…¥ç¥­å›ä¸­ã€‚具体æ“作如下:首先,站在祭å›æ—;然åŽï¼Œä½¿ç”¨åŒ•é¦–伤害自己(å³å³å‡»ï¼‰ï¼Œä½ ä¼šæŸå¤±ä¸€é¢—心的生命值,祭å›ä¸­ä¼šå¤šå‡º 200 LP。LP 是生命æºè´¨çš„ å•ä½ï¼Œç§°ä¸ºç”Ÿå‘½ç‚¹æ•°ï¼ˆLife Point, 缩写 LP),用于刻画æŸç§ä»» 务需è¦æ¶ˆè€—的生命力——ä¸ï¼Œå’Œæ¸¸æˆçŽ‹ä¸ä¸€æ ·ã€‚默认,普通的血之祭å›å®¹é‡ä»…为一万。你还å¯ä»¥æŠŠç‰©å“放入祭å›ä¸­ï¼ˆå³å‡»å³å¯ï¼‰ï¼Œè‹¥å¦‚æ­¤åšï¼Œåˆé€‚çš„/cut物å“便会触å‘åˆæˆè¿›ç¨‹ã€‚\n\t祭å›åˆæˆä¸ä»…需è¦æ¶ˆè€— LP,还需è¦ä¸€å®šçš„层级。满足 这些æ¡ä»¶åŽï¼Œç¥­å›ä¾¿ä¼šå¼€å§‹è‡ªåŠ¨æŠ½å– LP 用于åˆæˆï¼Œå¹¶å¼€ 始散å‘红色粒å­æ•ˆæžœã€‚è‹¥åˆæˆè¿˜æœªå®Œæˆï¼Œä½†æ­¤æ—¶ LP 已被 抽干,红色的粒å­æ•ˆæžœä¼šè½¬ä¸ºç°è‰²ï¼Œåˆæˆè¿›åº¦ä¹Ÿä¼šå¼€å§‹å€’退,所以尽é‡é¿å…è¿™ç§æƒ…况的出现ï¼æœ€åŽè¿˜æœ‰ä¸€ç‚¹ï¼Œå¦‚果你放进祭å›é‡Œçš„东西是气血å®ç ï¼Œé‚£ä¹ˆå®ƒ 会散å‘紫色的粒å­æ•ˆæžœï¼Œè¡¨æ˜Žå®ƒåœ¨å‘æŸä¸ªå®ç ä¸­çŒè¾“ LP。\n\t事实上,祭å›ä¸­æœ‰ä¸‰ä¸ªå­˜å‚¨ LP 的容器:之å‰æ到的一万容积指的是其主容器;除此之外,祭å›è¿˜æœ‰è¾“入容器和输出容器å„一,容积å‡ä¸ºä¸»å®¹å™¨å®¹ç§¯çš„å分之一。默认,输入容器中的生命æºè´¨ä¼šä»¥æ¯ç§’ 20 LP 的速度转移至主容器中,而主容器中的生命æºè´¨ä¹Ÿä¼šä»¥åŒæ ·çš„速度转移到输出容器中。如此一æ¥ï¼Œè¾“入容器和输出/cut容器在祭å›ä¸­æ‰®æ¼”的便是缓冲区的角色——它们是用æ¥é™åˆ¶å°†ç”Ÿå‘½æºè´¨è¾“入祭å›ï¼Œå’Œä»Žç¥­å›ä¸­å°†ç”Ÿå‘½æºè´¨æŠ½å–出æ¥çš„速度的。 -guide.bloodmagic.entry.architect.ash.info=尽管奥术粉ç°å¹¶ä¸æ˜¯è¿™ä¸€å·çš„核心,但它确实贯穿了本å·æ到的很多é“å…·çš„åˆæˆä¹‹ä¸­ã€‚åˆæˆå¥¥æœ¯ç²‰ç°éœ€è¦ç”¨åˆ°ç‹±ç«ç†”炉和æ¶é­”æ„志,关于这些东西的细节å¯ä»¥å‚考《æ¶é­”之å­ã€‹å·ã€‚简å•æ¥è¯´ï¼Œå®ƒæ˜¯ä¸€ç§äºŒå…ƒåˆæˆå·¥å…·ï¼šä½ éœ€è¦ä¸€ç§å¯å……当催化剂的å应试剂,以åŠæŸç§ç‰©å“作为次è¦åˆæˆæ料。\n\t一份奥术粉ç°å¯ä½¿ç”¨äºŒå次。对ç€åœ°é¢æˆ–者墙å£ä½¿ç”¨ä¾¿/cutå¯ç”»å‡ºä¸€ä¸ªåœ†å½¢çš„法阵(如果是墙å£ï¼Œä½ åªèƒ½åœ¨ä¸€ä¸ªæ–¹å‘上看到法阵)。然åŽï¼Œå¯¹æ³•é˜µä¸­å¤®ä½¿ç”¨åˆé€‚的催化剂å³å¯æ”¹å˜å…¶å½¢çŠ¶ï¼Œå½“然也会消耗催化剂(å³ï¼Œå³å‡»ä½¿ç”¨ï¼‰ã€‚如果法阵没有å˜å½¢ï¼Œé‚£ä¹ˆä½ è‚¯å®šæœ‰ä»€ä¹ˆåœ°æ–¹æžé”™äº†ã€‚\n\t在观察到法阵å˜å½¢åŽï¼Œä½ ä¾¿å¯ä»¥æ”¾å…¥æ¬¡è¦ç‰©å“了。åˆé€‚的次è¦ç‰©å“会å¯åŠ¨æ³•é˜µï¼Œå±Šæ—¶ä½ ä¼šçœ‹åˆ°æ³•é˜µå¼€å§‹æ—‹è½¬ï¼Œå¹¶å¼€å§‹äº§ç”Ÿå„ç§å˜åŒ–,具体å˜åŒ–éšæ³•/cut阵ä¸åŒè€Œä¸åŒâ€”—但正确å¯åŠ¨çš„法阵最终都会产生一ç§æ–°çš„物å“。\n\t所有用到奥术粉ç°çš„åˆæˆâ€”—我一般管这å«ç‚¼é‡‘阵列——都å¯ä»¥åœ¨JEI中查询到。注æ„,左侧的物å“一定是催化剂,而å³ä¾§çš„物å“一定是一个次è¦ç‰©å“。 -guide.bloodmagic.entry.architect.divination.info=å åœå°è®°æ˜¯è¡€æ³•å¸ˆæœ€å¸¸ç”¨çš„工具之一,因为它能解决你很多麻烦,具体æ¥è¯´æ˜¯èƒ½ç»™ä½ ä¸€äº›å…³é”®æ•°æ®ã€‚它的åˆæˆä¹Ÿå¾ˆç®€å•ï¼šåªéœ€è¦åœ¨ç‚¼é‡‘阵列中以红石为催化剂,以石æ¿ä¸ºæ¬¡è¦ç‰©å“åˆæˆå³å¯ã€‚\n\t对血之祭å›ä½¿ç”¨æ­¤å°è®°ä¾¿å¯çœ‹åˆ°ç¥­å›ä¸»å®¹å™¨ä¸­çš„LPæ•°é‡ï¼Œä»¥åŠå®¹é‡ä¸Šé™ã€‚短时间内åå¤ä½¿ç”¨å¹¶ä¸ä¼šå¯¼è‡´åˆ·å±ï¼Œåªä¼šè¦†ç›–之å‰çš„æ示。\n\t/cut对ç€ç©ºæ°”使用此å°è®°çš„è¯ï¼Œåˆ™èƒ½çœ‹åˆ°ä½ çš„çµé­‚网络中的LPæ•°é‡ã€‚尽管这功能看上去很普通,但你以åŽå°±ä¼šå‘现,你一刻也ä¸æƒ³è®©è¿™çŽ©æ„离手。 -guide.bloodmagic.entry.architect.soulnetwork.info=çµé­‚网络(Soul Network,缩写 SN)是指玩家和å„ç§ç‰©å“以 åŠç»“构之间的çµé­‚上的链接。éšç€è¡€æ³•å¸ˆèƒ½åŠ›çš„æå‡ï¼Œçµé­‚网络的强度也会éšä¹‹æ高。就存在æ¥è¯´ï¼Œå®ƒä»¬æ˜¯çµé­‚织æˆçš„一张无形的网,但最强大的血魔法师们是å¯ä»¥çœ‹åˆ°å…¶ç‰©ç†çš„具现的。然而,时至今日,ä»æ— äººå¯è¾¾æ­¤åŒ–境...\n\t在游æˆä¸­ï¼Œç½‘络是直接与玩家绑定在一å—的。玩家所在的世界早已记录下了这一切——/cutè¿™æ„味ç€ï¼ŒçŽ©å®¶çš„ LP 并éžæ˜¯ 记录在æŸé¢—气血å®ç ä¸­ï¼Œè€Œæ˜¯è¢«ä¸–界记录ç€ï¼›æ¯ä¸ªçŽ©å®¶ä¹‹é—´çš„网络互相独立,互ä¸å½±å“。\n\t绑定的过程通常在第一次使用æŸä¸ªç‰©å“时就已ç»å®Œæˆäº†ã€‚就目å‰çš„科技æ¥è¯´ï¼Œä¸€æ—¦ç»‘定,å³ä¾¿æ˜¯ç‰©å“的主人也无法解除。需è¦æ¶ˆè€—LP的物å“会直接消耗其主人çµé­‚网络中的LP。但,如果主人的çµé­‚网络中没有足够的 LP,它会从 当å‰ä½¿ç”¨è€…,而ä¸æ˜¯å…¶ä¸»äººï¼Œçš„身上抽å–生命值以填补空缺。因此,在快没有LP的时候è¦å°å¿ƒâ€”—因为这通常会致人于死地。 -guide.bloodmagic.entry.architect.weakorb.info.1=没了魔法æ¥æºçš„魔法师和咸鱼有什么区别?气血å®ç ä¾¿æ˜¯è¿™æ ·ä¸€ä¸ªé­”法æºï¼šå®ƒå¯ä»¥å°†ç‰©ç†å½¢å¼çš„生命转化æˆLP并输入到其主人的çµé­‚网络中去。它本身并éžç”µæ± ï¼Œç›¸å它倒åƒæ˜¯ä¸€æ ¹å¯¼ç®¡ï¼Œå¯å°†ç”Ÿå‘½åŠ›è½¬åŒ–æˆè¡€é­”法师需è¦çš„魔法。 -guide.bloodmagic.entry.architect.weakorb.info.2=虚弱气血å®ç ä¾¿æ˜¯ä½ èƒ½åˆ¶ä½œçš„第一ç§å®ç â€”—åªéœ€å‘一粒钻石中çŒæ³¨ä¸¤åƒLP的生命力å³å¯å®Œæˆã€‚将已绑定的å®ç æ”¾å…¥ç¥­å›ï¼Œå®ƒå°±å¯ä»¥ä¸æ–­åœ°ä»Žç¥­å›ä¸­æŠ½å–LP,直接输入çµé­‚网络中。å¦å¤–,ä¸è®ºä»€ä¹ˆå®ç ï¼Œå…¶å®¹é‡ä¸Šé™éƒ½åªèƒ½é€šè¿‡ä¸€äº›é«˜çº§ç¬¦æ–‡æ¥æå‡ï¼›è¿™é‡Œæ³¨æ„一点,这个容é‡æå‡çš„效果åªæœ‰åœ¨å®ç åœ¨ç¥­å›ä¸Šæ—¶æ‰æœ‰æ•ˆã€‚对于虚弱气血å®ç ï¼Œæœ€é«˜åªèƒ½æå‡åˆ°äº”åƒã€‚\n\t/cut玩家还å¯ä»¥é€šè¿‡ç®€å•åœ°ä½¿ç”¨æ°”è¡€å®ç æ¥èŽ·å¾—LP——æ¯ä¸€æ¬¡ä½¿ç”¨éƒ½ä¼šå¯¹çŽ©å®¶é€ æˆä¸€é¢—心的伤害并æä¾›200LP。此法ä¸èƒ½ä»¤ç½‘络中的LPæ•°é‡çªç ´å®¹é‡ä¸Šé™ã€‚\n\t祭å›åªå¯èƒ½ä¸ºä¸Žè‡ªå·±çº§åˆ«ç›¸å½“,或者比自己级别低的气血å®ç æä¾›LP。举例,三级的å®ç åªå¯èƒ½åœ¨ä¸‰çº§æˆ–更高级的祭å›ä¸­èŽ·å¾—LP,一级的祭å›æ˜¯æ— æ³•èƒœä»»çš„。 -guide.bloodmagic.entry.architect.incense.info.1=血法师会ç»å¸¸å‘现,它们的LP产能时常跟ä¸ä¸Šæ¶ˆè€—。当然,有特殊的符文å¯ä»¥æ高自我献祭所产生的生命æºè´¨çš„æ•°é‡ï¼Œä½†è¿™ä¸ªè¿‡ç¨‹ä¾æ—§æ˜¯å¦‚此缓慢。åªæœ‰è¿™ä¸€æ¡è·¯å¯ä»¥èµ°äº†å—?\n\t下é¢ä»‹ç»ç†é¦™ç¥­å›ã€‚ç†é¦™ç¥­å›æœ¬èº«å¯ä»¥ä»¥è‡ªèº«ä¸ºä¸­å¿ƒï¼Œæ ‡è®°å‡ºä¸€ç‰‡é™è°§çš„土地,在这范围内,它å¯ä»¥å€ŸåŠ©ç¥­å›æœ¬èº«æ•£å‘出的余力æ¥å®‰æŠšæƒŠæ‰°åˆ°çš„çµé­‚。当然你ä¸æ˜¯å¾ˆæ¸…楚这/cutè‚¡ç†é¦™çš„æ°”æ¯ä»Žä½•è€Œæ¥ï¼Œä½†å¥½åƒåˆæ²¡ä»€ä¹ˆä¸å¯¹ï¼Ÿå…ˆä¸ç®¡äº†ã€‚\n\tç†é¦™ç¥­å›çš„作用就是如此:利用é™è°§çš„环境æ¥æå‡å•é¢—心所创造出的生命æºè´¨çš„æ•°é‡ã€‚在你è·ç¦»ç†é¦™ç¥­å›åªæœ‰çº¦èŽ«äº”格远的地方时,它会散å‘出ç«ç„°é¢—粒以è¯æ˜Žå…¶å·²ç»åˆ›é€ å‡ºé™è°§åŒºåŸŸã€‚在它的影å“范围下,你的牺牲匕首也会å‘生å˜åŒ–,以è¯æ˜Žç†é¦™å·²ç»å‘挥其效果。整个过程大约æŒç»­äº”秒钟,你å¯ä»¥é€šè¿‡è§‚察ç«ç„°/cutç²’å­çš„存在æ¥åˆ¤æ–­æ˜¯å¦ç»“æŸã€‚此时,使用牺牲匕首献祭自己将会一次性献祭你生命值上é™çš„百分之ä¹å,并将对应数é‡çš„LP输入血之祭å›ä¹‹ä¸­ã€‚LPæ•°é‡å’ŒçŒ®ç¥­çš„生命值ä¾æ—§æˆæ­£æ¯”,但此时它的转化率会根æ®é™„è¿‘çš„é™è°§å€¼è€Œæœ‰æ‰€ä¸Šå‡ï¼›é»˜è®¤ï¼Œå¢žå¹…是百分之二å。\n\tå¦å¤–,å åœå°è®°å¯ä»¥æ­ç¤ºé™„è¿‘çš„é™è°§å€¼ï¼Œä»¥åŠé™è°§æ‰€å¸¦æ¥çš„具体增幅水平。 -guide.bloodmagic.entry.architect.incense.info.2=自然,百分之二å的增幅已ç»å¤Ÿå¤šäº†ï¼Œä½†ç†é¦™ç¥­å›ä½œç”¨çš„范围还是å¯ä»¥ç»§ç»­æ‰©å±•çš„。你åªéœ€è¦åœ¨ç†é¦™ç¥­å›æŸä¸ªåŸºç¡€æ–¹å‘(å³ï¼Œæ­£ä¸œã€æ­£è¥¿ã€æ­£å—ã€æ­£åŒ—)两格远的地方排出一列三å—高度一样木质路é¢å³å¯å®šä¹‰ä¸€ä¸ªâ€œèŒƒå›´â€ã€‚在此“范围â€ä¸­çš„ä»»æ„æ–¹å—都有助于让这片区域更加é™è°§ã€‚木质路é¢è¿˜å¯ä»¥ç»§ç»­æ‰©å±•ï¼ŒæƒŸéœ€éµå®ˆä»¥ä¸‹è§„则:一,æ¯ä¸€åˆ—木质路é¢å¿…须水平,å³æž„æˆæ–°ä¸€åˆ—è·¯é¢çš„æ–¹å—必须高度相åŒï¼›äºŒï¼Œæ–°çš„è·¯é¢å¿…é¡»ä½äºŽä¸Šä¸€åˆ—è·¯é¢çš„上/cut下五格范围内。简å•æ¥è¯´ï¼Œé‡‘å­—å¡”ã€å€’金字塔等阶梯å¼ç»“构都是å¯ä»¥çš„。\n\t然而,这个范围并éžå¯ä»¥æ— èŠ‚制地扩张。木质路é¢åªèƒ½å åŠ ä¸‰åˆ—ï¼›ä¸è¿‡ä¸ç”¨æ‹…心,还有一ç§å¯ä»¥å åŠ äº”列的石质路é¢ï¼›ç”šè‡³è¿˜æœ‰å¯ä»¥å åŠ ä¹åˆ—的碎石路é¢å’Œé»‘曜石路é¢ã€‚自然地,你在å åŠ ä¸‰åˆ—木路é¢åŽå°±éœ€è¦ç”¨çŸ³å¤´çš„;然而你完全å¯ä»¥ä¸€å¼€å§‹å°±ç”¨çŸ³å¤´çš„,åªè¦ä½ ä¸æ˜¯åªç”¨æœ¨è·¯é¢å°±å¥½ã€‚\n\t/cut回到é™è°§ç¨‹åº¦çš„问题上æ¥ã€‚事实上åªæœ‰ä¸€éƒ¨åˆ†æ–¹å—å¯ä»¥è®©è¿™ç‰‡åŒºåŸŸæ›´åŠ é™è°§ï¼Œè€Œæ ¹æ®å®žéªŒï¼Œè¿™äº›æ–¹å—被分æˆäº†è‹¥å¹²ç§ã€‚举个例å­ï¼Œä½ åœ¨è¿™ç‰‡åŒºåŸŸä¸­ç§äº†åœŸè±†ï¼ŒåœŸè±†å±žäºŽâ€œä½œç‰©â€åˆ†ç±»ï¼Œç„¶åŽè¿™ç‰‡åŒºåŸŸä¾¿å¹³é™äº†ä¸€äº›ã€‚ä¸è®ºæ˜¯ä½ æŽ¥ç€ç§åœŸè±†ï¼Œæˆ–者你ç§èµ·äº†èƒ¡èåœï¼Œå®ƒä»¬çš„效果都会éšç€ä½ ç§çš„æ•°é‡çš„增多而é™ä½Žï¼Œç”šè‡³è¿˜ä¼šæŠµæ¶ˆä¸€å¼€å§‹çš„效果,因为它们都属于“作物â€ã€‚为了最好的效果,你需è¦å°½å¯èƒ½ä½¿ç”¨å¤šç§ä¸åŒç±»åž‹çš„æ–¹å—。/cut有助于平é™çš„æ–¹å—有这么几类:作物ã€åŽŸæœ¨ã€æ ‘å¶ã€ç†”岩ã€åœ°ç‹±å²©ã€è€•åœ°ã€æ°´ã€ç”Ÿå‘½æºè´¨ã€ä»¥åŠå…¶ä»–东西(原文如此)。 -guide.bloodmagic.entry.architect.bloodrune.info.1=éšç€ä½ é€æ¸æ·±å…¥è¡€é­”法,你会å‘现你那普普通通的血之祭å›å·²æ— æ³•æ»¡è¶³ä½ çš„需è¦äº†ã€‚但你还å¯ä»¥é€šè¿‡æ”¾ç½®ä¸€ç§å为气血符文的特殊方å—æ¥æå‡ç¥­å›çš„整体属性,进而解é”更多的åˆæˆã€‚\n\t将血之祭å›å‡åˆ°2级的方法很简å•ï¼šåœ¨ç¥­å›æœ¬èº«å¾€ä¸‹ä¸€å±‚放置八个一圈的气血符文。如果你实在æžä¸æ¸…楚具体的ä½ç½®ï¼ŒæŒ‡ç¤ºä¹‹ä¹¦å¯ä»¥å¸®åˆ°ä½ â€”—它å¯ä»¥ä»¥ä¸€ç§ç±»ä¼¼å…¨æ¯æŠ•å½±çš„/cutæ–¹å¼æŒ‡æ˜Žä½ éœ€è¦æ”¾ç½®æ°”血符文的ä½ç½®ã€‚\n\t尽管åªéœ€è¦ç©ºç™½æ°”血符文就å¯ä»¥å®Œæˆç¥­å›å‡çº§ï¼Œæˆ‘ä»ç„¶æŽ¨è你对使用带有特殊强化的气血符文。祭å›ä¸Šçš„æ¯ä¸€ä¸ªç¬¦æ–‡éƒ½å¯ä»¥è¢«æ¢ä½œç‰¹æ®Šçš„气血符文(唯一的例外是,二级祭å›å››ä¸ªè§’è½ä¸Šçš„特殊符文ä¸ä¼šæœ‰æ•ˆæžœâ€”—但在三级åŠä»¥ä¸Šçš„祭å›ï¼Œè¿™å››ä¸ªä½ç½®çš„特殊符文则å¯ä»¥ä½¿ç”¨ï¼‰ã€‚这些带有特殊强化的气血符文å¯ä»¥æ高/cut祭å›çš„åˆæˆé€Ÿåº¦ã€å®¹é‡ä»¥åŠæ•ˆçŽ‡ã€‚有关这些特殊的气血符文的资料å¯ä»¥åœ¨åŽé¢çš„章节找到。 -guide.bloodmagic.entry.architect.inspectoris.info.1=Inspectoris Scandalum åœ¨æ‹‰ä¸ è¯­ä¸­å¤§æ¦‚çš„æ„æ€æ˜¯â€œæ–¹å—读å–器â€ã€‚事实上,它的用途是,潜行时对ç€æŸä¸ªæ–¹å—使用,便å¯è§£è¯»é‚£äº›å¤æ‚结构的信æ¯ï¼Œå¹¶å°†å…¶æ˜¾ç¤ºåœ¨ä½ çœ¼å‰ã€‚ç›®å‰ï¼Œå®ƒåªèƒ½ç»™å‡ºè¡€ä¹‹ç¥­å›çš„相关信æ¯ï¼šå®ƒå¯ä»¥ç»™å‡ºå‡çº§ç¥­å›æ‰€éœ€çš„æ–¹å—çš„ç§ç±»ï¼Œä»¥åŠå…·ä½“摆放ä½ç½®ã€‚\n\t若你觉得一次一次查询ä¸é€‚åˆä½ ï¼Œä½ å¯ä»¥è¯•ç€æ½œè¡Œæ—¶å¯¹ç€ç©ºæ°”使用此物以切æ¢ç›®æ ‡å±‚/cut级。这样,å†æ¬¡æŒ‰å‰æ–‡æ‰€è¿°çš„æ–¹å¼ä½¿ç”¨æ­¤ç‰©ï¼Œå®ƒå°±å¯ä»¥ä»¥ä¸€ç§ç±»ä¼¼å…¨æ¯æŠ•å½±çš„æ–¹å¼å°†å‡çº§æ‰€éœ€çš„æ–¹å—çš„ä½ç½®æŠ•å½±å‡ºæ¥ã€‚设定级别为1æ—¶å¯ä»¥å…³é—­è¿™ä¸ªç±»å…¨æ¯æŠ•å½±çš„效果。 -guide.bloodmagic.entry.architect.runeSpeed.info.1=速度符文å¯ä»¥æ高祭å›å†…的压力,藉由此加速嬗å˜è¿‡ç¨‹ï¼Œä»Žè€Œæ高åˆæˆé€Ÿåº¦ã€‚æ¯å—速度符文都会æ高20%%的祭å›çš„LP消耗速度。它åŒæ—¶ä¹Ÿä¼šå½±å“çŒæ³¨æ°”è¡€å®ç çš„速度。 -guide.bloodmagic.entry.architect.water.info.1=顾åæ€ä¹‰ï¼Œæ°´ä¹‹å°è®°æ˜¯ä¸€å—å¯å‡èšç©ºæ°”中水分,并将其集中于一点上的å°è®°ã€‚除此之外,对ç€ä»»ä½•èƒ½è£…水的设备使用水之å°è®°éƒ½å¯ä»¥å‘设备里é¢è£…一桶水。总而言之,它便是一个移动的无é™æ°´æºã€‚æ¯æ¬¡ä½¿ç”¨éƒ½ä¼šæ¶ˆè€—50点LP。 -guide.bloodmagic.entry.architect.lava.info.1=若说水之å°è®°å±žé˜´ï¼Œé‚£ä¹ˆï¼Œå±žé˜³çš„便是熔岩å°è®°ã€‚熔岩å°è®°å¯ä»¥å°†ä¸€ç‰‡åŒºåŸŸå†…的石头熔化æˆå²©æµ†ã€‚若是对æŸä¸ªå¯æŽ¥å—æµä½“岩浆的设备使用,这设备里就会多出一桶岩浆。尽管你拿ç€è¿™ä¸ªå°è®°ä¸ä¼šè®©ä½ è‡ªç‡ƒï¼Œä½†è¿™ä¸ç­‰äºŽä½ å¯ä»¥å¼€å§‹æ´—熔岩浴了ï¼è®°å¾—æ¯æ¬¡ä½¿ç”¨æ—¶ä¼šæ¶ˆè€—1000LP。 -guide.bloodmagic.entry.architect.lavaCrystal.info.1=熔岩晶体是å—里é¢å­˜å‚¨äº†ä¸€å›¢æ°¸ä¸å†·å´çš„熔岩的石头。若将其放入熔炉中当燃料使用,它会释放出热é‡ï¼Œè¿™äº›çƒ­é‡æ­£å¥½å¯ä»¥çƒ§ç‚¼ä¸€ä¸ªç‰©å“,然åŽæ¶ˆè€—50LP。若是它没有这么多LPå¯ä»¥æŠ½å–,它也ä¸ä¼šå› æ­¤æŸå,还会因此给网络的主人追加一个å胃效果。\n\tè¿™å—晶体ç†è®ºä¸Šåœ¨ä»»ä½•æ”¯æŒæ ‡å‡†å›ºæ€ç‡ƒæ–™çš„设备中都å¯ä»¥å·¥ä½œã€‚ -guide.bloodmagic.entry.architect.apprenticeorb.info.1=éšç€ä½ çš„新玩具越æ¥è¶Šå¤šï¼Œä½ ä¼šå‘现çµé­‚网络的五åƒLP上é™å·²ç»å¼€å§‹æ‰è¥Ÿè§è‚˜äº†ã€‚是时候åšä¸€é¢—更强大的气血å®ç äº†ã€‚\n\t学徒气血å®ç çš„制作需è¦äºŒçº§è¡€ä¹‹ç¥­å›ï¼Œå¯æä¾›2.5万LP的容é‡ã€‚åŒæ—¶ï¼Œå®ƒä¹Ÿæ˜¯åˆæˆå¾ˆå¤šæ›´é«˜çº§çš„物å“和符文的必须。 -guide.bloodmagic.entry.architect.dagger.info.1=在ä¸æ–­åœ°é€šè¿‡çŒ®ç¥­è‡ªå·±æ¥å¼ºåŒ–自己åŽï¼Œä½ å¯ä»¥å¼€å§‹è¯•ç€çŒ®ç¥­åˆ«çš„活物了。若是用这把牺牲匕首,在血之祭å›é™„近击中一åªæ™®é€šçš„生物(ä¸èƒ½æ˜¯BOSS,也ä¸èƒ½æ˜¯çŽ©å®¶ï¼‰ï¼Œé‚£ä¹ˆè¿™ä¸ªå¯æ€œçš„家伙就会立刻被献祭,并根æ®è´¨é‡çš„ä¸åŒï¼Œè½¬åŒ–æˆæ•°é‡ä¸ç­‰çš„生命æºè´¨ã€‚一般情况下,那些敌对怪物给予的生命æºè´¨è¦æ¯”那些平和的动物们è¦å¤šã€‚ -guide.bloodmagic.entry.architect.runeSacrifice.info.1=献祭符文,正如其å,å¯æ高献祭活物时获得的生命æºè´¨çš„æ•°é‡ï¼Œå‡†ç¡®åœ°è¯´ï¼Œæ˜¯æ¯å—符文增加å分之一。 -guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=牺牲符文和献祭符文差ä¸å¤šï¼Œä½†ç‰ºç‰²ç¬¦æ–‡æ˜¯é’ˆå¯¹çŽ©å®¶è‡ªå·±çš„。增幅和献祭符文一样,都是百分之å。 -guide.bloodmagic.entry.architect.holding.info.1=ä½ é€æ¸å¼€å§‹å‘现你有一堆å„å¼å„æ ·çš„å°è®°è¦å¸¦åœ¨èº«ä¸Šäº†ï¼šæœ‰çš„需è¦æ‰‹åŠ¨å¼€å…³ï¼Œæœ‰çš„åªéœ€è¦æ”¾åœ¨èƒŒåŒ…里就å¯ä»¥ä¸€ç›´æœ‰æ•ˆæžœã€‚有鉴于你的背包空间开始é€æ¸ç¼©æ°´ï¼Œä½ å¯èƒ½éœ€è¦ä¸€å—集æŒå°è®°çš„帮助。\n\t这集æŒå°è®°çš„作用,便是将五个其他å°è®°â€œåŽ‹ç¼©â€æˆä¸€ä¸ªï¼›ä½†æ˜¯ä½ å¹¶ä¸èƒ½åœ¨é›†æŒå°è®°é‡Œæ”¾é›†æŒå°è®°ã€‚默认,按下"Holding"键(默认为'H')å¯æ‰“开其界é¢ï¼Œç”¨äºŽè°ƒæ•´é¡ºåºã€‚滚轮å¯åœ¨é€‰ä¸­/cutçš„å°è®°ä¹‹é—´å¾ªçŽ¯åˆ‡æ¢ã€‚被选中的å°è®°å¯ç›´æŽ¥å€ŸåŠ©é›†æŒå°è®°ä½¿ç”¨ï¼Œæ¯‹éœ€å–出。\n\t自然地,你å¯ä»¥èº«ä¸Šå¸¦è‹¥å¹²é›†æŒå°è®°ï¼Œè¿™äº›é›†æŒå°è®°äº’ä¸å½±å“。但为了一眼就能区分,你å¯ä»¥è€ƒè™‘在炼金术桌中为其染色。染色的方å¼æœ‰ä¸¤ç§ï¼š1.直接使用染料在炼金术桌中染色;2.使用å六进制数命å的命å牌,比如这样:0xFFFFFF。 -guide.bloodmagic.entry.architect.air.info.1=风之å°è®°ï¼Œç®€å•åœ°å°†æ°´è’¸æ°”分æˆæ•°è‚¡ï¼Œäº§ç”Ÿå¼ºå¤§çš„æ°”æµï¼Œé©±ä½¿çŽ©å®¶å‰è¿›ã€‚简å•æ¥è¯´ï¼Œä½ å¯ä»¥ç”¨è¿™å°è®°æŽ¨åŠ¨ä½ å‰è¿›ã€‚å¦å¤–,这个å°è®°å¯ä»¥å…除掉è½ä¼¤å®³ï¼Œä½†åªæœ‰ä½ ä½¿ç”¨æ—¶æ‰å¯ä»¥å…除,所以如果你想硬ç€é™†çš„è¯ï¼Œè®°å¾—è¦åœ¨å³å°†æ‘”åˆ°åœ°ä¸Šçš„ä¸€çž¬é—´ä½¿ç”¨ï¼ -guide.bloodmagic.entry.architect.void.info.1=顾åæ€ä¹‰ï¼Œè™šç©ºå°è®°ä¼šåˆ¶é€ çœŸç©ºï¼Œå¹¶å°†é™„近的液体全部å¸è¿›åŽ»ï¼Œå¹¶å½»åº•é”€æ¯ã€‚建议æ­é…水之å°è®°å’Œç†”岩å°è®°ä½¿ç”¨ã€‚ -guide.bloodmagic.entry.architect.greenGrove.info.1=绿丛å°è®°å¯ä»¥å°†ä½ çš„血转化æˆæ¤ç‰©ç”Ÿé•¿çš„催化剂,进而加速附近æ¤ç‰©çš„生长。激活å°è®°çš„æ–¹å¼å¾ˆç®€å•ï¼šæ½œè¡Œæ—¶å¯¹ç€ç©ºæ°”使用(å³å‡»ï¼‰å³å¯ï¼›ç›¸åŒçš„æ–¹å¼å¯ä»¥åœæ­¢å…¶å·¥ä½œï¼ˆå¯ä»¥é€šè¿‡å…¶ä¿¡æ¯æ示看出它是å¦å·²è¢«æ¿€æ´»ï¼‰ã€‚è¦è®°ä½ï¼Œå®ƒæ¯éš”几秒钟就会抽å–一次LP以补充养料。\n\t直接对作物使用的效果和骨粉无异。这样一æ¥ï¼Œè¿™ä¸ªå°è®°ä¹Ÿå¯ä»¥åƒéª¨ç²‰ä¸€æ ·ï¼Œç”¨äºŽåˆ¶é€ è‰ä¸›ã€‚ -guide.bloodmagic.entry.architect.fastMiner.info.1=大部分血法师都应该注æ„到了,血中å«æœ‰ä¸°å¯Œçš„é“元素。ç»éªŒä¸°å¯Œçš„血法师完全å¯ä»¥åœ¨ä¸æŠ½è¡€çš„情况下直接改å˜å…¶ä½“内血液的组æˆâ€”—然而,需è¦æ³¨æ„的是,åªæœ‰é‚£äº›æœ€é¡¶å°–的血法师æ‰å¯ä»¥æŠµæŠ—由此产生的排斥å应。\n\t这样一个技能有个ç»å…¸çš„用途,æ高身体的çµæ´»æ€§ï¼Œä»¥æ高其è¿åŠ¨é€Ÿåº¦ã€‚这速掘å°è®°ï¼Œé€šè¿‡ç”¨ç£é“å½±å“血液里的é“元素,å¯å¤§å¹…æå‡ä½¿ç”¨è€…的挖掘/cut速度。其实这个效果就是急迫II的效果。虽然åªèƒ½å½±å“使用者自身,但对于挖黑曜石æ¥è¯´çš„确是好用。 -guide.bloodmagic.entry.architect.seer.info.1=你在修ç†è¡€ä¹‹ç¥­å›æ—¶ï¼Œæ—¶å¸¸ä¼šå‘觉自己早已迷失在了那些å åœå°è®°æ— æ³•å¯Ÿè§‰çš„细节中。所以这就是轮到è§è§£å°è®°ç™»åœºçš„时刻了。è§è§£å°è®°å®žé™…上是å åœå°è®°çš„å‡çº§ç‰ˆï¼Œå®ƒèƒ½çœ‹åˆ°å¾ˆå¤šå åœå°è®°æ‰€çœ‹ä¸åˆ°çš„细节,诸如祭å›çš„åˆæˆé€Ÿåº¦ã€å½“å‰çš„LP储é‡ã€åˆæˆè¿›åº¦ã€ç”šè‡³çŽ©å®¶è‡ªå·±çš„çµé­‚网络的很多信æ¯ï¼Œè¿™é‡Œå°±ä¸ä½œèµ˜è¿°äº†ã€‚ -guide.bloodmagic.entry.architect.magicianOrb.info.1=新的祭å›ï¼Œæ–°çš„å®ç ã€‚这次,为了你的新玩具,你需è¦ä¸€é¢—法师气血å®ç ã€‚ä¸è¿‡æœ‰ä¸€ç‚¹è¦æ³¨æ„,åˆæˆæ³•å¸ˆæ°”è¡€å®ç éœ€è¦2.5万LP,但你的祭å›åªæœ‰ä¸€ä¸‡å®¹é‡ã€‚æ¢è¨€ä¹‹ï¼Œåœ¨åˆæˆè¿™é¢—å®ç æ—¶ï¼Œä½ éœ€è¦ä¸æ–­åœ°è¡¥å……生命æºè´¨ã€‚所以,在åˆæˆè¿™é¢—气血å®ç å‰ï¼Œè¯·åŠ¡å¿…åšå¥½ä¸‡å…¨çš„å‡†å¤‡ï¼ -guide.bloodmagic.entry.architect.capacity.info.1=虽然你并ä¸çŸ¥é“具体原ç†ï¼Œä½†è¿™å¢žå®¹ç¬¦æ–‡çš„确能给血之祭å›æ供两åƒçš„é¢å¤–容é‡ã€‚也许,是æŸç§å…±æŒ¯å¯¼è‡´å®¹ç§¯ä¸‹é™ï¼Œç„¶åŽä½ ä¾¿å¯ä»¥å¾€é‡Œé¢è£…入更多的容器?这样一想你倒是想到了进一步改进的方法...\n\t这里有必è¦å†é‡å¤ä¸€é,祭å›æœ¬èº«è¿˜æœ‰ç”¨äºŽç¼“冲的输入和输出容器,容积å‡ä¸ºä¸»å®¹å™¨çš„110%%。增容符文的效果对这两个缓冲容器也有效。 -guide.bloodmagic.entry.architect.displacement.info.1=默认,血之祭å›çš„缓冲区和主容器之间的LP转移速度是最高20LP/s。对于那些需è¦é¢‘ç¹è½¬ç§»LP的祭å›æ¥è¯´è¿™ä¸ªé€Ÿåº¦å¯ä»¥è¯´æ˜¯å·¨å¤§çš„瓶颈。这也是为什么会有转ä½ç¬¦æ–‡çš„原因。\n\t转ä½ç¬¦æ–‡å¯æå‡LP转移的速度。æ¯ä¸ªç¬¦æ–‡éƒ½å¯ä»¥å°†é€Ÿåº¦æ高至原æ¥çš„1.2å€ï¼Œå¤šä¸ªè½¬ä½ç¬¦æ–‡å¯ä»¥å åŠ ã€‚æ¢è¨€ä¹‹ï¼Œä¸€ä¸ªè½¬ä½ç¬¦æ–‡å¯ä»¥å°†é€Ÿåº¦æ高至一次24LP,两个则为28.8LP,三个/cut则为34.56LP,而20个则会达到767LP,足以在13秒内清空一座标准祭å›é‡Œæ‰€æœ‰çš„生命æºè´¨ã€‚ -guide.bloodmagic.entry.architect.affinity.info.1=表é¢ä¸Šçœ‹ï¼Œå…ƒç´ å°è®°ä¸è¿‡æ˜¯ä¸€ä¸ªèƒ½å…ç–«ç«ç„°ã€æººæ°´å’Œæ‘”è½ä¼¤å®³çš„å°è®°ã€‚事实上,它的工作方å¼å¹¶éžå¦‚此——激活此å°è®°åŽï¼Œå®ƒä¼šæ¶ˆè€—汗水(如有必è¦ï¼Œä¼šæ˜¯è¡€ï¼‰ï¼Œç„¶åŽåœ¨ä½¿ç”¨è€…身上形æˆä¸€æ ¼ä¿æŠ¤å±‚,进而抵挡æ„外伤害。\n\t这层空气护盾å¯ä»¥ç¼“冲ç«ç„°å’Œç†”岩的热é‡ï¼Œä¹Ÿå¯ä»¥åœ¨å¿…è¦æ—¶æ供空气以防溺水,åŒæ—¶è¿˜å¯ä»¥åœ¨ä¸æ…Žæ‘”è½æ—¶å……当无形的气垫使用。 -guide.bloodmagic.entry.architect.lamp.info.1=人和动物的血液中还是有“æ‚è´¨â€çš„。åªéœ€è¦æ”¶é›†ä¸€äº›ç¨€æœ‰æ°”体,然åŽè¾…以åˆé€‚的热æºï¼Œå°±å¯ä»¥åœ¨åœ°é¢ä¸Šäº§ç”Ÿä¸€å›¢æ˜Žäº®çš„å…‰çƒï¼Œç…§è€€ç€è¿œå¤„的大地。\n\t血光å°è®°çš„用途有两个:或直接对ç€æ–¹å—使用,产生一个光çƒï¼›æˆ–对ç€ç©ºæ°”使用,将光çƒå‘射到远处。这些光çƒå’Œç«æŠŠä¸€æ ·ï¼Œå¯ä»¥ç©ºæ‰‹æ‰“碎。 -guide.bloodmagic.entry.architect.magnetism.info.1=ç£å¼•å°è®°å¯å°†è¡€æ¶²ä¸­çš„é“元素转化为ç£é“,进而将å°ä»¶ç‰©å“å¸å¼•åˆ°èº«ä¸Šï¼Œå…除原地打转收集物å“的麻烦。就原ç†æ¥çœ‹ï¼Œå®ƒæ˜¯çœŸæ­£çš„物å“ç£é“,因为它并éžæ˜¯æŠŠç‰©å“å¸è¿‡æ¥ï¼Œè€Œæ˜¯çœŸæ­£ç›´æŽ¥æ¡èµ·è¿œå¤„的物å“。幸好这ç£é“çš„ç£åŠ›å¹¶ä¸å¤§ï¼Œä¸ç„¶å½“ä½ æ„外地将爬行者以3马赫的速度å¸è¿‡æ¥çš„时候一切就都结æŸäº†ã€‚ - -guide.bloodmagic.entry.architect.peritia.info.1=在这世界上,有æŸäº›è¡Œä¸ºå¯ä»¥ç´¯ç§¯ä¸€ä¸ªäººçš„ç»éªŒï¼šå‡»æ€æ€ªç‰©ã€é‡‡æŽ˜çŸ¿çŸ³ã€å†¶ç‚¼é‡‘属ã€çƒ¹é¥ªé£Ÿç‰©... åŒæ—¶ï¼Œä¸€äº›ç‰¹æ®Šçš„奥法设备å¯ä»¥ç›´æŽ¥å¸æ”¶è¿™äº›ç»éªŒï¼Œå¹¶ä½œä¸ºå…¶åŠ¨åŠ›ä½¿ç”¨ã€‚因此,若是有一ç§èƒ½å­˜å‚¨ç»éªŒçš„媒介,那就å†å¥½ä¸è¿‡äº†ã€‚\n\t尽管有很多设备都å¯ä»¥å°†è¿™ç»éªŒè½¬åŒ–æˆç‰©ç†å½¢æ€å‚¨å­˜ï¼Œä½†è¿™æœ¬ç»éªŒä¹‹ä¹¦å´æ˜¯ä»¥ä¹¦å†™çŸ¥è¯†çš„æ–¹å¼ï¼Œå°†ä½ è¿‡åŽ»æ‰€ç§¯ç´¯ä¸‹/cutçš„ç»éªŒä¿å­˜ä¸‹æ¥ï¼Œä»¥ä¾›æ—¥åŽä½¿ç”¨çš„。需è¦çš„时候,åªéœ€è¦æ‰‹æŒè¿™æœ¬ä¹¦å°±èƒ½è‡ªåŠ¨å¸æ”¶ä¹¦é¡µä¸­çš„知识,并将其转化为ç»éªŒã€‚\n\t具体æ¥è¯´ï¼Œè¿™æœ¬ä¹¦æ˜¯è¿™æ ·ç”¨çš„:潜行时å³å‡»å³å¯å°†ä¸€çº§ç»éªŒå­˜å…¥ä¹¦ä¸­ï¼ˆè‹¥æœ‰é›¶å¤´ï¼Œåˆ™å…ˆå¸æ”¶é›¶å¤´ï¼‰ã€‚平时å³å‡»ä¸€æ¬¡å¯ç›´æŽ¥èŽ·å¾—一整级ç»éªŒã€‚它所存储的ç»éªŒæ•°é‡å¯åœ¨å…¶ä¿¡æ¯æ示中找到。 -guide.bloodmagic.entry.architect.livingArmour.info.1=在这Minecraft的世界中,所有人,尤其是那些新生的人(译注:应该是指死亡åŽåˆšåˆšé‡ç”Ÿçš„玩家?),都清楚一套好的护甲的é‡è¦æ€§ã€‚通常,护甲的属性是确定的——护甲的ä¿æŠ¤æ€§èƒ½ã€é£žè¡Œçš„能力ã€è·³è·ƒæˆ–跑步的增幅ã€è¯¸å¦‚此类,ä¸èƒœæžšä¸¾ã€‚诚然有这些属性的护甲是好的,但你从未真正é‡åˆ°è¿‡ä¸€å¥—为你é‡èº«æ‰“造的护甲。至少,现在所有人都这么认为。\n\t而这æŸçµæŠ¤ç”²ï¼Œå®žé™…上是一/cut个被镶入é“甲中的,ç»è¿‡ç‰¹æ®Šæ”¹é€ åŽçš„活物。穿在身上时,它便会与穿戴者共生——他们将一起移动ã€ä¸€èµ·æ”»å‡»ã€ç”šè‡³åƒä¸œè¥¿æ—¶å®ƒä¹Ÿä¼šæœ‰æ‰€æ„Ÿè§‰ã€‚和普通的人体一样,它也会生长,也会ä¸æ–­åœ°å¼ºåŒ–自己,当然也需è¦æŽ¥å—训练。\n\t先举个例å­å§ã€‚当你穿上æŸçµæŠ¤ç”²ï¼Œå¹¶é•¿é€”奔袭一段时间åŽï¼Œä½ ä¼šæ³¨æ„到æŸçµèƒ¸ç”²ä¸Šå¤šäº†ä¸€ä¸ªå为“迅æ·åŒè¶³â€çš„å‡çº§ã€‚这个å‡çº§å¯ä»¥æ高你的/cut移动速度,虽然目å‰åªæœ‰ç­‰çº§1,但毕竟还是å¯ä»¥å‡çº§çš„。你还会注æ„到它拥有了“强化点数â€ï¼Œç›®å‰å¯èƒ½æ˜¯â€œ3/100â€è¿™æ ·å­ã€‚æ¯ä¸ªå‡çº§éƒ½éœ€è¦ä¸€å®šçš„强化点数,但护甲å¯ç”¨çš„强化点数有é™ã€‚æ¢è¨€ä¹‹ï¼Œè‹¥æ˜¯æ‹¿ä¸å‡ºæŸä¸ªå‡çº§éœ€è¦çš„点数,你是ä¸å¯èƒ½èŽ·å¾—这个å‡çº§çš„。\n\tè®°ä½ä¸€ç‚¹ï¼Œåªæœ‰å…¨å¥—æŸçµæŠ¤ç”²æ‰èƒ½æŽ¥å—训练,也åªæœ‰å…¨å¥—æŸçµæŠ¤ç”²æ‰èƒ½å‘挥其应有的效果。\n\t/cutæŸçµæŠ¤ç”²çš„强化点数还是å¯ä»¥è¢«äººä¸ºä¿®æ”¹çš„。有一ç§æ–¹æ³•æ˜¯åˆ©ç”¨ç‚¼é‡‘术增强穿戴者和护甲本身之间的链接,藉此大幅æå‡å¼ºåŒ–点数的上é™ï¼Œå…¸åž‹ä»£è¡¨ä¾¿æ˜¯â€œç¥·å‘Šä¹‹å§‹â€ï¼Œå¯å°†ä¸Šé™æå‡è‡³200。关于这些炼金术的产物以åŠåˆ¶é€ è¿‡ç¨‹ï¼Œå»ºè®®å‚阅本书《炼金术士》一å·ã€‚ -guide.bloodmagic.entry.architect.upgradeTome.info.1=若是æŸçµæŠ¤ç”²ä¸Šæœ‰ä½ ä¸æƒ³è¦çš„å‡çº§æ€Žä¹ˆåŠžå‘¢ï¼Ÿä½ å¯ä»¥ä½¿ç”¨å为“净çµä¹‹éŸ³â€çš„仪å¼æ¥æ¸…洗这些å‡çº§ï¼Œå¹¶èŽ·å¾—对应的“强化手册â€ã€‚关于仪å¼çš„细节å¯å‚阅本书《仪å¼å¤§å¸ˆã€‹å·ã€‚这“强化手册â€çš„用途便是,在你身ç€å…¨å¥—æŸçµæŠ¤ç”²æ—¶ï¼Œç›´æŽ¥ç»™äºˆæŠ¤ç”²å¯¹åº”çš„å‡çº§ã€‚\n\t当然,这强化手册也å¯ä»¥åœ¨é“砧中èžåˆâ€”—在é“砧中将两本一模一样的手册èžåˆåœ¨ä¸€èµ·å¯ä»¥èŽ·å¾—更高一级的手册。/cut比方说,两本迅æ·åŒè¶³IIå¯ä»¥èžåˆå‡ºä¸€æœ¬è¿…æ·åŒè¶³III。对于æŸçµæŠ¤ç”²æœ¬èº«æ¥è¯´ï¼Œä¹Ÿæœ‰ç±»ä¼¼çš„机制,这里ä¸ä½œèµ˜è¿°ã€‚ -guide.bloodmagic.entry.architect.teleposer.info.1=ä¼ é€å™¨ï¼Œé¡¾åæ€ä¹‰ï¼Œå¯ä»¥å°†æŸä¸ªç‰©ä½“ä¼ é€è‡³å¦ä¸€ä¸ªåœ°ç‚¹ï¼Œä½†è¿™ä¸ªä¼ é€å™¨ä¸ä»…å¯ä»¥ä¼ é€ç”Ÿç‰©ï¼Œè¿˜èƒ½ä¼ é€æ–¹å—。完整的传é€è£…置需è¦ä¸¤ä¸ªä¼ é€å™¨å’Œä¸€ä¸ªä¼ é€æ ¸å¿ƒã€‚其中,一个传é€å™¨å……当目的地,å¦ä¸€ä¸ªä¼ é€å™¨å……当出å‘地。\n\t在使用传é€å™¨ä¹‹å‰éœ€è¦ä¸€äº›é…置。首先,你需è¦å³å‡»ä¼ é€æ ¸å¿ƒå°†ä½ ä¸Žå…¶ç»‘定。然åŽï¼Œæ‰‹æŒæ ¸å¿ƒå³å‡»å……当目的地的传é€å™¨ä»¥è®°å½•ç›¸å…³ä¿¡æ¯ã€‚最终,/cut把这个记录了目的地信æ¯çš„ä¼ é€æ ¸å¿ƒé€è¿‡å…¶GUI放入充当始å‘地的传é€å™¨å³å¯ã€‚\n\t然åŽï¼Œç»™äºˆå§‹å‘地的传é€å™¨ä¸€ä¸ªçº¢çŸ³ä¿¡å·ï¼ˆå‡†ç¡®åœ°è¯´ï¼Œæ˜¯å¼ºå……能),这个传é€å™¨å°±ä¼šå°†å®žä½“和方å—(如果是箱å­è¿™æ ·å¸¦ç‰¹æ®Šæ•°æ®çš„æ–¹å—,一并ä¿ç•™ï¼‰ä¸€è‚¡è„‘全部传é€è¿‡åŽ»â€”—这个过程中我们å‡å®šç›®çš„地是有传é€å™¨çš„。\n\t当然,你å¯ä»¥åªè®©ä¸€ä¸ªä¼ é€å™¨/cut有核心,抑或两个传é€å™¨äº’相链接,或者更多传é€å™¨å½¢æˆä¸€æ¡é“¾ï¼Œè—‰æ­¤å½¢æˆæ›´å¤æ‚的系统。\n\tä¸è¿‡è¦è®°ä½ä¸€ç‚¹ï¼Œä¼ é€å™¨åªä¼ é€å…¶ä¸Šæ–¹çš„æ–¹å—,ä¸è¿‡ä¼ é€çš„范围是由传é€æ ¸å¿ƒå†³å®šçš„——T1çš„ä¼ é€æ ¸å¿ƒåªèƒ½ä¼ é€ä¸€ä¸ªæ–¹å—,而T2ä¼ é€æ ¸å¿ƒåˆ™èƒ½ä¼ é€3x3x3çš„æ–¹å—,以此类推。 -guide.bloodmagic.entry.architect.boundBlade.info.1=æŸç¼šä¹‹å‰‘是一把用制作æŸçµæŠ¤ç”²çš„æ–¹å¼åˆ¶ä½œå‡ºæ¥çš„剑,å¯ä»¥è¯´å·²æœ‰å¾ˆé•¿åŽ†å²äº†ã€‚ä¸è¿‡æœ‰ä¸€ç‚¹è¦æ³¨æ„,包括æŸç¼šä¹‹å‰‘在内的å„ç§æŸç¼šå·¥å…·çš„设定,在未æ¥éƒ½æœ‰å¯èƒ½æœ‰å˜åŠ¨ã€‚\n\t这把剑有激活模å¼å’ŒæŠ‘制模å¼ï¼Œæ½œè¡Œæ—¶å³å‡»å³å¯åˆ‡æ¢ã€‚在抑制状æ€ä¸‹å®ƒå¹¶ä¸ä¼šé€ æˆä»»ä½•ä¼¤å®³ï¼Œä½†æ˜¯åœ¨æ¿€æ´»æ¨¡å¼ä¸‹å®ƒæ˜¯ä¼šæ¶ˆè€—LP的。åŒæ ·çš„,你对怪物造æˆä¼¤å®³æ—¶ï¼Œä¹Ÿä¼šæ¶ˆè€—LP。所以,在你æ€æ­»æ€ªç‰©çš„时候,/cut这把剑也有å¯èƒ½æ€æ­»ä½ ï¼\n\t然而,用这把剑æ€æ­»æ€ªç‰©æ—¶ï¼Œä¼šæœ‰é‚£ä¹ˆä¸€ç‚¹æ¦‚率获得虚弱气血碎片——这个碎片便是将祭å›å‡çº§è‡³å››çº§çš„关键。 -guide.bloodmagic.entry.architect.boundTool.info.1=å’ŒæŸç¼šä¹‹å‰‘一样,æŸç¼šå·¥å…·ï¼ˆåŒ…括é•ã€æ–§å’Œé”¹ï¼‰çš„属性在未æ¥ä¹Ÿä¼šæœ‰æ‰€å˜åŠ¨ã€‚å’ŒæŸç¼šä¹‹å‰‘一样,æŸç¼šå·¥å…·æœ‰ä¸¤ä¸ªæ¨¡å¼ï¼Œåˆ‡æ¢æ–¹å¼åŒæŸç¼šä¹‹å‰‘,也是潜行时å³å‡»ã€‚\n\tå’ŒæŸç¼šä¹‹å‰‘ä¸åŒï¼ŒæŸç¼šå·¥å…·æ‹¥æœ‰â€œé‡Žå…½æ¨¡å¼â€ã€‚手æŒå·¥å…·å³é”®æŒ‰ä½ä¸åŠ¨å³å¯è“„力,蓄力结æŸåŽå·¥å…·ä¼šæ”¾å‡ºä¸€è‚¡å·¨å¤§çš„能é‡ï¼Œå¤§èŒƒå›´ç ´åæ–¹å—,最高å¯è¾¾11x11x11,但åŒæ—¶ä¹Ÿæœ‰æƒŠäººçš„消耗:一万LP。因此,使用时一/cut定è¦å°å¿ƒè°¨æ…Žï¼Œå› ä¸ºæžä¸å¥½è¿™å°±æ˜¯ä½ æœ€åŽä¸€æ¬¡ä½¿ç”¨è¿™äº›å·¥å…·ï¼ -guide.bloodmagic.entry.architect.weakShard.info.1=任何有生命的东西,都有一层看ä¸è§ï¼Œæ‘¸ä¸ç€çš„链接,这个现象被称作çµé­‚网络。实践è¯æ˜Žï¼Œè¯¸å¦‚å°è®°å’Œä»ªå¼è¿™æ ·çš„东西也是å¯ä»¥æœ‰é“¾æŽ¥çš„,然而这些链接的æ¥æºä¾¿æ˜¯æ‹¥æœ‰æœ€å¼ºé“¾æŽ¥çš„生物——人类。\n\t用æŸç¼šä¹‹å‰‘攻击生物时,那些å¯æ€œç”Ÿç‰©çš„一部分çµé­‚网络会直接硬化,在它们死åŽä¹Ÿå¯ä¿æŒå…¶å½¢çŠ¶ã€‚这部分çµé­‚网络便以虚弱气血碎片的形å¼çŽ°èº«äºŽä¸–,它们因其颜色与虚/cut弱气血å®ç ç›¸è¿‘而得å。\n\t虽然,至今ä»æœªæ‰¾åˆ°å­˜åœ¨æ›´å¼ºçš„气血碎片的è¯æ®ï¼Œä½†æ˜¯ä½ è‡³å°‘知é“,这些碎片对于增强你自己的çµé­‚网络肯定有帮助。 -guide.bloodmagic.entry.architect.masterOrb.info.1=如何利用这ç§å¯¹çµé­‚网络å分亲和的特性呢?答案是:用虚弱气血碎片打造全新的气血å®ç â€”—导师气血å®ç ã€‚它å¯ä»¥æ供一百万LP的上é™ï¼Œå®ƒå¯ä»¥å½»åº•è§£æ”¾ä½ å¯¹è¡€é­”法的想象力。也许,就算是陨石,也无法阻挡你的å‰è¿›äº†å§... -guide.bloodmagic.entry.architect.runeOrb.info.1=看上去这个符文并没什么用途。但是,这å®ç ç¬¦æ–‡å¯ä»¥æ高那些放入血之祭å›ä¸­å¡«å……çš„å®ç çš„容é‡ä¸Šé™ï¼Œæ¯å—符文都å¯ä»¥æå‡ç™¾åˆ†ä¹‹äºŒã€‚对于虚弱气血å®ç ï¼Œè¿™æ˜¯å¾®ä¸è¶³é“çš„100LP。而对于导师气血å®ç ï¼Œè¿™æ˜¯ä¸¤ä¸‡LP的增幅,效果å分显著ï¼å¦‚果你的祭å›ä¸Šè¿˜æœ‰ç©ºä½çš„è¯ï¼Œè¿™ä¸ªç¬¦æ–‡å…´è®¸å°±æ˜¯ä½ çš„首选。 -guide.bloodmagic.entry.architect.suppression.info.1=抑液å°è®°ï¼Œé‡‡ç”¨å’Œä¼ é€å™¨ä¸€æ ·çš„ä¼ é€ç§‘技,å¯ä»¥è®©ä¸€å®šèŒƒå›´å†…的液体瞬间消失。准确地说,是é€å…¥å¦ä¸€ä¸ªè¿·ä½ ç»´åº¦ä¸­ã€‚ä¸å¹¸çš„事,因为传é€ç§‘技的é™åˆ¶ï¼Œæ¶²ä½“还是会回æ¥çš„——比如说,在使用者走过本是液体的区域åŽã€‚ä¸è¿‡è¿™æ— ä¼¤å¤§é›…,毕竟ä¸è®ºæ˜¯åœ¨æ°´ä¸‹è¡Œèµ°ï¼Œè¿˜æ˜¯åœ¨ä¸‹ç•Œçš„熔岩之海上漫步,这å°è®°éƒ½æ˜¯å分好用的。 -guide.bloodmagic.entry.architect.haste.info.1=人体能消化的物质中有两ç§å分有趣:糖和咖啡因。å‰è€…是能é‡å‚¨å¤‡ï¼ŒåŽè€…å¯ä»¥ä»¤äººä¿æŒæ¸…醒。这急速å°è®°ï¼Œä¾¿å¯ä»¥é€šè¿‡æ¨¡æ‹ŸåŒ–å­¦å应的方å¼ï¼Œé‡Šæ”¾æ›´å¤šçš„化学能,进而æå‡å°è®°ä½¿ç”¨è€…的移动能力。\n\tå°è®°æ¿€æ´»åŽï¼Œä½¿ç”¨è€…会跑得更快,跳得更高,åŒæ—¶è¿˜ä¼šä»¤çŽ©å®¶åœ¨ä¸ç”¨è·³è·ƒçš„情况下跨越比较高的障ç¢ï¼ˆå®žé™…上是个改良版本的自动跳跃)。 -guide.bloodmagic.entry.architect.severance.info.1=人们至今无法解释传é€çš„机制。多数情况下,传é€è¢«è®¤ä¸ºæ˜¯æ—¶ç©ºæ‰­æ›²çš„一ç§è¡¨çŽ°å½¢å¼ï¼Œç‰©ä½“å¯é€šè¿‡ä¸¤ä¸ªä¸åŒæ—¶ç©ºçš„链接æ¥å®žçŽ°çž¬é—´ç§»åŠ¨ã€‚而这ç»å½±å°è®°å¯ä»¥é˜»æ­¢æ—¶ç©ºæ‰­æ›²çš„产生,从而阻止å¯åŠ¨æ­¤å°è®°çš„玩家附近的生物å‘动传é€æŠ€èƒ½ã€‚当然这个å°è®°å¹¶ä¸èƒ½é˜»æ­¢è¯¸å¦‚ä¼ é€é—¨ä¹‹ç±»çš„东西,但阻止类似末影人这样的生物还是å¯ä»¥çš„。 -guide.bloodmagic.entry.architect.teleposition.info.1=ä¼ é€å°è®°å®žé™…上是个自带传é€æ ¸å¿ƒçš„ä¼ é€å™¨ã€‚对æŸä¸ªä¼ é€å™¨ä½¿ç”¨æ­¤å°è®°ï¼Œå°è®°ä¼šè®°ä¸‹è¿™ä¸ªä¼ é€å™¨çš„ä½ç½®ï¼Œå†æ¬¡ä½¿ç”¨å°è®°å°±å¯ä»¥ç›´æŽ¥ä¼ é€åˆ°é‚£é‡ŒåŽ»äº†ã€‚然而它好åƒæ²¡ç»™ä½ è¿”程票... -guide.bloodmagic.entry.architect.compression.info.1=矿工ç»å¸¸é¢å¯¹çš„一个情况便是,它的背包中充满了红石粉ã€é’金石ã€ä»¥åŠå„ç§ä¹±ä¸ƒå…«ç³Ÿçš„东西。虽然å¯ä»¥åŽ‹ç¼©ï¼Œä½†æ˜¯å¹¶éžæ‰€æœ‰çŸ¿å·¥éƒ½ä¼šéšèº«æºå¸¦å·¥ä½œå°ã€‚\n\t压挤å°è®°æ‰€åˆ›é€ çš„å°åž‹åŽ‹ç¼©åŠ›åœºå¯ä»¥å°†å„ç§ç‰©å“压缩起æ¥ï¼Œè¿›è€ŒèŠ‚约背包空间。具体æ¥è¯´æ˜¯è¿™æ ·ï¼šå¦‚果你有63份红石粉,å°è®°ä¸ä¼šæœ‰æ•ˆæžœï¼›ä½†å¦‚果你有64份红石粉,它就会将其中63份压缩æˆ7个红石å—。虽/cut然并没腾出新的格å­ï¼Œä½†æ˜¯åˆ«å¿˜äº†é‚£ä¸ªå äº†ä¸€ä¸ªæ ¼å­çš„红石粉是å¯ä»¥æŽ¥ç€æ”¾çº¢çŸ³çš„。这个å°è®°å¯¹å…¶ä»–Mod的类似东西也是有效果的。 -guide.bloodmagic.entry.architect.bridge.info.1=影桥å°è®°å¯ä»¥å°†ä½¿ç”¨è€…脚下的空气固化æˆå¯ä»¥è¡Œèµ°çš„é“路,或者说,幻化出一座幻影之桥。若是你ä¸æ…Žè¸©ç©ºï¼Œå½±æ¡¥ä¼šç›´æŽ¥åœ¨ä½ è„šä¸‹å‡ºçŽ°ï¼Œé¿å…严é‡çš„摔伤。尽管在使用å‰éœ€è¦ä¸€äº›æµ‹é‡å·¥ä½œï¼ŒåŒæ—¶å½±æ¡¥å‡ºçŽ°ä¹Ÿä¼šé€ æˆå»¶è¿Ÿï¼Œå®ƒä»ä¸å¤±ä¸ºä¸€ç§â€œé£žè¡Œâ€çš„好方法。 -guide.bloodmagic.entry.architect.mimic.info.1=æ‹Ÿæ€æ˜¯ä¸€ç§å¯ä»¥æ¨¡ä»¿ä»»æ„给定结构的魔法结构。它本身å¯ä»¥æ ¹æ®å…¶ç¢°åˆ°çš„æ–¹å—,改å˜è‡ªèº«çš„分å­ç»“构,从而使其本身看起æ¥éƒ½æ˜¯å¦‚å‡åŒ…æ¢ä¸€æ ·ã€‚但,并éžæ‰€æœ‰çš„属性都å¯ä»¥å¤åˆ¶ï¼šæ¯”如说,普通的拟æ€æ–¹å—å˜æˆè¤çŸ³åŽä¸èƒ½å‘光。\n\t一般,拟æ€æ–¹å—有两ç§ç”¨æ³•ã€‚第一ç§ï¼Œå…ˆæ”¾ç½®æ‹Ÿæ€æ–¹å—,然åŽæ‰‹æŒè¦ä¼ªè£…çš„æ–¹å—对ç€æ‹Ÿæ€æ–¹å—å³å‡»ã€‚这样,被伪装的方å—就直接进入拟æ€æ–¹å—的内/cut部,拟æ€æ–¹å—也就å¯ä»¥ä¼ªè£…了。ä¸è¿‡ï¼Œè¿™ä¸ªæ–¹æ³•åªèƒ½ä¼ªè£…一个方å—的“默认â€å½¢çŠ¶ã€‚举个例å­ï¼Œæ­¤æ³•ä¼ªè£…的楼梯都是æœåŒä¸€ä¸ªæ–¹å‘的。\n\t第二ç§ï¼Œç›´æŽ¥å¯¹ç€æŸä¸ªæ–¹å—使用拟æ€æ–¹å—。若如此åšï¼Œæ‹Ÿæ€æ–¹å—便å¯ä»¥åšåˆ°ç²¾ç¡®ä¼ªè£…。还是刚æ‰æ¥¼æ¢¯çš„例å­ï¼Œè¿™æ ·ä¼ªè£…的楼梯就会很自然,因为方å‘被ä¿ç•™äº†ä¸‹æ¥ã€‚\n\t事实上,拟æ€æ–¹å—çš„å˜ç§æœ‰å¾ˆ/cut多。默认的ä¸é€æ˜Žæ‹Ÿæ€æ–¹å—å¯ä»¥æ¨¡ä»¿å½¢çŠ¶å’Œæ–¹å—的大多数属性,但光是无法照过去的。悬幽拟æ€æ–¹å—没有碰撞箱,适åˆåˆ¶ä½œéšè—门。清é€æ‹Ÿæ€æ–¹å—å¯ä»¥è§£å†³çŽ»ç’ƒçš„æ‹Ÿæ€é—®é¢˜ï¼šå…‰çº¿å¯ä»¥æ— è§†è¢«ä¼ªè£…çš„æ–¹å—的属性,穿é€è¿™ç§æ‹Ÿæ€æ–¹å—。最åŽï¼Œè¿˜æœ‰ä¸€ç§å…‰äº®æ‹Ÿæ€æ–¹å—,ä¸è®ºä½•æ—¶å®ƒéƒ½ä¼šå‘光。终于ä¸ç”¨ç«æŠŠäº†ï¼\n\t其实还有一ç§ç‰¹æ®Šçš„æ‹Ÿæ€æ–¹å—:感知拟æ€æ–¹å—。如果有玩/cut家接近,它们就会å‘å…¶å‘动猛烈攻击。这ç§æ–¹å—å¯åœ¨å¾ˆå¤šåœ°æ–¹æ‰¾åˆ°ï¼Œå°¤å…¶æ˜¯åœ°ç‰¢ä¸­ã€‚所以说,如果有一个感知拟æ€æ–¹å—伪装æˆäº†ç®±å­ï¼Œè¯·è®°ä½ï¼šå®ƒä»¬ä¼šå’¬äººã€‚\n\t***创造模å¼é™å®šå†…容***\n\t在创造模å¼ä¸‹ï¼Œæ‹Ÿæ€æ–¹å—会多出æ¥ä¸€äº›æœ‰è¶£ç‰¹æ€§ã€‚用è¯æ°´æˆ–è¯å‰‚瓶å³å‡»æ‹Ÿæ€æ–¹å—åŽï¼Œå¯ä»¤å…¶åœ¨æœ‰çŽ©å®¶åœ¨é™„近时产生对应的è¯æ°´æ•ˆæžœã€‚如果这是/cut普通的拟æ€æ–¹å—,那么:点击东é¢/西é¢å¯ä»¥åŠ /å‡è¯æ°´æ•ˆæžœçš„覆盖范围;点击北é¢/å—é¢å¯ä»¥åŠ /å‡çŽ©å®¶çš„检测范围;点击上é¢/下é¢å¯ä»¥æ高/é™ä½Žè¯æ°´ç”Ÿæˆé—´éš”,å³æ¯éš”多久生æˆä¸€æ¬¡è¯æ°´æ•ˆæžœã€‚\n\t如果你在é¢å¯¹ä¸€ä¸ªæ„ŸçŸ¥æ‹Ÿæ€æ–¹å—,你å¯ä»¥éšæ„点击这个拟æ€æ–¹å—,以改å˜å…¶æ£€æµ‹çŽ©å®¶çš„范围——如果玩家在检测范围中,并且å¯ä»¥çœ‹åˆ°è¿™ä¸ªæ‹Ÿæ€æ–¹å—,拟æ€æ–¹å—会直接出现在玩/cut家眼å‰ã€‚\n\tå¦å¤–,如果玩家在创造模å¼ä¸‹å°†è¦ä¼ªè£…çš„æ–¹å—放入拟æ€æ–¹å—中,这个方å—ä¸ä¼šåœ¨æ‹Ÿæ€æ–¹å—被破ååŽæŽ‰è½ã€‚\n\t最åŽçš„最åŽï¼Œå¦‚果拟æ€æ–¹å—伪装的是一个装ç€ä¸œè¥¿çš„ç®±å­æˆ–别的什么容器:对于感知拟æ€æ–¹å—,在它败北åŽä¼šæŠŠç®±å­è¿žåŒå†…容一å—放回æ¥ï¼›å¯¹äºŽå…¶ä»–æ‹Ÿæ€æ–¹å—,它会在被击溃时把物å“撒一地。 -guide.bloodmagic.entry.architect.downgrade.info=就护甲é™çº§çš„内容,我建议你阅读《仪å¼å¤§å¸ˆã€‹å·çš„“沉é‡çµé­‚çš„å¿æ‚”â€ä¸€ç« ï¼Œåœ¨é‚£é‡Œä½ å¯ä»¥å¾—到更详细的解释。 - -guide.bloodmagic.entry.architect.augmentedCapacity.info=和增容符文类似,超容符文也å¯ä»¥æå‡ç¥­å›çš„容é‡ã€‚但和增容符文ä¸åŒï¼Œå¤šå—超容符文会之间的共鸣会让容积呈指数级增长。具体æ¥è¯´ï¼Œæ˜¯åšä¹˜æ³•ï¼šæ¯ä¸€å—超容符文都会给予é¢å¤–10%%的容积;æ¢è¨€ä¹‹ï¼Œä¸¤å—å³21%%的增长,三å—å³33.1%%的增长,以此类推。\n\t然而,超容符文的效果ä¸ä¸Žå¢žå®¹ç¬¦æ–‡å åŠ ï¼Œæ¢è¨€ä¹‹ï¼Œä¸è®ºæœ‰å¤šå°‘超容符文,æ¯å—增容符文都åªæ供两åƒLP容é‡ã€‚ -guide.bloodmagic.entry.architect.charging.info=有那么一些东西对于åˆæˆå¾ˆæœ‰å¸®åŠ©ï¼Œè€Œè¿™å……能符文便是其中之一:它å¯ä»¥å¸æ”¶ LP,并将 其转化为“充能点数â€ï¼Œå…·ä½“æ•°é‡å¯ç”¨è§è§£å°è®°çœ‹åˆ°ã€‚若是åˆæˆæŸäº›ç‰©å“正好需è¦ä¸€å®šé‡çš„充能点数,那么这充能符文就å¯ä»¥ä»¥æ¶ˆè€—充能点数为代价,将物å“立刻åˆæˆå‡ºæ¥ã€‚若没有足够的充能点数,它就åªä¼šæŒ‰ä¸€æ¯”一的比例直接将充能点数转化为 LP 以加速 å…¶åˆæˆã€‚\n\t/cut血之祭å›æœ€å¤šå¯å­˜å‚¨çš„充能点数数é‡æ˜¯ç¥­å›å®¹ç§¯çš„函数,åŒæ—¶ä¹Ÿå……能符文的数é‡æˆæ­£æ¯”;其中容积需è¦è‡³å°‘为两万æ‰æœ‰æ•ˆæžœã€‚血之祭å›å……能的速度也是和充能符文数é‡ä»¥åŠå…¶æœ¬èº«çš„速度æˆæ­£æ¯”的(å³ï¼Œå……能速度=符文数é‡*祭å›æœ¬èº«åˆæˆé€Ÿåº¦ï¼‰ï¼Œæ¯ä¸€ç§’å®ƒéƒ½ä¼šå°†ä¸€å®šé‡ LP 转化为充能点数。所以,如果你的祭å›ä¸­æœ‰è¿™å—符文,åˆç†çš„设计将会使你事åŠåŠŸå€ã€‚ -guide.bloodmagic.entry.architect.acceleration.info=和大多数符文ä¸åŒï¼Œä¿ƒè¿›ç¬¦æ–‡éœ€è¦å’Œåˆ«çš„符文æ­é…使用,而且它的效果ä¸æ˜¯æ— é™åˆ¶å¢žé•¿çš„。这个符文的效果是,它å¯ä»¥è®©æŸäº›ç¬¦æ–‡çš„工作频率å˜é«˜ï¼Œæ¯”如说,转ä½ç¬¦æ–‡å’Œå……能符文。具体æ¥è¯´ï¼Œæ¯æœ‰ä¸€ä¸ªè¿™ä¸ªç¬¦æ–‡ï¼Œè·ç¦»ä¸‹ä¸€æ¬¡å·¥ä½œçš„等待时间就å‡ä¸€åˆ»ã€‚æ¢è¨€ä¹‹ï¼šå¦‚果有10å—促进符文,转ä½ç¬¦æ–‡ä¼šæ¯10刻就转移一次液体,而默认值å´æ˜¯æ¯20刻。\n\t显然,你的祭å›ä¸­åªå¯èƒ½æœ‰19/cutå—促进符文——在这ç§æƒ…况下,转ä½ç¬¦æ–‡å’Œå……能符文就会一刻ä¸åœåœ°å·¥ä½œã€‚éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸å¥½ï¼ - -guide.bloodmagic.entry.architect.tier3.info=众所周知,三级祭å›çš„结构中,四角的柱å­é¡¶éƒ¨éœ€è¦å››å—æ¥è‡ªä¸‹ç•Œçš„è§çŸ³ã€‚但有一个鲜为人知的事实:这四å—è§çŸ³å¯ä»¥ç”¨æµ·æ™¶ç¯ä»£æ›¿ã€‚如果地狱对你æ¥è¯´å¤ªè¿‡é¥è¿œï¼Œä½†ä½ å·²ç»æ‰¾åˆ°äº†æµ·æ´‹ç¥žæ®¿ï¼Œä½ å¯ä»¥é€šè¿‡è¿™ä¸ªæ–¹å¼æ¥æŽ¨è¿›ä½ çš„血魔法进程。 - -# Demon Kin Entries -guide.bloodmagic.entry.demon.intro=è´æ‹‰Â·æµ·æ³Šæ© -guide.bloodmagic.entry.demon.snare=æ¶é­”æ„志与投网 -guide.bloodmagic.entry.demon.forge=狱ç«ç†”炉 -guide.bloodmagic.entry.demon.petty=å¾®å°çš„地狱魂石 -guide.bloodmagic.entry.demon.sword=感知之剑 -guide.bloodmagic.entry.demon.lesser=å°åž‹åœ°ç‹±é­‚石 -guide.bloodmagic.entry.demon.reactions=æ„料之外的å应 -guide.bloodmagic.entry.demon.sentientGem=感知护甲 -guide.bloodmagic.entry.demon.routing=物å“路由 -guide.bloodmagic.entry.demon.aura=æ¶é­”çµåŸŸ -guide.bloodmagic.entry.demon.types=ä¸åŒç§ç±»çš„æ„å¿— -guide.bloodmagic.entry.demon.crucible=æ¶é­”å©åŸš -guide.bloodmagic.entry.demon.crystallizer=æ¶é­”ç»“æ™¶å› -guide.bloodmagic.entry.demon.cluster=æ¶é­”晶簇 -guide.bloodmagic.entry.demon.pylon=æ¶é­”导能塔 -guide.bloodmagic.entry.demon.gauge=çµåŸŸæµ‹é‡ä»ª - -# Demon Kin Entry Texts -guide.bloodmagic.entry.demon.intro.info=我的åå­—å«è´æ‹‰Â·æµ·æ³Šæ©ï¼Œä»¥æ¶é­”之å­çš„身份为人知晓。数个月å‰æˆ‘的家乡被一群æ¶é­”侵袭,其他æ‘民全部被æ€ï¼Œæˆ¿å±‹å…¨è¢«ç ´å。我无法记起袭击时的多少细节,除了我所认识的æ¯ä¸€ä¸ªï¼Œä¼´éšç€ç—›è‹¦çš„惨å«è€Œå‰å¾€ä¸€ä¸ªæ›´ç¾Žå¥½çš„世界的人们。庆幸那些æ¶é­”没有å¬åˆ°ï¼Œé‚£åœ¨ä¸å®¹æ˜“察觉的教堂的地下室里,ç•ç¼©äºŽæžœç¯®ä¸‹çš„我ç»æœ›åœ°é¿å…ç€è‡ªå·±çš„å°–å«å£°åŠ å…¥ä¼—人的åˆå£°ã€‚\n\t/cutå¯æ€•çš„瞬间,在我ä¸æ…Žæ’žå€’å ‚çš„ç†é¦™ç¥­å›æ—¶ï¼Œä¸€åªæ¶é­”çªç„¶é—¯å…¥åœ£æ‰€ï¼Œæˆ–许是这圣地的原由åˆé•‡é™ä¸‹æ¥ã€‚这是åªä½“型庞大的四足怪物,弯曲的ç ç‰™å€’悬在çªå‡ºçš„嘴上,唾液滴在带有锯齿的剑状爪å­ã€‚它环顾了四周,我å‘誓有那么一会它的眼ç›å’Œæˆ‘对上了,但之åŽå®ƒå°±è¿™ä¹ˆç¦»å¼€è¿™é‡Œï¼Œä»¿ä½›å®Œå…¨æ²¡æœ‰çœ‹åˆ°æˆ–者å¬åˆ°ä»€ä¹ˆã€‚之åŽå‘生的事记忆全都模糊ä¸æ¸…。\n\t/cut直到第二天æ‰æœ‰äººç»è¿‡çœ‹åˆ°è¿™ä¸€åˆ‡ã€‚这一商队看到远处的浓烟,决定绕一大段路好é¿å¼€è¿™äº›æ¶é­”。商队中许多人觉得我独自一人毫å‘æ— æŸåœ°ç”Ÿè¿˜å…´è®¸æ˜¯ä¸ªå兆头,有些甚至ä¸æ„¿å¤šçœ‹æˆ‘一眼。但有一对兄弟åŒæƒ…我的é­é‡ï¼Œå¹¶å°½åŠ›è¯´æœå•†é˜Ÿå…¶ä»–æˆå‘˜ä¹Ÿå¸¦ä¸Šæˆ‘。我å–掉了女祭å¸ä¹‹ä»—与一æ¡ç›’å¼æŒ‚å ï¼Œè—‰æ­¤æ¢åˆ°äº†è·Ÿç€å‰å¾€ä¸€ä¸ªè¿œç¦»æ¶é­”ç ´å路径上的一个安全æ‘庄的许å¯ã€‚ -guide.bloodmagic.entry.demon.snare.info.1=曾有一天,马格斯曾对我讲述é“,世间生çµçš†æœ‰çµé­‚:人类,鸡,羊,甚至是爬行者也存在这ç§ç»™äºˆèº¯ä½“生之æ„志的生命力é‡ã€‚似乎马格斯早已在这方é¢åšè¿‡å¤§é‡å®žéªŒï¼Œç”šè‡³æœ‰é—»ä¸€ä¸ªå¼ºå¤§çš„法师,å¯ä»¥å°†èŽ·å–这些çµé­‚并注入一个空的躯体,比如僵尸。但这也让我感到好奇:如果僵尸与骷髅并ä¸æ‹¥æœ‰çµé­‚,它们如何拥有这生的æ„志?是什么,给予他们生气,使他们会去追æ•å¹¶æ€å®³ç”Ÿçµï¼Ÿ\n\t/cutæ¯æ¯é’»ç ”最终还是回到了æ„志的问题上。任何“活物â€éƒ½å¿…须拥有使之生存下去的æ„志,但这ä¸æ„味ç€é‚£å¿…须是它们自己的。当我把这个想法告诉马格斯的时候他考虑了一会,接ç€æ‹¿å‡ºä¸€ä¸ªé»‘æ¿å’Œç²‰ç¬”(从哪?è°çŸ¥é“呢),开始速写并注上一些关于其他形å¼é­”法的注解。“在神秘学中,â€ä»–画出一åªç¨»è‰äººçš„å½¢æ€å¹¶è¯´é“,“分é…于执行许多简å•æ“作的傀儡被赋予了生气。它们活ç€ï¼Œå‘¼å¸ç€ï¼Œç”šè‡³å¯ä»¥æ­»äºŽä¸/cutå†éœ€è¦å®ƒä»¬çš„主人。几个世纪以æ¥ï¼Œä¼´éšç€ç¥žç§˜å­¦çš„进化,这门艺术已ç»æœ‰è¿‡æ•°ä¸ªç‰ˆæœ¬ï¼Œæ³•å¸ˆä¼šå°†ä»–们的æ„志注入那无生命的创造物中,给他们带æ¥ç”Ÿæ°”。\n\t“那么,è´æ‹‰ï¼Œå‚€å„¡æ˜¯å¦‚何è¿ä½œçš„呢:通过æ„å¿—çš„çŒè¾“。â€\n\t所以如果å¯ä»¥é€šè¿‡ä»–人将其æ„志注入一个空壳å¯ä»¥ä½¿å‚€å„¡èŽ·å¾—生命,那么就有å¯èƒ½æœ‰ä»€ä¹ˆæŠŠä»–们的æ„志注入亡者/cut的躯体,使得有了僵尸和骷髅的存在。想到这我打了个哆嗦,脑中闪过故乡的é­é‡ã€‚åªæœ‰æ¶é­”会åšåˆ°è¿™ä¹ˆæ®‹å¿çš„事。但è¦æ£€éªŒè¿™ä¸ªå‡è®¾ï¼Œæˆ‘需è¦æ›´å¤šè¯æ®ã€‚ -guide.bloodmagic.entry.demon.snare.info.2=在马格斯的指引,和æ比略百忙之中抽出时间为我æ供的帮助下,我用é“ã€çº¿å’Œä¸€ç‚¹çº¢çŸ³ä¾¿åšå‡ºäº†åŽŸå§‹æŠ•ç½‘。身兼神秘使的æ比略说这玩æ„å¯ä»¥åˆ‡æ–­æŽ§åˆ¶ç”Ÿç‰©çš„æ„志。“我拿这玩æ„在傀儡上瞎æžâ€ï¼Œä»–带ç€å¾®ç¬‘这样说é“。我们都知é“结果是什么样的。\n\t“红石似乎切断了我的æ„志和傀儡之间的è”系。ç†è®ºä¸Šæ¥è¯´ï¼Œå¦‚果僵尸和骷髅身上也有æ„志,那这投网也å¯ä»¥åˆ‡æ–­ã€‚â€\n\t/cut他说我åªéœ€è¦çž„准目标把投网丢过去就å¯ä»¥â€”—如果å¥æ•ˆï¼Œæˆ‘就能在目标生物上看到一些白色的颗粒。“然åŽä½ éœ€è¦æŠŠé‚£ä¸ªå¯æ€œçš„目标æ€æ­»æ‰èƒ½çœ‹åˆ°çœŸç›¸ã€‚但记ä½ï¼Œå¤§æ¦‚åªæœ‰å››åˆ†ä¹‹ä¸€çš„投网会对目标有效果。所以记得多备一些ï¼â€\n\t我制作了å六个投网,然åŽæˆ‘选择在深夜出å‘。事实上,这项工作相当棘手:è¦åŒæ—¶è¿½è¸ªå‡ ä¸ªåƒµå°¸ï¼Œè¿˜è¦é—ªé¿å®ƒä»¬çš„é‡å‡»ï¼Œè¿˜è¦çž„准它们丢出投网。/cut当我看到白色的颗粒时,我迅速将僵尸们悉数斩æ€ï¼Œå¹¶æ¸…点了它们留下的物å“。沙地上一些è“色的粘稠液体å¸å¼•äº†æˆ‘的注æ„。我æ¡èµ·æ¥çœ‹äº†ä¸€ä¸‹ï¼Œè¿™ä¼¼ä¹Žæ˜¯ä¸€ç§è¶…凡脱俗的存在...在快速收集好样本åŽæˆ‘决定先返回å†ä½œè¿›ä¸€æ­¥ç ”究。\n\tæ¯ä¸€ä»½æ”¶é›†åˆ°çš„“æ¶é­”æ„å¿—â€çš„形状和大å°éƒ½ä¸å°½ç›¸åŒï¼Œä¼¼ä¹Žå–决于它们的æ¥æºã€‚抛开å•ä½ä¸è°ˆï¼Œåªåšç²—略的定/cuté‡åˆ†æžçš„è¯ï¼Œå®ƒä»¬çš„å“è´¨å¯ä»¥æŒ‰0到5æ¥åˆ’分。我并ä¸æ˜¯å¾ˆæ¸…楚这些物质å¯ä»¥ç”¨æ¥å¹²ä»€ä¹ˆï¼Œä½†æ¯«æ— ç–‘问它们引起了我的注æ„。我也ä¸æ˜¯å¾ˆæ¸…楚这究竟是æ¶é­”çš„å°è®°ï¼ŒæŠ‘或仅是它们身上掉è½çš„æŸç§æ™¶ä½“。我需è¦è¿›ä¸€æ­¥çš„研究。 -guide.bloodmagic.entry.demon.forge.info.1=我已在æ¶é­”æ„志上投入了数星期的时间。虽然有所进展,但情况ä¾æ—§æ—¶å¥½æ—¶å。但有一天,æ比略问我能å¦å€Ÿç”¨ä¸€ç‚¹æ¶é­”æ„å¿—æ¥åšå®žéªŒï¼›ä»–解释说,这很有å¯èƒ½æ˜¯ä»–一直在寻找的新一代血之祭å›çš„æ料——马格斯原本的祭å›å·²ç»ç ´æ—§ä¸å ªï¼Œä½†æŒ‰å¤æ³•åˆ¶ä½œçš„祭å›å´æ€Žä¹ˆä¹Ÿæ— æ³•ä½¿ç”¨...总而言之,他觉得我能帮上忙。\n\t事实è¯æ˜Žä»–是对的。我查阅了很多讨论“等价交æ¢â€ä»¥åŠ/cut物质嬗å˜çš„炼金术书ç±ï¼›åŒæ—¶æˆ‘还咨询了一些途ç»æˆ‘们这里的炼金术师,他们也慷慨地给了我一些解构物质和能é‡çš„方法,以便进行深入研究。(啊,我必须承认我å分喜欢那些炼金术师的暗紫色盔甲——区区看一眼就会让人感觉è¦è¢«ä¸€ä¸ªè´¨é‡å·¨å¤§çš„东西拉过去一样。啊我没在说æ比略ï¼ï¼‰æˆ‘利用仅有的简易炼金阵列以åŠæžå°‘é‡æ ·æœ¬ä¾¿æˆåŠŸä»Žæ¶é­”æ„志中抽å–到了能é‡ã€‚剩下的事情就åªæœ‰åˆé€‚的构造了。 -guide.bloodmagic.entry.demon.forge.info.2=就在今天,我æˆåŠŸåˆ¶æˆäº†ä¸€ç§å¯å°†åŽŸç”Ÿæ„志注入物å“中的结构。我现在管这个东西å«â€œç‹±ç«ç†”炉â€ï¼Œå®žé™…上它åªæ˜¯ä¸ªé•¶å…¥çŽ»ç’ƒé¡¶å±‚中的简易炼金术阵列,å¯æœ€å¤šåŒæ—¶å°†å››ä¸ªç‰©å“和原生æ„å¿—èžåˆäºŽä¸€ä½“。æ¶é­”æ„志需è¦æ”¾åœ¨å³æ‰‹è¾¹ï¼Œæ˜¾è€Œæ˜“è§çš„圆圈则是为物å“准备的。目å‰æ¥è¯´æˆ‘已掌æ¡äº†è‹¥å¹²ç§â€œé…æ–¹â€ï¼Œä½†ä½¿ç”¨è¿™ç‚‰å­ä»ç„¶æœ‰ä¸€äº›è¦æ±‚。\n\t对于åˆæ¬¡ä½¿ç”¨ç‹±ç«ç†”炉的人/cutæ¥è¯´ï¼Œä»–们需è¦æ³¨æ„一些事情:一,物å“èžåˆéœ€è¦æ供一定数é‡çš„æ¶é­”æ„志,如果数é‡ä¸å¤Ÿï¼Œä»€ä¹ˆäº‹éƒ½ä¸ä¼šå‘生;二,å‰é¢è¯´åˆ°ç‰©å“èžåˆéœ€è¦æ供一定数é‡çš„æ¶é­”æ„志,但大部分é…方实际都消耗ä¸äº†é‚£ä¹ˆå¤šï¼›ä¸‰ï¼Œæœ‰äº›ç‰©å“çš„èžåˆéœ€è¦å¤§é‡æ„å¿—æ¥å¯åŠ¨ï¼Œä½†å´æ¶ˆè€—ä¸äº†å¤šå°‘,甚至根本ä¸æ¶ˆè€—;四,有些é…方的产é‡å·¨å¤§ï¼Œæœ‰äº›...并ä¸æ€Žä¹ˆé«˜ã€‚ -guide.bloodmagic.entry.demon.petty.info.1=åˆæ˜¯æ–°ä¸€ä¸ªå¤œæ™šï¼Œæˆ‘åˆå¼€å§‹äº†æ—¥å¸¸çš„收割工作。但是很快我æ„识到了一个问题:我的背包æ¯å¤©éƒ½ä¼šè¢«å„ç§æ ·æœ¬å¡žæ»¡ï¼åŽŸå› ä¸æ˜¯å¾ˆæ¸…楚,也许是因为æ¯ä»½æ ·æœ¬çš„最终æ¥æºéƒ½ä¸ä¸€æ ·ï¼Œå› æ­¤æ— æ³•åŽ‹ç¼©åœ¨ä¸€èµ·å§ã€‚至少,从它们物ç†è¡¨çŽ°å½¢å¼æ¥è¯´æ˜¯è¿™æ ·çš„。\n\t也因此我åˆå›žåˆ°äº†è¢«ä¸¢åœ¨å±‹å­ä¸€è§’的狱ç«ç†”炉æ—开始为我的实验准备æ料,将æ比略的那些令人窒æ¯çš„实验抛之/cutè„‘åŽã€‚我这几天在为æ比略准备他的熔炉,因为我已ç»æ”¾å¼ƒæŠµæŠ—那些因为他的“奥法实验â€è€Œäº§ç”Ÿçš„,笼罩在我的工作室里的粉ç°äº†ã€‚我管你是ä¸æ˜¯åœ¨â€œå¡«è¡¥çµé­‚网络那无形的网状结构与石æ¿çš„物ç†ç»“构的空白â€ï¼Œèµ¶å¿«è®©ä½ é‚£äº›å¤©æ€çš„ä¸œè¥¿æ»šå‡ºåŽ»ï¼ -guide.bloodmagic.entry.demon.petty.info.2=ä¸è®ºå¦‚何,寻找åˆé€‚的存储æ¶é­”æ„å¿—çš„æ料的确费了我一番功夫。é’金石似乎是一ç§å¾ˆå®¹æ˜“就能找到的能é‡å¯¼ä½“,å¯ä»¥å……当传导æ„志的通é“。然åŽæˆ‘为了é¿å…空气中的电场的影å“,加了一层红石充当“护盾â€ï¼ˆè‡³å°‘,马格斯说过,将两ç§èƒ½é‡æ··åœ¨ä¸€èµ·ä¼šäº§ç”Ÿç¾éš¾æ€§åŽæžœï¼‰ï¼›ç„¶åŽåŠ ä¸Šä¸€äº›é»„金充当抑性剂;并以玻璃制æˆå¤–壳。最终我得到了一å—“地狱魂石â€ã€‚这个åå­—çš„å«ä¹‰ä¾¿æ˜¯â€œæ¥è‡ªåœ°ä¸‹ä¸–界——塔尔塔罗斯 (ΤάÏταÏος, Tartarus) ——的å®çŸ³â€ã€‚\n\tç»è¿‡è¿‘一步测试,我å‘现这个å®çŸ³çš„容é‡æ˜¯64。(当我把这个结果拿给马格斯看时,他觉得这个数字是个å分完美的整数。)这样,我å†è¯•å›¾æ¡èµ·æ¶é­”æ„志时它就å¯ä»¥è‡ªåŠ¨å°†å…¶æ”¶é›†èµ·æ¥äº†ã€‚但...这样一æ¥æ„志它本身似乎就消失了。在拯救了我的背包的åŒæ—¶ä¹Ÿç»™æˆ‘带æ¥äº†æ–°çš„谜团呢。åŒæ—¶æˆ‘还å‘现,若是我手æŒå®çŸ³å¹¶å°†ç²¾ç¥žé›†ä¸­äºŽæ­¤ï¼ˆå³å‡»ï¼‰ï¼Œçº¦æœ‰/cut容é‡ä¸Šé™å分之一的æ„志就会æµå…¥æˆ‘身上的å¦ä¸€ä¸ªå®çŸ³ä¸­ã€‚我觉得这个性质会在我得到更强大的地狱魂石åŽå¤§æ˜¾èº«æ‰‹ã€‚ -guide.bloodmagic.entry.demon.sword.info.1=我的网åˆå‡ºé—®é¢˜äº†ã€‚\n\tä¸è®ºæˆ‘怎么努力改进,这投网似乎就是ä¸èƒ½å®Œç¾Žå·¥ä½œã€‚多数时候会打结。但å³ä¾¿æˆ‘æˆåŠŸæŠ•ä¸­äº†åƒµå°¸ï¼Œå®ƒè¿˜æ˜¯æœ‰å¾ˆé«˜æ¦‚率ä¸å·¥ä½œã€‚为了é¿å…自己的头å‘被网缠ä½çš„命è¿ï¼Œæˆ‘决定立刻回到我的狱ç«ç†”炉æ—开工。\n\t但,并éžç«‹åˆ»å¼€å·¥â€”—我首先得清ç†ä¸‹ä¸Šé¢çš„ç°å°˜ã€‚ -guide.bloodmagic.entry.demon.sword.info.2=我将那微å°çš„地狱魂石存储æ¶é­”æ„志的能力æˆåŠŸæ³¨å…¥åˆ°äº†é“剑里,并得到了一柄...伤害比我的拳头还低的剑。我对这个结果感到å分失望,因为我为了让以地狱魂石驱动的炼狱熔炉ä¸è¿‡çƒ­è€Œåœ¨ä¸€æ—摆弄了很久很久。\n\t然而,当我å†æ¬¡æ‹¿èµ·åœ°ç‹±é­‚石时,剑开始散å‘出了一ç§æ–°çš„能é‡ã€‚似乎,我身上的æ¶é­”æ„志越多,剑的伤害也就越高,获得的æ¶é­”æ„志也就越多;倘若/cut没有地狱魂石...这剑就如åŒåºŸé“一般。\n\tç»è¿‡æµ‹è¯•æˆ‘åˆå‘现了一件事:击æ€ä¸åŒçš„目标获得的æ„å¿—æ•°é‡ä¸ä¸€æ ·ã€‚具体的数é‡å’Œç›®æ ‡ç”Ÿç‰©çš„生命上é™æˆæ­£æ¯”——以蜘蛛为例,它最多åªæœ‰8颗心,因此æ€æ­»èœ˜è››èƒ½èŽ·å¾—çš„æ„å¿—æ•°é‡ä¾¿æ˜¯åƒµå°¸çš„百分之八å,因为僵尸最多有å颗心。或许是因为生命越多的生物动起æ¥æ—¶éœ€è¦çš„æ„志越多å§ã€‚我觉得这个事情得好好记ä½ï¼Œä»¥å¤‡ä¸æ—¶ä¹‹éœ€ã€‚ -guide.bloodmagic.entry.demon.lesser.info.1=今天在和æ比略èŠå¤©ï¼ŒèŠåˆ°äº†æœ€è¿‘他的一些工程。ä¸å¾—ä¸æ‰¿è®¤ï¼Œä¸€æ—¦è¯´èµ·ä»–的研究,他就会说个没完没了ï¼ä¸ç®¡äº†ã€‚æ比略说他最近一直在研究å°è®°ï¼Œç›®å‰ä»–å·²ç»åˆ©ç”¨æˆ‘给他造的狱ç«ç†”炉æˆåŠŸåˆ¶æˆäº†æ°´ä¹‹å°è®°å’Œç†”岩å°è®°ã€‚我ä¸æ˜¯å¾ˆæ¸…楚他是怎么åšçš„——我åªçŸ¥é“他以地狱魂石作为催化剂,将多ç§æ料在熔炉中炼æˆå°è®°ï¼Œä½†æˆ‘没亲眼目ç¹è¿‡ä»–的实验过程。ä¸è¿‡æˆ‘今天总算知é“了他那漫天飞舞的ç°å°˜æ˜¯/cut怎么回事。\n\t我æ¥è¯•ç€æŒ‰ä»–çš„æ–¹å¼å¤è¿°ä¸€ä¸‹ã€‚呃,“利用魂石中的æ„å¿—æ¥å¬—å˜å¹³æ—¶æ ¹æœ¬ä¸ä¼šå应的若干原料时,å‘生了å应。利用这ç§å¢žå¹…效应,我便å¯ä»¥åˆ»å‡ºæˆ‘所需è¦çš„铭文,以引导能é‡çš„æµåŠ¨ï¼Œä»Žè€Œå®Œæˆæˆ‘需è¦å®Œæˆçš„工作。â€è™½è¯´ç™½çº¸é»‘字难以想象,但我扶了扶眼镜åŽé‡æ–°å›žæƒ³èµ·äº†å½“时的景象...我ä¸ç¡®å®šä»–是ä¸æ˜¯å¹³æ—¶ä¹Ÿè¿™æ ·ï¼Œä½†æˆ‘å‘誓,一旦跟我解释东西,他就会å˜æˆ...科学家。\n\t/cutä¸è®ºå¦‚何,他为我展示了水之å°è®°çš„制作方å¼ã€‚在电光ç«çŸ³èˆ¬çš„演示åŽï¼Œä»–终于进入了正题。“我在试图用更高级的ææ–™é‡å¤ç›¸åŒçš„过程,但å应物似乎总会在我放进去的一瞬间...爆炸。看上去很ä¸ç¨³å®šã€‚我觉得是因为他们没有正确地èžåˆåœ¨ä¸€èµ·â€”—或许是能é‡ä¸å¤Ÿå§ã€‚â€\n\t我在æ€ç´¢äº†å‡ åˆ†é’ŸåŽä¾¿å¼€å§‹äº†å·¥ä½œâ€”—正如å‰æ–‡æ‰€è¯´ï¼Œæˆ‘觉得我会需è¦æ›´å¼ºå¤§çš„地狱魂/cut石的,但我ä»ç„¶åœ¨æ€è€ƒå¦‚何以优雅的方å¼å®Œæˆè¿™ä¸ªå·¥ä½œã€‚æ‰€ä»¥ï¼Œæˆ‘å†³å®šï¼šè¯‰è¯¸æš´åŠ›ï¼ -guide.bloodmagic.entry.demon.lesser.info.2=我找æ¥ä¸€æ•´å—é’金石ã€ä¸€æ•´å—红石ã€ä¸€é¢—钻石ã€ä»¥åŠä¸€å—空的地狱魂石——啊这å—魂石是我在地上å‘现的,应该是以å‰æŸä¸ªè¿›å±•ä¸é¡ºçš„实验中用的。我åªè®°å¾—马格斯å¯ä»¥è®©æ°´æ³¥å¢™ä¸Šçš„洞瞬间消失。然åŽæˆ‘将这四个物å“放入狱ç«ç†”炉,并以一å—满的地狱魂石供能——最终结果显示我需è¦è‡³å°‘大约60点æ„志。ç»è¿‡ä¸€ç³»åˆ—优化,我终于确定了é…方,并开始观察生长中的地狱魂石。\n\t/cutå¦å¤–还有一点,我试过用金å—代替钻石,但结果似乎åªè¯´æ˜Žå¦ä¸€ç§æ°´æ™¶ç»“构更有用。\n\t最终,我得到了全新的“å°åž‹åœ°ç‹±é­‚石â€ï¼Œå®ƒæ‹¥æœ‰256点容é‡ï¼Œæ¯”å¾®å°çš„地狱魂石大多了。希望这颗新魂石å¯ä»¥æ»¡è¶³æ比略的需求å§ã€‚哎呀这玩æ„的容é‡è¿™ä¹ˆé«˜ä¸å°±æ„味ç€æˆ‘得花更多时间æ¥æ”¶é›†æ¶é­”æ„å¿—å—?啊ï¼åˆæ˜¯ä¸€ä¸ªæ¼«æ¼«é•¿å¤œ...ï¼ -guide.bloodmagic.entry.demon.reactions.info=我今天一早醒æ¥å‘现自己躺在医院的病床上,身上有什么东西疼痛欲裂。我çå¼€åŒçœ¼ï¼Œå´çœ‹åˆ°äº†æ»¡çœ¼çš„暗洋红色——那是,Veteres——è·ç¦»æˆ‘们æ‘庄最近的大城市——的一家医院的天花æ¿ã€‚我对现在的环境倒ä¸æ˜¯æ€Žä¹ˆå¥‡æ€ªï¼Œå› ä¸ºæˆ‘的目光è½åœ¨äº†ä¸€å¤§ç‰‡æ“¦ä¼¤å’Œæ·¤é’上,以åŠæˆ‘左腿上的石è†...什么人肯定对我下了å为"Ossa-Fracta"的诅咒——因为那åªèƒ½æ˜¯æ ¹å掉的骨头ï¼\n\t/cut当马格斯和一å紧绷ç€è„¸çš„护士走进æ¥çš„时候,我就立刻明白了:我é­é‡çš„事情比想象中的还严é‡ã€‚显然,我针对新制的å°åž‹åœ°ç‹±é­‚石的实验å‘生了å弹并引起了爆炸,虽然规模ä¸å¤§ï¼Œä½†ä»æœ‰æ€ä¼¤åŠ›ã€‚ä¸è¿‡æˆ‘也就åªèƒ½æƒ³åˆ°è¿™ç‚¹äº‹æƒ…了:我左å°è…¿ä¸Šè¦†ç›–的黑曜石ã€é“和钻石制æˆçš„护甲,现在å˜æˆäº†æŸç§å®Œå…¨æ— æ³•æ‹†é™¤çš„护甲——更准确地说,是æŸç§æ·¡è“的,类似符文矩阵的魔法护甲。\n\t/cut我冷é™ä¸‹æ¥ï¼Œå¹¶é—®é©¬æ ¼æ–¯æ€Žä¹ˆçœ‹ï¼Œè™½ç„¶æˆ‘已然知é“å‘生了什么。“我觉得å§ï¼Œâ€ï¼Œä»–说,并在认真è†å¬çš„护士看我之å‰çž¥äº†æŠ¤å£«ä¸€çœ¼ï¼Œâ€œé‚£æ˜¯æŸç§é’»çŸ³æ®‹ç•™ç‰©ï¼Œè¿™ä¹Ÿæ˜¯ä¸ºä»€ä¹ˆæˆ‘们没办法拆掉它的原因。åŒæ—¶ï¼Œå®ƒè¿˜è¢«æŸç§...异域的能é‡æŸç¼šç€ï¼Œè¿™ä¹Ÿæ˜¯ä¸ºä»€ä¹ˆä½ çŽ°åœ¨ä¼šèººåœ¨è¿™é‡Œï¼Œè€Œä¸æ˜¯å½“地诊所,的原因——共èšä¼šè‡ªä»Žä¸Šæ¬¡é‚ªæœ¯äº‹ä»¶ä»¥æ¥å°±ä¸€ç›´å¯¹è¢­å‡»äººç±»çš„ä¸æ˜Žèƒ½é‡é«˜åº¦é‡è§†ï¼Œæˆ‘们必须ä¿è¯ä¸æ‹›æƒ¹æ˜¯éžã€‚â€\n\t/cut“我知é“了...â€å¹³æ—¥é‡Œï¼Œé©¬æ ¼æ–¯æ˜¯ä¸ä¼šåŽ»æ“心诸如就未知能é‡äº‹ä»¶ç…§ä¼šå…±èšä¼šè¿™ç§æ­£å¼çš„事情的——我已ç»ç€æ‰‹ç ”究æ¶é­”æ„志多时了,也ä¸è§å…±èšä¼šä¸Šé—¨æ¥ä¸ºæ–°çš„魔法能é‡åŠžç›¸å…³æ‰‹ç»­ã€‚我对政治ä¸æ„Ÿå…´è¶£ï¼Œæˆ‘也ä¸æ‰“ç®—é€éœ²å¤ªå¤šæ¶ˆæ¯ï¼Œä½†æˆ‘知é“马格斯对此事éžå¸¸è°¨æ…Žâ€”—这æ„味ç€ï¼Œåœ¨æŽ¥ä¸‹æ¥ä¸€æ®µæ—¶é—´å†…,马格斯都会为这æ„志所蕴å«çš„能é‡æ‹…忧,说ä¸å®šè¿˜ä¼šç‰µæ‰¯å‡ºé™ˆå¹´æ—§è´¦ä¹Ÿè¯´ä¸å®š...?\n\/cut“够了,è¯é¢˜åˆ°æ­¤ä¸ºæ­¢ï¼Œâ€é©¬æ ¼æ–¯è¯´ç½¢ä¾¿æŠ«ä¸Šäº†ä»–çš„é•¿è¢ï¼Œâ€œæˆ‘原本打算一开始就将之公之于众的,但那时它的å¨åŠ›è¿˜ä¸æ˜Žæ˜¾ï¼Œä½†çŽ°åœ¨...â€\n\t我感å—到左腿有一股热浪,就åƒè¦æŠŠæˆ‘的腿烧起æ¥ä¸€æ ·ï¼ŒåŒæ—¶ä¸ºçœ‹åˆ°é©¬æ ¼æ–¯æ§æˆæ¯çŠ¶çš„手盖在了è“色的壳上,散å‘出耀眼的红光。几秒钟åŽâ€”—虽然我感觉这åƒæ˜¯ç»è¿‡äº†æ°¸æ’的时间——壳开始碎裂并脱è½ã€‚说实è¯è¿™ä¸ªç»“局有些令人扫兴。\n\t/cut我试图起身,但马格斯一把把我按回床上:“è´æ‹‰ï¼Œä½ éœ€è¦ä¼‘æ¯ã€‚魂石的事情å¯ä»¥å…ˆæ”¾ä¸€æ”¾ã€‚â€å¯¹æ­¤ï¼Œä¸€å¼€å§‹æˆ‘是拒ç»çš„,但我åŽæ¥è½¬è€Œå¼€å§‹æ€è€ƒè¿™æ¬¡äº‹æ•…。马格斯ä¸æ—©ç‚¹è¿™ä¹ˆåšçš„ç†ç”±åªèƒ½æ˜¯åœ°ç‹±é­‚石在爆炸åŽä»ç•™åœ¨æˆ‘身上。æ¢è¨€ä¹‹ï¼Œæˆ‘腿上ä¸è®ºå‘生什么,都和æ¶é­”æ„志有关;åªè¦æ‹¿åŽ»é­‚石,那层壳也就能被移除。我开始了沉æ€... -guide.bloodmagic.entry.demon.sentientGem.info.1=几天åŽï¼Œé©¬æ ¼æ–¯å¼ºåˆ¶æ‰§è¡Œçš„“休养生æ¯â€ç»“æŸäº†ã€‚我决定在我现有的基础上继续研究感知护甲。然而,还有很多关于感知之剑和æ¶é­”æ„志的疑问没有解答。诚然,我们有一些ç†è®ºä¸Šçš„猜想,但毕竟是马格斯和我æ出的ç†è®ºï¼Œæˆ‘们也ä¸çŸ¥é“究竟有多准确。\n\t为此我需è¦ä¸€ç‚¹å¤§èƒ†çš„设想。马格斯告诉我说,我们在学习血之魔法时,也有必è¦å­¦ä¹ å¦ä¸€é—¨é­”法的艺术。æ比略/cut建议我去学习花之魔法,但我对此嗤之以鼻——“一堆花也能帮我击退æ¶é­”?ï¼â€ -guide.bloodmagic.entry.demon.sentientGem.info.2=感知护甲å®çŸ³æ˜¯å—å¯ä»¥è®©ä½ ç©¿å¸æ„ŸçŸ¥æŠ¤ç”²çš„工具。确ä¿èº«ä¸Šæœ‰16点æ¶é­”æ„志,使用这å—å®çŸ³ï¼ˆå³å‡»ï¼‰ï¼Œä¾¿ä¼šå°†ä½ èº«ä¸Šçš„护甲悉数替æ¢æˆä¸€å¥—全新的感知护甲,åŒæ—¶è¿˜ä¼šç»§æ‰¿ä½ æœ¬æ¥æŠ¤ç”²ä¸Šçš„附魔效果;å†æ¬¡ä½¿ç”¨è¿™å—å®çŸ³å°±å¯ä»¥è„±ä¸‹æ„ŸçŸ¥æŠ¤ç”²å¹¶æ¢å›žä½ æœ¬æ¥çš„护甲。当然,å³ä¾¿ä½ èº«ä¸Šæ²¡æœ‰æŠ¤ç”²ï¼Œè¿™å—å®çŸ³ä¹Ÿæ˜¯å¯ä»¥ç”¨çš„。\n\t感知护甲的效果一般与普通é“护甲无异,除此之外没有别/cut的效果。但,和感知工具一样,当你身上æŒæœ‰æ¶é­”æ„志时,感知护甲的ä¿æŠ¤èƒ½åŠ›å°±ä¼šä¸Šå‡ï¼Œä¸Šå‡å¹…度与æ„å¿—æ•°é‡æˆæ­£æ¯”。也正是因为此,当你身上有海é‡æ¶é­”æ„志时它的ä¿æŠ¤èƒ½åŠ›å°±ä¼šå˜å¾—å分强大。但有一点需è¦æ³¨æ„,就是你æ¯å—到一次伤害,都会消耗地狱魂石中的æ¶é­”æ„志,如果æ„å¿—æ•°é‡å¤ªä½Žï¼Œæ„ŸçŸ¥æŠ¤ç”²å°±å¯èƒ½ä¼šè¢«æ‰“回原形。说ä¸å®šæ˜¯ä¸ªå¼±ç‚¹å‘¢ï¼ -guide.bloodmagic.entry.demon.routing.info=血魔法的物å“ä¼ é€æ˜¯ä»¥æ¶é­”æ„志编织æˆçš„网的形å¼å‡ºçŽ°çš„,整张网构æˆäº†ç‰©å“传输的通路,连接ç€æ¯ä¸€ä¸ªå‚¨å­˜ç‚¹ã€‚让我æ¥å…ˆè®²è§£ä¸€ä¸‹æ¯ä¸€ä¸ªç‰©å“都是干什么的。\n\tæ¯ä¸€ä¸ªè·¯ç”±ç³»ç»Ÿéƒ½æœ‰ä¸€ä¸ªä¸»æŽ§è·¯ç”±èŠ‚点,相当于整个系统的中枢。输入节点用于将物å“输入路由网络,输出节点将物å“从网络中æå–出æ¥ï¼Œè€Œæ ‡å‡†çš„路由节点没有任何特殊功能。\n\t/cut网络的æ­å»ºæ–¹æ³•å¦‚下:首先,你需è¦åœ¨æ½œè¡Œæ—¶æ‰‹æŒèŠ‚点连接工具å³å‡»ä¸€ä¸ªèŠ‚点,然åŽä»¥åŒæ ·çš„方法å³å‡»å¦ä¸€ä¸ªä½ æƒ³ä¸Žä¹‹è¿žæŽ¥çš„节点。åªè¦ä¸¤ä¸ªèŠ‚点之间能找到æŸç§é€šè·¯ï¼ŒæŠ‘或都连接在主节点上,它们就å¯ä»¥äº’相“通信â€ã€‚\n\t物å“路由第一原则:物å“总是从最近的输入节点进入网络,从最近的输出节点离开网络。你需è¦ç­›é€‰å™¨æ¥é™åˆ¶ç‰©å“çš„æµå‘。在节点的æ“作界é¢/cut上有一个按钮å¯ä»¥è®©ä½ è¿›è¡Œè¿‡æ»¤è®¾ç½®ï¼Œå¯ä»¥ç²¾ç¡®åˆ°é¢ï¼ˆç•Œé¢ä¸­çš„N指北方,以此类推)。最左边的格å­è¿˜å¯ä»¥æŒ‡å®šç‰©å“æ•°é‡å’Œç§ç±»ã€‚对于输入节点æ¥è¯´ï¼Œç­›é€‰å™¨çš„存在会使它们åªæå–筛选器指定的物å“;如果你指定了数é‡ï¼Œå®ƒä»¬è¿˜ä¼šç•™ä¸‹æŒ‡å®šæ•°é‡çš„物å“,而éžå…¨éƒ¨æå–出æ¥ã€‚对于输出节点æ¥è¯´ï¼Œç­›é€‰å™¨åˆ™è®©å®ƒä»¬åªæŽ¥å—并输出指定的物å“;如果你指定了数é‡ï¼Œé‚£ä¹ˆå®ƒä»¬æœ€å¤šåªä¼šè¾“出那么多物å“。\n\t/cut有四ç§ä¸åŒç±»åž‹çš„筛选器:\n\t精确匹é…——物å“çš„NBT和元数æ®å¿…须完全匹é…。\n\t按模组匹é…——若物å“æ¥è‡ªæŒ‡å®šMod则匹é…æˆåŠŸã€‚\n\t忽略NBT——筛选器ä¸æ¯”较NBT标签。\n\t矿物字典——若物å“带有相åŒçŸ¿ç‰©å­—å…¸æ¡ç›®åˆ™åŒ¹é…æˆåŠŸã€‚\n\t/cut在将筛选器放入路由节点åŽï¼Œä½ å¯ä»¥åœ¨è·¯ç”±èŠ‚点上看到两个数字:数é‡å’Œä¼˜å…ˆçº§ã€‚点击筛选器中的任何物å“åŽå³å¯çœ‹åˆ°å…¶å字,正下方则会显示数é‡ã€‚如å‰æ–‡æ‰€è¿°ï¼Œè¿™ä¾¿æ˜¯æŒ‡å®šæ•°é‡çš„地方了。若你将数é‡è®¾å®šä¸º0,那么就æ„味ç€â€œæ‰€æœ‰â€â€”—对于输入节点æ¥è¯´ï¼Œé‚£å°±æ˜¯æŠ½å–所有物å“;对于输出节点æ¥è¯´ï¼Œå°±æ˜¯æ供所有物å“。\n\t第二个数字便是优先级,å¯ç”¨ä¸€æ—的箭头调整。数字越å°ï¼Œ/cut优先级越高,物å“将会首先试图å‰å¾€ä¼˜å…ˆçº§é«˜çš„节点。 -guide.bloodmagic.entry.demon.aura.info=生物被æ€æ­»åŽï¼Œå…¶çµé­‚会日æ¸æ¶ˆé€€ï¼Œæœ€ç»ˆå›žå½’创世之神。使用投网,å¯ä»¥å°†å…¶æŸç¼šäºŽçŽ°ä¸–,但也有一些难度。我们现在,出于ç§ç§ç†ç”±ï¼Œå¯¹è¿™äº›æ„志加以干扰并冻结其一切活性。若我们燃烧æ„志,它就会回归虚无。但若是我们直接将æ„志释放到空气中,我们便å¯ä»¥ä»¥æ›´çµæ´»çš„æ–¹å¼é©¾é©­è¿™è‚¡åŠ›é‡ã€‚有些方å¼å分普通,而有些方å¼åˆ™æ˜¾å¾—å分强大。\n\t在将æ¶é­”æ„志释放到空气中/cutåŽï¼Œå®ƒä¼šä¸€ç›´å¾…在释放出æ¥çš„那片土地上(å³ï¼Œé‚£ä¸ªåŒºå—),ä¸ä¼šè½»æ˜“离开。æ¯ä¸€ç‰‡åœŸåœ°ä¸Šçš„ä¸åŒç§ç±»çš„æ„志(关于æ„å¿—çš„ç§ç±»ï¼ŒåŽæ–‡æœ‰è¯¦è¿°ï¼‰äº’ä¸å½±å“。这些æ„志的存在还å¯ä»¥ç”¨å…¶ä»–çš„æ–¹å—和物å“æ¥è°ƒæ•´ã€‚ -guide.bloodmagic.entry.demon.types.info=到目å‰ä¸ºæ­¢ï¼Œæ¯å½“我们讨论æ¶é­”æ„志时,都是讨论的原生æ„志。这也就æ„味ç€è¿™æ˜¯å¤©ç„¶çš„æ„志,但这并ä¸ç­‰äºŽå®ƒæ˜¯çº¯çš„。事实上,æ¶é­”æ„志有若干类型;除开原生æ„志,还有è…蚀ã€ç ´åã€å¤ä»‡ä»¥åŠåšæ¯…å››ç§æ„志。原生æ„志实质是这四ç§æ„å¿—çš„æ··åˆç‰©ï¼Œä¹Ÿè®¸è¿˜æœ‰ä¸€äº›è‡³ä»Šæ²¡æœ‰è¯†åˆ«çš„æ„志,但有一点å¯ä»¥ç¡®å®šï¼Œå³åˆ†ç¦»åŽçš„æ„志很难å†èžåˆä¸ºä¸€ä½“。\n\tå››ç§ä¸åŒçš„æ„志的真正æ¥æº/cut至今ä»ç„¶ä¸æ˜Žï¼Œä½†æˆ‘们已ç»æŽŒæ¡äº†äº§ç”Ÿè¿™å››ç§æ„志的方法。将æ„志释放到空气中åŽï¼Œç›¸åŒç§ç±»çš„æ„志就会开始èšé›†åœ¨ä¸€èµ·ã€‚æ®æ­¤ï¼Œåªéœ€è¦æœ‰ä¸€ç§å¯ä»¥æ”¶é›†ç‰¹å®šç§ç±»æ„志的设备就å¯ä»¥å®Œæˆä»»åŠ¡äº†ã€‚接下æ¥çš„几个章节中将会讲述其中一ç§è®¾å¤‡â€”—æ¶é­”结晶å›ã€‚\n\tå››ç§æ„志代表了人的四ç§æ¬²æœ›ã€‚当然我们ä»ç„¶å¯ä»¥å‡å®šå­˜åœ¨æ›´å¤šç§æ„志,但也许它们/cut的纯度还ä¸å¤Ÿï¼Œä¹Ÿè®¸æ ¹æœ¬ä¸èƒ½å­˜åœ¨ï¼Œæ€»è€Œè¨€ä¹‹æˆ‘们目å‰è¿˜æ²¡å‘现新的æ„å¿—ç§ç±»ã€‚\n\tè…蚀——代表了通过å„ç§æ–¹å¼â€”—酸液ã€è›®åŠ›ã€ç­‰ç­‰â€”—破å万物的欲望。掌æ¡äº†è¿™ç§åŠ›é‡çš„人,将能自由地驱使å„ç§ç–¾ç—…(æ¢è¨€ä¹‹ï¼Œå„ç§è´Ÿé¢æ•ˆæžœï¼‰çš„力é‡ï¼Œå¹¶ä»¤è‡ªèº«å…å—剧毒的侵蚀。\n\tæ¶æ„——å¯çœ‹ä½œæ˜¯â€”—一ç§å­œå­œä¸å€¦å¯»æ‰¾å¯¹æ‰‹çš„欲望。通常,驾/cuté©­æ¶æ„能é‡çš„人,åªè¦é”定了目标,移动速度就会上å‡ï¼Œä½¿å¾—å¯æ€œçš„猎物无处躲è—,åªå¾—å以待毙。\n\tç ´å——你或许已ç»çŒœåˆ°äº†â€”—其实就是纯粹的力é‡ã€‚正确地使用这ç§åŠ›é‡å¯ä»¥ä»¤ä½¿ç”¨è€…的身体素质在短时间内获得快速æå‡ï¼›åŒæ—¶è¿˜å¯ä»¥ç”¨æ¥ç²‰ç¢Žæˆ–碾磨其他物å“。\n\tåšæ¯…——无数的观察表明——这是抵御攻击,使自身å…é­ä¼¤å®³çš„/cut欲望。大多数情况下,æ“纵这ç§æ¬²æœ›çš„人,都是团队中的铜墙é“å£â€”—任何攻击都ä¸ä¼šä¼¤ä»–分毫。如果你想藉由你的护甲或仪å¼æ¥ä¿éšœä½ çš„存活概率,这股力é‡ç»å¯¹æ˜¯ä½ çš„第一选择。 -guide.bloodmagic.entry.demon.crucible.info=æ¶é­”å©åŸšå¯å°†åœ°ç‹±é­‚石中的æ¶é­”æ„志散布到当地(å³å½“å‰åŒºå—)的大气之中。这å£å©åŸšæœ‰è‹¥å¹²ç”¨é€”:最简å•çš„一个就是直接将地狱魂石放入其中(å³å‡»æ”¾å…¥ï¼‰ã€‚å©åŸšä¼šè‡ªåŠ¨ä»Žé­‚石中抽å–æ¶é­”æ„志并散布到空气中,直到饱和(æ¯ç§æ„志大约都会在达到100点时饱和)或者魂石本身被抽干了。\n\t此外,它还å¯ä»¥æŠ½å–空气中的æ¶é­”æ„志并çŒè¾“进魂石中。æ“作方å¼å’Œæ•£å¸ƒæ¶é­”æ„å¿—æ— /cut异,åªæ˜¯å©åŸšéœ€è¦ä¸€ä¸ªå¼ºçš„红石信å·ï¼ˆå³å¼ºå……能)。\n\t最åŽï¼Œç›´æŽ¥å¾€é‡Œé¢æŠ•å…¥ä¸€å—æ¶é­”æ„志也是å¯ä»¥çš„,ä¸è®ºä»€ä¹ˆå½¢å¼ï¼Œåªè¦æœ‰å®¹çº³æ„志的空间就å¯ä»¥è¿›è¡Œè½¬åŒ–。举个例å­ï¼Œå°†æ™¶åŒ–æ¶é­”æ„志投入å©åŸšå¯äº§ç”Ÿ50点æ„志。 -guide.bloodmagic.entry.demon.crystallizer.info=正如之å‰æ‰€æ到的那样,æ¶é­”çµæ°”——通常我们会简å•ä»¥â€œå¤§æ°”â€æŒ‡ä»£ä¹‹â€”—是æ¶é­”æ„志的空çµçš„存在形å¼ï¼Œè€Œå‡»æ€æ€ªç‰©èŽ·å¾—的物质则是æ¶é­”æ„志物ç†å½¢å¼çš„具现。而这æ¶é­”结晶å›ï¼Œåˆ™åƒæ˜¯ä¸€ä¸ªé”šç‚¹ï¼Œè®©æ¼‚浮在大气中的æ¶é­”æ„志以晶体的形æ€é‡çŽ°ã€‚\n\t你也许会问,为什么ä¸ç›´æŽ¥ç”¨åœ°ç‹±é­‚石培养一å—晶体呢?这是因为在我们将æ¶é­”æ„志释放到空气中时,它身上的ç¦é”¢/cut就已ç»è¢«è§£é™¤äº†â€”—记ä½ï¼Œå½“我们æ€æ­»ä¸€ä¸ªæ€ªç‰©æ—¶ï¼Œå®ƒèº«ä¸Šçš„æ„志也就éšä¹‹è¢«æˆ‘们ç¦é”¢äº†ã€‚å†æ¬¡é‡Šæ”¾è‡ªç„¶ä¼šä»¤å…¶é‡æ–°æ¢å¤æ´»åŠ›ï¼Œè€Œè¿™ç»“晶å›å°±æ˜¯ç›´æŽ¥å¸æ”¶è¿™æ´»çš„æ¶é­”æ„志。ä¸è¦å¤ªæƒ³å½“然啦。\n\t结晶过程需è¦æ¯”较高的æ¶é­”çµæ°”的浓度(大概是80点),并且需è¦ä¸€æ®µæ—¶é—´ã€‚在这之åŽï¼Œç»“晶å›çš„上方便会长出åªæœ‰ä¸€æ ¹å°–çš„æ¶é­”晶簇。结晶å›æœ‰ä¸¤ç§å·¥ä½œæ–¹å¼ï¼šå®ƒæ—¢å¯ä»¥å¸æ”¶/cut特定的一ç§æ„志然åŽäº§ç”Ÿå¯¹åº”的晶体;也å¯ä»¥ç›´æŽ¥å¸æ”¶åŽŸç”Ÿæ„å¿—æ¥äº§ç”Ÿæ™¶ä½“。\n\tæ­¤å‰ç»“晶å›å¯ä»¥ç›´æŽ¥ä»ŽåŽŸç”Ÿæ„志中分离出特定类型的æ„志,现在你需è¦ä¸€äº›ç‰¹æ®Šçš„设备æ¥åšåˆ°è¿™ä¸€ç‚¹äº†ã€‚ä½ å¯èƒ½éœ€è¦å‚阅仪å¼å¤§å¸ˆå·çš„《结晶共鸣》一章。 -guide.bloodmagic.entry.demon.cluster.info=æ¶é­”晶簇既å¯ä»¥ä½¿ç”¨æ¶é­”结晶å›åŸ¹å…»ï¼Œä¹Ÿå¯åœ¨ç‹±ç«ç†”炉中用æ¶é­”结晶制作。晶簇å¯ä»¥åœ¨å„ç§åœ°æ–¹ç”Ÿé•¿â€”—地æ¿ã€å¢™å£ã€ç”šè‡³å¤©èŠ±æ¿ä¸Šã€‚完全长æˆçš„晶簇应该有七个尖,打掉åŽæ¯ä¸€ä¸ªå°–都会å˜æˆä¸€å—结晶。然而,如果你使用å«æœ‰è‡³å°‘1024点æ„志的地狱魂石æ¥æ”¶èŽ·ï¼ˆå³å‡»ï¼‰ï¼Œä½ ä¾¿èƒ½åªæ”¶èŽ·ä¸€å—结晶而ä¸å½±å“到整棵晶簇。\n\t晶簇生长的过程中,会å¸æ”¶åŒç§æ¶é­”çµæ°”。虽然慢,但的确/cut是有收益的。\n\t有两ç§å’Œæ™¶ç°‡çš„ç§æ¤å’Œæ”¶èŽ·ç›¸å…³çš„仪å¼ï¼šå­¤é­‚集会和碎晶裂纹。具体用法å¯ä»¥å‚阅《仪å¼å¤§å¸ˆã€‹ä¸€å·ã€‚ -guide.bloodmagic.entry.demon.pylon.info=你或许已ç»å‘现了,在没有外力的影å“下,æ¶é­”çµæ°”åªä¼šå¾…在它被释放出æ¥çš„那个地方(å³å½“å‰åŒºå—)。而这æ¶é­”导能塔,则为那些çµåŸŸä¸­çš„æ„志亮起了一ç›ç¯â€”—一ç›æŒ‡å¼•æ–¹å‘çš„ç¯ã€‚附近的æ„志在这ç¯çš„指引下会é€æ¸å‘ç¯é æ‹¢ï¼Œç›´è‡³è¿™äº›åœ°æ–¹çš„æ„å¿—æ•°é‡ä¿æŒå‡åŒ€ã€‚(注:这里所谓的“附近â€ä¸å«å¯¹è§’线上的区å—,å³åªæœ‰ä¸Žå¡”所在的区å—相邻的四个区å—会å—到影å“)。å¦å¤–è¦æ³¨æ„的是,æ„å¿—åªä¼šä»Žå¤šçš„地方æµ/cutå‘少的地方。若是什么地方的æ„志的浓度比附近的地方浓度低了,它就ä¸ä¼šç»§ç»­æµåŠ¨äº†ã€‚ -guide.bloodmagic.entry.demon.gauge.info=你需è¦ä¸€ä¸ªæµ‹é‡ä»ªæ¥æµ‹å®šçµåŸŸä¸­çš„æ¶é­”æ„志浓度。åªéœ€è¦ä¸€ç›´æ”¾åœ¨ä½ çš„背包中,测é‡ä»ªä¾¿å¯å°†æµ“度以五个指示器的形å¼æ˜¾ç¤ºå‡ºæ¥ï¼ˆåœ¨å±å¹•å·¦ä¸Šè§’)。潜行时你还能得知具体数é‡ï¼Œä½†è¿™ä¸ªç»“果是ç»è¿‡å››èˆäº”入的。 - - - -# Alchemy Entries -guide.bloodmagic.entry.alchemy.intro=åº -guide.bloodmagic.entry.alchemy.ash=å¥¥æœ¯ç²‰ç° -guide.bloodmagic.entry.alchemy.speed=法阵:æ•æ· -guide.bloodmagic.entry.alchemy.updraft=法阵:å‡è…¾ -guide.bloodmagic.entry.alchemy.bounce=法阵:弹跳 -guide.bloodmagic.entry.alchemy.turret=法阵:骷髅炮塔 -guide.bloodmagic.entry.alchemy.buff=增益法阵 -guide.bloodmagic.entry.alchemy.fastMiner=法阵:速掘 -guide.bloodmagic.entry.alchemy.furnace=法阵:燃炉 -guide.bloodmagic.entry.alchemy.teleport=æ³•é˜µï¼šä¼ é€ -guide.bloodmagic.entry.alchemy.standardTurret=法阵:标准炮塔 -guide.bloodmagic.entry.alchemy.laputa=法阵:拉普达碎片 - - -# Alchemy Entry Texts -guide.bloodmagic.entry.alchemy.intro.info=我å«å¼—拉德·海泊æ©ï¼Œæ˜¯ä¸€å血法师。我一直致力于研究炼金术的细节以åŠæ‰€æœ‰é­”法中共åŒçš„原则——“等价交æ¢â€ã€‚简å•æ¥è¯´ï¼Œä½ ä¸èƒ½æ— ä¸­ç”Ÿæœ‰ï¼Œè™½ç„¶å¾ˆå¤šäººä¸€ç›´åœ¨è‡´åŠ›äºŽå¯»æ‰¾é‚£ä¸ªå¯ä»¥æ— è§†æ­¤åŽŸåˆ™çš„石头。很显然,石头的寻找之旅并ä¸é¡ºåˆ©ï¼Œå› ä¸ºäººä»¬æ€»æ˜¯ä¼šåœ¨æƒŠè®¶å£°ä¸­å‘现石头是å‡è´§ã€‚当然,我ä¸åªæ˜¯ä¸ªç‚¼é‡‘术师,我主è¦è¿˜æ˜¯åœ¨è·Ÿä»ªå¼å¤§å¸ˆå’Œç¼”造者学习血之魔法,这二ä½åœ¨åœˆå†…业已是颇具声望的人物了。/cut马格斯和æ比略这几年æ¥ä¸€ç›´åœ¨è®°å½•ä»–们的æˆæžœï¼Œä½†æ˜¯æˆ‘一直ä¸çŸ¥é“马格斯是å¦çœŸçš„记录下了他的毕生所学——既ä¸èƒ½è¯æ˜Žï¼Œä¹Ÿä¸èƒ½è¯ä¼ªã€‚\n\t我的这本书将记录血魔法中的炼金术。从奥术粉尘,到å¤æ‚的炼金å°æ¡Œï¼Œä½ å°†ä¼šåœ¨è¿™æœ¬ä¹¦ä¸­æ‰¾åˆ°ä¸–é—´å„ç§å¤æ‚的元素的线索。当然,为了读懂这本书,你还需è¦é˜…读其余的几本书,以对血魔法有清楚的了解。\n\t/cut就现在æ¥è¯´å‘¢ï¼Œæˆ‘衷心希望é¢å‰çš„读者阅读愉快。这些书页的内容,都是如å‡åŒ…æ¢çš„真æ‰å®žå­¦ã€‚ -guide.bloodmagic.entry.alchemy.ash.info=奥术粉尘便是炼金法阵的基础,而炼金法阵(为简便,下简称法阵)——一ç§åœ†å½¢æ³•é˜µâ€”—则拥有多ç§å¼ºå¤§çš„功能。åˆæˆå¥¥æœ¯ç²‰å°˜éœ€è¦ç”¨åˆ°ç‹±ç«ç†”炉和æ¶é­”æ„志,关于这两样东西的细节å¯ä»¥å‚考本书《æ¶é­”之å­ã€‹ä¸€å·ã€‚\n\t/cut一份奥术粉尘å¯ä½¿ç”¨äºŒå次。对ç€åœ°é¢æˆ–者墙å£ä½¿ç”¨ä¾¿å¯ç”»å‡ºä¸€ä¸ªåœ†å½¢çš„法阵(如果是墙å£ï¼Œä½ åªèƒ½åœ¨ä¸€ä¸ªæ–¹å‘上看到法阵)。然åŽï¼Œå¯¹æ³•é˜µä¸­å¤®ä½¿ç”¨åˆé€‚的催化剂å³å¯æ”¹å˜å…¶å½¢çŠ¶ï¼Œå½“然也会消耗催化剂(å³ï¼Œå³å‡»ä½¿ç”¨ï¼‰ã€‚如果法阵没有å˜å½¢ï¼Œé‚£ä¹ˆä½ è‚¯å®šæœ‰ä»€ä¹ˆåœ°æ–¹æžé”™äº†ã€‚\n\t在观察到法阵å˜å½¢åŽï¼Œä½ ä¾¿å¯ä»¥æ”¾å…¥æ¬¡è¦ç‰©å“了。åˆé€‚的次è¦ç‰©å“会å¯åŠ¨æ³•é˜µï¼Œå±Šæ—¶ä½ ä¼šçœ‹åˆ°æ³•é˜µå¼€å§‹æ—‹è½¬ï¼Œå¹¶å¼€å§‹/cut产生å„ç§å˜åŒ–,具体å˜åŒ–éšæ³•é˜µä¸åŒè€Œä¸åŒã€‚\n\t所有éžåˆæˆçš„法阵用途都å¯ä»¥åœ¨æœ¬ä¹¦ä¸­æŸ¥é˜…到,å³ä¾¿åˆæˆè¢«ä»–人强行更改过也å¯ä»¥ã€‚对于需è¦çš„物å“,它们都已ç»è¿‡æŽ’åºï¼ŒæŒ‰ç…§æœ¬ä¹¦ç»™å‡ºçš„顺åºæ”¾ç½®å³å¯ã€‚ -guide.bloodmagic.entry.alchemy.speed.info=法阵:æ•æ·å¯ä»¥åˆ¶é€ è‹¥å¹²æ°”旋,并用法力加热。此åŽï¼Œä¸€æ—¦æœ‰ç”Ÿç‰©èµ°å…¥å…¶ä¸­ï¼Œå®ƒä»¬å°±ä¼šè¢«é£Žçš„力é‡æŽ¨å‘å‰æ–¹ã€‚此外,它还å¯ä»¥å…除所有因此产生的掉è½ä¼¤å®³ã€‚åªéœ€è¦åšäº›è¿åŠ¨å°±å¥½äº†ã€‚\n\t漩涡推进的方å‘是阵列上箭头的方å‘。\n\tå¦å¤–,相比于直接走入阵列中,从高处掉入阵列的效果会更好。这è¦å½’功于你掉下æ¥æ—¶å‘¨å›´ç©ºæ°”产生的æµåŠ¨ã€‚ -guide.bloodmagic.entry.alchemy.updraft.info=这个阵列使用和法阵:æ•æ·ä¸€æ ·çš„原ç†ï¼Œä¸è¿‡è¿™æ¬¡çš„æ–¹å‘是æœä¸Šäº†ã€‚自然地,使用阵列时务必å°å¿ƒï¼šå†ä¸‹æ¥å°±ä¸æ˜¯æ˜“äº‹äº†ï¼ -guide.bloodmagic.entry.alchemy.bounce.info=阵列会将接近中心的热é‡é›†ä¸­åˆ°ä¸‹é¢ï¼Œè¿›è€Œè½¯åŒ–地é¢ï¼Œå¹¶æœ€ç»ˆè½¬åŒ–为一ç§ç”±ç¢³å’Œæ°¢ç»„æˆçš„橡胶状物质。这ç§ç‰©è´¨ä¼šå°†ç”Ÿç‰©å¼¹è‡³ç©ºä¸­ï¼ŒåŒæ—¶ä¹Ÿèƒ½é¿å…掉è½ä¼¤å®³ã€‚潜行å³å¯é¿å…è¿™ç§ç¥žå¥‡æ料的影å“,当然这ä¸ä¼šå½±å“æ‘”è½ä¿æŠ¤çš„功能。 -guide.bloodmagic.entry.alchemy.turret.info=利用那些ä»ç„¶æŽ§åˆ¶ç€æ€ªç‰©çš„æ¶é­”æ„志,你å¯ä»¥æŽ§åˆ¶ä¸€ä¸ªéª·é«…的心智。åªè¦æœ‰éª·é«…进入了这个阵列的覆盖范围,这骷髅就会化身哨兵,并å‘所有敌对生物开ç«ã€‚ä¸è¿‡è¿™ä¸ªæ³•é˜µä»åœ¨å®žéªŒå½“中,它有时候会ä¸ç®¡ç”¨ã€‚ -guide.bloodmagic.entry.alchemy.buff.info=ç»è¿‡ä¸¥å¯†çš„研究,你å‘现法阵拥有强大的应用潜力。迄今,你已æˆåŠŸåˆ¶é€ äº†æ•°ç§é˜µåˆ—,从加速移动,到åˆçº§çš„ä¼ é€ï¼Œåº”有尽有。但唯有一ç§é˜µåˆ—,你至今ä»ç„¶æ²¡æœ‰ç€æ‰‹åŽ»ç ”究,那便是æ供强大的正é¢å¢žç›Šçš„阵列。\n\t增益阵列实际上是指一系列å¯ä»¥æ供范围增益效果的阵列。这些阵列产生的增益效果通常都有很大的固定覆盖范围,ä¸å—外力影å“。然而,因/cut为法阵ä¸ä¼šç‰µæ‰¯åˆ°çµé­‚网络,阵列需è¦åˆ«çš„æ–¹å¼æ¥ä¼ æ’­è¿™ç§æ•ˆæžœï¼Œé€šå¸¸æ˜¯ç›´æŽ¥ç”¨è¡€ã€‚æ¢è¨€ä¹‹ï¼Œå½“有玩家展开阵列时,玩家就会立刻å—到伤害(æŸå¤±ç”Ÿå‘½ï¼‰ï¼Œè—‰ç”±æ­¤å¯åŠ¨é˜µåˆ—。\n\t因为使用了直接献祭,å‰æœŸä½¿ç”¨è¿™ç§é˜µåˆ—会比使用其他获å–增益的手段更ç»æµŽä¸€äº›ã€‚è·ç¦»ï¼Œå¦‚æžœæŸä¸ªå°è®°å¯æ¶ˆè€—100LP并æ¢å–10秒的效果,阵列å¯ä»¥ä»¥1点生命的代价æ¢æ¥30秒åŒæ ·çš„效果(1点生命对于一级/cut祭å›æ¥è¯´æ˜¯100LP)。尽管到了åŽæœŸï¼Œè¿™ç§é˜µåˆ—å°±ä¸ä¼šå†æœ‰æ•ˆçŽ‡ä¸Šçš„优势,但因为它们的ä½ç½®æ˜¯å›ºå®šçš„,相比于å°è®°ï¼Œå®ƒä»¬é€šå¸¸ä¼šç»™äºˆæ›´å¼ºå¤§çš„效果,所以它们到了åŽæœŸä»æœ‰å®ƒä»¬çš„价值。 -guide.bloodmagic.entry.alchemy.fastMiner.info=é‡åˆ°å¤§èŒƒå›´çš„雕刻任务,有时候还是自己动手更划算一些。对于这ç§æƒ…况,这个阵列便是你的ä¸äºŒé€‰æ‹©ã€‚这个阵列å¯ä¸º10格内的玩家æ供急迫 III的效果,消耗则是æ¯30秒1点生命值(åŠé¢—心)。因为是普通的急迫效果,所以它也å¯ä»¥æ高你的攻击速度,ä¸è¿‡è¦è®°ä½ï¼Œåˆ«çš„玩家åŒæ ·ä¼šè¢«é˜µåˆ—è¦†ç›–åˆ°ï¼ -guide.bloodmagic.entry.alchemy.furnace.info=在冒险刚刚å¯ç¨‹æ—¶å¯èƒ½é‡åˆ°çš„众多问题之一,就是难以ä¿æŒç†”炉的燃烧。一个点ç€çš„熔炉æ„味ç€å¯ä»¥äº«å—美味的食物与精炼的装备,而ä¸æ˜¯èº²åœ¨æ´žç©´ä¸­æŒ¨é¥¿ã€‚\n\t燃炉法阵,顾åæ€ä¹‰ï¼Œå¯ä»¥å‘相邻的熔炉æ供所需的充足热æºã€‚直接在一个原版熔炉æ—边铺设下该法阵(å¯ä»¥ä¸Žå¤šä¸ªç†”炉相邻),åªè¦ç†”炉å¯ä»¥å®Œæˆä¸€æ¬¡çƒ§åˆ¶ï¼Œæ³•é˜µä¾¿ä¼šä¾›ç»™ç‡ƒæ–™â€”—如果相邻的熔炉是空的,或者已ç»å¡«æ»¡ï¼Œåˆ™ä»€ä¹ˆéƒ½ä¸ä¼šå‘生,/cut这也是为了ä¿æŠ¤ä½ ã€‚\n\t但是,这也ä¸æ˜¯å‡­ç©ºèƒ½åŠžåˆ°çš„:如果有人在附近(åæ ¼åŠå¾„之内),消耗1点生命值(åŠé¢—心)æ‰èƒ½ç»´æŒç†”炉中两个物å“的冶炼。这对åšç‚¹ä¸œè¥¿åž«åž«è‚šå­æˆ–者冶炼一堆矿石很有帮助,但ä¸å¹¸çš„是你还没有办法在法阵上设置什么ä¿æŠ¤æŽªæ–½â€¦â€¦ -guide.bloodmagic.entry.alchemy.teleport.info=法阵:传é€ï¼Œé¡¾åæ€ä¹‰å¯ä»¥ç”¨æ¥åœ¨ä¸¤ä¸ªåœ°ç‚¹é—´çž¬é—´ç§»åŠ¨ï¼Œä½†æœ‰è‹¥å¹²é™åˆ¶ã€‚当玩家或其他实体走进法阵åŽï¼Œæ³•é˜µä¼šæ²¿ç€å®ƒçš„æœå‘æœç´¢è‡³å¤š 20 æ–¹å—çš„è·ç¦»ï¼Œåœ¨å…¶ä¸­å¯»æ‰¾å¦ä¸€ä¸ªç‚¼é‡‘法阵,类型ä¸é™ï¼Œä¹Ÿä¸éœ€è¦æ¿€æ´»ã€‚若找到了å¦ä¸€ä¸ªæ³•é˜µï¼Œåˆ™å°†è¿›å…¥æ³•é˜µçš„实体传é€åˆ°æ³•é˜µé‚£è¾¹åŽ»ï¼Œè¿™ä¸ªè¿‡ç¨‹ç”šè‡³å¯ä»¥æ— è§†ä¸­é—´çš„墙å£ã€‚\n\t进一步的研究表明,这个法阵还有å¦ä¸€ä¸ªé™åˆ¶ï¼šæœ‰é‰´äºŽæ‰­æ›²/cut时空的本质,这个法阵ä¸ä¼šä¼ é€é‚£äº›åˆšä¼ é€å®Œä¸¤ç§’é’Ÿä¸åˆ°çš„物体。这样一æ¥ï¼Œè¿™äº›ç‰©ä½“就有时间æ¥é‡æ–°å¯¹è‡ªèº«è¿›è¡Œè°ƒæ•´ã€‚ -guide.bloodmagic.entry.alchemy.standardTurret.info=把尖é”物体弹射到远处的怪物上的力é‡å®žåœ¨æ˜¯ä¸èƒ½æ›´å¥½ç”¨äº†ã€‚法阵:标准炮塔å¯ä»¥æ„ŸçŸ¥é™„近的敌对生物的存在,并利用å¤æ‚的炼金术å‘其他敌对生物开ç«ã€‚\n\t法阵首先在其正下方æœç´¢ç‰©å“容器。若在容器中找到了箭头,或者带è¯æ°´çš„箭头,它就会将其å¸å‡ºï¼Œå¹¶ä½¿ç”¨å®ƒæœ 32 格范围内的生物开ç«ã€‚\n\t/cut(因为 Minecraft 奇葩的物ç†å­¦ï¼Œç®­å¤´è‹¥ç”ŸæˆäºŽç¦»ç”Ÿç‰©å¾ˆè¿‘的地方就会被弹开,所以炮塔åªä¼šæœè‡³å°‘三格开外的敌对生物开ç«ã€‚时刻留æ„这一点ï¼ï¼‰ -guide.bloodmagic.entry.alchemy.laputa.info=有个关于æŸå¤±è½çš„王国的传说,这个王国的居民拥有在云中自由穿梭的魔法。虽然关于这个王国的一切现在都已ä¸å¾—而知,æ绘了他们漂浮在空中的城堡的画å·å´æ供了所有让这魔法æˆä¸ºçŽ°å®žçš„细节。\n\t拉普达碎片(法阵)å¯ä»¥å°†åœ°é¢ä¸Šçš„生命æºè´¨æ°”化,这ç§æ°”化的生命æºè´¨å¯ä»¥å°†å‘¨å›´çš„大地举起æ¥ã€‚尽管原ç†å分简å•ï¼Œä½†å¤§åœ°ä¸­ç”Ÿå‘½æºè´¨çš„差异会/cutç¨å¾®å½±å“到举起的大地的范围。这个法阵能将以法阵中心为çƒå¿ƒï¼ŒåŠå¾„四到八格的çƒçŠ¶åŒºåŸŸå†…çš„æ–¹å—,举高到两å€äºŽåŠå¾„多éšæœºä¸€åˆ°äº”格的高度。\n\t需è¦æ³¨æ„的是,法阵生效时,所有å¯åŠ¨æ³•é˜µæ‰€ç”¨çš„物å“都会被消耗。 diff --git a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang b/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang deleted file mode 100644 index fd3a40d4..00000000 --- a/src/main/resources/assets/bloodmagicguide/lang/zh_TW.lang +++ /dev/null @@ -1,258 +0,0 @@ -# Book Information -guide.bloodmagic.title=血染知書 -guide.bloodmagic.display=血染知書 -guide.bloodmagic.author=血魔法 -guide.bloodmagic.welcome=血魔法 - -# Page Information -guide.bloodmagic.page.bloodAltar=血之祭壇åˆæˆ -guide.bloodmagic.page.soulForge=ç„ç«ç†”çˆåˆæˆ -guide.bloodmagic.page.tier=層級:%d -guide.bloodmagic.page.lp=LP: %d -guide.bloodmagic.page.minimumWill=啟動所需æ„志:%f -guide.bloodmagic.page.drainedWill=åˆæˆæ¶ˆè€—æ„志:%f -guide.bloodmagic.shapelessOrb=ç„¡åºå¯¶ç åˆæˆ -guide.bloodmagic.shapedOrb=有åºå¯¶ç åˆæˆ -guide.bloodmagic.page.alchemyArray=煉金法陣 - - -# Categories -guide.bloodmagic.category.architect=締造者 -guide.bloodmagic.category.ritual=å„€å¼å¤§å¸« -guide.bloodmagic.category.demon=惡魔使者 -guide.bloodmagic.category.spell=戰法師 -guide.bloodmagic.category.alchemy=煉金術士 - -# Ritual Master Entries -guide.bloodmagic.entry.ritual.intro=åº -guide.bloodmagic.entry.ritual.basics=å„€å¼å…¥é–€ -guide.bloodmagic.entry.ritual.ritualStone=å„€å¼çŸ³ -guide.bloodmagic.entry.ritual.masterRitualStone=主儀å¼çŸ³ -guide.bloodmagic.entry.ritual.activationCrystal=驅動水晶 -guide.bloodmagic.entry.ritual.diviner=å„€å¼æŽ¨æ¸¬æ– -guide.bloodmagic.entry.ritual.fullSpring=æ¹§æ³‰å„€å¼ -guide.bloodmagic.entry.ritual.lava=下界夜曲 -guide.bloodmagic.entry.ritual.greenGrove=綠å¢å„€å¼ -guide.bloodmagic.entry.ritual.magnetism=ç£åŠ›å„€å¼ -guide.bloodmagic.entry.ritual.crusher=æŒ–æŽ˜å„€å¼ -guide.bloodmagic.entry.ritual.highJump=é«˜è·³å„€å¼ -guide.bloodmagic.entry.ritual.speed=é€Ÿç§»å„€å¼ -guide.bloodmagic.entry.ritual.wellOfSuffering=苦難之井 -guide.bloodmagic.entry.ritual.featheredKnife=ç¾½åˆ€å„€å¼ -guide.bloodmagic.entry.ritual.regen=é‡ç”Ÿå„€å¼ -guide.bloodmagic.entry.ritual.harvest=滿月收割 -guide.bloodmagic.entry.ritual.interdiction=ç¦æ­¢å„€å¼ -guide.bloodmagic.entry.ritual.containment=ç‰½åˆ¶å„€å¼ -guide.bloodmagic.entry.ritual.suppression=æŠ‘æ¶²å„€å¼ -guide.bloodmagic.entry.ritual.expulsion=é©…é€æ°›å ´ -guide.bloodmagic.entry.ritual.zephyr=和風之喚 -guide.bloodmagic.entry.ritual.laying=é‹ªè¨­å„€å¼ -guide.bloodmagic.entry.ritual.timberman=ä¼æž—å„€å¼ -guide.bloodmagic.entry.ritual.meteor=å¢œæ˜Ÿæ¨™ä½ -guide.bloodmagic.entry.ritual.downgrade=沉é‡éˆé­‚的懺悔 - -# Ritual Master Entry Text -guide.bloodmagic.entry.ritual.intro.info=晚上好,我就是馬格斯·阿爾å¡ç´ã€‚在外人看來我有很多身份:盜賊ã€è‡ªè­¦åœ˜ã€å·«å¸«ã€æˆ°å£«ã€åŸéŠè©©äººã€ç”šè‡³æ”¿æ²»å®¶ã€‚而ç¾åœ¨ï¼Œåªæœ‰å°‘數人清楚地知é“我的頭銜——åªéœ€æåŠä¸€ä¸‹ï¼Œé‚£è‡†æƒ³ä¸­çš„殘暴圖景就å¯ä»¥ä»¤äººèžé¢¨å–ªè†½â€”—縱使這個說法有一åŠæ˜¯èª¤å°Žï¼Œä½†é€™å€‹èªªæ³•æœ‰ä¸€åŠçš„確是真相。誠然,我說的便是作為è·æ¥­å­˜åœ¨çš„血術士。我的朋å‹ä¸€èˆ¬éƒ½ç›´å‘¼æˆ‘çš„å,而我的敵人一般稱我為儀å¼å¤§å¸«ã€‚\n\t/cutç¾åœ¨å‘¢ï¼Œæˆ‘的學生們,為了讓我把畢生所學傳播給下一代有志者們,çºåœ¨æˆ‘身邊已有數月了。我一直在堅守秘密,但æ比略å°æ­¤çš„評論更為精闢:「儘管你自己還看ä¸åˆ°ä½ è‡ªå·±çš„潛力,但ä¸è«–是在什麼魔法領域中,那些已臻化境的大師們的故事總是å°ä¸‹ä¸€ä»£äººæœ‰å¥½è™•çš„。然而,é‡ç¾å¥‡è·¡çš„細節其實並沒有那麼é‡è¦ã€‚若是沒有å°é­”法能é‡çš„絕å°è‡ªä¿¡ï¼Œå³ä¾¿æ˜¯é‡‘沙,也ä¸éŽæ˜¯ä¸€å †ç¡«ç£ºç²‰è€Œå·²ã€‚ã€ç•¶ç„¶ä½ å¯ä»¥èªç‚º/cut他已經觸碰到了煉金術的真諦,但他畢竟是我的第一個學生,我有時候也會èªçœŸæ€è€ƒä»–的想法。\n\t所以呢,那些ä»åœ¨è‹¦è‹¦å°‹æ‰¾å‰é€²çš„é“路的年輕血術士們,且è½æˆ‘一言:血魔法的領域之廣闊ä¸æ˜¯å¸¸äººå¯ä»¥ç†è§£çš„,若ä¸åŠ æ€è€ƒåœ°å‰é€²ï¼Œå¾ˆå¿«ä½ å°±æœƒé‡åˆ°ç“¶é ¸ã€‚因此,請務必時常翻閱這本書——這本書上有我的魔法,åªè¦æˆ‘寫下來新的內容,你們就能立刻看到。\n\t/cut諸ä½è«‹å。ä¸è¦ç·Šå¼µï¼Œè©¦è‘—去感å—è€ä¸€è¼©è¡€è¡“士的教誨。或許會比你討價還價求到的æ±è¥¿é‚„è¦æœ‰ç”¨ã€‚ -guide.bloodmagic.entry.ritual.basics.info=ç¾åœ¨çš„魔法儀å¼å·²ç¶“和幾百年å‰å¤§ä¸ä¸€æ¨£äº†ã€‚曾幾何時,人們用粉末在地上組æˆé­”法陣,並在æ—邊起舞,直到ç²å¾—想è¦çš„æ±è¥¿ã€‚我甚至記得有一ä½å¾žå¥¹è‡ªå®¶èŠ±åœ’中收集魔法能é‡çš„隱士。我一直都在嘲笑這種魔法,直到她把她的貓頭鷹丟éŽä¾†ç›£è¦–我。\n\t而血魔法師的儀å¼å‘¢ï¼Œéœ€è¦ç”¨åˆ°ä¸€ç¨®å¸¶ç‰¹æ®Šæ¨™è¨˜çš„石頭,並且需è¦æŒ‰æŒ‡å®šæ–¹å¼ç²¾ç¢ºæ“ºæ”¾ï¼Œæ–¹èƒ½è½‰åŒ–注入的能é‡ã€‚有一/cut天,我的學徒æ比略在他的新房間裡翻找我éŽåŽ»çš„å„€å¼è³‡æ–™ã€‚那裡有一ç½å¾žæœªé–‹å°éŽçš„液態Etherium(我好åƒèªªéŽå¾ˆå¤šæ¬¡è¦æŠŠå®ƒå–回來但æ¯æ¬¡èªªå®Œå°±å¿˜äº†ï¼‰ï¼Œä»¥åŠä¸€å€‹é€éŽé¡ç‰‡çœ‹æ™‚總åƒæ˜¯åœ¨èªªã€Œæ˜ŸæœŸäºŒã€çš„水晶çƒã€‚當有一個標有「符文塵埃ã€çš„ç®±å­è¢«æ‰“翻後,一顆å°å°çš„紅色寶石滾了出來,滾到了æ比略的腳下。霎那間,它發出的明亮的紅寶石的光芒和他抱著的箱å­è£¡çš„粉末發生了å應。\n\t/cut——自然地,瞬間爆炸。æ比略ä¸å°å¿ƒé‡‹æ”¾å‡ºçš„沒有èšç„¦çš„能é‡é©…動了符文塵埃和周åœçš„å„€å¼çŸ³ï¼Œåœ¨æ²’有容ç´èƒ½é‡çš„è£ç½®çš„情æ³ä¸‹ï¼Œå®ƒå€‘åªèƒ½å‘外擴散。在幾天的治療後,æ比略和我åˆé–‹å§‹äº†å·¥ä½œã€‚\n\t在經歷了數個ä¸çœ ä¹‹å¤œï¼Œå’Œé«˜æ•ˆçš„咖啡因的幫助下(啊,感è¬Player先生的咖啡,感è¬ä»–給我帶來的更加精神的明天ï¼ï¼‰ï¼Œæˆ‘們終於找出了所有儀å¼æ‰€éœ€çš„é—œéµæ料。\n\t/cut根據實驗,我們需è¦è‡³å°‘四種æ料:按照一定樣å¼æ“ºæ”¾çš„å„€å¼çŸ³ï¼›è‹¥å¹²ç¨®ä¸åŒçš„墨水,用於刻畫儀å¼ç´°ç¯€ï¼›ç½®æ–¼å„€å¼ä¸­å¤®çš„特殊儀å¼çŸ³ï¼Œç”¨æ–¼å‚³éžèƒ½é‡ï¼›ä»¥åŠç”¨æ–¼é©…å‹•å„€å¼çš„水晶。我覺得有必è¦å°‡å„個儀å¼å…¨éƒ¨è©³ç´°åœ°è§£èªªä¸€é。 -guide.bloodmagic.entry.ritual.ritualStone.info.1=å„€å¼çŸ³ä¾¿æ˜¯é­”法能é‡çš„容器:根據石頭的ä¸åŒï¼Œå¯å°‡èƒ½é‡å¡‘造為å„種形狀,或導å‘ä¸åŒçš„地方。儀å¼çŸ³åˆ†äº”種:空白(沒有任何銘文)ã€æ°´ã€ç«ã€é¢¨å’ŒåœŸã€‚æ¯å€‹å„€å¼éƒ½æœƒç”¨åˆ°è‹¥å¹¹ä¸åŒç¨®é¡žçš„å„€å¼çŸ³ï¼Œæ¯å€‹å„€å¼æ‰€éœ€çš„佈局也ä¸ç›¡ç›¸åŒã€‚ -guide.bloodmagic.entry.ritual.ritualStone.info.2=為儀å¼çŸ³ç•«ä¸Šæ­£ç¢ºçš„銘文需è¦ä¸€äº›å·¥å…·ã€‚我早已研究出一種快速建造正確儀å¼çš„辦法,但如果有人想自己動手æ­å»ºçš„話還是å¯ä»¥ç”¨é€™äº›å·¥å…·çš„。手æŒåˆé©çš„工具å³æ“Šå„€å¼çŸ³ä¾¿å¯ç‚ºå…¶ç•«ä¸ŠéŠ˜æ–‡ã€‚一開始你åªèƒ½è£½ä½œå‡ºå…¶ä¸­å››ç¨®å·¥å…·ï¼Œéš¨è‘—修行的深入你會得到更高級的工具的製作方法的。 -guide.bloodmagic.entry.ritual.masterRitualStone.info=和大部分魔法一樣,儀å¼éœ€è¦å¼•å°Žï¼Œå¦å‰‡å…¶åŠ›é‡æœƒè®Šå¾—無法控制,或者儀å¼æœ¬èº«æœƒå¾¹åº•å¤±æ•ˆã€‚有鑒於此,儀å¼éœ€è¦ç”±ä¸»å„€å¼çŸ³æŽ§åˆ¶ï¼ˆæˆ‘的筆記中通常會以縮寫"MRS"表記,但也åªèƒ½é€™æ¨£å¯«å¯«è€Œå·²ã€‚試想:你喊一è²ã€Œéº»ç…©ä¸€ä¸‹ï¼Œæˆ‘需è¦æ›´å¤šçš„MRSã€...然後尷尬症就犯了。)主儀å¼çŸ³æœƒå¾žå…¶ä¸»äººçš„éˆé­‚網絡中抽å–能é‡ï¼Œä¸¦æ“´æ•£è‡³æ¯ä¸€å¡Šå„€å¼çŸ³ä¸Šï¼Œå¾žè€Œå•Ÿå‹•å„€å¼ã€‚\n\t把éˆé­‚網絡和一塊大石頭ç¶ä¸€å¡Šæœ‰é»žéº»ç…©ã€‚我曾經æˆåŠŸ/cutéŽä¸€æ¬¡ï¼šåœ¨ä¸»å„€å¼çŸ³é ‚上盤腿打å,將能é‡èšé›†æ–¼çŸ³é ­ä¸Šä¸¦ç›¡åŠ›å°‡éˆé­‚網絡和儀å¼é€£åœ¨ä¸€èµ·ã€‚雖說æˆåŠŸæŒçºŒäº†å¹¾åˆ†é˜ï¼Œä½†æˆ‘的褲å­å»å› ç‚ºæ°´åœ¨å„€å¼çŸ³ä¸Šå†·å‡è€Œæ¿•é€äº†ã€‚於是我得到了一個教訓:ä¸è¦è©¦åœ–在實驗中進行任何冥想。 -guide.bloodmagic.entry.ritual.activationCrystal.info.1=於是我們åœæ­¢äº†å†¥æƒ³ï¼Œè½‰è€ŒåŽ»ç ”究那顆從箱å­è£¡æ»¾å‡ºçš„紅色寶石。æ比略確信它有「將我們所在的肉體世界和主宰éˆé­‚網絡的精神世界連接在一起ã€çš„能力。我一直在想到底è¦ä¸è¦æ”¶ä»–作學徒,但我的確能看出他å°æ–¼é‚£äº›æ™¦æ¾€é›£æ‡‚的魔法的ç†è§£ã€‚啊,我想我有必è¦ç¿»è­¯ä¸€ä¸‹ï¼Œä»–想表é”的是:我們å¯ä»¥ç”¨é€™æ°´æ™¶å°‡éˆé­‚網絡和主儀å¼çŸ³é€£åœ¨ä¸€èµ·ï¼Œä»¥çµ¦å„€å¼æ供能é‡ã€‚ -guide.bloodmagic.entry.ritual.activationCrystal.info.2=於是我們得到了虛弱驅動水晶,以åŠè¤‡è£½å®ƒçš„辦法。它的原料是å¦ä¸€ç¨®å¯ä»¥èˆ‡éˆé­‚網絡éˆæŽ¥çš„水晶:熔岩水晶。åªéœ€è¦è¿…速在上é¢åˆ»å¥½å¿…須的圖案,血之祭壇就å¯ä»¥å°‡å®ƒè®Šæˆé©…動水晶。自然地,它也需è¦å’Œä½¿ç”¨è€…çš„éˆé­‚網絡ç¶å®šã€‚在儀å¼æ­£ç¢ºæ“ºæ”¾å¾Œï¼Œåªéœ€æ‰‹æŒç†”岩水晶å³æ“Šä¸»å„€å¼çŸ³å°±å¯ä»¥é–‹å§‹äº†ã€‚當然,這需è¦æœ‰è¶³å¤ å¤šçš„LP作為支æ’。如果沒有足夠多的LP,儀å¼ä¸æœƒç™¼å‹•ï¼Œä¹Ÿä¸æœƒå› æ­¤æ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.diviner.info.1=在ä¸æ–·ç™¼ç¾æ–°çš„å„€å¼éŽç¨‹ä¸­ï¼Œæˆ‘愈發感到建造儀å¼çš„枯燥。這也是為什麼我製作出這樣一個工具的原因——這樣所有人都å¯ä»¥é€šéŽç°¡å–®çš„手勢和動作來快速部署儀å¼äº†ã€‚按時間順åºä¾†èªªé€™å€‹æ‡‰è©²æ”¾åœ¨è«¸å„€å¼çš„後é¢ä¾†è¬›ï¼Œä½†æˆ‘決定æ到å‰é¢ï¼Œå› ç‚ºæˆ‘覺得先學習這個的使用會更好。沒人會想在臨陣時æ‰ç™¼ç¾å„€å¼çŸ³æ²’帶夠,抑或原本åªæ˜¯æƒ³è®Šå‡ºä¸€ç“¶æ°´çµæžœå»å¬å–šäº†éš•çŸ³å§ã€‚ -guide.bloodmagic.entry.ritual.diviner.info.2=å„€å¼æŽ¨æ¸¬æ–的本質是本儀å¼çš„百科全書。你å¯ä»¥é€šéŽä¸€äº›æ“作(按ä½Shift左擊或å³æ“Šï¼‰ä¾†åœ¨ä¸åŒå„€å¼é–“切æ›ï¼Œä»”細看的話你還會得知一些基礎信æ¯ã€‚在你帶著儀å¼çŸ³çš„時候,手æŒæŽ¨æ¸¬æ–å³æ“Šä¸»å„€å¼çŸ³ï¼Œä¾¿å¯åœ¨æ­£ç¢ºä½ç½®æ”¾ç½®ä¸€å¡Šå„€å¼çŸ³ã€‚åªéœ€è¦ä¸æ–·å³æ“Šå°±å¯ä»¥å®Œæˆå„€å¼äº†ï¼ -guide.bloodmagic.entry.ritual.fullSpring.info=幾年å‰ï¼Œæœ‰ä¸€å€‹æ—…行商人路éŽæˆ‘附近的一個æ‘å­ï¼Œä¸¦å‘眾人兜售他的å„種å°æ±è¥¿ã€‚那個æ‘å­å¤§æ¦‚有很長時間沒下雨了,莊稼也快旱死了,商人見此便æŽå‡ºäº†ä¸€å€‹é‘²æœ‰è—色寶石的銀製護符。「看這個ï¼ã€ï¼Œä»–çš„è²éŸ³ä¸­å¸¶è‘—幾分激動,「這個æ±è¥¿å¯ä»¥è®“æ²³æµæ°¸ä¸ä¹¾æ¶¸ï¼æˆ‘å¯ä»¥ç”¨ç…‰é‡‘術從空氣中變出水ï¼ã€\n\t然而æ‘民們覺得那寶石好åƒåªæ˜¯æ™®é€šçš„è—寶石而已。等他們å應éŽä¾†ä¸Šç•¶å—騙時那/cut個商人已經消失得無影無蹤了。我起åˆä¸¦ä¸æ‰“算干涉此事——因為他們似乎並ä¸å–œæ­¡æˆ‘的魔法——但這次我破了個例。在和「煉金術士ã€é€²è¡Œäº†æ„‰å¿«çš„交æµå¾Œï¼Œæˆ‘在çŒæº‰æ¸ æ—打å了數å°æ™‚。我æˆåŠŸé€šéŽå†·å»ç©ºæ°£ä¸­æ°´è’¸æ°£çš„辦法給莊稼們帶來了足夠多的水——足夠æ’到下一個旱季。自然這個方法並ä¸é è­œï¼Œå› ç‚ºæˆ‘自己已經被打å給æ¾ä¹¾äº†ï¼Œä¸å¾—ä¸é è‡ªå·±é€ å‡ºä¾†çš„水來é‡æ–°èª¿æ•´ã€‚\n\t/cut我å†æ¬¡æƒ³èµ·äº†é€™å€‹äº‹ï¼Œä¸¦æŒ‰ç…§åŒæ¨£çš„方法製作了湧泉儀å¼ã€‚給儀å¼çŒæ³¨å°‘é‡èƒ½é‡ï¼Œå„€å¼ä¾¿å¯å°‡é™„近空氣中的水分èšé›†èµ·ä¾†ï¼Œä¸¦åœ¨ä¸»å„€å¼çŸ³ä¸Šæ–¹ç”¢ç”Ÿä¸€å€‹æ°´æºã€‚é©…å‹•å„€å¼éœ€è¦çš„能é‡ä¸¦ä¸å¤šï¼Œç¶­æŒå…¶é‹è½‰çš„能é‡æ›´æ˜¯å¯ä»¥å¿½ç•¥ä¸è¨ˆã€‚\n\t水的範åœå’Œæ”¾ç½®çš„ä½ç½®éƒ½æ˜¯å¯ä»¥ç”¨å„€å¼èª¿æ•´é‰—調整的,所以那些å°ç¾Žè§€è¡¨ç¤ºæ“”憂的魔法師們ä¸è¦æ“”心了。這便是魔法的力é‡ï¼ -guide.bloodmagic.entry.ritual.lava.info=熔岩——æ怕是最普通的能é‡ä¾†æºäº†å§ã€‚我平日的研究中很少使用熔岩,因為它其實並éžæ˜¯æ™®é€šçš„éµæ¡¶å°±èƒ½è£èµ·ä¾†çš„æ±è¥¿ï¼\n\t有一天,當地的一åéµåŒ æ‰¾åˆ°æˆ‘,並å‘我打è½é™„近的能é‡æºçš„事情。他說他們最近新造了一個大傢伙,需è¦å¤§é‡èƒ½é‡ä¾†é‹è½‰ã€‚我回答é“,「有倒是有,但它們並éžç„¡ä¸»ä¹‹ç‰©ã€‚ã€æˆ‘決定去親眼看一下這個所謂的大傢伙到底是何方神è–。\n\t/cut那是...一個至少五公尺(5米)見方的冶煉çˆï¼Œä¸Šé¢é‚„連著幾個空空如也的儲ç½ã€‚雖然我ä¸çŸ¥é“這玩æ„兒到底是怎麼工作的,但我的直覺告訴我,熔岩的熱é‡ç”¨åœ¨é€™è£¡æ­£åˆé©â€”—電力是絕å°ä¸è¡Œçš„,絕å°ä¸è¡Œã€‚除此之外,我åªçŸ¥é“這ä¸æ˜¯æ²‰æµ¸å·¥æ¥­å…¬å¸çš„產å“。\n\t在經éŽçŸ­æš«çš„討價還價後,éµåŒ ä»˜äº†ä¸€ç­†è²»ç”¨ï¼Œæˆ‘便開始å«ä»–們ç¨å¾®è®“開一下,以便準備æ­å»ºå„€å¼ã€‚按我的想法,我將/cut四塊ç«ä¹‹å„€å¼çŸ³å’Œä¸»å„€å¼çŸ³æ“ºæˆå字,腦海中ä¸æ–·æƒ³åƒæ•´å€‹éŽç¨‹çš„åŒæ™‚,我用力將驅動水晶推å‘了主儀å¼çŸ³ã€‚ç†è«–上這個éŽç¨‹æ‡‰è©²å分簡單:儀å¼ä¸æ–·åœ°å°‡å¤§åœ°æ·±è™•çš„石頭挖出來,在巨大的壓力下熔èžæˆç†”岩。這樣製æˆçš„熔岩å¯ä»¥ç›´æŽ¥å¾žå„€å¼çŸ³ä¸­æå–出來,然後儀å¼æœ¬èº«é‚„å¯ä»¥è‡ªç¶­æŒé€™ç¨®é¡žä¼¼æ“ å£“çš„éŽç¨‹ã€‚\n\t然而這åªæ˜¯ç†è«–。說起來容易åšèµ·ä¾†é›£ï¼šç•¶æ™‚我使用的簡/cut易網絡完全ä¸é©åˆæ‹¿ä¾†ç‚ºé€™å€‹å„€å¼ä¾›æ‡‰é­”力,ä¸åƒ…擠壓熔岩需è¦çš„壓力巨大(需è¦20000LPå•Ÿå‹•å„€å¼ï¼‰ï¼ŒæŠ½å–熔岩的開支也ä¸å°ï¼ˆæ¯ç”¢ç”Ÿä¸€æ ¼ç†”岩需è¦500LP)。\n\t我æ–æ–晃晃地走出了éµåŒ å€‘的基地,臉上帶著一絲欣慰。那些儲ç½è£¡çš„熔岩足夠éµåŒ å€‘用到他們找到新的岩漿來æºäº†ã€‚當然,我也沒忘記帶走我的儀å¼çŸ³ã€‚\n\t---------------\n\t/cut在沒有外力影響下,這個儀å¼æœƒä¸æ–·å˜—試在主儀å¼çŸ³ä¸Šæ–¹ç”Ÿæˆä¸€æ ¼ç†”岩,並消耗500LP。一般情æ³ä¸‹ï¼Œç†”岩生æˆçš„範åœå¯ä»¥æ“´å±•åˆ°å„€å¼æœ¬èº«ä¸‰æ ¼é–‹å¤–。\n\t在原生æ„志的影響下,LP消耗和大氣中æ„志的濃度æˆå比,åŒæ™‚會ä¸æ–·æ¶ˆè€—æ„志,æ„志的消耗速度與節約的LP數é‡æˆæ­£æ¯”。使用原生æ„å¿—é‚„å¯ä»¥è®“å„€å¼è‡ªå‹•å°‡ç†”岩放置進å„å¼æ¶²é«”容器中,速度大抵ä¿æŒä¸è®Šã€‚\n\t/cutè…è•æ„志會å轉ç«ç„°å…疫的效果。æ›è¨€ä¹‹ï¼Œé‚£äº›å¹³æ™‚å°ç«ç„°å…疫的生物,在這個儀å¼çš„影響下會失去ç«ç„°å…疫的屬性;而那些無法抵抗ç«ç„°çš„生物則會å°ç«ç„°å…疫。\n\t復仇æ„志會令此儀å¼é‡‹æ”¾å‡ºä¸€ç¨®æ®ç™¼æ€§æ°£é«”,這種氣體會影響任何ä¸æ˜¯çŽ©å®¶çš„生物。在這種氣體的作用範åœå…§çš„生物都會ç²å¾—「緩燃引線ã€çš„效果。當這個效果的倒計時歸零時,這個生物會爆炸,強行將生物趕回空氣當中。\n\t/cut破壞æ„å¿—å¯ä»¥å¼·åŒ–這個儀å¼çš„å„種屬性。大氣中這種æ„å¿—çš„å«é‡è¶Šå¤šï¼Œå„€å¼èƒ½æ”¾ç½®çš„岩漿æºæ•¸é‡ä¹Ÿå°±è¶Šå¤šã€‚更喜人的是這個儀å¼ä¸¦ä¸æœƒæ¶ˆè€—破壞æ„志。然而,當大氣中的æ„志數é‡ä¸‹é™ï¼Œè€Œä¸”å„€å¼çš„最大範åœå°æ–¼ä½ è¨­å®šçš„範åœæ™‚,儀å¼å°±æœƒåœæ­¢å·¥ä½œï¼Œå¿…須進行手動修復。\n\t最後,堅毅æ„志會令儀å¼ç¯„åœå…§çš„玩家ç²å¾—ç«ç„°æŠ—性,時效和空氣中æ„志的濃度æˆæ­£æ¯”。å¦å¤–有一點è¦æ³¨æ„,è…è•æ„/cutå¿—çš„å轉效果會抵消掉堅毅æ„志所帶來的ç«ç„°æŠ—性。 -guide.bloodmagic.entry.ritual.greenGrove.info=上星期我開始為æ比略講授跨領域的魔法。除了血之魔法外,我的æ¯å€‹å­¸å¾’都學éŽä¸€äº›å…¶å®ƒå½¢å¼çš„魔法。其實,學什麼魔法都沒有關係,åªè¦å®ƒä¸æµªè²»è³‡æºå°±å¥½â€”—我曾經使用éŽä¾†è‡ªé™é çš„æ±æ–¹çš„Ars部è½çš„魔法,但是因為Etherium之æºå¹¾ä¹Žè¢«æ¾ä¹¾äº†ï¼Œæ‰€ä»¥é€™å€‹è¨ˆåŠƒä¹Ÿå°±å¤­æŠ˜äº†ã€‚\n\tæ比略決定學習秘術學,一門利用世界本身的魔法來創造屬於自己的魔法的魔法。它/cut正好和血之魔法相抗衡——後者使用的是生命本身具有的魔法。為了解釋清楚,我決定用作物生長為例å­ï¼Œå±•ç¤ºå…©é–€é­”法之間的差別。\n\t「在秘術學中,魔法師會使用以Herbaæºè³ªç…‰æˆçš„生長催化劑,ã€æˆ‘一邊這樣說著,一邊指著教室牆上掛著的一幅æºè³ªåˆæˆåœ–;誠然這節課其實åªæœ‰æ比略一個學生,但人總還是需è¦é»žæ¨‚趣的,「一å°è‚¡éˆæ°£å’Œæºè³ªæ··åˆåœ¨ä¸€èµ·å¯ä»¥åˆºæ¿€æ¤ç‰©çš„/cutå…‰åˆä½œç”¨ï¼Œå¾žè€Œä»¤æ¤ç‰©å¸æ”¶æ›´å¤šçš„光能,以此加速其生長。然而,這需è¦ä¿è­‰ä½œç‰©ç”Ÿé•·åœ¨è‚¥æ²ƒçš„土地上,å¦å‰‡ä½œç‰©æœ€çµ‚åªèƒ½æž¯èŽæ­»äº¡ã€‚「\n\t然後我找來了土儀å¼çŸ³å’Œæ°´å„€å¼çŸ³å„四塊,擺出一個圓形,並在圓心處放置主儀å¼çŸ³ã€‚「血魔法與之正好相å,ã€æˆ‘一邊說著,一邊驅動了主儀å¼çŸ³ï¼Œä¸¦åœ¨ä¸Šé¢è“‹ä¸Šäº†ä¸€å±¤æ³¥åœŸã€‚「你å¯ä»¥ç”¨ä½ è‡ªå·±çš„生命力,或者別的動物的生命力,來加速作/cut物的生長,從而節約一般肥料的使用。本質上來講,這個儀å¼æœƒä¸æ–·çµ¦äºˆæ¤ç‰©é¤Šåˆ†ï¼Œå¾žè€Œä½¿å…¶é¤Šåˆ†ä¿æŒåœ¨ä¸€å€‹è¼ƒé«˜æ°´å¹³ã€‚ã€\n\t我å‘土中撒了幾粒種å­ï¼Œå°å¿ƒç¿¼ç¿¼åœ°ç”¨åœŸè“‹å¥½ï¼Œç„¶å¾Œå¾žè²¼èº«æ³•è¢ä¸­æŽå‡ºä¸€å€‹æ°´ç“¶ï¼Œæ‹”開瓶塞然後將水ç‘在了泥土上。「這個éŽç¨‹ä¸éœ€è¦é™½å…‰ï¼Œå› ç‚ºå®ƒç”¨åˆ°äº†å¦ä¸€ç¨®å½¢å¼çš„能é‡ã€‚儘管如此,陽光還是很有用的——畢竟作物一開始ä¸æ˜¯é€™æ¨£ç”Ÿ/cut長的嘛ï¼ã€\n\t在我解釋的時候,有幾點綠色的æ±è¥¿å°±å·²ç¶“冒出了土堆。æ¯æœ‰ä¸€ç‰‡æ–°è‘‰é•·å‡ºï¼Œæˆ‘都會感å—到一絲壓力,雖然ä¸å¤§ï¼Œä½†æœƒä¸æ–·ç©ç´¯ã€‚下課後,我開始清ç†å¯¦é©—用的土堆,然後決定去æ‘å­è£¡èµ°ä¸€åœˆï¼šæˆ‘ç¾åœ¨æœ‰å¹¾æ–—å°éº¥è¦è³£ã€‚\n\t---------------\n\t綠å¢å„€å¼ï¼Œæ­£å¦‚å…¶å,以血術士之血為養料,加速儀å¼é™„近之æ¤ç‰©ï¼Œè«¸å¦‚å°éº¥ã€èƒ¡è˜¿è””之類,/cut的生長。默èªï¼Œå„€å¼åªåœ¨3x3範åœå…§å°‹æ‰¾åˆé©çš„目標,æ¯ç§’大概åªæœ‰30%%的概率æˆåŠŸå‚¬ç”Ÿã€‚用儀å¼èª¿æ•´é‰—調整後å¯å°‹æ‰¾5x5範åœå…§çš„至多81棵作物。\n\tå¦å¤–,惡魔æ„å¿—å°é€™å€‹å„€å¼ä¹Ÿæœ‰æ•ˆæžœã€‚原生æ„志會加快其工作速度,效果å–決於濃度,但æ¯æ¬¡å‚¬ç”Ÿæœƒå¤šæ¶ˆè€—0.05點æ„志。\n\t若輔以復仇æ„志,儀å¼ä¾èˆŠæœƒåœ¨æ¯æ¬¡å‚¬ç”Ÿæ™‚多消耗0.05點æ„志,但會增加催生æˆåŠŸçš„概率。/cut之å‰æ到默èªæ¦‚率是30%%,但若是你有100點復仇æ„志,這個概率會上å‡è‡³80%%。\n\t破壞æ„å¿—å¯ä»¥æ高儀å¼çš„工作範åœï¼Œé€™æ„味著你的一個儀å¼å¯ä»¥è¦†è“‹åˆ°æ›´å¤šçš„作物上。而且這個儀å¼ä¸æœƒæ¶ˆè€—破壞æ„å¿—ï¼ç„¶è€Œï¼Œè‹¥æ˜¯æ„志的濃度下é™ï¼Œè€Œä½ è¨­å®šçš„範åœæ¯”å„€å¼æœ€å¤§çš„工作範åœé‚„大,那儀å¼å°±æœƒåœæ­¢å·¥ä½œï¼Œéœ€è¦æ‰‹å‹•ä¿®å¾©ã€‚\n\t/cut堅毅æ„志會讓儀å¼åœ¨å‚¬ç†Ÿä½œç‰©çš„åŒæ™‚ä¿è­‰è€•åœ°å·²ç¶“éŽç¿»æ•´ä¸”ä¿æŒæ¿•æ½¤ã€‚å¦å¤–,若是儀å¼çš„工作範åœå…§æœ‰æŽ‰åœ¨åœ°ä¸Šçš„種å­ï¼Œå …毅æ„志會讓儀å¼è‡ªå‹•ç”¨é‚£äº›ç¨®å­ä¾†è£œç¨®ã€‚自然地,這個效果會消耗æ„志,但消耗速度是固定的。\n\tè…è•æ„志的效果則完全å轉了這個儀å¼çš„工作原ç†â€”—æ¤ç‰©æœƒåœ¨é€™ç¨®æ„志的影響下轉而去主動å¸è¡€ï¼Œå°±åƒæ°´è›­é‚£æ¨£ã€‚具體來說:æ¯ä¸€åˆ»ï¼Œè‹¥æ¤ç‰©é™„/cut近若有怪物,那麼æ¤ç‰©å’Œæ€ªç‰©éƒ½æœƒå—到傷害,且兩者傷害æˆæ­£æ¯”。事實上直接用怪物當作æ¤ç‰©çš„養料是有效的ï¼å¦å¤–,æ¯å€‹æ€ªç‰©ä¸Šæ¯æœ‰10秒中的負é¢æ•ˆæžœï¼Œå°±æœƒæ¶ˆè€—0.2點è…è•æ„志。 -guide.bloodmagic.entry.ritual.magnetism.info=ç£åŠ›å„€å¼å¯è¬‚是採石場必備。這個儀å¼æœƒè£½é€ å‡ºä¸€æ—‹è½‰çš„ç£å ´ï¼Œå°‡æ·±åŸ‹åœ°ä¸‹çš„è±å¯Œç¤¦è—å¸åˆ°åœ°é¢ä¸Šã€‚這個儀å¼ä¸¦ä¸æœƒå¸èµ°çŸ³é ­ï¼Œæ‰€ä»¥åœ°é¢ä¸Šä¹Ÿä¸æœƒå› æ­¤å‡ºç¾å¤§æ´žï¼Œå‰æ是地下並éžå…¨æ˜¯ç¤¦çŸ³ã€‚這個儀å¼æ¯2秒就會試著å¸ä¸€å€‹ç¤¦çŸ³ï¼Œæ¯æˆåŠŸå¸å–一個礦石便消耗50LP。\n\t/cut默èªï¼Œé€™å€‹å„€å¼çš„工作範åœæ˜¯ä»¥ä¸»å„€å¼çŸ³ç‚ºä¸­å¿ƒçš„7x7正方形å€åŸŸï¼ˆå³åŠå¾‘為3)。目å‰ï¼Œæ„å¿—é‚„ä¸èƒ½å½±éŸ¿é€™å€‹å„€å¼çš„工作,所以你åªèƒ½é€šéŽåœ¨ä¸»å„€å¼çŸ³æ­£ä¸‹æ–¹æ”¾ç½®æŸç¨®åƒ¹å€¼é«˜æ˜‚的方塊來æ高其工作範åœã€‚一個éµå¡Šå¯ä»¥è®“åŠå¾‘增加到7。金塊則是增加到15。鑽石效果最好,å¯ä»¥å°‡å…¶å·¥ä½œç¯„åœæ‹“展為63x63,屆時你åªéœ€è¦çœ‹è‘—å„€å¼æ…¢æ‚ æ‚ åœ°æŠŠç¤¦çŸ³å¸åˆ°ä¸»å„€å¼çŸ³ä¸Šæ–¹3x3的空間裡就好了。 -guide.bloodmagic.entry.ritual.crusher.info=挖掘儀å¼çš„é‹è¡Œå分簡單:åªéœ€è¦å°‡ç®±å­ä¹‹é¡žçš„æ±è¥¿æ”¾åœ¨ä¸»å„€å¼çŸ³æ­£ä¸Šæ–¹ï¼Œå®ƒå°±å¯ä»¥æ¶ˆè€—LP並ä¸æ–·æŒ–掘主儀å¼çŸ³æ­£ä¸‹æ–¹3x3x3範åœå…§çš„方塊了。儀å¼æ¯2秒會嘗試挖掘,如果æˆåŠŸï¼Œæœƒæ¶ˆè€—7LP。挖下來的方塊會放進與儀å¼éˆæŽ¥çš„容器中,如果容器已滿,就會掉在那個容器的上é¢ã€‚\n\t若以原生æ„å¿—é©…å‹•å„€å¼ï¼Œå„€å¼å°‡æœƒå·¥ä½œå¾—更快,但æ¯æ¬¡æˆåŠŸæŒ–掘時都會多消耗0.05點原生æ„志。\n\t/cut破壞æ„志會令儀å¼åœ¨æŒ–掘方塊時æ“有時é‹çš„效果。目å‰ä¾†çœ‹ï¼Œä¸è«–æ供多少æ„志,時é‹çš„等級永é æ˜¯ä¸‰ï¼Œä¸¦ä¸”æ¯æ¬¡æˆåŠŸæŒ–掘都會多消耗0.2點此種æ„志。\n\t堅毅æ„志會令儀å¼åœ¨æŒ–掘方塊時æ“有精準採集的效果。æ¯æ¬¡æˆåŠŸæŒ–掘都會多消耗0.2點此種æ„志。\n\tè…è•æ„志會令儀å¼åœ¨æŒ–掘方塊時經éŽæŸç¨®æ¶²é«”的浸洗。/cut這種液體帶有粉碎的效果,æ›è¨€ä¹‹â€”—此時你挖掘的éµç¤¦æ™‚會變æˆå…©å †éµç ‚。目å‰é€™ç¨®æ¶²é«”å¯ä»¥æ˜¯åŸºç¤Žåˆ‡å‰Šæ²¹æˆ–爆炸ç«è—¥ã€‚根據所有液體的ä¸åŒï¼Œå„€å¼æ¶ˆè€—çš„æ„志數é‡ä¹Ÿä¸åŒã€‚這個效果會覆蓋精準採集的效果。\n\t/cut復仇æ„志的效果和壓擠å°è¨˜å·®ä¸å¤šï¼Œå³æœƒå£“縮挖下來的æ±è¥¿ã€‚舉例:箱å­è£¡ç¾åœ¨æœ‰65紅石,一次挖掘後會將其中9個紅石壓縮為一紅石塊,留下56ç´…/cut石。僅當壓縮æˆåŠŸæ™‚å„€å¼æ‰æœƒæ¶ˆè€—0.2點復仇æ„志。 -guide.bloodmagic.entry.ritual.highJump.info=這個儀å¼æœƒç”¨å¼·å¤§çš„æ°£æµå°‡èµ°åœ¨ä¸Šé¢çš„人é€ä¸Šå¤©ã€‚å¦å¤–,這個儀å¼é‚„會令摔下來的人å…å—掉è½å‚·å®³ã€‚潛行å³å¯è¦é¿å„€å¼çš„效果。\n\tæ¯æ¬¡æˆåŠŸç”¢ç”Ÿæ°£æµæ™‚,儀å¼éƒ½æœƒä»¥5LP/tick的速度消耗LP;若沒能產生氣æµï¼Œå‰‡ä¸æœƒæ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.speed.info=å„€å¼å¦‚å…¶å,速移儀å¼å¯ç”¨ä¾†åŠ é€Ÿç§»å‹•ã€‚å„€å¼æœ¬èº«å¯ä»¥æŒ‡å‘ä»»æ„æ–¹å‘,而在儀å¼çš„生效範åœå…§çš„實體都會æœå„€å¼æ‰€æŒ‡çš„æ–¹å‘加速。儀å¼çš„指å‘由那塊薄暮儀å¼çŸ³çš„ä½ç½®ç¢ºå®šã€‚默èªï¼Œå·¥ä½œç¯„åœæ˜¯åŠå¾‘二格見方,但å¯ä»¥ç”¨å„€å¼èª¿æ•´é‰—調整。水平方å‘上的速度加æˆæ˜¯3方塊/tick,垂直方å‘上則是1.2方塊/tick。\n\t以原生æ„志驅動的速移儀å¼æœƒä½¿ç”Ÿç‰©ç²å¾—更快的速度。/cut當周åœå……滿原生æ„志(å³100點)時,速度會翻一番。æ¯æ¬¡åŠ æˆéƒ½æœƒæ¶ˆè€—0.1點æ„志。\n\t復仇æ„志將會迫使儀å¼å°æˆå¹´å‹•ç‰©ç„¡æ•ˆï¼Œè€Œç ´å£žæ„志會迫使儀å¼å°å¹¼å¹´å‹•ç‰©ç„¡æ•ˆã€‚復仇和破壞æ„志都會令儀å¼å°çŽ©å®¶ç„¡æ•ˆã€‚è‹¥åŒæ™‚使用這兩種æ„志,則儀å¼åªæœƒå°çŽ©å®¶æœ‰æ•ˆã€‚這些特性å°æ–¼å‹•ç‰©è¾²å ´ï¼Œç”šè‡³æ˜¯éŽæ¿¾å°æ®­å±éƒ½æ˜¯å分有用的。儀å¼åªæœ‰åœ¨æˆåŠŸåŠ é€Ÿæ™‚消耗0.05點æ„志。æ›è¨€ä¹‹ï¼Œ/cutå°æ–¼å¹¼å¹´å‹•ç‰©ä¾†èªªï¼Œå„€å¼ä¸æœƒæ¶ˆè€—破壞æ„志,也ä¸æœƒæ¶ˆè€—LP——因為這時的儀å¼ä¸æœƒå°å¹¼å¹´å‹•ç‰©æœ‰æ•ˆã€‚ -guide.bloodmagic.entry.ritual.wellOfSuffering.info=å°æ–¼é‚£äº›ä¸æƒ³ç”¨è‡ªå·±çš„血來補充LP供應的血術士,苦難之井便是他們的é¸æ“‡ï¼šé€™å€‹å„€å¼æœƒå°‡æ–¹åœ“å格範åœå…§çš„éžçŽ©å®¶å¯¦é«”的生命èšé›†åˆ°è¡€ä¹‹ç¥­å£‡è£¡ã€‚苦難之井åªæœƒåœ¨ä¸Šä¸‹åæ ¼ã€æ°´å¹³æ–¹å‘上方圓五格的範åœå…§å°‹æ‰¾è¡€ä¹‹ç¥­å£‡ã€‚如果找ä¸å¥—祭壇,儀å¼ä¸æœƒå·¥ä½œã€‚å„€å¼æ¯æ¶ˆè€—1LP便å¯å¾žæ€ªç‰©ä¸ŠæŠ½å‡º25LP;若是é‡å°éžæ•µå°çš„生物,則å¯æŠ½å‡º100LP;具體數é‡æœƒå—到ç»ç¥­ç¬¦æ–‡çš„增幅的影響。 -guide.bloodmagic.entry.ritual.featheredKnife.info=羽刀儀å¼åƒæ˜¯ä¸€æŠŠç›´æ’使用者身上的刀,抽å–其血液,並為附近的血之祭壇補充能é‡ã€‚一般,羽刀儀å¼é¦–先會在以主儀å¼çŸ³ç‚ºä¸­å¿ƒçš„11x11x21的範åœå…§å°‹æ‰¾ä¸€åº§ç¥­å£‡â€”—若找ä¸åˆ°ç¥­å£‡ï¼Œå„€å¼ä¸æœƒå·¥ä½œï¼›æ‰¾åˆ°ç¥­å£‡å¾Œå„€å¼æœƒè¨˜ä¸‹é€™å€‹ç¥­å£‡çš„ä½ç½®ã€‚當有玩家進入儀å¼çš„範åœï¼ˆé»˜èªç‚º31x31x41)後,儀å¼æœƒæ¯ç§’å°çŽ©å®¶é€ æˆä¸€é»žå‚·å®³ï¼Œä¸¦å°‡å…¶è½‰åŒ–為LPé€å…¥ç¥­å£‡ä¸­ã€‚這個éŽç¨‹æœƒå—到血之符文的影響。傷害玩家的速度å¯/cut以調整。ä¸è¦æ“”心,這個儀å¼ä¹Ÿæœ‰å®‰å…¨ä¿è­·æ©Ÿåˆ¶ï¼šå®ƒä¸æœƒæ”»æ“Šé‚£äº›åªå‰©ä¸‹ç™¾åˆ†ä¹‹ä¸‰åä¸åˆ°çš„生命值的玩家。\n\t有數種惡魔æ„å¿—å¯ä»¥å½±éŸ¿é€™å€‹å„€å¼çš„工作。比如,原生æ„志——它å¯ä»¥æ高儀å¼çš„工作速度,準確地說是一秒攻擊玩家兩次。但æ¯æ¬¡æ”»æ“Šæ™‚會多消耗0.05點原生æ„志。\n\t若周åœçš„éˆåŸŸä¸­æœ‰è‡³å°‘å點堅毅æ„志,儀å¼æœƒå°‡å®‰å…¨é–¾å€¼/cut從百分之三åæ高到百分之七å。這層ä¿è­·ä¸æœƒå¤šæ¶ˆè€—æ„志。\n\t若周åœçš„éˆåŸŸä¸­æœ‰è‡³å°‘å點復仇æ„志,儀å¼æœƒé€æ­¥é™ä½Žå®‰å…¨é–¾å€¼è‡³ç™¾åˆ†ä¹‹å。若åŒæ™‚有至少å點堅毅æ„志,那麼後者的百分之七å的閾值將åªå°å„€å¼çš„主人有效果。和堅毅æ„志一樣,這個效果ä¸æœƒå¤šæ¶ˆè€—æ„志。\n\t/cut若儀å¼é™„è¿‘çš„éˆåŸŸä¸­æœ‰ç ´å£žæ„志,這個儀å¼çš„生命值轉LP的效率會有所æ高。轉化率的增幅與破壞æ„å¿—çš„å«é‡æˆæ­£æ¯”,最高為五分之一,å°æ‡‰100點破壞æ„志。這個效果å¯ä»¥èˆ‡ç¬¦æ–‡ã€æŸéˆè­·ç”²å‡ç´šå’Œç†é¦™ç–ŠåŠ ã€‚æ¯è½‰åŒ–一點HP,會多消耗0.05點破壞æ„志。\n\t說到ç†é¦™â€”—è…è•æ„志會令ç†é¦™çš„效果與此儀å¼ç–ŠåŠ ã€‚若你身上沒有「魂飛魄散ã€æ•ˆæžœï¼Œä¸¦ä¸”你正好處在ç†é¦™çš„效果/cut範åœå…§ï¼Œä½ çš„生命值會被直接扣至安全閾值,並將轉化出的LP一次性注入祭壇中,並給予你魂飛魄散的效果。此效果å¯èˆ‡ç ´å£žæ„志疊加。 -guide.bloodmagic.entry.ritual.regen.info=雖然ä»æœ‰çˆ­è­°ï¼Œä½†é€™é‡ç”Ÿå„€å¼å°æ–¼é‚£äº›æƒ³ç”¨è‡ªå·±çš„血來驅動魔法的血術士們來說,ä»ç„¶æ˜¯ä¸€å€‹ä¸éŒ¯çš„é¸æ“‡ï¼Œå› ç‚ºå®ƒæœƒåˆ©ç”¨è¡€è¡“士的魔法在儀å¼ç¯„åœå…§ç”¢ç”Ÿæ²»ç™‚光環的效果,藉由此治癒儀å¼ç¯„åœå…§çš„生物,包括血術士他們自己。儀å¼æ¯2.5秒會給15格範åœå…§çš„生物附加生命回復I的效果;å°æ–¼çŽ©å®¶ä¾†èªªå®ƒæœƒæ¶ˆè€—100LP,å°æ–¼å…¶å®ƒç”Ÿç‰©ä¾†èªªæ˜¯10LP。\n\t/cutè…è•æ„志會給儀å¼å†åŠ ä¸Šä¸€å€‹ã€Œå¸è¡€é¬¼ç¯„åœã€ã€‚此時,儀å¼æœƒå°æ‰€æœ‰éžçŽ©å®¶ç”Ÿç‰©éš¨æ©Ÿé€ æˆå‚·å®³ï¼Œä¸¦è—‰ç”±æ­¤æ²»ç™‚玩家。æ¯ä¸€å€‹å·¥ä½œçš„tick中它都會消耗0.04點è…è•æ„志並將1點生命值轉移到玩家身上。 -guide.bloodmagic.entry.ritual.harvest.info=這個儀å¼å¯ä»¥æ”¶ç©«é»˜èªä»¥å„€å¼çŸ³ä¸Šæ–¹9x9x5範åœå…§çš„所有作物,並將收穫到的種å­è£œç¨®å›žåŽ»ã€‚所有收穫到的物å“都會掉è½åœ¨åŽŸåœ°ã€‚å„€å¼å·¥ä½œé »çŽ‡ç‚º5tick嘗試一次,æ¯æ¬¡æˆåŠŸæ”¶ç©«éƒ½æœƒæ¶ˆè€—20LP。\n\tå¯ä»¥æ”¶ç©«çš„作物包括但ä¸é™æ–¼ï¼šå—ç“œã€å°éº¥ã€èƒ¡è˜¿è””ã€åœŸè±†ã€åœ°ç„ç–£ã€ä»™äººæŽŒã€ç”˜è”—等。時刻記ä½ï¼Œé€™å€‹å„€å¼ä¸¦ä¸æœƒå°å®ƒæ­£åœ¨æ”¶å‰²çš„作物作任何å‡è¨­â€”—åªè¦å®ƒè¢«èªç‚ºæ˜¯ä¸€/cut種å¯ä»¥æ”¶å‰²çš„作物,這個儀å¼å°±å¯ä»¥æ”¶å‰²ã€‚(譯註:更精確地說,是指有å°æ‡‰çš„HarvestHandler支æŒçš„作物。) -guide.bloodmagic.entry.ritual.interdiction.info=在傳說中的å¤ä»£ç…‰é‡‘術設備的基礎上,我們研發出了這個儀å¼ï¼Œå¯å°‡ä»»ä½•ä¸æ˜¯çŽ©å®¶çš„生物趕出儀å¼æ‰€è¦†è“‹çš„範åœã€‚默èªï¼Œä»»ä½•è·é›¢æ­¤å„€å¼çš„主儀å¼çŸ³ä¸è¶…éŽå…©æ ¼çš„éžçŽ©å®¶ç”Ÿç‰©çš„移動速度都會被此儀å¼å¹²æ¶‰åˆ°ã€‚è¦æ³¨æ„的是,儘管儀å¼ç¯„åœå…§çš„生物ä¸æœƒè¢«æŽ‰è½å‚·å®³å½±éŸ¿ï¼Œä½†ä¸€æ—¦è¶…出了儀å¼çš„覆蓋範åœï¼Œä¿è­·å°±æœƒå¤±æ•ˆã€‚ -guide.bloodmagic.entry.ritual.containment.info=å’Œç¦æ­¢å„€å¼æ­£å¥½ç›¸å,牽制儀å¼æœƒè©¦åœ–將所有生物全部拉進儀å¼ä¸Šæ–¹çš„範åœä¸­ï¼Œä¸¦å›°ä½å®ƒå€‘,使其無法移動。默èªç¯„åœæ˜¯æ°´å¹³æ–¹å‘上3格見方,從最低的儀å¼çŸ³åˆ°æœ€é«˜çš„å„€å¼çŸ³ç‚ºæ­¢ã€‚這個範åœå¯ä»¥èª¿æ•´ã€‚\n\t/cut默èªï¼Œå„€å¼çš„消耗是æ¯å€‹ç”Ÿç‰©æ¯tick1LP。沒有在拉生物時ä¸æœƒæ¶ˆè€—LP。 -guide.bloodmagic.entry.ritual.suppression.info=抑液儀å¼æœƒå£“制其影響範åœå…§çš„所有液體——æ›è¨€ä¹‹ï¼Œå°‡ç¯„åœå…§çš„液體全替æ›ç‚ºç©ºæ°£ã€‚它的工作範åœå¤§ç´„是åŠå¾‘10格的上åŠçƒã€‚工作時,LP消耗速度為2LP/tick。儀å¼åœæ­¢å·¥ä½œæ™‚會將所有被替æ›çš„液體全部放置回去。 -guide.bloodmagic.entry.ritual.expulsion.info=å‡å¦‚你在玩æœå‹™å™¨æ™‚,你發ç¾ï¼Œå‡ºæ–¼ç¨®ç¨®ç†ç”±ï¼Œä½ éœ€è¦æ‹’絕æŸäº›çŽ©å®¶çš„造訪,然後你發ç¾åŠ›å ´è­·ç›¾å’Œæ®ºäººä¸çœ¨çœ¼çš„巨型轉å­æ ¹æœ¬ä¸èƒ½é˜»æ“‹ä»–們。那麼就是這個儀å¼å‡ºå ´çš„時刻了ï¼åœ¨å‚³é€é­”法的幫助下這個儀å¼æœƒå¤§å¤§ç·©è§£ä½ çš„å•é¡Œï¼\n\t若有玩家進入此儀å¼çš„範åœå…§ï¼Œä¸¦ä¸”這個玩家並ä¸æ˜¯å„€å¼çš„主人,那麼這個玩家就會被隨機傳é€åˆ°åŠå¾‘100格的範åœä¸­çš„æŸå€‹åœ°æ–¹ã€‚當然這個儀/cutå¼é‚„有一種類似白å單的功能:在主儀å¼çŸ³ä¸Šæ”¾ä¸€å€‹ç®±å­ï¼Œç„¶å¾Œå°‡é‚£äº›èˆ‡ä¸æƒ³è¢«å‚³é€çš„玩家ç¶å®šçš„物å“放進箱å­è£¡ï¼Œé€™äº›çŽ©å®¶å°±ä¸æœƒè¢«å‚³é€èµ°äº†ã€‚\n\tæ¯å‚³é€æˆåŠŸä¸€æ¬¡æœƒæ¶ˆè€—2000LP。 -guide.bloodmagic.entry.ritual.zephyr.info=和風之喚——以一把å¤åŠçš„å字命å——å¯ä»¥è—‰ç”±é¢¨çš„力é‡å°‡é™„近的物å“æ²èµ·ä¾†ä¸¦é€å…¥èˆ‡ä¹‹éˆæŽ¥çš„ç®±å­è£¡ï¼ˆé»˜èªï¼Œåªéœ€è¦æŠŠç®±å­æ”¾åœ¨ä¸»å„€å¼çŸ³æ­£ä¸Šæ–¹å³å¯ï¼‰ã€‚這個éŽç¨‹å¤§æ¦‚一瞬間就å¯ä»¥å®Œæˆï¼Œæ‰€ä»¥ä½ ä¸ç”¨æ“”心有什麼奇怪的å¸åŠ›å•é¡Œï¼\n\t默èªçš„工作範åœæ˜¯ä¸»å„€å¼çŸ³æ–¹åœ“5格之內的方形。 -guide.bloodmagic.entry.ritual.laying.info=很多時候,自動化任務需è¦æŸç¨®è‡ªå‹•æ”¾ç½®æ–¹å¡Šçš„手段。這個儀å¼ä¾¿å¯ä»¥å¾žé™„è¿‘çš„ç®±å­ä¸­ï¼ˆé»˜èªï¼Œæ˜¯ä¸»å„€å¼çŸ³æ­£ä¸Šæ–¹ï¼‰å–出方塊並放置在儀å¼çš„內部。具體來說,是放置在è·é›¢ä¸»å„€å¼çŸ³å…©æ ¼é çš„地方,且高度相åŒã€‚å分é©åˆåœ¨å»ºé€ æ¨¹å ´æ™‚用於自動種樹苗。æ¯æ”¾ç½®ä¸€å€‹æ–¹å¡Šæ¶ˆè€—50LP。 -guide.bloodmagic.entry.ritual.timberman.info=種了一堆樹?想必你需è¦é€™å€‹å„€å¼ã€‚ä¼æž—å„€å¼æœƒå°‡å„€å¼æŒæœ‰è€…çš„LP用來驅使一個無形的幽éˆï¼Œä»¥ç ä¼é™„近的樹木,並將ç ä¸‹ä¾†çš„木頭放入附近的箱å­è£¡ã€‚默èªï¼Œå®ƒçš„工作範åœæ˜¯ä¸»å„€å¼çŸ³å¾€ä¸Š30格,æ¯å€‹æ°´å¹³æ–¹å‘上å„延伸10格形æˆçš„長方體。æ¯ç æŽ‰ä¸€å¡Šæœ¨é ­éœ€è¦æ¶ˆè€—10LP。 -guide.bloodmagic.entry.ritual.meteor.info=就目å‰ä¾†èªªï¼Œé€™å€‹å„€å¼æ˜¯æ‰€æœ‰å„€å¼ä¸­æœ€å¼·å¤§çš„å„€å¼ä¹‹ä¸€ã€‚驅動此儀å¼éœ€è¦æ¶ˆè€—一百è¬LP,並且還有一段冷å»æ™‚間。然而它的效果也å分強大——åªéœ€æä¾›åˆé©çš„祭å“,它就å¯ä»¥å¾žå®‡å®™ä¸­å¬å–šä¸€é¡†éš•çŸ³ä¸¦ç›´æŽ¥ç ¸å‘地é¢ã€‚誠然,這樣一個大傢伙會在地é¢ä¸Šé€ æˆå¤§çˆ†ç‚¸ï¼Œä½†å› ç‚ºå®ƒä¾†è‡ªå®‡å®™ä¸­ï¼Œæ‰€ä»¥å¯èƒ½æœƒåŒ…å«å¤§é‡ç¨€æœ‰ç¤¦çŸ³ã€‚ \n\t/cutå¯ç”¨çš„祭å“包括éµå¡Šã€é‡‘塊和鑽石。(事實上,å¯ç”¨çš„祭å“是å¯ä»¥è¢«æ•´åˆä½œè€…或用戶控制的) -guide.bloodmagic.entry.ritual.downgrade.info=為了ç²å¾—更強大的力é‡ï¼Œä½ æˆ–許需è¦ç»ç¥­æŸç¨®æ±è¥¿ä½œç‚ºäº¤æ›ã€‚而這「沉é‡éˆé­‚的懺悔ã€çš„任務正是如此——將一些物å“ç»ç¥­çµ¦ä¸€å€‹è™›ç„¡ç¸¹ç·²çš„實體,你便å¯ä»¥ä»¥æŸéˆè­·ç”²çš„屬性下é™ç‚ºä»£åƒ¹ï¼Œä¾†æ›å–更多的å‡ç´šé»žæ•¸ã€‚å„€å¼è½æˆå¾Œï¼Œä½ éœ€è¦åœ¨æœ€é«˜çš„空白儀å¼çŸ³æŽ›ä¸€å€‹é¢æœä¸»å„€å¼çŸ³çš„物å“展示框,然後在薄暮儀å¼çŸ³ä¸Šæ”¾ä¸€å€‹èƒ½è£æ±è¥¿çš„方塊(例如箱å­ï¼‰ã€‚è¦ç»ç¥­çš„物å“需è¦æ”¾å…¥é‚£å€‹è£æ±è¥¿çš„地方,而核心物å“/cut應掛入物å“展示框內。儀å¼é©…動後,你便å¯ä»¥è¹²åœ¨ä¸»å„€å¼çŸ³ä¸Šä¸¦ç²å¾—é™ç´šå¾Œçš„物å“。\n\t舉例,å°æ–¼æ·¬ç«é™ç´šä¾†èªªï¼Œæ ¸å¿ƒç‰©å“是個水瓶,需è¦ç»ç¥­çš„物å“是é¾æ¯ã€‚\n\t所有å¯ç”¨çš„é™ç´šéƒ½å¯ä»¥é€šéŽJEI查詢到——查詢主儀å¼çŸ³çš„用途å³å¯ã€‚å¦å¤–,å°æ–¼ä¸€å€‹ç‰¹å®šçš„é™ç´šä¾†èªªï¼Œæ ¸å¿ƒç‰©å“是一定的,所以你也å¯ä»¥é¸æ“‡æŸ¥è©¢æŸå€‹ç‰©å“來定ä½æŸå€‹é™ç´šæ‰€éœ€çš„祭å“。 - -# Architect Entries -guide.bloodmagic.entry.architect.intro=å‰è¨€ -guide.bloodmagic.entry.architect.bloodaltar=血之祭壇 -guide.bloodmagic.entry.architect.ash=å¥§è¡“ç²‰ç° -guide.bloodmagic.entry.architect.divination=å åœå°è¨˜ -guide.bloodmagic.entry.architect.soulnetwork=éˆé­‚網絡 -guide.bloodmagic.entry.architect.weakorb=è™›å¼±æ°£è¡€å¯¶ç  -guide.bloodmagic.entry.architect.incense=ç†é¦™ç¥­å£‡ -guide.bloodmagic.entry.architect.bloodrune=祭壇å‡ç´š -guide.bloodmagic.entry.architect.inspectoris=指示之書 -guide.bloodmagic.entry.architect.runeSpeed=速度符文 -guide.bloodmagic.entry.architect.water=水之å°è¨˜ -guide.bloodmagic.entry.architect.lava=熔岩å°è¨˜ -guide.bloodmagic.entry.architect.lavaCrystal=熔岩水晶 -guide.bloodmagic.entry.architect.apprenticeorb=å­¸å¾’æ°£è¡€å¯¶ç  -guide.bloodmagic.entry.architect.dagger=犧牲匕首 -guide.bloodmagic.entry.architect.runeSacrifice=ç»ç¥­ç¬¦æ–‡ -guide.bloodmagic.entry.architect.runeSelfSacrifice=犧牲符文 -guide.bloodmagic.entry.architect.holding=集æŒå°è¨˜ -guide.bloodmagic.entry.architect.air=風之å°è¨˜ -guide.bloodmagic.entry.architect.void=虛空å°è¨˜ -guide.bloodmagic.entry.architect.greenGrove=綠å¢å°è¨˜ -guide.bloodmagic.entry.architect.fastMiner=速掘å°è¨˜ -guide.bloodmagic.entry.architect.seer=見解å°è¨˜ -guide.bloodmagic.entry.architect.magicianOrb=æ³•å¸«æ°£è¡€å¯¶ç  -guide.bloodmagic.entry.architect.capacity=增容符文 -guide.bloodmagic.entry.architect.displacement=轉ä½ç¬¦æ–‡ -guide.bloodmagic.entry.architect.affinity=元素å°è¨˜ -guide.bloodmagic.entry.architect.lamp=血光å°è¨˜ -guide.bloodmagic.entry.architect.magnetism=ç£å¼•å°è¨˜ -guide.bloodmagic.entry.architect.peritia=經驗之書 -guide.bloodmagic.entry.architect.livingArmour=æŸéˆè­·ç”² -guide.bloodmagic.entry.architect.upgradeTome=æŸéˆè­·ç”²å‡ç´šä¹‹æ›¸ -guide.bloodmagic.entry.architect.teleposer=傳é€å™¨ -guide.bloodmagic.entry.architect.boundBlade=æŸç¸›ä¹‹åŠ -guide.bloodmagic.entry.architect.boundTool=æŸç¸›å·¥å…· -guide.bloodmagic.entry.architect.weakShard=虛弱氣血碎片 -guide.bloodmagic.entry.architect.masterOrb=å°Žå¸«æ°£è¡€å¯¶ç  -guide.bloodmagic.entry.architect.runeOrb=寶ç ç¬¦æ–‡ -guide.bloodmagic.entry.architect.suppression=抑液å°è¨˜ -guide.bloodmagic.entry.architect.haste=急速å°è¨˜ -guide.bloodmagic.entry.architect.severance=絕影å°è¨˜ -guide.bloodmagic.entry.architect.teleposition=傳é€å°è¨˜ -guide.bloodmagic.entry.architect.compression=壓擠å°è¨˜ -guide.bloodmagic.entry.architect.bridge=影橋å°è¨˜ -guide.bloodmagic.entry.architect.mimic=擬態 -guide.bloodmagic.entry.architect.downgrade=æŸéˆè­·ç”²é™ç´š - -guide.bloodmagic.entry.architect.augmentedCapacity=超容符文 -guide.bloodmagic.entry.architect.charging=充能符文 -guide.bloodmagic.entry.architect.acceleration=促進符文 - -# Architect Entry Texts -guide.bloodmagic.entry.architect.intro.info=大家好,我å«æ比略。你或許已經發ç¾é€™æœ¬æ›¸ä¸¦ä¸å®Œæ•´äº†ï¼Œä½†å¾ˆä¸å¹¸ä½ æ˜¯å°çš„。因為1.7.10->1.8.9->1.9.4åŠä»¥ä¸Šçš„更新,血魔法也發生了巨大的變化。因此,這本書ä¸å¾—ä¸é‡å¯«ã€‚這本書的最終目標是一本研究筆記,或者說是一本真正的書,所以è·é›¢é€™æœ¬æ›¸çœŸæ­£å®Œæˆé‚„有一段è·é›¢ã€‚有鑒於此,我會定期填補這本書中的空白。當然了,一開始這本書裡將全是讀起來味åŒåš¼è Ÿçš„文字(嘛...肯定ä¸æ˜¯é‚£ç¨®å¼•äººå…¥å‹çš„å­—/cut啦,好啦ä¸è¦åœ¨æ„細節),但這個情æ³æœƒéš¨è‘—時間的推移而得到改善的,等待著你的將會是一部血術士們的心路歷程。\n\t但ä¸å¥½æ„æ€æˆ‘想我得趕緊é‡æ–°åˆ‡å…¥è§’色當中去了。*咳嗽è²*\n\t我åæ比略,一å血術士,åŒæ™‚也以「締造者ã€çš„åå­—èžå於世。這本書中包å«äº†æˆ‘å°å為「éˆé­‚網絡ã€çš„自然ç¾è±¡çš„研究,以åŠæˆ‘å°è¡€é­”法師需/cutè¦é©æ‡‰çš„一些設備的物ç†ç‰¹æ€§çš„æ述。從æ­å»ºå¼·å¤§çš„血之祭壇的技è—,到為增強法力而進行的生命ç»ç¥­çš„種種細節,å†åˆ°å„種æ“有強大力é‡çš„魔法符文和å°è¨˜ï¼Œæˆ‘ä¸æ–·åœ°ç™¼ç¾æ–°çš„魔法,ä¸æ–·åœ°ç¸½çµä¸¦æ‰¾åˆ°å¼·åŒ–自己的全新方å¼ã€‚\n\t來å§ï¼Œæ–°å…¥é–€çš„魔法師們,全新的領域在等待著你ï¼\n\t...啊馬格斯說我有時候有點浮誇,但那åˆå¦‚何? -guide.bloodmagic.entry.architect.bloodaltar.info.1=血之祭壇便是血魔法中最核心的設備之一。它有兩個主è¦ç”¨é€”:åˆæˆæŸäº›ç‰©å“,或將生命精è¯è½‰ç§»åˆ°å¯¶ç ä¸­åŽ»ã€‚然而這兩個用途都需è¦æ¶ˆè€—祭壇中的生命精è¯ã€‚自然地,也有兩種補充生命精è¯çš„æ–¹å¼ï¼šä»¥çŽ©å®¶çš„è¡€æ供生命精è¯ï¼Œæˆ–以別的動物或怪物的血æ供生命精è¯ã€‚ -guide.bloodmagic.entry.architect.bloodaltar.info.2=你需è¦ä¸€æŠŠçŠ§ç‰²åŒ•é¦–æ‰èƒ½å°‡ä½ çš„血轉化為生命精è¯ä¸¦æ³¨å…¥ç¥­å£‡ä¸­ã€‚å…·é«”æ“作如下:首先,站在祭壇æ—;然後,使用匕首傷害自己(å³å³æ“Šï¼‰ï¼Œä½ æœƒæ失一顆心的生命值,祭壇中會多出 200 LP。LP 是生命精è¯çš„ å–®ä½ï¼Œç¨±ç‚ºç”Ÿå‘½é»žæ•¸ï¼ˆLife Point, 縮寫 LP),用於刻畫æŸç¨®ä»» 務需è¦æ¶ˆè€—的生命力——ä¸ï¼Œå’ŒéŠæˆ²çŽ‹ä¸ä¸€æ¨£ã€‚默èªï¼Œæ™®é€šçš„血之祭壇容é‡åƒ…為一è¬ã€‚ä½ é‚„å¯ä»¥æŠŠç‰©å“放入祭壇中(å³æ“Šå³å¯ï¼‰ï¼Œè‹¥å¦‚æ­¤åšï¼Œåˆé©çš„/cut物å“便會觸發åˆæˆé€²ç¨‹ã€‚\n\t祭壇åˆæˆä¸åƒ…需è¦æ¶ˆè€— LP,還需è¦ä¸€å®šçš„層級。滿足 這些æ¢ä»¶å¾Œï¼Œç¥­å£‡ä¾¿æœƒé–‹å§‹è‡ªå‹•æŠ½å– LP 用於åˆæˆï¼Œä¸¦é–‹ 始散發紅色粒å­æ•ˆæžœã€‚è‹¥åˆæˆé‚„未完æˆï¼Œä½†æ­¤æ™‚ LP 已被 抽乾,紅色的粒å­æ•ˆæžœæœƒè½‰ç‚ºç°è‰²ï¼Œåˆæˆé€²åº¦ä¹Ÿæœƒé–‹å§‹å€’退,所以盡é‡é¿å…這種情æ³çš„出ç¾ï¼æœ€å¾Œé‚„有一點,如果你放進祭壇裡的æ±è¥¿æ˜¯æ°£è¡€å¯¶ç ï¼Œé‚£éº¼å®ƒ 會散發紫色的粒å­æ•ˆæžœï¼Œè¡¨æ˜Žå®ƒåœ¨å‘æŸå€‹å¯¶ç ä¸­çŒè¼¸ LP。\n\t事實上,祭壇中有三個存儲 LP 的容器:之å‰æ到的一è¬å®¹ç©æŒ‡çš„是其主容器;除此之外,祭壇還有輸入容器和輸出容器å„一,容ç©å‡ç‚ºä¸»å®¹å™¨å®¹ç©çš„å分之一。默èªï¼Œè¼¸å…¥å®¹å™¨ä¸­çš„生命精è¯æœƒä»¥æ¯ç§’ 20 LP 的速度轉移至主容器中,而主容器中的生命精è¯ä¹Ÿæœƒä»¥åŒæ¨£çš„速度轉移到輸出容器中。如此一來,輸入容器和輸出/cut容器在祭壇中扮演的便是緩è¡å€çš„角色——它們是用來é™åˆ¶å°‡ç”Ÿå‘½ç²¾è¯è¼¸å…¥ç¥­å£‡ï¼Œå’Œå¾žç¥­å£‡ä¸­å°‡ç”Ÿå‘½ç²¾è¯æŠ½å–出來的速度的。 -guide.bloodmagic.entry.architect.ash.info=儘管奧術粉ç°ä¸¦ä¸æ˜¯é€™ä¸€å·çš„核心,但它確實貫穿了本å·æ到的很多é“å…·çš„åˆæˆä¹‹ä¸­ã€‚åˆæˆå¥§è¡“粉ç°éœ€è¦ç”¨åˆ°ç„ç«ç†”çˆå’Œæƒ¡é­”æ„志,關於這些æ±è¥¿çš„細節å¯ä»¥åƒè€ƒã€Šæƒ¡é­”使者》å·ã€‚簡單來說,它是一種二元åˆæˆå·¥å…·ï¼šä½ éœ€è¦ä¸€ç¨®å¯å……當催化劑的å應試劑,以åŠæŸç¨®ç‰©å“作為次è¦åˆæˆæ料。\n\t一份奧術粉ç°å¯ä½¿ç”¨äºŒå次。å°è‘—地é¢æˆ–者牆å£ä½¿ç”¨ä¾¿/cutå¯ç•«å‡ºä¸€å€‹åœ“形的法陣(如果是牆å£ï¼Œä½ åªèƒ½åœ¨ä¸€å€‹æ–¹å‘上看到法陣)。然後,å°æ³•é™£ä¸­å¤®ä½¿ç”¨åˆé©çš„催化劑å³å¯æ”¹è®Šå…¶å½¢ç‹€ï¼Œç•¶ç„¶ä¹Ÿæœƒæ¶ˆè€—催化劑(å³ï¼Œå³æ“Šä½¿ç”¨ï¼‰ã€‚如果法陣沒有變形,那麼你肯定有什麼地方æžéŒ¯äº†ã€‚\n\t在觀察到法陣變形後,你便å¯ä»¥æ”¾å…¥æ¬¡è¦ç‰©å“了。åˆé©çš„次è¦ç‰©å“會啟動法陣,屆時你會看到法陣開始旋轉,並開始產生å„種變化,具體變化隨法/cut陣ä¸åŒè€Œä¸åŒâ€”—但正確啟動的法陣最終都會產生一種新的物å“。\n\t所有用到奧術粉ç°çš„åˆæˆâ€”—我一般管這å«ç…‰é‡‘陣列——都å¯ä»¥åœ¨JEI中查詢到。注æ„,左å´çš„物å“一定是催化劑,而å³å´çš„物å“一定是一個次è¦ç‰©å“。 -guide.bloodmagic.entry.architect.divination.info=å åœå°è¨˜æ˜¯è¡€è¡“士最常用的工具之一,因為它能解決你很多麻煩,具體來說是能給你一些關éµæ•¸æ“šã€‚它的åˆæˆä¹Ÿå¾ˆç°¡å–®ï¼šåªéœ€è¦åœ¨ç…‰é‡‘陣列中以紅石為催化劑,以石æ¿ç‚ºæ¬¡è¦ç‰©å“åˆæˆå³å¯ã€‚\n\tå°è¡€ä¹‹ç¥­å£‡ä½¿ç”¨æ­¤å°è¨˜ä¾¿å¯çœ‹åˆ°ç¥­å£‡ä¸»å®¹å™¨ä¸­çš„LP數é‡ï¼Œä»¥åŠå®¹é‡ä¸Šé™ã€‚短時間內å覆使用並ä¸æœƒå°Žè‡´åˆ·å±ï¼Œåªæœƒè¦†è“‹ä¹‹å‰çš„æ示。\n\t/cutå°è‘—空氣使用此å°è¨˜çš„話,則能看到你的éˆé­‚網絡中的LP數é‡ã€‚儘管這功能看上去很普通,但你以後就會發ç¾ï¼Œä½ ä¸€åˆ»ä¹Ÿä¸æƒ³è®“這玩æ„離手。 -guide.bloodmagic.entry.architect.soulnetwork.info=éˆé­‚網絡(Soul Network,縮寫 SN)是指玩家和å„種物å“以 åŠçµæ§‹ä¹‹é–“çš„éˆé­‚上的éˆæŽ¥ã€‚隨著血術士能力的æå‡ï¼Œéˆé­‚網絡的強度也會隨之æ高。就存在來說,它們是éˆé­‚ç¹”æˆçš„一張無形的網,但最強大的血魔法師們是å¯ä»¥çœ‹åˆ°å…¶ç‰©ç†çš„å…·ç¾çš„。然而,時至今日,ä»ç„¡äººå¯é”此化境...\n\t在éŠæˆ²ä¸­ï¼Œç¶²çµ¡æ˜¯ç›´æŽ¥èˆ‡çŽ©å®¶ç¶å®šåœ¨ä¸€å¡Šçš„。玩家所在的世界早已記錄下了這一切——/cut這æ„味著,玩家的 LP 並éžæ˜¯ 記錄在æŸé¡†æ°£è¡€å¯¶ç ä¸­ï¼Œè€Œæ˜¯è¢«ä¸–界記錄著;æ¯å€‹çŽ©å®¶ä¹‹é–“的網絡互相ç¨ç«‹ï¼Œäº’ä¸å½±éŸ¿ã€‚\n\tç¶å®šçš„éŽç¨‹é€šå¸¸åœ¨ç¬¬ä¸€æ¬¡ä½¿ç”¨æŸå€‹ç‰©å“時就已經完æˆäº†ã€‚就目å‰çš„科技來說,一旦ç¶å®šï¼Œå³ä¾¿æ˜¯ç‰©å“的主人也無法解除。需è¦æ¶ˆè€—LP的物å“會直接消耗其主人éˆé­‚網絡中的LP。但,如果主人的éˆé­‚網絡中沒有足夠的 LP,它會從 當å‰ä½¿ç”¨è€…,而ä¸æ˜¯å…¶ä¸»äººï¼Œçš„身上抽å–生命值以填補空缺。因此,在快沒有LP的時候è¦å°å¿ƒâ€”—因為這通常會致人於死地。 -guide.bloodmagic.entry.architect.weakorb.info.1=沒了魔法來æºçš„魔法師和鹹魚有什麼å€åˆ¥ï¼Ÿæ°£è¡€å¯¶ç ä¾¿æ˜¯é€™æ¨£ä¸€å€‹é­”法æºï¼šå®ƒå¯ä»¥å°‡ç‰©ç†å½¢å¼çš„生命轉化æˆLP並輸入到其主人的éˆé­‚網絡中去。它本身並éžé›»æ± ï¼Œç›¸å它倒åƒæ˜¯ä¸€æ ¹å°Žç®¡ï¼Œå¯å°‡ç”Ÿå‘½åŠ›è½‰åŒ–æˆè¡€é­”法師需è¦çš„魔法。 -guide.bloodmagic.entry.architect.weakorb.info.2=虛弱氣血寶ç ä¾¿æ˜¯ä½ èƒ½è£½ä½œçš„第一種寶ç â€”—åªéœ€å‘一粒鑽石中çŒæ³¨å…©åƒLP的生命力å³å¯å®Œæˆã€‚將已ç¶å®šçš„寶ç æ”¾å…¥ç¥­å£‡ï¼Œå®ƒå°±å¯ä»¥ä¸æ–·åœ°å¾žç¥­å£‡ä¸­æŠ½å–LP,直接輸入éˆé­‚網絡中。å¦å¤–,ä¸è«–什麼寶ç ï¼Œå…¶å®¹é‡ä¸Šé™éƒ½åªèƒ½é€šéŽä¸€äº›é«˜ç´šç¬¦æ–‡ä¾†æå‡ï¼›é€™è£¡æ³¨æ„一點,這個容é‡æå‡çš„效果åªæœ‰åœ¨å¯¶ç åœ¨ç¥­å£‡ä¸Šæ™‚æ‰æœ‰æ•ˆã€‚å°æ–¼è™›å¼±æ°£è¡€å¯¶ç ï¼Œæœ€é«˜åªèƒ½æå‡åˆ°äº”åƒã€‚\n\t/cut玩家還å¯ä»¥é€šéŽç°¡å–®åœ°ä½¿ç”¨æ°£è¡€å¯¶ç ä¾†ç²å¾—LP——æ¯ä¸€æ¬¡ä½¿ç”¨éƒ½æœƒå°çŽ©å®¶é€ æˆä¸€é¡†å¿ƒçš„傷害並æä¾›200LP。此法ä¸èƒ½ä»¤ç¶²çµ¡ä¸­çš„LP數é‡çªç ´å®¹é‡ä¸Šé™ã€‚\n\t祭壇åªå¯èƒ½ç‚ºèˆ‡è‡ªå·±ç´šåˆ¥ç›¸ç•¶ï¼Œæˆ–者比自己級別低的氣血寶ç æä¾›LP。舉例,三級的寶ç åªå¯èƒ½åœ¨ä¸‰ç´šæˆ–更高級的祭壇中ç²å¾—LP,一級的祭壇是無法å‹ä»»çš„。 -guide.bloodmagic.entry.architect.incense.info.1=血術士會經常發ç¾ï¼Œå®ƒå€‘çš„LP產能時常跟ä¸ä¸Šæ¶ˆè€—。當然,有特殊的符文å¯ä»¥æ高自我ç»ç¥­æ‰€ç”¢ç”Ÿçš„生命精è¯çš„數é‡ï¼Œä½†é€™å€‹éŽç¨‹ä¾èˆŠæ˜¯å¦‚此緩慢。åªæœ‰é€™ä¸€æ¢è·¯å¯ä»¥èµ°äº†å—Žï¼Ÿ\n\t下é¢ä»‹ç´¹ç†é¦™ç¥­å£‡ã€‚ç†é¦™ç¥­å£‡æœ¬èº«å¯ä»¥ä»¥è‡ªèº«ç‚ºä¸­å¿ƒï¼Œæ¨™è¨˜å‡ºä¸€ç‰‡éœè¬çš„土地,在這範åœå…§ï¼Œå®ƒå¯ä»¥å€ŸåŠ©ç¥­å£‡æœ¬èº«æ•£ç™¼å‡ºçš„餘力來安撫驚擾到的éˆé­‚。當然你ä¸æ˜¯å¾ˆæ¸…楚這/cutè‚¡ç†é¦™çš„æ°£æ¯å¾žä½•è€Œä¾†ï¼Œä½†å¥½åƒåˆæ²’什麼ä¸å°ï¼Ÿå…ˆä¸ç®¡äº†ã€‚\n\tç†é¦™ç¥­å£‡çš„作用就是如此:利用éœè¬çš„環境來æå‡å–®é¡†å¿ƒæ‰€å‰µé€ å‡ºçš„生命精è¯çš„數é‡ã€‚在你è·é›¢ç†é¦™ç¥­å£‡åªæœ‰ç´„莫五格é çš„地方時,它會散發出ç«ç„°é¡†ç²’以證明其已經創造出éœè¬å€åŸŸã€‚在它的影響範åœä¸‹ï¼Œä½ çš„犧牲匕首也會發生變化,以證明ç†é¦™å·²ç¶“發æ®å…¶æ•ˆæžœã€‚整個éŽç¨‹å¤§ç´„æŒçºŒäº”秒é˜ï¼Œä½ å¯ä»¥é€šéŽè§€å¯Ÿç«ç„°/cutç²’å­çš„存在來判斷是å¦çµæŸã€‚此時,使用犧牲匕首ç»ç¥­è‡ªå·±å°‡æœƒä¸€æ¬¡æ€§ç»ç¥­ä½ ç”Ÿå‘½å€¼ä¸Šé™çš„百分之ä¹å,並將å°æ‡‰æ•¸é‡çš„LP輸入血之祭壇之中。LP數é‡å’Œç»ç¥­çš„生命值ä¾èˆŠæˆæ­£æ¯”,但此時它的轉化率會根據附近的éœè¬å€¼è€Œæœ‰æ‰€ä¸Šå‡ï¼›é»˜èªï¼Œå¢žå¹…是百分之二å。\n\tå¦å¤–,å åœå°è¨˜å¯ä»¥æ­ç¤ºé™„è¿‘çš„éœè¬å€¼ï¼Œä»¥åŠéœè¬æ‰€å¸¶ä¾†çš„具體增幅水平。 -guide.bloodmagic.entry.architect.incense.info.2=自然,百分之二å的增幅已經夠多了,但ç†é¦™ç¥­å£‡ä½œç”¨çš„範åœé‚„是å¯ä»¥ç¹¼çºŒæ“´å±•çš„。你åªéœ€è¦åœ¨ç†é¦™ç¥­å£‡æŸå€‹åŸºç¤Žæ–¹å‘(å³ï¼Œæ­£æ±ã€æ­£è¥¿ã€æ­£å—ã€æ­£åŒ—)兩格é çš„地方排出一列三塊高度一樣木質路é¢å³å¯å®šç¾©ä¸€å€‹ã€Œç¯„åœã€ã€‚在此「範åœã€ä¸­çš„ä»»æ„方塊都有助於讓這片å€åŸŸæ›´åŠ éœè¬ã€‚木質路é¢é‚„å¯ä»¥ç¹¼çºŒæ“´å±•ï¼ŒæƒŸéœ€éµå®ˆä»¥ä¸‹è¦å‰‡ï¼šä¸€ï¼Œæ¯ä¸€åˆ—木質路é¢å¿…須水平,å³æ§‹æˆæ–°ä¸€åˆ—è·¯é¢çš„方塊必須高度相åŒï¼›äºŒï¼Œæ–°çš„è·¯é¢å¿…é ˆä½æ–¼ä¸Šä¸€åˆ—è·¯é¢çš„上/cut下五格範åœå…§ã€‚簡單來說,金字塔ã€å€’金字塔等階梯å¼çµæ§‹éƒ½æ˜¯å¯ä»¥çš„。\n\t然而,這個範åœä¸¦éžå¯ä»¥ç„¡ç¯€åˆ¶åœ°æ“´å¼µã€‚木質路é¢åªèƒ½ç–ŠåŠ ä¸‰åˆ—ï¼›ä¸éŽä¸ç”¨æ“”心,還有一種å¯ä»¥ç–ŠåŠ äº”列的石質路é¢ï¼›ç”šè‡³é‚„有å¯ä»¥ç–ŠåŠ ä¹åˆ—的碎石路é¢å’Œé»‘曜石路é¢ã€‚自然地,你在疊加三列木路é¢å¾Œå°±éœ€è¦ç”¨çŸ³é ­çš„;然而你完全å¯ä»¥ä¸€é–‹å§‹å°±ç”¨çŸ³é ­çš„,åªè¦ä½ ä¸æ˜¯åªç”¨æœ¨è·¯é¢å°±å¥½ã€‚\n\t/cut回到éœè¬ç¨‹åº¦çš„å•é¡Œä¸Šä¾†ã€‚事實上åªæœ‰ä¸€éƒ¨åˆ†æ–¹å¡Šå¯ä»¥è®“這片å€åŸŸæ›´åŠ éœè¬ï¼Œè€Œæ ¹æ“šå¯¦é©—,這些方塊被分æˆäº†è‹¥å¹²ç¨®ã€‚舉個例å­ï¼Œä½ åœ¨é€™ç‰‡å€åŸŸä¸­ç¨®äº†åœŸè±†ï¼ŒåœŸè±†å±¬æ–¼ã€Œä½œç‰©ã€åˆ†é¡žï¼Œç„¶å¾Œé€™ç‰‡å€åŸŸä¾¿å¹³éœäº†ä¸€äº›ã€‚ä¸è«–是你接著種土豆,或者你種起了胡蘿蔔,它們的效果都會隨著你種的數é‡çš„增多而é™ä½Žï¼Œç”šè‡³é‚„會抵消一開始的效果,因為它們都屬於「作物ã€ã€‚為了最好的效果,你需è¦ç›¡å¯èƒ½ä½¿ç”¨å¤šç¨®ä¸åŒé¡žåž‹çš„方塊。/cut有助於平éœçš„方塊有這麼幾類:作物ã€åŽŸæœ¨ã€æ¨¹è‘‰ã€ç†”岩ã€åœ°ç„å·–ã€è€•åœ°ã€æ°´ã€ç”Ÿå‘½ç²¾è¯ã€ä»¥åŠå…¶ä»–æ±è¥¿ï¼ˆåŽŸæ–‡å¦‚此)。 -guide.bloodmagic.entry.architect.bloodrune.info.1=隨著你é€æ¼¸æ·±å…¥è¡€é­”法,你會發ç¾ä½ é‚£æ™®æ™®é€šé€šçš„血之祭壇已無法滿足你的需è¦äº†ã€‚但你還å¯ä»¥é€šéŽæ”¾ç½®ä¸€ç¨®å為氣血符文的特殊方塊來æå‡ç¥­å£‡çš„整體屬性,進而解鎖更多的åˆæˆã€‚\n\t將血之祭壇å‡åˆ°2級的方法很簡單:在祭壇本身往下一層放置八個一圈的氣血符文。如果你實在æžä¸æ¸…楚具體的ä½ç½®ï¼ŒæŒ‡ç¤ºä¹‹æ›¸å¯ä»¥å¹«åˆ°ä½ â€”—它å¯ä»¥ä»¥ä¸€ç¨®é¡žä¼¼å…¨æ¯æŠ•å½±çš„/cutæ–¹å¼æŒ‡æ˜Žä½ éœ€è¦æ”¾ç½®æ°£è¡€ç¬¦æ–‡çš„ä½ç½®ã€‚\n\t儘管åªéœ€è¦ç©ºç™½æ°£è¡€ç¬¦æ–‡å°±å¯ä»¥å®Œæˆç¥­å£‡å‡ç´šï¼Œæˆ‘ä»ç„¶æŽ¨è–¦ä½ å°ä½¿ç”¨å¸¶æœ‰ç‰¹æ®Šå¼·åŒ–的氣血符文。祭壇上的æ¯ä¸€å€‹ç¬¦æ–‡éƒ½å¯ä»¥è¢«æ›ä½œç‰¹æ®Šçš„氣血符文(唯一的例外是,二級祭壇四個角è½ä¸Šçš„特殊符文ä¸æœƒæœ‰æ•ˆæžœâ€”—但在三級åŠä»¥ä¸Šçš„祭壇,這四個ä½ç½®çš„特殊符文則å¯ä»¥ä½¿ç”¨ï¼‰ã€‚這些帶有特殊強化的氣血符文å¯ä»¥æ高/cut祭壇的åˆæˆé€Ÿåº¦ã€å®¹é‡ä»¥åŠæ•ˆçŽ‡ã€‚有關這些特殊的氣血符文的資料å¯ä»¥åœ¨å¾Œé¢çš„章節找到。 -guide.bloodmagic.entry.architect.inspectoris.info.1=Inspectoris Scandalum åœ¨æ‹‰ä¸ èªžä¸­å¤§æ¦‚çš„æ„æ€æ˜¯ã€Œæ–¹å¡Šè®€å–器ã€ã€‚事實上,它的用途是,潛行時å°è‘—æŸå€‹æ–¹å¡Šä½¿ç”¨ï¼Œä¾¿å¯è§£è®€é‚£äº›è¤‡é›œçµæ§‹çš„ä¿¡æ¯ï¼Œä¸¦å°‡å…¶é¡¯ç¤ºåœ¨ä½ çœ¼å‰ã€‚ç›®å‰ï¼Œå®ƒåªèƒ½çµ¦å‡ºè¡€ä¹‹ç¥­å£‡çš„相關信æ¯ï¼šå®ƒå¯ä»¥çµ¦å‡ºå‡ç´šç¥­å£‡æ‰€éœ€çš„方塊的種類,以åŠå…·é«”擺放ä½ç½®ã€‚\n\t若你覺得一次一次查詢ä¸é©åˆä½ ï¼Œä½ å¯ä»¥è©¦è‘—潛行時å°è‘—空氣使用此物以切æ›ç›®æ¨™å±¤/cut級。這樣,å†æ¬¡æŒ‰å‰æ–‡æ‰€è¿°çš„æ–¹å¼ä½¿ç”¨æ­¤ç‰©ï¼Œå®ƒå°±å¯ä»¥ä»¥ä¸€ç¨®é¡žä¼¼å…¨æ¯æŠ•å½±çš„æ–¹å¼å°‡å‡ç´šæ‰€éœ€çš„方塊的ä½ç½®æŠ•å½±å‡ºä¾†ã€‚設定級別為1時å¯ä»¥é—œé–‰é€™å€‹é¡žå…¨æ¯æŠ•å½±çš„效果。 -guide.bloodmagic.entry.architect.runeSpeed.info.1=速度符文å¯ä»¥æ高祭壇內的壓力,藉由此加速嬗變éŽç¨‹ï¼Œå¾žè€Œæ高åˆæˆé€Ÿåº¦ã€‚æ¯å¡Šé€Ÿåº¦ç¬¦æ–‡éƒ½æœƒæ高20%%的祭壇的LP消耗速度。它åŒæ™‚也會影響çŒæ³¨æ°£è¡€å¯¶ç çš„速度。 -guide.bloodmagic.entry.architect.water.info.1=顧åæ€ç¾©ï¼Œæ°´ä¹‹å°è¨˜æ˜¯ä¸€å¡Šå¯å‡èšç©ºæ°£ä¸­æ°´åˆ†ï¼Œä¸¦å°‡å…¶é›†ä¸­æ–¼ä¸€é»žä¸Šçš„å°è¨˜ã€‚除此之外,å°è‘—任何能è£æ°´çš„設備使用水之å°è¨˜éƒ½å¯ä»¥å‘設備裡é¢è£ä¸€æ¡¶æ°´ã€‚總而言之,它便是一個移動的無é™æ°´æºã€‚æ¯æ¬¡ä½¿ç”¨éƒ½æœƒæ¶ˆè€—50點LP。 -guide.bloodmagic.entry.architect.lava.info.1=若說水之å°è¨˜å±¬é™°ï¼Œé‚£éº¼ï¼Œå±¬é™½çš„便是熔岩å°è¨˜ã€‚熔岩å°è¨˜å¯ä»¥å°‡ä¸€ç‰‡å€åŸŸå…§çš„石頭熔化æˆå²©æ¼¿ã€‚若是å°æŸå€‹å¯æŽ¥å—æµé«”岩漿的設備使用,這設備裡就會多出一桶岩漿。儘管你拿著這個å°è¨˜ä¸æœƒè®“你自燃,但這ä¸ç­‰æ–¼ä½ å¯ä»¥é–‹å§‹æ´—熔岩浴了ï¼è¨˜å¾—æ¯æ¬¡ä½¿ç”¨æ™‚會消耗1000LP。 -guide.bloodmagic.entry.architect.lavaCrystal.info.1=熔岩晶體是塊裡é¢å­˜å„²äº†ä¸€åœ˜æ°¸ä¸å†·å»çš„熔岩的石頭。若將其放入熔çˆä¸­ç•¶ç‡ƒæ–™ä½¿ç”¨ï¼Œå®ƒæœƒé‡‹æ”¾å‡ºç†±é‡ï¼Œé€™äº›ç†±é‡æ­£å¥½å¯ä»¥ç‡’煉一個物å“,然後消耗50LP。若是它沒有這麼多LPå¯ä»¥æŠ½å–,它也ä¸æœƒå› æ­¤æ壞,還會因此給網絡的主人追加一個å胃效果。\n\t這塊晶體ç†è«–上在任何支æŒæ¨™æº–固態燃料的設備中都å¯ä»¥å·¥ä½œã€‚ -guide.bloodmagic.entry.architect.apprenticeorb.info.1=隨著你的新玩具越來越多,你會發ç¾éˆé­‚網絡的五åƒLP上é™å·²ç¶“開始æ‰è¥Ÿè¦‹è‚˜äº†ã€‚是時候åšä¸€é¡†æ›´å¼·å¤§çš„氣血寶ç äº†ã€‚\n\t學徒氣血寶ç çš„製作需è¦äºŒç´šè¡€ä¹‹ç¥­å£‡ï¼Œå¯æä¾›2.5è¬LP的容é‡ã€‚åŒæ™‚,它也是åˆæˆå¾ˆå¤šæ›´é«˜ç´šçš„物å“和符文的必須。 -guide.bloodmagic.entry.architect.dagger.info.1=在ä¸æ–·åœ°é€šéŽç»ç¥­è‡ªå·±ä¾†å¼·åŒ–自己後,你å¯ä»¥é–‹å§‹è©¦è‘—ç»ç¥­åˆ¥çš„活物了。若是用這把犧牲匕首,在血之祭壇附近擊中一隻普通的生物(ä¸èƒ½æ˜¯BOSS,也ä¸èƒ½æ˜¯çŽ©å®¶ï¼‰ï¼Œé‚£éº¼é€™å€‹å¯æ†çš„傢伙就會立刻被ç»ç¥­ï¼Œä¸¦æ ¹æ“šè³ªé‡çš„ä¸åŒï¼Œè½‰åŒ–æˆæ•¸é‡ä¸ç­‰çš„生命精è¯ã€‚一般情æ³ä¸‹ï¼Œé‚£äº›æ•µå°æ€ªç‰©çµ¦äºˆçš„生命精è¯è¦æ¯”那些平和的動物們è¦å¤šã€‚ -guide.bloodmagic.entry.architect.runeSacrifice.info.1=ç»ç¥­ç¬¦æ–‡ï¼Œæ­£å¦‚å…¶å,å¯æ高ç»ç¥­æ´»ç‰©æ™‚ç²å¾—的生命精è¯çš„數é‡ï¼Œæº–確地說,是æ¯å¡Šç¬¦æ–‡å¢žåŠ å分之一。 -guide.bloodmagic.entry.architect.runeSelfSacrifice.info.1=犧牲符文和ç»ç¥­ç¬¦æ–‡å·®ä¸å¤šï¼Œä½†çŠ§ç‰²ç¬¦æ–‡æ˜¯é‡å°çŽ©å®¶è‡ªå·±çš„。增幅和ç»ç¥­ç¬¦æ–‡ä¸€æ¨£ï¼Œéƒ½æ˜¯ç™¾åˆ†ä¹‹å。 -guide.bloodmagic.entry.architect.holding.info.1=ä½ é€æ¼¸é–‹å§‹ç™¼ç¾ä½ æœ‰ä¸€å †å„å¼å„樣的å°è¨˜è¦å¸¶åœ¨èº«ä¸Šäº†ï¼šæœ‰çš„需è¦æ‰‹å‹•é–‹é—œï¼Œæœ‰çš„åªéœ€è¦æ”¾åœ¨èƒŒåŒ…裡就å¯ä»¥ä¸€ç›´æœ‰æ•ˆæžœã€‚有鑒於你的背包空間開始é€æ¼¸ç¸®æ°´ï¼Œä½ å¯èƒ½éœ€è¦ä¸€å¡Šé›†æŒå°è¨˜çš„幫助。\n\t這集æŒå°è¨˜çš„作用,便是將五個其他å°è¨˜ã€Œå£“縮ã€æˆä¸€å€‹ï¼›ä½†æ˜¯ä½ ä¸¦ä¸èƒ½åœ¨é›†æŒå°è¨˜è£¡æ”¾é›†æŒå°è¨˜ã€‚默èªï¼ŒæŒ‰ä¸‹"Holding"éµï¼ˆé»˜èªç‚º'H')å¯æ‰“開其界é¢ï¼Œç”¨æ–¼èª¿æ•´é †åºã€‚滾輪å¯åœ¨é¸ä¸­/cutçš„å°è¨˜ä¹‹é–“循環切æ›ã€‚被é¸ä¸­çš„å°è¨˜å¯ç›´æŽ¥å€ŸåŠ©é›†æŒå°è¨˜ä½¿ç”¨ï¼Œæ¯‹éœ€å–出。\n\t自然地,你å¯ä»¥èº«ä¸Šå¸¶è‹¥å¹²é›†æŒå°è¨˜ï¼Œé€™äº›é›†æŒå°è¨˜äº’ä¸å½±éŸ¿ã€‚但為了一眼就能å€åˆ†ï¼Œä½ å¯ä»¥è€ƒæ…®åœ¨ç…‰é‡‘術桌中為其染色。染色的方å¼æœ‰å…©ç¨®ï¼š1.直接使用染料在煉金術桌中染色;2.使用å六進制數命å的命å牌,比如這樣:0xFFFFFF。 -guide.bloodmagic.entry.architect.air.info.1=風之å°è¨˜ï¼Œç°¡å–®åœ°å°‡æ°´è’¸æ°£åˆ†æˆæ•¸è‚¡ï¼Œç”¢ç”Ÿå¼·å¤§çš„æ°£æµï¼Œé©…使玩家å‰é€²ã€‚簡單來說,你å¯ä»¥ç”¨é€™å°è¨˜æŽ¨å‹•ä½ å‰é€²ã€‚å¦å¤–,這個å°è¨˜å¯ä»¥å…除掉è½å‚·å®³ï¼Œä½†åªæœ‰ä½ ä½¿ç”¨æ™‚æ‰å¯ä»¥å…除,所以如果你想硬著陸的話,記得è¦åœ¨å³å°‡æ‘”åˆ°åœ°ä¸Šçš„ä¸€çž¬é–“ä½¿ç”¨ï¼ -guide.bloodmagic.entry.architect.void.info.1=顧åæ€ç¾©ï¼Œè™›ç©ºå°è¨˜æœƒè£½é€ çœŸç©ºï¼Œä¸¦å°‡é™„近的液體全部å¸é€²åŽ»ï¼Œä¸¦å¾¹åº•éŠ·æ¯€ã€‚建議æ­é…水之å°è¨˜å’Œç†”岩å°è¨˜ä½¿ç”¨ã€‚ -guide.bloodmagic.entry.architect.greenGrove.info.1=綠å¢å°è¨˜å¯ä»¥å°‡ä½ çš„血轉化æˆæ¤ç‰©ç”Ÿé•·çš„催化劑,進而加速附近æ¤ç‰©çš„生長。驅動å°è¨˜çš„æ–¹å¼å¾ˆç°¡å–®ï¼šæ½›è¡Œæ™‚å°è‘—空氣使用(å³æ“Šï¼‰å³å¯ï¼›ç›¸åŒçš„æ–¹å¼å¯ä»¥åœæ­¢å…¶å·¥ä½œï¼ˆå¯ä»¥é€šéŽå…¶ä¿¡æ¯æ示看出它是å¦å·²è¢«é©…動)。è¦è¨˜ä½ï¼Œå®ƒæ¯éš”幾秒é˜å°±æœƒæŠ½å–一次LP以補充養料。\n\t直接å°ä½œç‰©ä½¿ç”¨çš„效果和骨粉無異。這樣一來,這個å°è¨˜ä¹Ÿå¯ä»¥åƒéª¨ç²‰ä¸€æ¨£ï¼Œç”¨æ–¼è£½é€ è‰å¢ã€‚ -guide.bloodmagic.entry.architect.fastMiner.info.1=大部分血術士都應該注æ„到了,血中å«æœ‰è±å¯Œçš„éµå…ƒç´ ã€‚經驗è±å¯Œçš„血術士完全å¯ä»¥åœ¨ä¸æŠ½è¡€çš„情æ³ä¸‹ç›´æŽ¥æ”¹è®Šå…¶é«”內血液的組æˆâ€”—然而,需è¦æ³¨æ„的是,åªæœ‰é‚£äº›æœ€é ‚尖的血術士æ‰å¯ä»¥æŠµæŠ—由此產生的排斥å應。\n\t這樣一個技能有個經典的用途,æ高身體的éˆæ´»æ€§ï¼Œä»¥æ高其é‹å‹•é€Ÿåº¦ã€‚這速掘å°è¨˜ï¼Œé€šéŽç”¨ç£éµå½±éŸ¿è¡€æ¶²è£¡çš„éµå…ƒç´ ï¼Œå¯å¤§å¹…æå‡ä½¿ç”¨è€…的挖掘/cut速度。其實這個效果就是急迫II的效果。雖然åªèƒ½å½±éŸ¿ä½¿ç”¨è€…自身,但å°æ–¼æŒ–黑曜石來說的確是好用。 -guide.bloodmagic.entry.architect.seer.info.1=你在修ç†è¡€ä¹‹ç¥­å£‡æ™‚,時常會發覺自己早已迷失在了那些å åœå°è¨˜ç„¡æ³•å¯Ÿè¦ºçš„細節中。所以這就是輪到見解å°è¨˜ç™»å ´çš„時刻了。見解å°è¨˜å¯¦éš›ä¸Šæ˜¯å åœå°è¨˜çš„å‡ç´šç‰ˆï¼Œå®ƒèƒ½çœ‹åˆ°å¾ˆå¤šä½”åœå°è¨˜æ‰€çœ‹ä¸åˆ°çš„細節,諸如祭壇的åˆæˆé€Ÿåº¦ã€ç•¶å‰çš„LP儲é‡ã€åˆæˆé€²åº¦ã€ç”šè‡³çŽ©å®¶è‡ªå·±çš„éˆé­‚網絡的很多信æ¯ï¼Œé€™è£¡å°±ä¸ä½œè´…述了。 -guide.bloodmagic.entry.architect.magicianOrb.info.1=新的祭壇,新的寶ç ã€‚這次,為了你的新玩具,你需è¦ä¸€é¡†æ³•å¸«æ°£è¡€å¯¶ç ã€‚ä¸éŽæœ‰ä¸€é»žè¦æ³¨æ„,åˆæˆæ³•å¸«æ°£è¡€å¯¶ç éœ€è¦2.5è¬LP,但你的祭壇åªæœ‰ä¸€è¬å®¹é‡ã€‚æ›è¨€ä¹‹ï¼Œåœ¨åˆæˆé€™é¡†å¯¶ç æ™‚,你需è¦ä¸æ–·åœ°è£œå……生命精è¯ã€‚所以,在åˆæˆé€™é¡†æ°£è¡€å¯¶ç å‰ï¼Œè«‹å‹™å¿…åšå¥½è¬å…¨çš„æº–å‚™ï¼ -guide.bloodmagic.entry.architect.capacity.info.1=雖然你並ä¸çŸ¥é“具體原ç†ï¼Œä½†é€™å¢žå®¹ç¬¦æ–‡çš„確能給血之祭壇æ供兩åƒçš„é¡å¤–容é‡ã€‚也許,是æŸç¨®å…±æŒ¯å°Žè‡´å®¹ç©ä¸‹é™ï¼Œç„¶å¾Œä½ ä¾¿å¯ä»¥å¾€è£¡é¢è£å…¥æ›´å¤šçš„容器?這樣一想你倒是想到了進一步改進的方法...\n\t這裡有必è¦å†é‡è¤‡ä¸€é,祭壇本身還有用於緩è¡çš„輸入和輸出容器,容ç©å‡ç‚ºä¸»å®¹å™¨çš„110%%。增容符文的效果å°é€™å…©å€‹ç·©è¡å®¹å™¨ä¹Ÿæœ‰æ•ˆã€‚ -guide.bloodmagic.entry.architect.displacement.info.1=默èªï¼Œè¡€ä¹‹ç¥­å£‡çš„ç·©è¡å€å’Œä¸»å®¹å™¨ä¹‹é–“çš„LP轉移速度是最高20LP/s。å°æ–¼é‚£äº›éœ€è¦é »ç¹è½‰ç§»LP的祭壇來說這個速度å¯ä»¥èªªæ˜¯å·¨å¤§çš„瓶頸。這也是為什麼會有轉ä½ç¬¦æ–‡çš„原因。\n\t轉ä½ç¬¦æ–‡å¯æå‡LP轉移的速度。æ¯å€‹ç¬¦æ–‡éƒ½å¯ä»¥å°‡é€Ÿåº¦æ高至原來的1.2å€ï¼Œå¤šå€‹è½‰ä½ç¬¦æ–‡å¯ä»¥ç–ŠåŠ ã€‚æ›è¨€ä¹‹ï¼Œä¸€å€‹è½‰ä½ç¬¦æ–‡å¯ä»¥å°‡é€Ÿåº¦æ高至一次24LP,兩個則為28.8LP,三個/cut則為34.56LP,而20個則會é”到767LP,足以在13秒內清空一座標準祭壇裡所有的生命精è¯ã€‚ -guide.bloodmagic.entry.architect.affinity.info.1=表é¢ä¸Šçœ‹ï¼Œå…ƒç´ å°è¨˜ä¸éŽæ˜¯ä¸€å€‹èƒ½å…ç–«ç«ç„°ã€æººæ°´å’Œæ‘”è½å‚·å®³çš„å°è¨˜ã€‚事實上,它的工作方å¼ä¸¦éžå¦‚此——驅動此å°è¨˜å¾Œï¼Œå®ƒæœƒæ¶ˆè€—汗水(如有必è¦ï¼Œæœƒæ˜¯è¡€ï¼‰ï¼Œç„¶å¾Œåœ¨ä½¿ç”¨è€…身上形æˆä¸€æ ¼ä¿è­·å±¤ï¼Œé€²è€ŒæŠµæ“‹æ„外傷害。\n\t這層空氣護盾å¯ä»¥ç·©è¡ç«ç„°å’Œç†”岩的熱é‡ï¼Œä¹Ÿå¯ä»¥åœ¨å¿…è¦æ™‚æ供空氣以防溺水,åŒæ™‚é‚„å¯ä»¥åœ¨ä¸æ…Žæ‘”è½æ™‚充當無形的氣墊使用。 -guide.bloodmagic.entry.architect.lamp.info.1=人和動物的血液中還是有「雜質ã€çš„。åªéœ€è¦æ”¶é›†ä¸€äº›ç¨€æœ‰æ°£é«”,然後輔以åˆé©çš„熱æºï¼Œå°±å¯ä»¥åœ¨åœ°é¢ä¸Šç”¢ç”Ÿä¸€åœ˜æ˜Žäº®çš„å…‰çƒï¼Œç…§è€€è‘—é è™•çš„大地。\n\t血光å°è¨˜çš„用途有兩個:或直接å°è‘—方塊使用,產生一個光çƒï¼›æˆ–å°è‘—空氣使用,將光çƒç™¼å°„到é è™•ã€‚這些光çƒå’Œç«æŠŠä¸€æ¨£ï¼Œå¯ä»¥ç©ºæ‰‹æ‰“碎。 -guide.bloodmagic.entry.architect.magnetism.info.1=ç£å¼•å°è¨˜å¯å°‡è¡€æ¶²ä¸­çš„éµå…ƒç´ è½‰åŒ–為ç£éµï¼Œé€²è€Œå°‡å°ä»¶ç‰©å“å¸å¼•åˆ°èº«ä¸Šï¼Œå…除原地打轉收集物å“的麻煩。就原ç†ä¾†çœ‹ï¼Œå®ƒæ˜¯çœŸæ­£çš„物å“ç£éµï¼Œå› ç‚ºå®ƒä¸¦éžæ˜¯æŠŠç‰©å“å¸éŽä¾†ï¼Œè€Œæ˜¯çœŸæ­£ç›´æŽ¥æ’¿èµ·é è™•çš„物å“。幸好這ç£éµçš„ç£åŠ›ä¸¦ä¸å¤§ï¼Œä¸ç„¶ç•¶ä½ æ„外地將爬行者以3馬赫的速度å¸éŽä¾†çš„時候一切就都çµæŸäº†ã€‚ - -guide.bloodmagic.entry.architect.peritia.info.1=在這世界上,有æŸäº›è¡Œç‚ºå¯ä»¥ç´¯ç©ä¸€å€‹äººçš„經驗:擊殺怪物ã€æŽ¡æŽ˜ç¤¦çŸ³ã€å†¶ç…‰é‡‘屬ã€çƒ¹é£ªé£Ÿç‰©... åŒæ™‚,一些特殊的奧法設備å¯ä»¥ç›´æŽ¥å¸æ”¶é€™äº›ç¶“驗,並作為其動力使用。因此,若是有一種能存儲經驗的媒介,那就å†å¥½ä¸éŽäº†ã€‚\n\t儘管有很多設備都å¯ä»¥å°‡é€™ç¶“驗轉化æˆç‰©ç†å½¢æ…‹å„²å­˜ï¼Œä½†é€™æœ¬ç¶“驗之書å»æ˜¯ä»¥æ›¸å¯«çŸ¥è­˜çš„æ–¹å¼ï¼Œå°‡ä½ éŽåŽ»æ‰€ç©ç´¯ä¸‹/cut的經驗ä¿å­˜ä¸‹ä¾†ï¼Œä»¥ä¾›æ—¥å¾Œä½¿ç”¨çš„。需è¦çš„時候,åªéœ€è¦æ‰‹æŒé€™æœ¬æ›¸å°±èƒ½è‡ªå‹•å¸æ”¶æ›¸é ä¸­çš„知識,並將其轉化為經驗。\n\t具體來說,這本書是這樣用的:潛行時å³æ“Šå³å¯å°‡ä¸€ç´šç¶“驗存入書中(若有零頭,則先å¸æ”¶é›¶é ­ï¼‰ã€‚平時å³æ“Šä¸€æ¬¡å¯ç›´æŽ¥ç²å¾—一整級經驗。它所存儲的經驗數é‡å¯åœ¨å…¶ä¿¡æ¯æ示中找到。 -guide.bloodmagic.entry.architect.livingArmour.info.1=在這Minecraft的世界中,所有人,尤其是那些新生的人(譯註:應該是指死亡後剛剛é‡ç”Ÿçš„玩家?),都清楚一套好的護甲的é‡è¦æ€§ã€‚通常,護甲的屬性是確定的——護甲的ä¿è­·æ€§èƒ½ã€é£›è¡Œçš„能力ã€è·³èºæˆ–跑步的增幅ã€è«¸å¦‚此類,ä¸å‹æžšèˆ‰ã€‚誠然有這些屬性的護甲是好的,但你從未真正é‡åˆ°éŽä¸€å¥—為你é‡èº«æ‰“造的護甲。至少,ç¾åœ¨æ‰€æœ‰äººéƒ½é€™éº¼èªç‚ºã€‚\n\t而這æŸéˆè­·ç”²ï¼Œå¯¦éš›ä¸Šæ˜¯ä¸€/cut個被鑲入éµç”²ä¸­çš„,經éŽç‰¹æ®Šæ”¹é€ å¾Œçš„活物。穿在身上時,它便會與穿戴者共生——他們將一起移動ã€ä¸€èµ·æ”»æ“Šã€ç”šè‡³åƒæ±è¥¿æ™‚它也會有所感覺。和普通的人體一樣,它也會生長,也會ä¸æ–·åœ°å¼·åŒ–自己,當然也需è¦æŽ¥å—訓練。\n\t先舉個例å­å§ã€‚當你穿上æŸéˆè­·ç”²ï¼Œä¸¦é•·é€”奔襲一段時間後,你會注æ„到æŸéˆèƒ¸ç”²ä¸Šå¤šäº†ä¸€å€‹å為「迅æ·é›™è¶³ã€çš„å‡ç´šã€‚這個å‡ç´šå¯ä»¥æ高你的/cut移動速度,雖然目å‰åªæœ‰ç­‰ç´š1,但畢竟還是å¯ä»¥å‡ç´šçš„。你還會注æ„到它æ“有了「強化點數ã€ï¼Œç›®å‰å¯èƒ½æ˜¯ã€Œ3/100ã€é€™æ¨£å­ã€‚æ¯å€‹å‡ç´šéƒ½éœ€è¦ä¸€å®šçš„強化點數,但護甲å¯ç”¨çš„強化點數有é™ã€‚æ›è¨€ä¹‹ï¼Œè‹¥æ˜¯æ‹¿ä¸å‡ºæŸå€‹å‡ç´šéœ€è¦çš„點數,你是ä¸å¯èƒ½ç²å¾—這個å‡ç´šçš„。\n\t記ä½ä¸€é»žï¼Œåªæœ‰å…¨å¥—æŸéˆè­·ç”²æ‰èƒ½æŽ¥å—訓練,也åªæœ‰å…¨å¥—æŸéˆè­·ç”²æ‰èƒ½ç™¼æ®å…¶æ‡‰æœ‰çš„效果。\n\t/cutæŸéˆè­·ç”²çš„強化點數還是å¯ä»¥è¢«äººç‚ºä¿®æ”¹çš„。有一種方法是利用煉金術增強穿戴者和護甲本身之間的éˆæŽ¥ï¼Œè—‰æ­¤å¤§å¹…æå‡å¼·åŒ–點數的上é™ï¼Œå…¸åž‹ä»£è¡¨ä¾¿æ˜¯ã€Œç¦±å‘Šä¹‹å§‹ã€ï¼Œå¯å°‡ä¸Šé™æå‡è‡³200。關於這些煉金術的產物以åŠè£½é€ éŽç¨‹ï¼Œå»ºè­°åƒé–±æœ¬æ›¸ã€Šç…‰é‡‘術士》一å·ã€‚ -guide.bloodmagic.entry.architect.upgradeTome.info.1=若是æŸéˆè­·ç”²ä¸Šæœ‰ä½ ä¸æƒ³è¦çš„å‡ç´šæ€Žéº¼è¾¦å‘¢ï¼Ÿä½ å¯ä»¥ä½¿ç”¨å為「淨éˆä¹‹éŸ³ã€çš„å„€å¼ä¾†æ¸…洗這些å‡ç´šï¼Œä¸¦ç²å¾—å°æ‡‰çš„「強化手冊ã€ã€‚關於儀å¼çš„細節å¯åƒé–±æœ¬æ›¸ã€Šå„€å¼å¤§å¸«ã€‹å·ã€‚這「強化手冊ã€çš„用途便是,在你身著全套æŸéˆè­·ç”²æ™‚,直接給予護甲å°æ‡‰çš„å‡ç´šã€‚\n\t當然,這強化手冊也å¯ä»¥åœ¨éµç §ä¸­èžåˆâ€”—在éµç §ä¸­å°‡å…©æœ¬ä¸€æ¨¡ä¸€æ¨£çš„手冊èžåˆåœ¨ä¸€èµ·å¯ä»¥ç²å¾—更高一級的手冊。/cut比方說,兩本迅æ·é›™è¶³IIå¯ä»¥èžåˆå‡ºä¸€æœ¬è¿…æ·é›™è¶³III。å°æ–¼æŸéˆè­·ç”²æœ¬èº«ä¾†èªªï¼Œä¹Ÿæœ‰é¡žä¼¼çš„機制,這裡ä¸ä½œè´…述。 -guide.bloodmagic.entry.architect.teleposer.info.1=傳é€å™¨ï¼Œé¡§åæ€ç¾©ï¼Œå¯ä»¥å°‡æŸå€‹ç‰©é«”傳é€è‡³å¦ä¸€å€‹åœ°é»žï¼Œä½†é€™å€‹å‚³é€å™¨ä¸åƒ…å¯ä»¥å‚³é€ç”Ÿç‰©ï¼Œé‚„能傳é€æ–¹å¡Šã€‚完整的傳é€è£ç½®éœ€è¦å…©å€‹å‚³é€å™¨å’Œä¸€å€‹å‚³é€æ ¸å¿ƒã€‚其中,一個傳é€å™¨å……當目的地,å¦ä¸€å€‹å‚³é€å™¨å……當出發地。\n\t在使用傳é€å™¨ä¹‹å‰éœ€è¦ä¸€äº›é…置。首先,你需è¦å³æ“Šå‚³é€æ ¸å¿ƒå°‡ä½ èˆ‡å…¶ç¶å®šã€‚然後,手æŒæ ¸å¿ƒå³æ“Šå……當目的地的傳é€å™¨ä»¥è¨˜éŒ„相關信æ¯ã€‚最終,/cut把這個記錄了目的地信æ¯çš„傳é€æ ¸å¿ƒé€éŽå…¶GUI放入充當始發地的傳é€å™¨å³å¯ã€‚\n\t然後,給予始發地的傳é€å™¨ä¸€å€‹ç´…石信號(準確地說,是強充能),這個傳é€å™¨å°±æœƒå°‡å¯¦é«”和方塊(如果是箱å­é€™æ¨£å¸¶ç‰¹æ®Šæ•¸æ“šçš„方塊,一併ä¿ç•™ï¼‰ä¸€è‚¡è…¦å…¨éƒ¨å‚³é€éŽåŽ»â€”—這個éŽç¨‹ä¸­æˆ‘們å‡å®šç›®çš„地是有傳é€å™¨çš„。\n\t當然,你å¯ä»¥åªè®“一個傳é€å™¨/cut有核心,抑或兩個傳é€å™¨äº’相éˆæŽ¥ï¼Œæˆ–者更多傳é€å™¨å½¢æˆä¸€æ¢éˆï¼Œè—‰æ­¤å½¢æˆæ›´è¤‡é›œçš„系統。\n\tä¸éŽè¦è¨˜ä½ä¸€é»žï¼Œå‚³é€å™¨åªå‚³é€å…¶ä¸Šæ–¹çš„方塊,ä¸éŽå‚³é€çš„範åœæ˜¯ç”±å‚³é€æ ¸å¿ƒæ±ºå®šçš„——T1的傳é€æ ¸å¿ƒåªèƒ½å‚³é€ä¸€å€‹æ–¹å¡Šï¼Œè€ŒT2傳é€æ ¸å¿ƒå‰‡èƒ½å‚³é€3x3x3的方塊,以此類推。 -guide.bloodmagic.entry.architect.boundBlade.info.1=æŸç¸›ä¹‹åŠæ˜¯ä¸€æŠŠç”¨è£½ä½œæŸéˆè­·ç”²çš„æ–¹å¼è£½ä½œå‡ºä¾†çš„åŠï¼Œå¯ä»¥èªªå·²æœ‰å¾ˆé•·æ­·å²äº†ã€‚ä¸éŽæœ‰ä¸€é»žè¦æ³¨æ„,包括æŸç¸›ä¹‹åŠåœ¨å…§çš„å„種æŸç¸›å·¥å…·çš„設定,在未來都有å¯èƒ½æœ‰è®Šå‹•ã€‚\n\t這把åŠæœ‰é©…動模å¼å’ŒæŠ‘制模å¼ï¼Œæ½›è¡Œæ™‚å³æ“Šå³å¯åˆ‡æ›ã€‚在抑制狀態下它並ä¸æœƒé€ æˆä»»ä½•å‚·å®³ï¼Œä½†æ˜¯åœ¨é©…動模å¼ä¸‹å®ƒæ˜¯æœƒæ¶ˆè€—LP的。åŒæ¨£çš„,你å°æ€ªç‰©é€ æˆå‚·å®³æ™‚,也會消耗LP。所以,在你殺死怪物的時候,/cut這把åŠä¹Ÿæœ‰å¯èƒ½æ®ºæ­»ä½ ï¼\n\t然而,用這把åŠæ®ºæ­»æ€ªç‰©æ™‚,會有那麼一點概率ç²å¾—虛弱氣血碎片——這個碎片便是將祭壇å‡ç´šè‡³å››ç´šçš„é—œéµã€‚ -guide.bloodmagic.entry.architect.boundTool.info.1=å’ŒæŸç¸›ä¹‹åŠä¸€æ¨£ï¼ŒæŸç¸›å·¥å…·ï¼ˆåŒ…括鎬ã€æ–§å’Œé¬ï¼‰çš„屬性在未來也會有所變動。和æŸç¸›ä¹‹åŠä¸€æ¨£ï¼ŒæŸç¸›å·¥å…·æœ‰å…©å€‹æ¨¡å¼ï¼Œåˆ‡æ›æ–¹å¼åŒæŸç¸›ä¹‹åŠï¼Œä¹Ÿæ˜¯æ½›è¡Œæ™‚å³æ“Šã€‚\n\tå’ŒæŸç¸›ä¹‹åŠä¸åŒï¼ŒæŸç¸›å·¥å…·æ“有「野ç¸æ¨¡å¼ã€ã€‚手æŒå·¥å…·å³éµæŒ‰ä½ä¸å‹•å³å¯è“„力,蓄力çµæŸå¾Œå·¥å…·æœƒæ”¾å‡ºä¸€è‚¡å·¨å¤§çš„能é‡ï¼Œå¤§ç¯„åœç ´å£žæ–¹å¡Šï¼Œæœ€é«˜å¯é”11x11x11,但åŒæ™‚也有驚人的消耗:一è¬LP。因此,使用時一/cut定è¦å°å¿ƒè¬¹æ…Žï¼Œå› ç‚ºæžä¸å¥½é€™å°±æ˜¯ä½ æœ€å¾Œä¸€æ¬¡ä½¿ç”¨é€™äº›å·¥å…·ï¼ -guide.bloodmagic.entry.architect.weakShard.info.1=任何有生命的æ±è¥¿ï¼Œéƒ½æœ‰ä¸€å±¤çœ‹ä¸è¦‹ï¼Œæ‘¸ä¸è‘—çš„éˆæŽ¥ï¼Œé€™å€‹ç¾è±¡è¢«ç¨±ä½œéˆé­‚網絡。實è¸è­‰æ˜Žï¼Œè«¸å¦‚å°è¨˜å’Œå„€å¼é€™æ¨£çš„æ±è¥¿ä¹Ÿæ˜¯å¯ä»¥æœ‰éˆæŽ¥çš„,然而這些éˆæŽ¥çš„來æºä¾¿æ˜¯æ“有最強éˆæŽ¥çš„生物——人類。\n\t用æŸç¸›ä¹‹åŠæ”»æ“Šç”Ÿç‰©æ™‚,那些å¯æ†ç”Ÿç‰©çš„一部分éˆé­‚網絡會直接硬化,在它們死後也å¯ä¿æŒå…¶å½¢ç‹€ã€‚這部分éˆé­‚網絡便以虛弱氣血碎片的形å¼ç¾èº«æ–¼ä¸–,它們因其é¡è‰²èˆ‡è™›/cut弱氣血寶ç ç›¸è¿‘而得å。\n\t雖然,至今ä»æœªæ‰¾åˆ°å­˜åœ¨æ›´å¼·çš„氣血碎片的證據,但是你至少知é“,這些碎片å°æ–¼å¢žå¼·ä½ è‡ªå·±çš„éˆé­‚網絡肯定有幫助。 -guide.bloodmagic.entry.architect.masterOrb.info.1=如何利用這種å°éˆé­‚網絡å分親和的特性呢?答案是:用虛弱氣血碎片打造全新的氣血寶ç â€”—導師氣血寶ç ã€‚它å¯ä»¥æ供一百è¬LP的上é™ï¼Œå®ƒå¯ä»¥å¾¹åº•è§£æ”¾ä½ å°è¡€é­”法的想åƒåŠ›ã€‚也許,就算是隕石,也無法阻擋你的å‰é€²äº†å§... -guide.bloodmagic.entry.architect.runeOrb.info.1=看上去這個符文並沒什麼用途。但是,這寶ç ç¬¦æ–‡å¯ä»¥æ高那些放入血之祭壇中填充的寶ç çš„容é‡ä¸Šé™ï¼Œæ¯å¡Šç¬¦æ–‡éƒ½å¯ä»¥æå‡ç™¾åˆ†ä¹‹äºŒã€‚å°æ–¼è™›å¼±æ°£è¡€å¯¶ç ï¼Œé€™æ˜¯å¾®ä¸è¶³é“çš„100LP。而å°æ–¼å°Žå¸«æ°£è¡€å¯¶ç ï¼Œé€™æ˜¯å…©è¬LP的增幅,效果å分顯著ï¼å¦‚果你的祭壇上還有空ä½çš„話,這個符文興許就是你的首é¸ã€‚ -guide.bloodmagic.entry.architect.suppression.info.1=抑液å°è¨˜ï¼ŒæŽ¡ç”¨å’Œå‚³é€å™¨ä¸€æ¨£çš„傳é€ç§‘技,å¯ä»¥è®“一定範åœå…§çš„液體瞬間消失。準確地說,是é€å…¥å¦ä¸€å€‹è¿·ä½ ç¶­åº¦ä¸­ã€‚ä¸å¹¸çš„事,因為傳é€ç§‘技的é™åˆ¶ï¼Œæ¶²é«”還是會回來的——比如說,在使用者走éŽæœ¬æ˜¯æ¶²é«”çš„å€åŸŸå¾Œã€‚ä¸éŽé€™ç„¡å‚·å¤§é›…,畢竟ä¸è«–是在水下行走,還是在下界的熔岩之海上漫步,這å°è¨˜éƒ½æ˜¯å分好用的。 -guide.bloodmagic.entry.architect.haste.info.1=人體能消化的物質中有兩種å分有趣:糖和咖啡因。å‰è€…是能é‡å„²å‚™ï¼Œå¾Œè€…å¯ä»¥ä»¤äººä¿æŒæ¸…醒。這急速å°è¨˜ï¼Œä¾¿å¯ä»¥é€šéŽæ¨¡æ“¬åŒ–å­¸å應的方å¼ï¼Œé‡‹æ”¾æ›´å¤šçš„化學能,進而æå‡å°è¨˜ä½¿ç”¨è€…的移動能力。\n\tå°è¨˜é©…動後,使用者會跑得更快,跳得更高,åŒæ™‚還會令玩家在ä¸ç”¨è·³èºçš„情æ³ä¸‹è·¨è¶Šæ¯”較高的障礙(實際上是個改良版本的自動跳èºï¼‰ã€‚ -guide.bloodmagic.entry.architect.severance.info.1=人們至今無法解釋傳é€çš„機制。多數情æ³ä¸‹ï¼Œå‚³é€è¢«èªç‚ºæ˜¯æ™‚空扭曲的一種表ç¾å½¢å¼ï¼Œç‰©é«”å¯é€šéŽå…©å€‹ä¸åŒæ™‚空的éˆæŽ¥ä¾†å¯¦ç¾çž¬é–“移動。而這絕影å°è¨˜å¯ä»¥é˜»æ­¢æ™‚空扭曲的產生,從而阻止啟動此å°è¨˜çš„玩家附近的生物發動傳é€æŠ€èƒ½ã€‚當然這個å°è¨˜ä¸¦ä¸èƒ½é˜»æ­¢è«¸å¦‚傳é€é–€ä¹‹é¡žçš„æ±è¥¿ï¼Œä½†é˜»æ­¢é¡žä¼¼æœ«å½±äººé€™æ¨£çš„生物還是å¯ä»¥çš„。 -guide.bloodmagic.entry.architect.teleposition.info.1=傳é€å°è¨˜å¯¦éš›ä¸Šæ˜¯å€‹è‡ªå¸¶å‚³é€æ ¸å¿ƒçš„傳é€å™¨ã€‚å°æŸå€‹å‚³é€å™¨ä½¿ç”¨æ­¤å°è¨˜ï¼Œå°è¨˜æœƒè¨˜ä¸‹é€™å€‹å‚³é€å™¨çš„ä½ç½®ï¼Œå†æ¬¡ä½¿ç”¨å°è¨˜å°±å¯ä»¥ç›´æŽ¥å‚³é€åˆ°é‚£è£¡åŽ»äº†ã€‚然而它好åƒæ²’給你返程票... -guide.bloodmagic.entry.architect.compression.info.1=礦工經常é¢å°çš„一個情æ³ä¾¿æ˜¯ï¼Œå®ƒçš„背包中充滿了紅石粉ã€é’金石ã€ä»¥åŠå„種亂七八糟的æ±è¥¿ã€‚雖然å¯ä»¥å£“縮,但是並éžæ‰€æœ‰ç¤¦å·¥éƒ½æœƒéš¨èº«æ”œå¸¶å·¥ä½œå°ã€‚\n\t壓擠å°è¨˜æ‰€å‰µé€ çš„å°åž‹å£“縮力場å¯ä»¥å°‡å„種物å“壓縮起來,進而節約背包空間。具體來說是這樣:如果你有63份紅石粉,å°è¨˜ä¸æœƒæœ‰æ•ˆæžœï¼›ä½†å¦‚果你有64份紅石粉,它就會將其中63份壓縮æˆ7個紅石塊。雖/cut然並沒騰出新的格å­ï¼Œä½†æ˜¯åˆ¥å¿˜äº†é‚£å€‹ä½”了一個格å­çš„紅石粉是å¯ä»¥æŽ¥è‘—放紅石的。這個å°è¨˜å°å…¶ä»–Modçš„é¡žä¼¼æ±è¥¿ä¹Ÿæ˜¯æœ‰æ•ˆæžœçš„。 -guide.bloodmagic.entry.architect.bridge.info.1=影橋å°è¨˜å¯ä»¥å°‡ä½¿ç”¨è€…腳下的空氣固化æˆå¯ä»¥è¡Œèµ°çš„é“路,或者說,幻化出一座幻影之橋。若是你ä¸æ…Žè¸©ç©ºï¼Œå½±æ©‹æœƒç›´æŽ¥åœ¨ä½ è…³ä¸‹å‡ºç¾ï¼Œé¿å…åš´é‡çš„摔傷。儘管在使用å‰éœ€è¦ä¸€äº›æ¸¬é‡å·¥ä½œï¼ŒåŒæ™‚影橋出ç¾ä¹Ÿæœƒé€ æˆå»¶é²ï¼Œå®ƒä»ä¸å¤±ç‚ºä¸€ç¨®ã€Œé£›è¡Œã€çš„好方法。 -guide.bloodmagic.entry.architect.mimic.info.1=擬態是一種å¯ä»¥æ¨¡ä»¿ä»»æ„給定çµæ§‹çš„魔法çµæ§‹ã€‚它本身å¯ä»¥æ ¹æ“šå…¶ç¢°åˆ°çš„方塊,改變自身的分å­çµæ§‹ï¼Œå¾žè€Œä½¿å…¶æœ¬èº«çœ‹èµ·ä¾†éƒ½æ˜¯å¦‚å‡åŒ…æ›ä¸€æ¨£ã€‚但,並éžæ‰€æœ‰çš„屬性都å¯ä»¥è¤‡è£½ï¼šæ¯”如說,普通的擬態方塊變æˆèž¢çŸ³å¾Œä¸èƒ½ç™¼å…‰ã€‚\n\t一般,擬態方塊有兩種用法。第一種,先放置擬態方塊,然後手æŒè¦å½è£çš„方塊å°è‘—擬態方塊å³æ“Šã€‚這樣,被å½è£çš„方塊就直接進入擬態方塊的內/cut部,擬態方塊也就å¯ä»¥å½è£äº†ã€‚ä¸éŽï¼Œé€™å€‹æ–¹æ³•åªèƒ½å½è£ä¸€å€‹æ–¹å¡Šçš„「默èªã€å½¢ç‹€ã€‚舉個例å­ï¼Œæ­¤æ³•å½è£çš„樓梯都是æœåŒä¸€å€‹æ–¹å‘的。\n\t第二種,直接å°è‘—æŸå€‹æ–¹å¡Šä½¿ç”¨æ“¬æ…‹æ–¹å¡Šã€‚若如此åšï¼Œæ“¬æ…‹æ–¹å¡Šä¾¿å¯ä»¥åšåˆ°ç²¾ç¢ºå½è£ã€‚還是剛æ‰æ¨“梯的例å­ï¼Œé€™æ¨£å½è£çš„樓梯就會很自然,因為方å‘被ä¿ç•™äº†ä¸‹ä¾†ã€‚\n\t事實上,擬態方塊的變種有很/cut多。默èªçš„ä¸é€æ˜Žæ“¬æ…‹æ–¹å¡Šå¯ä»¥æ¨¡ä»¿å½¢ç‹€å’Œæ–¹å¡Šçš„大多數屬性,但光是無法照éŽåŽ»çš„。懸幽擬態方塊沒有碰撞箱,é©åˆè£½ä½œéš±è—門。清é€æ“¬æ…‹æ–¹å¡Šå¯ä»¥è§£æ±ºçŽ»ç’ƒçš„擬態å•é¡Œï¼šå…‰ç·šå¯ä»¥ç„¡è¦–被å½è£çš„方塊的屬性,穿é€é€™ç¨®æ“¬æ…‹æ–¹å¡Šã€‚最後,還有一種光亮擬態方塊,ä¸è«–何時它都會發光。終於ä¸ç”¨ç«æŠŠäº†ï¼\n\t其實還有一種特殊的擬態方塊:感知擬態方塊。如果有玩/cut家接近,它們就會å‘其發動猛烈攻擊。這種方塊å¯åœ¨å¾ˆå¤šåœ°æ–¹æ‰¾åˆ°ï¼Œå°¤å…¶æ˜¯åœ°ç‰¢ä¸­ã€‚所以說,如果有一個感知擬態方塊å½è£æˆäº†ç®±å­ï¼Œè«‹è¨˜ä½ï¼šå®ƒå€‘會咬人。\n\t***創造模å¼é™å®šå…§å®¹***\n\t在創造模å¼ä¸‹ï¼Œæ“¬æ…‹æ–¹å¡Šæœƒå¤šå‡ºä¾†ä¸€äº›æœ‰è¶£ç‰¹æ€§ã€‚用藥水或藥劑瓶å³æ“Šæ“¬æ…‹æ–¹å¡Šå¾Œï¼Œå¯ä»¤å…¶åœ¨æœ‰çŽ©å®¶åœ¨é™„近時產生å°æ‡‰çš„藥水效果。如果這是/cut普通的擬態方塊,那麼:點擊æ±é¢/西é¢å¯ä»¥åŠ /減藥水效果的覆蓋範åœï¼›é»žæ“ŠåŒ—é¢/å—é¢å¯ä»¥åŠ /減玩家的檢測範åœï¼›é»žæ“Šä¸Šé¢/下é¢å¯ä»¥æ高/é™ä½Žè—¥æ°´ç”Ÿæˆé–“隔,å³æ¯éš”多久生æˆä¸€æ¬¡è—¥æ°´æ•ˆæžœã€‚\n\t如果你在é¢å°ä¸€å€‹æ„ŸçŸ¥æ“¬æ…‹æ–¹å¡Šï¼Œä½ å¯ä»¥éš¨æ„點擊這個擬態方塊,以改變其檢測玩家的範åœâ€”—如果玩家在檢測範åœä¸­ï¼Œä¸¦ä¸”å¯ä»¥çœ‹åˆ°é€™å€‹æ“¬æ…‹æ–¹å¡Šï¼Œæ“¬æ…‹æ–¹å¡Šæœƒç›´æŽ¥å‡ºç¾åœ¨çŽ©/cut家眼å‰ã€‚\n\tå¦å¤–,如果玩家在創造模å¼ä¸‹å°‡è¦å½è£çš„方塊放入擬態方塊中,這個方塊ä¸æœƒåœ¨æ“¬æ…‹æ–¹å¡Šè¢«ç ´å£žå¾ŒæŽ‰è½ã€‚\n\t最後的最後,如果擬態方塊å½è£çš„是一個è£è‘—æ±è¥¿çš„ç®±å­æˆ–別的什麼容器:å°æ–¼æ„ŸçŸ¥æ“¬æ…‹æ–¹å¡Šï¼Œåœ¨å®ƒæ•—北後會把箱å­é€£åŒå…§å®¹ä¸€å¡Šæ”¾å›žä¾†ï¼›å°æ–¼å…¶ä»–擬態方塊,它會在被擊潰時把物å“撒一地。 -guide.bloodmagic.entry.architect.downgrade.info=就護甲é™ç´šçš„內容,我建議你閱讀《儀å¼å¤§å¸«ã€‹å·çš„「沉é‡éˆé­‚的懺悔ã€ä¸€ç« ï¼Œåœ¨é‚£è£¡ä½ å¯ä»¥å¾—到更詳細的解釋。 - -guide.bloodmagic.entry.architect.augmentedCapacity.info=和增容符文類似,超容符文也å¯ä»¥æå‡ç¥­å£‡çš„容é‡ã€‚但和增容符文ä¸åŒï¼Œå¤šå¡Šè¶…容符文會之間的共鳴會讓容ç©å‘ˆæŒ‡æ•¸ç´šå¢žé•·ã€‚具體來說,是åšä¹˜æ³•ï¼šæ¯ä¸€å¡Šè¶…容符文都會給予é¡å¤–10%%的容ç©ï¼›æ›è¨€ä¹‹ï¼Œå…©å¡Šå³21%%的增長,三塊å³33.1%%的增長,以此類推。\n\t然而,超容符文的效果ä¸èˆ‡å¢žå®¹ç¬¦æ–‡ç–ŠåŠ ï¼Œæ›è¨€ä¹‹ï¼Œä¸è«–有多少超容符文,æ¯å¡Šå¢žå®¹ç¬¦æ–‡éƒ½åªæ供兩åƒLP容é‡ã€‚ -guide.bloodmagic.entry.architect.charging.info=有那麼一些æ±è¥¿å°æ–¼åˆæˆå¾ˆæœ‰å¹«åŠ©ï¼Œè€Œé€™å……能符文便是其中之一:它å¯ä»¥å¸æ”¶ LP,並將 其轉化為「充能點數ã€ï¼Œå…·é«”數é‡å¯ç”¨è¦‹è§£å°è¨˜çœ‹åˆ°ã€‚若是åˆæˆæŸäº›ç‰©å“正好需è¦ä¸€å®šé‡çš„充能點數,那麼這充能符文就å¯ä»¥ä»¥æ¶ˆè€—充能點數為代價,將物å“立刻åˆæˆå‡ºä¾†ã€‚若沒有足夠的充能點數,它就åªæœƒæŒ‰ä¸€æ¯”一的比例直接將充能點數轉化為 LP 以加速 å…¶åˆæˆã€‚\n\t/cut血之祭壇最多å¯å­˜å„²çš„充能點數數é‡æ˜¯å……能符文的數é‡ä¹˜ä»¥ç¥­å£‡çš„容ç©ï¼Œå…¶ä¸­å®¹ç©éœ€è¦è‡³å°‘為兩è¬æ‰æœ‰æ•ˆæžœã€‚血之祭壇充能的速度也是和充能符文數é‡ä»¥åŠå…¶æœ¬èº«çš„速度æˆæ­£æ¯”的(å³ï¼Œå……能速度=符文數é‡*祭壇本身åˆæˆé€Ÿåº¦ï¼‰ï¼Œæ¯ä¸€ç§’å®ƒéƒ½æœƒå°‡ä¸€å®šé‡ LP 轉化為充能點數。所以,如果你的祭壇中有這塊符文,åˆç†çš„設計將會使你事åŠåŠŸå€ã€‚ -guide.bloodmagic.entry.architect.acceleration.info=和大多數符文ä¸åŒï¼Œä¿ƒé€²ç¬¦æ–‡éœ€è¦å’Œåˆ¥çš„符文æ­é…使用,而且它的效果ä¸æ˜¯ç„¡é™åˆ¶å¢žé•·çš„。這個符文的效果是,它å¯ä»¥è®“æŸäº›ç¬¦æ–‡çš„工作頻率變高,比如說,轉ä½ç¬¦æ–‡å’Œå……能符文。具體來說,æ¯æœ‰ä¸€å€‹é€™å€‹ç¬¦æ–‡ï¼Œè·é›¢ä¸‹ä¸€æ¬¡å·¥ä½œçš„等待時間就減一刻。æ›è¨€ä¹‹ï¼šå¦‚果有10塊促進符文,轉ä½ç¬¦æ–‡æœƒæ¯10刻就轉移一次液體,而默èªå€¼å»æ˜¯æ¯20刻。\n\t顯然,你的祭壇中åªå¯èƒ½æœ‰19/cut塊促進符文——在這種情æ³ä¸‹ï¼Œè½‰ä½ç¬¦æ–‡å’Œå……能符文就會一刻ä¸åœåœ°å·¥ä½œã€‚éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸éžå¸¸å¥½ï¼ - -# Demon Kin Entries -guide.bloodmagic.entry.demon.intro=è²æ‹‰Â·æµ·æ³Šæ© -guide.bloodmagic.entry.demon.snare=惡魔æ„志與投網 -guide.bloodmagic.entry.demon.forge=ç„ç«ç†”çˆ -guide.bloodmagic.entry.demon.petty=å¾®å°çš„地ç„魂石 -guide.bloodmagic.entry.demon.sword=æ„ŸçŸ¥ä¹‹åŠ -guide.bloodmagic.entry.demon.lesser=å°åž‹åœ°ç„魂石 -guide.bloodmagic.entry.demon.reactions=æ„料之外的å應 -guide.bloodmagic.entry.demon.sentientGem=感知護甲 -guide.bloodmagic.entry.demon.routing=物å“路由 -guide.bloodmagic.entry.demon.aura=惡魔éˆåŸŸ -guide.bloodmagic.entry.demon.types=ä¸åŒç¨®é¡žçš„æ„å¿— -guide.bloodmagic.entry.demon.crucible=惡魔å©å  -guide.bloodmagic.entry.demon.crystallizer=惡魔çµæ™¶å£‡ -guide.bloodmagic.entry.demon.cluster=惡魔晶簇 -guide.bloodmagic.entry.demon.pylon=惡魔導能塔 -guide.bloodmagic.entry.demon.gauge=éˆåŸŸæ¸¬é‡å„€ - -# Demon Kin Entry Texts -guide.bloodmagic.entry.demon.intro.info=我的åå­—å«è²æ‹‰Â·æµ·æ³Šæ©ï¼Œä»¥æƒ¡é­”使者的身份被知曉。數個月å‰æˆ‘的家鄉被一群惡魔侵襲,其他æ‘民全部被殺,房屋全被破壞。我無法記起襲擊時的多少細節,除了我所èªè­˜çš„æ¯ä¸€å€‹ï¼Œä¼´éš¨è‘—痛苦的慘å«è€Œå‰å¾€ä¸€å€‹æ›´ç¾Žå¥½çš„世界的人們。慶幸那些惡魔沒有è½åˆ°ï¼Œé‚£åœ¨ä¸å®¹æ˜“察覺的教堂的地下室裡,ç•ç¸®æ–¼æžœç±ƒä¸‹çš„我絕望地é¿å…著自己的尖å«è²åŠ å…¥çœ¾äººçš„åˆè²ã€‚\n\t/cutå¯æ€•çš„瞬間,在我ä¸æ…Žæ’žå€’å ‚çš„ç†é¦™ç¥­å£‡æ™‚,一隻惡魔çªç„¶é—–å…¥è–所,或許是這è–地的原由åˆéŽ®éœä¸‹ä¾†ã€‚這是åªé«”åž‹é¾å¤§çš„四足怪物,彎曲的ç ç‰™å€’懸在çªå‡ºçš„嘴上,唾液滴在帶有鋸齒的åŠç‹€çˆªå­ã€‚它環顧了四周,我發誓有那麼一會它的眼ç›å’Œæˆ‘å°ä¸Šäº†ï¼Œä½†ä¹‹å¾Œå®ƒå°±é€™éº¼é›¢é–‹é€™è£¡ï¼Œå½·å½¿å®Œå…¨æ²’有看到或者è½åˆ°ä»€éº¼ã€‚之後發生的事記憶全都模糊ä¸æ¸…。\n\t/cut直到第二天æ‰æœ‰äººç¶“éŽçœ‹åˆ°é€™ä¸€åˆ‡ã€‚這一商隊看到é è™•çš„濃煙,決定繞一大段路好é¿é–‹é€™äº›æƒ¡é­”。商隊中許多人覺得我ç¨è‡ªä¸€äººæ¯«é«®ç„¡æ地生還興許是個壞兆頭,有些甚至ä¸é¡˜å¤šçœ‹æˆ‘一眼。但有一å°å…„弟åŒæƒ…我的é­é‡ï¼Œä¸¦ç›¡åŠ›èªªæœå•†éšŠå…¶ä»–æˆå“¡ä¹Ÿå¸¶ä¸Šæˆ‘。我賣掉了女祭å¸ä¹‹ä»—與一æ¢ç›’å¼æŽ›å¢œï¼Œè—‰æ­¤æ›åˆ°äº†è·Ÿè‘—å‰å¾€ä¸€å€‹é é›¢æƒ¡é­”破壞路徑上的一個安全æ‘莊的許å¯ã€‚ -guide.bloodmagic.entry.demon.snare.info.1=曾有一天,馬格斯曾å°æˆ‘講述é“,世間生éˆçš†æœ‰éˆé­‚:人類,雞,羊,甚至是爬行者也存在這種給予軀體生之æ„志的生命力é‡ã€‚似乎馬格斯早已在這方é¢åšéŽå¤§é‡å¯¦é©—,甚至有èžä¸€å€‹å¼·å¤§çš„法師,å¯ä»¥å°‡ç²å–這些éˆé­‚並注入一個空的軀體,比如殭å±ã€‚但這也讓我感到好奇:如果殭å±èˆ‡éª·é«ä¸¦ä¸æ“有éˆé­‚,它們如何æ“有這生的æ„志?是什麼,給予他們生氣,使他們會去追æ•ä¸¦æ®ºå®³ç”Ÿéˆï¼Ÿ\n\t/cutæ¯æ¯é‘½ç ”最終還是回到了æ„å¿—çš„å•é¡Œä¸Šã€‚任何「活物ã€éƒ½å¿…é ˆæ“有使之生存下去的æ„志,但這ä¸æ„味著那必須是它們自己的。當我把這個想法告訴馬格斯的時候他考慮了一會,接著拿出一個黑æ¿å’Œç²‰ç­†ï¼ˆå¾žå“ªï¼Ÿèª°çŸ¥é“呢),開始速寫並注上一些關於其他形å¼é­”法的註解。「在秘術學中,ã€ä»–畫出一隻稻è‰äººçš„形態並說é“,「分é…於執行許多簡單æ“作的傀儡被賦予了生氣。它們活著,呼å¸è‘—,甚至å¯ä»¥æ­»æ–¼ä¸/cutå†éœ€è¦å®ƒå€‘的主人。幾個世紀以來,伴隨著秘術學的進化,這門è—術已經有éŽæ•¸å€‹ç‰ˆæœ¬ï¼Œæ³•å¸«æœƒå°‡ä»–們的æ„志注入那無生命的創造物中,給他們帶來生氣。\n\t「那麼,è²æ‹‰ï¼Œå‚€å„¡æ˜¯å¦‚何é‹ä½œçš„呢:通éŽæ„å¿—çš„çŒè¼¸ã€‚ã€\n\t所以如果å¯ä»¥é€šéŽä»–人將其æ„志注入一個空殼å¯ä»¥ä½¿å‚€å„¡ç²å¾—生命,那麼就有å¯èƒ½æœ‰ä»€éº¼æŠŠä»–們的æ„志注入亡者/cut的軀體,使得有了殭å±å’Œéª·é«çš„存在。想到這我打了個哆嗦,腦中閃éŽæ•…鄉的é­é‡ã€‚åªæœ‰æƒ¡é­”會åšåˆ°é€™éº¼æ®˜å¿çš„事。但è¦æª¢é©—這個å‡è¨­ï¼Œæˆ‘需è¦æ›´å¤šè­‰æ“šã€‚ -guide.bloodmagic.entry.demon.snare.info.2=在馬格斯的指引,和æ比略百忙之中抽出時間為我æ供的幫助下,我用éµã€ç·šå’Œä¸€é»žç´…石便åšå‡ºäº†åŽŸå§‹æŠ•ç¶²ã€‚身兼秘術使的æ比略說這玩æ„å¯ä»¥åˆ‡æ–·æŽ§åˆ¶ç”Ÿç‰©çš„æ„志。「我拿這玩æ„在傀儡上瞎æžã€ï¼Œä»–帶著微笑這樣說é“。我們都知é“çµæžœæ˜¯ä»€éº¼æ¨£çš„。\n\t「紅石似乎切斷了我的æ„志和傀儡之間的è¯ç¹«ã€‚ç†è«–上來說,如果殭å±å’Œéª·é«èº«ä¸Šä¹Ÿæœ‰æ„志,那這投網也å¯ä»¥åˆ‡æ–·ã€‚ã€\n\t/cut他說我åªéœ€è¦çž„準目標把投網丟éŽåŽ»å°±å¯ä»¥â€”—如果å¥æ•ˆï¼Œæˆ‘就能在目標生物上看到一些白色的顆粒。「然後你需è¦æŠŠé‚£å€‹å¯æ†çš„目標殺死æ‰èƒ½çœ‹åˆ°çœŸç›¸ã€‚但記ä½ï¼Œå¤§æ¦‚åªæœ‰å››åˆ†ä¹‹ä¸€çš„投網會å°ç›®æ¨™æœ‰æ•ˆæžœã€‚所以記得多備一些ï¼ã€\n\t我製作了å六個投網,然後我é¸æ“‡åœ¨æ·±å¤œå‡ºç™¼ã€‚事實上,這項工作相當棘手:è¦åŒæ™‚追蹤幾個殭å±ï¼Œé‚„è¦é–ƒé¿å®ƒå€‘çš„é‡æ“Šï¼Œé‚„è¦çž„準它們丟出投網。/cut當我看到白色的顆粒時,我迅速將殭å±å€‘悉數斬殺,並清點了它們留下的物å“。沙地上一些è—色的粘稠液體å¸å¼•äº†æˆ‘的注æ„。我撿起來看了一下,這似乎是一種超凡脫俗的存在...在快速收集好樣本後我決定先返回å†ä½œé€²ä¸€æ­¥ç ”究。\n\tæ¯ä¸€ä»½æ”¶é›†åˆ°çš„「惡魔æ„å¿—ã€çš„形狀和大å°éƒ½ä¸ç›¡ç›¸åŒï¼Œä¼¼ä¹Žå–決於它們的來æºã€‚æ‹‹é–‹å–®ä½ä¸è«‡ï¼Œåªåšç²—略的定/cuté‡åˆ†æžçš„話,它們的å“質å¯ä»¥æŒ‰0到5來劃分。我並ä¸æ˜¯å¾ˆæ¸…楚這些物質å¯ä»¥ç”¨ä¾†å¹¹ä»€éº¼ï¼Œä½†æ¯«ç„¡ç–‘å•å®ƒå€‘引起了我的注æ„。我也ä¸æ˜¯å¾ˆæ¸…楚這究竟是惡魔的å°è¨˜ï¼ŒæŠ‘或僅是它們身上掉è½çš„æŸç¨®æ™¶é«”。我需è¦é€²ä¸€æ­¥çš„研究。 -guide.bloodmagic.entry.demon.forge.info.1=我已在惡魔æ„志上投入了數星期的時間。雖然有所進展,但情æ³ä¾èˆŠæ™‚好時壞。但有一天,æ比略å•æˆ‘能å¦å€Ÿç”¨ä¸€é»žæƒ¡é­”æ„志來åšå¯¦é©—;他解釋說,這很有å¯èƒ½æ˜¯ä»–一直在尋找的新一代血之祭壇的æ料——馬格斯原本的祭壇已經破舊ä¸å ªï¼Œä½†æŒ‰å¤æ³•è£½ä½œçš„祭壇å»æ€Žéº¼ä¹Ÿç„¡æ³•ä½¿ç”¨...總而言之,他覺得我能幫上忙。\n\t事實證明他是å°çš„。我查閱了很多討論「等價交æ›ã€ä»¥åŠ/cut物質嬗變的煉金術書ç±ï¼›åŒæ™‚我還咨詢了一些途經我們這裡的煉金術師,他們也慷慨地給了我一些解構物質和能é‡çš„方法,以便進行深入研究。(啊,我必須承èªæˆ‘å分喜歡那些煉金術師的暗紫色盔甲——å€å€çœ‹ä¸€çœ¼å°±æœƒè®“人感覺è¦è¢«ä¸€å€‹è³ªé‡å·¨å¤§çš„æ±è¥¿æ‹‰éŽåŽ»ä¸€æ¨£ã€‚啊我沒在說æ比略ï¼ï¼‰æˆ‘利用僅有的簡易煉金陣列以åŠæ¥µå°‘é‡æ¨£æœ¬ä¾¿æˆåŠŸå¾žæƒ¡é­”æ„志中抽å–到了能é‡ã€‚剩下的事情就åªæœ‰åˆé©çš„構造了。 -guide.bloodmagic.entry.demon.forge.info.2=就在今天,我æˆåŠŸè£½æˆäº†ä¸€ç¨®å¯å°‡åŽŸç”Ÿæ„志注入物å“中的çµæ§‹ã€‚我ç¾åœ¨ç®¡é€™å€‹æ±è¥¿å«ã€Œç„ç«ç†”çˆã€ï¼Œå¯¦éš›ä¸Šå®ƒåªæ˜¯å€‹é‘²å…¥çŽ»ç’ƒé ‚層中的簡易煉金術陣列,å¯æœ€å¤šåŒæ™‚將四個物å“和原生æ„å¿—èžåˆæ–¼ä¸€é«”。惡魔æ„志需è¦æ”¾åœ¨å³æ‰‹é‚Šï¼Œé¡¯è€Œæ˜“見的圓圈則是為物å“準備的。目å‰ä¾†èªªæˆ‘已掌æ¡äº†è‹¥å¹²ç¨®ã€Œé…æ–¹ã€ï¼Œä½†ä½¿ç”¨é€™çˆå­ä»ç„¶æœ‰ä¸€äº›è¦æ±‚。\n\tå°æ–¼åˆæ¬¡ä½¿ç”¨ç„ç«ç†”çˆçš„人/cut來說,他們需è¦æ³¨æ„一些事情:一,物å“èžåˆéœ€è¦æ供一定數é‡çš„惡魔æ„志,如果數é‡ä¸å¤ ï¼Œä»€éº¼äº‹éƒ½ä¸æœƒç™¼ç”Ÿï¼›äºŒï¼Œå‰é¢èªªåˆ°ç‰©å“èžåˆéœ€è¦æ供一定數é‡çš„惡魔æ„志,但大部分é…方實際都消耗ä¸äº†é‚£éº¼å¤šï¼›ä¸‰ï¼Œæœ‰äº›ç‰©å“çš„èžåˆéœ€è¦å¤§é‡æ„志來啟動,但å»æ¶ˆè€—ä¸äº†å¤šå°‘,甚至根本ä¸æ¶ˆè€—;四,有些é…方的產é‡å·¨å¤§ï¼Œæœ‰äº›...並ä¸æ€Žéº¼é«˜ã€‚ -guide.bloodmagic.entry.demon.petty.info.1=åˆæ˜¯æ–°ä¸€å€‹å¤œæ™šï¼Œæˆ‘åˆé–‹å§‹äº†æ—¥å¸¸çš„收割工作。但是很快我æ„識到了一個å•é¡Œï¼šæˆ‘的背包æ¯å¤©éƒ½æœƒè¢«å„種樣本塞滿ï¼åŽŸå› ä¸æ˜¯å¾ˆæ¸…楚,也許是因為æ¯ä»½æ¨£æœ¬çš„最終來æºéƒ½ä¸ä¸€æ¨£ï¼Œå› æ­¤ç„¡æ³•å£“縮在一起å§ã€‚至少,從它們物ç†è¡¨ç¾å½¢å¼ä¾†èªªæ˜¯é€™æ¨£çš„。\n\t也因此我åˆå›žåˆ°äº†è¢«ä¸Ÿåœ¨å±‹å­ä¸€è§’çš„ç„ç«ç†”çˆæ—開始為我的實驗準備æ料,將æ比略的那些令人窒æ¯çš„實驗拋之/cut腦後。我這幾天在為æ比略準備他的熔çˆï¼Œå› ç‚ºæˆ‘已經放棄抵抗那些因為他的「奧法實驗ã€è€Œç”¢ç”Ÿçš„,籠罩在我的工作室裡的粉ç°äº†ã€‚我管你是ä¸æ˜¯åœ¨ã€Œå¡«è£œéˆé­‚網絡那無形的網狀çµæ§‹èˆ‡çŸ³æ¿çš„物ç†çµæ§‹çš„空白ã€ï¼Œè¶•å¿«è®“你那些天殺的æ±è¥¿æ»¾å‡ºåŽ»ï¼ -guide.bloodmagic.entry.demon.petty.info.2=ä¸è«–如何,尋找åˆé©çš„存儲惡魔æ„å¿—çš„æ料的確費了我一番功夫。é’金石似乎是一種很容易就能找到的能é‡å°Žé«”,å¯ä»¥å……當傳導æ„志的通é“。然後我為了é¿å…空氣中的電場的影響,加了一層紅石充當「護盾ã€ï¼ˆè‡³å°‘,馬格斯說éŽï¼Œå°‡å…©ç¨®èƒ½é‡æ··åœ¨ä¸€èµ·æœƒç”¢ç”Ÿç½é›£æ€§å¾Œæžœï¼‰ï¼›ç„¶å¾ŒåŠ ä¸Šä¸€äº›é»ƒé‡‘充當抑性劑;並以玻璃製æˆå¤–殼。最終我得到了一塊「地ç„魂石ã€ã€‚這個åå­—çš„å«ç¾©ä¾¿æ˜¯ã€Œä¾†è‡ªåœ°ä¸‹ä¸–界——塔爾塔羅斯 (ΤάÏταÏος, Tartarus) ——的寶石ã€ã€‚\n\t經éŽè¿‘一步測試,我發ç¾é€™å€‹å¯¶çŸ³çš„容é‡æ˜¯64。(當我把這個çµæžœæ‹¿çµ¦é¦¬æ ¼æ–¯çœ‹æ™‚,他覺得這個數字是個å分完美的整數。)這樣,我å†è©¦åœ–撿起惡魔æ„志時它就å¯ä»¥è‡ªå‹•å°‡å…¶æ”¶é›†èµ·ä¾†äº†ã€‚但...這樣一來æ„志它本身似乎就消失了。在拯救了我的背包的åŒæ™‚也給我帶來了新的謎團呢。åŒæ™‚我還發ç¾ï¼Œè‹¥æ˜¯æˆ‘手æŒå¯¶çŸ³ä¸¦å°‡ç²¾ç¥žé›†ä¸­æ–¼æ­¤ï¼ˆå³æ“Šï¼‰ï¼Œç´„有/cut容é‡ä¸Šé™å分之一的æ„志就會æµå…¥æˆ‘身上的å¦ä¸€å€‹å¯¶çŸ³ä¸­ã€‚我覺得這個性質會在我得到更強大的地ç„魂石後大顯身手。 -guide.bloodmagic.entry.demon.sword.info.1=我的網åˆå‡ºå•é¡Œäº†ã€‚\n\tä¸è«–我怎麼努力改進,這投網似乎就是ä¸èƒ½å®Œç¾Žå·¥ä½œã€‚多數時候會打çµã€‚但å³ä¾¿æˆ‘æˆåŠŸæŠ•ä¸­äº†æ®­å±ï¼Œå®ƒé‚„是有很高概率ä¸å·¥ä½œã€‚為了é¿å…自己的頭髮被網çºä½çš„命é‹ï¼Œæˆ‘決定立刻回到我的ç„ç«ç†”çˆæ—開工。\n\t但,並éžç«‹åˆ»é–‹å·¥â€”—我首先得清ç†ä¸‹ä¸Šé¢çš„ç°å¡µã€‚ -guide.bloodmagic.entry.demon.sword.info.2=我將那微å°çš„地ç„魂石存儲惡魔æ„志的能力æˆåŠŸæ³¨å…¥åˆ°äº†éµåŠè£¡ï¼Œä¸¦å¾—到了一柄...傷害比我的拳頭還低的åŠã€‚我å°é€™å€‹çµæžœæ„Ÿåˆ°å分失望,因為我為了讓以地ç„魂石驅動的煉ç„熔çˆä¸éŽç†±è€Œåœ¨ä¸€æ—擺弄了很久很久。\n\t然而,當我å†æ¬¡æ‹¿èµ·åœ°ç„魂石時,åŠé–‹å§‹æ•£ç™¼å‡ºäº†ä¸€ç¨®æ–°çš„能é‡ã€‚似乎,我身上的惡魔æ„志越多,åŠçš„傷害也就越高,ç²å¾—的惡魔æ„志也就越多;倘若/cut沒有地ç„魂石...這åŠå°±å¦‚åŒå»¢éµä¸€èˆ¬ã€‚\n\t經éŽæ¸¬è©¦æˆ‘åˆç™¼ç¾äº†ä¸€ä»¶äº‹ï¼šæ“Šæ®ºä¸åŒçš„目標ç²å¾—çš„æ„志數é‡ä¸ä¸€æ¨£ã€‚具體的數é‡å’Œç›®æ¨™ç”Ÿç‰©çš„生命上é™æˆæ­£æ¯”——以蜘蛛為例,它最多åªæœ‰8顆心,因此殺死蜘蛛能ç²å¾—çš„æ„志數é‡ä¾¿æ˜¯æ®­å±çš„百分之八å,因為殭å±æœ€å¤šæœ‰å顆心。或許是因為生命越多的生物動起來時需è¦çš„æ„志越多å§ã€‚我覺得這個事情得好好記ä½ï¼Œä»¥å‚™ä¸æ™‚之需。 -guide.bloodmagic.entry.demon.lesser.info.1=今天在和æ比略èŠå¤©ï¼ŒèŠåˆ°äº†æœ€è¿‘他的一些工程。ä¸å¾—ä¸æ‰¿èªï¼Œä¸€æ—¦èªªèµ·ä»–的研究,他就會說個沒完沒了ï¼ä¸ç®¡äº†ã€‚æ比略說他最近一直在研究å°è¨˜ï¼Œç›®å‰ä»–已經利用我給他造的ç„ç«ç†”çˆæˆåŠŸè£½æˆäº†æ°´ä¹‹å°è¨˜å’Œç†”岩å°è¨˜ã€‚我ä¸æ˜¯å¾ˆæ¸…楚他是怎麼åšçš„——我åªçŸ¥é“他以地ç„魂石作為催化劑,將多種æ料在熔çˆä¸­ç…‰æˆå°è¨˜ï¼Œä½†æˆ‘沒親眼目ç¹éŽä»–的實驗éŽç¨‹ã€‚ä¸éŽæˆ‘今天總算知é“了他那漫天飛舞的ç°å¡µæ˜¯/cut怎麼回事。\n\t我來試著按他的方å¼è¤‡è¿°ä¸€ä¸‹ã€‚呃,「利用魂石中的æ„志來嬗變平時根本ä¸æœƒå應的若干原料時,發生了å應。利用這種增幅效應,我便å¯ä»¥åˆ»å‡ºæˆ‘所需è¦çš„銘文,以引導能é‡çš„æµå‹•ï¼Œå¾žè€Œå®Œæˆæˆ‘需è¦å®Œæˆçš„工作。ã€é›–說白紙黑字難以想åƒï¼Œä½†æˆ‘扶了扶眼é¡å¾Œé‡æ–°å›žæƒ³èµ·äº†ç•¶æ™‚的景象...我ä¸ç¢ºå®šä»–是ä¸æ˜¯å¹³æ™‚也這樣,但我發誓,一旦跟我解釋æ±è¥¿ï¼Œä»–就會變æˆ...科學家。\n\t/cutä¸è«–如何,他為我展示了水之å°è¨˜çš„製作方å¼ã€‚在電光ç«çŸ³èˆ¬çš„演示後,他終於進入了正題。「我在試圖用更高級的ææ–™é‡è¤‡ç›¸åŒçš„éŽç¨‹ï¼Œä½†å應物似乎總會在我放進去的一瞬間...爆炸。看上去很ä¸ç©©å®šã€‚我覺得是因為他們沒有正確地èžåˆåœ¨ä¸€èµ·â€”—或許是能é‡ä¸å¤ å§ã€‚ã€\n\t我在æ€ç´¢äº†å¹¾åˆ†é˜å¾Œä¾¿é–‹å§‹äº†å·¥ä½œâ€”—正如å‰æ–‡æ‰€èªªï¼Œæˆ‘覺得我會需è¦æ›´å¼·å¤§çš„地ç„é­‚/cut石的,但我ä»ç„¶åœ¨æ€è€ƒå¦‚何以優雅的方å¼å®Œæˆé€™å€‹å·¥ä½œã€‚æ‰€ä»¥ï¼Œæˆ‘æ±ºå®šï¼šè¨´è«¸æš´åŠ›ï¼ -guide.bloodmagic.entry.demon.lesser.info.2=我找來一整塊é’金石ã€ä¸€æ•´å¡Šç´…石ã€ä¸€é¡†é‘½çŸ³ã€ä»¥åŠä¸€å¡Šç©ºçš„地ç„魂石——啊這塊魂石是我在地上發ç¾çš„,應該是以å‰æŸå€‹é€²å±•ä¸é †çš„實驗中用的。我åªè¨˜å¾—馬格斯å¯ä»¥è®“水泥牆上的洞瞬間消失。然後我將這四個物å“放入ç„ç«ç†”çˆï¼Œä¸¦ä»¥ä¸€å¡Šæ»¿çš„地ç„魂石供能——最終çµæžœé¡¯ç¤ºæˆ‘需è¦è‡³å°‘大約60點æ„志。經éŽä¸€ç³»åˆ—優化,我終於確定了é…方,並開始觀察生長中的地ç„魂石。\n\t/cutå¦å¤–還有一點,我試éŽç”¨é‡‘塊代替鑽石,但çµæžœä¼¼ä¹Žåªèªªæ˜Žå¦ä¸€ç¨®æ°´æ™¶çµæ§‹æ›´æœ‰ç”¨ã€‚\n\t最終,我得到了全新的「å°åž‹åœ°ç„魂石ã€ï¼Œå®ƒæ“有256點容é‡ï¼Œæ¯”å¾®å°çš„地ç„魂石大多了。希望這顆新魂石å¯ä»¥æ»¿è¶³æ比略的需求å§ã€‚哎呀這玩æ„的容é‡é€™éº¼é«˜ä¸å°±æ„味著我得花更多時間來收集惡魔æ„志嗎?啊ï¼åˆæ˜¯ä¸€å€‹æ¼«æ¼«é•·å¤œ...ï¼ -guide.bloodmagic.entry.demon.reactions.info=我今天一早醒來發ç¾è‡ªå·±èººåœ¨é†«é™¢çš„病床上,身上有什麼æ±è¥¿ç–¼ç—›æ¬²è£‚。我çœé–‹é›™çœ¼ï¼Œå»çœ‹åˆ°äº†æ»¿çœ¼çš„暗洋紅色——那是,Veteres——è·é›¢æˆ‘們æ‘莊最近的大城市——的一家醫院的天花æ¿ã€‚我å°ç¾åœ¨çš„環境倒ä¸æ˜¯æ€Žéº¼å¥‡æ€ªï¼Œå› ç‚ºæˆ‘的目光è½åœ¨äº†ä¸€å¤§ç‰‡æ“¦å‚·å’Œæ·¤é’上,以åŠæˆ‘左腿上的石è†...什麼人肯定å°æˆ‘下了å為"Ossa-Fracta"的詛咒——因為那åªèƒ½æ˜¯æ ¹å£žæŽ‰çš„骨頭ï¼\n\t/cut當馬格斯和一å緊繃著臉的護士走進來的時候,我就立刻明白了:我é­é‡çš„事情比想åƒä¸­çš„é‚„åš´é‡ã€‚顯然,我é‡å°æ–°åˆ¶çš„å°åž‹åœ°ç„魂石的實驗發生了å彈並引起了爆炸,雖然è¦æ¨¡ä¸å¤§ï¼Œä½†ä»æœ‰æ®ºå‚·åŠ›ã€‚ä¸éŽæˆ‘也就åªèƒ½æƒ³åˆ°é€™é»žäº‹æƒ…了:我左å°è…¿ä¸Šè¦†è“‹çš„黑曜石ã€éµå’Œé‘½çŸ³è£½æˆçš„護甲,ç¾åœ¨è®Šæˆäº†æŸç¨®å®Œå…¨ç„¡æ³•æ‹†é™¤çš„護甲——更準確地說,是æŸç¨®æ·¡è—的,類似符文矩陣的魔法護甲。\n\t/cut我冷éœä¸‹ä¾†ï¼Œä¸¦å•é¦¬æ ¼æ–¯æ€Žéº¼çœ‹ï¼Œé›–然我已然知é“發生了什麼。「我覺得å§ï¼Œã€ï¼Œä»–說,並在èªçœŸè†è½çš„護士看我之å‰çž¥äº†è­·å£«ä¸€çœ¼ï¼Œã€Œé‚£æ˜¯æŸç¨®é‘½çŸ³æ®˜ç•™ç‰©ï¼Œé€™ä¹Ÿæ˜¯ç‚ºä»€éº¼æˆ‘們沒辦法拆掉它的原因。åŒæ™‚,它還被æŸç¨®...異域的能é‡æŸç¸›è‘—,這也是為什麼你ç¾åœ¨æœƒèººåœ¨é€™è£¡ï¼Œè€Œä¸æ˜¯ç•¶åœ°è¨ºæ‰€ï¼Œçš„原因——共èšæœƒè‡ªå¾žä¸Šæ¬¡é‚ªè¡“事件以來就一直å°è¥²æ“Šäººé¡žçš„ä¸æ˜Žèƒ½é‡é«˜åº¦é‡è¦–,我們必須ä¿è­‰ä¸æ‹›æƒ¹æ˜¯éžã€‚ã€\n\t/cut「我知é“了...ã€å¹³æ—¥è£¡ï¼Œé¦¬æ ¼æ–¯æ˜¯ä¸æœƒåŽ»æ“心諸如就未知能é‡äº‹ä»¶ç…§æœƒå…±èšæœƒé€™ç¨®æ­£å¼çš„事情的——我已經著手研究惡魔æ„志多時了,也ä¸è¦‹å…±èšæœƒä¸Šé–€ä¾†ç‚ºæ–°çš„魔法能é‡è¾¦ç›¸é—œæ‰‹çºŒã€‚我å°æ”¿æ²»ä¸æ„Ÿèˆˆè¶£ï¼Œæˆ‘也ä¸æ‰“ç®—é€éœ²å¤ªå¤šæ¶ˆæ¯ï¼Œä½†æˆ‘知é“馬格斯å°æ­¤äº‹éžå¸¸è¬¹æ…Žâ€”—這æ„味著,在接下來一段時間內,馬格斯都會為這æ„志所蘊å«çš„能é‡æ“”憂,說ä¸å®šé‚„會牽扯出陳年舊賬也說ä¸å®š...?\n\/cut「夠了,話題到此為止,ã€é¦¬æ ¼æ–¯èªªç½·ä¾¿æŠ«ä¸Šäº†ä»–çš„é•·è¢ï¼Œã€Œæˆ‘原本打算一開始就將之公之於眾的,但那時它的å¨åŠ›é‚„ä¸æ˜Žé¡¯ï¼Œä½†ç¾åœ¨...ã€\n\t我感å—到左腿有一股熱浪,就åƒè¦æŠŠæˆ‘的腿燒起來一樣,åŒæ™‚為看到馬格斯æ§æˆæ¯ç‹€çš„手蓋在了è—色的殼上,散發出耀眼的紅光。幾秒é˜å¾Œâ€”—雖然我感覺這åƒæ˜¯ç¶“éŽäº†æ°¸æ†çš„時間——殼開始碎裂並脫è½ã€‚說實話這個çµå±€æœ‰äº›ä»¤äººæŽƒèˆˆã€‚\n\t/cut我試圖起身,但馬格斯一把把我按回床上:「è²æ‹‰ï¼Œä½ éœ€è¦ä¼‘æ¯ã€‚魂石的事情å¯ä»¥å…ˆæ”¾ä¸€æ”¾ã€‚ã€å°æ­¤ï¼Œä¸€é–‹å§‹æˆ‘是拒絕的,但我後來轉而開始æ€è€ƒé€™æ¬¡äº‹æ•…。馬格斯ä¸æ—©é»žé€™éº¼åšçš„ç†ç”±åªèƒ½æ˜¯åœ°ç„魂石在爆炸後ä»ç•™åœ¨æˆ‘身上。æ›è¨€ä¹‹ï¼Œæˆ‘腿上ä¸è«–發生什麼,都和惡魔æ„志有關;åªè¦æ‹¿åŽ»é­‚石,那層殼也就能被移除。我開始了沉æ€... -guide.bloodmagic.entry.demon.sentientGem.info.1=幾天後,馬格斯強制執行的「休養生æ¯ã€çµæŸäº†ã€‚我決定在我ç¾æœ‰çš„基礎上繼續研究感知護甲。然而,還有很多關於感知之åŠå’Œæƒ¡é­”æ„å¿—çš„ç–‘å•æ²’有解答。誠然,我們有一些ç†è«–上的猜想,但畢竟是馬格斯和我æ出的ç†è«–,我們也ä¸çŸ¥é“究竟有多準確。\n\t為此我需è¦ä¸€é»žå¤§è†½çš„設想。馬格斯告訴我說,我們在學習血之魔法時,也有必è¦å­¸ç¿’å¦ä¸€é–€é­”法的è—術。æ比略/cut建議我去學習花之魔法,但我å°æ­¤å—¤ä¹‹ä»¥é¼»â€”—「一堆花也能幫我擊退惡魔?ï¼ã€ -guide.bloodmagic.entry.demon.sentientGem.info.2=感知護甲寶石是塊å¯ä»¥è®“ä½ ç©¿å¸æ„ŸçŸ¥è­·ç”²çš„工具。確ä¿èº«ä¸Šæœ‰16點惡魔æ„志,使用這塊寶石(å³æ“Šï¼‰ï¼Œä¾¿æœƒå°‡ä½ èº«ä¸Šçš„護甲悉數替æ›æˆä¸€å¥—全新的感知護甲,åŒæ™‚還會繼承你本來護甲上的附魔效果;å†æ¬¡ä½¿ç”¨é€™å¡Šå¯¶çŸ³å°±å¯ä»¥è„«ä¸‹æ„ŸçŸ¥è­·ç”²ä¸¦æ›å›žä½ æœ¬ä¾†çš„護甲。當然,å³ä¾¿ä½ èº«ä¸Šæ²’有護甲,這塊寶石也是å¯ä»¥ç”¨çš„。\n\t感知護甲的效果一般與普通éµè­·ç”²ç„¡ç•°ï¼Œé™¤æ­¤ä¹‹å¤–沒有別/cut的效果。但,和感知工具一樣,當你身上æŒæœ‰æƒ¡é­”æ„志時,感知護甲的ä¿è­·èƒ½åŠ›å°±æœƒä¸Šå‡ï¼Œä¸Šå‡å¹…度與æ„志數é‡æˆæ­£æ¯”。也正是因為此,當你身上有海é‡æƒ¡é­”æ„志時它的ä¿è­·èƒ½åŠ›å°±æœƒè®Šå¾—å分強大。但有一點需è¦æ³¨æ„,就是你æ¯å—到一次傷害,都會消耗地ç„魂石中的惡魔æ„志,如果æ„志數é‡å¤ªä½Žï¼Œæ„ŸçŸ¥è­·ç”²å°±å¯èƒ½æœƒè¢«æ‰“回原形。說ä¸å®šæ˜¯å€‹å¼±é»žå‘¢ï¼ -guide.bloodmagic.entry.demon.routing.info=血魔法的物å“傳é€æ˜¯ä»¥æƒ¡é­”æ„志編織æˆçš„網的形å¼å‡ºç¾çš„,整張網構æˆäº†ç‰©å“傳輸的通路,連接著æ¯ä¸€å€‹å„²å­˜é»žã€‚讓我來先講解一下æ¯ä¸€å€‹ç‰©å“都是幹什麼的。\n\tæ¯ä¸€å€‹è·¯ç”±ç³»çµ±éƒ½æœ‰ä¸€å€‹ä¸»æŽ§è·¯ç”±ç¯€é»žï¼Œç›¸ç•¶æ–¼æ•´å€‹ç³»çµ±çš„中樞。輸入節點用於將物å“輸入路由網絡,輸出節點將物å“從網絡中æå–出來,而標準的路由節點沒有任何特殊功能。\n\t/cut網絡的æ­å»ºæ–¹æ³•å¦‚下:首先,你需è¦åœ¨æ½›è¡Œæ™‚手æŒç¯€é»žé€£æŽ¥å·¥å…·å³æ“Šä¸€å€‹ç¯€é»žï¼Œç„¶å¾Œä»¥åŒæ¨£çš„方法å³æ“Šå¦ä¸€å€‹ä½ æƒ³èˆ‡ä¹‹é€£æŽ¥çš„節點。åªè¦å…©å€‹ç¯€é»žä¹‹é–“能找到æŸç¨®é€šè·¯ï¼ŒæŠ‘或都連接在主節點上,它們就å¯ä»¥äº’相「通信ã€ã€‚\n\t物å“路由第一原則:物å“總是從最近的輸入節點進入網絡,從最近的輸出節點離開網絡。你需è¦ç¯©é¸å™¨ä¾†é™åˆ¶ç‰©å“çš„æµå‘。在節點的æ“作界é¢/cut上有一個按鈕å¯ä»¥è®“你進行éŽæ¿¾è¨­ç½®ï¼Œå¯ä»¥ç²¾ç¢ºåˆ°é¢ï¼ˆç•Œé¢ä¸­çš„N指北方,以此類推)。最左邊的格å­é‚„å¯ä»¥æŒ‡å®šç‰©å“數é‡å’Œç¨®é¡žã€‚å°æ–¼è¼¸å…¥ç¯€é»žä¾†èªªï¼Œç¯©é¸å™¨çš„存在會使它們åªæå–篩é¸å™¨æŒ‡å®šçš„物å“;如果你指定了數é‡ï¼Œå®ƒå€‘還會留下指定數é‡çš„物å“,而éžå…¨éƒ¨æå–出來。å°æ–¼è¼¸å‡ºç¯€é»žä¾†èªªï¼Œç¯©é¸å™¨å‰‡è®“它們åªæŽ¥å—並輸出指定的物å“;如果你指定了數é‡ï¼Œé‚£éº¼å®ƒå€‘最多åªæœƒè¼¸å‡ºé‚£éº¼å¤šç‰©å“。\n\t/cut有四種ä¸åŒé¡žåž‹çš„篩é¸å™¨ï¼š\n\t精確匹é…——物å“çš„NBT和元數據必須完全匹é…。\n\t按模組匹é…——若物å“來自指定Mod則匹é…æˆåŠŸã€‚\n\t忽略NBT——篩é¸å™¨ä¸æ¯”較NBT標籤。\n\t礦物字典——若物å“帶有相åŒç¤¦ç‰©å­—å…¸æ¢ç›®å‰‡åŒ¹é…æˆåŠŸã€‚\n\t/cut在將篩é¸å™¨æ”¾å…¥è·¯ç”±ç¯€é»žå¾Œï¼Œä½ å¯ä»¥åœ¨è·¯ç”±ç¯€é»žä¸Šçœ‹åˆ°å…©å€‹æ•¸å­—:數é‡å’Œå„ªå…ˆç´šã€‚點擊篩é¸å™¨ä¸­çš„任何物å“後å³å¯çœ‹åˆ°å…¶å字,正下方則會顯示數é‡ã€‚如å‰æ–‡æ‰€è¿°ï¼Œé€™ä¾¿æ˜¯æŒ‡å®šæ•¸é‡çš„地方了。若你將數é‡è¨­å®šç‚º0,那麼就æ„味著「所有ã€â€”—å°æ–¼è¼¸å…¥ç¯€é»žä¾†èªªï¼Œé‚£å°±æ˜¯æŠ½å–所有物å“ï¼›å°æ–¼è¼¸å‡ºç¯€é»žä¾†èªªï¼Œå°±æ˜¯æ供所有物å“。\n\t第二個數字便是優先級,å¯ç”¨ä¸€æ—的箭頭調整。數字越å°ï¼Œ/cut優先級越高,物å“將會首先試圖å‰å¾€å„ªå…ˆç´šé«˜çš„節點。 -guide.bloodmagic.entry.demon.aura.info=生物被殺死後,其éˆé­‚會日漸消退,最終回歸創世之神。使用投網,å¯ä»¥å°‡å…¶æŸç¸›æ–¼ç¾ä¸–,但也有一些難度。我們ç¾åœ¨ï¼Œå‡ºæ–¼ç¨®ç¨®ç†ç”±ï¼Œå°é€™äº›æ„志加以干擾並å‡çµå…¶ä¸€åˆ‡æ´»æ€§ã€‚若我們燃燒æ„志,它就會回歸虛無。但若是我們直接將æ„志釋放到空氣中,我們便å¯ä»¥ä»¥æ›´éˆæ´»çš„æ–¹å¼é§•é¦­é€™è‚¡åŠ›é‡ã€‚有些方å¼å分普通,而有些方å¼å‰‡é¡¯å¾—å分強大。\n\t在將惡魔æ„志釋放到空氣中/cut後,它會一直待在釋放出來的那片土地上(å³ï¼Œé‚£å€‹å€å¡Šï¼‰ï¼Œä¸æœƒè¼•æ˜“離開。æ¯ä¸€ç‰‡åœŸåœ°ä¸Šçš„ä¸åŒç¨®é¡žçš„æ„志(關於æ„志的種類,後文有詳述)互ä¸å½±éŸ¿ã€‚這些æ„志的存在還å¯ä»¥ç”¨å…¶ä»–的方塊和物å“來調整。 -guide.bloodmagic.entry.demon.types.info=到目å‰ç‚ºæ­¢ï¼Œæ¯ç•¶æˆ‘們討論惡魔æ„志時,都是討論的原生æ„志。這也就æ„味著這是天然的æ„志,但這並ä¸ç­‰æ–¼å®ƒæ˜¯ç´”的。事實上,惡魔æ„志有若干類型;除開原生æ„志,還有è…è•ã€ç ´å£žã€å¾©ä»‡ä»¥åŠå …毅四種æ„志。原生æ„志實質是這四種æ„å¿—çš„æ··åˆç‰©ï¼Œä¹Ÿè¨±é‚„有一些至今沒有識別的æ„志,但有一點å¯ä»¥ç¢ºå®šï¼Œå³åˆ†é›¢å¾Œçš„æ„志很難å†èžåˆç‚ºä¸€é«”。\n\t四種ä¸åŒçš„æ„志的真正來æº/cut至今ä»ç„¶ä¸æ˜Žï¼Œä½†æˆ‘們已經掌æ¡äº†ç”¢ç”Ÿé€™å››ç¨®æ„志的方法。將æ„志釋放到空氣中後,相åŒç¨®é¡žçš„æ„志就會開始èšé›†åœ¨ä¸€èµ·ã€‚據此,åªéœ€è¦æœ‰ä¸€ç¨®å¯ä»¥æ”¶é›†ç‰¹å®šç¨®é¡žæ„志的設備就å¯ä»¥å®Œæˆä»»å‹™äº†ã€‚接下來的幾個章節中將會講述其中一種設備——惡魔çµæ™¶å£‡ã€‚\n\t四種æ„志代表了人的四種慾望。當然我們ä»ç„¶å¯ä»¥å‡å®šå­˜åœ¨æ›´å¤šç¨®æ„志,但也許它們/cut的純度還ä¸å¤ ï¼Œä¹Ÿè¨±æ ¹æœ¬ä¸èƒ½å­˜åœ¨ï¼Œç¸½è€Œè¨€ä¹‹æˆ‘們目å‰é‚„沒發ç¾æ–°çš„æ„志種類。\n\tè…è•â€”—代表了藉由å„種方å¼â€”—酸液ã€è »åŠ›ã€ç­‰ç­‰â€”—破壞è¬ç‰©çš„慾望。掌æ¡äº†é€™ç¨®åŠ›é‡çš„人,將能自由地驅使å„種疾病(æ›è¨€ä¹‹ï¼Œå„種負é¢æ•ˆæžœï¼‰çš„力é‡ï¼Œä¸¦ä»¤è‡ªèº«å…å—劇毒的侵è•ã€‚\n\t惡æ„——å¯çœ‹ä½œæ˜¯â€”—一種孜孜ä¸å€¦å°‹æ‰¾å°æ‰‹çš„慾望。通常,駕/cut馭惡æ„能é‡çš„人,åªè¦éŽ–定了目標,移動速度就會上å‡ï¼Œä½¿å¾—å¯æ†çš„çµç‰©ç„¡è™•èº²è—,åªå¾—å以待斃。\n\t破壞——你或許已經猜到了——其實就是純粹的力é‡ã€‚正確地使用這種力é‡å¯ä»¥ä»¤ä½¿ç”¨è€…的身體素質在短時間內ç²å¾—快速æå‡ï¼›åŒæ™‚é‚„å¯ä»¥ç”¨ä¾†ç²‰ç¢Žæˆ–碾磨其他物å“。\n\t堅毅——無數的觀察表明——這是抵禦攻擊,使自身å…é­å‚·å®³çš„/cut慾望。大多數情æ³ä¸‹ï¼Œæ“縱這種慾望的人,都是團隊中的銅牆éµå£â€”—任何攻擊都ä¸æœƒå‚·ä»–分毫。如果你想藉由你的護甲或儀å¼ä¾†ä¿éšœä½ çš„存活概率,這股力é‡çµ•å°æ˜¯ä½ çš„第一é¸æ“‡ã€‚ -guide.bloodmagic.entry.demon.crucible.info=惡魔å©å å¯å°‡åœ°ç„魂石中的惡魔æ„志散佈到當地(å³ç•¶å‰å€å¡Šï¼‰çš„大氣之中。這å£å©å æœ‰è‹¥å¹²ç”¨é€”:最簡單的一個就是直接將地ç„魂石放入其中(å³æ“Šæ”¾å…¥ï¼‰ã€‚å©å æœƒè‡ªå‹•å¾žé­‚石中抽å–惡魔æ„志並散佈到空氣中,直到飽和(æ¯ç¨®æ„志大約都會在é”到100點時飽和)或者魂石本身被抽乾了。\n\t此外,它還å¯ä»¥æŠ½å–空氣中的惡魔æ„志並çŒè¼¸é€²é­‚石中。æ“作方å¼å’Œæ•£ä½ˆæƒ¡é­”æ„å¿—ç„¡/cut異,åªæ˜¯å©å éœ€è¦ä¸€å€‹å¼·çš„紅石信號(å³å¼·å……能)。\n\t最後,直接往裡é¢æŠ•å…¥ä¸€å¡Šæƒ¡é­”æ„志也是å¯ä»¥çš„,ä¸è«–什麼形å¼ï¼Œåªè¦æœ‰å®¹ç´æ„志的空間就å¯ä»¥é€²è¡Œè½‰åŒ–。舉個例å­ï¼Œå°‡æ™¶åŒ–惡魔æ„志投入å©å å¯ç”¢ç”Ÿ50點æ„志。 -guide.bloodmagic.entry.demon.crystallizer.info=正如之å‰æ‰€æ到的那樣,惡魔éˆæ°£â€”—通常我們會簡單以「大氣ã€æŒ‡ä»£ä¹‹â€”—是惡魔æ„志的空éˆçš„存在形å¼ï¼Œè€Œæ“Šæ®ºæ€ªç‰©ç²å¾—的物質則是惡魔æ„志物ç†å½¢å¼çš„å…·ç¾ã€‚而這惡魔çµæ™¶å£‡ï¼Œå‰‡åƒæ˜¯ä¸€å€‹éŒ¨é»žï¼Œè®“漂浮在大氣中的惡魔æ„志以晶體的形態é‡ç¾ã€‚\n\t你也許會å•ï¼Œç‚ºä»€éº¼ä¸ç›´æŽ¥ç”¨åœ°ç„魂石培養一塊晶體呢?這是因為在我們將惡魔æ„志釋放到空氣中時,它身上的ç¦éŒ®/cut就已經被解除了——記ä½ï¼Œç•¶æˆ‘們殺死一個怪物時,它身上的æ„志也就隨之被我們ç¦éŒ®äº†ã€‚å†æ¬¡é‡‹æ”¾è‡ªç„¶æœƒä»¤å…¶é‡æ–°æ¢å¾©æ´»åŠ›ï¼Œè€Œé€™çµæ™¶å£‡å°±æ˜¯ç›´æŽ¥å¸æ”¶é€™æ´»çš„惡魔æ„志。ä¸è¦å¤ªæƒ³ç•¶ç„¶å•¦ã€‚\n\tçµæ™¶éŽç¨‹éœ€è¦æ¯”較高的惡魔éˆæ°£çš„濃度(大概是80點),並且需è¦ä¸€æ®µæ™‚間。在這之後,çµæ™¶å£‡çš„上方便會長出åªæœ‰ä¸€æ ¹å°–的惡魔晶簇。çµæ™¶å£‡æœ‰å…©ç¨®å·¥ä½œæ–¹å¼ï¼šå®ƒæ—¢å¯ä»¥å¸æ”¶/cut特定的一種æ„志然後產生å°æ‡‰çš„晶體;也å¯ä»¥ç›´æŽ¥å¸æ”¶åŽŸç”Ÿæ„志來產生晶體。\n\t這其中的å€åˆ¥åœ¨æ–¼ï¼Œä½¿ç”¨åŽŸç”Ÿæ„志時,有大約40%%概率會ç²å¾—ä»»æ„一種特定類型的晶體。而這將是你ç²å¾—特定類型的æ„志的第一步。 -guide.bloodmagic.entry.demon.cluster.info=惡魔晶簇既å¯ä»¥ä½¿ç”¨æƒ¡é­”çµæ™¶å£‡åŸ¹é¤Šï¼Œä¹Ÿå¯åœ¨ç„ç«ç†”çˆä¸­ç”¨æƒ¡é­”çµæ™¶è£½ä½œã€‚晶簇å¯ä»¥åœ¨å„種地方生長——地æ¿ã€ç‰†å£ã€ç”šè‡³å¤©èŠ±æ¿ä¸Šã€‚完全長æˆçš„晶簇應該有七個尖,打掉後æ¯ä¸€å€‹å°–都會變æˆä¸€å¡Šçµæ™¶ã€‚然而,如果你使用å«æœ‰è‡³å°‘1024點æ„志的地ç„魂石來收穫(å³æ“Šï¼‰ï¼Œä½ ä¾¿èƒ½åªæ”¶ç©«ä¸€å¡Šçµæ™¶è€Œä¸å½±éŸ¿åˆ°æ•´æ£µæ™¶ç°‡ã€‚\n\t晶簇生長的éŽç¨‹ä¸­ï¼Œæœƒå¸æ”¶åŒç¨®æƒ¡é­”éˆæ°£ã€‚雖然慢,但的確/cut是有收益的。\n\t有兩種和晶簇的種æ¤å’Œæ”¶ç©«ç›¸é—œçš„å„€å¼ï¼šå­¤é­‚集會和碎晶裂紋。具體用法å¯ä»¥åƒé–±ã€Šå„€å¼å¤§å¸«ã€‹ä¸€å·ã€‚ -guide.bloodmagic.entry.demon.pylon.info=你或許已經發ç¾äº†ï¼Œåœ¨æ²’有外力的影響下,惡魔éˆæ°£åªæœƒå¾…在它被釋放出來的那個地方(å³ç•¶å‰å€å¡Šï¼‰ã€‚而這惡魔導能塔,則為那些éˆåŸŸä¸­çš„æ„志亮起了一盞燈——一盞指引方å‘的燈。附近的æ„志在這燈的指引下會é€æ¼¸å‘燈é æ”,直至這些地方的æ„志數é‡ä¿æŒå‡å‹»ã€‚(註:這裡所謂的「附近ã€ä¸å«å°è§’線上的å€å¡Šï¼Œå³åªæœ‰èˆ‡å¡”所在的å€å¡Šç›¸é„°çš„四個å€å¡Šæœƒå—到影響)。å¦å¤–è¦æ³¨æ„的是,æ„å¿—åªæœƒå¾žå¤šçš„地方æµ/cutå‘少的地方。若是什麼地方的æ„志的濃度比附近的地方濃度低了,它就ä¸æœƒç¹¼çºŒæµå‹•äº†ã€‚ -guide.bloodmagic.entry.demon.gauge.info=你需è¦ä¸€å€‹æ¸¬é‡å„€ä¾†æ¸¬å®šéˆåŸŸä¸­çš„惡魔æ„志濃度。åªéœ€è¦ä¸€ç›´æ”¾åœ¨ä½ çš„背包中,測é‡å„€ä¾¿å¯å°‡æ¿ƒåº¦ä»¥äº”個指示器的形å¼é¡¯ç¤ºå‡ºä¾†ï¼ˆåœ¨å±å¹•å·¦ä¸Šè§’)。潛行時你還能得知具體數é‡ï¼Œä½†é€™å€‹çµæžœæ˜¯ç¶“éŽå››æ¨äº”入的。 - - - -# Alchemy Entries -guide.bloodmagic.entry.alchemy.intro=åº -guide.bloodmagic.entry.alchemy.ash=å¥§è¡“ç²‰ç° -guide.bloodmagic.entry.alchemy.speed=法陣:æ•æ· -guide.bloodmagic.entry.alchemy.updraft=法陣:å‡é¨° -guide.bloodmagic.entry.alchemy.bounce=法陣:彈跳 -guide.bloodmagic.entry.alchemy.turret=法陣:骷é«ç‚®å¡” -guide.bloodmagic.entry.alchemy.buff=增益法陣 -guide.bloodmagic.entry.alchemy.fastMiner=法陣:速掘 - - - - -# Alchemy Entry Texts -guide.bloodmagic.entry.alchemy.intro.info=我å«å¼—拉德·海泊æ©ï¼Œæ˜¯ä¸€å血術士。我一直致力於研究煉金術的細節以åŠæ‰€æœ‰é­”法中共åŒçš„原則——「等價交æ›ã€ã€‚簡單來說,你ä¸èƒ½ç„¡ä¸­ç”Ÿæœ‰ï¼Œé›–然很多人一直在致力於尋找那個å¯ä»¥ç„¡è¦–此原則的石頭。很顯然,石頭的尋找之旅並ä¸é †åˆ©ï¼Œå› ç‚ºäººå€‘總是會在驚è¨è²ä¸­ç™¼ç¾çŸ³é ­æ˜¯å‡è²¨ã€‚當然,我ä¸åªæ˜¯å€‹ç…‰é‡‘術師,我主è¦é‚„是在跟儀å¼å¤§å¸«å’Œç· é€ è€…學習血之魔法,這二ä½åœ¨åœˆå…§æ¥­å·²æ˜¯é —å…·è²æœ›çš„人物了。/cut馬格斯和æ比略這幾年來一直在記錄他們的æˆæžœï¼Œä½†æ˜¯æˆ‘一直ä¸çŸ¥é“馬格斯是å¦çœŸçš„記錄下了他的畢生所學——既ä¸èƒ½è­‰æ˜Žï¼Œä¹Ÿä¸èƒ½è­‰å½ã€‚\n\t我的這本書將記錄血魔法中的煉金術。從奧術粉塵,到複雜的煉金å°æ¡Œï¼Œä½ å°‡æœƒåœ¨é€™æœ¬æ›¸ä¸­æ‰¾åˆ°ä¸–é–“å„種複雜的元素的線索。當然,為了讀懂這本書,你還需è¦é–±è®€å…¶é¤˜çš„幾本書,以å°è¡€é­”法有清楚的瞭解。\n\t/cutå°±ç¾åœ¨ä¾†èªªå‘¢ï¼Œæˆ‘衷心希望é¢å‰çš„讀者閱讀愉快。這些書é çš„內容,都是如å‡åŒ…æ›çš„真æ‰å¯¦å­¸ã€‚ -guide.bloodmagic.entry.alchemy.ash.info=奧術粉塵便是煉金法陣的基礎,而煉金法陣(為簡便,下簡稱法陣)——一種圓形法陣——則æ“有多種強大的功能。åˆæˆå¥§è¡“粉塵需è¦ç”¨åˆ°ç„ç«ç†”çˆå’Œæƒ¡é­”æ„志,關於這兩樣æ±è¥¿çš„細節å¯ä»¥åƒè€ƒæœ¬æ›¸ã€Šæƒ¡é­”使者》一å·ã€‚\n\t/cut一份奧術粉塵å¯ä½¿ç”¨äºŒå次。å°è‘—地é¢æˆ–者牆å£ä½¿ç”¨ä¾¿å¯ç•«å‡ºä¸€å€‹åœ“形的法陣(如果是牆å£ï¼Œä½ åªèƒ½åœ¨ä¸€å€‹æ–¹å‘上看到法陣)。然後,å°æ³•é™£ä¸­å¤®ä½¿ç”¨åˆé©çš„催化劑å³å¯æ”¹è®Šå…¶å½¢ç‹€ï¼Œç•¶ç„¶ä¹Ÿæœƒæ¶ˆè€—催化劑(å³ï¼Œå³æ“Šä½¿ç”¨ï¼‰ã€‚如果法陣沒有變形,那麼你肯定有什麼地方æžéŒ¯äº†ã€‚\n\t在觀察到法陣變形後,你便å¯ä»¥æ”¾å…¥æ¬¡è¦ç‰©å“了。åˆé©çš„次è¦ç‰©å“會啟動法陣,屆時你會看到法陣開始旋轉,並開始/cut產生å„種變化,具體變化隨法陣ä¸åŒè€Œä¸åŒã€‚\n\t所有éžåˆæˆçš„法陣用途都å¯ä»¥åœ¨æœ¬æ›¸ä¸­æŸ¥é–±åˆ°ï¼Œå³ä¾¿åˆæˆè¢«ä»–人強行更改éŽä¹Ÿå¯ä»¥ã€‚å°æ–¼éœ€è¦çš„物å“,它們都已經éŽæŽ’åºï¼ŒæŒ‰ç…§æœ¬æ›¸çµ¦å‡ºçš„é †åºæ”¾ç½®å³å¯ã€‚ -guide.bloodmagic.entry.alchemy.speed.info=法陣:æ•æ·å¯ä»¥è£½é€ è‹¥å¹²æ°£æ—‹ï¼Œä¸¦ç”¨æ³•åŠ›åŠ ç†±ã€‚此後,一旦有生物走入其中,它們就會被風的力é‡æŽ¨å‘å‰æ–¹ã€‚此外,它還å¯ä»¥å…除所有因此產生的掉è½å‚·å®³ã€‚åªéœ€è¦åšäº›é‹å‹•å°±å¥½äº†ã€‚\n\t漩渦推進的方å‘是陣列上箭頭的方å‘。\n\tå¦å¤–,相比於直接走入陣列中,從高處掉入陣列的效果會更好。這è¦æ­¸åŠŸæ–¼ä½ æŽ‰ä¸‹ä¾†æ™‚周åœç©ºæ°£ç”¢ç”Ÿçš„æµå‹•ã€‚ -guide.bloodmagic.entry.alchemy.updraft.info=這個陣列使用和法陣:æ•æ·ä¸€æ¨£çš„原ç†ï¼Œä¸éŽé€™æ¬¡çš„æ–¹å‘是æœä¸Šäº†ã€‚自然地,使用陣列時務必å°å¿ƒï¼šå†ä¸‹ä¾†å°±ä¸æ˜¯æ˜“äº‹äº†ï¼ -guide.bloodmagic.entry.alchemy.bounce.info=陣列會將接近中心的熱é‡é›†ä¸­åˆ°ä¸‹é¢ï¼Œé€²è€Œè»ŸåŒ–地é¢ï¼Œä¸¦æœ€çµ‚轉化為一種由碳和氫組æˆçš„橡膠狀物質。這種物質會將生物彈至空中,åŒæ™‚也能é¿å…掉è½å‚·å®³ã€‚潛行å³å¯é¿å…這種神奇æ料的影響,當然這ä¸æœƒå½±éŸ¿æ‘”è½ä¿è­·çš„功能。 -guide.bloodmagic.entry.alchemy.turret.info=利用那些ä»ç„¶æŽ§åˆ¶è‘—怪物的惡魔æ„志,你å¯ä»¥æŽ§åˆ¶ä¸€å€‹éª·é«çš„心智。åªè¦æœ‰éª·é«é€²å…¥äº†é€™å€‹é™£åˆ—的覆蓋範åœï¼Œé€™éª·é«å°±æœƒåŒ–身哨兵,並å‘所有敵å°ç”Ÿç‰©é–‹ç«ã€‚ä¸éŽé€™å€‹æ³•é™£ä»åœ¨å¯¦é©—當中,它有時候會ä¸ç®¡ç”¨ã€‚ -guide.bloodmagic.entry.alchemy.buff.info=經éŽåš´å¯†çš„研究,你發ç¾æ³•é™£æ“有強大的應用潛力。迄今,你已æˆåŠŸè£½é€ äº†æ•¸ç¨®é™£åˆ—,從加速移動,到åˆç´šçš„傳é€ï¼Œæ‡‰æœ‰ç›¡æœ‰ã€‚但唯有一種陣列,你至今ä»ç„¶æ²’有著手去研究,那便是æ供強大的正é¢å¢žç›Šçš„陣列。\n\t增益陣列實際上是指一系列å¯ä»¥æ供範åœå¢žç›Šæ•ˆæžœçš„陣列。這些陣列產生的增益效果通常都有很大的固定覆蓋範åœï¼Œä¸å—外力影響。然而,因/cut為法陣ä¸æœƒç‰½æ‰¯åˆ°éˆé­‚網絡,陣列需è¦åˆ¥çš„æ–¹å¼ä¾†å‚³æ’­é€™ç¨®æ•ˆæžœï¼Œé€šå¸¸æ˜¯ç›´æŽ¥ç”¨è¡€ã€‚æ›è¨€ä¹‹ï¼Œç•¶æœ‰çŽ©å®¶å±•é–‹é™£åˆ—時,玩家就會立刻å—到傷害(æ失生命),藉由此啟動陣列。\n\t因為使用了直接ç»ç¥­ï¼Œå‰æœŸä½¿ç”¨é€™ç¨®é™£åˆ—會比使用其他ç²å–增益的手段更經濟一些。è·é›¢ï¼Œå¦‚æžœæŸå€‹å°è¨˜å¯æ¶ˆè€—100LP並æ›å–10秒的效果,陣列å¯ä»¥ä»¥1點生命的代價æ›ä¾†30秒åŒæ¨£çš„效果(1點生命å°æ–¼ä¸€ç´š/cut祭壇來說是100LP)。儘管到了後期,這種陣列就ä¸æœƒå†æœ‰æ•ˆçŽ‡ä¸Šçš„優勢,但因為它們的ä½ç½®æ˜¯å›ºå®šçš„,相比於å°è¨˜ï¼Œå®ƒå€‘通常會給予更強大的效果,所以它們到了後期ä»æœ‰å®ƒå€‘的價值。 -guide.bloodmagic.entry.alchemy.fastMiner.info=é‡åˆ°å¤§ç¯„åœçš„雕刻任務,有時候還是自己動手更划算一些。å°æ–¼é€™ç¨®æƒ…æ³ï¼Œé€™å€‹é™£åˆ—便是你的ä¸äºŒé¸æ“‡ã€‚這個陣列å¯ç‚º10格內的玩家æ供急迫 III的效果,消耗則是æ¯30秒1點生命值(åŠé¡†å¿ƒï¼‰ã€‚因為是普通的急迫效果,所以它也å¯ä»¥æ高你的攻擊速度,ä¸éŽè¦è¨˜ä½ï¼Œåˆ¥çš„玩家åŒæ¨£æœƒè¢«é™£åˆ—è¦†è“‹åˆ°ï¼ diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png b/src/main/resources/assets/bloodmagicguide/textures/gui/alchemyarraycrafting.png deleted file mode 100644 index fc3a6eabfd31d2aced9e8ca07b3666d390f9dfcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2464 zcmb_dc{J2}8~-tOSDF@XTuYiesXP|e9rTIw)6cw=Xv6t98d~!Dslh- zD4=bS=Kw%V1jPUuDUtBNJ-a3nQr>nbB=BG06%c?|obMB9WW#J+@c^)kv2(=&`{HFq zO6hR4y_NL1w2G3Mu1R;bwa82tjXZrma&UfR1nc}ojlmf^Y4BF*ctC8K{;QF+-8siW zA9F91I_pEr&d(06D$eNjm2mz=P?;Tbvj290*t#7{=w>S1F186G8WaXTLzvA$LJDkC zHH{!(|K=Ol-|L+#LgxgiYG@~I@oZ$g^O~tX@XPR43ogWvJ+_dfQ{oWwyG4agLj3bU zBdrdth){hiBm@jzS*fz=p>YMDGi_3^^!f%6J($UTr@a7yVTZ2I^crJ{5p&VVG^E$HfonTJefx!<-ebe-!SnpB3ucJ7#-WcOmHh1}Fd=~$uQ@_f_;60p^2xVu@d}HP$g;AOs4}eEQ;&kmY=<{HoofEs%6}a$FA>JkWgsQD#!3 zr@x|`$+g4Q{l4yRzTTPr8%aXb(QkWs@ZatZtuv_X;kB43sZF-8Ih*FFw_SVjsP1T= zrw%P33Y1LW4U%4g@8@be3Rw9MyEI}$-2E^Xm40Aw9iM!E>V{VLaYA`KiN9WUVyP*c zeZoCc?j8`VvgW(ZC-c`P&<3Nz+1T9+vAi18I^j<6N?;Q3Tn^gdcGmP%;*4x`eBLD76xho zDh~?5)6B4DeC{^oiE|I9^TRG9qrS{~d5w#1inb}y2kuxqNYXlB=h1s!`gzr$4tFUq znkq~a%i4t#ZSh3>(9+D1KFT)|l65KqS`(7=W(z0aZ+(hfc*`18JbO23gfNt^sQ-pS z7BSWjk33p2w}!1B5oYl0kw|ml5WaTn&5d7D8rf2si;7Z-anE|M;WdIoXq=D*vx;ck z<=uh%%cOp-Xmqo37yz8<($uvUpm{~+aosd!4t5#p|no|y+S{}Qo zoOGq9e`HKK6|ap`4OSoWz*S|oOgt8ZFC0X?$4CVdV8Vp??M7#H$?#C%8)oz*PB4n9FPH2ugx`~&BVlJ z&hK?5F7O^pY65C`HAN8dQh6+>nvp{OilVah-7h6Gn2N{5V6i6d%Ny$tmB_BLUXrXU zG|y}SlOD8cX?q%Q8)l*{JUzD$7H9$?Ov=LvV<62y)PcLMEgu5Zme<_Vm-eX_qX-`-2QKXu#|IE`q&Gk zjRSfFJ7i#Sax#k&claM&ixMy@26j%ekr2$IT)vwDQa< zN=?_k^4cnNpoPT>A%@?_d`psLIdp*}k(27X0tWwMdPC5+#QscXh7o^K$9=K1lOBIJ z^EfV!JH9*}x!G@4Ywn{+CuqSi*262TZ(^b)p-=j-SRjXuYJ$o#y4s7QWZZNCQN;<4 z`Sqs?xC?v9!A$wU_(xxJYD?yff7_0W`;+F9UsJSihpEl1m-5ztnLb#IkV;e_=?9rq>j` z;s#B#Ve~OuVDPG>6S;W6I#ka#Y?1RFCciHpJ0jh?n5s<{owFJE& zFFmZ6%OuH&NMtq1m02)0QxlGUN&12_$%TO$p|XfHtErf2EsWG3_IqOIH}+4~Crl61 zE=_@~y;?Gs4%}eX>fAlOLyrWo`){6p0N4%G{m^*d`{&1&_+vu$O$co(buoJb7)yZY NpsgH`v@>3R`~?_LV!RTDO71Xb`i^1X1ofh zNE1+6fJjlCK|}{fI-x6q1Okc)2noC=fO>Rva_{@x`IfNvb5{0Q>%aE??UIuZ;i#j% z&GIG6O8@{^zQfkq8316Q2?G|v!OI?6x<7bXOtsxb2LSm>afJmn9bF6nCf^WTJsF;M zKcH|Fk`C67;)~Y_Cs9Ff06<%YQ?a;UJVV_VA3z|RYmBffG}H-x<{BPIJ6$`f6+Vz) z8%e{vMB2OJB7c28klHw1eLZz!Qyo1d(%4vki@Lt9o*_b4520tEt!IidG(_p@s?WbP zES7*4n&#(^a<<++pALLyt`W#!P*Dg(SXh`&n1K$37J$$*H8n-(>Lc{^wLuSUdIXt) z4c8{q*UgE%)3L_WaWn#zL7*vf`0@=!$4bC&sEO= zWvGkN6YIU#fOvkY0q!3^ECc%=sX%=pI(|5mKZQoZGAsxrYyciXB?q7p9~vQ^?^hMd zibAB&z;59!4A6+rHAA9iR~l*una;qHarhn97GQ%8f#8QSGV=GuV+{c?T9%A*nD)1OHAcp~OnKc1g=EB4Rxi54GfC~z%+{ld=9 zfgT$1r?wB7=lngzb4p~+`kNw6^>hspdb;3iJ`{TU)6iXi9SXhuY3PSYH!^`?p+BGP zlV(Vi_~e~C7F@uG1iXb25@~=$BR*~ZG{TV(jwgCr6TtmT7q3cvq|toPr*}RZx$BFO zkUR5{bCU)6K%bq@Xz*u&>Ns0xI{=8>0040Z0O0Km zczp=~OkDsN^Z@|WMF3EuoWcCM9ROD1c35w74R0H2_jYU;FRKpW*)xOwaN4+ORe*B! z#oB9xf2c*Q42$}GV}%W6(+QGX0m^3+H&aIW7mH=I9jLT z;WEt}3!8i+iisBVBLWlX%CmTDm3ZTK zzYTnTx#^3wfagBg1enh5-)*T{0d(gx*xtT1n`Y>#{bOPFN{_ydql|UUh{|`m1msyb zG;u|b58nBS>k?AN$01;qy-Oi`}NO*zml4HjZKHIjua%1dJFPL@kqvLu<$MIAUjgVm*hSog(t4oz8x(_d)vC)M;2Da2{eW`c z38gK7ap%rQW-{X{aV3Y6fbP>vD=9k9qZ>yzf~kgH{1&x1z+zQ#60omPtmO=wD8<^k z1O6*S#Br7QsO6O%clOG}*=PW2cbr0utC9);;mgN2OryVo6?2+*0;5kBc3%tIJrX)` zRxz%XI1xLun|jv)#_Qv+2G9+#;_4pEspD}q|D0wou6+K|dt4Z~7*K5k+N(zqp1=z; zAx0^#rk?FQJsvb-UI8XLtPhNv3YRLz9TciR5y@M^Dy_bbi&!>ubxLz|pSb%eODoZb zW1SZGlvg@8h03uxrJTn%vvEv63B8 z+0ALak@QE`mM+X&1Ss|=$wh&0STRF(zj(;|o8N*>JWni(oa(!Cy{w6a5e(jo_sYGX z=DMX6+++Z-2moY&?w-Y4?d%eQf`VN4?#+4qn)aQ>DzG4pjDCO8zOQyDw~iTw!&xUJ ztST%pj7|AYTU#45S?=cMmYJF9toaYHoXK9HqBsGUarE}i9vlohckW!q&6_{)`TWe> zTn{U&s$~fYtVh$6dsxPX4OuBEoeQp(l`=IIknCENVQ6IAo)&GIjdo8kNS|xNFL)omo9SWhknT^+Nd*1H!lYsMzV7f)TZ* zX;IbS$cRg9Y!ZCoLPHaiZq??Fj%*%}+}PCgdvf@mW7Qq2V6$EIiSkj|>Xnm~<>Kvq z8FWUPn52KTaqrWkUm;#TI9-LJJ->D65FBY}H~^2?Cp__6bzNXr`PyNQ@%7G5RlY!= zd3wM@DPctfsbywkFF*&^!v+~$*u6Q zr@>0hmxafJNF?{*;QYy{sK&0YESEIjVtpisKksi&#BDRKF-En5NN==VE!y6xV*xv}Yc)|xY%Rh9I*;bw8I z+?oW3PcjCctX+d*JSZzuN+{A)CV~2Cw%6^MOt;LeESfC2dG(>g3k}ie?sANqo2Q!_ zRzXoQ^VTiLSa~?V-{(noVz!#fKRx4smhJ^IFtCUkN18FB7~@l+@}2cxc{n)i+329! zTywTs;dtR@#bBn*qR>FK5n|F^RgAOq%`<0w3yX@<3k$zHYMr$DsKq!lYC1TkBIm7$ zTu0&Foh21hftlvOc?gT7>E5v#GK)T%lOxY$G6(J-y@m?uO=n*W=pUWmYBo`vWrB&` z-ftC@luCmaMMswna=ABAuzqutjK0apovNzm&2lGp*JvYr*BSS|r^4Hz)^m4sjl&%suwe^&@+_HoF zmmJ(bI56O7V{^{W2n9jiI=* z(nOc4uT?~#$$)J9>IE_zzF!}C&i2h7uOy*YKWGSk#xv}Kbn>TOL)6#5C z+ZJk^4hjo-V!y4kv)GB!B@h~$j>?G~{l=uiabz@_Xl9CeMsi_CAUDxcovY9PnahthdWycq6;|&o#0s`2j>}P|# zlWcnQ6w-&C6y4Q}__1p3!K$@=&;7JEZsdp}sU~|esNs`iFvaU(P1*Hk+@_Lv7C+yy zMby$=87=1np5|?3Q7n}ftBkJtl!lQS@(h1+_K$apb5gF2gA1Z0mek3%*c>D!569@p zVbX8jbj0Hi(r9@3wkv2C|vlH%+BX@)MG1i*2Z-kqK1|_MoQ5 z$=?2?%IIl)tzjPVXO-^e`g(q3Wa(7owr%B0mb~sztzffvc64~Zjx-0$W-TqZUAr=( zF4YOzQ+yo3k{TcPy)3MCtf;UsGdtUj&qsnEVIgU7#biv5cNSQ=@Mytg>)e3U&CI-7 zTU*JFhc9T?kLKZdE2o?zOLbDy*tz}v{hKT;>%2Qg1_xa|Jkrot%wLBK(hCfepFWLy zSX&Ez(!LP1-+fJ6P+O~@xydQ{y0zerVDY`SwxGr)cXp+xdZ#DbopKYB&s?q&{zN`? zT*u4kz;FmAS{PC`Iq{4a9mei}cUV;7JosTlEh%fvLW}7UoM)GYIjrC*!SKTeEmu#R z(B`#wS$rL6qii%$`fRc4Mn+bT?D^y<}b!O!c>j(gBmMI=rEiDN`+&D-TwM0D45 zO>s=WcUiwBnR7+NFEA{-a{k3VgD7*7XqbPiC!W2iGRK=;5ZtW8s!l+7U!8cmf!r#1 ze!)GrDYdbFgw0WJyAnH@FJi$>5p`L2(7Ac}`9EF0ocid|4|sq7peeyJQrDG~$CqN$ z!8*{XTHxsFD(B|3%9YF`_r2hSCaPcxzkinHUII%Bjvk&ShIi}8+@kl}4}-_maI4t` z9jE@ejFw(yyDh!UMdj=Tl`)jA=|`;Px4f4 z6Fe3d^40>OueKC1j{1rPRnmJJT$iWaDCG>xqK#TWy~D3V?JD7IIfF_{N*Tq)4@5a} zW!?j0eKq~HbQ?hNpDIJ^YABKmSK_aL9_d;ZAoRF0+Xm{ zArJ?&_xzUa#R}p!Ws`lb?kqQ`8nPOuYk3T|KRn0kh|vN<2Ppl*qQk7?2Lwhb%gZn8 zdupDDX0)6SSn;|>L5o5Ab&2tW;?-6zDKWpfdIhkk(nGHM=K!P5)6pG2VD4XvSVU%V z^1M@7R8P$tBgSLiu&Gk>&fi7DuLMFx)hP>l_Be6A8z)XI!~6LK*58P&ST|LA+dOyq z^C3Ff>x$~o&#;T-m>YTdXqr%SoSF(UiWvt9r@CzgW$cg`r&EI7% z0%jKfjq>lhtv>%WANS$G{%OBj_1$F0+lP^4_|fP S{}ljVJHE5G&iU47|NjBVa!e=y diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png b/src/main/resources/assets/bloodmagicguide/textures/gui/bullet_point.png deleted file mode 100644 index fd56d1bb0d67abaac3273f095eca6568630f53a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17840 zcmeI3c{tSF-^aghZflkbEmC8tB(qsYGmWu~H6)CX7Gvf+V`9vhnX*)(vQ>AIiiotx zuA-DsNK``Fv!p^&H$A0p-4&kiP|>%Vr|Wut&p*#Kb6vB1&gZ;8=bYF1oX>n`uIn4W zV!557{A_su02CeUt=*t^72#7>8hV{KI7)@y4LyEmRm+C9lhc=3PS9;t%Uc03RZV z#KqcGGM4~}&^rpUK$UY^6=qKCsPapzL#rhscSuwT5|=p2Mydi9;d`u30v5Isk?AQ5 z+<{Cfz_)?s*9ELV0=^5kKEDG*rhhoJNdoZMucaoDnFt`JgK^e?|5Bi!dF4(UzzYMY zG8}91z(XW}aqwi=1E97OUc@e^65`P&HwPW*J5qD?b^$2>_XiYS3y2 zheMl`ikg~mdrFnoAzxmW9@X~q>l*24&gWVHz*9j)%ZLHGWOn3I=}7j-vH1g1{%aL7 zHw^7!6f0Yt12X$sJqNi$Ha181mOXmZ)7|}WS*?{1^@it`5oXQ0D$n7-eN^9rM%HScKGI{1}&>8p0RP7B^+ow|F_ zFiSh$YTu%(^KXyRpLH61k|cGS0H@cJBsL`?bJox#|8ZQX;w7khHUt1~%Q@9|^<*U@ z{kK1D4jFxIK5UmcABbc)>DJa*saVO=Bj@mZ7Zq%?(u-+4t*P&ezH6arT;=K?lf+d*)p%S`GUFs3U_Nm*W#olezijg#=(>7}zrcE+LT4_ejsQqy+nBCf}&x@tQnn%HCAc2W=?_L^_a zcz@tySKD4pTzU;K-1a%9!VbGXs@T=+?v!)nvK-UdJ8X|B+@cGxsR`APi>Vmm6P1zTC-3)DaY~bf{RoCt)1y-h>i8K zH_*91EnzxZWm6ov)>L;|JlSwz+1@`K&YYm!o_5>zc95G+pFwV#vHfhFr0cEpfMOZ^ zegnkfYth~5-B-Gex;47B-ulR=`&k5^_~8Cb&+W$gWwUxzdW?Id!4yMFkK?Is9XUrS zQ%w?9Srr~Fbvxx6n={>bLn^*;ySjs8R^hP&cV_#~@E>BGdLg(twd26t<;k}^Z#VSW zy-0o``7UINVvO4M`Z%WEthAXjGnunOW}ZrMIyvjku37aIj4Ae2O79`%LmUq;{ZjqS zYKb@G4=g*d;DClcnv$D$GVgJog2$jo10^AMt^1ZDTMr}mu3Wjh2lGAh(pS84*KlX% zF3pL}W9D!u<|iV&hvTKauQ*+CA)j!~JhQH=q7I=zn^h8OpcSB)AG0CKq;|oX#z&hs z>X)YsYnJaa%ga5ACmSs@@+@&1+|MwV=}HOya9FThu2(NRc`#z?rri5el#*rrvW2S`+A$NF{!H(6f8^egEuXFK zY({urgvtxZ(l}af9dbD+dmts_(%Q%jCrTV4xne=iq8^|oKi!d7)>^gSc@deTg zv=%rzzjPi*b#pE|x#;9lr=?EyjW-*QHQqmDl4gc|VAz}1oAw~B^Stk>&{YPdIi(js zhvM#4C%p$sD}tg|;k~oGJXWnKu`Nt5oPWQ(usnNecG>cz<@p)+nO9D~DZO5rdw$mG zo`=$HMWyW0EmWr84CeW(MOOxrDwDQc-1673nT%rWBc*)JRhkj}vpiM8O2XsRro#i~ zTdux4*oS6%HLEl~H0mmy-ms{amF}K)$BsFJS;pT!7`H3laa#i_nS@HysOz{^*}Y8g zK6uU3@Z0ax(@N56`g7V&4d4b?1F`K#ZW!i@Cy)1DJr$f(RF~ zOBC~5uMV1qPV_8%aQb{!NZt_j^$gNKB;JuOQWw$mvEgIybvI3`&R;v<;BtkNu`ark zyj5qEJ{msS0%S+dmtac9M_ESs{PF2S_-3ukd&~)K;6KHW`Ym^7mRYJB=m z<$vw(y@gssy(vwJO)RD86%jA)-;$v|r|!BEF=b(NY_w;L`5tbZ*X$N-vPnowJDJ~U z{n7fM_2V=q)&+kGxy(eLl!sbRY&E@Te9^oP#qhp)&nw-_A<%IS9;IJ|3ktl{`MG~E z_F4Kfg|1CAQqb4daKnx^)x3+&R?kIEGawwaaEe>LWdDCzs_5sa@1Fm5ddU1e@?kZa zHB4=E3$7*ZA$hg_+~sfW^_|1_{he505~h3AD9fOyY{$afy%kQ1P91544E5BF2)3aa zp%S}&U*g_it2`~|q*CTf=5xlzh5|6Uc;sr(uJh=*2V|}Xl5uV^P>2?z7GdKvDXwX zX9xG!OWu|omeElveNcAyp5|>cid(|{#jos?>gQb=Nq-%JRKzKI{B^kQnGV-Fth;YW zu5)OvBB6ET?o9BEpF?X?s>s8^%P+p`=#I|aU|)EOMUs_^3CFo=W{eyg zX(*bZj*j?n@705*mXwyG$#0XBF0(gh4Zo~k+;Lm2o~K;+tb7uIE#u#O8db6?%Rt14CKAkO@8GvawVc-ytHDe*`iQqzX7Z z3WpO&8qczc-%rrbCt+40^gLNXbWR9=5fKfSOzihWG|-wV07;M%hs2m5u{a8pkJu#y z3?7Lwg|c!|knx_d7|u}c)2RaL??m~oFFX#1&SHf9R+NdJ-^XxvCO8D~1=JuK=wMBP z){bJa=mad*1k1o+@kqKcXoNIo7=uVWXh=mG`_ZTvI+hN(>0^uhUj9R9YYuILFp;3p z;|HJ4p+Vulr3V3zH^DQEa3B)vM~6USK^zkAw*-fznl8cMjj#+;Jj3+sK$C*~Fpvw6 z1=S^L;G{mnwa}r#@P4+!7GK1O%xd?duRf3G>5H z_AEY>O<|L=49c~!%Hs|Of8YAm5y%>=AY3Ys4+;;anfBL{`K{!9t0+Rv*a0U{X~Nn= zq6yO%gm8b?Ix($p$}ck3kK6fs2*%@2lK*;)5PvX8RQivH8te7zAbbu(5JKgFmP{x^ ze&=M4NBv#~4^Ko3Yjq&&|6n8d)Q$hUZTP)Y_5WfUCbF33PYq&%bQ1b&0)K7zy`3B1 z&+kvx*VFprNhH!~1O|u4rV23?p-V^Tsulh1 zvh{}|@~zhXCqGQA=sy`17E3$`42Wn`j7u~hm{*Jo21K+e#wD5$%qzwP10vcK;}XpW z<`v_D0TFGAaf#*w^NMl7fQUB5xJ2`TdBwP3Kt!8jT%!5FykcB1Afin%F425oUNJ5h z5YeU>muNmPuNW5$h-g!cOEe#tSBwh=M6@Z!C7KV+E5-!_BH9$=63qwZ72|>d5p9Zb ziRJ_IigCe!h&IKzMDu}p#kgQVM4MtDf=(Cpou0U&%n07PyFfPY7!_dWpFfB}G)zR=yJDF85ovv1v1Tc~fk zgS90kw6)+)qg;)JYVDgNQ>Aoz zUt!v?bP+=@SgtkJ`=yMIYEH{$*T3f19l7~xUR`Nv^&q{a`tyo680LldvKO>8{C36< z=;rKTo0@qjaoOk-k{;T7^sBMjPxkw&O+6h&e6~BxDN%iEA@3bCeEyX=vA50|ZKNJN dKd(~;nA;dtoW63W95hkD!DhL2k(KYZ{|2IhjL`r9 diff --git a/src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png b/src/main/resources/assets/bloodmagicguide/textures/gui/soulforge.png deleted file mode 100644 index 7ee6acd20f42d4c7b65fa13d59cdbc755586359d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3452 zcmd^>`9IX{8pppg7}3F0q_Xv##u5!uQrX)ywvd=J)?)085LpL3>cLZr2Svt`NJ6p< zF=N`OY-JmaF-c68naP-DjMwp&QIsQUia&|UY{TC_jP?<_YYULi?f}A{62XA z02C1C&$s~qXsZMP+aO!XJLXByR)Sn{usZ`tenkbLwqQ$t1 zQmJs;9&EAycllHLwyCy%aeqqPTZM%`GP}gm%07;YQ2%k$9Uzl_s;dQ!wrw*REJNOj$Qq} z7c_qNY9aPpOV6^Xh5k)I>{bp7Q_fn(4eEOpUmy&WC}-{4li&9c(#n{wP(Jsm@qhimd099Mz|W`6SYd zH#dZdd}8^Kk&=~RGC6m6lyw(dpvdJvc$GSXQ()#uz#A^Jb(lamMy6JRd+9iD~%KEgv z^)VQ5EOvoq9b2ViWmKpoO@g!v4+NY@WiJ~&5$*?$h2ybyUZXd&fI=;`>5Z|mp)E!N z4gVCy7YslA^d4#G!KdFM!Idm8EXZ1>-wus5eUf^PqMRI? zjvss($;uUf&KX9lsd-*n6q{=eGOhP4jQYx_@OVkE~Pxz(($OSgVI)v`{-!ouS&jDY1v4EiXy?sLc}W8#Q^C7F*n2{7N(a+YOn_CUg( z^?NQ9o??wMwYNcy%!z9?9T z>k%u{T->dJFi};-`b%=SVu6&Bm8!w~n;zkzm_iAzT$oW1^}KFOc-EFIRj5^Z66kgk zkJqvTE-HaMRRJuf>ur>b*UD{u1#90kn*ec#ThzPo}m` zHWP&*r|Smz6opKie0M*Lq8V}HYi_^z9|`KI86TCv{@19&kk4K`iSZ%HrhT3RGwpcK zqZd^S@RJzeICi?lE}t`BS&4KwgeWU3TV6ftDR}VU@bBc1X zHQ%hh!G_ZNal=NF%o(W#E!n$ifCYClpt%`e%1(f<3s2|ZsYy00oE01q78-gF#-Jvb z!InrF6c~aGE%)tP=mw7=0cH8M!!K)Uu55LuNqXF0JU$y`SU{c#LUEW;E#B>T z-bG4&DcedSJfbGONH`tue3{2|_L{!rb;41jw9GX3c2aL&fC`O4OA4dSKFKXdyZOjl z96fn}Mt8_*LMr)-krvxt%fN**>%LRFv5k}L070i_790<`14)^GkLlLZoZFt|1O*zu zb{2`(U1MXMW)+bRmQsjsqQu-~e zG-N*KI-WnTs*B+_!s@0piZLejlAL#)+4T|at_=+h`PECIqihT&9Il`Q3k|tG*3MZx zL|9ye8(P_;2k3W>b^L^wM=II0%l>E;&8tUY{nGg8v{4dD%HKBEZ%!f6dGm16x7b%gNf#c zScv?zYy20mC9>I!ano0HYXYYD=zg?G5SQ44b;)nNR(~+q-(T-oTr`~!(RK?Y3xU88 zWFIp67F34v;zFO7@GVq3&Kal3D{s`AgsA05|#nwbwDHZH%*q#7mA80B7d=K zQ+r3DuP2J{DUKk>G&OCc2%nM0nM&y@(xg-#RW*DGgXQ^LteinohGx5P8R1u{hX~NHLR(X~7JRKbbaE6@&+fLnJlzdDae zH0LJHrU@d`)=6$4m(W2ho4@tVw6sy;=+By`*j1{9zQq<|zfi@Bk+hLrfCm)#kW++* zN3$$>CCzxBIr4pE$x0MH$`qb_EF2|XT-?aA(b3fnQ0YP*nxs^fnHw7jV&cm(R_BTVn-6#9C(IFiz0u-twvLAED@Z0)mGcL>A|GTd> z8o$!cYP7pM;|B(iwgBu##T5s?xix!u%Ht_vR`7Piraoxn^I)+5J>dA2zE4qe!?%N- z`%vy?E3BZOO?U&QbD?Ha-X#~_P-i$~V(M`B-u2*}p6sjiZO5Yw{R0DG6H3;y7Gsa4AJ<7iVa%